From fb7f3f02837e9aaee0a316f221b48f23c3926bd9 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Thu, 24 Feb 2022 18:40:51 -0300 Subject: [PATCH 1/5] validate config.userConsent --- src/logger/constants.ts | 2 +- src/logger/messages/error.ts | 2 +- src/sdkFactory/userConsentProps.ts | 2 +- src/utils/settingsValidation/impressionsMode.ts | 15 +++++++-------- src/utils/settingsValidation/index.ts | 6 +++++- src/utils/settingsValidation/types.ts | 2 ++ src/utils/settingsValidation/userConsent.ts | 14 ++++++++++++++ 7 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 src/utils/settingsValidation/userConsent.ts diff --git a/src/logger/constants.ts b/src/logger/constants.ts index 92428e5b..36002715 100644 --- a/src/logger/constants.ts +++ b/src/logger/constants.ts @@ -116,7 +116,7 @@ export const ERROR_INVALID_KEY_OBJECT = 317; export const ERROR_INVALID = 318; export const ERROR_EMPTY = 319; export const ERROR_EMPTY_ARRAY = 320; -export const ERROR_INVALID_IMPRESSIONS_MODE = 321; +export const ERROR_INVALID_CONFIG_PARAM = 321; export const ERROR_HTTP = 322; export const ERROR_LOCALHOST_MODULE_REQUIRED = 323; export const ERROR_STORAGE_INVALID = 324; diff --git a/src/logger/messages/error.ts b/src/logger/messages/error.ts index caa2936d..db97a25a 100644 --- a/src/logger/messages/error.ts +++ b/src/logger/messages/error.ts @@ -30,7 +30,7 @@ export const codesError: [number, string][] = [ [c.ERROR_EMPTY_ARRAY, '%s: %s must be a non-empty array.'], [c.ERROR_NOT_BOOLEAN, '%s: you must provide a boolean param.'], // initialization / settings validation - [c.ERROR_INVALID_IMPRESSIONS_MODE, c.LOG_PREFIX_SETTINGS + ': you passed an invalid "impressionsMode". It should be one of the following values: %s. Defaulting to "%s" mode.'], + [c.ERROR_INVALID_CONFIG_PARAM, c.LOG_PREFIX_SETTINGS + ': you passed an invalid "%s" config param. It must be one of the following values: %s. Defaulting to "%s".'], [c.ERROR_LOCALHOST_MODULE_REQUIRED, c.LOG_PREFIX_SETTINGS + ': an invalid value was received for "sync.localhostMode" config. A valid entity should be provided for localhost mode.'], [c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS+': The provided storage is invalid.%s Fallbacking into default MEMORY storage'], ]; diff --git a/src/sdkFactory/userConsentProps.ts b/src/sdkFactory/userConsentProps.ts index b9498360..027cef57 100644 --- a/src/sdkFactory/userConsentProps.ts +++ b/src/sdkFactory/userConsentProps.ts @@ -23,7 +23,7 @@ export function userConsentProps(settings: ISettings, syncManager?: ISyncManager if (consent) syncManager?.submitter?.start(); else syncManager?.submitter?.stop(); - log.info(USER_CONSENT_UPDATED, [settings.userConsent, newConsentStatus]); + log.info(USER_CONSENT_UPDATED, [settings.userConsent, newConsentStatus]); // @ts-ignore, modify readonly prop settings.userConsent = newConsentStatus; } diff --git a/src/utils/settingsValidation/impressionsMode.ts b/src/utils/settingsValidation/impressionsMode.ts index ddcda23d..891f92b9 100644 --- a/src/utils/settingsValidation/impressionsMode.ts +++ b/src/utils/settingsValidation/impressionsMode.ts @@ -1,14 +1,13 @@ -import { ERROR_INVALID_IMPRESSIONS_MODE } from '../../logger/constants'; +import { ERROR_INVALID_CONFIG_PARAM } from '../../logger/constants'; import { ILogger } from '../../logger/types'; import { SplitIO } from '../../types'; import { DEBUG, OPTIMIZED } from '../constants'; -export function validImpressionsMode(log: ILogger, impressionsMode: string): SplitIO.ImpressionsMode { - impressionsMode = impressionsMode.toUpperCase(); - if ([DEBUG, OPTIMIZED].indexOf(impressionsMode) === -1) { - log.error(ERROR_INVALID_IMPRESSIONS_MODE, [[DEBUG, OPTIMIZED], OPTIMIZED]); - impressionsMode = OPTIMIZED; - } +export function validImpressionsMode(log: ILogger, impressionsMode: any): SplitIO.ImpressionsMode { + if (typeof impressionsMode === 'string') impressionsMode = impressionsMode.toUpperCase(); - return impressionsMode as SplitIO.ImpressionsMode; + if ([DEBUG, OPTIMIZED].indexOf(impressionsMode) > -1) return impressionsMode; + + log.error(ERROR_INVALID_CONFIG_PARAM, ['impressionsMode', [DEBUG, OPTIMIZED], OPTIMIZED]); + return OPTIMIZED; } diff --git a/src/utils/settingsValidation/index.ts b/src/utils/settingsValidation/index.ts index 20bcd1bc..75c0872e 100644 --- a/src/utils/settingsValidation/index.ts +++ b/src/utils/settingsValidation/index.ts @@ -97,7 +97,7 @@ function fromSecondsToMillis(n: number) { */ export function settingsValidation(config: unknown, validationParams: ISettingsValidationParams) { - const { defaults, runtime, storage, integrations, logger, localhost } = validationParams; + const { defaults, runtime, storage, integrations, logger, localhost, userConsent } = validationParams; // creates a settings object merging base, defaults and config objects. const withDefaults = merge({}, base, defaults, config) as ISettings; @@ -161,5 +161,9 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV // ensure a valid impressionsMode withDefaults.sync.impressionsMode = validImpressionsMode(log, withDefaults.sync.impressionsMode); + // ensure a valid user consent value + // @ts-ignore, modify readonly prop + withDefaults.userConsent = userConsent(withDefaults); + return withDefaults; } diff --git a/src/utils/settingsValidation/types.ts b/src/utils/settingsValidation/types.ts index b305d440..e8f954b5 100644 --- a/src/utils/settingsValidation/types.ts +++ b/src/utils/settingsValidation/types.ts @@ -20,4 +20,6 @@ export interface ISettingsValidationParams { logger: (settings: ISettings) => ISettings['log'], /** Localhost mode validator (`settings.sync.localhostMode`) */ localhost?: (settings: ISettings) => ISettings['sync']['localhostMode'], + /** User consent validator (`settings.userConsent`) */ + userConsent: (settings: ISettings) => ISettings['userConsent'], } diff --git a/src/utils/settingsValidation/userConsent.ts b/src/utils/settingsValidation/userConsent.ts new file mode 100644 index 00000000..7f16b351 --- /dev/null +++ b/src/utils/settingsValidation/userConsent.ts @@ -0,0 +1,14 @@ +import { ERROR_INVALID_CONFIG_PARAM } from '../../logger/constants'; +import { ILogger } from '../../logger/types'; +import { CONSENT_DECLINED, CONSENT_GRANTED, CONSENT_UNKNOWN } from '../constants'; + +const userConsentValues = [CONSENT_DECLINED, CONSENT_GRANTED, CONSENT_UNKNOWN]; + +export function validateUserConsent({ userConsent, log }: { userConsent: any, log: ILogger }) { + if (typeof userConsent === 'string') userConsent = userConsent.toUpperCase(); + + if (userConsentValues.indexOf(userConsent) > -1) return userConsent; + + log.error(ERROR_INVALID_CONFIG_PARAM, ['userConsent', userConsentValues, CONSENT_GRANTED]); + return CONSENT_GRANTED; +} From 9e71ee2af4da837cb41f28ff4ee385d038bbb182 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Thu, 24 Feb 2022 19:10:52 -0300 Subject: [PATCH 2/5] fixed test --- src/utils/settingsValidation/__tests__/index.spec.ts | 3 ++- src/utils/settingsValidation/{userConsent.ts => consent.ts} | 2 +- src/utils/settingsValidation/index.ts | 4 ++-- src/utils/settingsValidation/types.ts | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) rename src/utils/settingsValidation/{userConsent.ts => consent.ts} (85%) diff --git a/src/utils/settingsValidation/__tests__/index.spec.ts b/src/utils/settingsValidation/__tests__/index.spec.ts index be0087b5..50b960a9 100644 --- a/src/utils/settingsValidation/__tests__/index.spec.ts +++ b/src/utils/settingsValidation/__tests__/index.spec.ts @@ -19,7 +19,8 @@ const minimalSettingsParams = { version: 'javascript-test', }, runtime: () => ({ ip: false, hostname: false } as ISettings['runtime']), - logger: () => (loggerMock as ISettings['log']) + logger: () => (loggerMock as ISettings['log']), + consent: () => undefined }; describe('settingsValidation', () => { diff --git a/src/utils/settingsValidation/userConsent.ts b/src/utils/settingsValidation/consent.ts similarity index 85% rename from src/utils/settingsValidation/userConsent.ts rename to src/utils/settingsValidation/consent.ts index 7f16b351..1cf9233b 100644 --- a/src/utils/settingsValidation/userConsent.ts +++ b/src/utils/settingsValidation/consent.ts @@ -4,7 +4,7 @@ import { CONSENT_DECLINED, CONSENT_GRANTED, CONSENT_UNKNOWN } from '../constants const userConsentValues = [CONSENT_DECLINED, CONSENT_GRANTED, CONSENT_UNKNOWN]; -export function validateUserConsent({ userConsent, log }: { userConsent: any, log: ILogger }) { +export function validateConsent({ userConsent, log }: { userConsent: any, log: ILogger }) { if (typeof userConsent === 'string') userConsent = userConsent.toUpperCase(); if (userConsentValues.indexOf(userConsent) > -1) return userConsent; diff --git a/src/utils/settingsValidation/index.ts b/src/utils/settingsValidation/index.ts index 75c0872e..d7a31c10 100644 --- a/src/utils/settingsValidation/index.ts +++ b/src/utils/settingsValidation/index.ts @@ -97,7 +97,7 @@ function fromSecondsToMillis(n: number) { */ export function settingsValidation(config: unknown, validationParams: ISettingsValidationParams) { - const { defaults, runtime, storage, integrations, logger, localhost, userConsent } = validationParams; + const { defaults, runtime, storage, integrations, logger, localhost, consent } = validationParams; // creates a settings object merging base, defaults and config objects. const withDefaults = merge({}, base, defaults, config) as ISettings; @@ -163,7 +163,7 @@ export function settingsValidation(config: unknown, validationParams: ISettingsV // ensure a valid user consent value // @ts-ignore, modify readonly prop - withDefaults.userConsent = userConsent(withDefaults); + withDefaults.userConsent = consent(withDefaults); return withDefaults; } diff --git a/src/utils/settingsValidation/types.ts b/src/utils/settingsValidation/types.ts index e8f954b5..40cd155c 100644 --- a/src/utils/settingsValidation/types.ts +++ b/src/utils/settingsValidation/types.ts @@ -21,5 +21,5 @@ export interface ISettingsValidationParams { /** Localhost mode validator (`settings.sync.localhostMode`) */ localhost?: (settings: ISettings) => ISettings['sync']['localhostMode'], /** User consent validator (`settings.userConsent`) */ - userConsent: (settings: ISettings) => ISettings['userConsent'], + consent: (settings: ISettings) => ISettings['userConsent'], } From a16b6032517792aeb88fb057c18e8a246fcf96f2 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Wed, 2 Mar 2022 13:26:59 -0300 Subject: [PATCH 3/5] prepare rc --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c8abb07d..ea2edb24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@splitsoftware/splitio-commons", - "version": "1.2.1-rc.3", + "version": "1.2.1-rc.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2bed38b7..719eb3f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@splitsoftware/splitio-commons", - "version": "1.2.1-rc.3", + "version": "1.2.1-rc.5", "description": "Split Javascript SDK common components", "main": "cjs/index.js", "module": "esm/index.js", From a4bf0faf04d1d2645eed9193d53723dc375ea94f Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Thu, 3 Mar 2022 12:14:44 -0300 Subject: [PATCH 4/5] update validatePrefix function, for consistency with JS SDK --- src/storages/KeyBuilder.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/storages/KeyBuilder.ts b/src/storages/KeyBuilder.ts index 080ed3d9..3c54d403 100644 --- a/src/storages/KeyBuilder.ts +++ b/src/storages/KeyBuilder.ts @@ -1,15 +1,11 @@ -import { endsWith, startsWith } from '../utils/lang'; +import { startsWith } from '../utils/lang'; const everythingAtTheEnd = /[^.]+$/; const DEFAULT_PREFIX = 'SPLITIO'; export function validatePrefix(prefix: unknown) { - return prefix && typeof prefix === 'string' ? - endsWith(prefix, '.' + DEFAULT_PREFIX) ? - prefix : // suffix already appended - prefix + '.' + DEFAULT_PREFIX : // append suffix - DEFAULT_PREFIX; // use default prefix if none is provided + return prefix ? prefix + '.SPLITIO' : 'SPLITIO'; } export class KeyBuilder { From 0e36a90df20e0d3afde09f6b35f8d6913a8bf43c Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Thu, 3 Mar 2022 16:55:38 -0300 Subject: [PATCH 5/5] feedback and polishing --- src/logger/constants.ts | 1 + src/logger/messages/debug.ts | 6 +++--- src/logger/messages/error.ts | 4 ++-- src/logger/messages/info.ts | 7 ++++--- src/sdkFactory/userConsentProps.ts | 21 +++++++++++-------- src/utils/lang/index.ts | 9 +++++++- src/utils/settingsValidation/consent.ts | 3 ++- .../settingsValidation/impressionsMode.ts | 3 ++- 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/logger/constants.ts b/src/logger/constants.ts index 36002715..68259646 100644 --- a/src/logger/constants.ts +++ b/src/logger/constants.ts @@ -69,6 +69,7 @@ export const SYNC_STOP_POLLING = 119; export const EVENTS_TRACKER_SUCCESS = 120; export const IMPRESSIONS_TRACKER_SUCCESS = 121; export const USER_CONSENT_UPDATED = 122; +export const USER_CONSENT_NOT_UPDATED = 123; export const ENGINE_VALUE_INVALID = 200; export const ENGINE_VALUE_NO_ATTRIBUTES = 201; diff --git a/src/logger/messages/debug.ts b/src/logger/messages/debug.ts index ed8281ed..c57ea6e0 100644 --- a/src/logger/messages/debug.ts +++ b/src/logger/messages/debug.ts @@ -31,9 +31,9 @@ export const codesDebug: [number, string][] = codesInfo.concat([ // SDK [c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'], [c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'], - [c.RETRIEVE_CLIENT_DEFAULT, ' Retrieving default SDK client.'], - [c.RETRIEVE_CLIENT_EXISTING, ' Retrieving existing SDK client.'], - [c.RETRIEVE_MANAGER, ' Retrieving manager instance.'], + [c.RETRIEVE_CLIENT_DEFAULT, 'Retrieving default SDK client.'], + [c.RETRIEVE_CLIENT_EXISTING, 'Retrieving existing SDK client.'], + [c.RETRIEVE_MANAGER, 'Retrieving manager instance.'], // synchronizer [c.SYNC_OFFLINE_DATA, c.LOG_PREFIX_SYNC_OFFLINE + 'Splits data: \n%s'], [c.SYNC_SPLITS_FETCH, c.LOG_PREFIX_SYNC_SPLITS + 'Spin up split update using since = %s'], diff --git a/src/logger/messages/error.ts b/src/logger/messages/error.ts index 555bd1d6..8ef9065b 100644 --- a/src/logger/messages/error.ts +++ b/src/logger/messages/error.ts @@ -5,7 +5,7 @@ export const codesError: [number, string][] = [ [c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid Split, no valid rules found'], // SDK [c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'], - [c.ERROR_CLIENT_CANNOT_GET_READY, ' The SDK will not get ready. Reason: %s'], + [c.ERROR_CLIENT_CANNOT_GET_READY, 'The SDK will not get ready. Reason: %s'], [c.ERROR_IMPRESSIONS_TRACKER, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Could not store impressions bulk with %s impression(s). Error: %s'], [c.ERROR_IMPRESSIONS_LISTENER, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Impression listener logImpression method threw: %s.'], [c.ERROR_EVENTS_TRACKER, c.LOG_PREFIX_EVENTS_TRACKER + 'Failed to queue %s'], @@ -28,7 +28,7 @@ export const codesError: [number, string][] = [ [c.ERROR_INVALID, '%s: you passed an invalid %s. It must be a non-empty string.'], [c.ERROR_EMPTY, '%s: you passed an empty %s. It must be a non-empty string.'], [c.ERROR_EMPTY_ARRAY, '%s: %s must be a non-empty array.'], - [c.ERROR_NOT_BOOLEAN, '%s: you must provide a boolean param.'], + [c.ERROR_NOT_BOOLEAN, '%s: provided param must be a boolean value.'], // initialization / settings validation [c.ERROR_INVALID_CONFIG_PARAM, c.LOG_PREFIX_SETTINGS + ': you passed an invalid "%s" config param. It should be one of the following values: %s. Defaulting to "%s".'], [c.ERROR_LOCALHOST_MODULE_REQUIRED, c.LOG_PREFIX_SETTINGS + ': an invalid value was received for "sync.localhostMode" config. A valid entity should be provided for localhost mode.'], diff --git a/src/logger/messages/info.ts b/src/logger/messages/info.ts index 4facaf24..9f4a4254 100644 --- a/src/logger/messages/info.ts +++ b/src/logger/messages/info.ts @@ -10,11 +10,12 @@ export const codesInfo: [number, string][] = codesWarn.concat([ // SDK [c.IMPRESSION, c.LOG_PREFIX_IMPRESSIONS_TRACKER +'Split: %s. Key: %s. Evaluation: %s. Label: %s'], [c.IMPRESSION_QUEUEING, c.LOG_PREFIX_IMPRESSIONS_TRACKER +'Queueing corresponding impression.'], - [c.NEW_SHARED_CLIENT, ' New shared client instance created.'], - [c.NEW_FACTORY, ' New Split SDK instance created.'], + [c.NEW_SHARED_CLIENT, 'New shared client instance created.'], + [c.NEW_FACTORY, 'New Split SDK instance created.'], [c.EVENTS_TRACKER_SUCCESS, c.LOG_PREFIX_EVENTS_TRACKER + 'Successfully queued %s'], [c.IMPRESSIONS_TRACKER_SUCCESS, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Successfully stored %s impression(s).'], - [c.USER_CONSENT_UPDATED, 'User consent changed from %s to %s.'], + [c.USER_CONSENT_UPDATED, 'setUserConsent: consent status changed from %s to %s.'], + [c.USER_CONSENT_NOT_UPDATED, 'setUserConsent: call had no effect because it was the current consent status (%s).'], // synchronizer [c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'], diff --git a/src/sdkFactory/userConsentProps.ts b/src/sdkFactory/userConsentProps.ts index 027cef57..da715c33 100644 --- a/src/sdkFactory/userConsentProps.ts +++ b/src/sdkFactory/userConsentProps.ts @@ -1,7 +1,8 @@ -import { ERROR_NOT_BOOLEAN, USER_CONSENT_UPDATED } from '../logger/constants'; +import { ERROR_NOT_BOOLEAN, USER_CONSENT_UPDATED, USER_CONSENT_NOT_UPDATED } from '../logger/constants'; import { ISyncManager } from '../sync/types'; import { ISettings } from '../types'; import { CONSENT_GRANTED, CONSENT_DECLINED } from '../utils/constants'; +import { isBoolean } from '../utils/lang'; // Extend client-side factory instances with user consent getter/setter export function userConsentProps(settings: ISettings, syncManager?: ISyncManager) { @@ -11,20 +12,22 @@ export function userConsentProps(settings: ISettings, syncManager?: ISyncManager return { setUserConsent(consent: unknown) { // validate input param - if (typeof consent !== 'boolean') { - log.error(ERROR_NOT_BOOLEAN, ['setUserConsent']); + if (!isBoolean(consent)) { + log.warn(ERROR_NOT_BOOLEAN, ['setUserConsent']); return false; } const newConsentStatus = consent ? CONSENT_GRANTED : CONSENT_DECLINED; - if (settings.userConsent !== newConsentStatus) { - // resume/pause submitters - if (consent) syncManager?.submitter?.start(); - else syncManager?.submitter?.stop(); - - log.info(USER_CONSENT_UPDATED, [settings.userConsent, newConsentStatus]); // @ts-ignore, modify readonly prop + if (settings.userConsent !== newConsentStatus) { // @ts-ignore, modify readonly prop settings.userConsent = newConsentStatus; + + if (consent) syncManager?.submitter?.start(); // resumes submitters if transitioning to GRANTED + else syncManager?.submitter?.stop(); // pauses submitters if transitioning to DECLINED + + log.info(USER_CONSENT_UPDATED, [settings.userConsent, newConsentStatus]); + } else { + log.info(USER_CONSENT_NOT_UPDATED, [newConsentStatus]); } return true; diff --git a/src/utils/lang/index.ts b/src/utils/lang/index.ts index f894f652..2a7332ff 100644 --- a/src/utils/lang/index.ts +++ b/src/utils/lang/index.ts @@ -89,7 +89,7 @@ export function get(obj: any, prop: any, val: any): any { /** * Parses an array into a map of different arrays, grouping by the specified prop value. */ -export function groupBy >(source: T[], prop: string): Record { +export function groupBy>(source: T[], prop: string): Record { const map: Record = {}; if (Array.isArray(source) && isString(prop)) { @@ -164,6 +164,13 @@ export function isString(val: any): val is string { return typeof val === 'string' || val instanceof String; } +/** + * String sanitizer. Returns the provided value converted to uppercase if it is a string. + */ +export function stringToUpperCase(val: any) { + return isString(val) ? val.toUpperCase() : val; +} + /** * Deep copy version of Object.assign using recursion. * There are some assumptions here. It's for internal use and we don't need verbose errors diff --git a/src/utils/settingsValidation/consent.ts b/src/utils/settingsValidation/consent.ts index 1cf9233b..c68cf222 100644 --- a/src/utils/settingsValidation/consent.ts +++ b/src/utils/settingsValidation/consent.ts @@ -1,11 +1,12 @@ import { ERROR_INVALID_CONFIG_PARAM } from '../../logger/constants'; import { ILogger } from '../../logger/types'; import { CONSENT_DECLINED, CONSENT_GRANTED, CONSENT_UNKNOWN } from '../constants'; +import { stringToUpperCase } from '../lang'; const userConsentValues = [CONSENT_DECLINED, CONSENT_GRANTED, CONSENT_UNKNOWN]; export function validateConsent({ userConsent, log }: { userConsent: any, log: ILogger }) { - if (typeof userConsent === 'string') userConsent = userConsent.toUpperCase(); + userConsent = stringToUpperCase(userConsent); if (userConsentValues.indexOf(userConsent) > -1) return userConsent; diff --git a/src/utils/settingsValidation/impressionsMode.ts b/src/utils/settingsValidation/impressionsMode.ts index 891f92b9..9fdc3e09 100644 --- a/src/utils/settingsValidation/impressionsMode.ts +++ b/src/utils/settingsValidation/impressionsMode.ts @@ -2,9 +2,10 @@ import { ERROR_INVALID_CONFIG_PARAM } from '../../logger/constants'; import { ILogger } from '../../logger/types'; import { SplitIO } from '../../types'; import { DEBUG, OPTIMIZED } from '../constants'; +import { stringToUpperCase } from '../lang'; export function validImpressionsMode(log: ILogger, impressionsMode: any): SplitIO.ImpressionsMode { - if (typeof impressionsMode === 'string') impressionsMode = impressionsMode.toUpperCase(); + impressionsMode = stringToUpperCase(impressionsMode); if ([DEBUG, OPTIMIZED].indexOf(impressionsMode) > -1) return impressionsMode;