shopkit-analytics 1.0.21 → 1.0.23

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.
Files changed (50) hide show
  1. package/dist/adapters/index.d.mts +1 -1
  2. package/dist/adapters/index.d.ts +1 -1
  3. package/dist/adapters/index.js +265 -386
  4. package/dist/adapters/index.js.map +1 -1
  5. package/dist/adapters/index.mjs +4 -5
  6. package/dist/affiliate/index.js +0 -1
  7. package/dist/affiliate/index.js.map +1 -1
  8. package/dist/affiliate/index.mjs +1 -2
  9. package/dist/{chunk-C6F4QLQO.mjs → chunk-2DA66EMD.mjs} +1 -3
  10. package/dist/{chunk-C6F4QLQO.mjs.map → chunk-2DA66EMD.mjs.map} +1 -1
  11. package/dist/{chunk-4RDPDMGW.mjs → chunk-2YXPYXKI.mjs} +1 -3
  12. package/dist/{chunk-4RDPDMGW.mjs.map → chunk-2YXPYXKI.mjs.map} +1 -1
  13. package/dist/{chunk-BE3W2SD6.mjs → chunk-CIONXODE.mjs} +2 -4
  14. package/dist/chunk-CIONXODE.mjs.map +1 -0
  15. package/dist/{chunk-HCA4E2RA.mjs → chunk-FLCILQD3.mjs} +1 -3
  16. package/dist/{chunk-HCA4E2RA.mjs.map → chunk-FLCILQD3.mjs.map} +1 -1
  17. package/dist/{chunk-TNXTKEGS.mjs → chunk-LKD63U62.mjs} +1 -3
  18. package/dist/{chunk-TNXTKEGS.mjs.map → chunk-LKD63U62.mjs.map} +1 -1
  19. package/dist/{chunk-NSUG7HIX.mjs → chunk-QHGAR7GR.mjs} +268 -389
  20. package/dist/chunk-QHGAR7GR.mjs.map +1 -0
  21. package/dist/{chunk-VN6OWWKF.mjs → chunk-UASWUUN2.mjs} +3 -4
  22. package/dist/{chunk-VN6OWWKF.mjs.map → chunk-UASWUUN2.mjs.map} +1 -1
  23. package/dist/events/index.js +233 -302
  24. package/dist/events/index.js.map +1 -1
  25. package/dist/events/index.mjs +6 -7
  26. package/dist/experiment/index.js +0 -1
  27. package/dist/experiment/index.js.map +1 -1
  28. package/dist/experiment/index.mjs +1 -2
  29. package/dist/{index-Cq1uZxv9.d.mts → index-AsXxRXnG.d.mts} +6 -42
  30. package/dist/{index-DHFvGrGR.d.ts → index-Hj5-xXDO.d.ts} +6 -42
  31. package/dist/index.d.mts +2 -2
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +266 -387
  34. package/dist/index.js.map +1 -1
  35. package/dist/index.mjs +7 -8
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/subscriber-X3HSLVJN.mjs +7 -0
  38. package/dist/types.d.mts +13 -4
  39. package/dist/types.d.ts +13 -4
  40. package/dist/types.js +1 -2
  41. package/dist/types.js.map +1 -1
  42. package/dist/types.mjs +1 -2
  43. package/dist/utils/index.js +0 -1
  44. package/dist/utils/index.js.map +1 -1
  45. package/dist/utils/index.mjs +1 -2
  46. package/package.json +1 -1
  47. package/dist/chunk-BE3W2SD6.mjs.map +0 -1
  48. package/dist/chunk-NSUG7HIX.mjs.map +0 -1
  49. package/dist/subscriber-VF3IYUCU.mjs +0 -8
  50. /package/dist/{subscriber-VF3IYUCU.mjs.map → subscriber-X3HSLVJN.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/index.ts","../../src/logger/index.ts","../../src/experiment/constants.ts","../../src/experiment/experiment-tracker.ts","../../src/adapters/base-adapter.ts","../../src/utils/event-id.ts","../../src/adapters/pixel-adapter.ts","../../src/adapters/multi-pixel-adapter.ts","../../src/adapters/google-adapter.ts","../../src/constants.ts","../../src/adapters/moengage-adapter.ts","../../src/adapters/posthog-adapter.ts","../../src/adapters/shopify-adapter.ts","../../src/adapters/kwikpass-adapter.ts","../../src/adapters/kwik-checkout-adapter.ts"],"sourcesContent":["// Export all available adapters\nexport { BaseAdapter } from \"./base-adapter\";\nexport { PixelAdapter } from \"./pixel-adapter\";\nexport { MultiPixelAdapter } from \"./multi-pixel-adapter\";\nexport { GoogleAdapter } from \"./google-adapter\";\nexport { MoengageAdapter } from \"./moengage-adapter\";\nexport { PostHogAdapter } from \"./posthog-adapter\";\nexport { ShopifyAdapter } from \"./shopify-adapter\";\nexport { KwikPassAdapter } from \"./kwikpass-adapter\";\nexport { KwikCheckoutAdapter } from \"./kwik-checkout-adapter\";\n\n// Export adapter configuration types from their respective files\nexport type { PixelAdapterConfig } from \"./pixel-adapter\";\nexport type { MultiPixelAdapterConfig } from \"./multi-pixel-adapter\";\nexport type { GoogleAdapterConfig } from \"./google-adapter\";\nexport type { MoengageAdapterConfig } from \"./moengage-adapter\";\nexport type { PostHogAdapterConfig } from \"./posthog-adapter\";\nexport type { ShopifyAdapterConfig } from \"./shopify-adapter\";\nexport type { KwikPassConfig } from \"./kwikpass-adapter\";\nexport type { KwikCheckoutConfig } from \"./kwik-checkout-adapter\";\n","/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n level?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n enabled?: boolean;\n name?: string;\n prettyPrint?: boolean;\n redact?: string[];\n}\n\n/**\n * Logger interface for consistent logging across adapters\n */\nexport interface Logger {\n trace: (message: string, ...args: any[]) => void;\n debug: (message: string, ...args: any[]) => void;\n info: (message: string, ...args: any[]) => void;\n warn: (message: string, ...args: any[]) => void;\n error: (message: string, error?: Error, ...args: any[]) => void;\n fatal: (message: string, error?: Error, ...args: any[]) => void;\n child: (bindings: Record<string, any>) => Logger;\n}\n\n/**\n * Log levels with numeric values for comparison\n */\nconst LOG_LEVELS = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n} as const;\n\n/**\n * No-op logger for when logging is disabled\n */\nclass NoOpLogger implements Logger {\n trace() {}\n debug() {}\n info() {}\n warn() {}\n error() {}\n fatal() {}\n child(): Logger {\n return new NoOpLogger();\n }\n}\n\n/**\n * Simple universal logger that works in all environments\n */\nclass UniversalLogger implements Logger {\n private config: Required<LoggerConfig>;\n private bindings: Record<string, any>;\n\n constructor(\n config: Required<LoggerConfig>,\n bindings: Record<string, any> = {}\n ) {\n this.config = config;\n this.bindings = bindings;\n }\n\n private shouldLog(level: keyof typeof LOG_LEVELS): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.config.level];\n }\n\n private formatMessage(\n level: string,\n message: string,\n args: any[],\n error?: Error\n ): string {\n const timestamp = new Date().toISOString();\n const name = this.config.name;\n\n let logMessage = this.config.prettyPrint\n ? `[${timestamp}] ${level.toUpperCase()} [${name}]: ${message}`\n : JSON.stringify({\n timestamp,\n level,\n name,\n message,\n ...this.bindings,\n ...(args.length > 0 && { args }),\n ...(error && {\n error: { message: error.message, stack: error.stack },\n }),\n });\n\n if (this.config.prettyPrint && args.length > 0) {\n logMessage += ` ${args\n .map((arg) =>\n typeof arg === \"object\" ? JSON.stringify(arg) : String(arg)\n )\n .join(\" \")}`;\n }\n\n if (this.config.prettyPrint && error) {\n logMessage += ` Error: ${error.message}`;\n if (error.stack) {\n logMessage += `\\n${error.stack}`;\n }\n }\n\n return this.redactSensitiveData(logMessage);\n }\n\n private redactSensitiveData(message: string): string {\n let redactedMessage = message;\n for (const field of this.config.redact) {\n const regex = new RegExp(`\"${field}\"\\\\s*:\\\\s*\"[^\"]*\"`, \"gi\");\n redactedMessage = redactedMessage.replace(\n regex,\n `\"${field}\":\"[REDACTED]\"`\n );\n }\n return redactedMessage;\n }\n\n private log(\n level: keyof typeof LOG_LEVELS,\n message: string,\n args: any[],\n error?: Error\n ): void {\n if (!this.shouldLog(level)) return;\n\n const formattedMessage = this.formatMessage(level, message, args, error);\n\n // Use appropriate console method based on level\n switch (level) {\n case \"trace\":\n console.trace(formattedMessage);\n break;\n case \"debug\":\n console.debug(formattedMessage);\n break;\n case \"info\":\n console.info(formattedMessage);\n break;\n case \"warn\":\n console.warn(formattedMessage);\n break;\n case \"error\":\n case \"fatal\":\n console.error(formattedMessage);\n break;\n }\n }\n\n trace(message: string, ...args: any[]): void {\n this.log(\"trace\", message, args);\n }\n\n debug(message: string, ...args: any[]): void {\n this.log(\"debug\", message, args);\n }\n\n info(message: string, ...args: any[]): void {\n this.log(\"info\", message, args);\n }\n\n warn(message: string, ...args: any[]): void {\n this.log(\"warn\", message, args);\n }\n\n error(message: string, error?: Error, ...args: any[]): void {\n this.log(\"error\", message, args, error);\n }\n\n fatal(message: string, error?: Error, ...args: any[]): void {\n this.log(\"fatal\", message, args, error);\n }\n\n child(bindings: Record<string, any>): Logger {\n return new UniversalLogger(this.config, { ...this.bindings, ...bindings });\n }\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n const fullConfig: Required<LoggerConfig> = {\n level: config.level || \"info\",\n enabled: config.enabled !== false,\n name: config.name || \"@shopkit/analytics\",\n prettyPrint: config.prettyPrint || false,\n redact: config.redact || [],\n };\n\n // Return no-op logger if disabled\n if (!fullConfig.enabled) {\n return new NoOpLogger();\n }\n\n return new UniversalLogger(fullConfig);\n}\n\n/**\n * Default logger instance\n */\nexport const logger = createLogger({\n enabled: true,\n level: \"info\",\n prettyPrint: false,\n});\n\n/**\n * Create adapter-specific logger\n */\nexport function createAdapterLogger(\n adapterName: string,\n config: LoggerConfig = {}\n): Logger {\n const baseLogger = createLogger(config);\n return baseLogger.child({ adapter: adapterName });\n}\n","/**\n * Prima PR A/B test experiment cookie names\n */\nexport const PRIMA_EXPERIMENT_COOKIES = {\n HOME: \"_prima_ptr_ab_home\",\n COLLECTION: \"_prima_ptr_ab_collection\",\n PRODUCT: \"_prima_ptr_ab_product\",\n} as const;\n\n/**\n * Array of all Prima experiment cookie names for iteration\n */\nexport const PRIMA_EXPERIMENT_COOKIE_NAMES = Object.values(\n PRIMA_EXPERIMENT_COOKIES\n);\n","import type { ExperimentData } from \"./types\";\nimport {\n PRIMA_EXPERIMENT_COOKIES,\n PRIMA_EXPERIMENT_COOKIE_NAMES,\n} from \"./constants\";\n\n/**\n * Get cookie value by name\n */\nfunction getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) {\n return parts.pop()?.split(\";\").shift() || null;\n }\n return null;\n}\n\n/**\n * Get experiment parameters from cookies\n */\nexport function getExperimentParams(): ExperimentData {\n const payload = {\n [PRIMA_EXPERIMENT_COOKIES.HOME]: getCookie(PRIMA_EXPERIMENT_COOKIES.HOME),\n [PRIMA_EXPERIMENT_COOKIES.COLLECTION]: getCookie(\n PRIMA_EXPERIMENT_COOKIES.COLLECTION\n ),\n [PRIMA_EXPERIMENT_COOKIES.PRODUCT]: getCookie(\n PRIMA_EXPERIMENT_COOKIES.PRODUCT\n ),\n };\n\n return payload;\n}\n\n/**\n * Check if any experiment data exists\n */\nexport function hasExperimentData(): boolean {\n return PRIMA_EXPERIMENT_COOKIE_NAMES.some(\n (cookieName) => getCookie(cookieName) !== null\n );\n}\n","import type { TEvent } from \"../types\";\nimport type { TrackingAdapter } from \"../events/subscriber\";\nimport type { TAdapterParams, IBaseAdapterParams } from \"../adapter-params\";\nimport { createAdapterLogger, type Logger, type LoggerConfig } from \"../logger\";\nimport { getExperimentParams } from \"../experiment/experiment-tracker\";\nimport type { ExperimentData } from \"../experiment/types\";\nimport { PRIMA_EXPERIMENT_COOKIES } from \"../experiment\";\n\n/**\n * Abstract base class for tracking adapters\n */\nexport abstract class BaseAdapter implements TrackingAdapter {\n /**\n * Name of the tracking adapter\n */\n public abstract readonly name: string;\n\n /**\n * Configuration for the adapter\n */\n protected config: Record<string, any>;\n\n /**\n * Logger instance for this adapter\n */\n protected logger: Logger;\n\n /**\n * Whether the adapter has been initialized\n */\n protected initialized = false;\n\n /**\n * Constructor\n * @param config Configuration for the adapter\n */\n constructor(config: Record<string, any> = {}) {\n this.config = config;\n\n // Create a generic logger - will be properly initialized by subclasses\n const loggerConfig: LoggerConfig = {\n enabled: config.enableDebugLogs ?? true,\n level: config.logLevel ?? \"info\",\n name: \"@shopkit/analytics\",\n };\n\n this.logger = createAdapterLogger(\"BaseAdapter\", loggerConfig);\n }\n\n /**\n * Initialize logger with proper adapter name\n * Should be called by subclasses after name is available\n */\n protected initializeLogger(): void {\n const loggerConfig: LoggerConfig = {\n enabled: this.config.enableDebugLogs ?? true,\n level: this.config.logLevel ?? \"info\",\n name: \"@shopkit/analytics\",\n };\n\n this.logger = createAdapterLogger(this.name, loggerConfig);\n }\n\n /**\n * Check if the adapter is enabled\n */\n public isEnabled(): boolean {\n return this.initialized;\n }\n\n /**\n * Initialize the adapter\n */\n public abstract initialize(): Promise<void>;\n\n /**\n * Track an event\n * @param event The event to track\n * @param params Optional adapter-specific parameters\n */\n public abstract trackEvent(\n event: TEvent,\n params?: TAdapterParams\n ): Promise<void>;\n\n /**\n * Extract adapter-specific parameters for this adapter\n * @param params The adapter parameters object\n * @returns Adapter-specific parameters or empty object\n */\n protected getAdapterParams(params?: TAdapterParams): IBaseAdapterParams {\n return params?.[this.name] || {};\n }\n\n /**\n * Get custom event name or fall back to default\n * @param params The adapter parameters object\n * @param defaultName The default event name to use\n * @returns Custom event name or default\n */\n protected getEventName(\n params: TAdapterParams | undefined,\n defaultName: string\n ): string {\n const adapterParams = this.getAdapterParams(params);\n return adapterParams.event_name || defaultName;\n }\n\n /**\n * Merge standard event data with adapter-specific parameters\n * @param params The adapter parameters object\n * @param standardData The standard event data\n * @returns Merged data with adapter-specific overrides\n */\n protected mergeEventData(\n standardData: Record<string, any>,\n params: TAdapterParams | undefined\n ): Record<string, any> {\n const adapterParams = this.getAdapterParams(params);\n\n // Remove event_name from adapter params to avoid conflicts\n const { event_name, ...customParams } = adapterParams;\n\n // Merge with priority: adapter-specific > standard\n return {\n ...standardData,\n ...customParams,\n };\n }\n\n /**\n * Get a configuration value\n * @param key The configuration key\n * @param defaultValue The default value if the key is not found\n */\n protected getConfig<T>(key: string, defaultValue?: T): T {\n return key in this.config ? this.config[key] : (defaultValue as T);\n }\n\n /**\n * Get affiliate parameters from session storage or custom implementation\n * Override this method to provide your own affiliate tracking implementation\n * @returns Affiliate parameters or null if not available\n */\n protected getAffiliateParams(): Record<string, string> | null {\n // Default implementation returns null\n // Users can override this method to integrate with their affiliate tracking system\n return null;\n }\n\n /**\n * Get experiment parameters from cookies\n * @returns Experiment parameters\n */\n protected getExperimentParams(): ExperimentData {\n try {\n return getExperimentParams();\n } catch (error) {\n // Silently fail if experiment tracking is not available\n return {\n [PRIMA_EXPERIMENT_COOKIES.HOME]: null,\n [PRIMA_EXPERIMENT_COOKIES.COLLECTION]: null,\n [PRIMA_EXPERIMENT_COOKIES.PRODUCT]: null,\n };\n }\n }\n\n /**\n * Enhance event parameters with affiliate data\n * @param params The original parameters\n * @returns Parameters enhanced with affiliate data\n */\n protected enhanceWithAffiliateParams(\n params: Record<string, any>\n ): Record<string, any> {\n const affiliateParams = this.getAffiliateParams();\n if (!affiliateParams) return params;\n\n return {\n ...params,\n // Add affiliate parameters\n ...affiliateParams,\n };\n }\n\n /**\n * Enhance event parameters with experiment data\n * @param params The original parameters\n * @returns Parameters enhanced with experiment data\n */\n protected enhanceWithExperimentParams(\n params: Record<string, any>\n ): Record<string, any> {\n const experimentParams = this.getExperimentParams();\n\n return {\n ...params,\n experiment: experimentParams,\n };\n }\n}\n","/**\n * Generate a unique event ID for deduplication\n * Format: timestamp_randomString_eventType\n */\nexport function generateEventId(eventType: string): string {\n const timestamp = Date.now();\n const randomString = Math.random().toString(36).substring(2, 8);\n return `${timestamp}_${randomString}_${eventType}`;\n}\n\n/**\n * Extract browser information for CAPI user data\n */\nexport function getBrowserInfo(): {\n clientUserAgent?: string;\n fbc?: string;\n fbp?: string;\n} {\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const userAgent = navigator.userAgent;\n\n // Get Facebook click ID from URL or cookies\n const fbc = getFacebookClickId();\n const fbp = getFacebookBrowserId();\n\n return {\n clientUserAgent: userAgent,\n fbc,\n fbp,\n };\n}\n\n/**\n * Get Facebook click ID (fbc) from URL parameters or cookies\n */\nfunction getFacebookClickId(): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n // Check URL parameters first\n const urlParams = new URLSearchParams(window.location.search);\n const fbclid = urlParams.get(\"fbclid\");\n\n if (fbclid) {\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n\n // Check cookies\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split(\"=\");\n if (name === \"_fbc\") {\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get Facebook browser ID (fbp) from cookies\n */\nfunction getFacebookBrowserId(): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split(\"=\");\n if (name === \"_fbp\") {\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get client IP address (this will be handled server-side)\n */\nexport function getClientIpAddress(request?: Request): string | undefined {\n if (!request) {\n return undefined;\n }\n\n // Try different headers for IP address\n const forwarded = request.headers.get(\"x-forwarded-for\");\n const realIp = request.headers.get(\"x-real-ip\");\n const cfConnectingIp = request.headers.get(\"cf-connecting-ip\");\n\n return forwarded?.split(\",\")[0] || realIp || cfConnectingIp || undefined;\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IAddToCartEvent,\n type IProductViewEvent,\n type IViewContentEvent,\n type ISearchEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\nimport { generateEventId, getBrowserInfo } from \"../utils/event-id\";\n\ndeclare global {\n interface Window {\n fbq?: (\n type: string,\n eventName: string,\n params?: Record<string, any>,\n options?: { eventID?: string }\n ) => void;\n }\n}\n\n/**\n * Configuration for the Facebook Pixel adapter\n */\nexport interface PixelAdapterConfig {\n /**\n * Facebook Pixel ID\n */\n pixelId: string;\n /**\n * Enable server-side CAPI backup\n * @default true - CAPI is enabled by default for better data reliability\n */\n enableCAPI?: boolean;\n}\n\n/**\n * Facebook Pixel tracking adapter\n * Assumes that the Facebook Pixel script is already loaded in the page\n */\nexport class PixelAdapter extends BaseAdapter {\n public readonly name = \"FacebookPixel\";\n\n constructor(config: PixelAdapterConfig) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize the Facebook Pixel\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n this.logger.debug(\"Already initialized\");\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n this.logger.debug(\"Skipping initialization on server\");\n return;\n }\n\n // Check if fbq is available\n if (!window.fbq) {\n this.logger.warn(\n \"Facebook Pixel fbq not found. Make sure the script is loaded.\"\n );\n return;\n } else {\n const pixelId = this.getConfig(\"pixelId\") as string;\n if (!pixelId) {\n this.logger.warn(\"Pixel ID not provided. Skipping fbq init.\");\n } else {\n // Check if pixel is already initialized to avoid duplicate init\n const isAlreadyInitialized =\n (window as any)._fbq?.loaded ||\n (window as any).fbq?.loaded ||\n document\n .querySelector(`script[src*=\"fbevents.js\"]`)\n ?.getAttribute(\"data-pixel-id\") === pixelId;\n\n if (!isAlreadyInitialized) {\n window.fbq(\"init\", pixelId);\n this.logger.info(\"Successfully initialized\", { pixelId: \"***\" });\n } else {\n this.logger.info(\"Pixel already initialized, skipping init\", {\n pixelId: \"***\",\n });\n }\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Track an event with Facebook Pixel\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n // Generate unique event ID for deduplication if not already present\n if (!event.eventId) {\n event.eventId = generateEventId(event.type);\n }\n\n // Ensure timestamp is always available for both client and server tracking\n if (!event.timestamp) {\n event.timestamp = Date.now();\n }\n\n this.logger.debug(\"Tracking event\", {\n eventType: event.type,\n eventId: event.eventId,\n timestamp: event.timestamp,\n });\n\n // Track client-side (browser pixel)\n await this.trackClientSide(event, adapterParams);\n\n // Track server-side (CAPI) as backup\n if (this.getConfig(\"enableCAPI\", true)) {\n await this.trackServerSide(event, adapterParams);\n }\n }\n\n /**\n * Track event on client-side (browser pixel)\n */\n private async trackClientSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\" || !window.fbq) {\n this.logger.warn(\n \"Cannot track client-side event, adapter not initialized or fbq not available\",\n {\n eventType: event.type,\n initialized: this.initialized,\n hasWindow: typeof window !== \"undefined\",\n hasFbq: !!window?.fbq,\n }\n );\n return;\n }\n\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n // Add event_id for deduplication\n if (event.eventId) {\n window.fbq?.(\"track\", eventName, enhancedParams, {\n eventID: event.eventId,\n });\n } else {\n window.fbq?.(\"track\", eventName, enhancedParams);\n }\n\n this.logger.debug(`${eventName} event tracked on client-side`, {\n eventName,\n eventId: event.eventId,\n params: enhancedParams,\n });\n }\n\n /**\n * Track event on server-side (CAPI) as backup\n */\n private async trackServerSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n try {\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n const browserInfo = getBrowserInfo();\n\n const payload = {\n eventName,\n eventId: event.eventId,\n timestamp: event.timestamp,\n enhancedParams: enhancedParams,\n userInfo: browserInfo,\n };\n\n const response = await fetch(\"/api/events\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Server-side tracking failed: ${response.status}`);\n }\n\n this.logger.debug(`${eventName} event sent to server-side`, {\n eventId: event.eventId,\n params: enhancedParams,\n });\n } catch (error) {\n this.logger.error(\n `FB Pixel: Server-side tracking failed for event ${event.type}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Utility function to format event payload for both client and server-side tracking\n */\n private formatEventPayload(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): { eventName: string; enhancedParams: Record<string, any> } {\n let baseParams: Record<string, any> = {};\n let eventName = \"\";\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n const pageViewEvent = event as IPageViewEvent;\n eventName = this.getEventName(adapterParams, \"PageView\");\n baseParams = {\n // Facebook-compatible parameters\n content_name: pageViewEvent.page_title || pageViewEvent.title,\n content_category: pageViewEvent.event_category,\n // Custom parameters that Facebook will accept in custom_data\n page_location: pageViewEvent.page_location || pageViewEvent.path,\n page_title: pageViewEvent.page_title || pageViewEvent.title,\n page_referrer: pageViewEvent.page_referrer || pageViewEvent.referrer,\n page_path: pageViewEvent.page_path || pageViewEvent.path,\n };\n break;\n\n case EventType.VIEW_CONTENT:\n const viewContentEvent = event as IViewContentEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: viewContentEvent.content_type || \"product\",\n content_ids: viewContentEvent.content_ids || [],\n content_name: viewContentEvent.content_name || \"\",\n content_category: viewContentEvent.content_category || \"\",\n value: viewContentEvent.value || 0,\n currency: viewContentEvent.currency || \"INR\",\n };\n break;\n\n case EventType.PRODUCT_VIEW:\n const productEvent = event as IProductViewEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [productEvent.productId],\n content_name: productEvent.productName,\n content_category: productEvent.category,\n value: productEvent.price,\n currency: productEvent.currency || \"INR\",\n };\n break;\n\n case EventType.ADD_TO_CART:\n const cartEvent = event as IAddToCartEvent;\n eventName = this.getEventName(adapterParams, \"AddToCart\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [cartEvent.productId],\n content_name: cartEvent.productName,\n value: cartEvent.price,\n currency: cartEvent.currency || \"INR\",\n };\n break;\n\n case EventType.SEARCH:\n const searchEvent = event as ISearchEvent;\n eventName = this.getEventName(adapterParams, \"Search\");\n baseParams = {\n search_string: searchEvent.searchTerm,\n content_category: \"product\",\n content_ids: searchEvent.content_ids || [],\n };\n break;\n\n default:\n // Skip tracking for unknown event types\n this.logger.debug(`Skipping unknown event type: ${event.type}`);\n return { eventName: \"\", enhancedParams: {} };\n }\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n return { eventName, enhancedParams };\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IAddToCartEvent,\n type IProductViewEvent,\n type IViewContentEvent,\n type ISearchEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\nimport { generateEventId, getBrowserInfo } from \"../utils/event-id\";\n\ndeclare global {\n interface Window {\n fbq?: (\n type: string,\n eventName: string,\n params?: Record<string, any>,\n options?: { eventID?: string }\n ) => void;\n }\n}\n\n/**\n * Configuration for a single Facebook Pixel\n */\ninterface SinglePixelConfig {\n /**\n * Facebook Pixel ID\n */\n pixelId: string;\n /**\n * Optional name/label for this pixel (for logging/debugging)\n */\n name?: string;\n /**\n * Enable server-side CAPI backup for this pixel\n * @default true\n */\n enableCAPI?: boolean;\n}\n\n/**\n * Configuration for the Multi-Pixel adapter\n */\nexport interface MultiPixelAdapterConfig {\n /**\n * Array of pixel configurations\n */\n pixels: SinglePixelConfig[];\n /**\n * Global CAPI setting (can be overridden per pixel)\n * @default true\n */\n enableCAPI?: boolean;\n}\n\n/**\n * Internal pixel instance for tracking\n */\ninterface PixelInstance {\n config: SinglePixelConfig;\n initialized: boolean;\n}\n\n/**\n * Multi-Pixel Facebook tracking adapter\n * Supports multiple Facebook Pixels with individual configurations\n */\nexport class MultiPixelAdapter extends BaseAdapter {\n public readonly name = \"MultiPixelFacebook\";\n private pixels: PixelInstance[] = [];\n\n constructor(config: MultiPixelAdapterConfig) {\n super(config);\n\n // Validate configuration\n if (!config.pixels || config.pixels.length === 0) {\n throw new Error(\n \"MultiPixelAdapter requires at least one pixel configuration\"\n );\n }\n\n // Initialize pixel instances\n this.pixels = config.pixels.map((pixelConfig) => ({\n config: {\n enableCAPI: config.enableCAPI ?? true,\n ...pixelConfig,\n },\n initialized: false,\n }));\n\n this.initializeLogger();\n }\n\n /**\n * Initialize all Facebook Pixels\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n this.logger.debug(\"Already initialized\");\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n this.logger.debug(\"Skipping initialization on server\");\n return;\n }\n\n // Check if fbq is available\n if (!window.fbq) {\n this.logger.warn(\n \"Facebook Pixel fbq not found. Make sure the script is loaded.\"\n );\n return;\n }\n\n // Initialize each pixel\n for (const pixel of this.pixels) {\n const { pixelId, name } = pixel.config;\n const pixelLabel = name || pixelId;\n\n try {\n window.fbq!(\"init\", pixelId);\n this.logger.info(`Initialized pixel: ${pixelLabel}`, {\n pixelId: \"***\",\n });\n pixel.initialized = true;\n } catch (error) {\n this.logger.error(\n `Failed to initialize pixel: ${pixelLabel}`,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n this.initialized = true;\n this.logger.info(`Successfully initialized ${this.pixels.length} pixels`);\n }\n\n /**\n * Track an event across all configured pixels\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n // Generate unique event ID for deduplication if not already present\n if (!event.eventId) {\n event.eventId = generateEventId(event.type);\n }\n\n // Ensure timestamp is always available\n if (!event.timestamp) {\n event.timestamp = Date.now();\n }\n\n this.logger.debug(\"Tracking event across multiple pixels\", {\n eventType: event.type,\n eventId: event.eventId,\n pixelCount: this.pixels.length,\n });\n\n // Track client-side once (fbq automatically sends to all initialized pixels)\n await this.trackClientSide(event, adapterParams);\n\n // Track server-side for each pixel (requires individual API calls)\n if (this.pixels.some((pixel) => pixel.config.enableCAPI)) {\n await this.trackServerSide(event, adapterParams);\n }\n }\n\n /**\n * Track event on client-side once (Facebook automatically sends to all initialized pixels)\n */\n private async trackClientSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (typeof window === \"undefined\" || !window.fbq) {\n this.logger.warn(\"Cannot track client-side event, fbq not available\", {\n eventType: event.type,\n hasWindow: typeof window !== \"undefined\",\n hasFbq: !!window?.fbq,\n });\n return;\n }\n\n // Check if any pixel is initialized\n const hasInitializedPixel = this.pixels.some((pixel) => pixel.initialized);\n if (!hasInitializedPixel) {\n this.logger.warn(\"No pixels initialized for client-side tracking\");\n return;\n }\n\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n // Single fbq call automatically sends to all initialized pixels\n if (event.eventId) {\n window.fbq?.(\"track\", eventName, enhancedParams, {\n eventID: event.eventId,\n });\n } else {\n window.fbq?.(\"track\", eventName, enhancedParams);\n }\n\n this.logger.debug(\n `${eventName} event tracked on client-side for all pixels`,\n {\n eventName,\n eventId: event.eventId,\n pixelCount: this.pixels.length,\n }\n );\n }\n\n /**\n * Track event on server-side for all enabled pixels\n */\n private async trackServerSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n try {\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n const browserInfo = getBrowserInfo();\n\n const payload = {\n eventName,\n eventId: event.eventId,\n timestamp: event.timestamp,\n enhancedParams: enhancedParams,\n userInfo: browserInfo,\n // Send all pixel info to the multi-pixel endpoint\n pixels: this.pixels\n .filter((pixel) => pixel.config.enableCAPI)\n .map((pixel) => ({\n pixelId: pixel.config.pixelId,\n name: pixel.config.name,\n })),\n };\n\n const endpoint = this.getConfig(\"capiEndpoint\", \"/api/events/multi\");\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Server-side tracking failed: ${response.status}`);\n }\n\n this.logger.debug(\n `${eventName} event sent to server-side for all pixels`,\n {\n eventId: event.eventId,\n pixelCount: this.pixels.filter((pixel) => pixel.config.enableCAPI)\n .length,\n }\n );\n } catch (error) {\n this.logger.error(\n `Server-side tracking failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Format event payload with pixel-specific customizations\n */\n private formatEventPayload(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): { eventName: string; enhancedParams: Record<string, any> } {\n let baseParams: Record<string, any> = {};\n let eventName = \"\";\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n const pageViewEvent = event as IPageViewEvent;\n eventName = this.getEventName(adapterParams, \"PageView\");\n baseParams = {\n content_name: pageViewEvent.page_title || pageViewEvent.title,\n content_category: pageViewEvent.event_category,\n page_location: pageViewEvent.page_location || pageViewEvent.path,\n page_title: pageViewEvent.page_title || pageViewEvent.title,\n page_referrer: pageViewEvent.page_referrer || pageViewEvent.referrer,\n page_path: pageViewEvent.page_path || pageViewEvent.path,\n };\n break;\n\n case EventType.VIEW_CONTENT:\n const viewContentEvent = event as IViewContentEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: viewContentEvent.content_type || \"product\",\n content_ids: viewContentEvent.content_ids || [],\n content_name: viewContentEvent.content_name || \"\",\n content_category: viewContentEvent.content_category || \"\",\n value: viewContentEvent.value || 0,\n currency: viewContentEvent.currency || \"INR\",\n };\n break;\n\n case EventType.PRODUCT_VIEW:\n const productEvent = event as IProductViewEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [productEvent.productId],\n content_name: productEvent.productName,\n content_category: productEvent.category,\n value: productEvent.price,\n currency: productEvent.currency || \"INR\",\n };\n break;\n\n case EventType.ADD_TO_CART:\n const cartEvent = event as IAddToCartEvent;\n eventName = this.getEventName(adapterParams, \"AddToCart\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [cartEvent.productId],\n content_name: cartEvent.productName,\n value: cartEvent.price,\n currency: cartEvent.currency || \"INR\",\n };\n break;\n\n case EventType.SEARCH:\n const searchEvent = event as ISearchEvent;\n eventName = this.getEventName(adapterParams, \"Search\");\n baseParams = {\n search_string: searchEvent.searchTerm,\n content_category: \"product\",\n content_ids: searchEvent.content_ids || [],\n };\n break;\n\n default:\n // Skip tracking for unknown event types\n this.logger.debug(`Skipping unknown event type: ${event.type}`);\n return { eventName: \"\", enhancedParams: {} };\n }\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n return { eventName, enhancedParams };\n }\n\n /**\n * Get configuration for all pixels\n */\n public getPixelConfigs(): SinglePixelConfig[] {\n return this.pixels.map((pixel) => pixel.config);\n }\n\n /**\n * Get initialization status for all pixels\n */\n public getPixelStatus(): Array<{\n pixelId: string;\n name?: string;\n initialized: boolean;\n }> {\n return this.pixels.map((pixel) => ({\n pixelId: pixel.config.pixelId,\n name: pixel.config.name,\n initialized: pixel.initialized,\n }));\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IFormSubmissionEvent,\n type IViewItemEvent,\n type IViewedProductEvent,\n type IAddToCartEvent,\n type ICheckoutStartedEvent,\n type ICheckoutCompletedEvent,\n type ISearchEvent,\n type ICustomEvent,\n type IAddPaymentInfoEvent,\n type ICheckoutPaymentEvent,\n type IViewSearchResultsEvent,\n type IOrderPlacedEvent,\n type IBeginCheckoutEvent,\n type IViewContentEvent,\n type IPurchaseEvent,\n type ISpecificEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\ndeclare global {\n interface Window {\n gtag?: (...args: any[]) => void;\n }\n}\n\n/**\n * Configuration for the Google Analytics adapter\n */\nexport interface GoogleAdapterConfig {\n /**\n * Google Analytics measurement ID (e.g., G-XXXXXXXXXX)\n */\n measurementId: string;\n}\n\n/**\n * Google Analytics tracking adapter\n * Assumes that the Google Analytics script is already loaded in the page\n */\nexport class GoogleAdapter extends BaseAdapter {\n public readonly name = \"GoogleAnalytics\";\n\n constructor(config: GoogleAdapterConfig) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize Google Analytics adapter\n * This just checks if gtag is available\n */\n public isEnabled(): boolean {\n const enabled =\n this.initialized && typeof window !== \"undefined\" && !!window.gtag;\n\n this.logger.debug(\"Checking if enabled\", {\n initialized: this.initialized,\n hasWindow: typeof window !== \"undefined\",\n hasGtag: !!window?.gtag,\n enabled,\n });\n\n return enabled;\n }\n\n public async initialize(): Promise<void> {\n this.logger.info(\"Starting initialization\");\n\n if (this.initialized) {\n this.logger.debug(\"Already initialized\");\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n this.logger.debug(\"Skipping initialization on server\");\n return;\n }\n\n const measurementId = this.getConfig<string>(\"measurementId\");\n this.logger.info(\"Using measurement ID\", { measurementId });\n\n // Check if gtag is available\n if (!window.gtag) {\n this.logger.warn(\n \"Google Analytics gtag not found. Make sure the script is loaded.\"\n );\n return;\n }\n\n this.initialized = true;\n this.logger.info(\"Successfully initialized\", { measurementId });\n }\n\n /**\n * Track an event with Google Analytics\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n this.logger.debug(\"Attempting to track event\", {\n initialized: this.initialized,\n hasWindow: typeof window !== \"undefined\",\n hasGtag: !!window?.gtag,\n eventType: event.type,\n });\n\n if (!this.initialized || typeof window === \"undefined\" || !window.gtag) {\n this.logger.warn(\n \"Cannot track event, adapter not initialized or gtag not available\",\n {\n eventType: event.type,\n initialized: this.initialized,\n hasWindow: typeof window !== \"undefined\",\n hasGtag: !!window?.gtag,\n }\n );\n return;\n }\n\n const measurementId = this.getConfig<string>(\"measurementId\");\n this.logger.info(\"Tracking event\", {\n eventType: event.type,\n measurementId,\n });\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n this.trackPageView(\n event as IPageViewEvent,\n measurementId,\n adapterParams\n );\n break;\n case EventType.USER_ENGAGEMENT:\n this.trackUserEngagement(adapterParams);\n break;\n case EventType.SESSION_START:\n this.trackSessionStart(adapterParams);\n break;\n case EventType.FIRST_VISIT:\n this.trackFirstVisit(adapterParams);\n break;\n case EventType.VIEW_ITEM:\n this.trackViewItem(event as IViewItemEvent, adapterParams);\n break;\n case EventType.VIEWED_PRODUCT:\n this.trackViewedProduct(event as IViewedProductEvent, adapterParams);\n break;\n case EventType.CHECKOUT_PAYMENT:\n this.trackCheckoutPayment(\n event as ICheckoutPaymentEvent,\n adapterParams\n );\n break;\n case EventType.SCROLL:\n this.trackScroll(adapterParams);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event as IAddToCartEvent, adapterParams);\n break;\n case EventType.FORM_START:\n this.trackFormStart(adapterParams);\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(\n event as ICheckoutStartedEvent,\n adapterParams\n );\n break;\n case EventType.FORM_SUBMISSION:\n this.trackFormSubmission(event as IFormSubmissionEvent, adapterParams);\n break;\n case EventType.SEARCH:\n this.trackSearch(event as ISearchEvent, adapterParams);\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(\n event as ICheckoutCompletedEvent,\n adapterParams\n );\n break;\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(event as IAddPaymentInfoEvent, adapterParams);\n break;\n case EventType.VIEW_CONTENT:\n this.trackViewContent(event as IViewContentEvent, adapterParams);\n break;\n case EventType.PURCHASE:\n this.trackPurchase(event as IPurchaseEvent, adapterParams);\n break;\n case EventType.VIEW_SEARCH_RESULTS:\n this.trackViewSearchResults(\n event as IViewSearchResultsEvent,\n adapterParams\n );\n break;\n case EventType.ORDER_PLACED:\n this.trackOrderPlaced(event as IOrderPlacedEvent, adapterParams);\n break;\n case EventType.BEGIN_CHECKOUT:\n this.trackBeginCheckout(event as IBeginCheckoutEvent, adapterParams);\n break;\n case EventType.CUSTOM:\n this.trackCustomEvent(event as ICustomEvent, adapterParams);\n break;\n case EventType.SPECIFIC:\n this.trackSpecificEvent(event as ISpecificEvent, adapterParams);\n break;\n default: {\n this.logger.debug(\"Unhandled event type\", { eventType: event.type });\n break;\n }\n }\n }\n\n /**\n * Track a page view event\n * @param event The page view event\n * @param measurementId The Google Analytics measurement ID\n */\n private trackPageView(\n event: IPageViewEvent,\n measurementId: string,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"page_view\");\n const baseParams = {\n page_path: event.path,\n page_title: event.title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer || undefined,\n ga_session_id: event.ga_session_id || \"\",\n ga_session_number: event.ga_session_number || \"\",\n gclid: event.gclid || \"\",\n engagement_time_msec: event.engagement_time_msec,\n campaign: event.campaign || \"\",\n campaign_id: event.campaign_id || \"\",\n content: event.content || \"\",\n debug_mode: event.debug_mode,\n medium: event.medium || \"\",\n source: event.page_source || \"\",\n page_term: event.page_term || \"\",\n ignore_referrer: event.ignore_referrer,\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n user_id: event.user_id,\n user_properties: event.user_properties,\n session_engaged: event.session_engaged,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackUserEngagement(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"user_engagement\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n campaign: \"\",\n ga_session_id: \"\",\n ga_session_number: \"\",\n gclid: \"\",\n ignore_referrer: \"\",\n medium: \"\",\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n source: \"\",\n srsltid: \"\",\n term: \"\",\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackSessionStart(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"session_start\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n campaign: \"\",\n campaign_id: \"\",\n content: \"\",\n ga_session_id: \"\",\n ga_session_number: \"\",\n gclid: \"\",\n ignore_referrer: \"\",\n medium: \"\",\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n source: \"\",\n srsltid: \"\",\n term: \"\",\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackFirstVisit(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"first_visit\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n campaign: \"\",\n campaign_id: \"\",\n content: \"\",\n debug_mode: \"\",\n engagement_time_msec: 0,\n entrances: 1,\n ga_session_id: \"\",\n ga_session_number: \"\",\n gclid: \"\",\n ignore_referrer: \"\",\n medium: \"\",\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n page_source: \"\",\n page_term: \"\",\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackViewItem(\n event: IViewItemEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"view_item\");\n const baseParams = {\n currency: event.currency,\n value: event.value,\n items: event.items,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackScroll(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"scroll\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n percent_scrolled: 90, // or dynamically captured\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackCheckoutPayment(\n event: ICheckoutPaymentEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"checkout_payment\");\n const baseParams = {\n currency: event.currency,\n value: event.cartValue,\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackViewedProduct(\n event: IViewedProductEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"viewed_product\");\n const baseParams = {\n currency: event.currency,\n value: event.price,\n items: [\n {\n item_id: event.productId,\n item_name: event.productName,\n price: event.price,\n currency: event.currency,\n },\n ],\n view_duration: event.viewDuration,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackAddToCart(\n event: IAddToCartEvent,\n adapterParams?: TAdapterParams\n ): void {\n this.logger.debug(\"Processing add_to_cart event\", { event });\n\n const eventName = this.getEventName(adapterParams, \"add_to_cart\");\n const baseParams = {\n currency: event.currency || \"INR\",\n value: event.price * (event.quantity || 1), // Calculate total value\n items: [\n {\n item_id: event.productId,\n item_name: event.productName,\n price: event.price,\n quantity: event.quantity || 1,\n item_variant: event.variant,\n },\n ],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n this.logger.debug(\"Sending add_to_cart event to gtag\", {\n eventName,\n params: enhancedParams,\n });\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackFormStart(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"form_start\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n first_field_id: \"\",\n first_field_name: \"\",\n first_field_position: \"\",\n first_field_type: \"\",\n form_destination: \"\",\n form_length: \"\",\n form_id: \"\",\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackCheckoutStarted(\n event: ICheckoutStartedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"begin_checkout\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n currency: event.currency || \"INR\",\n ecomm_pagetype: \"\",\n ecomm_prodid: \"\",\n ecomm_totalvalue: event.cartValue,\n value: event.cartValue,\n engagement_time_msec: undefined,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n item_variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackFormSubmission(\n event: IFormSubmissionEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"form_submit\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n form_destination: \"\",\n form_length: \"\",\n form_id: event.formId,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackSearch(\n event: ISearchEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"search\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n search_term: event.searchTerm,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n */\n private trackCheckoutCompleted(\n event: ICheckoutCompletedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"purchase\");\n const baseParams = {\n transaction_id: event.orderId,\n currency: event.currency || \"INR\",\n value: event.cartValue,\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n item_variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a custom event\n * @param event The custom event\n */\n private trackCustomEvent(\n event: ICustomEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"custom\"); // this will support all custom event\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a specific event\n * @param event The specific event\n */\n private trackSpecificEvent(\n event: ISpecificEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"\"); // this will support all custom event\n if (!eventName) {\n return;\n }\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track an add payment info event\n * @param event The add payment info event\n */\n private trackAddPaymentInfo(\n event: IAddPaymentInfoEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"add_payment_info\");\n const baseParams = {\n currency: event.currency || \"INR\",\n value: event.cartValue,\n payment_type: event.paymentType || \"\",\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n item_variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a view content event\n * @param event The view content event\n */\n private trackViewContent(\n event: IViewContentEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"view_item\");\n const baseParams = {\n currency: event.currency || \"USD\",\n value: event.value || 0,\n items:\n event.items?.map((item: any) => ({\n item_id: item.item_id,\n item_name: item.item_name,\n item_category: item.item_category,\n item_category2: item.item_category2,\n item_category3: item.item_category3,\n item_category4: item.item_category4,\n item_category5: item.item_category5,\n item_brand: item.item_brand,\n item_variant: item.item_variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a purchase event\n * @param event The purchase event\n */\n private trackPurchase(\n event: IPurchaseEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"purchase\");\n const baseParams = {\n transaction_id: event.transaction_id,\n value: event.value,\n currency: event.currency || \"USD\",\n coupon: event.coupon,\n shipping: event.shipping,\n tax: event.tax,\n items:\n event.items?.map((item: any) => ({\n item_id: item.item_id,\n item_name: item.item_name,\n item_category: item.item_category,\n item_category2: item.item_category2,\n item_category3: item.item_category3,\n item_category4: item.item_category4,\n item_category5: item.item_category5,\n item_brand: item.item_brand,\n item_variant: item.item_variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a view search results event\n * @param event The view search results event\n */\n private trackViewSearchResults(\n event: IViewSearchResultsEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"view_search_results\");\n const baseParams = {\n search_term: event.search_term,\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track an order placed event\n * @param event The order placed event\n */\n private trackOrderPlaced(\n event: IOrderPlacedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"purchase\");\n const baseParams = {\n transaction_id: event.order_id,\n value: event.total_amount,\n currency: event.currency || \"USD\",\n items:\n event.items?.map((item: any) => ({\n item_id: item.product_id,\n item_name: item.product_name,\n item_category: item.category,\n item_brand: item.brand,\n item_variant: item.variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a begin checkout event\n * @param event The begin checkout event\n */\n private trackBeginCheckout(\n event: IBeginCheckoutEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"begin_checkout\");\n const baseParams = {\n currency: event.currency || \"USD\",\n value: event.value || 0,\n coupon: event.coupon,\n items:\n event.items?.map((item: any) => ({\n item_id: item.item_id,\n item_name: item.item_name,\n item_category: item.item_category,\n item_category2: item.item_category2,\n item_category3: item.item_category3,\n item_category4: item.item_category4,\n item_category5: item.item_category5,\n item_brand: item.item_brand,\n item_variant: item.item_variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Convert an event to Google Analytics parameters\n * @param event The event to convert\n */\n private eventToParams(event: TEvent): Record<string, any> {\n // Remove type and timestamp from the event\n const { type, timestamp, ...params } = event;\n const affiliateParams = this.enhanceWithAffiliateParams(params);\n return this.enhanceWithExperimentParams(affiliateParams);\n }\n}\n","/**\n * Event name constants for tracking platforms\n */\nexport const EventNames = {\n // Page events\n PAGE_VIEWED: \"Page Viewed\",\n\n // Interaction events\n BUTTON_CLICKED: \"Button Clicked\",\n FORM_SUBMITTED: \"Form Submitted\",\n\n // Product events\n PRODUCT_VIEWED: \"Product Viewed\",\n ADDED_TO_CART: \"Added To Cart\",\n REMOVED_FROM_CART: \"Removed From Cart\",\n\n // Checkout events\n CHECKOUT_STARTED: \"Checkout Started\",\n PURCHASE_COMPLETED: \"Purchase Completed\",\n\n // Search events\n SEARCH: \"Search\",\n\n // User events\n USER_SIGNED_UP: \"User Signed Up\",\n USER_LOGGED_IN: \"User Logged In\",\n};\n\n/**\n * Default currency code\n */\nexport const DEFAULT_CURRENCY = \"INR\";\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IButtonClickEvent,\n type IFormSubmissionEvent,\n type IProductViewEvent,\n type IAddToCartEvent,\n type IRemoveFromCartEvent,\n type ICheckoutStartedEvent,\n type ICheckoutCompletedEvent,\n type ISearchEvent,\n type IUserSignupEvent,\n type IUserLoginEvent,\n type ICustomEvent,\n ISpecificEvent,\n} from \"../types\";\nimport { EventNames, DEFAULT_CURRENCY } from \"../constants\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\nimport moengage from \"@moengage/web-sdk\";\n\n/**\n * Configuration for the MoenGage adapter\n */\nexport interface MoengageAdapterConfig {\n /**\n * MoenGage App ID (required for SDK initialization)\n */\n appId: string;\n /**\n * Whether to enable user identification\n */\n enableUserIdentification?: boolean;\n /**\n * Debug mode for MoenGage SDK\n */\n debug?: boolean;\n /**\n * Data center region (default: 'dc_01')\n */\n region?: string;\n}\n\n/**\n * MoenGage tracking adapter using the official Web SDK\n */\nexport class MoengageAdapter extends BaseAdapter {\n public readonly name = \"MoEngage\";\n\n constructor(config: MoengageAdapterConfig) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Get MoEngage SDK instance from window\n */\n private getMoengageSDK(): any {\n return typeof window !== \"undefined\" ? (window as any).Moengage : null;\n }\n\n /**\n * Initialize the MoenGage adapter using the Web SDK\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n this.logger.debug(\"Already initialized\");\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n this.logger.debug(\"Skipping initialization on server\");\n return;\n }\n\n try {\n const appId = this.getConfig<string>(\"appId\");\n if (!appId) {\n this.logger.warn(\"App ID is required for initialization\");\n return;\n }\n\n // Initialize MoenGage SDK\n const region = this.getConfig<string>(\"region\", \"dc_01\");\n const config = {\n app_id: appId,\n debug_logs: this.getConfig<boolean>(\"debug\", false) ? 1 : 0,\n cluster: region,\n disableCookies: true,\n };\n\n this.logger.info(\"Initializing with config\", {\n region,\n debug: this.getConfig<boolean>(\"debug\", false),\n appId: \"***\", // Hide sensitive data\n });\n\n // Initialize MoEngage SDK\n moengage.initialize(config);\n\n this.logger.info(\"Successfully initialized with SDK\");\n this.initialized = true;\n } catch (error) {\n this.logger.error(\"Failed to initialize\", error as Error);\n }\n }\n\n /**\n * Track an event with MoenGage SDK\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n const sdk = this.getMoengageSDK();\n if (!this.initialized || typeof window === \"undefined\" || !sdk) {\n this.logger.warn(\n \"Cannot track event, adapter not initialized or SDK not available\",\n {\n eventType: event.type,\n initialized: this.initialized,\n hasWindow: typeof window !== \"undefined\",\n hasSdk: !!sdk,\n }\n );\n return;\n }\n\n this.logger.debug(\"Tracking event\", { eventType: event.type });\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n this.trackPageView(event as IPageViewEvent, adapterParams);\n break;\n case EventType.BUTTON_CLICK:\n this.trackButtonClick(event as IButtonClickEvent, adapterParams);\n break;\n case EventType.FORM_SUBMISSION:\n this.trackFormSubmission(event as IFormSubmissionEvent, adapterParams);\n break;\n case EventType.PRODUCT_VIEW:\n this.trackProductView(event as IProductViewEvent, adapterParams);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event as IAddToCartEvent, adapterParams);\n break;\n case EventType.REMOVE_FROM_CART:\n this.trackRemoveFromCart(event as IRemoveFromCartEvent, adapterParams);\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(\n event as ICheckoutStartedEvent,\n adapterParams\n );\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(\n event as ICheckoutCompletedEvent,\n adapterParams\n );\n break;\n case EventType.SEARCH:\n this.trackSearch(event as ISearchEvent, adapterParams);\n break;\n case EventType.USER_SIGNUP:\n this.trackUserSignup(event as IUserSignupEvent, adapterParams);\n break;\n case EventType.USER_LOGIN:\n this.trackUserLogin(event as IUserLoginEvent, adapterParams);\n break;\n case EventType.CUSTOM:\n this.trackCustomEvent(event as ICustomEvent, adapterParams);\n break;\n case EventType.SPECIFIC:\n this.trackSpecificEvent(event as ISpecificEvent, adapterParams);\n break;\n default:\n this.logger.debug(\"Unhandled event type\", { eventType: event.type });\n break;\n }\n }\n\n /**\n * Track a page view event\n * @param event The page view event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackPageView(\n event: IPageViewEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n if (!sdk?.track_event) {\n this.logger.warn(\"track_event not available for PageView event\");\n return;\n }\n\n const eventName = this.getEventName(adapterParams, EventNames.PAGE_VIEWED);\n const baseEventData = {\n page_path: event.path,\n page_title: event.title,\n page_url: window.location.href,\n referrer: event.referrer || document.referrer,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n\n sdk.track_event(eventName, enhancedEventData);\n this.logger.debug(\"PageView event tracked\", {\n eventName,\n eventData: enhancedEventData,\n });\n }\n\n /**\n * Track a button click event\n * @param event The button click event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackButtonClick(\n event: IButtonClickEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.BUTTON_CLICKED\n );\n const baseEventData = {\n button_id: event.buttonId,\n button_text: event.buttonText,\n location: event.location,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a form submission event\n * @param event The form submission event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackFormSubmission(\n event: IFormSubmissionEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.FORM_SUBMITTED\n );\n const baseEventData = {\n form_id: event.formId,\n form_name: event.formName,\n success: event.success,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a product view event\n * @param event The product view event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackProductView(\n event: IProductViewEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.PRODUCT_VIEWED\n );\n const baseEventData = {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency || DEFAULT_CURRENCY,\n category: event.category,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track an add to cart event\n * @param event The add to cart event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackAddToCart(\n event: IAddToCartEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const quantity = event.quantity ?? 1;\n const eventName = this.getEventName(\n adapterParams,\n EventNames.ADDED_TO_CART\n );\n const baseEventData = {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency || DEFAULT_CURRENCY,\n quantity: quantity,\n variant: event.variant,\n total_value: event.price * quantity,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a remove from cart event\n * @param event The remove from cart event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackRemoveFromCart(\n event: IRemoveFromCartEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.REMOVED_FROM_CART\n );\n const baseEventData = {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency || DEFAULT_CURRENCY,\n quantity: event.quantity,\n variant: event.variant,\n total_value: event.price * event.quantity,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a checkout started event\n * @param event The checkout started event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCheckoutStarted(\n event: ICheckoutStartedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.CHECKOUT_STARTED\n );\n const baseEventData = {\n cart_value: event.cartValue,\n currency: event.currency || DEFAULT_CURRENCY,\n item_count: event.itemCount,\n items: event.items.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCheckoutCompleted(\n event: ICheckoutCompletedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.PURCHASE_COMPLETED\n );\n const baseEventData = {\n order_id: event.orderId,\n cart_value: event.cartValue,\n currency: event.currency || DEFAULT_CURRENCY,\n item_count: event.itemCount,\n items: event.items.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a search event\n * @param event The search event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackSearch(\n event: ISearchEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(adapterParams, EventNames.SEARCH);\n const baseEventData = {\n search_term: event.searchTerm,\n results_count: event.resultsCount,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a user signup event\n * @param event The user signup event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackUserSignup(\n event: IUserSignupEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.USER_SIGNED_UP\n );\n const baseEventData = {\n user_id: event.userId,\n method: event.method,\n success: event.success,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n\n // Add user attributes if user ID is available and user identification is enabled\n if (\n event.userId &&\n this.getConfig<boolean>(\"enableUserIdentification\", true)\n ) {\n sdk?.add_unique_user_id(event.userId);\n }\n }\n\n /**\n * Track a user login event\n * @param event The user login event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackUserLogin(\n event: IUserLoginEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.USER_LOGGED_IN\n );\n const baseEventData = {\n user_id: event.userId,\n method: event.method,\n success: event.success,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n\n // Add user attributes if user ID is available and user identification is enabled\n if (\n event.userId &&\n this.getConfig<boolean>(\"enableUserIdentification\", true)\n ) {\n sdk?.add_unique_user_id(event.userId);\n }\n }\n\n /**\n * Track a custom event\n * @param event The custom event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCustomEvent(\n event: ICustomEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(adapterParams, \"custom\");\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a specific event\n * @param event The specific event\n */\n private trackSpecificEvent(\n event: ISpecificEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(adapterParams, \"\"); // this will support all custom event\n if (!eventName) {\n return;\n }\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n sdk?.track_event(eventName, enhancedParams);\n }\n\n /**\n * Set user attributes in MoenGage\n * @param attributes User attributes to set\n */\n public setUserAttributes(attributes: Record<string, any>): void {\n const sdk = this.getMoengageSDK();\n if (!this.initialized || typeof window === \"undefined\" || !sdk) {\n this.logger.warn(\"Cannot set user attributes, adapter not initialized\");\n return;\n }\n\n this.logger.debug(\"Setting user attributes\", {\n attributeKeys: Object.keys(attributes),\n });\n\n // Set user attributes\n for (const [key, value] of Object.entries(attributes)) {\n switch (key) {\n case \"firstName\":\n sdk?.add_first_name(value as string);\n break;\n case \"lastName\":\n sdk?.add_last_name(value as string);\n break;\n case \"email\":\n sdk?.add_email(value as string);\n break;\n case \"mobile\":\n sdk?.add_mobile(value as string);\n break;\n case \"username\":\n sdk?.add_user_name(value as string);\n break;\n case \"gender\":\n sdk?.add_gender(value as string);\n break;\n case \"birthday\":\n sdk?.add_birthday(value as Date);\n break;\n case \"userId\":\n sdk?.add_unique_user_id(value as string);\n break;\n default:\n sdk?.add_user_attribute(key, value);\n break;\n }\n }\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IAddToCartEvent,\n type ICheckoutStartedEvent,\n type ICheckoutCompletedEvent,\n type IProductViewEvent,\n type ISearchEvent,\n type IAddPaymentInfoEvent,\n ICustomEvent,\n ISpecificEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\ndeclare global {\n interface Window {\n posthog?: {\n capture: (eventName: string, properties?: Record<string, any>) => void;\n identify: (distinctId: string, properties?: Record<string, any>) => void;\n };\n }\n}\n\n/**\n * Configuration for the PostHog adapter\n */\nexport interface PostHogAdapterConfig {\n /**\n * Enable debug logs\n */\n enableDebugLogs?: boolean;\n}\n\n/**\n * PostHog tracking adapter\n * Assumes that the PostHog script is already loaded in the page\n */\nexport class PostHogAdapter extends BaseAdapter {\n public readonly name = \"PostHog\";\n\n constructor(config: PostHogAdapterConfig = {}) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize PostHog\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n this.logger.debug(\"Already initialized\");\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n this.logger.debug(\"Skipping initialization on server\");\n return;\n }\n\n // Check if posthog is available\n if (!window.posthog) {\n this.logger.warn(\n \"PostHog object not found. Make sure the script is loaded.\"\n );\n return;\n }\n\n this.logger.info(\"Successfully initialized\");\n this.initialized = true;\n }\n\n /**\n * Track an event with PostHog\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\" || !window.posthog) {\n this.logger.warn(\n \"Cannot track event, adapter not initialized or posthog not available\",\n {\n eventType: event.type,\n initialized: this.initialized,\n hasWindow: typeof window !== \"undefined\",\n hasPosthog: !!window?.posthog,\n }\n );\n return;\n }\n\n this.logger.debug(\"Tracking event\", { eventType: event.type });\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n this.trackPageView(event, adapterParams);\n break;\n case EventType.PRODUCT_VIEW:\n this.trackProductView(event, adapterParams);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event, adapterParams);\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(event, adapterParams);\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(event, adapterParams);\n break;\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(event, adapterParams);\n break;\n case EventType.SEARCH:\n this.trackSearch(event, adapterParams);\n break;\n case EventType.CUSTOM:\n this.trackCustomEvent(event, adapterParams);\n break;\n case EventType.SPECIFIC:\n this.trackSpecificEvent(event, adapterParams);\n break;\n default:\n this.logger.debug(\"Unhandled event type\", { eventType: event.type });\n break;\n }\n }\n\n /**\n * Track a custom event\n * @param event The custom event\n */\n private trackCustomEvent(\n event: ICustomEvent,\n adapterParams?: TAdapterParams\n ): void {\n // For other events, track as custom events\n const eventName = this.getEventName(adapterParams, \"custom\");\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n\n private trackSpecificEvent(\n event: ISpecificEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"\"); // this will support all custom event\n if (!eventName) {\n return;\n }\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n\n /**\n * Track a page view event\n * @param event The page view event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackPageView(\n event: IPageViewEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"$pageview\");\n const baseParams = {\n path: event.path,\n title: event.title,\n referrer: event.referrer,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n\n /**\n * Track a product view event\n * @param event The product view event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackProductView(\n event: IProductViewEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"product_viewed\");\n const baseParams = {\n product_id: event.productId,\n product_name: event.productName,\n category: event.category,\n price: event.price,\n currency: event.currency || \"INR\",\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n\n /**\n * Track an add to cart event\n * @param event The add to cart event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackAddToCart(\n event: IAddToCartEvent,\n adapterParams?: TAdapterParams\n ): void {\n this.logger.debug(\"Handling ADD_TO_CART event\", { event });\n\n const eventName = this.getEventName(adapterParams, \"add_to_cart\");\n const baseParams = {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency || \"INR\",\n quantity: event.quantity,\n variant: event.variant,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n this.logger.debug(\"Sending to PostHog with params\", {\n eventName,\n params: enhancedParams,\n });\n\n if (!window.posthog) {\n this.logger.error(\"window.posthog is not available\");\n return;\n }\n\n window.posthog.capture(eventName, enhancedParams);\n this.logger.debug(\"Event sent to PostHog successfully\");\n }\n\n /**\n * Track a checkout started event\n * @param event The checkout started event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCheckoutStarted(\n event: ICheckoutStartedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"checkout_started\");\n const baseParams = {\n cart_value: event.cartValue,\n currency: event.currency || \"INR\",\n item_count: event.itemCount,\n items: event.items.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCheckoutCompleted(\n event: ICheckoutCompletedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"purchase\");\n const baseParams = {\n order_id: event.orderId,\n cart_value: event.cartValue,\n currency: event.currency || \"INR\",\n item_count: event.itemCount,\n items: event.items.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n\n /**\n * Track a search event\n * @param event The search event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackSearch(\n event: ISearchEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"search\");\n const baseParams = {\n search_term: event.searchTerm,\n results_count: event.resultsCount,\n content_ids: event.content_ids,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n\n /**\n * Track an add payment info event\n * @param event The add payment info event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackAddPaymentInfo(\n event: IAddPaymentInfoEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"add_payment_info\");\n const baseParams = {\n cart_value: event.cartValue,\n currency: event.currency || \"INR\",\n payment_type: event.paymentType,\n item_count: event.itemCount,\n items: event.items.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.posthog?.capture(eventName, enhancedParams);\n }\n}\n","import {\n sendShopifyAnalytics,\n getClientBrowserParameters,\n AnalyticsEventName,\n type ShopifyAnalyticsProduct,\n type ShopifyPageViewPayload,\n ShopifySalesChannel,\n} from \"@shopify/hydrogen-react\";\nimport { BaseAdapter } from \"./base-adapter\";\nimport type { TEvent } from \"../types\";\nimport { EventType } from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\n// Constants based on environment variables\nconst DEFAULT_CURRENCY = \"INR\";\nconst DEFAULT_LANGUAGE = \"en\";\n\n/**\n * Type definitions for analytics payloads\n */\ntype SendPageViewPayload = {\n pageType?: string;\n products?: ShopifyAnalyticsProduct[];\n collectionHandle?: string;\n searchString?: string;\n totalValue?: number;\n cartId?: string;\n};\n\ntype SendAddToCartPayload = {\n cartId: string;\n products?: ShopifyAnalyticsProduct[];\n totalValue?: ShopifyPageViewPayload[\"totalValue\"];\n};\n\n/**\n * Configuration interface for Shopify Analytics Adapter\n */\nexport interface ShopifyAdapterConfig {\n shopId: string;\n domain: string;\n currency?: string;\n}\n\n/**\n * Shopify Analytics Adapter for tracking events to Shopify Admin Analytics\n */\nexport class ShopifyAdapter extends BaseAdapter {\n public readonly name = \"ShopifyAnalytics\";\n private shopId: string;\n private domain: string;\n private currency: string;\n\n constructor(config: ShopifyAdapterConfig) {\n super(config);\n this.shopId = config.shopId;\n this.domain = config.domain;\n this.currency = config.currency || DEFAULT_CURRENCY;\n }\n\n /**\n * Initialize the Shopify Analytics adapter\n */\n public async initialize(): Promise<void> {\n this.initializeLogger();\n\n try {\n // Enable Shopify cookies for attribution tracking\n if (typeof window !== \"undefined\") {\n this.logger.info(\"Shopify Analytics adapter initialized successfully\", {\n shopId: this.shopId,\n domain: this.domain,\n currency: this.currency,\n });\n\n // Note: useShopifyCookies should be called at the React component level\n // This will be handled in the ShopkitAnalytics component\n }\n this.initialized = true;\n } catch (error) {\n this.logger.error(\n \"Failed to initialize Shopify Analytics\",\n error instanceof Error ? error : new Error(String(error))\n );\n throw error;\n }\n }\n\n /**\n * Convert product ID to Shopify GID format if it's not already\n */\n private formatProductGid(productId: string): string {\n return productId.startsWith(\"gid://shopify/Product/\")\n ? productId\n : `gid://shopify/Product/${productId}`;\n }\n\n /**\n * Get user consent status from your consent management system\n */\n private getUserConsent() {\n // Check if user has given consent (implement based on your consent system)\n const hasConsent = this.checkUserConsent();\n\n return {\n hasUserConsent: hasConsent,\n analyticsAllowed: hasConsent && this.checkAnalyticsConsent(),\n marketingAllowed: hasConsent && this.checkMarketingConsent(),\n saleOfDataAllowed: hasConsent && this.checkSaleOfDataConsent(),\n };\n }\n\n /**\n * Check user consent (implement based on your consent management)\n */\n private checkUserConsent(): boolean {\n // Example implementations:\n // return localStorage.getItem('user_consent') === 'true';\n // return document.cookie.includes('consent=granted');\n // return window.gtag?.('consent', 'query') === 'granted';\n\n // For now, return true but implement your actual consent logic\n return true;\n }\n\n private checkAnalyticsConsent(): boolean {\n // Implement your analytics consent check\n return true;\n }\n\n private checkMarketingConsent(): boolean {\n // Implement your marketing consent check\n return true;\n }\n\n private checkSaleOfDataConsent(): boolean {\n // Implement your sale of data consent check\n return true;\n }\n\n /**\n * Create base payload for all events\n */\n private createBasePayload(): any {\n const consent = this.getUserConsent();\n\n return {\n ...getClientBrowserParameters(),\n ...consent,\n storefrontId: this.shopId,\n shopifySalesChannel: ShopifySalesChannel.headless,\n shopId: `gid://shopify/Shop/${this.shopId}`,\n currency: this.currency,\n acceptedLanguage: DEFAULT_LANGUAGE,\n ...this.enhanceWithExperimentParams(this.enhanceWithAffiliateParams({})),\n };\n }\n\n /**\n * Send page view event using the enhanced functionality\n */\n public sendPageView = (\n eventName: keyof typeof AnalyticsEventName,\n payload?: SendPageViewPayload\n ) => {\n const enhancedPayload = {\n ...this.createBasePayload(),\n ...payload,\n };\n\n return sendShopifyAnalytics({\n eventName,\n payload: enhancedPayload,\n });\n };\n\n /**\n * Send add to cart event using the enhanced functionality\n */\n public sendAddToCart = ({\n cartId,\n totalValue,\n products,\n }: SendAddToCartPayload) => {\n return this.sendPageView(AnalyticsEventName.ADD_TO_CART, {\n cartId,\n totalValue,\n products,\n });\n };\n\n /**\n * Track an event using Shopify Analytics\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\") {\n this.logger.warn(\n \"Shopify Analytics not initialized or not in browser environment\"\n );\n return;\n }\n\n // Get adapter-specific parameters\n const params = this.getAdapterParams(adapterParams);\n const customEventName = this.getEventName(params, event.type);\n\n this.logger.debug(\"Processing Shopify Analytics event\", {\n eventType: event.type,\n customEventName,\n eventData: event,\n adapterParams: params,\n });\n\n // Enhance event with affiliate and experiment data\n const affiliateParams = this.enhanceWithAffiliateParams(event);\n const enhancedEvent = this.enhanceWithExperimentParams(affiliateParams);\n\n try {\n switch (event.type) {\n case EventType.SHOPIFY_PAGE_VIEW:\n case EventType.PAGE_VIEW:\n const pageViewPayload = this.mergeEventData(enhancedEvent, params);\n this.sendPageView(AnalyticsEventName.PAGE_VIEW, pageViewPayload);\n this.logger.debug(\"Sent PAGE_VIEW event to Shopify Analytics\", {\n payload: pageViewPayload,\n });\n break;\n\n case EventType.VIEW_CONTENT:\n const viewContentPayload = this.mergeEventData(enhancedEvent, params);\n this.sendPageView(\n AnalyticsEventName.PRODUCT_VIEW,\n viewContentPayload\n );\n this.logger.debug(\"Sent PRODUCT_VIEW event to Shopify Analytics\", {\n payload: viewContentPayload,\n });\n break;\n\n case EventType.ADD_TO_CART:\n const addToCartPayload = this.mergeEventData(enhancedEvent, params);\n this.trackAddToCart(addToCartPayload);\n break;\n\n case EventType.CHECKOUT_STARTED:\n case EventType.BEGIN_CHECKOUT:\n // For checkout events, send as PAGE_VIEW with checkout page context\n const checkoutPayload = this.mergeEventData(\n { ...enhancedEvent, pageType: \"checkout\" },\n params\n );\n this.sendPageView(AnalyticsEventName.PAGE_VIEW, checkoutPayload);\n this.logger.debug(\n \"Sent checkout PAGE_VIEW event to Shopify Analytics\",\n { payload: checkoutPayload }\n );\n break;\n\n default:\n this.logger.debug(\"Event not supported by Shopify Analytics\", {\n eventType: event.type,\n });\n break;\n }\n } catch (error) {\n this.logger.error(\n \"Error tracking Shopify Analytics event\",\n error instanceof Error ? error : new Error(String(error)),\n { eventType: event.type }\n );\n }\n }\n\n /**\n * Check if Shopify session is properly established\n */\n public isSessionValid(): boolean {\n if (typeof window === \"undefined\") return false;\n\n const shopifyY = document.cookie.includes(\"_shopify_y=\");\n const shopifyS = document.cookie.includes(\"_shopify_s=\");\n\n return shopifyY && shopifyS;\n }\n\n /**\n * Get session debug information\n */\n public getSessionDebugInfo(): object {\n if (typeof window === \"undefined\")\n return { error: \"Not in browser environment\" };\n\n return {\n sessionValid: this.isSessionValid(),\n cookies: {\n shopify_y: document.cookie.includes(\"_shopify_y=\"),\n shopify_s: document.cookie.includes(\"_shopify_s=\"),\n all: document.cookie,\n },\n shopId: this.shopId,\n initialized: this.initialized,\n };\n }\n\n /**\n * Track add to cart event with enhanced error handling\n */\n private trackAddToCart(event: any): void {\n if (!event.productId) {\n this.logger.warn(\"ADD_TO_CART event missing productId\");\n return;\n }\n\n try {\n const productGid = this.formatProductGid(event.productId);\n const cartKey = `merchant_${process.env.NEXT_PUBLIC_MERCHANT_NAME}_cartId`;\n const cartId = localStorage.getItem(cartKey) || \"\";\n\n if (!cartId) {\n this.logger.warn(\"No cart ID found, creating anonymous session\");\n // You might want to generate a temporary cart ID or handle this case\n }\n\n // Validate product data\n if (!event.price || event.price <= 0) {\n this.logger.warn(\"Invalid or missing price for ADD_TO_CART\", {\n price: event.price,\n });\n }\n\n // Create products array for analytics\n const productPrice = Math.max(0, event.price || 0);\n const productQuantity = Math.max(1, event.quantity || 1);\n\n const products: ShopifyAnalyticsProduct[] = [\n {\n productGid: productGid,\n variantGid:\n event.variantId || productGid.replace(\"Product\", \"ProductVariant\"),\n quantity: productQuantity,\n price: productPrice.toString(), // Convert to string as required by ShopifyAnalyticsProduct\n name: event.productName || \"Unknown Product\",\n brand: event.brand || \"Unknown Brand\",\n },\n ];\n\n const totalValue = productPrice * productQuantity;\n\n this.logger.debug(\"ADD_TO_CART event tracked successfully\", {\n productGid,\n quantity: productQuantity,\n price: productPrice,\n totalValue,\n });\n\n // Use the enhanced sendAddToCart method\n this.sendAddToCart({\n cartId,\n products,\n totalValue,\n });\n } catch (error) {\n this.logger.error(\n \"Error in trackAddToCart\",\n error instanceof Error ? error : new Error(String(error))\n );\n // Don't throw - just log the error to prevent breaking the user experience\n }\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport type { TEvent } from \"../types\";\nimport { EventType } from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\n/**\n * Configuration interface for KwikPass Adapter\n */\nexport interface KwikPassConfig {\n enableDebugLogs?: boolean;\n enableKwikPassEvents?: boolean;\n}\n\n/**\n * KwikPass Analytics Adapter for tracking events to KwikPass platform\n */\nexport class KwikPassAdapter extends BaseAdapter {\n public readonly name = \"KwikPass\";\n private enableKwikPassEvents: boolean;\n\n constructor(config: KwikPassConfig = {}) {\n super(config);\n this.enableKwikPassEvents = config.enableKwikPassEvents ?? true;\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize the KwikPass adapter\n */\n public async initialize(): Promise<void> {\n try {\n if (typeof window !== \"undefined\") {\n this.logger.info(\"KwikPass adapter initialized successfully\", {\n eventsEnabled: this.enableKwikPassEvents,\n });\n }\n this.initialized = true;\n } catch (error) {\n this.logger.error(\n \"Failed to initialize KwikPass adapter\",\n error as Error\n );\n throw error;\n }\n }\n\n /**\n * Track an event using KwikPass\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\") {\n this.logger.warn(\n \"KwikPass adapter not initialized or not in browser environment\"\n );\n return;\n }\n\n if (!this.enableKwikPassEvents) {\n this.logger.debug(\"KwikPass events disabled, skipping event\", {\n eventType: event.type,\n });\n return;\n }\n\n // Enhance event with affiliate and experiment data\n const affiliateParams = this.enhanceWithAffiliateParams(event);\n const enhancedEvent = this.enhanceWithExperimentParams(affiliateParams);\n\n try {\n this.logger.debug(\"Processing event\", { eventType: event.type });\n\n switch (event.type) {\n case EventType.PRODUCT_VIEW:\n this.trackProductView(enhancedEvent, adapterParams);\n break;\n\n case EventType.COLLECTION_VIEW:\n this.trackCollectionView(enhancedEvent, adapterParams);\n break;\n\n case EventType.PAGE_VIEW:\n this.trackPageView(enhancedEvent, adapterParams);\n break;\n\n default:\n this.logger.debug(\"Event not supported\", { eventType: event.type });\n break;\n }\n } catch (error) {\n this.logger.error(\"Error tracking KwikPass event\", error as Error, {\n eventType: event.type,\n });\n }\n }\n\n /**\n * Send event to KwikPass platform\n */\n private sendKwikPassEvent(\n type: string,\n eventData: any,\n adapterParams?: TAdapterParams\n ): void {\n // Get custom event name or use default\n const customEventType = this.getEventName(adapterParams, type);\n\n // Merge with adapter-specific parameters\n const enhancedEventData = this.mergeEventData(eventData, adapterParams);\n this.logger.debug(`Sending ${customEventType}`, {\n eventData: enhancedEventData,\n });\n\n // Dispatch custom event for KwikPass to listen\n if (typeof window !== \"undefined\") {\n const customEvent = new CustomEvent(`page_view_kp`, {\n detail: {\n type: customEventType,\n detail: enhancedEventData,\n },\n });\n window.dispatchEvent(customEvent);\n this.logger.debug(`${customEventType} sent successfully`);\n }\n }\n\n /**\n * Track collection view event\n */\n private trackCollectionView(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendKwikPassEvent(\n \"collection\",\n {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency,\n category: event.category,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track product view event\n */\n private trackProductView(event: any, adapterParams?: TAdapterParams): void {\n this.sendKwikPassEvent(\n \"product\",\n {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency,\n category: event.category,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track page view event\n */\n private trackPageView(event: any, adapterParams?: TAdapterParams): void {\n this.sendKwikPassEvent(\n \"other\",\n {\n path: event.path,\n title: event.title,\n referrer: event.referrer,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport type { TEvent } from \"../types\";\nimport { EventType } from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\n/**\n * Configuration interface for Kwik Checkout Adapter\n */\nexport interface KwikCheckoutConfig {\n mid?: string;\n environment?: string;\n storeId?: string;\n enableDebugLogs?: boolean;\n}\n\n/**\n * Kwik Checkout Analytics Adapter for tracking checkout events to GoKwik platform\n */\nexport class KwikCheckoutAdapter extends BaseAdapter {\n public readonly name = \"KwikCheckout\";\n private mid: string;\n private environment: string;\n private storeId: string;\n\n constructor(config: KwikCheckoutConfig) {\n super(config);\n this.mid = config.mid || \"\";\n this.environment = config.environment || \"production\";\n this.storeId = config.storeId || \"\";\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize the GoKwik adapter\n */\n public async initialize(): Promise<void> {\n try {\n if (typeof window !== \"undefined\") {\n // Initialize GoKwik SDK if available\n this.logger.info(\"GoKwik adapter initialized successfully\", {\n mid: this.mid,\n environment: this.environment,\n storeId: this.storeId,\n });\n }\n this.initialized = true;\n } catch (error) {\n this.logger.error(\"Failed to initialize GoKwik adapter\", error as Error);\n throw error;\n }\n }\n\n /**\n * Track an event using GoKwik\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\") {\n this.logger.warn(\n \"GoKwik adapter not initialized or not in browser environment\"\n );\n return;\n }\n\n try {\n this.logger.debug(\"Processing event\", { eventType: event.type });\n\n // Enhanced event data with affiliate and experiment parameters\n const affiliateEnhanced = this.enhanceWithAffiliateParams(event);\n const enhancedEvent = this.enhanceWithExperimentParams(affiliateEnhanced);\n\n switch (event.type) {\n case EventType.STARTED_CHECKOUT_GK:\n this.trackStartedCheckoutGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.MOBILE_ADDED_GK:\n this.trackMobileAddedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADDRESS_SELECTED_GK:\n this.trackAddressSelectedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADDRESS_COMPLETED_GK:\n this.trackAddressCompletedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADDRESS_ADDED_GK:\n this.trackAddressAddedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.PIN_CODE_ADDED_GK:\n this.trackPinCodeAddedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.PAYMENT_METHOD_SELECTED_GK:\n this.trackPaymentMethodSelectedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.PAYMENT_COMPLETED_GK:\n this.trackPaymentCompletedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ORDER_SUCCESS:\n this.trackOrderSuccess(enhancedEvent, adapterParams);\n break;\n\n case EventType.ORDER_COMPLETED:\n this.trackOrderCompleted(enhancedEvent, adapterParams);\n break;\n\n case EventType.CART_VIEWED:\n this.trackCartViewed(enhancedEvent, adapterParams);\n break;\n\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(enhancedEvent, adapterParams);\n break;\n\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(enhancedEvent, adapterParams);\n break;\n\n default:\n this.logger.debug(\"Event not supported\", { eventType: event.type });\n break;\n }\n } catch (error) {\n this.logger.error(\"Error tracking GoKwik event\", error as Error, {\n eventType: event.type,\n });\n }\n }\n\n /**\n * Send event to GoKwik platform\n */\n private sendGoKwikEvent(\n eventName: string,\n eventData: any,\n adapterParams?: TAdapterParams\n ): void {\n // Get custom event name or use default\n const customEventName = this.getEventName(adapterParams, eventName);\n\n // Merge with adapter-specific parameters\n const enhancedEventData = this.mergeEventData(eventData, adapterParams);\n this.logger.debug(`Sending ${customEventName}`, {\n eventData: enhancedEventData,\n });\n\n // Check if GoKwik SDK is available\n if (typeof window !== \"undefined\" && (window as any).gokwikSdk) {\n try {\n // Send event through GoKwik SDK\n (window as any).gokwikSdk.track?.(customEventName, enhancedEventData);\n this.logger.debug(`${customEventName} sent via SDK successfully`);\n } catch (error) {\n this.logger.error(\n `Error sending GoKwik event ${customEventName} via SDK`,\n error as Error\n );\n }\n } else {\n // Fallback: dispatch custom event for GoKwik to listen\n if (typeof window !== \"undefined\") {\n const customEvent = new CustomEvent(`gokwik_${customEventName}`, {\n detail: enhancedEventData,\n });\n window.dispatchEvent(customEvent);\n this.logger.debug(\n `${customEventName} sent via custom event successfully`\n );\n }\n }\n }\n\n /**\n * Track started checkout GK event\n */\n private trackStartedCheckoutGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"started_checkout\",\n {\n cart_value: event.cartValue,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track mobile added GK event\n */\n private trackMobileAddedGK(event: any, adapterParams?: TAdapterParams): void {\n this.sendGoKwikEvent(\n \"mobile_added\",\n {\n mobile: event.mobile,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track address selected GK event\n */\n private trackAddressSelectedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"address_selected\",\n {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track address completed GK event\n */\n private trackAddressCompletedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"address_completed\",\n {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track address added GK event\n */\n private trackAddressAddedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"address_added\",\n {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track PIN code added GK event\n */\n private trackPinCodeAddedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"pin_code_added\",\n {\n pin_code: event.pinCode,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track payment method selected GK event\n */\n private trackPaymentMethodSelectedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"payment_method_selected\",\n {\n payment_method: event.paymentMethod,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track payment completed GK event\n */\n private trackPaymentCompletedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"payment_completed\",\n {\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track order success event\n */\n private trackOrderSuccess(event: any, adapterParams?: TAdapterParams): void {\n this.sendGoKwikEvent(\n \"order_success\",\n {\n order_id: event.orderId,\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track order completed event\n */\n private trackOrderCompleted(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"order_completed\",\n {\n order_id: event.orderId,\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track cart viewed event\n */\n private trackCartViewed(event: any, adapterParams?: TAdapterParams): void {\n this.sendGoKwikEvent(\n \"cart_viewed\",\n {\n cart_id: event.cartId,\n products: event.products,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track checkout started event\n */\n private trackCheckoutStarted(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"checkout_started\",\n {\n cart_value: event.cartValue,\n currency: event.currency,\n item_count: event.itemCount,\n items: event.items,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track checkout completed event\n */\n private trackCheckoutCompleted(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"checkout_completed\",\n {\n order_id: event.orderId,\n cart_value: event.cartValue,\n currency: event.currency,\n item_count: event.itemCount,\n items: event.items,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track add payment info event\n */\n private trackAddPaymentInfo(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"add_payment_info\",\n {\n cart_value: event.cartValue,\n currency: event.currency,\n item_count: event.itemCount,\n payment_type: event.paymentType,\n items: event.items,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n}\n"],"mappings":"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","names":["moengage","DEFAULT_CURRENCY"]}
1
+ {"version":3,"sources":["../../src/adapters/index.ts","../../src/logger/index.ts","../../src/experiment/constants.ts","../../src/experiment/experiment-tracker.ts","../../src/adapters/base-adapter.ts","../../src/utils/event-id.ts","../../src/adapters/pixel-adapter.ts","../../src/adapters/multi-pixel-adapter.ts","../../src/adapters/google-adapter.ts","../../src/constants.ts","../../src/adapters/moengage-adapter.ts","../../src/adapters/posthog-adapter.ts","../../src/adapters/shopify-adapter.ts","../../src/adapters/kwikpass-adapter.ts","../../src/adapters/kwik-checkout-adapter.ts"],"sourcesContent":["// Export all available adapters\nexport { BaseAdapter } from \"./base-adapter\";\nexport { PixelAdapter } from \"./pixel-adapter\";\nexport { MultiPixelAdapter } from \"./multi-pixel-adapter\";\nexport { GoogleAdapter } from \"./google-adapter\";\nexport { MoengageAdapter } from \"./moengage-adapter\";\nexport { PostHogAdapter } from \"./posthog-adapter\";\nexport { ShopifyAdapter } from \"./shopify-adapter\";\nexport { KwikPassAdapter } from \"./kwikpass-adapter\";\nexport { KwikCheckoutAdapter } from \"./kwik-checkout-adapter\";\n\n// Export adapter configuration types from their respective files\nexport type { PixelAdapterConfig } from \"./pixel-adapter\";\nexport type { MultiPixelAdapterConfig } from \"./multi-pixel-adapter\";\nexport type { GoogleAdapterConfig } from \"./google-adapter\";\nexport type { MoengageAdapterConfig } from \"./moengage-adapter\";\nexport type { PostHogAdapterConfig } from \"./posthog-adapter\";\nexport type { ShopifyAdapterConfig } from \"./shopify-adapter\";\nexport type { KwikPassConfig } from \"./kwikpass-adapter\";\nexport type { KwikCheckoutConfig } from \"./kwik-checkout-adapter\";\n","/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n level?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n enabled?: boolean;\n name?: string;\n prettyPrint?: boolean;\n redact?: string[];\n}\n\n/**\n * Logger interface for consistent logging across adapters\n */\nexport interface Logger {\n trace: (message: string, ...args: any[]) => void;\n debug: (message: string, ...args: any[]) => void;\n info: (message: string, ...args: any[]) => void;\n warn: (message: string, ...args: any[]) => void;\n error: (message: string, error?: Error, ...args: any[]) => void;\n fatal: (message: string, error?: Error, ...args: any[]) => void;\n child: (bindings: Record<string, any>) => Logger;\n}\n\n/**\n * Log levels with numeric values for comparison\n */\nconst LOG_LEVELS = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n} as const;\n\n/**\n * No-op logger for when logging is disabled\n */\nclass NoOpLogger implements Logger {\n trace() {}\n debug() {}\n info() {}\n warn() {}\n error() {}\n fatal() {}\n child(): Logger {\n return new NoOpLogger();\n }\n}\n\n/**\n * Simple universal logger that works in all environments\n */\nclass UniversalLogger implements Logger {\n private config: Required<LoggerConfig>;\n private bindings: Record<string, any>;\n\n constructor(\n config: Required<LoggerConfig>,\n bindings: Record<string, any> = {}\n ) {\n this.config = config;\n this.bindings = bindings;\n }\n\n private shouldLog(level: keyof typeof LOG_LEVELS): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.config.level];\n }\n\n private formatMessage(\n level: string,\n message: string,\n args: any[],\n error?: Error\n ): string {\n const timestamp = new Date().toISOString();\n const name = this.config.name;\n\n let logMessage = this.config.prettyPrint\n ? `[${timestamp}] ${level.toUpperCase()} [${name}]: ${message}`\n : JSON.stringify({\n timestamp,\n level,\n name,\n message,\n ...this.bindings,\n ...(args.length > 0 && { args }),\n ...(error && {\n error: { message: error.message, stack: error.stack },\n }),\n });\n\n if (this.config.prettyPrint && args.length > 0) {\n logMessage += ` ${args\n .map((arg) =>\n typeof arg === \"object\" ? JSON.stringify(arg) : String(arg)\n )\n .join(\" \")}`;\n }\n\n if (this.config.prettyPrint && error) {\n logMessage += ` Error: ${error.message}`;\n if (error.stack) {\n logMessage += `\\n${error.stack}`;\n }\n }\n\n return this.redactSensitiveData(logMessage);\n }\n\n private redactSensitiveData(message: string): string {\n let redactedMessage = message;\n for (const field of this.config.redact) {\n const regex = new RegExp(`\"${field}\"\\\\s*:\\\\s*\"[^\"]*\"`, \"gi\");\n redactedMessage = redactedMessage.replace(\n regex,\n `\"${field}\":\"[REDACTED]\"`\n );\n }\n return redactedMessage;\n }\n\n private log(\n level: keyof typeof LOG_LEVELS,\n message: string,\n args: any[],\n error?: Error\n ): void {\n if (!this.shouldLog(level)) return;\n\n const formattedMessage = this.formatMessage(level, message, args, error);\n\n // Use appropriate console method based on level\n switch (level) {\n case \"trace\":\n console.trace(formattedMessage);\n break;\n case \"debug\":\n console.debug(formattedMessage);\n break;\n case \"info\":\n console.info(formattedMessage);\n break;\n case \"warn\":\n console.warn(formattedMessage);\n break;\n case \"error\":\n case \"fatal\":\n console.error(formattedMessage);\n break;\n }\n }\n\n trace(message: string, ...args: any[]): void {\n this.log(\"trace\", message, args);\n }\n\n debug(message: string, ...args: any[]): void {\n this.log(\"debug\", message, args);\n }\n\n info(message: string, ...args: any[]): void {\n this.log(\"info\", message, args);\n }\n\n warn(message: string, ...args: any[]): void {\n this.log(\"warn\", message, args);\n }\n\n error(message: string, error?: Error, ...args: any[]): void {\n this.log(\"error\", message, args, error);\n }\n\n fatal(message: string, error?: Error, ...args: any[]): void {\n this.log(\"fatal\", message, args, error);\n }\n\n child(bindings: Record<string, any>): Logger {\n return new UniversalLogger(this.config, { ...this.bindings, ...bindings });\n }\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n const fullConfig: Required<LoggerConfig> = {\n level: config.level || \"info\",\n enabled: config.enabled !== false,\n name: config.name || \"@shopkit/analytics\",\n prettyPrint: config.prettyPrint || false,\n redact: config.redact || [],\n };\n\n // Return no-op logger if disabled\n if (!fullConfig.enabled) {\n return new NoOpLogger();\n }\n\n return new UniversalLogger(fullConfig);\n}\n\n/**\n * Default logger instance\n */\nexport const logger = createLogger({\n enabled: true,\n level: \"info\",\n prettyPrint: false,\n});\n\n/**\n * Create adapter-specific logger\n */\nexport function createAdapterLogger(\n adapterName: string,\n config: LoggerConfig = {}\n): Logger {\n const baseLogger = createLogger(config);\n return baseLogger.child({ adapter: adapterName });\n}\n","/**\n * Prima PR A/B test experiment cookie names\n */\nexport const PRIMA_EXPERIMENT_COOKIES = {\n HOME: \"_prima_ptr_ab_home\",\n COLLECTION: \"_prima_ptr_ab_collection\",\n PRODUCT: \"_prima_ptr_ab_product\",\n} as const;\n\n/**\n * Array of all Prima experiment cookie names for iteration\n */\nexport const PRIMA_EXPERIMENT_COOKIE_NAMES = Object.values(\n PRIMA_EXPERIMENT_COOKIES\n);\n","import type { ExperimentData } from \"./types\";\nimport {\n PRIMA_EXPERIMENT_COOKIES,\n PRIMA_EXPERIMENT_COOKIE_NAMES,\n} from \"./constants\";\n\n/**\n * Get cookie value by name\n */\nfunction getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) {\n return parts.pop()?.split(\";\").shift() || null;\n }\n return null;\n}\n\n/**\n * Get experiment parameters from cookies\n */\nexport function getExperimentParams(): ExperimentData {\n const payload = {\n [PRIMA_EXPERIMENT_COOKIES.HOME]: getCookie(PRIMA_EXPERIMENT_COOKIES.HOME),\n [PRIMA_EXPERIMENT_COOKIES.COLLECTION]: getCookie(\n PRIMA_EXPERIMENT_COOKIES.COLLECTION\n ),\n [PRIMA_EXPERIMENT_COOKIES.PRODUCT]: getCookie(\n PRIMA_EXPERIMENT_COOKIES.PRODUCT\n ),\n };\n\n return payload;\n}\n\n/**\n * Check if any experiment data exists\n */\nexport function hasExperimentData(): boolean {\n return PRIMA_EXPERIMENT_COOKIE_NAMES.some(\n (cookieName) => getCookie(cookieName) !== null\n );\n}\n","import type { TEvent } from \"../types\";\nimport type { TrackingAdapter } from \"../events/subscriber\";\nimport type { TAdapterParams, IBaseAdapterParams } from \"../adapter-params\";\nimport { createAdapterLogger, type Logger, type LoggerConfig } from \"../logger\";\nimport { getExperimentParams } from \"../experiment/experiment-tracker\";\nimport type { ExperimentData } from \"../experiment/types\";\nimport { PRIMA_EXPERIMENT_COOKIES } from \"../experiment\";\n\n/**\n * Abstract base class for tracking adapters\n */\nexport abstract class BaseAdapter implements TrackingAdapter {\n /**\n * Name of the tracking adapter\n */\n public abstract readonly name: string;\n\n /**\n * Configuration for the adapter\n */\n protected config: Record<string, any>;\n\n /**\n * Logger instance for this adapter\n */\n protected logger: Logger;\n\n /**\n * Whether the adapter has been initialized\n */\n protected initialized = false;\n\n /**\n * Constructor\n * @param config Configuration for the adapter\n */\n constructor(config: Record<string, any> = {}) {\n this.config = config;\n\n // Create a generic logger - will be properly initialized by subclasses\n const loggerConfig: LoggerConfig = {\n enabled: config.enableDebugLogs ?? true,\n level: config.logLevel ?? \"info\",\n name: \"@shopkit/analytics\",\n };\n\n this.logger = createAdapterLogger(\"BaseAdapter\", loggerConfig);\n }\n\n /**\n * Initialize logger with proper adapter name\n * Should be called by subclasses after name is available\n */\n protected initializeLogger(): void {\n const loggerConfig: LoggerConfig = {\n enabled: this.config.enableDebugLogs ?? true,\n level: this.config.logLevel ?? \"info\",\n name: \"@shopkit/analytics\",\n };\n\n this.logger = createAdapterLogger(this.name, loggerConfig);\n }\n\n /**\n * Check if the adapter is enabled\n */\n public isEnabled(): boolean {\n return this.initialized;\n }\n\n /**\n * Initialize the adapter\n */\n public abstract initialize(): Promise<void>;\n\n /**\n * Track an event\n * @param event The event to track\n * @param params Optional adapter-specific parameters\n */\n public abstract trackEvent(\n event: TEvent,\n params?: TAdapterParams\n ): Promise<void>;\n\n /**\n * Extract adapter-specific parameters for this adapter\n * @param params The adapter parameters object\n * @returns Adapter-specific parameters or empty object\n */\n protected getAdapterParams(params?: TAdapterParams): IBaseAdapterParams {\n return params?.[this.name] || {};\n }\n\n /**\n * Get custom event name or fall back to default\n * @param params The adapter parameters object\n * @param defaultName The default event name to use\n * @returns Custom event name or default\n */\n protected getEventName(\n params: TAdapterParams | undefined,\n defaultName: string\n ): string {\n const adapterParams = this.getAdapterParams(params);\n return adapterParams.event_name || defaultName;\n }\n\n /**\n * Merge standard event data with adapter-specific parameters\n * @param params The adapter parameters object\n * @param standardData The standard event data\n * @returns Merged data with adapter-specific overrides\n */\n protected mergeEventData(\n standardData: Record<string, any>,\n params: TAdapterParams | undefined\n ): Record<string, any> {\n const adapterParams = this.getAdapterParams(params);\n\n // Remove event_name from adapter params to avoid conflicts\n const { event_name, ...customParams } = adapterParams;\n\n // Merge with priority: adapter-specific > standard\n return {\n ...standardData,\n ...customParams,\n };\n }\n\n /**\n * Get a configuration value\n * @param key The configuration key\n * @param defaultValue The default value if the key is not found\n */\n protected getConfig<T>(key: string, defaultValue?: T): T {\n return key in this.config ? this.config[key] : (defaultValue as T);\n }\n\n /**\n * Get affiliate parameters from session storage or custom implementation\n * Override this method to provide your own affiliate tracking implementation\n * @returns Affiliate parameters or null if not available\n */\n protected getAffiliateParams(): Record<string, string> | null {\n // Default implementation returns null\n // Users can override this method to integrate with their affiliate tracking system\n return null;\n }\n\n /**\n * Get experiment parameters from cookies\n * @returns Experiment parameters\n */\n protected getExperimentParams(): ExperimentData {\n try {\n return getExperimentParams();\n } catch (error) {\n // Silently fail if experiment tracking is not available\n return {\n [PRIMA_EXPERIMENT_COOKIES.HOME]: null,\n [PRIMA_EXPERIMENT_COOKIES.COLLECTION]: null,\n [PRIMA_EXPERIMENT_COOKIES.PRODUCT]: null,\n };\n }\n }\n\n /**\n * Enhance event parameters with affiliate data\n * @param params The original parameters\n * @returns Parameters enhanced with affiliate data\n */\n protected enhanceWithAffiliateParams(\n params: Record<string, any>\n ): Record<string, any> {\n const affiliateParams = this.getAffiliateParams();\n if (!affiliateParams) return params;\n\n return {\n ...params,\n // Add affiliate parameters\n ...affiliateParams,\n };\n }\n\n /**\n * Enhance event parameters with experiment data\n * @param params The original parameters\n * @returns Parameters enhanced with experiment data\n */\n protected enhanceWithExperimentParams(\n params: Record<string, any>\n ): Record<string, any> {\n const experimentParams = this.getExperimentParams();\n\n return {\n ...params,\n experiment: experimentParams,\n };\n }\n}\n","/**\n * Generate a unique event ID for deduplication\n * Format: timestamp_randomString_eventType\n */\nexport function generateEventId(eventType: string): string {\n const timestamp = Date.now();\n const randomString = Math.random().toString(36).substring(2, 8);\n return `${timestamp}_${randomString}_${eventType}`;\n}\n\n/**\n * Extract browser information for CAPI user data\n */\nexport function getBrowserInfo(): {\n clientUserAgent?: string;\n fbc?: string;\n fbp?: string;\n} {\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const userAgent = navigator.userAgent;\n\n // Get Facebook click ID from URL or cookies\n const fbc = getFacebookClickId();\n const fbp = getFacebookBrowserId();\n\n return {\n clientUserAgent: userAgent,\n fbc,\n fbp,\n };\n}\n\n/**\n * Get Facebook click ID (fbc) from URL parameters or cookies\n */\nfunction getFacebookClickId(): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n // Check URL parameters first\n const urlParams = new URLSearchParams(window.location.search);\n const fbclid = urlParams.get(\"fbclid\");\n\n if (fbclid) {\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n\n // Check cookies\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split(\"=\");\n if (name === \"_fbc\") {\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get Facebook browser ID (fbp) from cookies\n */\nfunction getFacebookBrowserId(): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split(\"=\");\n if (name === \"_fbp\") {\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get client IP address (this will be handled server-side)\n */\nexport function getClientIpAddress(request?: Request): string | undefined {\n if (!request) {\n return undefined;\n }\n\n // Try different headers for IP address\n const forwarded = request.headers.get(\"x-forwarded-for\");\n const realIp = request.headers.get(\"x-real-ip\");\n const cfConnectingIp = request.headers.get(\"cf-connecting-ip\");\n\n return forwarded?.split(\",\")[0] || realIp || cfConnectingIp || undefined;\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IAddToCartEvent,\n type IProductViewEvent,\n type IViewContentEvent,\n type ISearchEvent,\n type IBeginCheckoutEvent,\n type IPurchaseEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\nimport { generateEventId, getBrowserInfo } from \"../utils/event-id\";\n\ndeclare global {\n interface Window {\n fbq?: (\n type: string,\n eventName: string,\n params?: Record<string, any>,\n options?: { eventID?: string }\n ) => void;\n }\n}\n\n/**\n * Configuration for the Facebook Pixel adapter\n */\nexport interface PixelAdapterConfig {\n /**\n * Facebook Pixel ID\n */\n pixelId: string;\n /**\n * Enable server-side CAPI backup\n * @default true - CAPI is enabled by default for better data reliability\n */\n enableCAPI?: boolean;\n}\n\n/**\n * Facebook Pixel tracking adapter\n * Assumes that the Facebook Pixel script is already loaded in the page\n */\nexport class PixelAdapter extends BaseAdapter {\n public readonly name = \"FacebookPixel\";\n\n constructor(config: PixelAdapterConfig) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize the Facebook Pixel\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n return;\n }\n\n // Check if fbq is available\n if (!window.fbq) {\n this.logger.warn(\n \"Facebook Pixel fbq not found. Make sure the script is loaded.\"\n );\n return;\n } else {\n const pixelId = this.getConfig(\"pixelId\") as string;\n if (!pixelId) {\n this.logger.warn(\"Pixel ID not provided. Skipping fbq init.\");\n } else {\n // Check if pixel is already initialized to avoid duplicate init\n const isAlreadyInitialized =\n (window as any)._fbq?.loaded ||\n (window as any).fbq?.loaded ||\n document\n .querySelector(`script[src*=\"fbevents.js\"]`)\n ?.getAttribute(\"data-pixel-id\") === pixelId;\n\n if (!isAlreadyInitialized) {\n window.fbq(\"init\", pixelId);\n }\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Track an event with Facebook Pixel\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n // Generate unique event ID for deduplication if not already present\n if (!event.eventId) {\n event.eventId = generateEventId(event.type);\n }\n\n // Ensure timestamp is always available for both client and server tracking\n if (!event.timestamp) {\n event.timestamp = Date.now();\n }\n\n // Track client-side (browser pixel)\n await this.trackClientSide(event, adapterParams);\n\n // Track server-side (CAPI) as backup\n if (this.getConfig(\"enableCAPI\", true)) {\n await this.trackServerSide(event, adapterParams);\n }\n }\n\n /**\n * Track event on client-side (browser pixel)\n */\n private async trackClientSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\" || !window.fbq) {\n this.logger.warn(\n \"Cannot track client-side event, adapter not initialized or fbq not available\",\n {\n eventType: event.type,\n }\n );\n return;\n }\n\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n // Add event_id for deduplication\n if (event.eventId) {\n window.fbq?.(\"track\", eventName, enhancedParams, {\n eventID: event.eventId,\n });\n } else {\n window.fbq?.(\"track\", eventName, enhancedParams);\n }\n }\n\n /**\n * Track event on server-side (CAPI) as backup\n */\n private async trackServerSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n try {\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n const browserInfo = getBrowserInfo();\n\n const payload = {\n eventName,\n eventId: event.eventId,\n timestamp: event.timestamp,\n enhancedParams: enhancedParams,\n userInfo: browserInfo,\n };\n\n const response = await fetch(\"/api/events\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Server-side tracking failed: ${response.status}`);\n }\n } catch (error) {\n this.logger.error(\n `FB Pixel: Server-side tracking failed for event ${event.type}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Utility function to format event payload for both client and server-side tracking\n */\n private formatEventPayload(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): { eventName: string; enhancedParams: Record<string, any> } {\n let baseParams: Record<string, any> = {};\n let eventName = \"\";\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n const pageViewEvent = event as IPageViewEvent;\n eventName = this.getEventName(adapterParams, \"PageView\");\n baseParams = {\n // Facebook-compatible parameters\n content_name: pageViewEvent.page_title || pageViewEvent.title,\n content_category: pageViewEvent.event_category,\n // Custom parameters that Facebook will accept in custom_data\n page_location: pageViewEvent.page_location || pageViewEvent.path,\n page_title: pageViewEvent.page_title || pageViewEvent.title,\n page_referrer: pageViewEvent.page_referrer || pageViewEvent.referrer,\n page_path: pageViewEvent.page_path || pageViewEvent.path,\n };\n break;\n\n case EventType.VIEW_CONTENT:\n const viewContentEvent = event as IViewContentEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: viewContentEvent.content_type || \"product\",\n content_ids: viewContentEvent.content_ids || [],\n content_name: viewContentEvent.content_name || \"\",\n content_category: viewContentEvent.content_category || \"\",\n value: viewContentEvent.value || 0,\n currency: viewContentEvent.currency || \"INR\",\n };\n break;\n\n case EventType.PRODUCT_VIEW:\n const productEvent = event as IProductViewEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [productEvent.productId],\n content_name: productEvent.productName,\n content_category: productEvent.category,\n value: productEvent.price,\n currency: productEvent.currency || \"INR\",\n };\n break;\n\n case EventType.ADD_TO_CART:\n const cartEvent = event as IAddToCartEvent;\n eventName = this.getEventName(adapterParams, \"AddToCart\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [cartEvent.productId],\n content_name: cartEvent.productName,\n value: cartEvent.price,\n currency: cartEvent.currency || \"INR\",\n };\n break;\n\n case EventType.SEARCH:\n const searchEvent = event as ISearchEvent;\n eventName = this.getEventName(adapterParams, \"Search\");\n baseParams = {\n search_string: searchEvent.searchTerm,\n content_category: \"product\",\n content_ids: searchEvent.content_ids || [],\n };\n break;\n\n case EventType.INITIATE_CHECKOUT:\n const checkoutEvent = event as IBeginCheckoutEvent;\n eventName = this.getEventName(adapterParams, \"InitiateCheckout\");\n baseParams = {\n content_type: \"product\",\n currency: checkoutEvent.currency || \"INR\",\n value: checkoutEvent.cartValue,\n num_items:\n checkoutEvent.itemCount || checkoutEvent.items?.length || 0,\n contents:\n checkoutEvent.items?.map((item) => ({\n id: item.productId,\n quantity: item.quantity || 1,\n item_price: item.price,\n })) || [],\n };\n break;\n\n case EventType.PURCHASE:\n const purchaseEvent = event as IPurchaseEvent;\n eventName = this.getEventName(adapterParams, \"Purchase\");\n baseParams = {\n content_type: purchaseEvent.content_type || \"product\",\n content_ids: purchaseEvent.content_ids || [],\n currency: purchaseEvent.currency || \"INR\",\n value: purchaseEvent.value,\n num_items:\n purchaseEvent.num_items || purchaseEvent.contents?.length || 0,\n contents: purchaseEvent.contents || [],\n };\n break;\n\n default:\n // Skip tracking for unknown event types\n this.logger.warn(`Skipping unknown event type: ${event.type}`);\n return { eventName: \"\", enhancedParams: {} };\n }\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n return { eventName, enhancedParams };\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IAddToCartEvent,\n type IProductViewEvent,\n type IViewContentEvent,\n type ISearchEvent,\n type IBeginCheckoutEvent,\n type IPurchaseEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\nimport { generateEventId, getBrowserInfo } from \"../utils/event-id\";\n\ndeclare global {\n interface Window {\n fbq?: (\n type: string,\n eventName: string,\n params?: Record<string, any>,\n options?: { eventID?: string }\n ) => void;\n }\n}\n\n/**\n * Configuration for a single Facebook Pixel\n */\ninterface SinglePixelConfig {\n /**\n * Facebook Pixel ID\n */\n pixelId: string;\n /**\n * Optional name/label for this pixel (for logging/debugging)\n */\n name?: string;\n /**\n * Enable server-side CAPI backup for this pixel\n * @default true\n */\n enableCAPI?: boolean;\n}\n\n/**\n * Configuration for the Multi-Pixel adapter\n */\nexport interface MultiPixelAdapterConfig {\n /**\n * Array of pixel configurations\n */\n pixels: SinglePixelConfig[];\n /**\n * Global CAPI setting (can be overridden per pixel)\n * @default true\n */\n enableCAPI?: boolean;\n}\n\n/**\n * Internal pixel instance for tracking\n */\ninterface PixelInstance {\n config: SinglePixelConfig;\n initialized: boolean;\n}\n\n/**\n * Multi-Pixel Facebook tracking adapter\n * Supports multiple Facebook Pixels with individual configurations\n */\nexport class MultiPixelAdapter extends BaseAdapter {\n public readonly name = \"MultiPixelFacebook\";\n private pixels: PixelInstance[] = [];\n\n constructor(config: MultiPixelAdapterConfig) {\n super(config);\n\n // Validate configuration\n if (!config.pixels || config.pixels.length === 0) {\n throw new Error(\n \"MultiPixelAdapter requires at least one pixel configuration\"\n );\n }\n\n // Initialize pixel instances\n this.pixels = config.pixels.map((pixelConfig) => ({\n config: {\n enableCAPI: config.enableCAPI ?? true,\n ...pixelConfig,\n },\n initialized: false,\n }));\n\n this.initializeLogger();\n }\n\n /**\n * Initialize all Facebook Pixels\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n return;\n }\n\n // Check if fbq is available\n if (!window.fbq) {\n this.logger.warn(\n \"Facebook Pixel fbq not found. Make sure the script is loaded.\"\n );\n return;\n }\n\n // Initialize each pixel\n for (const pixel of this.pixels) {\n const { pixelId, name } = pixel.config;\n const pixelLabel = name || pixelId;\n\n try {\n window.fbq!(\"init\", pixelId);\n pixel.initialized = true;\n } catch (error) {\n this.logger.error(\n `Failed to initialize pixel: ${pixelLabel}`,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Track an event across all configured pixels\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n // Generate unique event ID for deduplication if not already present\n if (!event.eventId) {\n event.eventId = generateEventId(event.type);\n }\n\n // Ensure timestamp is always available\n if (!event.timestamp) {\n event.timestamp = Date.now();\n }\n\n // Track client-side once (fbq automatically sends to all initialized pixels)\n await this.trackClientSide(event, adapterParams);\n\n // Track server-side for each pixel (requires individual API calls)\n if (this.pixels.some((pixel) => pixel.config.enableCAPI)) {\n await this.trackServerSide(event, adapterParams);\n }\n }\n\n /**\n * Track event on client-side once (Facebook automatically sends to all initialized pixels)\n */\n private async trackClientSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (typeof window === \"undefined\" || !window.fbq) {\n this.logger.warn(\"Cannot track client-side event, fbq not available\", {\n eventType: event.type,\n });\n return;\n }\n\n // Check if any pixel is initialized\n const hasInitializedPixel = this.pixels.some((pixel) => pixel.initialized);\n if (!hasInitializedPixel) {\n this.logger.warn(\"No pixels initialized for client-side tracking\");\n return;\n }\n\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n // Single fbq call automatically sends to all initialized pixels\n if (event.eventId) {\n window.fbq?.(\"track\", eventName, enhancedParams, {\n eventID: event.eventId,\n });\n } else {\n window.fbq?.(\"track\", eventName, enhancedParams);\n }\n }\n\n /**\n * Track event on server-side for all enabled pixels\n */\n private async trackServerSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n try {\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n const browserInfo = getBrowserInfo();\n\n const payload = {\n eventName,\n eventId: event.eventId,\n timestamp: event.timestamp,\n enhancedParams: enhancedParams,\n userInfo: browserInfo,\n // Send all pixel info to the multi-pixel endpoint\n pixels: this.pixels\n .filter((pixel) => pixel.config.enableCAPI)\n .map((pixel) => ({\n pixelId: pixel.config.pixelId,\n name: pixel.config.name,\n })),\n };\n\n const endpoint = this.getConfig(\"capiEndpoint\", \"/api/events/multi\");\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Server-side tracking failed: ${response.status}`);\n }\n } catch (error) {\n this.logger.error(\n `Server-side tracking failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Format event payload with pixel-specific customizations\n */\n private formatEventPayload(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): { eventName: string; enhancedParams: Record<string, any> } {\n let baseParams: Record<string, any> = {};\n let eventName = \"\";\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n const pageViewEvent = event as IPageViewEvent;\n eventName = this.getEventName(adapterParams, \"PageView\");\n baseParams = {\n content_name: pageViewEvent.page_title || pageViewEvent.title,\n content_category: pageViewEvent.event_category,\n page_location: pageViewEvent.page_location || pageViewEvent.path,\n page_title: pageViewEvent.page_title || pageViewEvent.title,\n page_referrer: pageViewEvent.page_referrer || pageViewEvent.referrer,\n page_path: pageViewEvent.page_path || pageViewEvent.path,\n };\n break;\n\n case EventType.VIEW_CONTENT:\n const viewContentEvent = event as IViewContentEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: viewContentEvent.content_type || \"product\",\n content_ids: viewContentEvent.content_ids || [],\n content_name: viewContentEvent.content_name || \"\",\n content_category: viewContentEvent.content_category || \"\",\n value: viewContentEvent.value || 0,\n currency: viewContentEvent.currency || \"INR\",\n };\n break;\n\n case EventType.PRODUCT_VIEW:\n const productEvent = event as IProductViewEvent;\n eventName = this.getEventName(adapterParams, \"ViewContent\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [productEvent.productId],\n content_name: productEvent.productName,\n content_category: productEvent.category,\n value: productEvent.price,\n currency: productEvent.currency || \"INR\",\n };\n break;\n\n case EventType.ADD_TO_CART:\n const cartEvent = event as IAddToCartEvent;\n eventName = this.getEventName(adapterParams, \"AddToCart\");\n baseParams = {\n content_type: \"product_group\",\n content_ids: [cartEvent.productId],\n content_name: cartEvent.productName,\n value: cartEvent.price,\n currency: cartEvent.currency || \"INR\",\n };\n break;\n\n case EventType.SEARCH:\n const searchEvent = event as ISearchEvent;\n eventName = this.getEventName(adapterParams, \"Search\");\n baseParams = {\n search_string: searchEvent.searchTerm,\n content_category: \"product\",\n content_ids: searchEvent.content_ids || [],\n };\n break;\n\n case EventType.INITIATE_CHECKOUT:\n const checkoutEvent = event as IBeginCheckoutEvent;\n eventName = this.getEventName(adapterParams, \"InitiateCheckout\");\n baseParams = {\n content_type: \"product\",\n currency: checkoutEvent.currency || \"INR\",\n value: checkoutEvent.cartValue,\n num_items:\n checkoutEvent.itemCount || checkoutEvent.items?.length || 0,\n contents:\n checkoutEvent.items?.map((item) => ({\n id: item.productId,\n quantity: item.quantity || 1,\n item_price: item.price,\n })) || [],\n };\n break;\n\n case EventType.PURCHASE:\n const purchaseEvent = event as IPurchaseEvent;\n eventName = this.getEventName(adapterParams, \"Purchase\");\n baseParams = {\n content_type: purchaseEvent.content_type || \"product\",\n content_ids: purchaseEvent.content_ids || [],\n currency: purchaseEvent.currency || \"INR\",\n value: purchaseEvent.value,\n num_items:\n purchaseEvent.num_items || purchaseEvent.contents?.length || 0,\n contents: purchaseEvent.contents || [],\n };\n break;\n\n default:\n // Skip tracking for unknown event types\n this.logger.warn(`Skipping unknown event type: ${event.type}`);\n return { eventName: \"\", enhancedParams: {} };\n }\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n return { eventName, enhancedParams };\n }\n\n /**\n * Get configuration for all pixels\n */\n public getPixelConfigs(): SinglePixelConfig[] {\n return this.pixels.map((pixel) => pixel.config);\n }\n\n /**\n * Get initialization status for all pixels\n */\n public getPixelStatus(): Array<{\n pixelId: string;\n name?: string;\n initialized: boolean;\n }> {\n return this.pixels.map((pixel) => ({\n pixelId: pixel.config.pixelId,\n name: pixel.config.name,\n initialized: pixel.initialized,\n }));\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IFormSubmissionEvent,\n type IViewItemEvent,\n type IViewedProductEvent,\n type IAddToCartEvent,\n type ICheckoutStartedEvent,\n type ICheckoutCompletedEvent,\n type ISearchEvent,\n type ICustomEvent,\n type IAddPaymentInfoEvent,\n type ICheckoutPaymentEvent,\n type IViewSearchResultsEvent,\n type IOrderPlacedEvent,\n type IBeginCheckoutEvent,\n type IViewContentEvent,\n type IPurchaseEvent,\n type ISpecificEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\ndeclare global {\n interface Window {\n gtag?: (...args: any[]) => void;\n }\n}\n\n/**\n * Configuration for the Google Analytics adapter\n */\nexport interface GoogleAdapterConfig {\n /**\n * Google Analytics measurement ID (e.g., G-XXXXXXXXXX)\n */\n measurementId: string;\n}\n\n/**\n * Google Analytics tracking adapter\n * Assumes that the Google Analytics script is already loaded in the page\n */\nexport class GoogleAdapter extends BaseAdapter {\n public readonly name = \"GoogleAnalytics\";\n\n constructor(config: GoogleAdapterConfig) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize Google Analytics adapter\n * This just checks if gtag is available\n */\n public isEnabled(): boolean {\n const enabled =\n this.initialized && typeof window !== \"undefined\" && !!window.gtag;\n\n return enabled;\n }\n\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n return;\n }\n\n const measurementId = this.getConfig<string>(\"measurementId\");\n\n // Check if gtag is available\n if (!window.gtag) {\n this.logger.warn(\n \"Google Analytics gtag not found. Make sure the script is loaded.\"\n );\n return;\n }\n\n this.initialized = true;\n }\n\n /**\n * Track an event with Google Analytics\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\" || !window.gtag) {\n this.logger.warn(\n \"Cannot track event, adapter not initialized or gtag not available\",\n {\n eventType: event.type,\n }\n );\n return;\n }\n\n const measurementId = this.getConfig<string>(\"measurementId\");\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n this.trackPageView(\n event as IPageViewEvent,\n measurementId,\n adapterParams\n );\n break;\n case EventType.USER_ENGAGEMENT:\n this.trackUserEngagement(adapterParams);\n break;\n case EventType.SESSION_START:\n this.trackSessionStart(adapterParams);\n break;\n case EventType.FIRST_VISIT:\n this.trackFirstVisit(adapterParams);\n break;\n case EventType.VIEW_ITEM:\n this.trackViewItem(event as IViewItemEvent, adapterParams);\n break;\n case EventType.VIEWED_PRODUCT:\n this.trackViewedProduct(event as IViewedProductEvent, adapterParams);\n break;\n case EventType.CHECKOUT_PAYMENT:\n this.trackCheckoutPayment(\n event as ICheckoutPaymentEvent,\n adapterParams\n );\n break;\n case EventType.SCROLL:\n this.trackScroll(adapterParams);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event as IAddToCartEvent, adapterParams);\n break;\n case EventType.FORM_START:\n this.trackFormStart(adapterParams);\n break;\n case EventType.FORM_SUBMISSION:\n this.trackFormSubmission(event as IFormSubmissionEvent, adapterParams);\n break;\n case EventType.SEARCH:\n this.trackSearch(event as ISearchEvent, adapterParams);\n break;\n case EventType.VIEW_CONTENT:\n this.trackViewContent(event as IViewContentEvent, adapterParams);\n break;\n case EventType.VIEW_SEARCH_RESULTS:\n this.trackViewSearchResults(\n event as IViewSearchResultsEvent,\n adapterParams\n );\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(\n event as ICheckoutStartedEvent,\n adapterParams\n );\n break;\n case EventType.INITIATE_CHECKOUT:\n this.trackBeginCheckout(event as IBeginCheckoutEvent, adapterParams);\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(\n event as ICheckoutCompletedEvent,\n adapterParams\n );\n break;\n case EventType.PURCHASE:\n this.trackPurchase(event as IPurchaseEvent, adapterParams);\n break;\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(event as IAddPaymentInfoEvent, adapterParams);\n break;\n case EventType.ORDER_PLACED:\n this.trackOrderPlaced(event as IOrderPlacedEvent, adapterParams);\n break;\n case EventType.CUSTOM:\n this.trackCustomEvent(event as ICustomEvent, adapterParams);\n break;\n case EventType.SPECIFIC:\n this.trackSpecificEvent(event as ISpecificEvent, adapterParams);\n break;\n default: {\n this.logger.warn(\"Unhandled event type\", { eventType: event.type });\n break;\n }\n }\n }\n\n /**\n * Track a page view event\n * @param event The page view event\n * @param measurementId The Google Analytics measurement ID\n */\n private trackPageView(\n event: IPageViewEvent,\n measurementId: string,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"page_view\");\n const baseParams = {\n page_path: event.path,\n page_title: event.title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer || undefined,\n ga_session_id: event.ga_session_id || \"\",\n ga_session_number: event.ga_session_number || \"\",\n gclid: event.gclid || \"\",\n engagement_time_msec: event.engagement_time_msec,\n campaign: event.campaign || \"\",\n campaign_id: event.campaign_id || \"\",\n content: event.content || \"\",\n debug_mode: event.debug_mode,\n medium: event.medium || \"\",\n source: event.page_source || \"\",\n page_term: event.page_term || \"\",\n ignore_referrer: event.ignore_referrer,\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n user_id: event.user_id,\n user_properties: event.user_properties,\n session_engaged: event.session_engaged,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackUserEngagement(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"user_engagement\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n campaign: \"\",\n ga_session_id: \"\",\n ga_session_number: \"\",\n gclid: \"\",\n ignore_referrer: \"\",\n medium: \"\",\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n source: \"\",\n srsltid: \"\",\n term: \"\",\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackSessionStart(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"session_start\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n campaign: \"\",\n campaign_id: \"\",\n content: \"\",\n ga_session_id: \"\",\n ga_session_number: \"\",\n gclid: \"\",\n ignore_referrer: \"\",\n medium: \"\",\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n source: \"\",\n srsltid: \"\",\n term: \"\",\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackFirstVisit(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"first_visit\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n campaign: \"\",\n campaign_id: \"\",\n content: \"\",\n debug_mode: \"\",\n engagement_time_msec: 0,\n entrances: 1,\n ga_session_id: \"\",\n ga_session_number: \"\",\n gclid: \"\",\n ignore_referrer: \"\",\n medium: \"\",\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n page_source: \"\",\n page_term: \"\",\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackViewItem(\n event: IViewItemEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"view_item\");\n const baseParams = {\n currency: event.currency,\n value: event.value,\n items: event.items,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackScroll(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"scroll\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_path: window.location.pathname,\n page_referrer: document.referrer,\n page_title: document.title,\n percent_scrolled: 90, // or dynamically captured\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackCheckoutPayment(\n event: ICheckoutPaymentEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"checkout_payment\");\n const baseParams = {\n currency: event.currency,\n value: event.cartValue,\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackViewedProduct(\n event: IViewedProductEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"viewed_product\");\n const baseParams = {\n currency: event.currency,\n value: event.price,\n items: [\n {\n item_id: event.productId,\n item_name: event.productName,\n price: event.price,\n currency: event.currency,\n },\n ],\n view_duration: event.viewDuration,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackAddToCart(\n event: IAddToCartEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"add_to_cart\");\n const baseParams = {\n currency: event.currency || \"INR\",\n value: event.price * (event.quantity || 1), // Calculate total value\n items: [\n {\n item_id: event.productId,\n item_name: event.productName,\n price: event.price,\n quantity: event.quantity || 1,\n item_variant: event.variant,\n },\n ],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackFormStart(adapterParams?: TAdapterParams): void {\n const eventName = this.getEventName(adapterParams, \"form_start\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n first_field_id: \"\",\n first_field_name: \"\",\n first_field_position: \"\",\n first_field_type: \"\",\n form_destination: \"\",\n form_length: \"\",\n form_id: \"\",\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackCheckoutStarted(\n event: ICheckoutStartedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"begin_checkout\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n currency: event.currency || \"INR\",\n ecomm_pagetype: \"\",\n ecomm_prodid: \"\",\n ecomm_totalvalue: event.cartValue,\n value: event.cartValue,\n engagement_time_msec: undefined,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n item_variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackFormSubmission(\n event: IFormSubmissionEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"form_submit\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n form_destination: \"\",\n form_length: \"\",\n form_id: event.formId,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n private trackSearch(\n event: ISearchEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"search\");\n const baseParams = {\n batch_ordering_id: \"\",\n batch_page_id: \"\",\n engagement_time_msec: undefined,\n ga_session_id: \"\",\n ga_session_number: \"\",\n ignore_referrer: undefined,\n page_location: window.location.href,\n page_referrer: document.referrer,\n page_title: document.title,\n search_term: event.searchTerm,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n */\n private trackCheckoutCompleted(\n event: ICheckoutCompletedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"purchase\");\n const baseParams = {\n transaction_id: event.orderId,\n currency: event.currency || \"INR\",\n value: event.cartValue,\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n item_variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a custom event\n * @param event The custom event\n */\n private trackCustomEvent(\n event: ICustomEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"custom\"); // this will support all custom event\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a specific event\n * @param event The specific event\n */\n private trackSpecificEvent(\n event: ISpecificEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"\"); // this will support all custom event\n if (!eventName) {\n return;\n }\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track an add payment info event\n * @param event The add payment info event\n */\n private trackAddPaymentInfo(\n event: IAddPaymentInfoEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"add_payment_info\");\n const baseParams = {\n currency: event.currency || \"INR\",\n value: event.cartValue,\n payment_type: event.paymentType || \"\",\n items: event.items.map((item) => ({\n item_id: item.productId,\n item_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n item_variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a view content event\n * @param event The view content event\n */\n private trackViewContent(\n event: IViewContentEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"view_item\");\n const baseParams = {\n currency: event.currency || \"USD\",\n value: event.value || 0,\n items:\n event.items?.map((item: any) => ({\n item_id: item.item_id,\n item_name: item.item_name,\n item_category: item.item_category,\n item_category2: item.item_category2,\n item_category3: item.item_category3,\n item_category4: item.item_category4,\n item_category5: item.item_category5,\n item_brand: item.item_brand,\n item_variant: item.item_variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a purchase event\n * @param event The purchase event\n */\n private trackPurchase(\n event: IPurchaseEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"purchase\");\n const baseParams = {\n transaction_id: event.transaction_id,\n value: event.value,\n currency: event.currency || \"USD\",\n coupon: event.coupon,\n shipping: event.shipping,\n tax: event.tax,\n items:\n event.items?.map((item: any) => ({\n item_id: item.item_id,\n item_name: item.item_name,\n item_category: item.item_category,\n item_category2: item.item_category2,\n item_category3: item.item_category3,\n item_category4: item.item_category4,\n item_category5: item.item_category5,\n item_brand: item.item_brand,\n item_variant: item.item_variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a view search results event\n * @param event The view search results event\n */\n private trackViewSearchResults(\n event: IViewSearchResultsEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"view_search_results\");\n const baseParams = {\n search_term: event.search_term,\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track an order placed event\n * @param event The order placed event\n */\n private trackOrderPlaced(\n event: IOrderPlacedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"purchase\");\n const baseParams = {\n transaction_id: event.order_id,\n value: event.total_amount,\n currency: event.currency || \"USD\",\n items:\n event.items?.map((item: any) => ({\n item_id: item.product_id,\n item_name: item.product_name,\n item_category: item.category,\n item_brand: item.brand,\n item_variant: item.variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Track a begin checkout event\n * @param event The begin checkout event\n */\n private trackBeginCheckout(\n event: IBeginCheckoutEvent,\n adapterParams?: TAdapterParams\n ): void {\n const eventName = this.getEventName(adapterParams, \"begin_checkout\");\n const baseParams = {\n currency: event.currency || \"USD\",\n value: event.value || 0,\n coupon: event.coupon,\n items:\n event.items?.map((item: any) => ({\n item_id: item.item_id,\n item_name: item.item_name,\n item_category: item.item_category,\n item_category2: item.item_category2,\n item_category3: item.item_category3,\n item_category4: item.item_category4,\n item_category5: item.item_category5,\n item_brand: item.item_brand,\n item_variant: item.item_variant,\n price: item.price,\n quantity: item.quantity,\n })) || [],\n // GA4-specific parameters\n batch_ordering_id: event.batch_ordering_id || \"\",\n batch_page_id: event.batch_page_id || \"\",\n campaign: event.campaign || \"\",\n ga_session_id: event.ga_session_id || \"\",\n engagement_time_msec: event.engagement_time_msec,\n session_engaged: event.session_engaged,\n page_title: event.page_title || document.title,\n page_location: event.page_location || window.location.href,\n page_referrer: event.page_referrer || document.referrer,\n user_id: event.user_id,\n user_properties: event.user_properties,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n window.gtag?.(\"event\", eventName, enhancedParams);\n }\n\n /**\n * Convert an event to Google Analytics parameters\n * @param event The event to convert\n */\n private eventToParams(event: TEvent): Record<string, any> {\n // Remove type and timestamp from the event\n const { type, timestamp, ...params } = event;\n const affiliateParams = this.enhanceWithAffiliateParams(params);\n return this.enhanceWithExperimentParams(affiliateParams);\n }\n}\n","/**\n * Event name constants for tracking platforms\n */\nexport const EventNames = {\n // Page events\n PAGE_VIEWED: \"Page Viewed\",\n\n // Interaction events\n BUTTON_CLICKED: \"Button Clicked\",\n FORM_SUBMITTED: \"Form Submitted\",\n\n // Product events\n PRODUCT_VIEWED: \"Product Viewed\",\n ADDED_TO_CART: \"Added To Cart\",\n REMOVED_FROM_CART: \"Removed From Cart\",\n\n // Checkout events\n CHECKOUT_STARTED: \"Checkout Started\",\n PURCHASE_COMPLETED: \"Purchase Completed\",\n\n // Search events\n SEARCH: \"Search\",\n\n // User events\n USER_SIGNED_UP: \"User Signed Up\",\n USER_LOGGED_IN: \"User Logged In\",\n};\n\n/**\n * Default currency code\n */\nexport const DEFAULT_CURRENCY = \"INR\";\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IButtonClickEvent,\n type IFormSubmissionEvent,\n type IProductViewEvent,\n type IAddToCartEvent,\n type IRemoveFromCartEvent,\n type ICheckoutStartedEvent,\n type ICheckoutCompletedEvent,\n type ISearchEvent,\n type IUserSignupEvent,\n type IUserLoginEvent,\n type ICustomEvent,\n ISpecificEvent,\n} from \"../types\";\nimport { EventNames, DEFAULT_CURRENCY } from \"../constants\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\nimport moengage from \"@moengage/web-sdk\";\n\n/**\n * Configuration for the MoenGage adapter\n */\nexport interface MoengageAdapterConfig {\n /**\n * MoenGage App ID (required for SDK initialization)\n */\n appId: string;\n /**\n * Whether to enable user identification\n */\n enableUserIdentification?: boolean;\n /**\n * Debug mode for MoenGage SDK\n */\n debug?: boolean;\n /**\n * Data center region (default: 'dc_01')\n */\n region?: string;\n}\n\n/**\n * MoenGage tracking adapter using the official Web SDK\n */\nexport class MoengageAdapter extends BaseAdapter {\n public readonly name = \"MoEngage\";\n\n constructor(config: MoengageAdapterConfig) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Get MoEngage SDK instance from window\n */\n private getMoengageSDK(): any {\n return typeof window !== \"undefined\" ? (window as any).Moengage : null;\n }\n\n /**\n * Initialize the MoenGage adapter using the Web SDK\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n const appId = this.getConfig<string>(\"appId\");\n if (!appId) {\n this.logger.warn(\"App ID is required for initialization\");\n return;\n }\n\n // Initialize MoenGage SDK\n const region = this.getConfig<string>(\"region\", \"dc_01\");\n const config = {\n app_id: appId,\n debug_logs: this.getConfig<boolean>(\"debug\", false) ? 1 : 0,\n cluster: region,\n disableCookies: true,\n };\n\n // Initialize MoEngage SDK\n moengage.initialize(config);\n\n this.initialized = true;\n } catch (error) {\n this.logger.error(\"Failed to initialize\", error as Error);\n }\n }\n\n /**\n * Track an event with MoenGage SDK\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n const sdk = this.getMoengageSDK();\n if (!this.initialized || typeof window === \"undefined\" || !sdk) {\n this.logger.warn(\n \"Cannot track event, adapter not initialized or SDK not available\",\n {\n eventType: event.type,\n }\n );\n return;\n }\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n this.trackPageView(event as IPageViewEvent, adapterParams);\n break;\n case EventType.BUTTON_CLICK:\n this.trackButtonClick(event as IButtonClickEvent, adapterParams);\n break;\n case EventType.FORM_SUBMISSION:\n this.trackFormSubmission(event as IFormSubmissionEvent, adapterParams);\n break;\n case EventType.PRODUCT_VIEW:\n this.trackProductView(event as IProductViewEvent, adapterParams);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event as IAddToCartEvent, adapterParams);\n break;\n case EventType.REMOVE_FROM_CART:\n this.trackRemoveFromCart(event as IRemoveFromCartEvent, adapterParams);\n break;\n case EventType.CHECKOUT_STARTED:\n case EventType.INITIATE_CHECKOUT:\n this.trackCheckoutStarted(\n event as ICheckoutStartedEvent,\n adapterParams\n );\n break;\n case EventType.CHECKOUT_COMPLETED:\n case EventType.PURCHASE:\n this.trackCheckoutCompleted(\n event as ICheckoutCompletedEvent,\n adapterParams\n );\n break;\n case EventType.SEARCH:\n this.trackSearch(event as ISearchEvent, adapterParams);\n break;\n case EventType.USER_SIGNUP:\n this.trackUserSignup(event as IUserSignupEvent, adapterParams);\n break;\n case EventType.USER_LOGIN:\n this.trackUserLogin(event as IUserLoginEvent, adapterParams);\n break;\n case EventType.CUSTOM:\n this.trackCustomEvent(event as ICustomEvent, adapterParams);\n break;\n case EventType.SPECIFIC:\n this.trackSpecificEvent(event as ISpecificEvent, adapterParams);\n break;\n default:\n this.logger.warn(\"Unhandled event type\", { eventType: event.type });\n break;\n }\n }\n\n /**\n * Track a page view event\n * @param event The page view event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackPageView(\n event: IPageViewEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n if (!sdk?.track_event) {\n this.logger.warn(\"track_event not available for PageView event\");\n return;\n }\n\n const eventName = this.getEventName(adapterParams, EventNames.PAGE_VIEWED);\n const baseEventData = {\n page_path: event.path,\n page_title: event.title,\n page_url: window.location.href,\n referrer: event.referrer || document.referrer,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n\n sdk.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a button click event\n * @param event The button click event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackButtonClick(\n event: IButtonClickEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.BUTTON_CLICKED\n );\n const baseEventData = {\n button_id: event.buttonId,\n button_text: event.buttonText,\n location: event.location,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a form submission event\n * @param event The form submission event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackFormSubmission(\n event: IFormSubmissionEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.FORM_SUBMITTED\n );\n const baseEventData = {\n form_id: event.formId,\n form_name: event.formName,\n success: event.success,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a product view event\n * @param event The product view event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackProductView(\n event: IProductViewEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.PRODUCT_VIEWED\n );\n const baseEventData = {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency || DEFAULT_CURRENCY,\n category: event.category,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track an add to cart event\n * @param event The add to cart event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackAddToCart(\n event: IAddToCartEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const quantity = event.quantity ?? 1;\n const eventName = this.getEventName(\n adapterParams,\n EventNames.ADDED_TO_CART\n );\n const baseEventData = {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency || DEFAULT_CURRENCY,\n quantity: quantity,\n variant: event.variant,\n total_value: event.price * quantity,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a remove from cart event\n * @param event The remove from cart event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackRemoveFromCart(\n event: IRemoveFromCartEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.REMOVED_FROM_CART\n );\n const baseEventData = {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency || DEFAULT_CURRENCY,\n quantity: event.quantity,\n variant: event.variant,\n total_value: event.price * event.quantity,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a checkout started event\n * @param event The checkout started event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCheckoutStarted(\n event: ICheckoutStartedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.CHECKOUT_STARTED\n );\n const baseEventData = {\n cart_value: event.cartValue,\n currency: event.currency || DEFAULT_CURRENCY,\n item_count: event.itemCount,\n items: event.items.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCheckoutCompleted(\n event: ICheckoutCompletedEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.PURCHASE_COMPLETED\n );\n const baseEventData = {\n order_id: event.orderId,\n cart_value: event.cartValue,\n currency: event.currency || DEFAULT_CURRENCY,\n item_count: event.itemCount,\n items: event.items.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity,\n variant: item.variant,\n })),\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a search event\n * @param event The search event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackSearch(\n event: ISearchEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(adapterParams, EventNames.SEARCH);\n const baseEventData = {\n search_term: event.searchTerm,\n results_count: event.resultsCount,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a user signup event\n * @param event The user signup event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackUserSignup(\n event: IUserSignupEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.USER_SIGNED_UP\n );\n const baseEventData = {\n user_id: event.userId,\n method: event.method,\n success: event.success,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n\n // Add user attributes if user ID is available and user identification is enabled\n if (\n event.userId &&\n this.getConfig<boolean>(\"enableUserIdentification\", true)\n ) {\n sdk?.add_unique_user_id(event.userId);\n }\n }\n\n /**\n * Track a user login event\n * @param event The user login event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackUserLogin(\n event: IUserLoginEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(\n adapterParams,\n EventNames.USER_LOGGED_IN\n );\n const baseEventData = {\n user_id: event.userId,\n method: event.method,\n success: event.success,\n };\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseEventData);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n sdk?.track_event(eventName, enhancedEventData);\n\n // Add user attributes if user ID is available and user identification is enabled\n if (\n event.userId &&\n this.getConfig<boolean>(\"enableUserIdentification\", true)\n ) {\n sdk?.add_unique_user_id(event.userId);\n }\n }\n\n /**\n * Track a custom event\n * @param event The custom event\n * @param adapterParams Optional adapter-specific parameters\n */\n private trackCustomEvent(\n event: ICustomEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(adapterParams, \"custom\");\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedEventData = this.mergeEventData(\n experimentParams,\n adapterParams\n );\n\n sdk?.track_event(eventName, enhancedEventData);\n }\n\n /**\n * Track a specific event\n * @param event The specific event\n */\n private trackSpecificEvent(\n event: ISpecificEvent,\n adapterParams?: TAdapterParams\n ): void {\n const sdk = this.getMoengageSDK();\n const eventName = this.getEventName(adapterParams, \"\"); // this will support all custom event\n if (!eventName) {\n return;\n }\n const affiliateParams = this.enhanceWithAffiliateParams({});\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n sdk?.track_event(eventName, enhancedParams);\n }\n\n /**\n * Set user attributes in MoenGage\n * @param attributes User attributes to set\n */\n public setUserAttributes(attributes: Record<string, any>): void {\n const sdk = this.getMoengageSDK();\n if (!this.initialized || typeof window === \"undefined\" || !sdk) {\n this.logger.warn(\"Cannot set user attributes, adapter not initialized\");\n return;\n }\n\n // Set user attributes\n for (const [key, value] of Object.entries(attributes)) {\n switch (key) {\n case \"firstName\":\n sdk?.add_first_name(value as string);\n break;\n case \"lastName\":\n sdk?.add_last_name(value as string);\n break;\n case \"email\":\n sdk?.add_email(value as string);\n break;\n case \"mobile\":\n sdk?.add_mobile(value as string);\n break;\n case \"username\":\n sdk?.add_user_name(value as string);\n break;\n case \"gender\":\n sdk?.add_gender(value as string);\n break;\n case \"birthday\":\n sdk?.add_birthday(value as Date);\n break;\n case \"userId\":\n sdk?.add_unique_user_id(value as string);\n break;\n default:\n sdk?.add_user_attribute(key, value);\n break;\n }\n }\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport {\n type TEvent,\n EventType,\n type IPageViewEvent,\n type IAddToCartEvent,\n type IProductViewEvent,\n type IViewContentEvent,\n type ISearchEvent,\n type IBeginCheckoutEvent,\n type IPurchaseEvent,\n type ICheckoutStartedEvent,\n type ICheckoutCompletedEvent,\n} from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\nimport { generateEventId } from \"../utils/event-id\";\n\ndeclare global {\n interface Window {\n posthog?: {\n capture: (eventName: string, properties?: Record<string, any>) => void;\n identify: (distinctId: string, properties?: Record<string, any>) => void;\n };\n }\n}\n\n/**\n * Configuration for the PostHog adapter\n */\nexport interface PostHogAdapterConfig {\n /**\n * Enable debug logs\n */\n enableDebugLogs?: boolean;\n}\n\n/**\n * PostHog tracking adapter\n * Assumes that the PostHog script is already loaded in the page\n */\nexport class PostHogAdapter extends BaseAdapter {\n public readonly name = \"PostHog\";\n\n constructor(config: PostHogAdapterConfig = {}) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize PostHog\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Skip initialization if running on server\n if (typeof window === \"undefined\") {\n return;\n }\n\n // Check if posthog is available\n if (!window.posthog) {\n this.logger.warn(\n \"PostHog object not found. Make sure the script is loaded.\"\n );\n return;\n }\n\n this.initialized = true;\n }\n\n /**\n * Track an event with PostHog\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n // Generate unique event ID for deduplication if not already present\n if (!event.eventId) {\n event.eventId = generateEventId(event.type);\n }\n\n // Ensure timestamp is always available\n if (!event.timestamp) {\n event.timestamp = Date.now();\n }\n\n // Track client-side only\n await this.trackClientSide(event, adapterParams);\n }\n\n /**\n * Check if the adapter is enabled\n */\n public isEnabled(): boolean {\n return (\n this.initialized && typeof window !== \"undefined\" && !!window.posthog\n );\n }\n\n /**\n * Track event on client-side (browser PostHog)\n */\n private async trackClientSide(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\" || !window.posthog) {\n this.logger.warn(\n \"Cannot track client-side event, adapter not initialized or posthog not available\",\n {\n eventType: event.type,\n }\n );\n return;\n }\n\n const { eventName, enhancedParams } = this.formatEventPayload(\n event,\n adapterParams\n );\n\n // Skip tracking if eventName is empty (unknown event type)\n if (!eventName) {\n return;\n }\n\n // Add event_id for deduplication\n const finalParams = {\n ...enhancedParams,\n ...(event.eventId && { event_id: event.eventId }),\n };\n\n window.posthog?.capture(eventName, finalParams);\n }\n\n /**\n * Utility function to format event payload for client-side tracking\n */\n private formatEventPayload(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): { eventName: string; enhancedParams: Record<string, any> } {\n let baseParams: Record<string, any> = {};\n let eventName = \"\";\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n const pageViewEvent = event as IPageViewEvent;\n eventName = this.getEventName(adapterParams, \"$pageview\");\n baseParams = {\n // PostHog-compatible parameters\n $current_url: pageViewEvent.page_location || pageViewEvent.path,\n $title: pageViewEvent.page_title || pageViewEvent.title,\n $referrer: pageViewEvent.page_referrer || pageViewEvent.referrer,\n // Custom parameters\n page_location: pageViewEvent.page_location || pageViewEvent.path,\n page_title: pageViewEvent.page_title || pageViewEvent.title,\n page_referrer: pageViewEvent.page_referrer || pageViewEvent.referrer,\n page_path: pageViewEvent.page_path || pageViewEvent.path,\n event_category: pageViewEvent.event_category,\n };\n break;\n\n case EventType.VIEW_CONTENT:\n const viewContentEvent = event as IViewContentEvent;\n eventName = this.getEventName(adapterParams, \"view_content\");\n baseParams = {\n content_type: viewContentEvent.content_type || \"product\",\n content_ids: viewContentEvent.content_ids || [],\n content_name: viewContentEvent.content_name || \"\",\n content_category: viewContentEvent.content_category || \"\",\n value: viewContentEvent.value || 0,\n currency: viewContentEvent.currency || \"INR\",\n };\n break;\n\n case EventType.PRODUCT_VIEW:\n const productEvent = event as IProductViewEvent;\n eventName = this.getEventName(adapterParams, \"product_viewed\");\n baseParams = {\n product_id: productEvent.productId,\n product_name: productEvent.productName,\n category: productEvent.category,\n price: productEvent.price,\n currency: productEvent.currency || \"INR\",\n // PostHog specific format\n $product_id: productEvent.productId,\n $product_name: productEvent.productName,\n $product_category: productEvent.category,\n $product_price: productEvent.price,\n };\n break;\n\n case EventType.ADD_TO_CART:\n const cartEvent = event as IAddToCartEvent;\n eventName = this.getEventName(adapterParams, \"add_to_cart\");\n baseParams = {\n product_id: cartEvent.productId,\n product_name: cartEvent.productName,\n price: cartEvent.price,\n currency: cartEvent.currency || \"INR\",\n quantity: cartEvent.quantity,\n variant: cartEvent.variant,\n // PostHog specific format\n $product_id: cartEvent.productId,\n $product_name: cartEvent.productName,\n $product_price: cartEvent.price,\n $quantity: cartEvent.quantity,\n };\n break;\n\n case EventType.SEARCH:\n const searchEvent = event as ISearchEvent;\n eventName = this.getEventName(adapterParams, \"search\");\n baseParams = {\n search_term: searchEvent.searchTerm,\n results_count: searchEvent.resultsCount,\n content_ids: searchEvent.content_ids || [],\n // PostHog specific format\n $search_query: searchEvent.searchTerm,\n $search_results_count: searchEvent.resultsCount,\n };\n break;\n\n case EventType.CHECKOUT_STARTED:\n const checkoutStartedEvent = event as ICheckoutStartedEvent;\n eventName = this.getEventName(adapterParams, \"checkout_started\");\n baseParams = {\n currency: checkoutStartedEvent.currency || \"INR\",\n value: checkoutStartedEvent.cartValue,\n num_items:\n checkoutStartedEvent.itemCount ||\n checkoutStartedEvent.items?.length ||\n 0,\n items:\n checkoutStartedEvent.items?.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity || 1,\n variant: item.variant,\n })) || [],\n // PostHog specific format\n $cart_value: checkoutStartedEvent.cartValue,\n $item_count:\n checkoutStartedEvent.itemCount ||\n checkoutStartedEvent.items?.length ||\n 0,\n };\n break;\n\n case EventType.INITIATE_CHECKOUT:\n const checkoutEvent = event as IBeginCheckoutEvent;\n eventName = this.getEventName(adapterParams, \"checkout_started\");\n baseParams = {\n currency: checkoutEvent.currency || \"INR\",\n value: checkoutEvent.cartValue,\n num_items:\n checkoutEvent.itemCount || checkoutEvent.items?.length || 0,\n items:\n checkoutEvent.items?.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity || 1,\n variant: item.variant,\n })) || [],\n // PostHog specific format\n $cart_value: checkoutEvent.cartValue,\n $item_count:\n checkoutEvent.itemCount || checkoutEvent.items?.length || 0,\n };\n break;\n\n case EventType.CHECKOUT_COMPLETED:\n const checkoutCompletedEvent = event as ICheckoutCompletedEvent;\n eventName = this.getEventName(adapterParams, \"purchase\");\n baseParams = {\n transaction_id: checkoutCompletedEvent.orderId,\n currency: checkoutCompletedEvent.currency || \"INR\",\n value: checkoutCompletedEvent.cartValue,\n num_items:\n checkoutCompletedEvent.itemCount ||\n checkoutCompletedEvent.items?.length ||\n 0,\n items:\n checkoutCompletedEvent.items?.map((item) => ({\n product_id: item.productId,\n product_name: item.productName,\n price: item.price,\n quantity: item.quantity || 1,\n variant: item.variant,\n })) || [],\n // PostHog specific format\n $order_id: checkoutCompletedEvent.orderId,\n $order_value: checkoutCompletedEvent.cartValue,\n $order_currency: checkoutCompletedEvent.currency || \"INR\",\n $order_items_count:\n checkoutCompletedEvent.itemCount ||\n checkoutCompletedEvent.items?.length ||\n 0,\n };\n break;\n\n case EventType.PURCHASE:\n const purchaseEvent = event as IPurchaseEvent;\n eventName = this.getEventName(adapterParams, \"purchase\");\n baseParams = {\n currency: purchaseEvent.currency || \"INR\",\n value: purchaseEvent.value,\n num_items:\n purchaseEvent.num_items || purchaseEvent.contents?.length || 0,\n contents: purchaseEvent.contents || [],\n // PostHog specific format\n $order_value: purchaseEvent.value,\n $order_currency: purchaseEvent.currency || \"INR\",\n $order_items_count:\n purchaseEvent.num_items || purchaseEvent.contents?.length || 0,\n };\n break;\n\n default:\n // Skip tracking for unknown event types\n this.logger.warn(`Skipping unknown event type: ${event.type}`);\n return { eventName: \"\", enhancedParams: {} };\n }\n\n const affiliateParams = this.enhanceWithAffiliateParams(baseParams);\n const experimentParams = this.enhanceWithExperimentParams(affiliateParams);\n const enhancedParams = this.mergeEventData(experimentParams, adapterParams);\n\n return { eventName, enhancedParams };\n }\n}\n","import {\n sendShopifyAnalytics,\n getClientBrowserParameters,\n AnalyticsEventName,\n type ShopifyAnalyticsProduct,\n type ShopifyPageViewPayload,\n ShopifySalesChannel,\n} from \"@shopify/hydrogen-react\";\nimport { BaseAdapter } from \"./base-adapter\";\nimport type { TEvent } from \"../types\";\nimport { EventType } from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\n// Constants based on environment variables\nconst DEFAULT_CURRENCY = \"INR\";\nconst DEFAULT_LANGUAGE = \"en\";\n\n/**\n * Type definitions for analytics payloads\n */\ntype SendPageViewPayload = {\n pageType?: string;\n products?: ShopifyAnalyticsProduct[];\n collectionHandle?: string;\n searchString?: string;\n totalValue?: number;\n cartId?: string;\n};\n\ntype SendAddToCartPayload = {\n cartId: string;\n products?: ShopifyAnalyticsProduct[];\n totalValue?: ShopifyPageViewPayload[\"totalValue\"];\n};\n\n/**\n * Configuration interface for Shopify Analytics Adapter\n */\nexport interface ShopifyAdapterConfig {\n shopId: string;\n domain: string;\n currency?: string;\n}\n\n/**\n * Shopify Analytics Adapter for tracking events to Shopify Admin Analytics\n */\nexport class ShopifyAdapter extends BaseAdapter {\n public readonly name = \"ShopifyAnalytics\";\n private shopId: string;\n private domain: string;\n private currency: string;\n\n constructor(config: ShopifyAdapterConfig) {\n super(config);\n this.shopId = config.shopId;\n this.domain = config.domain;\n this.currency = config.currency || DEFAULT_CURRENCY;\n }\n\n /**\n * Initialize the Shopify Analytics adapter\n */\n public async initialize(): Promise<void> {\n this.initializeLogger();\n\n try {\n // Enable Shopify cookies for attribution tracking\n if (typeof window !== \"undefined\") {\n // Note: useShopifyCookies should be called at the React component level\n // This will be handled in the ShopkitAnalytics component\n }\n this.initialized = true;\n } catch (error) {\n this.logger.error(\n \"Failed to initialize Shopify Analytics\",\n error instanceof Error ? error : new Error(String(error))\n );\n throw error;\n }\n }\n\n /**\n * Convert product ID to Shopify GID format if it's not already\n */\n private formatProductGid(productId: string): string {\n return productId.startsWith(\"gid://shopify/Product/\")\n ? productId\n : `gid://shopify/Product/${productId}`;\n }\n\n /**\n * Get user consent status from your consent management system\n */\n private getUserConsent() {\n // Check if user has given consent (implement based on your consent system)\n const hasConsent = this.checkUserConsent();\n\n return {\n hasUserConsent: hasConsent,\n analyticsAllowed: hasConsent && this.checkAnalyticsConsent(),\n marketingAllowed: hasConsent && this.checkMarketingConsent(),\n saleOfDataAllowed: hasConsent && this.checkSaleOfDataConsent(),\n };\n }\n\n /**\n * Check user consent (implement based on your consent management)\n */\n private checkUserConsent(): boolean {\n // Example implementations:\n // return localStorage.getItem('user_consent') === 'true';\n // return document.cookie.includes('consent=granted');\n // return window.gtag?.('consent', 'query') === 'granted';\n\n // For now, return true but implement your actual consent logic\n return true;\n }\n\n private checkAnalyticsConsent(): boolean {\n // Implement your analytics consent check\n return true;\n }\n\n private checkMarketingConsent(): boolean {\n // Implement your marketing consent check\n return true;\n }\n\n private checkSaleOfDataConsent(): boolean {\n // Implement your sale of data consent check\n return true;\n }\n\n /**\n * Create base payload for all events\n */\n private createBasePayload(): any {\n const consent = this.getUserConsent();\n\n return {\n ...getClientBrowserParameters(),\n ...consent,\n storefrontId: this.shopId,\n shopifySalesChannel: ShopifySalesChannel.headless,\n shopId: `gid://shopify/Shop/${this.shopId}`,\n currency: this.currency,\n acceptedLanguage: DEFAULT_LANGUAGE,\n ...this.enhanceWithExperimentParams(this.enhanceWithAffiliateParams({})),\n };\n }\n\n /**\n * Send page view event using the enhanced functionality\n */\n public sendPageView = (\n eventName: keyof typeof AnalyticsEventName,\n payload?: SendPageViewPayload\n ) => {\n const enhancedPayload = {\n ...this.createBasePayload(),\n ...payload,\n };\n\n return sendShopifyAnalytics({\n eventName,\n payload: enhancedPayload,\n });\n };\n\n /**\n * Send add to cart event using the enhanced functionality\n */\n public sendAddToCart = ({\n cartId,\n totalValue,\n products,\n }: SendAddToCartPayload) => {\n return this.sendPageView(AnalyticsEventName.ADD_TO_CART, {\n cartId,\n totalValue,\n products,\n });\n };\n\n /**\n * Track an event using Shopify Analytics\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\") {\n this.logger.warn(\n \"Shopify Analytics not initialized or not in browser environment\"\n );\n return;\n }\n\n // Get adapter-specific parameters\n const params = this.getAdapterParams(adapterParams);\n const customEventName = this.getEventName(params, event.type);\n\n // Enhance event with affiliate and experiment data\n const affiliateParams = this.enhanceWithAffiliateParams(event);\n const enhancedEvent = this.enhanceWithExperimentParams(affiliateParams);\n\n try {\n switch (event.type) {\n case EventType.SHOPIFY_PAGE_VIEW:\n case EventType.PAGE_VIEW:\n const pageViewPayload = this.mergeEventData(enhancedEvent, params);\n this.sendPageView(AnalyticsEventName.PAGE_VIEW, pageViewPayload);\n break;\n\n case EventType.VIEW_CONTENT:\n const viewContentPayload = this.mergeEventData(enhancedEvent, params);\n this.sendPageView(\n AnalyticsEventName.PRODUCT_VIEW,\n viewContentPayload\n );\n break;\n\n case EventType.ADD_TO_CART:\n const addToCartPayload = this.mergeEventData(enhancedEvent, params);\n this.trackAddToCart(addToCartPayload);\n break;\n\n case EventType.CHECKOUT_STARTED:\n case EventType.INITIATE_CHECKOUT:\n // For checkout events, send as PAGE_VIEW with checkout page context\n const checkoutPayload = this.mergeEventData(\n { ...enhancedEvent, pageType: \"checkout\" },\n params\n );\n this.sendPageView(AnalyticsEventName.PAGE_VIEW, checkoutPayload);\n break;\n\n default:\n this.logger.warn(\"Event not supported by Shopify Analytics\", {\n eventType: event.type,\n });\n break;\n }\n } catch (error) {\n this.logger.error(\n \"Error tracking Shopify Analytics event\",\n error instanceof Error ? error : new Error(String(error)),\n { eventType: event.type }\n );\n }\n }\n\n /**\n * Check if Shopify session is properly established\n */\n public isSessionValid(): boolean {\n if (typeof window === \"undefined\") return false;\n\n const shopifyY = document.cookie.includes(\"_shopify_y=\");\n const shopifyS = document.cookie.includes(\"_shopify_s=\");\n\n return shopifyY && shopifyS;\n }\n\n /**\n * Get session debug information\n */\n public getSessionDebugInfo(): object {\n if (typeof window === \"undefined\")\n return { error: \"Not in browser environment\" };\n\n return {\n sessionValid: this.isSessionValid(),\n cookies: {\n shopify_y: document.cookie.includes(\"_shopify_y=\"),\n shopify_s: document.cookie.includes(\"_shopify_s=\"),\n all: document.cookie,\n },\n shopId: this.shopId,\n initialized: this.initialized,\n };\n }\n\n /**\n * Track add to cart event with enhanced error handling\n */\n private trackAddToCart(event: any): void {\n if (!event.productId) {\n this.logger.warn(\"ADD_TO_CART event missing productId\");\n return;\n }\n\n try {\n const productGid = this.formatProductGid(event.productId);\n const cartKey = `merchant_${process.env.NEXT_PUBLIC_MERCHANT_NAME}_cartId`;\n const cartId = localStorage.getItem(cartKey) || \"\";\n\n if (!cartId) {\n this.logger.warn(\"No cart ID found, creating anonymous session\");\n // You might want to generate a temporary cart ID or handle this case\n }\n\n // Validate product data\n if (!event.price || event.price <= 0) {\n this.logger.warn(\"Invalid or missing price for ADD_TO_CART\", {\n price: event.price,\n });\n }\n\n // Create products array for analytics\n const productPrice = Math.max(0, event.price || 0);\n const productQuantity = Math.max(1, event.quantity || 1);\n\n const products: ShopifyAnalyticsProduct[] = [\n {\n productGid: productGid,\n variantGid:\n event.variantId || productGid.replace(\"Product\", \"ProductVariant\"),\n quantity: productQuantity,\n price: productPrice.toString(), // Convert to string as required by ShopifyAnalyticsProduct\n name: event.productName || \"Unknown Product\",\n brand: event.brand || \"Unknown Brand\",\n },\n ];\n\n const totalValue = productPrice * productQuantity;\n\n // Use the enhanced sendAddToCart method\n this.sendAddToCart({\n cartId,\n products,\n totalValue,\n });\n } catch (error) {\n this.logger.error(\n \"Error in trackAddToCart\",\n error instanceof Error ? error : new Error(String(error))\n );\n // Don't throw - just log the error to prevent breaking the user experience\n }\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport type { TEvent } from \"../types\";\nimport { EventType } from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\n/**\n * Configuration interface for KwikPass Adapter\n */\nexport interface KwikPassConfig {\n enableDebugLogs?: boolean;\n enableKwikPassEvents?: boolean;\n}\n\n/**\n * KwikPass Analytics Adapter for tracking events to KwikPass platform\n */\nexport class KwikPassAdapter extends BaseAdapter {\n public readonly name = \"KwikPass\";\n private enableKwikPassEvents: boolean;\n\n constructor(config: KwikPassConfig = {}) {\n super(config);\n this.enableKwikPassEvents = config.enableKwikPassEvents ?? true;\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize the KwikPass adapter\n */\n public async initialize(): Promise<void> {\n try {\n if (typeof window !== \"undefined\") {\n // KwikPass adapter initialization\n }\n this.initialized = true;\n } catch (error) {\n this.logger.error(\n \"Failed to initialize KwikPass adapter\",\n error as Error\n );\n throw error;\n }\n }\n\n /**\n * Track an event using KwikPass\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\") {\n this.logger.warn(\n \"KwikPass adapter not initialized or not in browser environment\"\n );\n return;\n }\n\n if (!this.enableKwikPassEvents) {\n return;\n }\n\n // Enhance event with affiliate and experiment data\n const affiliateParams = this.enhanceWithAffiliateParams(event);\n const enhancedEvent = this.enhanceWithExperimentParams(affiliateParams);\n\n try {\n switch (event.type) {\n case EventType.PRODUCT_VIEW:\n this.trackProductView(enhancedEvent, adapterParams);\n break;\n\n case EventType.COLLECTION_VIEW:\n this.trackCollectionView(enhancedEvent, adapterParams);\n break;\n\n case EventType.PAGE_VIEW:\n this.trackPageView(enhancedEvent, adapterParams);\n break;\n\n default:\n this.logger.warn(\"Event not supported\", { eventType: event.type });\n break;\n }\n } catch (error) {\n this.logger.error(\"Error tracking KwikPass event\", error as Error, {\n eventType: event.type,\n });\n }\n }\n\n /**\n * Send event to KwikPass platform\n */\n private sendKwikPassEvent(\n type: string,\n eventData: any,\n adapterParams?: TAdapterParams\n ): void {\n // Get custom event name or use default\n const customEventType = this.getEventName(adapterParams, type);\n\n // Merge with adapter-specific parameters\n const enhancedEventData = this.mergeEventData(eventData, adapterParams);\n\n // Dispatch custom event for KwikPass to listen\n if (typeof window !== \"undefined\") {\n const customEvent = new CustomEvent(`page_view_kp`, {\n detail: {\n type: customEventType,\n detail: enhancedEventData,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n\n /**\n * Track collection view event\n */\n private trackCollectionView(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendKwikPassEvent(\n \"collection\",\n {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency,\n category: event.category,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track product view event\n */\n private trackProductView(event: any, adapterParams?: TAdapterParams): void {\n this.sendKwikPassEvent(\n \"product\",\n {\n product_id: event.productId,\n product_name: event.productName,\n price: event.price,\n currency: event.currency,\n category: event.category,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track page view event\n */\n private trackPageView(event: any, adapterParams?: TAdapterParams): void {\n this.sendKwikPassEvent(\n \"other\",\n {\n path: event.path,\n title: event.title,\n referrer: event.referrer,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport type { TEvent } from \"../types\";\nimport { EventType } from \"../types\";\nimport type { TAdapterParams } from \"../adapter-params\";\n\n/**\n * Configuration interface for Kwik Checkout Adapter\n */\nexport interface KwikCheckoutConfig {\n mid?: string;\n environment?: string;\n storeId?: string;\n enableDebugLogs?: boolean;\n}\n\n/**\n * Kwik Checkout Analytics Adapter for tracking checkout events to GoKwik platform\n */\nexport class KwikCheckoutAdapter extends BaseAdapter {\n public readonly name = \"KwikCheckout\";\n private mid: string;\n private environment: string;\n private storeId: string;\n\n constructor(config: KwikCheckoutConfig) {\n super(config);\n this.mid = config.mid || \"\";\n this.environment = config.environment || \"production\";\n this.storeId = config.storeId || \"\";\n // Initialize logger with proper adapter name\n this.initializeLogger();\n }\n\n /**\n * Initialize the GoKwik adapter\n */\n public async initialize(): Promise<void> {\n try {\n if (typeof window !== \"undefined\") {\n // Initialize GoKwik SDK if available\n }\n this.initialized = true;\n } catch (error) {\n this.logger.error(\"Failed to initialize GoKwik adapter\", error as Error);\n throw error;\n }\n }\n\n /**\n * Track an event using GoKwik\n * @param event The event to track\n * @param adapterParams Optional adapter-specific parameters\n */\n public async trackEvent(\n event: TEvent,\n adapterParams?: TAdapterParams\n ): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\") {\n this.logger.warn(\n \"GoKwik adapter not initialized or not in browser environment\"\n );\n return;\n }\n\n try {\n // Enhanced event data with affiliate and experiment parameters\n const affiliateEnhanced = this.enhanceWithAffiliateParams(event);\n const enhancedEvent = this.enhanceWithExperimentParams(affiliateEnhanced);\n\n switch (event.type) {\n case EventType.STARTED_CHECKOUT_GK:\n this.trackStartedCheckoutGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.MOBILE_ADDED_GK:\n this.trackMobileAddedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADDRESS_SELECTED_GK:\n this.trackAddressSelectedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADDRESS_COMPLETED_GK:\n this.trackAddressCompletedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADDRESS_ADDED_GK:\n this.trackAddressAddedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.PIN_CODE_ADDED_GK:\n this.trackPinCodeAddedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.PAYMENT_METHOD_SELECTED_GK:\n this.trackPaymentMethodSelectedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.PAYMENT_COMPLETED_GK:\n this.trackPaymentCompletedGK(enhancedEvent, adapterParams);\n break;\n\n case EventType.ORDER_SUCCESS:\n this.trackOrderSuccess(enhancedEvent, adapterParams);\n break;\n\n case EventType.ORDER_COMPLETED:\n this.trackOrderCompleted(enhancedEvent, adapterParams);\n break;\n\n case EventType.CART_VIEWED:\n this.trackCartViewed(enhancedEvent, adapterParams);\n break;\n\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(enhancedEvent, adapterParams);\n break;\n\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(enhancedEvent, adapterParams);\n break;\n\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(enhancedEvent, adapterParams);\n break;\n\n default:\n this.logger.warn(\"Event not supported\", { eventType: event.type });\n break;\n }\n } catch (error) {\n this.logger.error(\"Error tracking GoKwik event\", error as Error, {\n eventType: event.type,\n });\n }\n }\n\n /**\n * Send event to GoKwik platform\n */\n private sendGoKwikEvent(\n eventName: string,\n eventData: any,\n adapterParams?: TAdapterParams\n ): void {\n // Get custom event name or use default\n const customEventName = this.getEventName(adapterParams, eventName);\n\n // Merge with adapter-specific parameters\n const enhancedEventData = this.mergeEventData(eventData, adapterParams);\n\n // Check if GoKwik SDK is available\n if (typeof window !== \"undefined\" && (window as any).gokwikSdk) {\n try {\n // Send event through GoKwik SDK\n (window as any).gokwikSdk.track?.(customEventName, enhancedEventData);\n } catch (error) {\n this.logger.error(\n `Error sending GoKwik event ${customEventName} via SDK`,\n error as Error\n );\n }\n } else {\n // Fallback: dispatch custom event for GoKwik to listen\n if (typeof window !== \"undefined\") {\n const customEvent = new CustomEvent(`gokwik_${customEventName}`, {\n detail: enhancedEventData,\n });\n window.dispatchEvent(customEvent);\n }\n }\n }\n\n /**\n * Track started checkout GK event\n */\n private trackStartedCheckoutGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"started_checkout\",\n {\n cart_value: event.cartValue,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track mobile added GK event\n */\n private trackMobileAddedGK(event: any, adapterParams?: TAdapterParams): void {\n this.sendGoKwikEvent(\n \"mobile_added\",\n {\n mobile: event.mobile,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track address selected GK event\n */\n private trackAddressSelectedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"address_selected\",\n {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track address completed GK event\n */\n private trackAddressCompletedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"address_completed\",\n {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track address added GK event\n */\n private trackAddressAddedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"address_added\",\n {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track PIN code added GK event\n */\n private trackPinCodeAddedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"pin_code_added\",\n {\n pin_code: event.pinCode,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track payment method selected GK event\n */\n private trackPaymentMethodSelectedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"payment_method_selected\",\n {\n payment_method: event.paymentMethod,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track payment completed GK event\n */\n private trackPaymentCompletedGK(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"payment_completed\",\n {\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track order success event\n */\n private trackOrderSuccess(event: any, adapterParams?: TAdapterParams): void {\n this.sendGoKwikEvent(\n \"order_success\",\n {\n order_id: event.orderId,\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track order completed event\n */\n private trackOrderCompleted(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"order_completed\",\n {\n order_id: event.orderId,\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track cart viewed event\n */\n private trackCartViewed(event: any, adapterParams?: TAdapterParams): void {\n this.sendGoKwikEvent(\n \"cart_viewed\",\n {\n cart_id: event.cartId,\n products: event.products,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track checkout started event\n */\n private trackCheckoutStarted(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"checkout_started\",\n {\n cart_value: event.cartValue,\n currency: event.currency,\n item_count: event.itemCount,\n items: event.items,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track checkout completed event\n */\n private trackCheckoutCompleted(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"checkout_completed\",\n {\n order_id: event.orderId,\n cart_value: event.cartValue,\n currency: event.currency,\n item_count: event.itemCount,\n items: event.items,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n\n /**\n * Track add payment info event\n */\n private trackAddPaymentInfo(\n event: any,\n adapterParams?: TAdapterParams\n ): void {\n this.sendGoKwikEvent(\n \"add_payment_info\",\n {\n cart_value: event.cartValue,\n currency: event.currency,\n item_count: event.itemCount,\n payment_type: event.paymentType,\n items: event.items,\n timestamp: event.timestamp || Date.now(),\n },\n adapterParams\n );\n }\n}\n"],"mappings":"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","names":["moengage","DEFAULT_CURRENCY"]}