{"version":3,"file":"diContainer.4fbfde7ff98fc02e0bc4.bundle.js","mappings":"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","sources":["webpack://elc-service-config-manager/./node_modules/@estee/elc-service/src/Api.ts","webpack://elc-service-config-manager/./src/api/ConfigMangerApiSdk.ts","webpack://elc-service-config-manager/./src/service-setup/ServiceBusController.ts","webpack://elc-service-config-manager/./node_modules/@estee/elc-logging/node_modules/@estee/elc-universal-utils/src/UniversalUtils.ts","webpack://elc-service-config-manager/./node_modules/@estee/elc-logging/node_modules/@estee/elc-universal-utils/src/BrowserStorage.ts","webpack://elc-service-config-manager/./node_modules/@estee/elc-logging/node_modules/@estee/elc-universal-utils/src/Service/ServiceVersion.ts","webpack://elc-service-config-manager/./node_modules/@estee/elc-logging/src/ELCLoggerValidations.ts","webpack://elc-service-config-manager/./node_modules/@estee/elc-logging/src/LoggerApiSDK.ts","webpack://elc-service-config-manager/./node_modules/@estee/elc-logging/src/ELCLogger.ts","webpack://elc-service-config-manager/./src/internal/domain/resolvers/DeepSearchResolver.ts","webpack://elc-service-config-manager/./src/internal/domain/resolvers/FieldAccessResolver.ts","webpack://elc-service-config-manager/./src/internal/domain/entities/Config.ts","webpack://elc-service-config-manager/./src/internal/repositories/ConfigRepository.ts","webpack://elc-service-config-manager/./src/internal/domain/config-mappings/index.ts","webpack://elc-service-config-manager/./src/internal/domain/config-mappings/General.ts","webpack://elc-service-config-manager/./src/internal/domain/config-mappings/Account.ts","webpack://elc-service-config-manager/./src/internal/domain/config-mappings/Checkout.ts","webpack://elc-service-config-manager/./src/internal/domain/config-mappings/Compliance.ts","webpack://elc-service-config-manager/./src/internal/domain/config-mappings/Prodcat.ts","webpack://elc-service-config-manager/./src/internal/use-cases/ServiceStartedUseCase.ts","webpack://elc-service-config-manager/./src/service-setup/diContainer.ts"],"sourcesContent":["import { HeaderType, HeaderObject, root } from '@estee/elc-universal-utils';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\n\nexport const AUTHORIZATION_HEADER_NAME = 'AuthorizationToken';\nexport const BUSINESS_UNIT_HEADER_NAME = 'Business-Unit';\n\nexport interface IError {\n status: number;\n}\nexport interface IDataMapperOperations {\n [key: string]: Function | undefined;\n request?(request: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n response?(response: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n}\nexport interface IDataMappings {\n [key: string]: IDataMapperOperations;\n}\nexport interface IResponse {\n data: T;\n reponseHeaders: Headers | {};\n}\nexport interface IPayload {\n url: string;\n body?: {};\n options?: {};\n headers?: {};\n returnAsPlainText?: boolean;\n}\nexport interface IGetPayload {\n url: string;\n options?: {};\n headers?: {};\n params?: {};\n}\nexport interface IRequestOptions {\n debounceInterval?: number;\n bypassCache?: boolean;\n}\nexport interface IHttpTransport {\n addGlobalHeaders(header: HeaderObject): void;\n removeGlobalHeader(headerName: string): void;\n delete(payload: string | IPayload): Promise>;\n post(payload: IPayload): Promise>;\n patch(payload: IPayload): Promise>;\n put(payload: IPayload): Promise>;\n get(payload: string | IGetPayload, IRequestOptions?: IRequestOptions): Promise>;\n}\nexport interface IDataMapper {\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapRequest(name: string, request: Object): {};\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapResponse(name: string, response: Object): {};\n dataMappings?: IDataMappings;\n}\n\nexport interface IConfig {\n cartId?: string;\n httpTransport: IHttpTransport;\n dataMapper?: IDataMapper;\n businessUnitId?: string;\n drupalDomain?: string;\n}\n\nexport class Api {\n protected bearerToken: string;\n protected httpTransport: IHttpTransport;\n protected businessUnitId: string | undefined;\n private logger: ELCLogger;\n\n constructor(configStore: IConfig, serviceName: string, serviceVersion: string) {\n this.httpTransport = configStore.httpTransport;\n this.businessUnitId = configStore.businessUnitId;\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n }\n\n public addHeader(header: HeaderObject) {\n this.httpTransport.addGlobalHeaders(header);\n }\n\n public removeHeader(headerName: HeaderType) {\n this.httpTransport.removeGlobalHeader(headerName);\n }\n\n public setBearerToken(bearerToken: string) {\n if (bearerToken) {\n this.addHeader({\n [AUTHORIZATION_HEADER_NAME]: `${bearerToken}`\n });\n } else {\n this.removeHeader(AUTHORIZATION_HEADER_NAME);\n }\n }\n protected delete = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.delete(payload);\n } catch (e) {\n this.handleError(e, 'delete', payload);\n }\n\n return response;\n };\n\n protected get = async (\n payload: IGetPayload | string,\n { debounceInterval = 200, bypassCache = false }: IRequestOptions = {}\n ) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.get(payload, {\n debounceInterval,\n bypassCache\n });\n } catch (e) {\n this.handleError(e, 'get', payload);\n }\n\n return response;\n };\n\n protected patch = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.patch(payload);\n } catch (e) {\n this.handleError(e, 'patch', payload);\n }\n\n return response;\n };\n\n protected post = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n try {\n response = await this.httpTransport.post(payload);\n } catch (e) {\n this.handleError(e, 'post', payload);\n }\n\n return response;\n };\n protected put = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.put(payload);\n } catch (e) {\n this.handleError(e, 'put', payload);\n }\n\n return response;\n };\n\n private handleError = (e: Error, requestType: string, originalPayload: IPayload | string) => {\n this.logger.error({\n triggerType: TriggerType.api,\n message: `${e}`,\n payload: {\n context: {\n subdomain: root.site && root.site.client && root.site.client.subdomain,\n originalPayload,\n requestType\n },\n error: e\n }\n });\n };\n}\n","import { Api, IConfig } from '@estee/elc-service';\n\nconst { name, version } = __serviceInfo__;\nexport interface IConfigStoreData {\n data: Record;\n}\n\nexport class ConfigMangerApiSdk extends Api {\n private apiUrl: string;\n\n constructor(configStore: IConfig) {\n super(configStore, name, version);\n this.apiUrl = 'stardust-buid-configurations-v1';\n }\n\n public async getConfigByBusinessUnitId(businessUnitId: string) {\n const url = `/${this.apiUrl}/configurations/${businessUnitId}`;\n const response: IConfigStoreData = await this.get(url);\n\n return response.data;\n }\n}\n","import { ConfigRepository } from '../internal/repositories/ConfigRepository';\n\nexport class ServiceBusController {\n // eslint-disable-next-line @typescript-eslint/no-parameter-properties\n constructor(private configRepository: ConfigRepository) {}\n\n public loadConfigs = async (payload: string[]) => this.configRepository.getConfigs(payload);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ServiceBus } from '@estee/elc-service-bus';\nimport {\n IServiceRegistry,\n IComponentViewController,\n AllServicesTypes\n} from './Service/ServiceUtils';\n\nexport const MOBILE_VERSION_SELECTOR = 'js-mobile-version';\nexport const DESKTOP_VERSION_SELECTOR = 'js-desktop-version';\n\nexport interface ISingleServiceInfo {\n [key: string]: string;\n}\n\nexport interface IServiceInfo {\n [name: string]: ISingleServiceInfo;\n}\n\nexport type ArrayMinOne = {\n 0: T;\n} & T[];\n\ninterface IObjectOfStrings {\n [key: string]: string;\n}\n\ninterface IServiceBusTopics {\n commands: IObjectOfStrings;\n events: IObjectOfStrings;\n queries: IObjectOfStrings;\n}\n\nexport interface IPayload {\n url: string;\n body?: {};\n options?: {};\n headers?: {};\n}\n\nexport interface IGetPayload {\n url: string;\n options?: {};\n headers?: {};\n params?: {};\n}\n\nexport interface IRequestOptions {\n debounceInterval?: number;\n}\n\nexport type HeaderType = 'Business-Unit' | 'Authorization' | 'AuthorizationToken' | 'ClientId';\nexport type HeaderObject = { [key in HeaderType]?: string };\nexport type IHeaderSetter = () => Promise;\nexport type IRequestTransformerConfig = { url: string } & RequestInit;\nexport type IRequestTransformer = (config: IRequestTransformerConfig) => Promise;\n\nexport interface IHttpTransport {\n getStaticGlobalHeaders(): HeaderObject;\n setBaseUrl(baseUrl: string): void;\n addGlobalHeaders(headers: HeaderObject): void;\n removeGlobalHeader(headerName: string): void;\n addGlobalHeaderSetter(setter: IHeaderSetter): void;\n removeGlobalHeaderSetter(setter: IHeaderSetter): void;\n addRequestTransformer(transformer: IRequestTransformer): void;\n removeRequestTransformer(transformer: IRequestTransformer): void;\n delete(payload: string | IPayload): Promise;\n post(payload: IPayload): Promise;\n patch(payload: IPayload): Promise;\n put(payload: IPayload): Promise;\n get(payload: string | IGetPayload, IRequestOptions?: IRequestOptions): Promise;\n readonly isAuthFailureHandlingEnabled: boolean;\n setAuthFailureHandlingEnabled(enabled: boolean): void;\n}\n\nexport interface IUtagData {\n [key: string]: string | string[] | undefined | boolean | number | null | number[];\n}\nexport interface IUtagCfgOvrd {\n noview: boolean;\n dom_complete?: boolean;\n lowerqp?: boolean;\n noload?: boolean | number;\n nocookie?: boolean;\n readywait?: boolean | number;\n waittimer?: number;\n}\nexport interface IUtag {\n link(data: IUtagData, cb?: Function): void;\n view(data: IUtagData, cb?: Function): void;\n}\n\nexport interface IFrontendLogger {\n isEnabled?: boolean;\n loggedServices?: {\n [key: string]: {\n isEnabled?: boolean;\n };\n };\n}\n\ninterface ILoggerApiSDK {\n sendLog: Function;\n}\ninterface IDrupalSite {\n translations?: any;\n trackingDataLayer?: any;\n client?: {\n subdomain?: string;\n isMobile?: number;\n };\n frontendLogger?: IFrontendLogger;\n}\nexport type AnyObject = { [key: string]: any };\ntype ITranslationsCollection = { [key: string]: string | IObjectOfStrings };\ntype ViewDataPreloader = {\n addConfigs(configs: AnyObject): void;\n addTranslations(translations: ITranslationsCollection): void;\n getPreloadedConfigs(arg: string[]): AnyObject | null;\n getPreloadedTranslations(arg: string[]): ITranslationsCollection | null;\n preload(): Promise;\n registerTranslationFieldsToPreload(fields?: string[]): void;\n registerConfigFieldsToPreload(fields?: string[]): void;\n};\ninterface IComponentRenderer {\n init(): Promise;\n getDataPreloader(): ViewDataPreloader | null;\n setDataPreloader(arg: ViewDataPreloader): void;\n}\n\ntype IObjectLike = { [key: string]: any } | null;\nexport interface IViewManager {\n loadComponent(): Promise;\n module: React.ComponentType | null;\n controllerFromView: IComponentViewController | null;\n}\nexport interface IViewsManager {\n lazyServicesStarted: boolean;\n getViewManager(viewName: string): IViewManager;\n startService(service: AllServicesTypes): Promise;\n startLazyServices(): Promise;\n}\ndeclare global {\n // Augment Node.js `global`\n namespace NodeJS {\n interface Global {\n ServiceBusTopics: IServiceBusTopics;\n ServiceRegistry: IServiceRegistry;\n GlobalServiceBus: ServiceBus;\n HttpTransport: IHttpTransport;\n __translationsCache__: { [key: string]: string };\n __configsCache__: { [key: string]: any };\n getPreloadedConfigs(fields?: string[]): IObjectLike;\n addConfigs(configs: object): void;\n getPreloadedTranslations(fields?: string[]): IObjectLike;\n addTranslations(translations: object): void;\n replaceSrc(originalSrc: string): string;\n utag_data: IUtagData;\n utag_cfg_ovrd: IUtagCfgOvrd;\n utag: IUtag;\n site?: IDrupalSite;\n location: Location;\n navigator: Navigator;\n ComponentRenderer: IComponentRenderer;\n ViewsManager: IViewsManager;\n registerTranslationFieldsToPreload: Function;\n registerConfigFieldsToPreload: Function;\n serviceInfo: IServiceInfo;\n getServiceVersions(): void;\n __ssr: boolean;\n onerror(\n message: string,\n url: string,\n line: number,\n column: number,\n error: Error\n ): boolean;\n env: string;\n buid: string;\n loggerApiSDK: ILoggerApiSDK;\n requestIdleCallback: Function;\n cancelIdleCallback: Function;\n }\n }\n\n // Augment Browser `window`\n interface Window {\n ServiceBusTopics: IServiceBusTopics;\n __translationsCache__: { [key: string]: string };\n __configsCache__: { [key: string]: any };\n getPreloadedConfigs(fields?: string[]): IObjectLike;\n addConfigs(configs: object): void;\n getPreloadedTranslations(fields?: string[]): IObjectLike;\n addTranslations(translations: object): void;\n ServiceRegistry: IServiceRegistry;\n GlobalServiceBus: ServiceBus;\n HttpTransport: IHttpTransport;\n replaceSrc(originalSrc: string): string;\n utag_data: any;\n utag_cfg_ovrd: IUtagCfgOvrd;\n utag: IUtag;\n location: Location;\n site?: IDrupalSite;\n addEventListener(a: string, b: Function): void;\n ComponentRenderer: IComponentRenderer;\n ViewsManager: IViewsManager;\n registerTranslationFieldsToPreload: Function;\n registerConfigFieldsToPreload: Function;\n getServiceVersions(): void;\n __ssr: boolean;\n onerror(message: string, url: string, line: number, column: number, error: Error): boolean;\n env: string;\n buid: string;\n serviceInfo: IServiceInfo;\n loggerApiSDK: ILoggerApiSDK;\n requestIdleCallback: Function;\n cancelIdleCallback: Function;\n }\n\n // Augment Web Worker `self`\n interface WorkerGlobalScope {\n ServiceBusTopics: IServiceBusTopics;\n ServiceRegistry: IServiceRegistry;\n GlobalServiceBus: ServiceBus;\n HttpTransport: IHttpTransport;\n __translationsCache__: { [key: string]: string };\n __configsCache__: { [key: string]: any };\n getPreloadedConfigs(fields?: string[]): IObjectLike;\n addConfigs(configs: object): void;\n getPreloadedTranslations(fields?: string[]): IObjectLike;\n addTranslations(translations: object): void;\n replaceSrc(originalSrc: string): string;\n utag_data: IUtagData;\n utag_cfg_ovrd: IUtagCfgOvrd;\n utag: IUtag;\n location: Location;\n addEventListener(a: string, b: Function): void;\n ComponentRenderer: IComponentRenderer;\n ViewsManager: IViewsManager;\n registerTranslationFieldsToPreload: Function;\n registerConfigFieldsToPreload: Function;\n }\n}\n\nexport const isWebRendered = typeof self === 'object' && self.self === self;\n\nexport const root: NodeJS.Global | Window =\n (isWebRendered && self) ||\n (typeof global === 'object' && global.global === global && global) ||\n window;\n\nexport const setupServiceInfo = (serviceInfo: ISingleServiceInfo) => {\n const { name, ...rest } = serviceInfo;\n\n root.serviceInfo = root.serviceInfo || {};\n root.serviceInfo[name] = rest;\n};\n\nexport enum ISandboxEnvironment {\n LIVE = 'live',\n FEATURE = 'feature',\n DEV = 'dev',\n STAGE = 'stage',\n CMS = 'cms',\n PERSONAL = 'personal',\n PRODUCTION = 'production'\n}\n\nexport const getSandboxEnvironment: () => string = () => {\n let urlParts = root.location.hostname.split('.');\n const { LIVE, FEATURE, DEV, STAGE, CMS, PERSONAL } = ISandboxEnvironment;\n\n urlParts = urlParts.filter(part => !['www', 'm'].includes(part));\n const isLive = !(urlParts[0] === 'c') && !(urlParts[0] === 'e');\n\n return isLive\n ? LIVE\n : urlParts.includes(FEATURE)\n ? FEATURE\n : urlParts.includes(DEV)\n ? DEV\n : urlParts.includes(STAGE)\n ? STAGE\n : urlParts.includes(CMS)\n ? CMS\n : PERSONAL;\n};\n","export type storageKeyType = 'localStorage' | 'sessionStorage';\nexport namespace BrowserStorage {\n export function eraseCookie(name: string) {\n document.cookie = `${name}=; Max-Age=-99999999;`;\n }\n\n export function setCookie(name: string, value: string, daysOrDate: number | Date) {\n let expires = '';\n if (daysOrDate) {\n const expirationDate =\n typeof daysOrDate === 'number'\n ? new Date(Date.now() + daysOrDate * 24 * 60 * 60 * 1000)\n : daysOrDate;\n expires = `; expires=${expirationDate.toUTCString()}`;\n }\n document.cookie = `${name}=${value || ''}${expires};path=/`;\n }\n\n export function getCookie(name: string) {\n const nameEQ = `${name}=`;\n const ca = document.cookie.split(';');\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1, c.length);\n }\n if (c.indexOf(nameEQ) === 0) {\n return c.substring(nameEQ.length, c.length);\n }\n }\n\n return null;\n }\n\n export function getItem(key: string, storageKey: storageKeyType = 'localStorage') {\n try {\n if (window[storageKey].getItem(key) !== null) {\n return window[storageKey].getItem(key);\n }\n } catch (e) {\n console.error(e);\n\n return getCookie(key);\n }\n }\n\n export function setItem(\n key: string,\n value: string,\n storageKey: storageKeyType = 'localStorage'\n ) {\n try {\n window[storageKey].setItem(key, value);\n } catch (e) {\n console.error(e);\n setCookie(key, value, 20);\n }\n }\n\n export function removeItem(key: string, storageKey: storageKeyType = 'localStorage') {\n try {\n window[storageKey].removeItem(key);\n } catch (e) {\n console.error(e);\n eraseCookie(key);\n }\n }\n\n export function storagePolling(key: string, callBack: Function) {\n let storageValue = getItem(key);\n\n const checkForKeyChange = () => {\n const latestValue = getItem(key);\n\n if (storageValue !== latestValue) {\n storageValue = latestValue;\n callBack(latestValue);\n }\n };\n\n return setInterval(checkForKeyChange, 2000);\n }\n}\n","import { root, ISingleServiceInfo } from '../UniversalUtils';\n\nconst extractServiceVersion = (serviceInfo: ISingleServiceInfo) =>\n serviceInfo && serviceInfo.version;\n\nconst searchForServiceInfo = (serviceName: string) =>\n root.serviceInfo[serviceName] || root.ServiceRegistry[serviceName];\n\nexport const getServiceVersion = (serviceName: string, fallback: string = '') =>\n extractServiceVersion(searchForServiceInfo(serviceName)) || fallback;\n","const isString: Function = (value: unknown) => typeof value === 'string';\n\nconst VALIDATORS: { [key: string]: Function[] } = {\n buid: [Boolean],\n context: [Boolean],\n environment: [Boolean, isString],\n level: [Boolean, isString],\n message: [Boolean, isString],\n serviceName: [Boolean, isString],\n serviceVersion: [Boolean, isString],\n triggerType: [Boolean, isString],\n userAgent: [Boolean, isString]\n};\n\nexport const validate = (requestBody: { [key: string]: unknown }) => {\n const result = Object.keys(VALIDATORS).reduce((acc: boolean[], key) => {\n VALIDATORS[key].forEach((validator: (value: unknown) => boolean) => {\n const requestValue = requestBody[key];\n acc.push(validator(requestValue));\n });\n\n return acc;\n }, []);\n\n return result.every(Boolean);\n};\n","import { root, IFrontendLogger } from '@estee/elc-universal-utils';\nimport { validate } from './ELCLoggerValidations';\nimport { ILogData, IFullData } from './ELCLogger';\n\nexport class LoggerApiSDK {\n private loggingServiceUrl: string = '/stardust-fe-logging-v0/logMessage';\n private queue: ILogData[] = [];\n private isRequestIdleCallbackScheduled: boolean;\n private lastTimeExecuted: number = Date.now();\n private frontendLogger: IFrontendLogger = root.site ? root.site.frontendLogger || {} : {};\n\n private generateRequestBody(fullData: IFullData) {\n const { config, level, logdata } = fullData;\n\n const { payload = {}, message, triggerType } = logdata;\n const {\n serviceName: payloadServiceName,\n serviceVersion: payloadServiceVersion,\n context,\n error\n } = payload;\n\n const {\n serviceName: configServiceName,\n serviceVersion: configServiceVersion,\n buid: configBuid,\n environment: configEnvironment\n } = config;\n const stringifiedError = error && JSON.stringify(error, Object.getOwnPropertyNames(error));\n\n return {\n context: {\n ...context,\n date: new Date().toUTCString(),\n error: stringifiedError\n },\n environment: configEnvironment || root.env,\n level: level,\n message,\n serviceName: payloadServiceName || configServiceName,\n serviceVersion: payloadServiceVersion || configServiceVersion,\n siteUrl: root.location.href,\n buid: configBuid || root.buid,\n triggerType,\n userAgent: root.navigator.userAgent\n };\n }\n\n public sendLog(fullData: IFullData) {\n const requestBody = this.generateRequestBody(fullData);\n const loggedServices = this.frontendLogger.loggedServices || {};\n const serviceConfig = loggedServices[requestBody.serviceName] || {};\n const isServiceEnabled = serviceConfig.isEnabled;\n\n if (this.frontendLogger.isEnabled && isServiceEnabled) {\n if (!validate(requestBody)) {\n throw new Error(`Request body for error logging did not validate`);\n }\n\n this.addLogToQueue(requestBody);\n }\n }\n\n public addLogToQueue = (log: ILogData) => {\n this.queue.push(log);\n this.schedulePendingEvents();\n };\n\n private schedulePendingEvents = () => {\n if (this.isRequestIdleCallbackScheduled) {\n return;\n }\n\n this.isRequestIdleCallbackScheduled = true;\n root.requestIdleCallback(this.processPendingLogs);\n };\n\n private processPendingLogs = () => {\n this.isRequestIdleCallbackScheduled = false;\n\n if (this.queue.length > 0 && Date.now() - this.lastTimeExecuted > 2000) {\n root.HttpTransport.post({\n url: this.loggingServiceUrl,\n body: this.queue\n }).catch(() => console.error('Errors failed to be sent to sumoLogic', this.queue));\n\n this.queue = [];\n this.lastTimeExecuted = Date.now();\n }\n\n if (this.queue.length > 0) {\n this.schedulePendingEvents();\n }\n };\n}\n","import { debug, Debugger } from 'debug';\nimport { LoggerApiSDK } from './LoggerApiSDK';\nimport { getSandboxEnvironment, root, ISandboxEnvironment } from '@estee/elc-universal-utils';\n\nexport interface IFullData {\n logdata: ILogData;\n level: string;\n config: IELCLogger;\n}\n\nexport interface IPayload {\n error?: Error;\n context?: object;\n serviceName?: string;\n serviceVersion?: string;\n}\n\nexport interface ILogData {\n triggerType: TriggerType;\n message: string;\n payload?: IPayload;\n}\n\nexport enum TriggerType {\n runtimeError = 'runtimeError',\n api = 'api',\n graphqlApi = 'graphqlApi',\n render = 'render',\n serviceBus = 'serviceBus',\n config = 'config',\n translation = 'translation',\n other = 'other'\n}\n\nexport interface IELCLogger {\n serviceName: string;\n serviceVersion?: string;\n environment?: string;\n buid?: string;\n}\n\nexport class ELCLogger {\n private config: IELCLogger;\n\n private errorDebugger?: Debugger;\n private infoDebugger?: Debugger;\n private warningDebugger?: Debugger;\n private eventDebugger?: Debugger;\n private queryDebugger?: Debugger;\n private commandDebugger?: Debugger;\n\n constructor(config: IELCLogger) {\n this.config = config;\n const logger = debug(this.config.serviceName);\n root.loggerApiSDK = root.loggerApiSDK || new LoggerApiSDK();\n\n this.errorDebugger = logger.extend('error');\n this.infoDebugger = logger.extend('info');\n this.warningDebugger = logger.extend('warning');\n this.eventDebugger = logger.extend('event');\n this.queryDebugger = logger.extend('query');\n this.commandDebugger = logger.extend('command');\n }\n\n public error = async (logdata: ILogData) => {\n if (this.errorDebugger) {\n this.errorDebugger(this.enhanceLogData(logdata));\n }\n\n const isProd =\n this.config.environment === ISandboxEnvironment.PRODUCTION ||\n root.env === ISandboxEnvironment.PRODUCTION;\n\n if ((isProd && getSandboxEnvironment() === ISandboxEnvironment.LIVE) || !isProd) {\n return this.sendLog(logdata, 'error');\n }\n };\n\n public info = (logdata: ILogData) => {\n if (this.infoDebugger) {\n this.infoDebugger(this.enhanceLogData(logdata));\n }\n };\n\n public warning = (logdata: ILogData) => {\n if (this.warningDebugger) {\n this.warningDebugger(this.enhanceLogData(logdata));\n }\n };\n\n public event = (logdata: ILogData) => {\n if (this.eventDebugger) {\n this.eventDebugger(this.enhanceLogData(logdata));\n }\n };\n\n public query = (logdata: ILogData) => {\n if (this.queryDebugger) {\n this.queryDebugger(this.enhanceLogData(logdata));\n }\n };\n\n public command = (logdata: ILogData) => {\n if (this.commandDebugger) {\n this.commandDebugger(this.enhanceLogData(logdata));\n }\n };\n\n private enhanceLogData = (logdata: ILogData) => ({\n ...logdata,\n triggerSource: this.config.serviceName,\n date: new Date().toUTCString()\n });\n // @ts-ignore\n private async sendLog(logdata: ILogData, level: string) {\n try {\n root.loggerApiSDK.sendLog({ logdata, level, config: this.config });\n } catch (e) {\n if (this.errorDebugger) {\n this.errorDebugger(\n this.enhanceLogData({\n message: 'Could not send log',\n triggerType: TriggerType.api,\n payload: {\n error: e,\n context: logdata\n }\n })\n );\n }\n }\n }\n}\n","import { IConfigResolver } from './IConfigResolver';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst findVal = (object: any, key: string): any => {\n let value;\n const objKeys = Object.keys(object);\n for (const objKey of objKeys) {\n if (objKey === key) {\n value = object[objKey];\n break;\n }\n\n if (object[objKey] && typeof object[objKey] === 'object') {\n value = findVal(object[objKey], key);\n\n if (value !== undefined) {\n break;\n }\n }\n }\n\n return value;\n};\n\nexport const DeepSearchResolver: IConfigResolver = (name, ctx) => {\n return findVal(ctx.config, name);\n};\n","import { IConfigResolver } from './IConfigResolver';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction canBeAccessed(result: any) {\n return result !== null && result !== undefined;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction safeEvaluate(obj: any, expression: string) {\n const fields = (expression || '')\n .trim()\n .split('.')\n .map(field => field.trim());\n\n const fieldCount = fields.length;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any;\n\n let currentObj = obj;\n let fieldIndex;\n for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex += 1) {\n if (canBeAccessed(currentObj)) {\n const fieldName = fields[fieldIndex];\n currentObj = currentObj[fieldName];\n } else {\n break;\n }\n }\n\n if (fieldIndex === fieldCount) {\n result = currentObj;\n }\n\n return result;\n}\n\nexport const FieldAccessResolver: IConfigResolver = (name, ctx) => {\n const mappedExpression = ctx.mapping[name];\n if (!mappedExpression && !name.includes('.')) {\n return undefined;\n }\n\n return mappedExpression\n ? safeEvaluate(ctx.config, mappedExpression.toString())\n : safeEvaluate(ctx.config, name);\n};\n","import { observable, action } from 'mobx';\nimport { IConfigMapping } from '../config-mappings/IConfigMapping';\nimport { IResolveContext } from '../resolvers/IResolveContext';\nimport { IConfigResolver } from '../resolvers/IConfigResolver';\nimport { DeepSearchResolver } from '../resolvers/DeepSearchResolver';\nimport { FieldAccessResolver } from '../resolvers/FieldAccessResolver';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype IConfig = Record;\n\nexport class Config {\n @observable public config: IConfig;\n @observable public mapping: IConfigMapping = {};\n\n public static fromJSON(data: IConfig) {\n const config = new Config();\n config.setConfig(data);\n\n return config;\n }\n\n private isConfigDeclared = (value: unknown): boolean => {\n return typeof value === 'boolean' || typeof value === 'number' || !!value;\n };\n\n public getConfigByName = (configName: string) => {\n const context: IResolveContext = {\n config: this.config,\n mapping: this.mapping\n };\n let resolver: IConfigResolver = DeepSearchResolver;\n\n const mappedResolver = this.mapping[configName];\n\n if (\n typeof mappedResolver === 'string' ||\n mappedResolver instanceof String ||\n configName.includes('.')\n ) {\n resolver = FieldAccessResolver;\n } else if (typeof mappedResolver === 'function') {\n resolver = mappedResolver;\n }\n\n if (!resolver) {\n resolver = DeepSearchResolver;\n }\n\n const value = resolver(configName, context);\n\n return this.isConfigDeclared(value) ? value : '';\n };\n\n @action\n public setMapping(mapping: IConfigMapping) {\n this.mapping = mapping;\n }\n\n @action\n private setConfig = (config: IConfig) => {\n this.config = config;\n };\n}\n","import { BrowserStorage, root } from '@estee/elc-universal-utils';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\n\nimport { Config } from '../domain/entities/Config';\nimport { ConfigMangerApiSdk } from '../../api/ConfigMangerApiSdk';\nimport { IConfigMapping } from '../domain/config-mappings/IConfigMapping';\nimport { diContainer } from '../../service-setup/diContainer';\nimport serviceNames from '../../service-setup/ConfigManagerService';\n\nconst { name, version } = __serviceInfo__;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype IConfig = Record;\n\nconst configMap: IConfig = {\n isSaveForLaterFeatureEnabled: 'saveForLaterFeatureEnabled',\n itemMaxQuantity: 'item_max_quantity',\n orderMaxValue: 'order_max_value',\n orderSkuMaxLimit: 'order_sku_max_limit',\n currency: 'currency',\n noOrdersRedirectUrl: 'no_orders_redirect',\n features: 'features'\n};\n\nexport class ConfigRepository {\n private configMangerApiSdk: ConfigMangerApiSdk;\n private ecommConfig: Config;\n public buidConfig: Config;\n private logger: ELCLogger;\n\n private configMapping: IConfigMapping;\n\n constructor() {\n this.configMangerApiSdk = diContainer.get(serviceNames.configManagerApiSdk);\n this.ecommConfig = Config.fromJSON({});\n this.buidConfig = Config.fromJSON({});\n this.setMapping({});\n this.logger = new ELCLogger({\n serviceName: name,\n environment: root.env,\n buid: root.buid,\n serviceVersion: version\n });\n }\n\n private get isCacheable() {\n return (\n window &&\n 'sessionStorage' in window &&\n Object.getPrototypeOf(sessionStorage) === Storage.prototype\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private storeInCache(cacheKey: string, cacheData: any): void {\n // Prevents the storage of empty objects\n const shouldStoreData = Boolean(cacheData && Object.keys(cacheData).length);\n\n if (this.isCacheable && shouldStoreData) {\n BrowserStorage.setItem(cacheKey, JSON.stringify(cacheData), 'sessionStorage');\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private loadConfigFromCache(cacheKey: string): any {\n if (!this.isCacheable) {\n return false;\n }\n\n const cachedConfig = sessionStorage.getItem(cacheKey);\n\n if (cachedConfig) {\n const parsedConfig = JSON.parse(cachedConfig);\n const shouldReturnCachedValue = Boolean(parsedConfig && Object.keys(parsedConfig).length);\n\n if (shouldReturnCachedValue) {\n return parsedConfig;\n }\n }\n\n return false;\n }\n\n public loadConfigs = async (businessUnitId: string, refresh: boolean = false) => {\n let configs;\n const cacheKey = `buid-config-${businessUnitId}`;\n const cacheTtlKey = `buid-set-time`;\n const cachedConfig = this.loadConfigFromCache(cacheKey);\n\n // Kill switch for visitors will invalid cache\n const configCachedTime = sessionStorage.getItem(cacheTtlKey);\n if (!configCachedTime) {\n sessionStorage.setItem(cacheTtlKey, (Date.now()).toString());\n refresh = true;\n }\n\n if (cachedConfig && !refresh) {\n configs = cachedConfig;\n } else {\n configs = await this.configMangerApiSdk.getConfigByBusinessUnitId(businessUnitId);\n this.storeInCache(cacheKey, configs);\n }\n\n this.setBuidConfig(configs);\n };\n\n public setEcommConfig = (config: Config) => {\n this.ecommConfig = config;\n this.ecommConfig.setMapping(this.configMapping);\n };\n\n public setMapping(mapping: IConfigMapping) {\n this.configMapping = mapping;\n this.ecommConfig.setMapping(this.configMapping);\n this.buidConfig.setMapping(this.configMapping);\n }\n\n public getConfigs = async (payload: string[]) => {\n return payload.reduce((acc, configKey) => {\n const key = configMap[configKey] || configKey;\n let configValue: IConfig | string = '';\n\n if (key === 'ecommConfig') {\n configValue = this.ecommConfig.config;\n } else {\n configValue = this.buidConfig.getConfigByName(key);\n if (configValue === '') {\n configValue = this.ecommConfig.getConfigByName(key);\n }\n }\n\n if (configValue === '') {\n const error = new Error(`Config key ${configKey} not found`);\n this.logger.warning({\n message: error.message,\n triggerType: TriggerType.config,\n payload: {\n error\n }\n });\n }\n\n return { ...acc, [configKey]: configValue };\n }, {});\n };\n\n private setBuidConfig = (configs: IConfig) => {\n this.buidConfig = Config.fromJSON(configs);\n this.buidConfig.setMapping(this.configMapping);\n };\n}\n","import { Checkout } from './Checkout';\nimport { Compliance } from './Compliance';\nimport { Account } from './Account';\nimport { General } from './General';\nimport { Prodcat } from './Prodcat';\n\n// eslint-disable-next-line no-restricted-syntax\nexport const ConfigMappings = {\n ...General,\n ...Account,\n ...Checkout,\n ...Compliance,\n ...Prodcat\n};\n","import { IConfigMapping } from './IConfigMapping';\n\nexport const General: IConfigMapping = {\n routes: 'routes',\n brand: 'brand'\n};\n","import { IConfigMapping } from './IConfigMapping';\n\nexport const Account: IConfigMapping = {\n signupEnabled: 'account.signupEnabled',\n account_address_default_format: 'account.addresses.defaultFormat',\n account_address_formats: 'account.addresses.permittedAddressFormats'\n};\n","import { IConfigMapping } from './IConfigMapping';\n\nexport const Checkout: IConfigMapping = {\n checkout_show_terms_and_conditions: 'checkout.termsAndConditions',\n\n checkout_billing_address_default_format: 'checkout.billing.defaultFormat',\n checkout_billing_address_formats: 'checkout.billing.permittedAddressFormats',\n\n checkout_allow_guest_user: 'checkout.validation.allowed_guest_user_checkout',\n\n payment_sources: 'payment.payment_sources'\n};\n","import { IConfigMapping } from './IConfigMapping';\n\nexport const Compliance: IConfigMapping = {\n complianceGdpr: 'compliance.gdpr'\n};\n","export const Prodcat = {\n features: 'features'\n};\n","import { ConfigRepository } from '../repositories/ConfigRepository';\nimport { Config } from '../domain/entities/Config';\nimport { ConfigMappings } from '../domain/config-mappings';\n\nexport class ServiceStartedUseCase {\n constructor(\n // eslint-disable-next-line @typescript-eslint/no-parameter-properties\n private configRepository: ConfigRepository,\n // eslint-disable-next-line @typescript-eslint/no-parameter-properties\n private businessUnitId: string,\n // eslint-disable-next-line @typescript-eslint/no-parameter-properties\n private configs: Record\n ) {}\n\n public execute = async () => {\n const configs = {\n ...this.configs,\n isCoreSite: this.businessUnitId.indexOf('corev1') !== -1\n };\n\n const ecommConfig = Config.fromJSON(configs);\n\n // load buid configs data\n await this.configRepository.loadConfigs(this.businessUnitId);\n // set ecomm config data\n this.configRepository.setEcommConfig(ecommConfig);\n // set mapping\n this.configRepository.setMapping(ConfigMappings);\n };\n}\n","import { Container } from 'hypo-container';\nimport { IAppConfig, root } from '@estee/elc-universal-utils';\nimport { ServiceManager } from '@estee/elc-service';\nimport { ConfigMangerApiSdk } from '../api/ConfigMangerApiSdk';\nimport { ServiceBusController } from './ServiceBusController';\nimport { ConfigRepository } from '../internal/repositories/ConfigRepository';\nimport serviceNames, { ConfigManagerService } from './ConfigManagerService';\nimport { ServiceStartedUseCase } from '../internal/use-cases/ServiceStartedUseCase';\n\nexport const diContainer = new Container();\n\nexport const setConfig = (configJSON: IAppConfig) => {\n diContainer.config = configJSON;\n};\n\ndiContainer\n .register(serviceNames.httpTransport, () => root.HttpTransport)\n .register(\n serviceNames.configManagerApiSdk,\n (c) => new ConfigMangerApiSdk({ httpTransport: c.get(serviceNames.httpTransport) })\n )\n .register(serviceNames.configRepository, () => new ConfigRepository())\n .register(\n serviceNames.serviceBusController,\n (c) => new ServiceBusController(c.get(serviceNames.configRepository))\n )\n .register(\n serviceNames.configManagerService,\n (c) =>\n new ConfigManagerService(async (config: IAppConfig) => {\n setConfig(config);\n c.get(serviceNames.serviceBusController);\n\n const businessUnitId = config.businessUnitId as string;\n const configRepository = c.get(serviceNames.configRepository);\n\n const useCase = new ServiceStartedUseCase(configRepository, businessUnitId, config);\n await useCase.execute();\n })\n );\n\nexport const serviceStarter = ServiceManager.startService;\n"],"names":["AUTHORIZATION_HEADER_NAME","name","version","ConfigMangerApiSdk","constructor","configStore","serviceName","serviceVersion","delete","payload","response","data","reponseHeaders","this","httpTransport","e","handleError","get","debounceInterval","bypassCache","patch","post","put","requestType","originalPayload","logger","error","triggerType","message","context","subdomain","businessUnitId","ELCLogger","addHeader","header","addGlobalHeaders","removeHeader","headerName","removeGlobalHeader","setBearerToken","bearerToken","super","apiUrl","getConfigByBusinessUnitId","url","ServiceBusController","configRepository","loadConfigs","getConfigs","self","g","global","window","ISandboxEnvironment","BrowserStorage","document","cookie","value","daysOrDate","expires","Date","now","toUTCString","nameEQ","ca","split","i","length","c","charAt","substring","indexOf","key","storageKey","getItem","console","getCookie","eraseCookie","setCookie","setItem","removeItem","storagePolling","callBack","storageValue","setInterval","latestValue","isString","VALIDATORS","buid","Boolean","environment","level","userAgent","LoggerApiSDK","loggingServiceUrl","queue","lastTimeExecuted","frontendLogger","addLogToQueue","log","push","schedulePendingEvents","isRequestIdleCallbackScheduled","processPendingLogs","body","catch","generateRequestBody","fullData","config","logdata","payloadServiceName","payloadServiceVersion","configServiceName","configServiceVersion","configBuid","configEnvironment","stringifiedError","JSON","stringify","Object","getOwnPropertyNames","date","siteUrl","sendLog","requestBody","isServiceEnabled","loggedServices","isEnabled","keys","reduce","acc","forEach","validator","requestValue","every","validate","Error","TriggerType","errorDebugger","enhanceLogData","isProd","PRODUCTION","urlParts","location","hostname","LIVE","FEATURE","DEV","STAGE","CMS","PERSONAL","filter","part","includes","getSandboxEnvironment","info","infoDebugger","warning","warningDebugger","event","eventDebugger","query","queryDebugger","command","commandDebugger","triggerSource","debug","extend","api","findVal","object","objKeys","objKey","DeepSearchResolver","ctx","canBeAccessed","result","safeEvaluate","obj","expression","fields","trim","map","field","fieldCount","fieldIndex","currentObj","FieldAccessResolver","mappedExpression","mapping","toString","isConfigDeclared","getConfigByName","configName","resolver","mappedResolver","String","setConfig","setMapping","observable","action","configMap","isSaveForLaterFeatureEnabled","itemMaxQuantity","orderMaxValue","orderSkuMaxLimit","currency","noOrdersRedirectUrl","features","ConfigRepository","refresh","configs","cacheKey","cacheTtlKey","cachedConfig","loadConfigFromCache","sessionStorage","configMangerApiSdk","storeInCache","setBuidConfig","setEcommConfig","ecommConfig","configMapping","configKey","configValue","buidConfig","Config","fromJSON","diContainer","isCacheable","getPrototypeOf","Storage","prototype","cacheData","shouldStoreData","parsedConfig","parse","ConfigMappings","routes","brand","signupEnabled","account_address_default_format","account_address_formats","checkout_show_terms_and_conditions","checkout_billing_address_default_format","checkout_billing_address_formats","checkout_allow_guest_user","payment_sources","complianceGdpr","ServiceStartedUseCase","execute","isCoreSite","Container","configJSON","register","ConfigManagerService","useCase","serviceStarter","ServiceManager"],"sourceRoot":""}