From df144f45a6dbc9534debc579afb84ed0bc2509da Mon Sep 17 00:00:00 2001 From: Sai Kumar Battinoju <88789928+saikumarrs@users.noreply.github.com> Date: Thu, 17 Oct 2024 19:53:32 +0530 Subject: [PATCH 01/14] refactor: reduce conginitive complexity of the function (#1891) * refactor: reduce conginitive complexity of the function * refactor: reduce cognitive complexity of the whole function * refactor: reduce cognitive complexity of the whole function * chore: bump size limit --- packages/analytics-js/.size-limit.mjs | 2 +- .../configManager/util/commonUtil.ts | 146 ++++++++++-------- .../src/components/utilities/loadOptions.ts | 2 + .../src/state/slices/loadOptions.ts | 1 + 4 files changed, 87 insertions(+), 64 deletions(-) diff --git a/packages/analytics-js/.size-limit.mjs b/packages/analytics-js/.size-limit.mjs index 2a55592f5..ba6cc0d03 100644 --- a/packages/analytics-js/.size-limit.mjs +++ b/packages/analytics-js/.size-limit.mjs @@ -113,7 +113,7 @@ export default [ name: 'Core (Content Script) - Modern - NPM (CJS)', path: 'dist/npm/modern/content-script/cjs/index.cjs', import: '*', - limit: '38.5 KiB', + limit: '40 KiB', }, { name: 'Core (Content Script) - Modern - NPM (UMD)', diff --git a/packages/analytics-js/src/components/configManager/util/commonUtil.ts b/packages/analytics-js/src/components/configManager/util/commonUtil.ts index ac7e15ad6..139663988 100644 --- a/packages/analytics-js/src/components/configManager/util/commonUtil.ts +++ b/packages/analytics-js/src/components/configManager/util/commonUtil.ts @@ -3,7 +3,10 @@ import { CONFIG_MANAGER } from '@rudderstack/analytics-js-common/constants/logge import { batch } from '@preact/signals-core'; import { isDefined, isUndefined } from '@rudderstack/analytics-js-common/utilities/checks'; import { isSDKRunningInChromeExtension } from '@rudderstack/analytics-js-common/utilities/detect'; -import { DEFAULT_STORAGE_TYPE } from '@rudderstack/analytics-js-common/types/Storage'; +import { + DEFAULT_STORAGE_TYPE, + type CookieOptions, +} from '@rudderstack/analytics-js-common/types/Storage'; import type { DeliveryType, StorageStrategy, @@ -78,7 +81,7 @@ const updateReportingState = (res: SourceConfigResponse): void => { state.reporting.isMetricsReportingEnabled.value = isMetricsReportingEnabled(res.source.config); }; -const updateStorageStateFromLoadOptions = (logger?: ILogger): void => { +const getServerSideCookiesStateData = (logger?: ILogger) => { const { useServerSideCookies, dataServiceEndpoint, @@ -86,6 +89,79 @@ const updateStorageStateFromLoadOptions = (logger?: ILogger): void => { setCookieDomain, sameDomainCookiesOnly, } = state.loadOptions.value; + + let cookieOptions = storageOptsFromLoad?.cookie as CookieOptions; + let sscEnabled = false; + let finalDataServiceUrl: string | undefined; + if (useServerSideCookies) { + sscEnabled = useServerSideCookies; + const providedCookieDomain = cookieOptions.domain ?? setCookieDomain; + /** + * Based on the following conditions, we decide whether to use the exact domain or not to determine the data service URL: + * 1. If the cookie domain is provided and it is not a top-level domain, then use the exact domain + * 2. If the sameDomainCookiesOnly flag is set to true, then use the exact domain + */ + const useExactDomain = + (isDefined(providedCookieDomain) && + !isWebpageTopLevelDomain(removeLeadingPeriod(providedCookieDomain as string))) || + (sameDomainCookiesOnly as boolean); + + const dataServiceUrl = getDataServiceUrl( + dataServiceEndpoint ?? DEFAULT_DATA_SERVICE_ENDPOINT, + useExactDomain, + ); + + if (isValidURL(dataServiceUrl)) { + finalDataServiceUrl = removeTrailingSlashes(dataServiceUrl) as string; + + const curHost = getDomain(window.location.href); + const dataServiceHost = getDomain(dataServiceUrl); + + // If the current host is different from the data service host, then it is a cross-site request + // For server-side cookies to work, we need to set the SameSite=None and Secure attributes + // One round of cookie options manipulation is taking place here + // Based on these(setCookieDomain/storage.cookie or sameDomainCookiesOnly) two load-options, final cookie options are set in the storage module + // TODO: Refactor the cookie options manipulation logic in one place + if (curHost !== dataServiceHost) { + cookieOptions = { + ...cookieOptions, + samesite: 'None', + secure: true, + }; + } + /** + * If the sameDomainCookiesOnly flag is not set and the cookie domain is provided(not top level domain), + * and the data service host is different from the provided cookie domain, then we disable server-side cookies + * ex: provided cookie domain: 'random.com', data service host: 'sub.example.com' + */ + if ( + !sameDomainCookiesOnly && + useExactDomain && + dataServiceHost !== removeLeadingPeriod(providedCookieDomain as string) + ) { + sscEnabled = false; + logger?.warn( + SERVER_SIDE_COOKIE_FEATURE_OVERRIDE_WARNING( + CONFIG_MANAGER, + providedCookieDomain, + dataServiceHost as string, + ), + ); + } + } else { + sscEnabled = false; + } + } + + return { + sscEnabled, + cookieOptions, + finalDataServiceUrl, + }; +}; + +const updateStorageStateFromLoadOptions = (logger?: ILogger): void => { + const { storage: storageOptsFromLoad } = state.loadOptions.value; let storageType = storageOptsFromLoad?.type; if (isDefined(storageType) && !isValidStorageType(storageType)) { logger?.warn( @@ -129,72 +205,16 @@ const updateStorageStateFromLoadOptions = (logger?: ILogger): void => { ); } + const { sscEnabled, finalDataServiceUrl, cookieOptions } = getServerSideCookiesStateData(logger); + batch(() => { state.storage.type.value = storageType; - let cookieOptions = storageOptsFromLoad?.cookie ?? {}; - - if (useServerSideCookies) { - state.serverCookies.isEnabledServerSideCookies.value = useServerSideCookies; - const providedCookieDomain = cookieOptions.domain ?? setCookieDomain; - /** - * Based on the following conditions, we decide whether to use the exact domain or not to determine the data service URL: - * 1. If the cookie domain is provided and it is not a top-level domain, then use the exact domain - * 2. If the sameDomainCookiesOnly flag is set to true, then use the exact domain - */ - const useExactDomain = - (isDefined(providedCookieDomain) && - !isWebpageTopLevelDomain(removeLeadingPeriod(providedCookieDomain as string))) || - sameDomainCookiesOnly; - - const dataServiceUrl = getDataServiceUrl( - dataServiceEndpoint ?? DEFAULT_DATA_SERVICE_ENDPOINT, - useExactDomain ?? false, - ); - - if (isValidURL(dataServiceUrl)) { - state.serverCookies.dataServiceUrl.value = removeTrailingSlashes(dataServiceUrl) as string; - - const curHost = getDomain(window.location.href); - const dataServiceHost = getDomain(dataServiceUrl); - - // If the current host is different from the data service host, then it is a cross-site request - // For server-side cookies to work, we need to set the SameSite=None and Secure attributes - // One round of cookie options manipulation is taking place here - // Based on these(setCookieDomain/storage.cookie or sameDomainCookiesOnly) two load-options, final cookie options are set in the storage module - // TODO: Refactor the cookie options manipulation logic in one place - if (curHost !== dataServiceHost) { - cookieOptions = { - ...cookieOptions, - samesite: 'None', - secure: true, - }; - } - /** - * If the sameDomainCookiesOnly flag is not set and the cookie domain is provided(not top level domain), - * and the data service host is different from the provided cookie domain, then we disable server-side cookies - * ex: provided cookie domain: 'random.com', data service host: 'sub.example.com' - */ - if ( - !sameDomainCookiesOnly && - useExactDomain && - dataServiceHost !== removeLeadingPeriod(providedCookieDomain as string) - ) { - state.serverCookies.isEnabledServerSideCookies.value = false; - logger?.warn( - SERVER_SIDE_COOKIE_FEATURE_OVERRIDE_WARNING( - CONFIG_MANAGER, - providedCookieDomain, - dataServiceHost as string, - ), - ); - } - } else { - state.serverCookies.isEnabledServerSideCookies.value = false; - } - } state.storage.cookie.value = cookieOptions; + state.serverCookies.isEnabledServerSideCookies.value = sscEnabled; + state.serverCookies.dataServiceUrl.value = finalDataServiceUrl; + state.storage.encryptionPluginName.value = StorageEncryptionVersionsToPluginNameMap[storageEncryptionVersion as string]; diff --git a/packages/analytics-js/src/components/utilities/loadOptions.ts b/packages/analytics-js/src/components/utilities/loadOptions.ts index 6921a4376..f70d11948 100644 --- a/packages/analytics-js/src/components/utilities/loadOptions.ts +++ b/packages/analytics-js/src/components/utilities/loadOptions.ts @@ -32,6 +32,8 @@ const normalizeLoadOptions = ( normalizedLoadOpts.secureCookie = normalizedLoadOpts.secureCookie === true; + normalizedLoadOpts.sameDomainCookiesOnly = normalizedLoadOpts.sameDomainCookiesOnly === true; + const uaChTrackLevels = ['none', 'default', 'full']; if (!uaChTrackLevels.includes(normalizedLoadOpts.uaChTrackLevel as UaChTrackLevel)) { delete normalizedLoadOpts.uaChTrackLevel; diff --git a/packages/analytics-js/src/state/slices/loadOptions.ts b/packages/analytics-js/src/state/slices/loadOptions.ts index b84dc5725..8d9759353 100644 --- a/packages/analytics-js/src/state/slices/loadOptions.ts +++ b/packages/analytics-js/src/state/slices/loadOptions.ts @@ -37,6 +37,7 @@ const defaultLoadOptions: LoadOptions = { version: DEFAULT_STORAGE_ENCRYPTION_VERSION, }, migrate: true, + cookie: {}, }, sendAdblockPageOptions: {}, useServerSideCookies: false, From 7ea300c61ead9cc094c3f1985e0ef3165b0fcb59 Mon Sep 17 00:00:00 2001 From: Mohamed Khattab Date: Thu, 17 Oct 2024 18:37:54 +0300 Subject: [PATCH 02/14] feat: iubenda consent manager plugin (#1809) * initialize iubenda consent manager plugin * implement plugin methods * fix mapping purposes * add iubendaConsentManager to ExternalConfig, removed unused imports * Created iubenda.html * Update rollup.config.mjs fixed path typo * Updates example/v3/iubenda.html to match the new changes in JavaScript SDK v3 * update index.html for iubenda * update cs config * delete iubedna file from examples * add unit tests * use encodeURIComponent Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix typo * add cookie pattern * add try and catch * Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * remove no longer needed check * fix getIubendaCookieName function * revert removed block to match tests * remove unused logMessage * remove no longer used "IUBENDA_ACCESS_ERROR" * pump size limit value * remove backward unnecessary compatibility block --------- Co-authored-by: Sai Kumar Battinoju <88789928+saikumarrs@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../analytics-js-common/src/types/Consent.ts | 6 +- .../src/types/Destination.ts | 2 + .../src/types/PluginsManager.ts | 1 + .../iubendaConsentManager/index.test.ts | 513 ++++++++++++++++++ .../iubendaConsentManager/utils.test.ts | 155 ++++++ .../analytics-js-plugins/rollup.config.mjs | 1 + packages/analytics-js-plugins/src/index.ts | 1 + .../src/iubendaConsentManager/constants.ts | 4 + .../src/iubendaConsentManager/index.ts | 109 ++++ .../src/iubendaConsentManager/logMessages.ts | 11 + .../src/iubendaConsentManager/types.ts | 16 + .../src/iubendaConsentManager/utils.ts | 114 ++++ .../remotePlugins/IubendaConsentManager.ts | 10 + .../configManager/commonUtil.test.ts | 2 +- packages/analytics-js/public/index.html | 2 +- packages/analytics-js/rollup.config.mjs | 4 + .../src/components/configManager/constants.ts | 1 + .../bundledBuildPluginImports.ts | 2 + .../pluginsManager/defaultPluginsList.ts | 1 + .../federatedModulesBuildPluginImports.ts | 2 + .../components/pluginsManager/pluginNames.ts | 1 + .../src/types/remote-plugins.d.ts | 1 + 22 files changed, 956 insertions(+), 3 deletions(-) create mode 100644 packages/analytics-js-plugins/__tests__/iubendaConsentManager/index.test.ts create mode 100644 packages/analytics-js-plugins/__tests__/iubendaConsentManager/utils.test.ts create mode 100644 packages/analytics-js-plugins/src/iubendaConsentManager/constants.ts create mode 100644 packages/analytics-js-plugins/src/iubendaConsentManager/index.ts create mode 100644 packages/analytics-js-plugins/src/iubendaConsentManager/logMessages.ts create mode 100644 packages/analytics-js-plugins/src/iubendaConsentManager/types.ts create mode 100644 packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts create mode 100644 packages/analytics-js/__mocks__/remotePlugins/IubendaConsentManager.ts diff --git a/packages/analytics-js-common/src/types/Consent.ts b/packages/analytics-js-common/src/types/Consent.ts index ab7af0148..7e9ae05c3 100644 --- a/packages/analytics-js-common/src/types/Consent.ts +++ b/packages/analytics-js-common/src/types/Consent.ts @@ -24,7 +24,7 @@ export type ConsentManagementProviderMetadata = { resolutionStrategy: ConsentResolutionStrategy; }; -export type ConsentManagementProvider = 'oneTrust' | 'ketch' | 'custom'; +export type ConsentManagementProvider = 'iubenda' | 'oneTrust' | 'ketch' | 'custom'; export type ConsentResolutionStrategy = 'and' | 'or'; @@ -45,3 +45,7 @@ export type ConsentsInfo = { export type KetchConsentPurpose = { purpose: string; }; + +export type IubendaConsentPurpose = { + purpose: string; +}; diff --git a/packages/analytics-js-common/src/types/Destination.ts b/packages/analytics-js-common/src/types/Destination.ts index 0d780257b..a42e639bc 100644 --- a/packages/analytics-js-common/src/types/Destination.ts +++ b/packages/analytics-js-common/src/types/Destination.ts @@ -2,6 +2,7 @@ import type { Conversion, EventFilteringOption, EventMapping } from './LoadOptio import type { OneTrustCookieCategory, KetchConsentPurpose, + IubendaConsentPurpose, ConsentManagementProvider, } from './Consent'; @@ -35,6 +36,7 @@ export type ConsentManagementProviderConfig = { export type DestinationConfig = { blacklistedEvents: DestinationEvent[]; whitelistedEvents: DestinationEvent[]; + iubendaConsentPurposes?: IubendaConsentPurpose[]; oneTrustCookieCategories?: OneTrustCookieCategory[]; ketchConsentPurposes?: KetchConsentPurpose[]; consentManagement?: ConsentManagementProviderConfig[]; diff --git a/packages/analytics-js-common/src/types/PluginsManager.ts b/packages/analytics-js-common/src/types/PluginsManager.ts index ca562c423..5792131d7 100644 --- a/packages/analytics-js-common/src/types/PluginsManager.ts +++ b/packages/analytics-js-common/src/types/PluginsManager.ts @@ -20,6 +20,7 @@ export type PluginName = | 'ErrorReporting' | 'ExternalAnonymousId' | 'GoogleLinker' + | 'IubendaConsentManager' | 'KetchConsentManager' | 'NativeDestinationQueue' | 'OneTrustConsentManager' diff --git a/packages/analytics-js-plugins/__tests__/iubendaConsentManager/index.test.ts b/packages/analytics-js-plugins/__tests__/iubendaConsentManager/index.test.ts new file mode 100644 index 000000000..536cdf943 --- /dev/null +++ b/packages/analytics-js-plugins/__tests__/iubendaConsentManager/index.test.ts @@ -0,0 +1,513 @@ +import { state, resetState } from '@rudderstack/analytics-js/state'; +import { defaultPluginEngine } from '@rudderstack/analytics-js/services/PluginEngine'; +import { PluginsManager } from '@rudderstack/analytics-js/components/pluginsManager'; +import { StoreManager } from '@rudderstack/analytics-js/services/StoreManager/StoreManager'; +import { IubendaConsentManager } from '../../src/iubendaConsentManager'; +import { IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME } from '../../src/iubendaConsentManager/constants'; + +describe('Plugin - IubendaConsentManager', () => { + beforeEach(() => { + resetState(); + (window as any)._iub = { cs: { consent: {} } }; + (window as any).getIubendaUserConsentedPurposes = undefined; + (window as any).getIubendaUserDeniedPurposes = undefined; + // delete all cookies + document.cookie.split(';').forEach(c => { + document.cookie = c + .replace(/^ +/, '') + .replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`); + }); + }); + + const mockLogger = { + error: jest.fn(), + warn: jest.fn(), + log: jest.fn(), + }; + + const mockErrorHandler = { + onError: jest.fn(), + }; + + it('should add IubendaConsentManager plugin in the loaded plugin list', () => { + IubendaConsentManager().initialize(state); + expect(state.plugins.loadedPlugins.value.includes('IubendaConsentManager')).toBe(true); + }); + + it('should initialize the plugin if iubenda consent data is already available on the window object', () => { + // Initialize the plugin + IubendaConsentManager().consentManager.init(state, mockLogger); + + expect((window as any).getIubendaUserConsentedPurposes).toEqual(expect.any(Function)); + expect((window as any).getIubendaUserDeniedPurposes).toEqual(expect.any(Function)); + expect((window as any).updateIubendaConsent).toEqual(expect.any(Function)); + }); + + it('should update state with consents data from iubenda window resources', () => { + // Mock the iubenda data on the window object + (window as any)._iub.cs.consent = { + timestamp: "2024-10-1T01:57:25.825Z", + version: "1.67.1", + purposes: { + '1': true, + '2': false, + '3': false, + '4': true, + '5': true + }, + id: 252372, + cons: { + rand: "92f72a" + } + }; + + // Initialize the plugin + IubendaConsentManager().consentManager.init(state, mockLogger); + + // Update the state with the consent data + IubendaConsentManager().consentManager.updateConsentsInfo(state, undefined, mockLogger); + + expect(state.consents.initialized.value).toBe(true); + expect(state.consents.data.value).toStrictEqual({ + allowedConsentIds: ['1', '4', '5'], + deniedConsentIds: ['2', '3'], + }); + + expect((window as any).getIubendaUserConsentedPurposes()).toStrictEqual([ + '1', + '4', + '5', + ]); + expect((window as any).getIubendaUserDeniedPurposes()).toStrictEqual(['2', '3']); + }); + + it('should return undefined values when the window callbacks are invoked and there is no data in the state', () => { + // Initialize the plugin + IubendaConsentManager().consentManager.init(state, mockLogger); + + expect((window as any).getIubendaUserConsentedPurposes()).toStrictEqual(undefined); + expect((window as any).getIubendaUserDeniedPurposes()).toStrictEqual(undefined); + }); + + it('should define a callback function on window to update consent data', () => { + // Mock the iubenda data on the window object + (window as any)._iub.cs.consent = { + timestamp: "2024-10-1T01:57:25.825Z", + version: "1.67.1", + purposes: { + '1': true, + '2': false, + '3': false, + '4': true, + '5': true + }, + id: 252372, + cons: { + rand: "92f72a" + } + }; + + // Initialize the plugin + IubendaConsentManager().consentManager.init(state, mockLogger); + + // Call the callback function + (window as any).updateIubendaConsent({ + '1': true, + '2': true, + '3': false, + '4': true, + '5': false + }); + + expect(state.consents.data.value).toStrictEqual({ + allowedConsentIds: ['1', '2', '4'], + deniedConsentIds: ['3', '5'], + }); + + expect((window as any).getIubendaUserConsentedPurposes()).toStrictEqual(['1', '2', '4']); + expect((window as any).getIubendaUserDeniedPurposes()).toStrictEqual(['3', '5']); + }); + + it('should get consent data from iubenda cookies if iubenda consent data is not available on the window object', () => { + const iubendaRawConsentData = { + timestamp: "2024-10-1T01:57:25.825Z", + version: "1.67.1", + purposes: { + '1': true, + '2': false, + '3': false, + '4': true, + '5': true + }, + id: 252372, + cons: { + rand: "92f72a" + } + }; + const iubendaConsentString = JSON.stringify(iubendaRawConsentData); + + // Mock the iubenda cookies + document.cookie = `${IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME}=${encodeURIComponent(iubendaConsentString)};`; + + const pluginsManager = new PluginsManager(defaultPluginEngine, undefined, mockLogger); + const storeManager = new StoreManager(pluginsManager, undefined, mockLogger); + + // Initialize the plugin + IubendaConsentManager().consentManager.init(state, mockLogger); + + // Update the state with the consent data + IubendaConsentManager().consentManager.updateConsentsInfo(state, storeManager, mockLogger); + + expect(state.consents.initialized.value).toBe(true); + expect(state.consents.data.value).toStrictEqual({ + allowedConsentIds: ['1', '4', '5'], + deniedConsentIds: ['2', '3'], + }); + + expect((window as any).getIubendaUserConsentedPurposes()).toStrictEqual([ + '1', + '4', + '5', + ]); + expect((window as any).getIubendaUserDeniedPurposes()).toStrictEqual(['2', '3']); + }); + + it('should return true if the consent manager is not initialized', () => { + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + undefined, + mockErrorHandler, + mockLogger, + ), + ).toBe(true); + }); + + it('should return true if the destination config does not contain iubenda consent purposes data', () => { + state.consents.initialized.value = true; + state.consents.data.value = { + allowedConsentIds: ['1', '4', '5'], + deniedConsentIds: ['2', '3'], + }; + + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + }; + + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ), + ).toBe(true); + }); + + it('should return true if the iubenda consent purposes data is empty in the destination config', () => { + state.consents.initialized.value = true; + state.consents.data.value = { + allowedConsentIds: ['1', '4', '5'], + deniedConsentIds: ['2', '3'], + }; + state.consents.provider.value = 'iubenda'; + + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + consentManagement: [{ + provider: 'iubenda', + }], + + }; + + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ), + ).toBe(true); + }); + + it('should return true if at least one of the iubenda consent purposes in the destination config is allowed', () => { + state.consents.initialized.value = true; + state.consents.data.value = { + allowedConsentIds: ['1', '4', '5'], + deniedConsentIds: ['2', '3'], + }; + state.consents.provider.value = 'iubenda'; + + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + consentManagement:[ + { + provider: 'iubenda', + consents: [{ consent: '1' }, { consent: '2' }], + resolutionStrategy: 'or' + } + ], + }; + + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ), + ).toBe(true); + }); + + it('should return false if none of the iubenda consent purposes in the destination config is allowed', () => { + state.consents.initialized.value = true; + state.consents.data.value = { + allowedConsentIds: ['1', '3', '5'], + deniedConsentIds: ['2', '4'], + }; + state.consents.provider.value = 'iubenda'; + + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + consentManagement:[ + { + provider: 'iubenda', + consents: [{ consent: '2' }, { consent: '4' }], + resolutionStrategy: 'and' + } + ], + }; + + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ), + ).toBe(false); + }); + + it('should return true and log an error if any exception is thrown while checking if the destination is consented', () => { + state.consents.initialized.value = true; + state.consents.data.value = { + allowedConsentIds: null, // This will throw an exception + deniedConsentIds: ['2', '4'], + }; + state.consents.provider.value = 'iubenda'; + + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + consentManagement:[ + { + provider: 'iubenda', + consents: [{ consent: '2' }, { consent: '4' }], + resolutionStrategy: 'and' + } + ], + }; + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + + ), + ).toBe(true); + expect(mockErrorHandler.onError).toHaveBeenCalledWith( + new TypeError("Cannot read properties of null (reading 'includes')"), + 'IubendaConsentManagerPlugin', + 'Failed to determine the consent status for the destination. Please check the destination configuration and try again.', + ); + }); + + it('should return false if the destination categories are not consented in generic consent management config', () => { + state.consents.initialized.value = true; + state.consents.resolutionStrategy.value = 'or'; + state.consents.provider.value = 'iubenda'; + state.consents.data.value = { + allowedConsentIds: ['C0001', 'C0003'], + }; + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + consentManagement: [ + { + provider: 'oneTrust', + consents: [ + { + consent: 'Functional Cookies', + }, + { + consent: 'C0004', + }, + ], + }, + { + provider: 'iubenda', + consents: [ + { + consent: 'C0004', + }, + ], + }, + ], + }; + const isDestinationConsented = IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ); + expect(isDestinationConsented).toBe(false); + }); + + it("should return true if the active consent provider's configuration data is not present in the destination config", () => { + state.consents.initialized.value = true; + state.consents.resolutionStrategy.value = 'or'; + state.consents.provider.value = 'iubenda'; + state.consents.data.value = { + allowedConsentIds: ['C0001', 'C0003'], + }; + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + consentManagement: [ + { + provider: 'oneTrust', + consents: [ + { + consent: 'Functional Cookies', + }, + ], + }, + ], + }; + const isDestinationConsented = IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ); + expect(isDestinationConsented).toBe(true); + }); + + it('should return true if at least one of the configured consents in generic consent management are consented', () => { + state.consents.initialized.value = true; + state.consents.provider.value = 'iubenda'; + state.consents.resolutionStrategy.value = 'or'; + state.consents.data.value = { + allowedConsentIds: ['C0001', 'C0003'], + }; + const destConfig = { + blacklistedEvents: [], + whitelistedEvents: [], + eventFilteringOption: 'disable', + consentManagement: [ + { + provider: 'oneTrust', + consents: [ + { + consent: 'Functional Cookies', + }, + { + consent: 'C0003', + }, + ], + }, + { + provider: 'iubenda', + consents: [ + { + consent: 'C0003', + }, + ], + }, + ], + }; + const isDestinationConsented = IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ); + expect(isDestinationConsented).toBe(true); + }); + + it('should return appropriate value when the resolution strategy is set to "and"', () => { + state.consents.initialized.value = true; + state.consents.provider.value = 'iubenda'; + state.consents.resolutionStrategy.value = 'and'; + state.consents.data.value = { + allowedConsentIds: ['C0001', 'C0002', 'C0003'], + }; + const destConfig = { + consentManagement: [ + { + provider: 'iubenda', + consents: [ + { + consent: 'C0001', + }, + { + consent: 'C0002', + }, + ], + }, + ], + }; + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ), + ).toBe(true); + }); + + it('should return appropriate value when the resolution strategy not set', () => { + state.consents.initialized.value = true; + state.consents.provider.value = 'iubenda'; + state.consents.resolutionStrategy.value = null; + state.consents.data.value = { + allowedConsentIds: ['C0001', 'C0002', 'C0003'], + }; + const destConfig = { + consentManagement: [ + { + provider: 'iubenda', + consents: [ + { + consent: 'C0001', + }, + { + consent: 'C0002', + }, + ], + }, + ], + }; + expect( + IubendaConsentManager().consentManager.isDestinationConsented( + state, + destConfig, + mockErrorHandler, + mockLogger, + ), + ).toBe(true); + }); +}); diff --git a/packages/analytics-js-plugins/__tests__/iubendaConsentManager/utils.test.ts b/packages/analytics-js-plugins/__tests__/iubendaConsentManager/utils.test.ts new file mode 100644 index 000000000..69318eb68 --- /dev/null +++ b/packages/analytics-js-plugins/__tests__/iubendaConsentManager/utils.test.ts @@ -0,0 +1,155 @@ +import { state, resetState } from '@rudderstack/analytics-js/state'; +import { defaultPluginEngine } from '@rudderstack/analytics-js/services/PluginEngine'; +import { PluginsManager } from '@rudderstack/analytics-js/components/pluginsManager'; +import { StoreManager } from '@rudderstack/analytics-js/services/StoreManager/StoreManager'; +import { + updateConsentStateFromData, + getConsentData, + getIubendaConsentData, +} from '../../src/iubendaConsentManager/utils'; +import { IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME} from '../../src/iubendaConsentManager/constants'; + +describe('IubendaConsentManager - Utils', () => { + const mockLogger = { + error: jest.fn(), + warn: jest.fn(), + log: jest.fn(), + }; + + beforeEach(() => { + resetState(); + + // delete all cookies + document.cookie.split(';').forEach(c => { + document.cookie = c + .replace(/^ +/, '') + .replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`); + }); + }); + + describe('updateConsentStateFromData', () => { + it('should update the consent state from the iubenda data', () => { + const iubendaConsentData = { + '1': true, + '2': false, + '3': true, + '4': false, + '5': true, + }; + + // Initialize the plugin + updateConsentStateFromData(state, iubendaConsentData); + + expect(state.consents.data.value).toStrictEqual({ + allowedConsentIds: ['1', '3', '5'], + deniedConsentIds: ['2', '4'], + }); + }); + }); + + describe('getConsentData', () => { + it('should get consent data from iubenda consent data', () => { + const iubendaConsentData = { + '1': true, + '2': false, + '3': true, + '4': false, + '5': true, + }; + + const consentData = getConsentData(iubendaConsentData); + + expect(consentData).toStrictEqual({ + allowedConsentIds: ['1', '3', '5'], + deniedConsentIds: ['2', '4'], + }); + }); + + it('should get consent data if the iubenda consent data is not provided', () => { + const consentData = getConsentData(); + + expect(consentData).toStrictEqual({ + allowedConsentIds: [], + deniedConsentIds: [], + }); + }); + }); + + describe('getIubendaConsentData', () => { + const pluginsManager = new PluginsManager(defaultPluginEngine, undefined, mockLogger); + const storeManager = new StoreManager(pluginsManager, undefined, mockLogger); + + it('should get the iubenda consent data from cookies', () => { + // Mock the iubenda data in the cookies + const iubendaRawConsentData = { + timestamp: "2024-10-1T01:57:25.825Z", + version: "1.67.1", + purposes: { + '1': true, + '2': false, + '3': true, + '4': false, + '5': true + }, + id: 252372, + cons: { + rand: "92f72a" + } + }; + const iubendaConsentString = JSON.stringify(iubendaRawConsentData); + + // Mock the iubenda cookies + document.cookie = `${IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME}=${window.encodeURIComponent(iubendaConsentString)};`; + + const iubendaConsentData = getIubendaConsentData(storeManager, mockLogger); + + expect(iubendaConsentData).toStrictEqual({ + '1': true, + '2': false, + '3': true, + '4': false, + '5': true, + }); + }); + + it('should return undefined if iubenda consent cookie could not be read', () => { + // mock store manager to intentionally throw error + const mockStoreManager = { + setStore: () => ({ + engine: null, + }), + }; + + const iubendaConsentData = getIubendaConsentData(mockStoreManager, mockLogger); + + expect(iubendaConsentData).toBeUndefined(); + }); + + it('should return undefined if iubenda consent cookie is not present', () => { + const iubendaConsentData = getIubendaConsentData(storeManager, mockLogger); + + expect(iubendaConsentData).toBeUndefined(); + }); + + + it('should return undefined if iubenda consent data inside the cookie is null', () => { + // Mock the iubenda cookie + // The value is inside is null + document.cookie = `${IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME}=null;`; + + const iubendaConsentData = getIubendaConsentData(storeManager, mockLogger); + + expect(iubendaConsentData).toBeUndefined(); + }); + + it('should return undefined if iubenda consent data inside the cookie is an empty string', () => { + // Mock the iubenda cookie + // The value is inside is empty string + document.cookie = `${IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME}=%22%22;`; + + const iubendaConsentData = getIubendaConsentData(storeManager, mockLogger); + + expect(iubendaConsentData).toBeUndefined(); + }); + }); +}); diff --git a/packages/analytics-js-plugins/rollup.config.mjs b/packages/analytics-js-plugins/rollup.config.mjs index c93f2aa48..de66d8555 100644 --- a/packages/analytics-js-plugins/rollup.config.mjs +++ b/packages/analytics-js-plugins/rollup.config.mjs @@ -44,6 +44,7 @@ const pluginsMap = { './ErrorReporting': './src/errorReporting/index.ts', './ExternalAnonymousId': './src/externalAnonymousId/index.ts', './GoogleLinker': './src/googleLinker/index.ts', + './IubendaConsentManager': './src/iubendaConsentManager/index.ts', './KetchConsentManager': './src/ketchConsentManager/index.ts', './NativeDestinationQueue': './src/nativeDestinationQueue/index.ts', './OneTrustConsentManager': './src/oneTrustConsentManager/index.ts', diff --git a/packages/analytics-js-plugins/src/index.ts b/packages/analytics-js-plugins/src/index.ts index c898c0b79..d63b16825 100644 --- a/packages/analytics-js-plugins/src/index.ts +++ b/packages/analytics-js-plugins/src/index.ts @@ -6,6 +6,7 @@ export { default as DeviceModeTransformation } from './deviceModeTransformation' export { default as ErrorReporting } from './errorReporting'; export { default as ExternalAnonymousId } from './externalAnonymousId'; export { default as GoogleLinker } from './googleLinker'; +export { default as IubendaConsentManager } from './iubendaConsentManager'; export { default as NativeDestinationQueue } from './nativeDestinationQueue'; export { default as OneTrustConsentManager } from './oneTrustConsentManager'; export { default as KetchConsentManager } from './ketchConsentManager'; diff --git a/packages/analytics-js-plugins/src/iubendaConsentManager/constants.ts b/packages/analytics-js-plugins/src/iubendaConsentManager/constants.ts new file mode 100644 index 000000000..b54a9bd66 --- /dev/null +++ b/packages/analytics-js-plugins/src/iubendaConsentManager/constants.ts @@ -0,0 +1,4 @@ +const IUBENDA_CONSENT_MANAGER_PLUGIN = 'IubendaConsentManagerPlugin'; +const IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME = '_iub_cs-252372'; +const IUBENDA_CONSENT_COOKIE_NAME_PATTERN = /^_iub_cs-\d+$/; +export { IUBENDA_CONSENT_MANAGER_PLUGIN, IUBENDA_CONSENT_COOKIE_NAME_PATTERN, IUBENDA_CONSENT_EXAMPLE_COOKIE_NAME }; diff --git a/packages/analytics-js-plugins/src/iubendaConsentManager/index.ts b/packages/analytics-js-plugins/src/iubendaConsentManager/index.ts new file mode 100644 index 000000000..e1dc34bd7 --- /dev/null +++ b/packages/analytics-js-plugins/src/iubendaConsentManager/index.ts @@ -0,0 +1,109 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable no-param-reassign */ +import type { ApplicationState } from '@rudderstack/analytics-js-common/types/ApplicationState'; +import type { DestinationConfig } from '@rudderstack/analytics-js-common/types/Destination'; +import type { ILogger } from '@rudderstack/analytics-js-common/types/Logger'; +import type { ExtensionPlugin } from '@rudderstack/analytics-js-common/types/PluginEngine'; +import type { IStoreManager } from '@rudderstack/analytics-js-common/types/Store'; +import type { IErrorHandler } from '@rudderstack/analytics-js-common/types/ErrorHandler'; +import type { PluginName } from '@rudderstack/analytics-js-common/types/PluginsManager'; +import { checks } from '../shared-chunks/common'; +import { DESTINATION_CONSENT_STATUS_ERROR } from './logMessages'; +import { IUBENDA_CONSENT_MANAGER_PLUGIN } from './constants'; +import type { IubendaConsentData } from './types'; +import { updateConsentStateFromData, getIubendaConsentData } from './utils'; + + +const pluginName: PluginName = 'IubendaConsentManager'; + +const IubendaConsentManager = (): ExtensionPlugin => ({ + name: pluginName, + deps: [], + initialize: (state: ApplicationState) => { + state.plugins.loadedPlugins.value = [...state.plugins.loadedPlugins.value, pluginName]; + }, + consentManager: { + init(state: ApplicationState, logger?: ILogger): void { + // getIubendaUserConsentedPurposes returns current iubenda opted-in purposes + // This will be helpful for debugging + (globalThis as any).getIubendaUserConsentedPurposes = () => + (state.consents.data.value.allowedConsentIds as string[])?.slice(); + + // getIubendaUserDeniedPurposes returns current Iubenda opted-out purposes + // This will be helpful for debugging + (globalThis as any).getIubendaUserDeniedPurposes = () => + (state.consents.data.value.deniedConsentIds as string[])?.slice(); + + // updateIubendaConsent callback function to update current consent purpose state + (globalThis as any).updateIubendaConsent = (iubendaConsentData: IubendaConsentData) => { + updateConsentStateFromData(state, iubendaConsentData); + }; + }, + + updateConsentsInfo( + state: ApplicationState, + storeManager?: IStoreManager, + logger?: ILogger, + ): void { + // retrieve consent data and update the state + let iubendaConsentData; + // From window + if (!checks.isUndefined((globalThis as any)._iub.cs.consent.purposes)) { + iubendaConsentData = (globalThis as any)._iub.cs.consent.purposes; + // From cookie + } else { + iubendaConsentData = getIubendaConsentData(storeManager, logger); + } + updateConsentStateFromData(state, iubendaConsentData); + }, + + isDestinationConsented( + state: ApplicationState, + destConfig: DestinationConfig, + errorHandler?: IErrorHandler, + logger?: ILogger, + ): boolean { + if (!state.consents.initialized.value) { + return true; + } + const allowedConsentIds = state.consents.data.value.allowedConsentIds as string[]; + const matchPredicate = (consent: string) => allowedConsentIds.includes(consent); + + try { + const { consentManagement } = destConfig; + // If the destination does not have consent management config, events should be sent. + if (consentManagement) { + // Get the corresponding consents for the destination + const cmpConfig = consentManagement.find(c => c.provider === state.consents.provider.value); + + // If there are no consents configured for the destination for the current provider, events should be sent. + if (!cmpConfig?.consents) { + return true; + } + + const configuredConsents = cmpConfig.consents.map(c => c.consent.trim()).filter(n => n); + const resolutionStrategy = + cmpConfig.resolutionStrategy ?? state.consents.resolutionStrategy.value; + + // match the configured consents with user provided consents as per + // the configured resolution strategy + switch (resolutionStrategy) { + case 'or': + return configuredConsents.some(matchPredicate) || configuredConsents.length === 0; + case 'and': + default: + return configuredConsents.every(matchPredicate); + } + } + return true; + } catch (err) { + errorHandler?.onError(err, IUBENDA_CONSENT_MANAGER_PLUGIN, DESTINATION_CONSENT_STATUS_ERROR); + return true; + } + }, + }, +}); + +export { IubendaConsentManager }; + +export default IubendaConsentManager; diff --git a/packages/analytics-js-plugins/src/iubendaConsentManager/logMessages.ts b/packages/analytics-js-plugins/src/iubendaConsentManager/logMessages.ts new file mode 100644 index 000000000..944a04647 --- /dev/null +++ b/packages/analytics-js-plugins/src/iubendaConsentManager/logMessages.ts @@ -0,0 +1,11 @@ +import { LOG_CONTEXT_SEPARATOR } from '@rudderstack/analytics-js-common/constants/logMessages'; + +const IUBENDA_CONSENT_COOKIE_READ_ERROR = (context: string): string => + `${context}${LOG_CONTEXT_SEPARATOR}Failed to read the consent cookie.`; + +const IUBENDA_CONSENT_COOKIE_PARSE_ERROR = (context: string): string => + `${context}${LOG_CONTEXT_SEPARATOR}Failed to parse the consent cookie.`; + +const DESTINATION_CONSENT_STATUS_ERROR = `Failed to determine the consent status for the destination. Please check the destination configuration and try again.`; + +export { IUBENDA_CONSENT_COOKIE_READ_ERROR, IUBENDA_CONSENT_COOKIE_PARSE_ERROR, DESTINATION_CONSENT_STATUS_ERROR }; diff --git a/packages/analytics-js-plugins/src/iubendaConsentManager/types.ts b/packages/analytics-js-plugins/src/iubendaConsentManager/types.ts new file mode 100644 index 000000000..86454b83b --- /dev/null +++ b/packages/analytics-js-plugins/src/iubendaConsentManager/types.ts @@ -0,0 +1,16 @@ + +export type IubendaConsentCookieData = { + timestamp: string; // ISO 8601 format date string + version: string; // Version number in string format + purposes: IubendaConsentData; // Object holding purpose consent data + id: number; // Unique ID number + cons: Consent; // Additional consent details +}; + +export type IubendaConsentData = { + [purposeId: string]: boolean; +}; + +export type Consent = { + rand: string; // A random string associated with consent +}; \ No newline at end of file diff --git a/packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts b/packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts new file mode 100644 index 000000000..31c217e0f --- /dev/null +++ b/packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts @@ -0,0 +1,114 @@ +/* eslint-disable no-param-reassign */ +import type { IStoreManager } from '@rudderstack/analytics-js-common/types/Store'; +import type { ILogger } from '@rudderstack/analytics-js-common/types/Logger'; +import type { ApplicationState } from '@rudderstack/analytics-js-common/types/ApplicationState'; +import type { ConsentsInfo } from '@rudderstack/analytics-js-common/types/Consent'; +import { isDefined } from '@rudderstack/analytics-js-common/utilities/checks'; +import { checks, storages, string } from '../shared-chunks/common'; +import { IUBENDA_CONSENT_COOKIE_READ_ERROR, IUBENDA_CONSENT_COOKIE_PARSE_ERROR } from './logMessages'; +import { IUBENDA_CONSENT_MANAGER_PLUGIN, IUBENDA_CONSENT_COOKIE_NAME_PATTERN } from './constants'; +import type { IubendaConsentData, IubendaConsentCookieData} from './types' + +/** + * Gets the consent data from the Iubenda's consent cookie + * @param storeManager Store manager instance + * @param logger Logger instance + * @returns Consent data from the consent cookie + */ +const getIubendaConsentData = ( + storeManager?: IStoreManager, + logger?: ILogger, +): IubendaConsentData | undefined => { + let rawConsentCookieData = null; + try { + + const dataStore = storeManager?.setStore({ + id: IUBENDA_CONSENT_MANAGER_PLUGIN, + name: IUBENDA_CONSENT_MANAGER_PLUGIN, + type: storages.COOKIE_STORAGE, + }); + rawConsentCookieData = dataStore?.engine.getItem(getIubendaCookieName(logger)); + + } catch (err) { + logger?.error(IUBENDA_CONSENT_COOKIE_READ_ERROR(IUBENDA_CONSENT_MANAGER_PLUGIN), err); + return undefined; + } + + if (checks.isNullOrUndefined(rawConsentCookieData)) { + return undefined; + } + + // Decode and parse the cookie data to JSON + let consentCookieData: IubendaConsentCookieData; + try { + consentCookieData = JSON.parse(decodeURIComponent(rawConsentCookieData as string)); + } catch (err) { + logger?.error(IUBENDA_CONSENT_COOKIE_PARSE_ERROR(IUBENDA_CONSENT_MANAGER_PLUGIN), err); + return undefined; + } + + if (!consentCookieData) { + return undefined; + } + + // Convert the cookie data to consent data + const consentPurposes: IubendaConsentData = consentCookieData.purposes; + return consentPurposes; +}; + +/** + * Gets the consent data in the format expected by the application state + * @param iubendaConsentData Consent data derived from the consent cookie + * @returns Consent data + */ +const getConsentData = (iubendaConsentData?: IubendaConsentData): ConsentsInfo => { + const allowedConsentIds: string[] = []; + const deniedConsentIds: string[] = []; + if (iubendaConsentData) { + Object.entries(iubendaConsentData).forEach(e => { + const purposeId = e[0]; + const isConsented = e[1]; + if (isConsented) { + allowedConsentIds.push(purposeId); + } else { + deniedConsentIds.push(purposeId); + } + }); + } + + return { allowedConsentIds, deniedConsentIds }; +}; + +const updateConsentStateFromData = ( + state: ApplicationState, + iubendaConsentData: IubendaConsentData, +) => { + const consentData = getConsentData(iubendaConsentData); + state.consents.initialized.value = isDefined(iubendaConsentData); + state.consents.data.value = consentData; +}; +const getIubendaCookieName = ( logger?: ILogger ): string => { + try { + // Retrieve cookies as a string and split them into an array + const cookies = document.cookie.split('; '); + + // Find the cookie that matches the iubenda cookie pattern + const matchedCookie = cookies.find(cookie => { + const [name] = cookie.split('='); + return IUBENDA_CONSENT_COOKIE_NAME_PATTERN.test((name || "").trim()); + }); + + if (!matchedCookie) { + throw new Error('Iubenda Cookie not found with the specified pattern.'); + } + + // Extract and return the cookie name + const [name] = matchedCookie.split('='); + return name || ""; + } catch (err) { + logger?.error(IUBENDA_CONSENT_COOKIE_READ_ERROR(IUBENDA_CONSENT_MANAGER_PLUGIN), err); + return ""; + } +}; + +export { getIubendaConsentData, getConsentData, updateConsentStateFromData, getIubendaCookieName }; diff --git a/packages/analytics-js/__mocks__/remotePlugins/IubendaConsentManager.ts b/packages/analytics-js/__mocks__/remotePlugins/IubendaConsentManager.ts new file mode 100644 index 000000000..97fe4654a --- /dev/null +++ b/packages/analytics-js/__mocks__/remotePlugins/IubendaConsentManager.ts @@ -0,0 +1,10 @@ +const IubendaConsentManager = () => ({ + name: 'IubendaConsentManager', + consentManager: { + init: jest.fn(() => {}), + updateConsentsInfo: jest.fn(() => {}), + isDestinationConsented: jest.fn(() => {}), + }, +}); + +export default IubendaConsentManager; diff --git a/packages/analytics-js/__tests__/components/configManager/commonUtil.test.ts b/packages/analytics-js/__tests__/components/configManager/commonUtil.test.ts index 077a3f5bb..ff30f7960 100644 --- a/packages/analytics-js/__tests__/components/configManager/commonUtil.test.ts +++ b/packages/analytics-js/__tests__/components/configManager/commonUtil.test.ts @@ -361,7 +361,7 @@ describe('Config Manager Common Utilities', () => { expect(state.consents.activeConsentManagerPluginName.value).toBe(undefined); expect(mockLogger.error).toHaveBeenCalledWith( - 'ConfigManager:: The consent manager "randomManager" is not supported. Please choose one of the following supported consent managers: "oneTrust,ketch,custom".', + 'ConfigManager:: The consent manager "randomManager" is not supported. Please choose one of the following supported consent managers: "iubenda,oneTrust,ketch,custom".', ); }); diff --git a/packages/analytics-js/public/index.html b/packages/analytics-js/public/index.html index 5da3725f8..0130fcf64 100644 --- a/packages/analytics-js/public/index.html +++ b/packages/analytics-js/public/index.html @@ -385,4 +385,4 @@

Test HTML file

} - + \ No newline at end of file diff --git a/packages/analytics-js/rollup.config.mjs b/packages/analytics-js/rollup.config.mjs index 47ed75f14..2a1a2e8ea 100644 --- a/packages/analytics-js/rollup.config.mjs +++ b/packages/analytics-js/rollup.config.mjs @@ -109,6 +109,10 @@ const getExternalsConfig = () => { externalGlobalsConfig['@rudderstack/analytics-js-plugins/googleLinker'] = '{}'; } + if (!bundledPluginsList.includes('IubendaConsentManager')) { + externalGlobalsConfig['@rudderstack/analytics-js-plugins/iubendaConsentManager'] = '{}'; + } + if (!bundledPluginsList.includes('KetchConsentManager')) { externalGlobalsConfig['@rudderstack/analytics-js-plugins/ketchConsentManager'] = '{}'; } diff --git a/packages/analytics-js/src/components/configManager/constants.ts b/packages/analytics-js/src/components/configManager/constants.ts index 2e87f9692..85984be8e 100644 --- a/packages/analytics-js/src/components/configManager/constants.ts +++ b/packages/analytics-js/src/components/configManager/constants.ts @@ -4,6 +4,7 @@ const DEFAULT_STORAGE_ENCRYPTION_VERSION = 'v3'; const DEFAULT_DATA_PLANE_EVENTS_TRANSPORT = 'xhr'; export const ConsentManagersToPluginNameMap: Record = { + iubenda: 'IubendaConsentManager', oneTrust: 'OneTrustConsentManager', ketch: 'KetchConsentManager', custom: 'CustomConsentManager', diff --git a/packages/analytics-js/src/components/pluginsManager/bundledBuildPluginImports.ts b/packages/analytics-js/src/components/pluginsManager/bundledBuildPluginImports.ts index 8dd16fa8a..233c09fae 100644 --- a/packages/analytics-js/src/components/pluginsManager/bundledBuildPluginImports.ts +++ b/packages/analytics-js/src/components/pluginsManager/bundledBuildPluginImports.ts @@ -6,6 +6,7 @@ import { DeviceModeTransformation } from '@rudderstack/analytics-js-plugins/devi import { ErrorReporting } from '@rudderstack/analytics-js-plugins/errorReporting'; import { ExternalAnonymousId } from '@rudderstack/analytics-js-plugins/externalAnonymousId'; import { GoogleLinker } from '@rudderstack/analytics-js-plugins/googleLinker'; +import { IubendaConsentManager } from '@rudderstack/analytics-js-plugins/iubendaConsentManager'; import { KetchConsentManager } from '@rudderstack/analytics-js-plugins/ketchConsentManager'; import { NativeDestinationQueue } from '@rudderstack/analytics-js-plugins/nativeDestinationQueue'; import { OneTrustConsentManager } from '@rudderstack/analytics-js-plugins/oneTrustConsentManager'; @@ -27,6 +28,7 @@ const getBundledBuildPluginImports = (): PluginMap => ({ ErrorReporting, ExternalAnonymousId, GoogleLinker, + IubendaConsentManager, KetchConsentManager, NativeDestinationQueue, OneTrustConsentManager, diff --git a/packages/analytics-js/src/components/pluginsManager/defaultPluginsList.ts b/packages/analytics-js/src/components/pluginsManager/defaultPluginsList.ts index 149f94278..e232c9c22 100644 --- a/packages/analytics-js/src/components/pluginsManager/defaultPluginsList.ts +++ b/packages/analytics-js/src/components/pluginsManager/defaultPluginsList.ts @@ -12,6 +12,7 @@ const defaultOptionalPluginsList: PluginName[] = [ 'ErrorReporting', 'ExternalAnonymousId', 'GoogleLinker', + 'IubendaConsentManager', 'KetchConsentManager', 'NativeDestinationQueue', 'OneTrustConsentManager', diff --git a/packages/analytics-js/src/components/pluginsManager/federatedModulesBuildPluginImports.ts b/packages/analytics-js/src/components/pluginsManager/federatedModulesBuildPluginImports.ts index d5e8485ff..cd5105c8e 100644 --- a/packages/analytics-js/src/components/pluginsManager/federatedModulesBuildPluginImports.ts +++ b/packages/analytics-js/src/components/pluginsManager/federatedModulesBuildPluginImports.ts @@ -28,6 +28,8 @@ const getFederatedModuleImport = ( return () => import('rudderAnalyticsRemotePlugins/GoogleLinker'); case 'KetchConsentManager': return () => import('rudderAnalyticsRemotePlugins/KetchConsentManager'); + case 'IubendaConsentManager': + return () => import('rudderAnalyticsRemotePlugins/IubendaConsentManager'); case 'NativeDestinationQueue': return () => import('rudderAnalyticsRemotePlugins/NativeDestinationQueue'); case 'OneTrustConsentManager': diff --git a/packages/analytics-js/src/components/pluginsManager/pluginNames.ts b/packages/analytics-js/src/components/pluginsManager/pluginNames.ts index 4cb8bb614..3814c1634 100644 --- a/packages/analytics-js/src/components/pluginsManager/pluginNames.ts +++ b/packages/analytics-js/src/components/pluginsManager/pluginNames.ts @@ -17,6 +17,7 @@ const pluginNamesList: PluginName[] = [ 'ErrorReporting', 'ExternalAnonymousId', 'GoogleLinker', + 'IubendaConsentManager', 'KetchConsentManager', 'NativeDestinationQueue', 'OneTrustConsentManager', diff --git a/packages/analytics-js/src/types/remote-plugins.d.ts b/packages/analytics-js/src/types/remote-plugins.d.ts index cceba4140..c6f49d12b 100644 --- a/packages/analytics-js/src/types/remote-plugins.d.ts +++ b/packages/analytics-js/src/types/remote-plugins.d.ts @@ -6,6 +6,7 @@ declare module 'rudderAnalyticsRemotePlugins/DeviceModeTransformation'; declare module 'rudderAnalyticsRemotePlugins/ErrorReporting'; declare module 'rudderAnalyticsRemotePlugins/ExternalAnonymousId'; declare module 'rudderAnalyticsRemotePlugins/GoogleLinker'; +declare module 'rudderAnalyticsRemotePlugins/IubendaConsentManager'; declare module 'rudderAnalyticsRemotePlugins/KetchConsentManager'; declare module 'rudderAnalyticsRemotePlugins/NativeDestinationQueue'; declare module 'rudderAnalyticsRemotePlugins/OneTrustConsentManager'; From 2365e1c58b85ff6e7f47854f473fa9da51b157f8 Mon Sep 17 00:00:00 2001 From: Sai Kumar Battinoju <88789928+saikumarrs@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:57:32 +0530 Subject: [PATCH 03/14] chore: update code owners for easier release management (#1894) * chore: update code owners for easier release management * chore: add slash to directories to apply the changes to all * chore: pass env correctly to npm * chore: use cross-env * chore: try direct commit hash * chore: specify head commit too * chore: use env now * chore: move base ref to global env * chore: check for affected projects * chore: fix all the workflows * chore: skip fixing workflows for now * chore: fix affected issues --- ...ty-code-quality-and-bundle-size-checks.yml | 5 +---- .github/workflows/unit-tests-and-lint.yml | 12 ++++++++---- CODEOWNERS | 13 +++++++++++-- package-lock.json | 19 +++++++++++++++++++ package.json | 1 + 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/.github/workflows/security-code-quality-and-bundle-size-checks.yml b/.github/workflows/security-code-quality-and-bundle-size-checks.yml index 272ba8472..e285abe49 100644 --- a/.github/workflows/security-code-quality-and-bundle-size-checks.yml +++ b/.github/workflows/security-code-quality-and-bundle-size-checks.yml @@ -7,6 +7,7 @@ on: env: NODE_OPTIONS: "--no-warnings" + BASE_REF: ${{ github.event.pull_request.base.sha || 'HEAD' }} jobs: bundle-size-checks: @@ -64,15 +65,11 @@ jobs: npm run check:duplicates - name: Build the project - env: - BASE_REF: ${{ github.event.pull_request.base.sha }} run: | npm run build:ci npm run build:modern:ci - name: Execute package linting checks - env: - BASE_REF: ${{ github.event.pull_request.base.sha }} run: | npm run check:pub:ci diff --git a/.github/workflows/unit-tests-and-lint.yml b/.github/workflows/unit-tests-and-lint.yml index 99c2c15f6..52898419d 100644 --- a/.github/workflows/unit-tests-and-lint.yml +++ b/.github/workflows/unit-tests-and-lint.yml @@ -10,6 +10,7 @@ on: env: NODE_OPTIONS: "--no-warnings" + BASE_REF: ${{ github.event.pull_request.base.sha || 'HEAD' }} jobs: test: @@ -35,9 +36,14 @@ jobs: run: | npm run setup:ci + - name: Check for affected projects + id: check_affected + run: | + AFFECTED_PROJECTS=$(npx nx show projects --affected --base=$BASE_REF | tr '\n' ',') + echo "Affected projects: $AFFECTED_PROJECTS" + echo "affected_projects=$AFFECTED_PROJECTS" >> $GITHUB_OUTPUT + - name: Execute unit tests - env: - BASE_REF: ${{ github.event.pull_request.base.sha || 'HEAD' }} run: | npm run test:ci @@ -49,8 +55,6 @@ jobs: files: ./packages/analytics-js/reports/coverage/clover.xml,./packages/analytics-js-common/reports/coverage/clover.xml,./packages/analytics-js-integrations/reports/coverage/clover.xml,./packages/analytics-js-plugins/reports/coverage/clover.xml,./packages/analytics-js-service-worker/reports/coverage/clover.xml,./packages/analytics-v1.1/reports/coverage/clover.xml,./packages/analytics-js-cookies/reports/coverage/clover.xml - name: Execute linting check - env: - BASE_REF: ${{ github.event.pull_request.base.sha || 'HEAD' }} run: | npm run check:lint:ci diff --git a/CODEOWNERS b/CODEOWNERS index 730fd6679..ba26277d2 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,12 @@ * @rudderlabs/js-sdk -/packages/analytics-js-integrations/ @rudderlabs/js-sdk-dm-intg-eng -/packages/analytics-js-common/src/constants/integrations @rudderlabs/js-sdk-dm-intg-eng + +/packages/analytics-js-integrations/src/ @rudderlabs/js-sdk-dm-intg-eng +/packages/analytics-js-integrations/__fixtures__/ @rudderlabs/js-sdk-dm-intg-eng +/packages/analytics-js-integrations/__tests__/ @rudderlabs/js-sdk-dm-intg-eng +/packages/analytics-js-integrations/__mocks__/ @rudderlabs/js-sdk-dm-intg-eng +/packages/analytics-js-integrations/README.md @rudderlabs/js-sdk-dm-intg-eng +/packages/analytics-js-integrations/.size-limit.js @rudderlabs/js-sdk-dm-intg-eng + +/packages/analytics-js-common/src/constants/integrations/ @rudderlabs/js-sdk-dm-intg-eng +/assets/integrations/AdobeAnalytics/ @rudderlabs/js-sdk-dm-intg-eng +/examples/integrations/ @rudderlabs/js-sdk-dm-intg-eng diff --git a/package-lock.json b/package-lock.json index 392a6aa1b..12385b007 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,6 +89,7 @@ "commitizen": "4.3.1", "commitlint": "19.5.0", "core-js": "3.38.1", + "cross-env": "7.0.3", "dotenv": "16.4.5", "each": "2.7.0", "eslint": "8.57.0", @@ -10483,6 +10484,24 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/package.json b/package.json index b4e4ee524..bd2af1ad8 100644 --- a/package.json +++ b/package.json @@ -144,6 +144,7 @@ "commitizen": "4.3.1", "commitlint": "19.5.0", "core-js": "3.38.1", + "cross-env": "7.0.3", "dotenv": "16.4.5", "each": "2.7.0", "eslint": "8.57.0", From ba5ae5b82a17ed5c747ab5c636c94516084c5e75 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:25 +0000 Subject: [PATCH 04/14] chore(@rudderstack/analytics-js-common): release version 3.10.0 --- packages/analytics-js-common/CHANGELOG.md | 7 +++++++ packages/analytics-js-common/package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/analytics-js-common/CHANGELOG.md b/packages/analytics-js-common/CHANGELOG.md index a719d15be..cde09b39e 100644 --- a/packages/analytics-js-common/CHANGELOG.md +++ b/packages/analytics-js-common/CHANGELOG.md @@ -2,6 +2,13 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.10.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.9.5...@rudderstack/analytics-js-common@3.10.0) (2024-10-21) + + +### Features + +* iubenda consent manager plugin ([#1809](https://github.com/rudderlabs/rudder-sdk-js/issues/1809)) ([7ea300c](https://github.com/rudderlabs/rudder-sdk-js/commit/7ea300c61ead9cc094c3f1985e0ef3165b0fcb59)) + ## [3.9.5](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.9.4...@rudderstack/analytics-js-common@3.9.5) (2024-10-18) diff --git a/packages/analytics-js-common/package.json b/packages/analytics-js-common/package.json index 422a0f063..97fc36648 100644 --- a/packages/analytics-js-common/package.json +++ b/packages/analytics-js-common/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-common", - "version": "3.9.5", + "version": "3.10.0", "private": true, "description": "RudderStack JavaScript SDK common code", "module": "dist/npm/index.js", From 2723b340b122fc838d7cfa64d53153ecb8412d78 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:26 +0000 Subject: [PATCH 05/14] chore(@rudderstack/analytics-js-plugins): release version 3.5.0 --- packages/analytics-js-plugins/CHANGELOG.md | 12 ++++++++++++ packages/analytics-js-plugins/package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/analytics-js-plugins/CHANGELOG.md b/packages/analytics-js-plugins/CHANGELOG.md index 750079551..6887ca982 100644 --- a/packages/analytics-js-plugins/CHANGELOG.md +++ b/packages/analytics-js-plugins/CHANGELOG.md @@ -2,6 +2,18 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.5.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.4.19...@rudderstack/analytics-js-plugins@3.5.0) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.10.0` +* `@rudderstack/analytics-js` updated to version `3.7.19` +* `@rudderstack/analytics-js-cookies` updated to version `0.3.11` + +### Features + +* iubenda consent manager plugin ([#1809](https://github.com/rudderlabs/rudder-sdk-js/issues/1809)) ([7ea300c](https://github.com/rudderlabs/rudder-sdk-js/commit/7ea300c61ead9cc094c3f1985e0ef3165b0fcb59)) + ## [3.4.19](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.4.18...@rudderstack/analytics-js-plugins@3.4.19) (2024-10-18) ### Dependency Updates diff --git a/packages/analytics-js-plugins/package.json b/packages/analytics-js-plugins/package.json index f2eda3306..e81386911 100644 --- a/packages/analytics-js-plugins/package.json +++ b/packages/analytics-js-plugins/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-plugins", - "version": "3.4.19", + "version": "3.5.0", "private": true, "description": "RudderStack JavaScript SDK plugins", "main": "dist/npm/modern/cjs/index.cjs", From d1b287426e142804ce99353f037d5fa4e683d347 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:27 +0000 Subject: [PATCH 06/14] chore(@rudderstack/analytics-js-cookies): release version 0.3.12 --- packages/analytics-js-cookies/CHANGELOG.md | 5 +++++ packages/analytics-js-cookies/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/analytics-js-cookies/CHANGELOG.md b/packages/analytics-js-cookies/CHANGELOG.md index f9faa5970..c71da3181 100644 --- a/packages/analytics-js-cookies/CHANGELOG.md +++ b/packages/analytics-js-cookies/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [0.3.12](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.3.11...@rudderstack/analytics-js-cookies@0.3.12) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.10.0` ## [0.3.11](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.3.10...@rudderstack/analytics-js-cookies@0.3.11) (2024-10-18) ### Dependency Updates diff --git a/packages/analytics-js-cookies/package.json b/packages/analytics-js-cookies/package.json index bcba3c982..d8bc3d51d 100644 --- a/packages/analytics-js-cookies/package.json +++ b/packages/analytics-js-cookies/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-cookies", - "version": "0.3.11", + "version": "0.3.12", "description": "RudderStack JavaScript SDK Cookies Utilities", "main": "dist/npm/modern/cjs/index.cjs", "module": "dist/npm/modern/esm/index.mjs", From 99aafe2d14ea4fa1e8be8e0f5c2625b29d712f34 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:28 +0000 Subject: [PATCH 07/14] chore(@rudderstack/analytics-js): release version 3.8.0 --- packages/analytics-js/CHANGELOG.md | 12 ++++++++++++ packages/analytics-js/package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/analytics-js/CHANGELOG.md b/packages/analytics-js/CHANGELOG.md index b4f967b79..4e926f176 100644 --- a/packages/analytics-js/CHANGELOG.md +++ b/packages/analytics-js/CHANGELOG.md @@ -2,6 +2,18 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.8.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.7.19...@rudderstack/analytics-js@3.8.0) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js-cookies` updated to version `0.3.12` +* `@rudderstack/analytics-js-common` updated to version `3.10.0` +* `@rudderstack/analytics-js-plugins` updated to version `3.5.0` + +### Features + +* iubenda consent manager plugin ([#1809](https://github.com/rudderlabs/rudder-sdk-js/issues/1809)) ([7ea300c](https://github.com/rudderlabs/rudder-sdk-js/commit/7ea300c61ead9cc094c3f1985e0ef3165b0fcb59)) + ## [3.7.19](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.7.18...@rudderstack/analytics-js@3.7.19) (2024-10-18) ### Dependency Updates diff --git a/packages/analytics-js/package.json b/packages/analytics-js/package.json index 757abe9fa..66c3d4427 100644 --- a/packages/analytics-js/package.json +++ b/packages/analytics-js/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js", - "version": "3.7.19", + "version": "3.8.0", "description": "RudderStack JavaScript SDK", "main": "dist/npm/modern/cjs/index.cjs", "module": "dist/npm/modern/esm/index.mjs", From 796b2c2c19f04184dc0e55f70a7149108eaa883a Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:29 +0000 Subject: [PATCH 08/14] chore(rudder-sdk-js): release version 2.48.22 --- packages/analytics-v1.1/CHANGELOG.md | 5 +++++ packages/analytics-v1.1/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/analytics-v1.1/CHANGELOG.md b/packages/analytics-v1.1/CHANGELOG.md index 4a2f9456d..81cacdd1d 100644 --- a/packages/analytics-v1.1/CHANGELOG.md +++ b/packages/analytics-v1.1/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [2.48.22](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.48.21...rudder-sdk-js@2.48.22) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.10.0` ## [2.48.21](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.48.20...rudder-sdk-js@2.48.21) (2024-10-18) ### Dependency Updates diff --git a/packages/analytics-v1.1/package.json b/packages/analytics-v1.1/package.json index d12ecc32f..422140190 100644 --- a/packages/analytics-v1.1/package.json +++ b/packages/analytics-v1.1/package.json @@ -1,6 +1,6 @@ { "name": "rudder-sdk-js", - "version": "2.48.21", + "version": "2.48.22", "description": "RudderStack JavaScript SDK", "main": "dist/npm/index.js", "module": "dist/npm/index.es.js", From 799db2bdcea789b522377420953576d2e4580d04 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:30 +0000 Subject: [PATCH 09/14] chore(@rudderstack/analytics-js-loading-scripts): release version 3.0.37 --- packages/loading-scripts/CHANGELOG.md | 5 +++++ packages/loading-scripts/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/loading-scripts/CHANGELOG.md b/packages/loading-scripts/CHANGELOG.md index f377762d0..f7c0f0383 100644 --- a/packages/loading-scripts/CHANGELOG.md +++ b/packages/loading-scripts/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.0.37](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-loading-scripts@3.0.36...@rudderstack/analytics-js-loading-scripts@3.0.37) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js` updated to version `3.8.0` ## [3.0.36](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-loading-scripts@3.0.35...@rudderstack/analytics-js-loading-scripts@3.0.36) (2024-10-18) ### Dependency Updates diff --git a/packages/loading-scripts/package.json b/packages/loading-scripts/package.json index 6f4773cca..c9071d1ba 100644 --- a/packages/loading-scripts/package.json +++ b/packages/loading-scripts/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-loading-scripts", - "version": "3.0.36", + "version": "3.0.37", "private": true, "description": "Loading script for RudderStack JavaScript SDK", "main": "./src/index.js", From 4b5ca832e59e15a42d5fb91f2083ddb67022a913 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:31 +0000 Subject: [PATCH 10/14] chore(@rudderstack/analytics-js-integrations): release version 3.9.3 --- packages/analytics-js-integrations/CHANGELOG.md | 5 +++++ packages/analytics-js-integrations/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/analytics-js-integrations/CHANGELOG.md b/packages/analytics-js-integrations/CHANGELOG.md index 36595e020..1999bb401 100644 --- a/packages/analytics-js-integrations/CHANGELOG.md +++ b/packages/analytics-js-integrations/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.9.3](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.9.2...@rudderstack/analytics-js-integrations@3.9.3) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.10.0` ## [3.9.2](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.9.1...@rudderstack/analytics-js-integrations@3.9.2) (2024-10-18) ### Dependency Updates diff --git a/packages/analytics-js-integrations/package.json b/packages/analytics-js-integrations/package.json index 32f0fc346..4a371287f 100644 --- a/packages/analytics-js-integrations/package.json +++ b/packages/analytics-js-integrations/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-integrations", - "version": "3.9.2", + "version": "3.9.3", "private": true, "description": "RudderStack JavaScript SDK device mode integrations", "main": "dist/npm/modern/cjs/index.js", From a31db7473e97b44c99c00540bad1f9052764fd1a Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:32 +0000 Subject: [PATCH 11/14] chore(@rudderstack/analytics-js-service-worker): release version 3.1.15 --- packages/analytics-js-service-worker/CHANGELOG.md | 5 +++++ packages/analytics-js-service-worker/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/analytics-js-service-worker/CHANGELOG.md b/packages/analytics-js-service-worker/CHANGELOG.md index 261aae88d..aafc68c14 100644 --- a/packages/analytics-js-service-worker/CHANGELOG.md +++ b/packages/analytics-js-service-worker/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.1.15](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.1.14...@rudderstack/analytics-js-service-worker@3.1.15) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.10.0` ## [3.1.14](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.1.13...@rudderstack/analytics-js-service-worker@3.1.14) (2024-10-18) ### Dependency Updates diff --git a/packages/analytics-js-service-worker/package.json b/packages/analytics-js-service-worker/package.json index 5f88415d6..5890ebf6d 100644 --- a/packages/analytics-js-service-worker/package.json +++ b/packages/analytics-js-service-worker/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-service-worker", - "version": "3.1.14", + "version": "3.1.15", "description": "RudderStack JavaScript Service Worker SDK", "main": "dist/npm/modern/cjs/index.cjs", "module": "dist/npm/modern/esm/index.mjs", From c6034d663ddb6e8d557b56774c74c584ee3a0cc9 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:33 +0000 Subject: [PATCH 12/14] chore(@rudderstack/analytics-js-sanity-suite): release version 3.1.28 --- packages/sanity-suite/CHANGELOG.md | 5 +++++ packages/sanity-suite/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/sanity-suite/CHANGELOG.md b/packages/sanity-suite/CHANGELOG.md index 390a7a443..e51d98ce9 100644 --- a/packages/sanity-suite/CHANGELOG.md +++ b/packages/sanity-suite/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.1.28](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-sanity-suite@3.1.27...@rudderstack/analytics-js-sanity-suite@3.1.28) (2024-10-21) + +### Dependency Updates + +* `@rudderstack/analytics-js` updated to version `3.8.0` ## [3.1.27](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-sanity-suite@3.1.26...@rudderstack/analytics-js-sanity-suite@3.1.27) (2024-10-18) ### Dependency Updates diff --git a/packages/sanity-suite/package.json b/packages/sanity-suite/package.json index 7c0aae587..dddbd084e 100644 --- a/packages/sanity-suite/package.json +++ b/packages/sanity-suite/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-sanity-suite", - "version": "3.1.27", + "version": "3.1.28", "private": true, "description": "Sanity suite for testing JS SDK package", "main": "./dist/v3/cdn/testBook.js", From 03b4dcb0263a41add3873caa7bfaf0c9eb9f494a Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 21 Oct 2024 05:34:45 +0000 Subject: [PATCH 13/14] chore(monorepo): sync versions and generate release logs --- package-lock.json | 22 +++++++++---------- package.json | 2 +- .../analytics-js-common/CHANGELOG_LATEST.md | 6 ++--- packages/analytics-js-common/project.json | 6 ++--- .../analytics-js-cookies/CHANGELOG_LATEST.md | 4 ++-- packages/analytics-js-cookies/project.json | 6 ++--- .../CHANGELOG_LATEST.md | 4 ++-- .../analytics-js-integrations/project.json | 6 ++--- .../analytics-js-plugins/CHANGELOG_LATEST.md | 12 +++++++--- packages/analytics-js-plugins/project.json | 6 ++--- .../CHANGELOG_LATEST.md | 4 ++-- .../analytics-js-service-worker/project.json | 6 ++--- packages/analytics-js/CHANGELOG_LATEST.md | 12 +++++----- packages/analytics-js/project.json | 6 ++--- packages/analytics-v1.1/CHANGELOG_LATEST.md | 4 ++-- packages/analytics-v1.1/project.json | 6 ++--- packages/loading-scripts/CHANGELOG_LATEST.md | 4 ++-- packages/loading-scripts/project.json | 6 ++--- sonar-project.properties | 2 +- 19 files changed, 65 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12385b007..9b6228ef5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rudderstack/analytics-js-monorepo", - "version": "3.44.0", + "version": "3.45.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rudderstack/analytics-js-monorepo", - "version": "3.44.0", + "version": "3.45.0", "hasInstallScript": true, "license": "Elastic-2.0", "workspaces": [ @@ -25284,7 +25284,7 @@ }, "packages/analytics-js": { "name": "@rudderstack/analytics-js", - "version": "3.7.19", + "version": "3.8.0", "license": "Elastic-2.0", "dependencies": { "@preact/signals-core": "1.8.0", @@ -25298,7 +25298,7 @@ }, "packages/analytics-js-common": { "name": "@rudderstack/analytics-js-common", - "version": "3.9.5", + "version": "3.10.0", "license": "Elastic-2.0", "dependencies": { "@lukeed/uuid": "2.0.1", @@ -25315,7 +25315,7 @@ }, "packages/analytics-js-cookies": { "name": "@rudderstack/analytics-js-cookies", - "version": "0.3.11", + "version": "0.3.12", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js-common": "*" @@ -25324,7 +25324,7 @@ }, "packages/analytics-js-integrations": { "name": "@rudderstack/analytics-js-integrations", - "version": "3.9.2", + "version": "3.9.3", "license": "Elastic-2.0", "dependencies": { "@lukeed/uuid": "2.0.1", @@ -25344,7 +25344,7 @@ }, "packages/analytics-js-plugins": { "name": "@rudderstack/analytics-js-plugins", - "version": "3.4.19", + "version": "3.5.0", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js-common": "*", @@ -25358,7 +25358,7 @@ }, "packages/analytics-js-service-worker": { "name": "@rudderstack/analytics-js-service-worker", - "version": "3.1.14", + "version": "3.1.15", "license": "Elastic-2.0", "dependencies": { "@lukeed/uuid": "2.0.1", @@ -25379,7 +25379,7 @@ }, "packages/analytics-v1.1": { "name": "rudder-sdk-js", - "version": "2.48.21", + "version": "2.48.22", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js-common": "*" @@ -25388,7 +25388,7 @@ }, "packages/loading-scripts": { "name": "@rudderstack/analytics-js-loading-scripts", - "version": "3.0.36", + "version": "3.0.37", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js": "*" @@ -25397,7 +25397,7 @@ }, "packages/sanity-suite": { "name": "@rudderstack/analytics-js-sanity-suite", - "version": "3.1.27", + "version": "3.1.28", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js": "*", diff --git a/package.json b/package.json index bd2af1ad8..c03df93ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-monorepo", - "version": "3.44.0", + "version": "3.45.0", "private": true, "description": "Monorepo for RudderStack Analytics JS SDK", "workspaces": [ diff --git a/packages/analytics-js-common/CHANGELOG_LATEST.md b/packages/analytics-js-common/CHANGELOG_LATEST.md index 68bbe2120..6c8c6a22a 100644 --- a/packages/analytics-js-common/CHANGELOG_LATEST.md +++ b/packages/analytics-js-common/CHANGELOG_LATEST.md @@ -1,7 +1,7 @@ -## [3.9.5](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.9.4...@rudderstack/analytics-js-common@3.9.5) (2024-10-18) +## [3.10.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.9.5...@rudderstack/analytics-js-common@3.10.0) (2024-10-21) -### Bug Fixes +### Features -* add xpixel missing name mapping ([#1895](https://github.com/rudderlabs/rudder-sdk-js/issues/1895)) ([0800f36](https://github.com/rudderlabs/rudder-sdk-js/commit/0800f361b6a9b9866ba47d9a393cf7c2063b3815)) +* iubenda consent manager plugin ([#1809](https://github.com/rudderlabs/rudder-sdk-js/issues/1809)) ([7ea300c](https://github.com/rudderlabs/rudder-sdk-js/commit/7ea300c61ead9cc094c3f1985e0ef3165b0fcb59)) diff --git a/packages/analytics-js-common/project.json b/packages/analytics-js-common/project.json index a23d88b9a..3cc4b5a15 100644 --- a/packages/analytics-js-common/project.json +++ b/packages/analytics-js-common/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-common@3.9.5", - "title": "@rudderstack/analytics-js-common@3.9.5", - "discussion-category": "@rudderstack/analytics-js-common@3.9.5", + "tag": "@rudderstack/analytics-js-common@3.10.0", + "title": "@rudderstack/analytics-js-common@3.10.0", + "discussion-category": "@rudderstack/analytics-js-common@3.10.0", "notesFile": "./packages/analytics-js-common/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-cookies/CHANGELOG_LATEST.md b/packages/analytics-js-cookies/CHANGELOG_LATEST.md index ba9535bc3..d5b488ee7 100644 --- a/packages/analytics-js-cookies/CHANGELOG_LATEST.md +++ b/packages/analytics-js-cookies/CHANGELOG_LATEST.md @@ -1,5 +1,5 @@ -## [0.3.11](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.3.10...@rudderstack/analytics-js-cookies@0.3.11) (2024-10-18) +## [0.3.12](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.3.11...@rudderstack/analytics-js-cookies@0.3.12) (2024-10-21) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.9.5` +* `@rudderstack/analytics-js-common` updated to version `3.10.0` diff --git a/packages/analytics-js-cookies/project.json b/packages/analytics-js-cookies/project.json index 2fd7d0afe..5460a35fd 100644 --- a/packages/analytics-js-cookies/project.json +++ b/packages/analytics-js-cookies/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-cookies@0.3.11", - "title": "@rudderstack/analytics-js-cookies@0.3.11", - "discussion-category": "@rudderstack/analytics-js-cookies@0.3.11", + "tag": "@rudderstack/analytics-js-cookies@0.3.12", + "title": "@rudderstack/analytics-js-cookies@0.3.12", + "discussion-category": "@rudderstack/analytics-js-cookies@0.3.12", "notesFile": "./packages/analytics-js-cookies/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-integrations/CHANGELOG_LATEST.md b/packages/analytics-js-integrations/CHANGELOG_LATEST.md index e1ec2235d..12d00f789 100644 --- a/packages/analytics-js-integrations/CHANGELOG_LATEST.md +++ b/packages/analytics-js-integrations/CHANGELOG_LATEST.md @@ -1,5 +1,5 @@ -## [3.9.2](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.9.1...@rudderstack/analytics-js-integrations@3.9.2) (2024-10-18) +## [3.9.3](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.9.2...@rudderstack/analytics-js-integrations@3.9.3) (2024-10-21) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.9.5` +* `@rudderstack/analytics-js-common` updated to version `3.10.0` diff --git a/packages/analytics-js-integrations/project.json b/packages/analytics-js-integrations/project.json index d29b1e657..e7f2d11fe 100644 --- a/packages/analytics-js-integrations/project.json +++ b/packages/analytics-js-integrations/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-integrations@3.9.2", - "title": "@rudderstack/analytics-js-integrations@3.9.2", - "discussion-category": "@rudderstack/analytics-js-integrations@3.9.2", + "tag": "@rudderstack/analytics-js-integrations@3.9.3", + "title": "@rudderstack/analytics-js-integrations@3.9.3", + "discussion-category": "@rudderstack/analytics-js-integrations@3.9.3", "notesFile": "./packages/analytics-js-integrations/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-plugins/CHANGELOG_LATEST.md b/packages/analytics-js-plugins/CHANGELOG_LATEST.md index fe4c44fcf..4be331a4a 100644 --- a/packages/analytics-js-plugins/CHANGELOG_LATEST.md +++ b/packages/analytics-js-plugins/CHANGELOG_LATEST.md @@ -1,6 +1,12 @@ -## [3.4.19](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.4.18...@rudderstack/analytics-js-plugins@3.4.19) (2024-10-18) +## [3.5.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.4.19...@rudderstack/analytics-js-plugins@3.5.0) (2024-10-21) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.9.5` -* `@rudderstack/analytics-js` updated to version `3.7.18` +* `@rudderstack/analytics-js-common` updated to version `3.10.0` +* `@rudderstack/analytics-js` updated to version `3.7.19` +* `@rudderstack/analytics-js-cookies` updated to version `0.3.11` + +### Features + +* iubenda consent manager plugin ([#1809](https://github.com/rudderlabs/rudder-sdk-js/issues/1809)) ([7ea300c](https://github.com/rudderlabs/rudder-sdk-js/commit/7ea300c61ead9cc094c3f1985e0ef3165b0fcb59)) + diff --git a/packages/analytics-js-plugins/project.json b/packages/analytics-js-plugins/project.json index 26642a06b..aac0fef22 100644 --- a/packages/analytics-js-plugins/project.json +++ b/packages/analytics-js-plugins/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-plugins@3.4.19", - "title": "@rudderstack/analytics-js-plugins@3.4.19", - "discussion-category": "@rudderstack/analytics-js-plugins@3.4.19", + "tag": "@rudderstack/analytics-js-plugins@3.5.0", + "title": "@rudderstack/analytics-js-plugins@3.5.0", + "discussion-category": "@rudderstack/analytics-js-plugins@3.5.0", "notesFile": "./packages/analytics-js-plugins/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-service-worker/CHANGELOG_LATEST.md b/packages/analytics-js-service-worker/CHANGELOG_LATEST.md index 0a5cd10c5..2a638e9d1 100644 --- a/packages/analytics-js-service-worker/CHANGELOG_LATEST.md +++ b/packages/analytics-js-service-worker/CHANGELOG_LATEST.md @@ -1,5 +1,5 @@ -## [3.1.14](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.1.13...@rudderstack/analytics-js-service-worker@3.1.14) (2024-10-18) +## [3.1.15](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.1.14...@rudderstack/analytics-js-service-worker@3.1.15) (2024-10-21) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.9.5` +* `@rudderstack/analytics-js-common` updated to version `3.10.0` diff --git a/packages/analytics-js-service-worker/project.json b/packages/analytics-js-service-worker/project.json index 315569d77..20e228552 100644 --- a/packages/analytics-js-service-worker/project.json +++ b/packages/analytics-js-service-worker/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-service-worker@3.1.14", - "title": "rudderstack/analytics-js-service-worker@3.1.14", - "discussion-category": "rudderstack/analytics-js-service-worker@3.1.14", + "tag": "@rudderstack/analytics-js-service-worker@3.1.15", + "title": "rudderstack/analytics-js-service-worker@3.1.15", + "discussion-category": "rudderstack/analytics-js-service-worker@3.1.15", "notesFile": "./packages/analytics-js-service-worker/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js/CHANGELOG_LATEST.md b/packages/analytics-js/CHANGELOG_LATEST.md index 04eedbfc6..d75cdbdbe 100644 --- a/packages/analytics-js/CHANGELOG_LATEST.md +++ b/packages/analytics-js/CHANGELOG_LATEST.md @@ -1,12 +1,12 @@ -## [3.7.19](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.7.18...@rudderstack/analytics-js@3.7.19) (2024-10-18) +## [3.8.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.7.19...@rudderstack/analytics-js@3.8.0) (2024-10-21) ### Dependency Updates -* `@rudderstack/analytics-js-cookies` updated to version `0.3.11` -* `@rudderstack/analytics-js-common` updated to version `3.9.5` -* `@rudderstack/analytics-js-plugins` updated to version `3.4.19` +* `@rudderstack/analytics-js-cookies` updated to version `0.3.12` +* `@rudderstack/analytics-js-common` updated to version `3.10.0` +* `@rudderstack/analytics-js-plugins` updated to version `3.5.0` -### Bug Fixes +### Features -* harmless change in the core sdk package ([5c34b04](https://github.com/rudderlabs/rudder-sdk-js/commit/5c34b0453041a0dc1b8a7dc55eb0c884d16d0598)) +* iubenda consent manager plugin ([#1809](https://github.com/rudderlabs/rudder-sdk-js/issues/1809)) ([7ea300c](https://github.com/rudderlabs/rudder-sdk-js/commit/7ea300c61ead9cc094c3f1985e0ef3165b0fcb59)) diff --git a/packages/analytics-js/project.json b/packages/analytics-js/project.json index 8e5753e6c..bb41e255e 100644 --- a/packages/analytics-js/project.json +++ b/packages/analytics-js/project.json @@ -59,9 +59,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js@3.7.19", - "title": "@rudderstack/analytics-js@3.7.19", - "discussion-category": "@rudderstack/analytics-js@3.7.19", + "tag": "@rudderstack/analytics-js@3.8.0", + "title": "@rudderstack/analytics-js@3.8.0", + "discussion-category": "@rudderstack/analytics-js@3.8.0", "notesFile": "./packages/analytics-js/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-v1.1/CHANGELOG_LATEST.md b/packages/analytics-v1.1/CHANGELOG_LATEST.md index e66e2a1e1..5f5e7e82d 100644 --- a/packages/analytics-v1.1/CHANGELOG_LATEST.md +++ b/packages/analytics-v1.1/CHANGELOG_LATEST.md @@ -1,5 +1,5 @@ -## [2.48.21](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.48.20...rudder-sdk-js@2.48.21) (2024-10-18) +## [2.48.22](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.48.21...rudder-sdk-js@2.48.22) (2024-10-21) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.9.5` +* `@rudderstack/analytics-js-common` updated to version `3.10.0` diff --git a/packages/analytics-v1.1/project.json b/packages/analytics-v1.1/project.json index 383e33caa..2415b8318 100644 --- a/packages/analytics-v1.1/project.json +++ b/packages/analytics-v1.1/project.json @@ -59,9 +59,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "rudder-sdk-js@2.48.21", - "title": "rudder-sdk-js@2.48.21", - "discussion-category": "rudder-sdk-js@2.48.21", + "tag": "rudder-sdk-js@2.48.22", + "title": "rudder-sdk-js@2.48.22", + "discussion-category": "rudder-sdk-js@2.48.22", "notesFile": "./packages/analytics-v1.1/CHANGELOG_LATEST.md" } } diff --git a/packages/loading-scripts/CHANGELOG_LATEST.md b/packages/loading-scripts/CHANGELOG_LATEST.md index 46b169d73..6360845aa 100644 --- a/packages/loading-scripts/CHANGELOG_LATEST.md +++ b/packages/loading-scripts/CHANGELOG_LATEST.md @@ -1,5 +1,5 @@ -## [3.0.36](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-loading-scripts@3.0.35...@rudderstack/analytics-js-loading-scripts@3.0.36) (2024-10-18) +## [3.0.37](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-loading-scripts@3.0.36...@rudderstack/analytics-js-loading-scripts@3.0.37) (2024-10-21) ### Dependency Updates -* `@rudderstack/analytics-js` updated to version `3.7.19` +* `@rudderstack/analytics-js` updated to version `3.8.0` diff --git a/packages/loading-scripts/project.json b/packages/loading-scripts/project.json index 4f3fbed72..22bc5c846 100644 --- a/packages/loading-scripts/project.json +++ b/packages/loading-scripts/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-loading-scripts@3.0.36", - "title": "@rudderstack/analytics-js-loading-scripts@3.0.36", - "discussion-category": "@rudderstack/analytics-js-loading-scripts@3.0.36", + "tag": "@rudderstack/analytics-js-loading-scripts@3.0.37", + "title": "@rudderstack/analytics-js-loading-scripts@3.0.37", + "discussion-category": "@rudderstack/analytics-js-loading-scripts@3.0.37", "notesFile": "./packages/loading-scripts/CHANGELOG_LATEST.md" } } diff --git a/sonar-project.properties b/sonar-project.properties index c130572de..06214db98 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,7 +6,7 @@ sonar.qualitygate.wait=false sonar.projectKey=rudderlabs_rudder-sdk-js sonar.organization=rudderlabs sonar.projectName=rudder-sdk-js -sonar.projectVersion=3.44.0 +sonar.projectVersion=3.45.0 # Meta-data for the project sonar.links.scm=https://github.com/rudderlabs/rudder-sdk-js From df7faf723af3d23a646c2ce7214816d4c6ace48e Mon Sep 17 00:00:00 2001 From: MoumitaM Date: Mon, 21 Oct 2024 13:19:06 +0530 Subject: [PATCH 14/14] chore: eslint issues and size limit fixed --- .../src/iubendaConsentManager/utils.ts | 58 ++++++++++--------- packages/analytics-js/.size-limit.mjs | 6 +- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts b/packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts index 31c217e0f..ea1d196bc 100644 --- a/packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts +++ b/packages/analytics-js-plugins/src/iubendaConsentManager/utils.ts @@ -4,10 +4,37 @@ import type { ILogger } from '@rudderstack/analytics-js-common/types/Logger'; import type { ApplicationState } from '@rudderstack/analytics-js-common/types/ApplicationState'; import type { ConsentsInfo } from '@rudderstack/analytics-js-common/types/Consent'; import { isDefined } from '@rudderstack/analytics-js-common/utilities/checks'; -import { checks, storages, string } from '../shared-chunks/common'; -import { IUBENDA_CONSENT_COOKIE_READ_ERROR, IUBENDA_CONSENT_COOKIE_PARSE_ERROR } from './logMessages'; +import { checks, storages } from '../shared-chunks/common'; +import { + IUBENDA_CONSENT_COOKIE_READ_ERROR, + IUBENDA_CONSENT_COOKIE_PARSE_ERROR, +} from './logMessages'; import { IUBENDA_CONSENT_MANAGER_PLUGIN, IUBENDA_CONSENT_COOKIE_NAME_PATTERN } from './constants'; -import type { IubendaConsentData, IubendaConsentCookieData} from './types' +import type { IubendaConsentData, IubendaConsentCookieData } from './types'; + +const getIubendaCookieName = (logger?: ILogger): string => { + try { + // Retrieve cookies as a string and split them into an array + const cookies = document.cookie.split('; '); + + // Find the cookie that matches the iubenda cookie pattern + const matchedCookie = cookies.find(cookie => { + const [name] = cookie.split('='); + return IUBENDA_CONSENT_COOKIE_NAME_PATTERN.test((name || '').trim()); + }); + + if (!matchedCookie) { + throw new Error('Iubenda Cookie not found with the specified pattern.'); + } + + // Extract and return the cookie name + const [name] = matchedCookie.split('='); + return name || ''; + } catch (err) { + logger?.error(IUBENDA_CONSENT_COOKIE_READ_ERROR(IUBENDA_CONSENT_MANAGER_PLUGIN), err); + return ''; + } +}; /** * Gets the consent data from the Iubenda's consent cookie @@ -21,14 +48,12 @@ const getIubendaConsentData = ( ): IubendaConsentData | undefined => { let rawConsentCookieData = null; try { - const dataStore = storeManager?.setStore({ id: IUBENDA_CONSENT_MANAGER_PLUGIN, name: IUBENDA_CONSENT_MANAGER_PLUGIN, type: storages.COOKIE_STORAGE, }); rawConsentCookieData = dataStore?.engine.getItem(getIubendaCookieName(logger)); - } catch (err) { logger?.error(IUBENDA_CONSENT_COOKIE_READ_ERROR(IUBENDA_CONSENT_MANAGER_PLUGIN), err); return undefined; @@ -87,28 +112,5 @@ const updateConsentStateFromData = ( state.consents.initialized.value = isDefined(iubendaConsentData); state.consents.data.value = consentData; }; -const getIubendaCookieName = ( logger?: ILogger ): string => { - try { - // Retrieve cookies as a string and split them into an array - const cookies = document.cookie.split('; '); - - // Find the cookie that matches the iubenda cookie pattern - const matchedCookie = cookies.find(cookie => { - const [name] = cookie.split('='); - return IUBENDA_CONSENT_COOKIE_NAME_PATTERN.test((name || "").trim()); - }); - - if (!matchedCookie) { - throw new Error('Iubenda Cookie not found with the specified pattern.'); - } - - // Extract and return the cookie name - const [name] = matchedCookie.split('='); - return name || ""; - } catch (err) { - logger?.error(IUBENDA_CONSENT_COOKIE_READ_ERROR(IUBENDA_CONSENT_MANAGER_PLUGIN), err); - return ""; - } -}; export { getIubendaConsentData, getConsentData, updateConsentStateFromData, getIubendaCookieName }; diff --git a/packages/analytics-js/.size-limit.mjs b/packages/analytics-js/.size-limit.mjs index ba6cc0d03..128ee2b6c 100644 --- a/packages/analytics-js/.size-limit.mjs +++ b/packages/analytics-js/.size-limit.mjs @@ -59,7 +59,7 @@ export default [ name: 'Core (Bundled) - Legacy - NPM (CJS)', path: 'dist/npm/legacy/bundled/cjs/index.cjs', import: '*', - limit: '48 KiB', + limit: '48.5 KiB', }, { name: 'Core (Bundled) - Legacy - NPM (UMD)', @@ -83,7 +83,7 @@ export default [ name: 'Core (Bundled) - Modern - NPM (UMD)', path: 'dist/npm/modern/bundled/umd/index.js', import: '*', - limit: '39 KiB', + limit: '39.5 KiB', }, { name: 'Core (Content Script) - Legacy - NPM (ESM)', @@ -95,7 +95,7 @@ export default [ name: 'Core (Content Script) - Legacy - NPM (CJS)', path: 'dist/npm/legacy/content-script/cjs/index.cjs', import: '*', - limit: '47.5 KiB', + limit: '48 KiB', }, { name: 'Core (Content Script) - Legacy - NPM (UMD)',