@nemme/js-sdk 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{client-CEykSZ2c.js → client-BPx3v4ob.js} +2 -2
- package/dist/chunks/{client-CEykSZ2c.js.map → client-BPx3v4ob.js.map} +1 -1
- package/dist/chunks/{client-DZJN73sh.js → client-DVvy_lUY.js} +2 -2
- package/dist/chunks/{client-DZJN73sh.js.map → client-DVvy_lUY.js.map} +1 -1
- package/dist/chunks/{form-manager-Dre89wMr.js → form-manager-CH-LT8Ck.js} +718 -718
- package/dist/chunks/{form-manager-Dre89wMr.js.map → form-manager-CH-LT8Ck.js.map} +1 -1
- package/dist/chunks/form-manager-DSnwY9Sd.js +12 -0
- package/dist/chunks/{form-manager-CdG9IzjD.js.map → form-manager-DSnwY9Sd.js.map} +1 -1
- package/dist/forms.cjs +1 -1
- package/dist/forms.esm.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +2 -2
- package/dist/nemme-sdk.umd.js +4 -4
- package/dist/nemme-sdk.umd.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.esm.js +13 -13
- package/dist/react.esm.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/form-manager-CdG9IzjD.js +0 -12
- package/dist/chunks/jsx-runtime-BubrbI3X.js +0 -2
- package/dist/chunks/jsx-runtime-BubrbI3X.js.map +0 -1
- package/dist/chunks/jsx-runtime-jIxVPx5o.js +0 -32
- package/dist/chunks/jsx-runtime-jIxVPx5o.js.map +0 -1
|
@@ -54,7 +54,7 @@ class f {
|
|
|
54
54
|
try {
|
|
55
55
|
const s = await this.createDeliveryResponse(e);
|
|
56
56
|
if (!this.formManager) {
|
|
57
|
-
const r = await import("./form-manager-
|
|
57
|
+
const r = await import("./form-manager-CH-LT8Ck.js").then((n) => n.f);
|
|
58
58
|
this.formManager = new r.FormManager(this.logger, this.headers, this.formConfig);
|
|
59
59
|
}
|
|
60
60
|
await this.formManager.fetchAndDisplayForm(
|
|
@@ -386,4 +386,4 @@ export {
|
|
|
386
386
|
p as N,
|
|
387
387
|
w as i
|
|
388
388
|
};
|
|
389
|
-
//# sourceMappingURL=client-
|
|
389
|
+
//# sourceMappingURL=client-BPx3v4ob.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-CEykSZ2c.js","sources":["../../src/deliveries/delivery-manager.ts","../../src/tracking/tracking-manager.ts","../../src/client.ts"],"sourcesContent":["import { httpClient } from '../networking';\nimport type { FormConfig } from '../types/forms';\nimport { Logger } from '../utils';\n\nexport type ProductType = 'FRM' | 'TRK';\n\nexport type Trigger = {\n triggerType: 'page_url' | 'custom_event';\n urlPattern?: string;\n eventKey?: string;\n};\n\nexport type Channel = {\n channelType: string;\n channelStyle: string;\n};\n\nexport type Audience = {\n audienceType: string;\n};\n\nexport type Frequency = {\n frequencyType: string;\n};\n\nexport type Delivery = {\n id: number;\n productSlug: string;\n productType: ProductType;\n triggers: Trigger[];\n // channels: Channel[];\n // audiences: Audience[];\n // frequency: Frequency| null;\n};\n\nexport type DeliveryResponse = {\n id: number;\n shownAt: string;\n wasDismissed: boolean;\n wasCompleted: boolean;\n userId: string;\n respondedAt: string;\n};\n\nexport type TriggerContext = {\n url: string;\n eventKey?: string;\n eventData?: Record<string, unknown>;\n};\n\nexport class DeliveryManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private formConfig?: FormConfig;\n private formManager?: {\n fetchAndDisplayForm: (\n productSlug: string,\n onDismiss: () => Promise<void>,\n onComplete: (formState?: unknown) => Promise<void>\n ) => Promise<void>;\n };\n private deliveries: Delivery[] = [];\n\n constructor(logger: Logger, headers: Record<string, string>, formConfig?: FormConfig) {\n this.logger = logger;\n this.headers = headers;\n this.formConfig = formConfig;\n }\n\n public async loadDeliveries(): Promise<void> {\n try {\n this.logger.debug('Loading deliveries');\n const response = await httpClient.get<Delivery[]>('/external/deliveries', { headers: this.headers });\n this.deliveries = response.data;\n this.logger.info(`Loaded ${this.deliveries.length} deliveries`);\n } catch (error) {\n this.logger.error('Failed to load deliveries', error);\n // Keep deliveries as empty array on failure\n this.deliveries = [];\n }\n }\n\n public async evaluateDeliveryTriggers(context: TriggerContext): Promise<void> {\n for (const delivery of this.deliveries) {\n for (const trigger of delivery.triggers) {\n if (this.shouldTriggerDelivery(trigger, context)) {\n const deliveryValid = await this.isDeliveryValid(delivery);\n if (!deliveryValid) {\n this.logger.debug(`Delivery ${delivery.id} is not valid, skipping`);\n continue;\n }\n await this.executeDelivery(delivery, trigger);\n return; // Stop after first match\n }\n }\n }\n }\n\n private shouldTriggerDelivery(trigger: Trigger, context: TriggerContext): boolean {\n if (this.hasActiveDelivery()) {\n return false;\n }\n switch (trigger.triggerType) {\n case 'page_url':\n return trigger.urlPattern ? this.matchesUrlPattern(context.url, trigger.urlPattern) : true;\n case 'custom_event':\n return trigger.eventKey ? context.eventKey === trigger.eventKey : false;\n default:\n return false;\n }\n }\n\n private hasActiveDelivery(): boolean {\n return document.getElementById('nm') !== null;\n }\n\n private async executeDelivery(delivery: Delivery, trigger: Trigger): Promise<void> {\n const productType = delivery.productType;\n if (productType === 'FRM') {\n this.logger.debug(`Triggering form delivery: ${delivery.productSlug}`, {\n triggerType: trigger.triggerType,\n urlPattern: trigger.urlPattern,\n eventKey: trigger.eventKey\n });\n\n try {\n const deliveryResponse = await this.createDeliveryResponse(delivery);\n if (!this.formManager) {\n const mod = await import('../forms/form-manager');\n this.formManager = new mod.FormManager(this.logger, this.headers, this.formConfig);\n }\n await this.formManager.fetchAndDisplayForm(\n delivery.productSlug,\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was cancelled`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, true);\n },\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was completed`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, false, true);\n }\n );\n } catch (error) {\n this.logger.error(`Failed to load form for delivery: ${delivery.productSlug}`, error);\n }\n }\n }\n\n private matchesUrlPattern(url: string, pattern: string): boolean {\n // Extract pathname from URL (remove protocol, host, query params, etc.)\n let pathname: string;\n try {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n } catch {\n // If URL parsing fails, assume it's already a pathname\n pathname = url.startsWith('/') ? url : `/${url}`;\n }\n\n // Normalize paths: remove trailing slash (except for root) and ensure leading slash\n const normalizePath = (p: string): string => {\n if (!p) return '/';\n let s = p.startsWith('/') ? p : `/${p}`;\n if (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s;\n };\n\n const normalizedPathname = normalizePath(pathname);\n const normalizedPattern = normalizePath(pattern);\n\n // Convert glob pattern to regex\n // * matches any characters except /\n // ** matches any characters including /\n const regexPattern = normalizedPattern\n .replace(/\\*\\*/g, '§DOUBLE_STAR§') // Temporary placeholder\n .replace(/\\*/g, '[^/]*') // Single * matches anything except /\n .replace(/§DOUBLE_STAR§/g, '.*') // ** matches anything including /\n .replace(/\\?/g, '.'); // ? matches single character\n\n const regex = new RegExp(`^${regexPattern}$`);\n const result = regex.test(normalizedPathname);\n\n this.logger.debug(`URL pattern matching`, {\n originalUrl: url,\n pathname,\n normalizedPathname,\n pattern,\n normalizedPattern,\n regexPattern,\n matches: result\n });\n\n return result;\n }\n\n private async createDeliveryResponse(delivery: Delivery): Promise<DeliveryResponse | undefined> {\n try {\n const response = await httpClient.post<DeliveryResponse>(\n `/external/deliveries/${delivery.id}/responses`,\n {},\n { headers: this.headers }\n );\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to create delivery response for delivery: ${delivery.id}`, error);\n }\n }\n\n private async updateDeliveryResponse(\n deliveryId: number,\n deliveryResponseId: number,\n dismissed: boolean = false,\n completed: boolean = false\n ): Promise<void> {\n try {\n await httpClient.patch(\n `/external/deliveries/${deliveryId}/responses/${deliveryResponseId}`,\n { wasDismissed: dismissed, wasCompleted: completed },\n { headers: this.headers }\n );\n } catch (error) {\n this.logger.error(`Failed to update delivery response: ${deliveryResponseId} for delivery: ${deliveryId}`, error);\n }\n }\n\n private async isDeliveryValid(delivery: Delivery): Promise<boolean> {\n try {\n const response = await httpClient.get<boolean>(`/external/deliveries/${delivery.id}/should-deliver`, {\n headers: this.headers\n });\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to get delivery should-deliver for delivery: ${delivery.id}`, error);\n return false;\n }\n }\n}\n","import { httpClient } from '../networking';\nimport { Logger } from '../utils';\n\nexport type Config = {\n logger: Logger;\n headers: Record<string, string>;\n sessionId: number;\n eventDefinitions: EventDefinition[];\n batchConfig?: boolean | BatchConfig;\n onPageView?: (url: string) => Promise<void>;\n onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n trackUrlParamChanges?: boolean;\n};\n\nexport type BatchConfig = {\n enabled?: boolean;\n size?: number;\n delayMs?: number;\n sendOnUnload?: boolean;\n};\n\nexport type TrackEventOptions<T extends string = string> = {\n eventKey: T;\n data?: Record<string, unknown>;\n};\n\ntype HistoryParams = Parameters<typeof history.pushState>;\n\ntype EventOptions = TrackEventOptions & {\n sessionId: number;\n timestamp: string;\n page: string;\n};\n\ntype EventProperties = {\n name: string;\n type: string;\n};\n\nexport type EventDefinition = {\n properties: EventProperties[];\n eventKey: string;\n};\n\n/**\n * Manages event tracking, batching, and page view tracking\n */\nexport class TrackingManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private sessionId?: number;\n private eventDefinitions: EventDefinition[] = [];\n private onPageView?: (url: string) => Promise<void>;\n private onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n private trackUrlParamChanges = true;\n\n // Batching\n private backlog: Array<EventOptions> = [];\n private flushTimeout: number | null = null;\n private batchConfig: Required<BatchConfig> = {\n enabled: true,\n size: 10,\n delayMs: 10000, // 10 seconds\n sendOnUnload: true\n };\n\n // Page view tracking\n private originalHistoryMethods: {\n pushState: typeof history.pushState;\n replaceState: typeof history.replaceState;\n } | null = null;\n\n private readonly EVENT_PAGE_VIEW = 'page_view';\n private lastTrackedPageKey?: string;\n\n constructor({\n logger,\n headers,\n sessionId,\n eventDefinitions,\n batchConfig,\n onPageView,\n onEvent,\n trackUrlParamChanges\n }: Config) {\n this.logger = logger;\n this.headers = headers;\n this.sessionId = sessionId;\n this.eventDefinitions = eventDefinitions;\n this.onPageView = onPageView;\n this.onEvent = onEvent;\n if (typeof trackUrlParamChanges === 'boolean') {\n this.trackUrlParamChanges = trackUrlParamChanges;\n }\n\n // Bind methods before setting up event listeners\n this.flushEvents = this.flushEvents.bind(this);\n this.handlePopState = this.handlePopState.bind(this);\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n\n this.setupBatching(batchConfig);\n }\n\n private setupBatching(batchConfig?: boolean | BatchConfig): void {\n if (typeof batchConfig === 'boolean') {\n this.batchConfig.enabled = batchConfig;\n } else if (batchConfig) {\n this.batchConfig = {\n ...this.batchConfig,\n ...batchConfig\n };\n }\n\n // Setup unload handler if batching is enabled\n if (this.batchConfig.enabled && this.batchConfig.sendOnUnload && typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this.flushEvents);\n window.addEventListener('pagehide', this.flushEvents);\n }\n }\n\n public async setupPageViewTracking(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n this.originalHistoryMethods = {\n pushState: history.pushState,\n replaceState: history.replaceState\n };\n\n const originalPushState = history.pushState;\n history.pushState = async (...args: HistoryParams) => {\n originalPushState.apply(history, args);\n await this.trackPageView();\n };\n\n const originalReplaceState = history.replaceState;\n history.replaceState = async (...args: HistoryParams) => {\n originalReplaceState.apply(history, args);\n await this.trackPageView();\n };\n\n window.addEventListener('popstate', this.handlePopState);\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.sessionId) {\n this.logger.warn('Tracking manager not initialized, cannot track event');\n return;\n }\n\n const { eventKey, data = {} } = options;\n this.logger.debug('Tracking event', { eventKey, data });\n const url = window.location.href;\n const event: EventOptions = {\n sessionId: this.sessionId,\n eventKey,\n data: data || {},\n timestamp: new Date().toISOString(),\n page: url\n };\n\n this.validateEvent(event);\n\n if (this.batchConfig.enabled) {\n this.backlog.push(event);\n this.scheduleFlush();\n } else {\n await this.sendEvents([event]);\n }\n\n if (eventKey === this.EVENT_PAGE_VIEW) {\n this.onPageView?.(window.location.href);\n } else {\n this.onEvent?.(event, url);\n }\n }\n\n public async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const url = window.location.href;\n\n if (!this.trackUrlParamChanges) {\n const currentPageKey = this.getPageKeyWithoutQuery(url);\n\n if (this.lastTrackedPageKey === currentPageKey) {\n return;\n }\n\n this.lastTrackedPageKey = currentPageKey;\n }\n\n await this.track({\n eventKey: this.EVENT_PAGE_VIEW,\n data: {\n title: document.title\n }\n });\n }\n\n private getPageKeyWithoutQuery(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}${parsed.hash}`;\n } catch {\n const [base] = url.split('?');\n return base;\n }\n }\n\n /**\n * Manually flush any pending events\n */\n public async flush(): Promise<void> {\n return this.flushEvents();\n }\n\n /**\n * Clean up event listeners and restore original history methods\n */\n public destroy(): void {\n if (this.originalHistoryMethods) {\n history.pushState = this.originalHistoryMethods.pushState;\n history.replaceState = this.originalHistoryMethods.replaceState;\n this.originalHistoryMethods = null;\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n window.removeEventListener('beforeunload', this.flushEvents);\n window.removeEventListener('pagehide', this.flushEvents);\n }\n\n // Clear any pending flush timeout\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n }\n\n private validateEvent(event: EventOptions): void {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return;\n\n const eventDefinition = this.eventDefinitions.find(def => def.eventKey === event.eventKey);\n if (!eventDefinition) {\n this.logger.warn(`Event ${event.eventKey} is not registered`);\n return;\n }\n\n const definedProperties = eventDefinition.properties;\n const eventProperties = event.data;\n if (!eventProperties) return;\n\n for (const eventPropertyKey of Object.keys(eventProperties)) {\n const eventProperty = eventProperties[eventPropertyKey];\n const definedProperty = definedProperties.find(prop => prop.name === eventPropertyKey);\n\n if (!definedProperty) {\n this.logger.warn(`Property ${eventPropertyKey} is not registered for event ${event.eventKey}`);\n return;\n }\n\n if (definedProperty.type === 'string' && typeof eventProperty !== 'string') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'boolean' && typeof eventProperty !== 'boolean') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'number' && typeof eventProperty !== 'number') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n }\n }\n\n private async handlePopState(): Promise<void> {\n await this.trackPageView();\n }\n\n private async handleVisibilityChange(): Promise<void> {\n if (document.visibilityState === 'visible') {\n await this.trackPageView();\n }\n }\n\n private scheduleFlush(): void {\n if (this.backlog.length >= this.batchConfig.size) {\n this.flushEvents();\n return;\n }\n\n if (!this.flushTimeout) {\n this.flushTimeout = window.setTimeout(() => {\n this.flushEvents();\n }, this.batchConfig.delayMs);\n }\n }\n\n private async flushEvents(): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n if (this.backlog.length === 0) return;\n\n const eventsToSend = [...this.backlog];\n this.backlog = [];\n\n try {\n await this.sendEvents(eventsToSend);\n } catch (error) {\n this.backlog.unshift(...eventsToSend);\n this.logger.error('Failed to send batched events', error);\n }\n }\n\n private async sendEvents(events: Array<EventOptions>): Promise<void> {\n if (events.length === 0) return;\n\n if (events.length === 1) {\n const event = events[0];\n await httpClient.post('/external/trackings/track', event, { headers: this.headers });\n } else {\n await httpClient.post('/external/trackings/batch', events, { headers: this.headers });\n }\n }\n}\n","import { DeliveryManager } from './deliveries/delivery-manager';\nimport { httpClient, HttpResponse } from './networking';\nimport { BatchConfig, EventDefinition, TrackEventOptions, TrackingManager } from './tracking/tracking-manager';\nimport { FormConfig } from './types/forms';\nimport { Logger, logger } from './utils';\n\nexport type ClientConfigType = {\n userIdentifier: string;\n debug?: boolean;\n batch?: boolean | BatchConfig;\n formConfig?: FormConfig;\n deactivate?: boolean;\n trackUrlParamChanges?: boolean;\n};\n\n// Re-export types for backward compatibility\nexport type { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';\n\ntype InitializeResponse = {\n sessionId: number;\n eventDefinitions: EventDefinition[];\n};\n\n/**\n * Main client class for the Nemme SDK\n * Coordinates initialization, tracking, and form management\n */\nexport class NemmeClient {\n clientKey: string;\n userIdentifier?: string;\n initialized = false;\n lastInitError: Error | null = null;\n clientLogger: Logger = logger.child('client');\n headers: Record<string, string> = {};\n formConfig?: FormConfig;\n\n constructor(clientKey: string) {\n this.clientKey = clientKey;\n }\n\n // Module managers\n private trackingManager?: TrackingManager;\n\n /**\n * Create a new Nemme SDK client instance\n */\n public async init({\n userIdentifier,\n debug = false,\n batch,\n formConfig,\n deactivate = false,\n trackUrlParamChanges\n }: ClientConfigType): Promise<NemmeClient> {\n this.initialized = false;\n this.lastInitError = null;\n this.trackingManager?.destroy();\n this.trackingManager = undefined;\n\n if (deactivate) {\n this.clientLogger.info('Nemme client deactivated and will stop initialization.');\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.configure({ enabled: false });\n return this;\n }\n if (!userIdentifier) throw new Error('userIdentifier is required parameter');\n this.userIdentifier = userIdentifier;\n\n // Configure logger based on debug setting\n this.clientLogger.configure({\n enabled: debug,\n level: debug ? 'debug' : 'info'\n });\n\n this.headers = {\n 'X-Client-Key': this.clientKey,\n 'X-User-Id': this.userIdentifier\n };\n\n this.formConfig = formConfig;\n\n try {\n const session = await this.initializeSession();\n await this.initializeManagers(session, batch, trackUrlParamChanges);\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.info('Nemme client initialized', {\n clientKey: this.clientKey,\n userIdentifier: this.userIdentifier\n });\n } catch (error) {\n this.clientLogger.error('Error during initialization:', error);\n this.initialized = false;\n this.lastInitError = error instanceof Error ? error : new Error('Error during initialization');\n }\n\n return this;\n }\n\n public async flush(): Promise<void> {\n return this.trackingManager?.flush();\n }\n\n public destroy(): void {\n this.trackingManager?.destroy();\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.initialized || !this.trackingManager) {\n this.clientLogger.warn('Nemme client not initialized, some operations may fail');\n return;\n }\n\n return this.trackingManager.track(options);\n }\n\n private async initializeSession(): Promise<InitializeResponse> {\n try {\n const response: HttpResponse<InitializeResponse> = await httpClient.post(\n '/external/trackings/initialize',\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n throw new Error(response.error?.message || 'Request for initialising session failed');\n }\n return response.data;\n } catch (error) {\n this.clientLogger.error('Error during initialization', error);\n throw error;\n }\n }\n\n private async initializeManagers(\n session: InitializeResponse,\n batchConfig?: boolean | BatchConfig,\n trackUrlParamChanges?: boolean\n ): Promise<void> {\n const deliveryManager = new DeliveryManager(this.clientLogger, this.headers, this.formConfig);\n const trackingManager = new TrackingManager({\n logger: this.clientLogger,\n headers: this.headers,\n sessionId: session.sessionId,\n eventDefinitions: session.eventDefinitions,\n batchConfig,\n trackUrlParamChanges,\n onPageView: async (url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ url });\n },\n onEvent: async (event: TrackEventOptions, url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ eventKey: event.eventKey, eventData: event.data, url });\n }\n });\n\n await deliveryManager.loadDeliveries();\n\n if (typeof window !== 'undefined') {\n await trackingManager.setupPageViewTracking();\n await trackingManager.trackPageView();\n await trackingManager.flush();\n }\n\n this.trackingManager = trackingManager;\n }\n}\n\nexport const initAsModule = (clientKey: string) => new NemmeClient(clientKey);\n"],"names":["DeliveryManager","logger","headers","formConfig","response","httpClient","error","context","delivery","trigger","deliveryResponse","mod","url","pattern","pathname","normalizePath","p","s","normalizedPathname","normalizedPattern","regexPattern","result","deliveryId","deliveryResponseId","dismissed","completed","TrackingManager","sessionId","eventDefinitions","batchConfig","onPageView","onEvent","trackUrlParamChanges","originalPushState","args","originalReplaceState","options","eventKey","data","event","currentPageKey","parsed","base","eventDefinition","def","definedProperties","eventProperties","eventPropertyKey","eventProperty","definedProperty","prop","eventsToSend","events","NemmeClient","clientKey","userIdentifier","debug","batch","deactivate","session","deliveryManager","trackingManager","initAsModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client-BPx3v4ob.js","sources":["../../src/deliveries/delivery-manager.ts","../../src/tracking/tracking-manager.ts","../../src/client.ts"],"sourcesContent":["import { httpClient } from '../networking';\nimport type { FormConfig } from '../types/forms';\nimport { Logger } from '../utils';\n\nexport type ProductType = 'FRM' | 'TRK';\n\nexport type Trigger = {\n triggerType: 'page_url' | 'custom_event';\n urlPattern?: string;\n eventKey?: string;\n};\n\nexport type Channel = {\n channelType: string;\n channelStyle: string;\n};\n\nexport type Audience = {\n audienceType: string;\n};\n\nexport type Frequency = {\n frequencyType: string;\n};\n\nexport type Delivery = {\n id: number;\n productSlug: string;\n productType: ProductType;\n triggers: Trigger[];\n // channels: Channel[];\n // audiences: Audience[];\n // frequency: Frequency| null;\n};\n\nexport type DeliveryResponse = {\n id: number;\n shownAt: string;\n wasDismissed: boolean;\n wasCompleted: boolean;\n userId: string;\n respondedAt: string;\n};\n\nexport type TriggerContext = {\n url: string;\n eventKey?: string;\n eventData?: Record<string, unknown>;\n};\n\nexport class DeliveryManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private formConfig?: FormConfig;\n private formManager?: {\n fetchAndDisplayForm: (\n productSlug: string,\n onDismiss: () => Promise<void>,\n onComplete: (formState?: unknown) => Promise<void>\n ) => Promise<void>;\n };\n private deliveries: Delivery[] = [];\n\n constructor(logger: Logger, headers: Record<string, string>, formConfig?: FormConfig) {\n this.logger = logger;\n this.headers = headers;\n this.formConfig = formConfig;\n }\n\n public async loadDeliveries(): Promise<void> {\n try {\n this.logger.debug('Loading deliveries');\n const response = await httpClient.get<Delivery[]>('/external/deliveries', { headers: this.headers });\n this.deliveries = response.data;\n this.logger.info(`Loaded ${this.deliveries.length} deliveries`);\n } catch (error) {\n this.logger.error('Failed to load deliveries', error);\n // Keep deliveries as empty array on failure\n this.deliveries = [];\n }\n }\n\n public async evaluateDeliveryTriggers(context: TriggerContext): Promise<void> {\n for (const delivery of this.deliveries) {\n for (const trigger of delivery.triggers) {\n if (this.shouldTriggerDelivery(trigger, context)) {\n const deliveryValid = await this.isDeliveryValid(delivery);\n if (!deliveryValid) {\n this.logger.debug(`Delivery ${delivery.id} is not valid, skipping`);\n continue;\n }\n await this.executeDelivery(delivery, trigger);\n return; // Stop after first match\n }\n }\n }\n }\n\n private shouldTriggerDelivery(trigger: Trigger, context: TriggerContext): boolean {\n if (this.hasActiveDelivery()) {\n return false;\n }\n switch (trigger.triggerType) {\n case 'page_url':\n return trigger.urlPattern ? this.matchesUrlPattern(context.url, trigger.urlPattern) : true;\n case 'custom_event':\n return trigger.eventKey ? context.eventKey === trigger.eventKey : false;\n default:\n return false;\n }\n }\n\n private hasActiveDelivery(): boolean {\n return document.getElementById('nm') !== null;\n }\n\n private async executeDelivery(delivery: Delivery, trigger: Trigger): Promise<void> {\n const productType = delivery.productType;\n if (productType === 'FRM') {\n this.logger.debug(`Triggering form delivery: ${delivery.productSlug}`, {\n triggerType: trigger.triggerType,\n urlPattern: trigger.urlPattern,\n eventKey: trigger.eventKey\n });\n\n try {\n const deliveryResponse = await this.createDeliveryResponse(delivery);\n if (!this.formManager) {\n const mod = await import('../forms/form-manager');\n this.formManager = new mod.FormManager(this.logger, this.headers, this.formConfig);\n }\n await this.formManager.fetchAndDisplayForm(\n delivery.productSlug,\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was cancelled`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, true);\n },\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was completed`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, false, true);\n }\n );\n } catch (error) {\n this.logger.error(`Failed to load form for delivery: ${delivery.productSlug}`, error);\n }\n }\n }\n\n private matchesUrlPattern(url: string, pattern: string): boolean {\n // Extract pathname from URL (remove protocol, host, query params, etc.)\n let pathname: string;\n try {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n } catch {\n // If URL parsing fails, assume it's already a pathname\n pathname = url.startsWith('/') ? url : `/${url}`;\n }\n\n // Normalize paths: remove trailing slash (except for root) and ensure leading slash\n const normalizePath = (p: string): string => {\n if (!p) return '/';\n let s = p.startsWith('/') ? p : `/${p}`;\n if (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s;\n };\n\n const normalizedPathname = normalizePath(pathname);\n const normalizedPattern = normalizePath(pattern);\n\n // Convert glob pattern to regex\n // * matches any characters except /\n // ** matches any characters including /\n const regexPattern = normalizedPattern\n .replace(/\\*\\*/g, '§DOUBLE_STAR§') // Temporary placeholder\n .replace(/\\*/g, '[^/]*') // Single * matches anything except /\n .replace(/§DOUBLE_STAR§/g, '.*') // ** matches anything including /\n .replace(/\\?/g, '.'); // ? matches single character\n\n const regex = new RegExp(`^${regexPattern}$`);\n const result = regex.test(normalizedPathname);\n\n this.logger.debug(`URL pattern matching`, {\n originalUrl: url,\n pathname,\n normalizedPathname,\n pattern,\n normalizedPattern,\n regexPattern,\n matches: result\n });\n\n return result;\n }\n\n private async createDeliveryResponse(delivery: Delivery): Promise<DeliveryResponse | undefined> {\n try {\n const response = await httpClient.post<DeliveryResponse>(\n `/external/deliveries/${delivery.id}/responses`,\n {},\n { headers: this.headers }\n );\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to create delivery response for delivery: ${delivery.id}`, error);\n }\n }\n\n private async updateDeliveryResponse(\n deliveryId: number,\n deliveryResponseId: number,\n dismissed: boolean = false,\n completed: boolean = false\n ): Promise<void> {\n try {\n await httpClient.patch(\n `/external/deliveries/${deliveryId}/responses/${deliveryResponseId}`,\n { wasDismissed: dismissed, wasCompleted: completed },\n { headers: this.headers }\n );\n } catch (error) {\n this.logger.error(`Failed to update delivery response: ${deliveryResponseId} for delivery: ${deliveryId}`, error);\n }\n }\n\n private async isDeliveryValid(delivery: Delivery): Promise<boolean> {\n try {\n const response = await httpClient.get<boolean>(`/external/deliveries/${delivery.id}/should-deliver`, {\n headers: this.headers\n });\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to get delivery should-deliver for delivery: ${delivery.id}`, error);\n return false;\n }\n }\n}\n","import { httpClient } from '../networking';\nimport { Logger } from '../utils';\n\nexport type Config = {\n logger: Logger;\n headers: Record<string, string>;\n sessionId: number;\n eventDefinitions: EventDefinition[];\n batchConfig?: boolean | BatchConfig;\n onPageView?: (url: string) => Promise<void>;\n onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n trackUrlParamChanges?: boolean;\n};\n\nexport type BatchConfig = {\n enabled?: boolean;\n size?: number;\n delayMs?: number;\n sendOnUnload?: boolean;\n};\n\nexport type TrackEventOptions<T extends string = string> = {\n eventKey: T;\n data?: Record<string, unknown>;\n};\n\ntype HistoryParams = Parameters<typeof history.pushState>;\n\ntype EventOptions = TrackEventOptions & {\n sessionId: number;\n timestamp: string;\n page: string;\n};\n\ntype EventProperties = {\n name: string;\n type: string;\n};\n\nexport type EventDefinition = {\n properties: EventProperties[];\n eventKey: string;\n};\n\n/**\n * Manages event tracking, batching, and page view tracking\n */\nexport class TrackingManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private sessionId?: number;\n private eventDefinitions: EventDefinition[] = [];\n private onPageView?: (url: string) => Promise<void>;\n private onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n private trackUrlParamChanges = true;\n\n // Batching\n private backlog: Array<EventOptions> = [];\n private flushTimeout: number | null = null;\n private batchConfig: Required<BatchConfig> = {\n enabled: true,\n size: 10,\n delayMs: 10000, // 10 seconds\n sendOnUnload: true\n };\n\n // Page view tracking\n private originalHistoryMethods: {\n pushState: typeof history.pushState;\n replaceState: typeof history.replaceState;\n } | null = null;\n\n private readonly EVENT_PAGE_VIEW = 'page_view';\n private lastTrackedPageKey?: string;\n\n constructor({\n logger,\n headers,\n sessionId,\n eventDefinitions,\n batchConfig,\n onPageView,\n onEvent,\n trackUrlParamChanges\n }: Config) {\n this.logger = logger;\n this.headers = headers;\n this.sessionId = sessionId;\n this.eventDefinitions = eventDefinitions;\n this.onPageView = onPageView;\n this.onEvent = onEvent;\n if (typeof trackUrlParamChanges === 'boolean') {\n this.trackUrlParamChanges = trackUrlParamChanges;\n }\n\n // Bind methods before setting up event listeners\n this.flushEvents = this.flushEvents.bind(this);\n this.handlePopState = this.handlePopState.bind(this);\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n\n this.setupBatching(batchConfig);\n }\n\n private setupBatching(batchConfig?: boolean | BatchConfig): void {\n if (typeof batchConfig === 'boolean') {\n this.batchConfig.enabled = batchConfig;\n } else if (batchConfig) {\n this.batchConfig = {\n ...this.batchConfig,\n ...batchConfig\n };\n }\n\n // Setup unload handler if batching is enabled\n if (this.batchConfig.enabled && this.batchConfig.sendOnUnload && typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this.flushEvents);\n window.addEventListener('pagehide', this.flushEvents);\n }\n }\n\n public async setupPageViewTracking(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n this.originalHistoryMethods = {\n pushState: history.pushState,\n replaceState: history.replaceState\n };\n\n const originalPushState = history.pushState;\n history.pushState = async (...args: HistoryParams) => {\n originalPushState.apply(history, args);\n await this.trackPageView();\n };\n\n const originalReplaceState = history.replaceState;\n history.replaceState = async (...args: HistoryParams) => {\n originalReplaceState.apply(history, args);\n await this.trackPageView();\n };\n\n window.addEventListener('popstate', this.handlePopState);\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.sessionId) {\n this.logger.warn('Tracking manager not initialized, cannot track event');\n return;\n }\n\n const { eventKey, data = {} } = options;\n this.logger.debug('Tracking event', { eventKey, data });\n const url = window.location.href;\n const event: EventOptions = {\n sessionId: this.sessionId,\n eventKey,\n data: data || {},\n timestamp: new Date().toISOString(),\n page: url\n };\n\n this.validateEvent(event);\n\n if (this.batchConfig.enabled) {\n this.backlog.push(event);\n this.scheduleFlush();\n } else {\n await this.sendEvents([event]);\n }\n\n if (eventKey === this.EVENT_PAGE_VIEW) {\n this.onPageView?.(window.location.href);\n } else {\n this.onEvent?.(event, url);\n }\n }\n\n public async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const url = window.location.href;\n\n if (!this.trackUrlParamChanges) {\n const currentPageKey = this.getPageKeyWithoutQuery(url);\n\n if (this.lastTrackedPageKey === currentPageKey) {\n return;\n }\n\n this.lastTrackedPageKey = currentPageKey;\n }\n\n await this.track({\n eventKey: this.EVENT_PAGE_VIEW,\n data: {\n title: document.title\n }\n });\n }\n\n private getPageKeyWithoutQuery(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}${parsed.hash}`;\n } catch {\n const [base] = url.split('?');\n return base;\n }\n }\n\n /**\n * Manually flush any pending events\n */\n public async flush(): Promise<void> {\n return this.flushEvents();\n }\n\n /**\n * Clean up event listeners and restore original history methods\n */\n public destroy(): void {\n if (this.originalHistoryMethods) {\n history.pushState = this.originalHistoryMethods.pushState;\n history.replaceState = this.originalHistoryMethods.replaceState;\n this.originalHistoryMethods = null;\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n window.removeEventListener('beforeunload', this.flushEvents);\n window.removeEventListener('pagehide', this.flushEvents);\n }\n\n // Clear any pending flush timeout\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n }\n\n private validateEvent(event: EventOptions): void {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return;\n\n const eventDefinition = this.eventDefinitions.find(def => def.eventKey === event.eventKey);\n if (!eventDefinition) {\n this.logger.warn(`Event ${event.eventKey} is not registered`);\n return;\n }\n\n const definedProperties = eventDefinition.properties;\n const eventProperties = event.data;\n if (!eventProperties) return;\n\n for (const eventPropertyKey of Object.keys(eventProperties)) {\n const eventProperty = eventProperties[eventPropertyKey];\n const definedProperty = definedProperties.find(prop => prop.name === eventPropertyKey);\n\n if (!definedProperty) {\n this.logger.warn(`Property ${eventPropertyKey} is not registered for event ${event.eventKey}`);\n return;\n }\n\n if (definedProperty.type === 'string' && typeof eventProperty !== 'string') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'boolean' && typeof eventProperty !== 'boolean') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'number' && typeof eventProperty !== 'number') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n }\n }\n\n private async handlePopState(): Promise<void> {\n await this.trackPageView();\n }\n\n private async handleVisibilityChange(): Promise<void> {\n if (document.visibilityState === 'visible') {\n await this.trackPageView();\n }\n }\n\n private scheduleFlush(): void {\n if (this.backlog.length >= this.batchConfig.size) {\n this.flushEvents();\n return;\n }\n\n if (!this.flushTimeout) {\n this.flushTimeout = window.setTimeout(() => {\n this.flushEvents();\n }, this.batchConfig.delayMs);\n }\n }\n\n private async flushEvents(): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n if (this.backlog.length === 0) return;\n\n const eventsToSend = [...this.backlog];\n this.backlog = [];\n\n try {\n await this.sendEvents(eventsToSend);\n } catch (error) {\n this.backlog.unshift(...eventsToSend);\n this.logger.error('Failed to send batched events', error);\n }\n }\n\n private async sendEvents(events: Array<EventOptions>): Promise<void> {\n if (events.length === 0) return;\n\n if (events.length === 1) {\n const event = events[0];\n await httpClient.post('/external/trackings/track', event, { headers: this.headers });\n } else {\n await httpClient.post('/external/trackings/batch', events, { headers: this.headers });\n }\n }\n}\n","import { DeliveryManager } from './deliveries/delivery-manager';\nimport { httpClient, HttpResponse } from './networking';\nimport { BatchConfig, EventDefinition, TrackEventOptions, TrackingManager } from './tracking/tracking-manager';\nimport { FormConfig } from './types/forms';\nimport { Logger, logger } from './utils';\n\nexport type ClientConfigType = {\n userIdentifier: string;\n debug?: boolean;\n batch?: boolean | BatchConfig;\n formConfig?: FormConfig;\n deactivate?: boolean;\n trackUrlParamChanges?: boolean;\n};\n\n// Re-export types for backward compatibility\nexport type { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';\n\ntype InitializeResponse = {\n sessionId: number;\n eventDefinitions: EventDefinition[];\n};\n\n/**\n * Main client class for the Nemme SDK\n * Coordinates initialization, tracking, and form management\n */\nexport class NemmeClient {\n clientKey: string;\n userIdentifier?: string;\n initialized = false;\n lastInitError: Error | null = null;\n clientLogger: Logger = logger.child('client');\n headers: Record<string, string> = {};\n formConfig?: FormConfig;\n\n constructor(clientKey: string) {\n this.clientKey = clientKey;\n }\n\n // Module managers\n private trackingManager?: TrackingManager;\n\n /**\n * Create a new Nemme SDK client instance\n */\n public async init({\n userIdentifier,\n debug = false,\n batch,\n formConfig,\n deactivate = false,\n trackUrlParamChanges\n }: ClientConfigType): Promise<NemmeClient> {\n this.initialized = false;\n this.lastInitError = null;\n this.trackingManager?.destroy();\n this.trackingManager = undefined;\n\n if (deactivate) {\n this.clientLogger.info('Nemme client deactivated and will stop initialization.');\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.configure({ enabled: false });\n return this;\n }\n if (!userIdentifier) throw new Error('userIdentifier is required parameter');\n this.userIdentifier = userIdentifier;\n\n // Configure logger based on debug setting\n this.clientLogger.configure({\n enabled: debug,\n level: debug ? 'debug' : 'info'\n });\n\n this.headers = {\n 'X-Client-Key': this.clientKey,\n 'X-User-Id': this.userIdentifier\n };\n\n this.formConfig = formConfig;\n\n try {\n const session = await this.initializeSession();\n await this.initializeManagers(session, batch, trackUrlParamChanges);\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.info('Nemme client initialized', {\n clientKey: this.clientKey,\n userIdentifier: this.userIdentifier\n });\n } catch (error) {\n this.clientLogger.error('Error during initialization:', error);\n this.initialized = false;\n this.lastInitError = error instanceof Error ? error : new Error('Error during initialization');\n }\n\n return this;\n }\n\n public async flush(): Promise<void> {\n return this.trackingManager?.flush();\n }\n\n public destroy(): void {\n this.trackingManager?.destroy();\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.initialized || !this.trackingManager) {\n this.clientLogger.warn('Nemme client not initialized, some operations may fail');\n return;\n }\n\n return this.trackingManager.track(options);\n }\n\n private async initializeSession(): Promise<InitializeResponse> {\n try {\n const response: HttpResponse<InitializeResponse> = await httpClient.post(\n '/external/trackings/initialize',\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n throw new Error(response.error?.message || 'Request for initialising session failed');\n }\n return response.data;\n } catch (error) {\n this.clientLogger.error('Error during initialization', error);\n throw error;\n }\n }\n\n private async initializeManagers(\n session: InitializeResponse,\n batchConfig?: boolean | BatchConfig,\n trackUrlParamChanges?: boolean\n ): Promise<void> {\n const deliveryManager = new DeliveryManager(this.clientLogger, this.headers, this.formConfig);\n const trackingManager = new TrackingManager({\n logger: this.clientLogger,\n headers: this.headers,\n sessionId: session.sessionId,\n eventDefinitions: session.eventDefinitions,\n batchConfig,\n trackUrlParamChanges,\n onPageView: async (url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ url });\n },\n onEvent: async (event: TrackEventOptions, url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ eventKey: event.eventKey, eventData: event.data, url });\n }\n });\n\n await deliveryManager.loadDeliveries();\n\n if (typeof window !== 'undefined') {\n await trackingManager.setupPageViewTracking();\n await trackingManager.trackPageView();\n await trackingManager.flush();\n }\n\n this.trackingManager = trackingManager;\n }\n}\n\nexport const initAsModule = (clientKey: string) => new NemmeClient(clientKey);\n"],"names":["DeliveryManager","logger","headers","formConfig","response","httpClient","error","context","delivery","trigger","deliveryResponse","mod","url","pattern","pathname","normalizePath","p","s","normalizedPathname","normalizedPattern","regexPattern","result","deliveryId","deliveryResponseId","dismissed","completed","TrackingManager","sessionId","eventDefinitions","batchConfig","onPageView","onEvent","trackUrlParamChanges","originalPushState","args","originalReplaceState","options","eventKey","data","event","currentPageKey","parsed","base","eventDefinition","def","definedProperties","eventProperties","eventPropertyKey","eventProperty","definedProperty","prop","eventsToSend","events","NemmeClient","clientKey","userIdentifier","debug","batch","deactivate","session","deliveryManager","trackingManager","initAsModule"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const o=require("./httpClient-hrn9Ffa2.js");class f{logger;headers;formConfig;formManager;deliveries=[];constructor(e,t,i){this.logger=e,this.headers=t,this.formConfig=i}async loadDeliveries(){try{this.logger.debug("Loading deliveries");const e=await o.httpClient.get("/external/deliveries",{headers:this.headers});this.deliveries=e.data,this.logger.info(`Loaded ${this.deliveries.length} deliveries`)}catch(e){this.logger.error("Failed to load deliveries",e),this.deliveries=[]}}async evaluateDeliveryTriggers(e){for(const t of this.deliveries)for(const i of t.triggers)if(this.shouldTriggerDelivery(i,e)){if(!await this.isDeliveryValid(t)){this.logger.debug(`Delivery ${t.id} is not valid, skipping`);continue}await this.executeDelivery(t,i);return}}shouldTriggerDelivery(e,t){if(this.hasActiveDelivery())return!1;switch(e.triggerType){case"page_url":return e.urlPattern?this.matchesUrlPattern(t.url,e.urlPattern):!0;case"custom_event":return e.eventKey?t.eventKey===e.eventKey:!1;default:return!1}}hasActiveDelivery(){return document.getElementById("nm")!==null}async executeDelivery(e,t){if(e.productType==="FRM"){this.logger.debug(`Triggering form delivery: ${e.productSlug}`,{triggerType:t.triggerType,urlPattern:t.urlPattern,eventKey:t.eventKey});try{const s=await this.createDeliveryResponse(e);if(!this.formManager){const r=await Promise.resolve().then(()=>require("./form-manager-CdG9IzjD.js")).then(a=>a.formManager);this.formManager=new r.FormManager(this.logger,this.headers,this.formConfig)}await this.formManager.fetchAndDisplayForm(e.productSlug,async()=>{this.logger.debug(`Form for delivery: ${e.productSlug} was cancelled`),s&&await this.updateDeliveryResponse(e.id,s.id,!0)},async()=>{this.logger.debug(`Form for delivery: ${e.productSlug} was completed`),s&&await this.updateDeliveryResponse(e.id,s.id,!1,!0)})}catch(s){this.logger.error(`Failed to load form for delivery: ${e.productSlug}`,s)}}}matchesUrlPattern(e,t){let i;try{i=new URL(e).pathname}catch{i=e.startsWith("/")?e:`/${e}`}const s=h=>{if(!h)return"/";let d=h.startsWith("/")?h:`/${h}`;return d.length>1&&d.endsWith("/")&&(d=d.slice(0,-1)),d},r=s(i),a=s(t),n=a.replace(/\*\*/g,"§DOUBLE_STAR§").replace(/\*/g,"[^/]*").replace(/§DOUBLE_STAR§/g,".*").replace(/\?/g,"."),c=new RegExp(`^${n}$`).test(r);return this.logger.debug("URL pattern matching",{originalUrl:e,pathname:i,normalizedPathname:r,pattern:t,normalizedPattern:a,regexPattern:n,matches:c}),c}async createDeliveryResponse(e){try{return(await o.httpClient.post(`/external/deliveries/${e.id}/responses`,{},{headers:this.headers})).data}catch(t){this.logger.error(`Failed to create delivery response for delivery: ${e.id}`,t)}}async updateDeliveryResponse(e,t,i=!1,s=!1){try{await o.httpClient.patch(`/external/deliveries/${e}/responses/${t}`,{wasDismissed:i,wasCompleted:s},{headers:this.headers})}catch(r){this.logger.error(`Failed to update delivery response: ${t} for delivery: ${e}`,r)}}async isDeliveryValid(e){try{return(await o.httpClient.get(`/external/deliveries/${e.id}/should-deliver`,{headers:this.headers})).data}catch(t){return this.logger.error(`Failed to get delivery should-deliver for delivery: ${e.id}`,t),!1}}}class y{logger;headers;sessionId;eventDefinitions=[];onPageView;onEvent;trackUrlParamChanges=!0;backlog=[];flushTimeout=null;batchConfig={enabled:!0,size:10,delayMs:1e4,sendOnUnload:!0};originalHistoryMethods=null;EVENT_PAGE_VIEW="page_view";lastTrackedPageKey;constructor({logger:e,headers:t,sessionId:i,eventDefinitions:s,batchConfig:r,onPageView:a,onEvent:n,trackUrlParamChanges:l}){this.logger=e,this.headers=t,this.sessionId=i,this.eventDefinitions=s,this.onPageView=a,this.onEvent=n,typeof l=="boolean"&&(this.trackUrlParamChanges=l),this.flushEvents=this.flushEvents.bind(this),this.handlePopState=this.handlePopState.bind(this),this.handleVisibilityChange=this.handleVisibilityChange.bind(this),this.setupBatching(r)}setupBatching(e){typeof e=="boolean"?this.batchConfig.enabled=e:e&&(this.batchConfig={...this.batchConfig,...e}),this.batchConfig.enabled&&this.batchConfig.sendOnUnload&&typeof window<"u"&&(window.addEventListener("beforeunload",this.flushEvents),window.addEventListener("pagehide",this.flushEvents))}async setupPageViewTracking(){if(typeof window>"u")return;this.originalHistoryMethods={pushState:history.pushState,replaceState:history.replaceState};const e=history.pushState;history.pushState=async(...i)=>{e.apply(history,i),await this.trackPageView()};const t=history.replaceState;history.replaceState=async(...i)=>{t.apply(history,i),await this.trackPageView()},window.addEventListener("popstate",this.handlePopState),document.addEventListener("visibilitychange",this.handleVisibilityChange)}async track(e){if(!this.sessionId){this.logger.warn("Tracking manager not initialized, cannot track event");return}const{eventKey:t,data:i={}}=e;this.logger.debug("Tracking event",{eventKey:t,data:i});const s=window.location.href,r={sessionId:this.sessionId,eventKey:t,data:i||{},timestamp:new Date().toISOString(),page:s};this.validateEvent(r),this.batchConfig.enabled?(this.backlog.push(r),this.scheduleFlush()):await this.sendEvents([r]),t===this.EVENT_PAGE_VIEW?this.onPageView?.(window.location.href):this.onEvent?.(r,s)}async trackPageView(){if(typeof window>"u")return;const e=window.location.href;if(!this.trackUrlParamChanges){const t=this.getPageKeyWithoutQuery(e);if(this.lastTrackedPageKey===t)return;this.lastTrackedPageKey=t}await this.track({eventKey:this.EVENT_PAGE_VIEW,data:{title:document.title}})}getPageKeyWithoutQuery(e){try{const t=new URL(e);return`${t.origin}${t.pathname}${t.hash}`}catch{const[t]=e.split("?");return t}}async flush(){return this.flushEvents()}destroy(){this.originalHistoryMethods&&(history.pushState=this.originalHistoryMethods.pushState,history.replaceState=this.originalHistoryMethods.replaceState,this.originalHistoryMethods=null),typeof window<"u"&&(window.removeEventListener("popstate",this.handlePopState),document.removeEventListener("visibilitychange",this.handleVisibilityChange),window.removeEventListener("beforeunload",this.flushEvents),window.removeEventListener("pagehide",this.flushEvents)),this.flushTimeout&&(clearTimeout(this.flushTimeout),this.flushTimeout=null)}validateEvent(e){if(e.eventKey===this.EVENT_PAGE_VIEW)return;const t=this.eventDefinitions.find(r=>r.eventKey===e.eventKey);if(!t){this.logger.warn(`Event ${e.eventKey} is not registered`);return}const i=t.properties,s=e.data;if(s)for(const r of Object.keys(s)){const a=s[r],n=i.find(l=>l.name===r);if(!n){this.logger.warn(`Property ${r} is not registered for event ${e.eventKey}`);return}n.type==="string"&&typeof a!="string"&&this.logger.warn(`Property ${n.name} has type ${n.type} but value is of type ${typeof a}`),n.type==="boolean"&&typeof a!="boolean"&&this.logger.warn(`Property ${n.name} has type ${n.type} but value is of type ${typeof a}`),n.type==="number"&&typeof a!="number"&&this.logger.warn(`Property ${n.name} has type ${n.type} but value is of type ${typeof a}`)}}async handlePopState(){await this.trackPageView()}async handleVisibilityChange(){document.visibilityState==="visible"&&await this.trackPageView()}scheduleFlush(){if(this.backlog.length>=this.batchConfig.size){this.flushEvents();return}this.flushTimeout||(this.flushTimeout=window.setTimeout(()=>{this.flushEvents()},this.batchConfig.delayMs))}async flushEvents(){if(this.flushTimeout&&(clearTimeout(this.flushTimeout),this.flushTimeout=null),this.backlog.length===0)return;const e=[...this.backlog];this.backlog=[];try{await this.sendEvents(e)}catch(t){this.backlog.unshift(...e),this.logger.error("Failed to send batched events",t)}}async sendEvents(e){if(e.length!==0)if(e.length===1){const t=e[0];await o.httpClient.post("/external/trackings/track",t,{headers:this.headers})}else await o.httpClient.post("/external/trackings/batch",e,{headers:this.headers})}}class u{clientKey;userIdentifier;initialized=!1;lastInitError=null;clientLogger=o.logger.child("client");headers={};formConfig;constructor(e){this.clientKey=e}trackingManager;async init({userIdentifier:e,debug:t=!1,batch:i,formConfig:s,deactivate:r=!1,trackUrlParamChanges:a}){if(this.initialized=!1,this.lastInitError=null,this.trackingManager?.destroy(),this.trackingManager=void 0,r)return this.clientLogger.info("Nemme client deactivated and will stop initialization."),this.initialized=!0,this.lastInitError=null,this.clientLogger.configure({enabled:!1}),this;if(!e)throw new Error("userIdentifier is required parameter");this.userIdentifier=e,this.clientLogger.configure({enabled:t,level:t?"debug":"info"}),this.headers={"X-Client-Key":this.clientKey,"X-User-Id":this.userIdentifier},this.formConfig=s;try{const n=await this.initializeSession();await this.initializeManagers(n,i,a),this.initialized=!0,this.lastInitError=null,this.clientLogger.info("Nemme client initialized",{clientKey:this.clientKey,userIdentifier:this.userIdentifier})}catch(n){this.clientLogger.error("Error during initialization:",n),this.initialized=!1,this.lastInitError=n instanceof Error?n:new Error("Error during initialization")}return this}async flush(){return this.trackingManager?.flush()}destroy(){this.trackingManager?.destroy()}async track(e){if(!this.initialized||!this.trackingManager){this.clientLogger.warn("Nemme client not initialized, some operations may fail");return}return this.trackingManager.track(e)}async initializeSession(){try{const e=await o.httpClient.post("/external/trackings/initialize",{},{headers:this.headers});if(!e.ok)throw new Error(e.error?.message||"Request for initialising session failed");return e.data}catch(e){throw this.clientLogger.error("Error during initialization",e),e}}async initializeManagers(e,t,i){const s=new f(this.clientLogger,this.headers,this.formConfig),r=new y({logger:this.clientLogger,headers:this.headers,sessionId:e.sessionId,eventDefinitions:e.eventDefinitions,batchConfig:t,trackUrlParamChanges:i,onPageView:async a=>{await s.evaluateDeliveryTriggers({url:a})},onEvent:async(a,n)=>{await s.evaluateDeliveryTriggers({eventKey:a.eventKey,eventData:a.data,url:n})}});await s.loadDeliveries(),typeof window<"u"&&(await r.setupPageViewTracking(),await r.trackPageView(),await r.flush()),this.trackingManager=r}}const p=g=>new u(g);exports.NemmeClient=u;exports.initAsModule=p;
|
|
2
|
-
//# sourceMappingURL=client-
|
|
1
|
+
"use strict";const o=require("./httpClient-hrn9Ffa2.js");class f{logger;headers;formConfig;formManager;deliveries=[];constructor(e,t,i){this.logger=e,this.headers=t,this.formConfig=i}async loadDeliveries(){try{this.logger.debug("Loading deliveries");const e=await o.httpClient.get("/external/deliveries",{headers:this.headers});this.deliveries=e.data,this.logger.info(`Loaded ${this.deliveries.length} deliveries`)}catch(e){this.logger.error("Failed to load deliveries",e),this.deliveries=[]}}async evaluateDeliveryTriggers(e){for(const t of this.deliveries)for(const i of t.triggers)if(this.shouldTriggerDelivery(i,e)){if(!await this.isDeliveryValid(t)){this.logger.debug(`Delivery ${t.id} is not valid, skipping`);continue}await this.executeDelivery(t,i);return}}shouldTriggerDelivery(e,t){if(this.hasActiveDelivery())return!1;switch(e.triggerType){case"page_url":return e.urlPattern?this.matchesUrlPattern(t.url,e.urlPattern):!0;case"custom_event":return e.eventKey?t.eventKey===e.eventKey:!1;default:return!1}}hasActiveDelivery(){return document.getElementById("nm")!==null}async executeDelivery(e,t){if(e.productType==="FRM"){this.logger.debug(`Triggering form delivery: ${e.productSlug}`,{triggerType:t.triggerType,urlPattern:t.urlPattern,eventKey:t.eventKey});try{const s=await this.createDeliveryResponse(e);if(!this.formManager){const r=await Promise.resolve().then(()=>require("./form-manager-DSnwY9Sd.js")).then(a=>a.formManager);this.formManager=new r.FormManager(this.logger,this.headers,this.formConfig)}await this.formManager.fetchAndDisplayForm(e.productSlug,async()=>{this.logger.debug(`Form for delivery: ${e.productSlug} was cancelled`),s&&await this.updateDeliveryResponse(e.id,s.id,!0)},async()=>{this.logger.debug(`Form for delivery: ${e.productSlug} was completed`),s&&await this.updateDeliveryResponse(e.id,s.id,!1,!0)})}catch(s){this.logger.error(`Failed to load form for delivery: ${e.productSlug}`,s)}}}matchesUrlPattern(e,t){let i;try{i=new URL(e).pathname}catch{i=e.startsWith("/")?e:`/${e}`}const s=h=>{if(!h)return"/";let d=h.startsWith("/")?h:`/${h}`;return d.length>1&&d.endsWith("/")&&(d=d.slice(0,-1)),d},r=s(i),a=s(t),n=a.replace(/\*\*/g,"§DOUBLE_STAR§").replace(/\*/g,"[^/]*").replace(/§DOUBLE_STAR§/g,".*").replace(/\?/g,"."),c=new RegExp(`^${n}$`).test(r);return this.logger.debug("URL pattern matching",{originalUrl:e,pathname:i,normalizedPathname:r,pattern:t,normalizedPattern:a,regexPattern:n,matches:c}),c}async createDeliveryResponse(e){try{return(await o.httpClient.post(`/external/deliveries/${e.id}/responses`,{},{headers:this.headers})).data}catch(t){this.logger.error(`Failed to create delivery response for delivery: ${e.id}`,t)}}async updateDeliveryResponse(e,t,i=!1,s=!1){try{await o.httpClient.patch(`/external/deliveries/${e}/responses/${t}`,{wasDismissed:i,wasCompleted:s},{headers:this.headers})}catch(r){this.logger.error(`Failed to update delivery response: ${t} for delivery: ${e}`,r)}}async isDeliveryValid(e){try{return(await o.httpClient.get(`/external/deliveries/${e.id}/should-deliver`,{headers:this.headers})).data}catch(t){return this.logger.error(`Failed to get delivery should-deliver for delivery: ${e.id}`,t),!1}}}class y{logger;headers;sessionId;eventDefinitions=[];onPageView;onEvent;trackUrlParamChanges=!0;backlog=[];flushTimeout=null;batchConfig={enabled:!0,size:10,delayMs:1e4,sendOnUnload:!0};originalHistoryMethods=null;EVENT_PAGE_VIEW="page_view";lastTrackedPageKey;constructor({logger:e,headers:t,sessionId:i,eventDefinitions:s,batchConfig:r,onPageView:a,onEvent:n,trackUrlParamChanges:l}){this.logger=e,this.headers=t,this.sessionId=i,this.eventDefinitions=s,this.onPageView=a,this.onEvent=n,typeof l=="boolean"&&(this.trackUrlParamChanges=l),this.flushEvents=this.flushEvents.bind(this),this.handlePopState=this.handlePopState.bind(this),this.handleVisibilityChange=this.handleVisibilityChange.bind(this),this.setupBatching(r)}setupBatching(e){typeof e=="boolean"?this.batchConfig.enabled=e:e&&(this.batchConfig={...this.batchConfig,...e}),this.batchConfig.enabled&&this.batchConfig.sendOnUnload&&typeof window<"u"&&(window.addEventListener("beforeunload",this.flushEvents),window.addEventListener("pagehide",this.flushEvents))}async setupPageViewTracking(){if(typeof window>"u")return;this.originalHistoryMethods={pushState:history.pushState,replaceState:history.replaceState};const e=history.pushState;history.pushState=async(...i)=>{e.apply(history,i),await this.trackPageView()};const t=history.replaceState;history.replaceState=async(...i)=>{t.apply(history,i),await this.trackPageView()},window.addEventListener("popstate",this.handlePopState),document.addEventListener("visibilitychange",this.handleVisibilityChange)}async track(e){if(!this.sessionId){this.logger.warn("Tracking manager not initialized, cannot track event");return}const{eventKey:t,data:i={}}=e;this.logger.debug("Tracking event",{eventKey:t,data:i});const s=window.location.href,r={sessionId:this.sessionId,eventKey:t,data:i||{},timestamp:new Date().toISOString(),page:s};this.validateEvent(r),this.batchConfig.enabled?(this.backlog.push(r),this.scheduleFlush()):await this.sendEvents([r]),t===this.EVENT_PAGE_VIEW?this.onPageView?.(window.location.href):this.onEvent?.(r,s)}async trackPageView(){if(typeof window>"u")return;const e=window.location.href;if(!this.trackUrlParamChanges){const t=this.getPageKeyWithoutQuery(e);if(this.lastTrackedPageKey===t)return;this.lastTrackedPageKey=t}await this.track({eventKey:this.EVENT_PAGE_VIEW,data:{title:document.title}})}getPageKeyWithoutQuery(e){try{const t=new URL(e);return`${t.origin}${t.pathname}${t.hash}`}catch{const[t]=e.split("?");return t}}async flush(){return this.flushEvents()}destroy(){this.originalHistoryMethods&&(history.pushState=this.originalHistoryMethods.pushState,history.replaceState=this.originalHistoryMethods.replaceState,this.originalHistoryMethods=null),typeof window<"u"&&(window.removeEventListener("popstate",this.handlePopState),document.removeEventListener("visibilitychange",this.handleVisibilityChange),window.removeEventListener("beforeunload",this.flushEvents),window.removeEventListener("pagehide",this.flushEvents)),this.flushTimeout&&(clearTimeout(this.flushTimeout),this.flushTimeout=null)}validateEvent(e){if(e.eventKey===this.EVENT_PAGE_VIEW)return;const t=this.eventDefinitions.find(r=>r.eventKey===e.eventKey);if(!t){this.logger.warn(`Event ${e.eventKey} is not registered`);return}const i=t.properties,s=e.data;if(s)for(const r of Object.keys(s)){const a=s[r],n=i.find(l=>l.name===r);if(!n){this.logger.warn(`Property ${r} is not registered for event ${e.eventKey}`);return}n.type==="string"&&typeof a!="string"&&this.logger.warn(`Property ${n.name} has type ${n.type} but value is of type ${typeof a}`),n.type==="boolean"&&typeof a!="boolean"&&this.logger.warn(`Property ${n.name} has type ${n.type} but value is of type ${typeof a}`),n.type==="number"&&typeof a!="number"&&this.logger.warn(`Property ${n.name} has type ${n.type} but value is of type ${typeof a}`)}}async handlePopState(){await this.trackPageView()}async handleVisibilityChange(){document.visibilityState==="visible"&&await this.trackPageView()}scheduleFlush(){if(this.backlog.length>=this.batchConfig.size){this.flushEvents();return}this.flushTimeout||(this.flushTimeout=window.setTimeout(()=>{this.flushEvents()},this.batchConfig.delayMs))}async flushEvents(){if(this.flushTimeout&&(clearTimeout(this.flushTimeout),this.flushTimeout=null),this.backlog.length===0)return;const e=[...this.backlog];this.backlog=[];try{await this.sendEvents(e)}catch(t){this.backlog.unshift(...e),this.logger.error("Failed to send batched events",t)}}async sendEvents(e){if(e.length!==0)if(e.length===1){const t=e[0];await o.httpClient.post("/external/trackings/track",t,{headers:this.headers})}else await o.httpClient.post("/external/trackings/batch",e,{headers:this.headers})}}class u{clientKey;userIdentifier;initialized=!1;lastInitError=null;clientLogger=o.logger.child("client");headers={};formConfig;constructor(e){this.clientKey=e}trackingManager;async init({userIdentifier:e,debug:t=!1,batch:i,formConfig:s,deactivate:r=!1,trackUrlParamChanges:a}){if(this.initialized=!1,this.lastInitError=null,this.trackingManager?.destroy(),this.trackingManager=void 0,r)return this.clientLogger.info("Nemme client deactivated and will stop initialization."),this.initialized=!0,this.lastInitError=null,this.clientLogger.configure({enabled:!1}),this;if(!e)throw new Error("userIdentifier is required parameter");this.userIdentifier=e,this.clientLogger.configure({enabled:t,level:t?"debug":"info"}),this.headers={"X-Client-Key":this.clientKey,"X-User-Id":this.userIdentifier},this.formConfig=s;try{const n=await this.initializeSession();await this.initializeManagers(n,i,a),this.initialized=!0,this.lastInitError=null,this.clientLogger.info("Nemme client initialized",{clientKey:this.clientKey,userIdentifier:this.userIdentifier})}catch(n){this.clientLogger.error("Error during initialization:",n),this.initialized=!1,this.lastInitError=n instanceof Error?n:new Error("Error during initialization")}return this}async flush(){return this.trackingManager?.flush()}destroy(){this.trackingManager?.destroy()}async track(e){if(!this.initialized||!this.trackingManager){this.clientLogger.warn("Nemme client not initialized, some operations may fail");return}return this.trackingManager.track(e)}async initializeSession(){try{const e=await o.httpClient.post("/external/trackings/initialize",{},{headers:this.headers});if(!e.ok)throw new Error(e.error?.message||"Request for initialising session failed");return e.data}catch(e){throw this.clientLogger.error("Error during initialization",e),e}}async initializeManagers(e,t,i){const s=new f(this.clientLogger,this.headers,this.formConfig),r=new y({logger:this.clientLogger,headers:this.headers,sessionId:e.sessionId,eventDefinitions:e.eventDefinitions,batchConfig:t,trackUrlParamChanges:i,onPageView:async a=>{await s.evaluateDeliveryTriggers({url:a})},onEvent:async(a,n)=>{await s.evaluateDeliveryTriggers({eventKey:a.eventKey,eventData:a.data,url:n})}});await s.loadDeliveries(),typeof window<"u"&&(await r.setupPageViewTracking(),await r.trackPageView(),await r.flush()),this.trackingManager=r}}const p=g=>new u(g);exports.NemmeClient=u;exports.initAsModule=p;
|
|
2
|
+
//# sourceMappingURL=client-DVvy_lUY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-DZJN73sh.js","sources":["../../src/deliveries/delivery-manager.ts","../../src/tracking/tracking-manager.ts","../../src/client.ts"],"sourcesContent":["import { httpClient } from '../networking';\nimport type { FormConfig } from '../types/forms';\nimport { Logger } from '../utils';\n\nexport type ProductType = 'FRM' | 'TRK';\n\nexport type Trigger = {\n triggerType: 'page_url' | 'custom_event';\n urlPattern?: string;\n eventKey?: string;\n};\n\nexport type Channel = {\n channelType: string;\n channelStyle: string;\n};\n\nexport type Audience = {\n audienceType: string;\n};\n\nexport type Frequency = {\n frequencyType: string;\n};\n\nexport type Delivery = {\n id: number;\n productSlug: string;\n productType: ProductType;\n triggers: Trigger[];\n // channels: Channel[];\n // audiences: Audience[];\n // frequency: Frequency| null;\n};\n\nexport type DeliveryResponse = {\n id: number;\n shownAt: string;\n wasDismissed: boolean;\n wasCompleted: boolean;\n userId: string;\n respondedAt: string;\n};\n\nexport type TriggerContext = {\n url: string;\n eventKey?: string;\n eventData?: Record<string, unknown>;\n};\n\nexport class DeliveryManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private formConfig?: FormConfig;\n private formManager?: {\n fetchAndDisplayForm: (\n productSlug: string,\n onDismiss: () => Promise<void>,\n onComplete: (formState?: unknown) => Promise<void>\n ) => Promise<void>;\n };\n private deliveries: Delivery[] = [];\n\n constructor(logger: Logger, headers: Record<string, string>, formConfig?: FormConfig) {\n this.logger = logger;\n this.headers = headers;\n this.formConfig = formConfig;\n }\n\n public async loadDeliveries(): Promise<void> {\n try {\n this.logger.debug('Loading deliveries');\n const response = await httpClient.get<Delivery[]>('/external/deliveries', { headers: this.headers });\n this.deliveries = response.data;\n this.logger.info(`Loaded ${this.deliveries.length} deliveries`);\n } catch (error) {\n this.logger.error('Failed to load deliveries', error);\n // Keep deliveries as empty array on failure\n this.deliveries = [];\n }\n }\n\n public async evaluateDeliveryTriggers(context: TriggerContext): Promise<void> {\n for (const delivery of this.deliveries) {\n for (const trigger of delivery.triggers) {\n if (this.shouldTriggerDelivery(trigger, context)) {\n const deliveryValid = await this.isDeliveryValid(delivery);\n if (!deliveryValid) {\n this.logger.debug(`Delivery ${delivery.id} is not valid, skipping`);\n continue;\n }\n await this.executeDelivery(delivery, trigger);\n return; // Stop after first match\n }\n }\n }\n }\n\n private shouldTriggerDelivery(trigger: Trigger, context: TriggerContext): boolean {\n if (this.hasActiveDelivery()) {\n return false;\n }\n switch (trigger.triggerType) {\n case 'page_url':\n return trigger.urlPattern ? this.matchesUrlPattern(context.url, trigger.urlPattern) : true;\n case 'custom_event':\n return trigger.eventKey ? context.eventKey === trigger.eventKey : false;\n default:\n return false;\n }\n }\n\n private hasActiveDelivery(): boolean {\n return document.getElementById('nm') !== null;\n }\n\n private async executeDelivery(delivery: Delivery, trigger: Trigger): Promise<void> {\n const productType = delivery.productType;\n if (productType === 'FRM') {\n this.logger.debug(`Triggering form delivery: ${delivery.productSlug}`, {\n triggerType: trigger.triggerType,\n urlPattern: trigger.urlPattern,\n eventKey: trigger.eventKey\n });\n\n try {\n const deliveryResponse = await this.createDeliveryResponse(delivery);\n if (!this.formManager) {\n const mod = await import('../forms/form-manager');\n this.formManager = new mod.FormManager(this.logger, this.headers, this.formConfig);\n }\n await this.formManager.fetchAndDisplayForm(\n delivery.productSlug,\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was cancelled`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, true);\n },\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was completed`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, false, true);\n }\n );\n } catch (error) {\n this.logger.error(`Failed to load form for delivery: ${delivery.productSlug}`, error);\n }\n }\n }\n\n private matchesUrlPattern(url: string, pattern: string): boolean {\n // Extract pathname from URL (remove protocol, host, query params, etc.)\n let pathname: string;\n try {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n } catch {\n // If URL parsing fails, assume it's already a pathname\n pathname = url.startsWith('/') ? url : `/${url}`;\n }\n\n // Normalize paths: remove trailing slash (except for root) and ensure leading slash\n const normalizePath = (p: string): string => {\n if (!p) return '/';\n let s = p.startsWith('/') ? p : `/${p}`;\n if (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s;\n };\n\n const normalizedPathname = normalizePath(pathname);\n const normalizedPattern = normalizePath(pattern);\n\n // Convert glob pattern to regex\n // * matches any characters except /\n // ** matches any characters including /\n const regexPattern = normalizedPattern\n .replace(/\\*\\*/g, '§DOUBLE_STAR§') // Temporary placeholder\n .replace(/\\*/g, '[^/]*') // Single * matches anything except /\n .replace(/§DOUBLE_STAR§/g, '.*') // ** matches anything including /\n .replace(/\\?/g, '.'); // ? matches single character\n\n const regex = new RegExp(`^${regexPattern}$`);\n const result = regex.test(normalizedPathname);\n\n this.logger.debug(`URL pattern matching`, {\n originalUrl: url,\n pathname,\n normalizedPathname,\n pattern,\n normalizedPattern,\n regexPattern,\n matches: result\n });\n\n return result;\n }\n\n private async createDeliveryResponse(delivery: Delivery): Promise<DeliveryResponse | undefined> {\n try {\n const response = await httpClient.post<DeliveryResponse>(\n `/external/deliveries/${delivery.id}/responses`,\n {},\n { headers: this.headers }\n );\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to create delivery response for delivery: ${delivery.id}`, error);\n }\n }\n\n private async updateDeliveryResponse(\n deliveryId: number,\n deliveryResponseId: number,\n dismissed: boolean = false,\n completed: boolean = false\n ): Promise<void> {\n try {\n await httpClient.patch(\n `/external/deliveries/${deliveryId}/responses/${deliveryResponseId}`,\n { wasDismissed: dismissed, wasCompleted: completed },\n { headers: this.headers }\n );\n } catch (error) {\n this.logger.error(`Failed to update delivery response: ${deliveryResponseId} for delivery: ${deliveryId}`, error);\n }\n }\n\n private async isDeliveryValid(delivery: Delivery): Promise<boolean> {\n try {\n const response = await httpClient.get<boolean>(`/external/deliveries/${delivery.id}/should-deliver`, {\n headers: this.headers\n });\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to get delivery should-deliver for delivery: ${delivery.id}`, error);\n return false;\n }\n }\n}\n","import { httpClient } from '../networking';\nimport { Logger } from '../utils';\n\nexport type Config = {\n logger: Logger;\n headers: Record<string, string>;\n sessionId: number;\n eventDefinitions: EventDefinition[];\n batchConfig?: boolean | BatchConfig;\n onPageView?: (url: string) => Promise<void>;\n onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n trackUrlParamChanges?: boolean;\n};\n\nexport type BatchConfig = {\n enabled?: boolean;\n size?: number;\n delayMs?: number;\n sendOnUnload?: boolean;\n};\n\nexport type TrackEventOptions<T extends string = string> = {\n eventKey: T;\n data?: Record<string, unknown>;\n};\n\ntype HistoryParams = Parameters<typeof history.pushState>;\n\ntype EventOptions = TrackEventOptions & {\n sessionId: number;\n timestamp: string;\n page: string;\n};\n\ntype EventProperties = {\n name: string;\n type: string;\n};\n\nexport type EventDefinition = {\n properties: EventProperties[];\n eventKey: string;\n};\n\n/**\n * Manages event tracking, batching, and page view tracking\n */\nexport class TrackingManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private sessionId?: number;\n private eventDefinitions: EventDefinition[] = [];\n private onPageView?: (url: string) => Promise<void>;\n private onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n private trackUrlParamChanges = true;\n\n // Batching\n private backlog: Array<EventOptions> = [];\n private flushTimeout: number | null = null;\n private batchConfig: Required<BatchConfig> = {\n enabled: true,\n size: 10,\n delayMs: 10000, // 10 seconds\n sendOnUnload: true\n };\n\n // Page view tracking\n private originalHistoryMethods: {\n pushState: typeof history.pushState;\n replaceState: typeof history.replaceState;\n } | null = null;\n\n private readonly EVENT_PAGE_VIEW = 'page_view';\n private lastTrackedPageKey?: string;\n\n constructor({\n logger,\n headers,\n sessionId,\n eventDefinitions,\n batchConfig,\n onPageView,\n onEvent,\n trackUrlParamChanges\n }: Config) {\n this.logger = logger;\n this.headers = headers;\n this.sessionId = sessionId;\n this.eventDefinitions = eventDefinitions;\n this.onPageView = onPageView;\n this.onEvent = onEvent;\n if (typeof trackUrlParamChanges === 'boolean') {\n this.trackUrlParamChanges = trackUrlParamChanges;\n }\n\n // Bind methods before setting up event listeners\n this.flushEvents = this.flushEvents.bind(this);\n this.handlePopState = this.handlePopState.bind(this);\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n\n this.setupBatching(batchConfig);\n }\n\n private setupBatching(batchConfig?: boolean | BatchConfig): void {\n if (typeof batchConfig === 'boolean') {\n this.batchConfig.enabled = batchConfig;\n } else if (batchConfig) {\n this.batchConfig = {\n ...this.batchConfig,\n ...batchConfig\n };\n }\n\n // Setup unload handler if batching is enabled\n if (this.batchConfig.enabled && this.batchConfig.sendOnUnload && typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this.flushEvents);\n window.addEventListener('pagehide', this.flushEvents);\n }\n }\n\n public async setupPageViewTracking(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n this.originalHistoryMethods = {\n pushState: history.pushState,\n replaceState: history.replaceState\n };\n\n const originalPushState = history.pushState;\n history.pushState = async (...args: HistoryParams) => {\n originalPushState.apply(history, args);\n await this.trackPageView();\n };\n\n const originalReplaceState = history.replaceState;\n history.replaceState = async (...args: HistoryParams) => {\n originalReplaceState.apply(history, args);\n await this.trackPageView();\n };\n\n window.addEventListener('popstate', this.handlePopState);\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.sessionId) {\n this.logger.warn('Tracking manager not initialized, cannot track event');\n return;\n }\n\n const { eventKey, data = {} } = options;\n this.logger.debug('Tracking event', { eventKey, data });\n const url = window.location.href;\n const event: EventOptions = {\n sessionId: this.sessionId,\n eventKey,\n data: data || {},\n timestamp: new Date().toISOString(),\n page: url\n };\n\n this.validateEvent(event);\n\n if (this.batchConfig.enabled) {\n this.backlog.push(event);\n this.scheduleFlush();\n } else {\n await this.sendEvents([event]);\n }\n\n if (eventKey === this.EVENT_PAGE_VIEW) {\n this.onPageView?.(window.location.href);\n } else {\n this.onEvent?.(event, url);\n }\n }\n\n public async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const url = window.location.href;\n\n if (!this.trackUrlParamChanges) {\n const currentPageKey = this.getPageKeyWithoutQuery(url);\n\n if (this.lastTrackedPageKey === currentPageKey) {\n return;\n }\n\n this.lastTrackedPageKey = currentPageKey;\n }\n\n await this.track({\n eventKey: this.EVENT_PAGE_VIEW,\n data: {\n title: document.title\n }\n });\n }\n\n private getPageKeyWithoutQuery(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}${parsed.hash}`;\n } catch {\n const [base] = url.split('?');\n return base;\n }\n }\n\n /**\n * Manually flush any pending events\n */\n public async flush(): Promise<void> {\n return this.flushEvents();\n }\n\n /**\n * Clean up event listeners and restore original history methods\n */\n public destroy(): void {\n if (this.originalHistoryMethods) {\n history.pushState = this.originalHistoryMethods.pushState;\n history.replaceState = this.originalHistoryMethods.replaceState;\n this.originalHistoryMethods = null;\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n window.removeEventListener('beforeunload', this.flushEvents);\n window.removeEventListener('pagehide', this.flushEvents);\n }\n\n // Clear any pending flush timeout\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n }\n\n private validateEvent(event: EventOptions): void {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return;\n\n const eventDefinition = this.eventDefinitions.find(def => def.eventKey === event.eventKey);\n if (!eventDefinition) {\n this.logger.warn(`Event ${event.eventKey} is not registered`);\n return;\n }\n\n const definedProperties = eventDefinition.properties;\n const eventProperties = event.data;\n if (!eventProperties) return;\n\n for (const eventPropertyKey of Object.keys(eventProperties)) {\n const eventProperty = eventProperties[eventPropertyKey];\n const definedProperty = definedProperties.find(prop => prop.name === eventPropertyKey);\n\n if (!definedProperty) {\n this.logger.warn(`Property ${eventPropertyKey} is not registered for event ${event.eventKey}`);\n return;\n }\n\n if (definedProperty.type === 'string' && typeof eventProperty !== 'string') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'boolean' && typeof eventProperty !== 'boolean') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'number' && typeof eventProperty !== 'number') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n }\n }\n\n private async handlePopState(): Promise<void> {\n await this.trackPageView();\n }\n\n private async handleVisibilityChange(): Promise<void> {\n if (document.visibilityState === 'visible') {\n await this.trackPageView();\n }\n }\n\n private scheduleFlush(): void {\n if (this.backlog.length >= this.batchConfig.size) {\n this.flushEvents();\n return;\n }\n\n if (!this.flushTimeout) {\n this.flushTimeout = window.setTimeout(() => {\n this.flushEvents();\n }, this.batchConfig.delayMs);\n }\n }\n\n private async flushEvents(): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n if (this.backlog.length === 0) return;\n\n const eventsToSend = [...this.backlog];\n this.backlog = [];\n\n try {\n await this.sendEvents(eventsToSend);\n } catch (error) {\n this.backlog.unshift(...eventsToSend);\n this.logger.error('Failed to send batched events', error);\n }\n }\n\n private async sendEvents(events: Array<EventOptions>): Promise<void> {\n if (events.length === 0) return;\n\n if (events.length === 1) {\n const event = events[0];\n await httpClient.post('/external/trackings/track', event, { headers: this.headers });\n } else {\n await httpClient.post('/external/trackings/batch', events, { headers: this.headers });\n }\n }\n}\n","import { DeliveryManager } from './deliveries/delivery-manager';\nimport { httpClient, HttpResponse } from './networking';\nimport { BatchConfig, EventDefinition, TrackEventOptions, TrackingManager } from './tracking/tracking-manager';\nimport { FormConfig } from './types/forms';\nimport { Logger, logger } from './utils';\n\nexport type ClientConfigType = {\n userIdentifier: string;\n debug?: boolean;\n batch?: boolean | BatchConfig;\n formConfig?: FormConfig;\n deactivate?: boolean;\n trackUrlParamChanges?: boolean;\n};\n\n// Re-export types for backward compatibility\nexport type { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';\n\ntype InitializeResponse = {\n sessionId: number;\n eventDefinitions: EventDefinition[];\n};\n\n/**\n * Main client class for the Nemme SDK\n * Coordinates initialization, tracking, and form management\n */\nexport class NemmeClient {\n clientKey: string;\n userIdentifier?: string;\n initialized = false;\n lastInitError: Error | null = null;\n clientLogger: Logger = logger.child('client');\n headers: Record<string, string> = {};\n formConfig?: FormConfig;\n\n constructor(clientKey: string) {\n this.clientKey = clientKey;\n }\n\n // Module managers\n private trackingManager?: TrackingManager;\n\n /**\n * Create a new Nemme SDK client instance\n */\n public async init({\n userIdentifier,\n debug = false,\n batch,\n formConfig,\n deactivate = false,\n trackUrlParamChanges\n }: ClientConfigType): Promise<NemmeClient> {\n this.initialized = false;\n this.lastInitError = null;\n this.trackingManager?.destroy();\n this.trackingManager = undefined;\n\n if (deactivate) {\n this.clientLogger.info('Nemme client deactivated and will stop initialization.');\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.configure({ enabled: false });\n return this;\n }\n if (!userIdentifier) throw new Error('userIdentifier is required parameter');\n this.userIdentifier = userIdentifier;\n\n // Configure logger based on debug setting\n this.clientLogger.configure({\n enabled: debug,\n level: debug ? 'debug' : 'info'\n });\n\n this.headers = {\n 'X-Client-Key': this.clientKey,\n 'X-User-Id': this.userIdentifier\n };\n\n this.formConfig = formConfig;\n\n try {\n const session = await this.initializeSession();\n await this.initializeManagers(session, batch, trackUrlParamChanges);\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.info('Nemme client initialized', {\n clientKey: this.clientKey,\n userIdentifier: this.userIdentifier\n });\n } catch (error) {\n this.clientLogger.error('Error during initialization:', error);\n this.initialized = false;\n this.lastInitError = error instanceof Error ? error : new Error('Error during initialization');\n }\n\n return this;\n }\n\n public async flush(): Promise<void> {\n return this.trackingManager?.flush();\n }\n\n public destroy(): void {\n this.trackingManager?.destroy();\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.initialized || !this.trackingManager) {\n this.clientLogger.warn('Nemme client not initialized, some operations may fail');\n return;\n }\n\n return this.trackingManager.track(options);\n }\n\n private async initializeSession(): Promise<InitializeResponse> {\n try {\n const response: HttpResponse<InitializeResponse> = await httpClient.post(\n '/external/trackings/initialize',\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n throw new Error(response.error?.message || 'Request for initialising session failed');\n }\n return response.data;\n } catch (error) {\n this.clientLogger.error('Error during initialization', error);\n throw error;\n }\n }\n\n private async initializeManagers(\n session: InitializeResponse,\n batchConfig?: boolean | BatchConfig,\n trackUrlParamChanges?: boolean\n ): Promise<void> {\n const deliveryManager = new DeliveryManager(this.clientLogger, this.headers, this.formConfig);\n const trackingManager = new TrackingManager({\n logger: this.clientLogger,\n headers: this.headers,\n sessionId: session.sessionId,\n eventDefinitions: session.eventDefinitions,\n batchConfig,\n trackUrlParamChanges,\n onPageView: async (url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ url });\n },\n onEvent: async (event: TrackEventOptions, url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ eventKey: event.eventKey, eventData: event.data, url });\n }\n });\n\n await deliveryManager.loadDeliveries();\n\n if (typeof window !== 'undefined') {\n await trackingManager.setupPageViewTracking();\n await trackingManager.trackPageView();\n await trackingManager.flush();\n }\n\n this.trackingManager = trackingManager;\n }\n}\n\nexport const initAsModule = (clientKey: string) => new NemmeClient(clientKey);\n"],"names":["DeliveryManager","logger","headers","formConfig","response","httpClient","error","context","delivery","trigger","deliveryResponse","mod","n","url","pattern","pathname","normalizePath","p","s","normalizedPathname","normalizedPattern","regexPattern","result","deliveryId","deliveryResponseId","dismissed","completed","TrackingManager","sessionId","eventDefinitions","batchConfig","onPageView","onEvent","trackUrlParamChanges","originalPushState","args","originalReplaceState","options","eventKey","data","event","currentPageKey","parsed","base","eventDefinition","def","definedProperties","eventProperties","eventPropertyKey","eventProperty","definedProperty","prop","eventsToSend","events","NemmeClient","clientKey","userIdentifier","debug","batch","deactivate","session","deliveryManager","trackingManager","initAsModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client-DVvy_lUY.js","sources":["../../src/deliveries/delivery-manager.ts","../../src/tracking/tracking-manager.ts","../../src/client.ts"],"sourcesContent":["import { httpClient } from '../networking';\nimport type { FormConfig } from '../types/forms';\nimport { Logger } from '../utils';\n\nexport type ProductType = 'FRM' | 'TRK';\n\nexport type Trigger = {\n triggerType: 'page_url' | 'custom_event';\n urlPattern?: string;\n eventKey?: string;\n};\n\nexport type Channel = {\n channelType: string;\n channelStyle: string;\n};\n\nexport type Audience = {\n audienceType: string;\n};\n\nexport type Frequency = {\n frequencyType: string;\n};\n\nexport type Delivery = {\n id: number;\n productSlug: string;\n productType: ProductType;\n triggers: Trigger[];\n // channels: Channel[];\n // audiences: Audience[];\n // frequency: Frequency| null;\n};\n\nexport type DeliveryResponse = {\n id: number;\n shownAt: string;\n wasDismissed: boolean;\n wasCompleted: boolean;\n userId: string;\n respondedAt: string;\n};\n\nexport type TriggerContext = {\n url: string;\n eventKey?: string;\n eventData?: Record<string, unknown>;\n};\n\nexport class DeliveryManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private formConfig?: FormConfig;\n private formManager?: {\n fetchAndDisplayForm: (\n productSlug: string,\n onDismiss: () => Promise<void>,\n onComplete: (formState?: unknown) => Promise<void>\n ) => Promise<void>;\n };\n private deliveries: Delivery[] = [];\n\n constructor(logger: Logger, headers: Record<string, string>, formConfig?: FormConfig) {\n this.logger = logger;\n this.headers = headers;\n this.formConfig = formConfig;\n }\n\n public async loadDeliveries(): Promise<void> {\n try {\n this.logger.debug('Loading deliveries');\n const response = await httpClient.get<Delivery[]>('/external/deliveries', { headers: this.headers });\n this.deliveries = response.data;\n this.logger.info(`Loaded ${this.deliveries.length} deliveries`);\n } catch (error) {\n this.logger.error('Failed to load deliveries', error);\n // Keep deliveries as empty array on failure\n this.deliveries = [];\n }\n }\n\n public async evaluateDeliveryTriggers(context: TriggerContext): Promise<void> {\n for (const delivery of this.deliveries) {\n for (const trigger of delivery.triggers) {\n if (this.shouldTriggerDelivery(trigger, context)) {\n const deliveryValid = await this.isDeliveryValid(delivery);\n if (!deliveryValid) {\n this.logger.debug(`Delivery ${delivery.id} is not valid, skipping`);\n continue;\n }\n await this.executeDelivery(delivery, trigger);\n return; // Stop after first match\n }\n }\n }\n }\n\n private shouldTriggerDelivery(trigger: Trigger, context: TriggerContext): boolean {\n if (this.hasActiveDelivery()) {\n return false;\n }\n switch (trigger.triggerType) {\n case 'page_url':\n return trigger.urlPattern ? this.matchesUrlPattern(context.url, trigger.urlPattern) : true;\n case 'custom_event':\n return trigger.eventKey ? context.eventKey === trigger.eventKey : false;\n default:\n return false;\n }\n }\n\n private hasActiveDelivery(): boolean {\n return document.getElementById('nm') !== null;\n }\n\n private async executeDelivery(delivery: Delivery, trigger: Trigger): Promise<void> {\n const productType = delivery.productType;\n if (productType === 'FRM') {\n this.logger.debug(`Triggering form delivery: ${delivery.productSlug}`, {\n triggerType: trigger.triggerType,\n urlPattern: trigger.urlPattern,\n eventKey: trigger.eventKey\n });\n\n try {\n const deliveryResponse = await this.createDeliveryResponse(delivery);\n if (!this.formManager) {\n const mod = await import('../forms/form-manager');\n this.formManager = new mod.FormManager(this.logger, this.headers, this.formConfig);\n }\n await this.formManager.fetchAndDisplayForm(\n delivery.productSlug,\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was cancelled`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, true);\n },\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was completed`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, false, true);\n }\n );\n } catch (error) {\n this.logger.error(`Failed to load form for delivery: ${delivery.productSlug}`, error);\n }\n }\n }\n\n private matchesUrlPattern(url: string, pattern: string): boolean {\n // Extract pathname from URL (remove protocol, host, query params, etc.)\n let pathname: string;\n try {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n } catch {\n // If URL parsing fails, assume it's already a pathname\n pathname = url.startsWith('/') ? url : `/${url}`;\n }\n\n // Normalize paths: remove trailing slash (except for root) and ensure leading slash\n const normalizePath = (p: string): string => {\n if (!p) return '/';\n let s = p.startsWith('/') ? p : `/${p}`;\n if (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s;\n };\n\n const normalizedPathname = normalizePath(pathname);\n const normalizedPattern = normalizePath(pattern);\n\n // Convert glob pattern to regex\n // * matches any characters except /\n // ** matches any characters including /\n const regexPattern = normalizedPattern\n .replace(/\\*\\*/g, '§DOUBLE_STAR§') // Temporary placeholder\n .replace(/\\*/g, '[^/]*') // Single * matches anything except /\n .replace(/§DOUBLE_STAR§/g, '.*') // ** matches anything including /\n .replace(/\\?/g, '.'); // ? matches single character\n\n const regex = new RegExp(`^${regexPattern}$`);\n const result = regex.test(normalizedPathname);\n\n this.logger.debug(`URL pattern matching`, {\n originalUrl: url,\n pathname,\n normalizedPathname,\n pattern,\n normalizedPattern,\n regexPattern,\n matches: result\n });\n\n return result;\n }\n\n private async createDeliveryResponse(delivery: Delivery): Promise<DeliveryResponse | undefined> {\n try {\n const response = await httpClient.post<DeliveryResponse>(\n `/external/deliveries/${delivery.id}/responses`,\n {},\n { headers: this.headers }\n );\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to create delivery response for delivery: ${delivery.id}`, error);\n }\n }\n\n private async updateDeliveryResponse(\n deliveryId: number,\n deliveryResponseId: number,\n dismissed: boolean = false,\n completed: boolean = false\n ): Promise<void> {\n try {\n await httpClient.patch(\n `/external/deliveries/${deliveryId}/responses/${deliveryResponseId}`,\n { wasDismissed: dismissed, wasCompleted: completed },\n { headers: this.headers }\n );\n } catch (error) {\n this.logger.error(`Failed to update delivery response: ${deliveryResponseId} for delivery: ${deliveryId}`, error);\n }\n }\n\n private async isDeliveryValid(delivery: Delivery): Promise<boolean> {\n try {\n const response = await httpClient.get<boolean>(`/external/deliveries/${delivery.id}/should-deliver`, {\n headers: this.headers\n });\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to get delivery should-deliver for delivery: ${delivery.id}`, error);\n return false;\n }\n }\n}\n","import { httpClient } from '../networking';\nimport { Logger } from '../utils';\n\nexport type Config = {\n logger: Logger;\n headers: Record<string, string>;\n sessionId: number;\n eventDefinitions: EventDefinition[];\n batchConfig?: boolean | BatchConfig;\n onPageView?: (url: string) => Promise<void>;\n onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n trackUrlParamChanges?: boolean;\n};\n\nexport type BatchConfig = {\n enabled?: boolean;\n size?: number;\n delayMs?: number;\n sendOnUnload?: boolean;\n};\n\nexport type TrackEventOptions<T extends string = string> = {\n eventKey: T;\n data?: Record<string, unknown>;\n};\n\ntype HistoryParams = Parameters<typeof history.pushState>;\n\ntype EventOptions = TrackEventOptions & {\n sessionId: number;\n timestamp: string;\n page: string;\n};\n\ntype EventProperties = {\n name: string;\n type: string;\n};\n\nexport type EventDefinition = {\n properties: EventProperties[];\n eventKey: string;\n};\n\n/**\n * Manages event tracking, batching, and page view tracking\n */\nexport class TrackingManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private sessionId?: number;\n private eventDefinitions: EventDefinition[] = [];\n private onPageView?: (url: string) => Promise<void>;\n private onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n private trackUrlParamChanges = true;\n\n // Batching\n private backlog: Array<EventOptions> = [];\n private flushTimeout: number | null = null;\n private batchConfig: Required<BatchConfig> = {\n enabled: true,\n size: 10,\n delayMs: 10000, // 10 seconds\n sendOnUnload: true\n };\n\n // Page view tracking\n private originalHistoryMethods: {\n pushState: typeof history.pushState;\n replaceState: typeof history.replaceState;\n } | null = null;\n\n private readonly EVENT_PAGE_VIEW = 'page_view';\n private lastTrackedPageKey?: string;\n\n constructor({\n logger,\n headers,\n sessionId,\n eventDefinitions,\n batchConfig,\n onPageView,\n onEvent,\n trackUrlParamChanges\n }: Config) {\n this.logger = logger;\n this.headers = headers;\n this.sessionId = sessionId;\n this.eventDefinitions = eventDefinitions;\n this.onPageView = onPageView;\n this.onEvent = onEvent;\n if (typeof trackUrlParamChanges === 'boolean') {\n this.trackUrlParamChanges = trackUrlParamChanges;\n }\n\n // Bind methods before setting up event listeners\n this.flushEvents = this.flushEvents.bind(this);\n this.handlePopState = this.handlePopState.bind(this);\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n\n this.setupBatching(batchConfig);\n }\n\n private setupBatching(batchConfig?: boolean | BatchConfig): void {\n if (typeof batchConfig === 'boolean') {\n this.batchConfig.enabled = batchConfig;\n } else if (batchConfig) {\n this.batchConfig = {\n ...this.batchConfig,\n ...batchConfig\n };\n }\n\n // Setup unload handler if batching is enabled\n if (this.batchConfig.enabled && this.batchConfig.sendOnUnload && typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this.flushEvents);\n window.addEventListener('pagehide', this.flushEvents);\n }\n }\n\n public async setupPageViewTracking(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n this.originalHistoryMethods = {\n pushState: history.pushState,\n replaceState: history.replaceState\n };\n\n const originalPushState = history.pushState;\n history.pushState = async (...args: HistoryParams) => {\n originalPushState.apply(history, args);\n await this.trackPageView();\n };\n\n const originalReplaceState = history.replaceState;\n history.replaceState = async (...args: HistoryParams) => {\n originalReplaceState.apply(history, args);\n await this.trackPageView();\n };\n\n window.addEventListener('popstate', this.handlePopState);\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.sessionId) {\n this.logger.warn('Tracking manager not initialized, cannot track event');\n return;\n }\n\n const { eventKey, data = {} } = options;\n this.logger.debug('Tracking event', { eventKey, data });\n const url = window.location.href;\n const event: EventOptions = {\n sessionId: this.sessionId,\n eventKey,\n data: data || {},\n timestamp: new Date().toISOString(),\n page: url\n };\n\n this.validateEvent(event);\n\n if (this.batchConfig.enabled) {\n this.backlog.push(event);\n this.scheduleFlush();\n } else {\n await this.sendEvents([event]);\n }\n\n if (eventKey === this.EVENT_PAGE_VIEW) {\n this.onPageView?.(window.location.href);\n } else {\n this.onEvent?.(event, url);\n }\n }\n\n public async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const url = window.location.href;\n\n if (!this.trackUrlParamChanges) {\n const currentPageKey = this.getPageKeyWithoutQuery(url);\n\n if (this.lastTrackedPageKey === currentPageKey) {\n return;\n }\n\n this.lastTrackedPageKey = currentPageKey;\n }\n\n await this.track({\n eventKey: this.EVENT_PAGE_VIEW,\n data: {\n title: document.title\n }\n });\n }\n\n private getPageKeyWithoutQuery(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}${parsed.hash}`;\n } catch {\n const [base] = url.split('?');\n return base;\n }\n }\n\n /**\n * Manually flush any pending events\n */\n public async flush(): Promise<void> {\n return this.flushEvents();\n }\n\n /**\n * Clean up event listeners and restore original history methods\n */\n public destroy(): void {\n if (this.originalHistoryMethods) {\n history.pushState = this.originalHistoryMethods.pushState;\n history.replaceState = this.originalHistoryMethods.replaceState;\n this.originalHistoryMethods = null;\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n window.removeEventListener('beforeunload', this.flushEvents);\n window.removeEventListener('pagehide', this.flushEvents);\n }\n\n // Clear any pending flush timeout\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n }\n\n private validateEvent(event: EventOptions): void {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return;\n\n const eventDefinition = this.eventDefinitions.find(def => def.eventKey === event.eventKey);\n if (!eventDefinition) {\n this.logger.warn(`Event ${event.eventKey} is not registered`);\n return;\n }\n\n const definedProperties = eventDefinition.properties;\n const eventProperties = event.data;\n if (!eventProperties) return;\n\n for (const eventPropertyKey of Object.keys(eventProperties)) {\n const eventProperty = eventProperties[eventPropertyKey];\n const definedProperty = definedProperties.find(prop => prop.name === eventPropertyKey);\n\n if (!definedProperty) {\n this.logger.warn(`Property ${eventPropertyKey} is not registered for event ${event.eventKey}`);\n return;\n }\n\n if (definedProperty.type === 'string' && typeof eventProperty !== 'string') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'boolean' && typeof eventProperty !== 'boolean') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n\n if (definedProperty.type === 'number' && typeof eventProperty !== 'number') {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n }\n }\n\n private async handlePopState(): Promise<void> {\n await this.trackPageView();\n }\n\n private async handleVisibilityChange(): Promise<void> {\n if (document.visibilityState === 'visible') {\n await this.trackPageView();\n }\n }\n\n private scheduleFlush(): void {\n if (this.backlog.length >= this.batchConfig.size) {\n this.flushEvents();\n return;\n }\n\n if (!this.flushTimeout) {\n this.flushTimeout = window.setTimeout(() => {\n this.flushEvents();\n }, this.batchConfig.delayMs);\n }\n }\n\n private async flushEvents(): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n if (this.backlog.length === 0) return;\n\n const eventsToSend = [...this.backlog];\n this.backlog = [];\n\n try {\n await this.sendEvents(eventsToSend);\n } catch (error) {\n this.backlog.unshift(...eventsToSend);\n this.logger.error('Failed to send batched events', error);\n }\n }\n\n private async sendEvents(events: Array<EventOptions>): Promise<void> {\n if (events.length === 0) return;\n\n if (events.length === 1) {\n const event = events[0];\n await httpClient.post('/external/trackings/track', event, { headers: this.headers });\n } else {\n await httpClient.post('/external/trackings/batch', events, { headers: this.headers });\n }\n }\n}\n","import { DeliveryManager } from './deliveries/delivery-manager';\nimport { httpClient, HttpResponse } from './networking';\nimport { BatchConfig, EventDefinition, TrackEventOptions, TrackingManager } from './tracking/tracking-manager';\nimport { FormConfig } from './types/forms';\nimport { Logger, logger } from './utils';\n\nexport type ClientConfigType = {\n userIdentifier: string;\n debug?: boolean;\n batch?: boolean | BatchConfig;\n formConfig?: FormConfig;\n deactivate?: boolean;\n trackUrlParamChanges?: boolean;\n};\n\n// Re-export types for backward compatibility\nexport type { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';\n\ntype InitializeResponse = {\n sessionId: number;\n eventDefinitions: EventDefinition[];\n};\n\n/**\n * Main client class for the Nemme SDK\n * Coordinates initialization, tracking, and form management\n */\nexport class NemmeClient {\n clientKey: string;\n userIdentifier?: string;\n initialized = false;\n lastInitError: Error | null = null;\n clientLogger: Logger = logger.child('client');\n headers: Record<string, string> = {};\n formConfig?: FormConfig;\n\n constructor(clientKey: string) {\n this.clientKey = clientKey;\n }\n\n // Module managers\n private trackingManager?: TrackingManager;\n\n /**\n * Create a new Nemme SDK client instance\n */\n public async init({\n userIdentifier,\n debug = false,\n batch,\n formConfig,\n deactivate = false,\n trackUrlParamChanges\n }: ClientConfigType): Promise<NemmeClient> {\n this.initialized = false;\n this.lastInitError = null;\n this.trackingManager?.destroy();\n this.trackingManager = undefined;\n\n if (deactivate) {\n this.clientLogger.info('Nemme client deactivated and will stop initialization.');\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.configure({ enabled: false });\n return this;\n }\n if (!userIdentifier) throw new Error('userIdentifier is required parameter');\n this.userIdentifier = userIdentifier;\n\n // Configure logger based on debug setting\n this.clientLogger.configure({\n enabled: debug,\n level: debug ? 'debug' : 'info'\n });\n\n this.headers = {\n 'X-Client-Key': this.clientKey,\n 'X-User-Id': this.userIdentifier\n };\n\n this.formConfig = formConfig;\n\n try {\n const session = await this.initializeSession();\n await this.initializeManagers(session, batch, trackUrlParamChanges);\n this.initialized = true;\n this.lastInitError = null;\n this.clientLogger.info('Nemme client initialized', {\n clientKey: this.clientKey,\n userIdentifier: this.userIdentifier\n });\n } catch (error) {\n this.clientLogger.error('Error during initialization:', error);\n this.initialized = false;\n this.lastInitError = error instanceof Error ? error : new Error('Error during initialization');\n }\n\n return this;\n }\n\n public async flush(): Promise<void> {\n return this.trackingManager?.flush();\n }\n\n public destroy(): void {\n this.trackingManager?.destroy();\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.initialized || !this.trackingManager) {\n this.clientLogger.warn('Nemme client not initialized, some operations may fail');\n return;\n }\n\n return this.trackingManager.track(options);\n }\n\n private async initializeSession(): Promise<InitializeResponse> {\n try {\n const response: HttpResponse<InitializeResponse> = await httpClient.post(\n '/external/trackings/initialize',\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n throw new Error(response.error?.message || 'Request for initialising session failed');\n }\n return response.data;\n } catch (error) {\n this.clientLogger.error('Error during initialization', error);\n throw error;\n }\n }\n\n private async initializeManagers(\n session: InitializeResponse,\n batchConfig?: boolean | BatchConfig,\n trackUrlParamChanges?: boolean\n ): Promise<void> {\n const deliveryManager = new DeliveryManager(this.clientLogger, this.headers, this.formConfig);\n const trackingManager = new TrackingManager({\n logger: this.clientLogger,\n headers: this.headers,\n sessionId: session.sessionId,\n eventDefinitions: session.eventDefinitions,\n batchConfig,\n trackUrlParamChanges,\n onPageView: async (url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ url });\n },\n onEvent: async (event: TrackEventOptions, url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ eventKey: event.eventKey, eventData: event.data, url });\n }\n });\n\n await deliveryManager.loadDeliveries();\n\n if (typeof window !== 'undefined') {\n await trackingManager.setupPageViewTracking();\n await trackingManager.trackPageView();\n await trackingManager.flush();\n }\n\n this.trackingManager = trackingManager;\n }\n}\n\nexport const initAsModule = (clientKey: string) => new NemmeClient(clientKey);\n"],"names":["DeliveryManager","logger","headers","formConfig","response","httpClient","error","context","delivery","trigger","deliveryResponse","mod","n","url","pattern","pathname","normalizePath","p","s","normalizedPathname","normalizedPattern","regexPattern","result","deliveryId","deliveryResponseId","dismissed","completed","TrackingManager","sessionId","eventDefinitions","batchConfig","onPageView","onEvent","trackUrlParamChanges","originalPushState","args","originalReplaceState","options","eventKey","data","event","currentPageKey","parsed","base","eventDefinition","def","definedProperties","eventProperties","eventPropertyKey","eventProperty","definedProperty","prop","eventsToSend","events","NemmeClient","clientKey","userIdentifier","debug","batch","deactivate","session","deliveryManager","trackingManager","initAsModule"],"mappings":"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"}
|