shopkit-analytics 1.0.0

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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +769 -0
  3. package/dist/adapters/index.d.mts +4 -0
  4. package/dist/adapters/index.d.ts +4 -0
  5. package/dist/adapters/index.js +2405 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/index.mjs +23 -0
  8. package/dist/adapters/index.mjs.map +1 -0
  9. package/dist/affiliate/index.d.mts +138 -0
  10. package/dist/affiliate/index.d.ts +138 -0
  11. package/dist/affiliate/index.js +816 -0
  12. package/dist/affiliate/index.js.map +1 -0
  13. package/dist/affiliate/index.mjs +74 -0
  14. package/dist/affiliate/index.mjs.map +1 -0
  15. package/dist/affiliate-tracker-BgHwibPv.d.mts +144 -0
  16. package/dist/affiliate-tracker-BgHwibPv.d.ts +144 -0
  17. package/dist/chunk-3TQR5DOP.mjs +79 -0
  18. package/dist/chunk-3TQR5DOP.mjs.map +1 -0
  19. package/dist/chunk-4MZH5OLR.mjs +2375 -0
  20. package/dist/chunk-4MZH5OLR.mjs.map +1 -0
  21. package/dist/chunk-JVEGG6JV.mjs +213 -0
  22. package/dist/chunk-JVEGG6JV.mjs.map +1 -0
  23. package/dist/chunk-P4OJDCEZ.mjs +57 -0
  24. package/dist/chunk-P4OJDCEZ.mjs.map +1 -0
  25. package/dist/chunk-TNXTKEGS.mjs +758 -0
  26. package/dist/chunk-TNXTKEGS.mjs.map +1 -0
  27. package/dist/events/index.d.mts +112 -0
  28. package/dist/events/index.d.ts +112 -0
  29. package/dist/events/index.js +2131 -0
  30. package/dist/events/index.js.map +1 -0
  31. package/dist/events/index.mjs +30 -0
  32. package/dist/events/index.mjs.map +1 -0
  33. package/dist/index-BnNRgdUv.d.ts +676 -0
  34. package/dist/index-GODWc1s6.d.mts +676 -0
  35. package/dist/index.d.mts +38 -0
  36. package/dist/index.d.ts +38 -0
  37. package/dist/index.js +3269 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/index.mjs +190 -0
  40. package/dist/index.mjs.map +1 -0
  41. package/dist/subscriber-43gnCKWe.d.ts +80 -0
  42. package/dist/subscriber-IFZJU57V.mjs +8 -0
  43. package/dist/subscriber-IFZJU57V.mjs.map +1 -0
  44. package/dist/subscriber-sWesj_5p.d.mts +80 -0
  45. package/dist/types.d.mts +991 -0
  46. package/dist/types.d.ts +991 -0
  47. package/dist/types.js +102 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/types.mjs +8 -0
  50. package/dist/types.mjs.map +1 -0
  51. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logger/index.ts","../src/adapters/base-adapter.ts","../src/adapters/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":["import pino from \"pino\";\n\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 * 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 * Pino logger wrapper\n */\nclass PinoLogger implements Logger {\n private logger: pino.Logger;\n\n constructor(logger: pino.Logger) {\n this.logger = logger;\n }\n\n trace(message: string, ...args: any[]): void {\n this.logger.trace({ args }, message);\n }\n\n debug(message: string, ...args: any[]): void {\n this.logger.debug({ args }, message);\n }\n\n info(message: string, ...args: any[]): void {\n this.logger.info({ args }, message);\n }\n\n warn(message: string, ...args: any[]): void {\n this.logger.warn({ args }, message);\n }\n\n error(message: string, error?: Error, ...args: any[]): void {\n this.logger.error({ error, args }, message);\n }\n\n fatal(message: string, error?: Error, ...args: any[]): void {\n this.logger.fatal({ error, args }, message);\n }\n\n child(bindings: Record<string, any>): Logger {\n return new PinoLogger(this.logger.child(bindings));\n }\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n const {\n level = \"info\",\n enabled = true,\n name = \"@shopkit/analytics\",\n prettyPrint = false,\n redact = [],\n } = config;\n\n // Return no-op logger if disabled\n if (!enabled) {\n return new NoOpLogger();\n }\n\n // Browser-friendly configuration\n const pinoConfig: pino.LoggerOptions = {\n name,\n level,\n redact,\n browser: {\n asObject: true,\n serialize: true,\n write: {\n trace: (o: any) => console.trace(formatBrowserLog(o)),\n debug: (o: any) => console.debug(formatBrowserLog(o)),\n info: (o: any) => console.info(formatBrowserLog(o)),\n warn: (o: any) => console.warn(formatBrowserLog(o)),\n error: (o: any) => console.error(formatBrowserLog(o)),\n fatal: (o: any) => console.error(formatBrowserLog(o)),\n },\n },\n };\n\n // Add pretty printing for development\n if (prettyPrint && typeof window === \"undefined\") {\n pinoConfig.transport = {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"HH:MM:ss Z\",\n ignore: \"pid,hostname\",\n },\n };\n }\n\n const pinoLogger = pino(pinoConfig);\n return new PinoLogger(pinoLogger);\n}\n\n/**\n * Format log messages for browser console\n */\nfunction formatBrowserLog(logObj: any): string {\n const { level, time, msg, name, args, error, ...rest } = logObj;\n\n let message = `[${name}] ${msg}`;\n\n if (args && args.length > 0) {\n message += ` ${args\n .map((arg: any) =>\n typeof arg === \"object\" ? JSON.stringify(arg) : String(arg)\n )\n .join(\" \")}`;\n }\n\n if (error) {\n message += ` Error: ${error.message}`;\n if (error.stack) {\n message += `\\n${error.stack}`;\n }\n }\n\n if (Object.keys(rest).length > 0) {\n message += ` ${JSON.stringify(rest)}`;\n }\n\n return message;\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","import type { TEvent } from \"../types\";\nimport type { TrackingAdapter } from \"../events/subscriber\";\nimport { createAdapterLogger, type Logger, type LoggerConfig } from \"../logger\";\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 */\n public abstract trackEvent(event: TEvent): Promise<void>;\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 * 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","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 IViewContentEvent,\n type IPurchaseEvent,\n type ISearchEvent,\n type IAddPaymentInfoEvent,\n} from \"../types\";\n\ndeclare global {\n interface Window {\n fbq?: (\n type: string,\n eventName: string,\n params?: Record<string, any>\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\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 }\n\n const pixelId = this.getConfig<string>(\"pixelId\");\n this.logger.info(\"Successfully initialized\", { pixelId: \"***\" });\n this.initialized = true;\n }\n\n /**\n * Track an event with Facebook Pixel\n * @param event The event to track\n */\n public async trackEvent(event: TEvent): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\" || !window.fbq) {\n this.logger.warn(\n \"Cannot track 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 this.logger.debug(\"Tracking event\", { eventType: event.type });\n\n switch (event.type) {\n case EventType.PAGE_VIEW:\n this.trackPageView(event);\n break;\n case EventType.VIEW_CONTENT:\n this.trackViewContent(event);\n break;\n case EventType.PRODUCT_VIEW:\n this.trackProductView(event);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event);\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(event);\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(event);\n break;\n case EventType.PURCHASE:\n this.trackPurchase(event);\n break;\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(event);\n break;\n case EventType.SEARCH:\n this.trackSearch(event);\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 */\n private trackPageView(event: IPageViewEvent): void {\n const params = this.enhanceWithAffiliateParams({});\n window.fbq?.(\"track\", \"PageView\", params);\n this.logger.debug(\"PageView event tracked\", { params });\n }\n\n /**\n * Track a product view event\n * @param event The product view event\n */\n private trackProductView(event: IProductViewEvent): void {\n const params = {\n content_type: \"product_group\",\n content_ids: [event.productId],\n content_name: event.productName,\n content_category: event.category,\n value: event.price,\n currency: event.currency || \"INR\",\n };\n\n window.fbq?.(\n \"track\",\n \"ViewContent\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track an add to cart event\n * @param event The add to cart event\n */\n private trackAddToCart(event: IAddToCartEvent): void {\n const params = {\n content_type: \"product_group\",\n content_ids: [event.productId],\n content_name: event.productName,\n value: event.price,\n currency: event.currency || \"INR\",\n };\n\n const enhancedParams = this.enhanceWithAffiliateParams(params);\n window.fbq?.(\"track\", \"AddToCart\", enhancedParams);\n this.logger.debug(\"AddToCart event tracked\", { params: enhancedParams });\n }\n\n /**\n * Track a checkout started event\n * @param event The checkout started event\n */\n private trackCheckoutStarted(event: ICheckoutStartedEvent): void {\n const params = {\n content_ids: event.items.map((item) => item.productId),\n content_type: \"product_group\",\n value: event.cartValue,\n currency: event.currency || \"INR\",\n num_items: event.itemCount,\n contents: event.items.map((item) => ({\n id: item.productId,\n quantity: item.quantity,\n item_price: item.price,\n })),\n };\n\n window.fbq?.(\n \"track\",\n \"InitiateCheckout\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n */\n private trackCheckoutCompleted(event: ICheckoutCompletedEvent): void {\n const params = {\n value: event.cartValue,\n currency: event.currency || \"INR\",\n content_type: \"product_group\",\n content_ids: event.items.map((item) => item.productId),\n num_items: event.itemCount,\n contents: event.items.map((item) => ({\n id: item.productId,\n quantity: item.quantity,\n item_price: item.price,\n })),\n };\n\n window.fbq?.(\"track\", \"Purchase\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track a search event\n * @param event The search event\n */\n private trackSearch(event: ISearchEvent): void {\n const params = {\n search_string: event.searchTerm,\n content_category: \"product\",\n content_ids: event.content_ids || [],\n };\n\n window.fbq?.(\"track\", \"Search\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track an add payment info event\n * @param event The add payment info event\n */\n private trackAddPaymentInfo(event: IAddPaymentInfoEvent): void {\n const params = {\n value: event.cartValue,\n currency: event.currency || \"INR\",\n content_type: \"product_group\",\n content_ids: event.items.map((item) => item.productId),\n contents: event.items.map((item) => ({\n id: item.productId,\n quantity: item.quantity,\n item_price: item.price,\n })),\n payment_type: event.paymentType || \"\",\n };\n\n window.fbq?.(\n \"track\",\n \"AddPaymentInfo\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a view content event\n * @param event The view content event\n */\n private trackViewContent(event: IViewContentEvent): void {\n const params = {\n content_type: event.content_type || \"product\",\n content_ids: event.content_ids || [],\n content_name: event.content_name || \"\",\n content_category: event.content_category || \"\",\n value: event.value || 0,\n currency: event.currency || \"INR\",\n };\n\n window.fbq?.(\n \"track\",\n \"ViewContent\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a purchase event\n * @param event The purchase event\n */\n private trackPurchase(event: IPurchaseEvent): void {\n const params = {\n value: event.value,\n currency: event.currency || \"INR\",\n content_type: event.content_type || \"product_group\",\n content_ids: event.content_ids || [],\n num_items: event.num_items || 1,\n contents: event.contents || [],\n };\n\n window.fbq?.(\"track\", \"Purchase\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Convert an event to Facebook Pixel 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 return this.enhanceWithAffiliateParams(params);\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} from \"../types\";\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 */\n public async trackEvent(event: TEvent): 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(event as IPageViewEvent, measurementId);\n break;\n case EventType.USER_ENGAGEMENT:\n this.trackUserEngagement();\n break;\n case EventType.SESSION_START:\n this.trackSessionStart();\n break;\n case EventType.FIRST_VISIT:\n this.trackFirstVisit();\n break;\n case EventType.VIEW_ITEM:\n this.trackViewItem(event as IViewItemEvent);\n break;\n case EventType.VIEWED_PRODUCT:\n this.trackViewedProduct(event as IViewedProductEvent);\n break;\n case EventType.CHECKOUT_PAYMENT:\n this.trackCheckoutPayment(event as ICheckoutPaymentEvent);\n break;\n case EventType.SCROLL:\n this.trackScroll();\n break;\n case EventType.ADD_TO_CART:\n case EventType.SHOPIFY_ADD_TO_CART:\n this.trackAddToCart(event as IAddToCartEvent);\n break;\n case EventType.FORM_START:\n this.trackFormStart();\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(event as ICheckoutStartedEvent);\n break;\n case EventType.FORM_SUBMISSION:\n this.trackFormSubmission(event as IFormSubmissionEvent);\n break;\n case EventType.SEARCH:\n this.trackSearch(event as ISearchEvent);\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(event as ICheckoutCompletedEvent);\n break;\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(event as IAddPaymentInfoEvent);\n break;\n case EventType.VIEW_CONTENT:\n this.trackViewContent(event as IViewContentEvent);\n break;\n case EventType.PURCHASE:\n this.trackPurchase(event as IPurchaseEvent);\n break;\n case EventType.VIEW_SEARCH_RESULTS:\n this.trackViewSearchResults(event as IViewSearchResultsEvent);\n break;\n case EventType.ORDER_PLACED:\n this.trackOrderPlaced(event as IOrderPlacedEvent);\n break;\n case EventType.BEGIN_CHECKOUT:\n this.trackBeginCheckout(event as IBeginCheckoutEvent);\n break;\n case EventType.CUSTOM:\n this.trackCustomEvent(event as ICustomEvent);\n break;\n\n default: {\n // For other events, track as custom events\n const params = this.eventToParams(event);\n window.gtag(\n \"event\",\n event.type,\n this.enhanceWithAffiliateParams(params)\n );\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(event: IPageViewEvent, measurementId: string): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"page_view\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n private trackUserEngagement(): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"user_engagement\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n private trackSessionStart(): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"session_start\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n private trackFirstVisit(): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"first_visit\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n private trackViewItem(event: IViewItemEvent): void {\n window.gtag?.(\n \"event\",\n \"view_item\",\n this.enhanceWithAffiliateParams({\n currency: event.currency,\n value: event.value,\n items: event.items,\n })\n );\n }\n\n private trackScroll(): void {\n const params = {\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 window.gtag?.(\"event\", \"scroll\", this.enhanceWithAffiliateParams(params));\n }\n\n private trackCheckoutPayment(event: ICheckoutPaymentEvent): void {\n window.gtag?.(\n \"event\",\n \"checkout_payment\",\n this.enhanceWithAffiliateParams({\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 }\n\n private trackViewedProduct(event: IViewedProductEvent): void {\n window.gtag?.(\n \"event\",\n \"viewed_product\",\n this.enhanceWithAffiliateParams({\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 }\n\n private trackAddToCart(event: IAddToCartEvent): void {\n this.logger.debug(\"Processing add_to_cart event\", { event });\n\n const params = {\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 enhancedParams = this.enhanceWithAffiliateParams(params);\n this.logger.debug(\"Sending add_to_cart event to gtag\", {\n params: enhancedParams,\n });\n\n window.gtag?.(\"event\", \"add_to_cart\", enhancedParams);\n }\n\n private trackFormStart(): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"form_start\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n private trackCheckoutStarted(event: ICheckoutStartedEvent): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"begin_checkout\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n private trackFormSubmission(event: IFormSubmissionEvent): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"form_submit\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n private trackSearch(event: ISearchEvent): void {\n const params = {\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 window.gtag?.(\"event\", \"search\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n */\n private trackCheckoutCompleted(event: ICheckoutCompletedEvent): void {\n const params = {\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 window.gtag?.(\"event\", \"purchase\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track a custom event\n * @param event The custom event\n */\n private trackCustomEvent(event: ICustomEvent): void {\n const params = event.properties || {};\n window.gtag?.(\"event\", event.name, this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track an add payment info event\n * @param event The add payment info event\n */\n private trackAddPaymentInfo(event: IAddPaymentInfoEvent): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"add_payment_info\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a view content event\n * @param event The view content event\n */\n private trackViewContent(event: IViewContentEvent): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"view_item\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a purchase event\n * @param event The purchase event\n */\n private trackPurchase(event: IPurchaseEvent): void {\n const params = {\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 window.gtag?.(\"event\", \"purchase\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track a view search results event\n * @param event The view search results event\n */\n private trackViewSearchResults(event: IViewSearchResultsEvent): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"view_search_results\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track an order placed event\n * @param event The order placed event\n */\n private trackOrderPlaced(event: IOrderPlacedEvent): void {\n const params = {\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 window.gtag?.(\"event\", \"purchase\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track a begin checkout event\n * @param event The begin checkout event\n */\n private trackBeginCheckout(event: IBeginCheckoutEvent): void {\n const params = {\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 window.gtag?.(\n \"event\",\n \"begin_checkout\",\n this.enhanceWithAffiliateParams(params)\n );\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 return this.enhanceWithAffiliateParams(params);\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 // MoEngage events\n ITEM_PURCHASED: \"Item Purchased\",\n UPDATE_CART: \"Update Cart\",\n CUSTOMER_REGISTERED: \"Customer Registered\",\n CUSTOMER_LOGGED_IN: \"Customer Logged In\",\n SHOPIFY_CHECKOUT_UPDATED: \"Shopify - Checkout Updated\",\n SHOPIFY_ABANDONED_CHECKOUT: \"Shopify - Abandoned Checkout\",\n SHOPIFY_ORDER_FULFILLED: \"Shopify - Order Fulfilled\",\n SHOPIFY_CHECKOUT_STARTED: \"Shopify - Checkout Started\",\n SHOPIFY_ADD_TO_CART: \"Shopify - Add To Cart\",\n SHOPIFY_REMOVED_FROM_CART: \"Shopify - Removed From Cart\",\n SHOPIFY_UPDATE_CART: \"Shopify - Update Cart\",\n SPINFORM_RESULT: \"Spinform Result\",\n COUPON_COPIED: \"Coupon Copied\",\n STARTED_CHECKOUT_GK: \"Started Checkout GK\",\n MOBILE_ADDED_GK: \"Mobile Added GK\",\n ADDRESS_SELECTED_GK: \"Address Selected GK\",\n ADDRESS_COMPLETED_GK: \"Address Completed GK\",\n PAYMENT_METHOD_SELECTED_GK: \"Payment Method Selected GK\",\n PAYMENT_COMPLETED_GK: \"Payment Completed GK\",\n ORDER_SUCCESS: \"Order Success\",\n ORDER_COMPLETED: \"Order Completed\",\n PIN_CODE_ADDED_GK: \"PIN Code Added GK\",\n ADDRESS_ADDED_GK: \"Address Added GK\",\n KP_MP_PHONE_NUMBER_LOGGED_IN: \"KP MP Phone Number Logged In\",\n KP_PHONE_NUMBER_LOGGED_IN: \"KP Phone Number Logged In\",\n KP_MP_SHOPIFY_LOGGED_IN: \"KP MP Shopify Logged In\",\n KP_MP_SUCCESSFULLY_LOGGED_OUT: \"KP MP Successfully Logged Out\",\n KP_WHATSAPP_LOGGED_IN: \"KP Whatsapp Logged In\",\n KP_MP_TRUECALLER_LOGGED_IN: \"KP MP Truecaller Logged In\",\n KP_MP_WHATSAPP_LOGGED_IN: \"KP MP Whatsapp Logged In\",\n KP_TRUECALLER_LOGGED_IN: \"KP Truecaller Logged In\",\n KP_SHOPIFY_LOGGED_IN: \"KP Shopify Logged In\",\n KP_SUCCESSFULLY_LOGGED_OUT: \"KP Successfully Logged Out\",\n};\n\n/**\n * Default currency code\n */\nexport const DEFAULT_CURRENCY = \"INR\";\n\nexport const HARDCODED_HANDLE = \"ryze-gums\";\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} from \"../types\";\nimport { EventNames, DEFAULT_CURRENCY } from \"../constants\";\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 private sdk: any = null;\n\n constructor(config: MoengageAdapterConfig) {\n super(config);\n // Initialize logger with proper adapter name\n this.initializeLogger();\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 };\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 // After initialization, the SDK becomes available on window.Moengage\n this.sdk = (window as any).Moengage;\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 */\n public async trackEvent(event: TEvent): Promise<void> {\n if (!this.initialized || typeof window === \"undefined\" || !this.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: !!this.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);\n break;\n case EventType.BUTTON_CLICK:\n this.trackButtonClick(event as IButtonClickEvent);\n break;\n case EventType.FORM_SUBMISSION:\n this.trackFormSubmission(event as IFormSubmissionEvent);\n break;\n case EventType.PRODUCT_VIEW:\n this.trackProductView(event as IProductViewEvent);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event as IAddToCartEvent);\n break;\n case EventType.REMOVE_FROM_CART:\n this.trackRemoveFromCart(event as IRemoveFromCartEvent);\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(event as ICheckoutStartedEvent);\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(event as ICheckoutCompletedEvent);\n break;\n case EventType.SEARCH:\n this.trackSearch(event as ISearchEvent);\n break;\n case EventType.USER_SIGNUP:\n this.trackUserSignup(event as IUserSignupEvent);\n break;\n case EventType.USER_LOGIN:\n this.trackUserLogin(event as IUserLoginEvent);\n break;\n case EventType.CUSTOM:\n this.trackCustomEvent(event as ICustomEvent);\n break;\n default:\n // For other events, track as custom events\n this.sdk.track_event(event.type, this.eventToParams(event));\n break;\n }\n }\n\n /**\n * Track a page view event\n * @param event The page view event\n */\n private trackPageView(event: IPageViewEvent): void {\n if (!this.sdk?.track_event) {\n this.logger.warn(\"track_event not available for PageView event\");\n return;\n }\n\n const eventData = {\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 this.sdk.track_event(EventNames.PAGE_VIEWED, eventData);\n this.logger.debug(\"PageView event tracked\", { eventData });\n }\n\n /**\n * Track a button click event\n * @param event The button click event\n */\n private trackButtonClick(event: IButtonClickEvent): void {\n this.sdk?.track_event(EventNames.BUTTON_CLICKED, {\n button_id: event.buttonId,\n button_text: event.buttonText,\n location: event.location,\n });\n }\n\n /**\n * Track a form submission event\n * @param event The form submission event\n */\n private trackFormSubmission(event: IFormSubmissionEvent): void {\n this.sdk?.track_event(EventNames.FORM_SUBMITTED, {\n form_id: event.formId,\n form_name: event.formName,\n success: event.success,\n });\n }\n\n /**\n * Track a product view event\n * @param event The product view event\n */\n private trackProductView(event: IProductViewEvent): void {\n this.sdk?.track_event(EventNames.PRODUCT_VIEWED, {\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\n /**\n * Track an add to cart event\n * @param event The add to cart event\n */\n private trackAddToCart(event: IAddToCartEvent): void {\n const quantity = event.quantity ?? 1;\n this.sdk?.track_event(EventNames.ADDED_TO_CART, {\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\n /**\n * Track a remove from cart event\n * @param event The remove from cart event\n */\n private trackRemoveFromCart(event: IRemoveFromCartEvent): void {\n this.sdk?.track_event(EventNames.REMOVED_FROM_CART, {\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\n /**\n * Track a checkout started event\n * @param event The checkout started event\n */\n private trackCheckoutStarted(event: ICheckoutStartedEvent): void {\n this.sdk?.track_event(EventNames.CHECKOUT_STARTED, {\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\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n */\n private trackCheckoutCompleted(event: ICheckoutCompletedEvent): void {\n this.sdk?.track_event(EventNames.PURCHASE_COMPLETED, {\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\n /**\n * Track a search event\n * @param event The search event\n */\n private trackSearch(event: ISearchEvent): void {\n this.sdk?.track_event(EventNames.SEARCH, {\n search_term: event.searchTerm,\n results_count: event.resultsCount,\n });\n }\n\n /**\n * Track a user signup event\n * @param event The user signup event\n */\n private trackUserSignup(event: IUserSignupEvent): void {\n this.sdk?.track_event(EventNames.USER_SIGNED_UP, {\n user_id: event.userId,\n method: event.method,\n success: event.success,\n });\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 this.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 */\n private trackUserLogin(event: IUserLoginEvent): void {\n this.sdk?.track_event(EventNames.USER_LOGGED_IN, {\n user_id: event.userId,\n method: event.method,\n success: event.success,\n });\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 this.sdk?.add_unique_user_id(event.userId);\n }\n }\n\n /**\n * Track a custom event\n * @param event The custom event\n */\n private trackCustomEvent(event: ICustomEvent): void {\n this.sdk?.track_event(event.name, event.properties);\n }\n\n /**\n * Convert an event to MoenGage 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 return params;\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 if (!this.initialized || typeof window === \"undefined\" || !this.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 this.sdk?.add_first_name(value as string);\n break;\n case \"lastName\":\n this.sdk?.add_last_name(value as string);\n break;\n case \"email\":\n this.sdk?.add_email(value as string);\n break;\n case \"mobile\":\n this.sdk?.add_mobile(value as string);\n break;\n case \"username\":\n this.sdk?.add_user_name(value as string);\n break;\n case \"gender\":\n this.sdk?.add_gender(value as string);\n break;\n case \"birthday\":\n this.sdk?.add_birthday(value as Date);\n break;\n case \"userId\":\n this.sdk?.add_unique_user_id(value as string);\n break;\n default:\n this.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} from \"../types\";\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 */\n public async trackEvent(event: TEvent): 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);\n break;\n case EventType.PRODUCT_VIEW:\n this.trackProductView(event);\n break;\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event);\n break;\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(event);\n break;\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(event);\n break;\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(event);\n break;\n case EventType.SEARCH:\n this.trackSearch(event);\n break;\n default:\n // For other events, track as custom events\n const params = this.eventToParams(event);\n window.posthog?.capture(\n event.type,\n this.enhanceWithAffiliateParams(params)\n );\n break;\n }\n }\n\n /**\n * Track a page view event\n * @param event The page view event\n */\n private trackPageView(event: IPageViewEvent): void {\n const params = {\n path: event.path,\n title: event.title,\n referrer: event.referrer,\n };\n\n window.posthog?.capture(\n \"$pageview\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a product view event\n * @param event The product view event\n */\n private trackProductView(event: IProductViewEvent): void {\n const params = {\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 window.posthog?.capture(\n \"product_viewed\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track an add to cart event\n * @param event The add to cart event\n */\n private trackAddToCart(event: IAddToCartEvent): void {\n this.logger.debug(\"Handling ADD_TO_CART event\", { event });\n\n const params = {\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 this.logger.debug(\"Sending to PostHog with params\", { params });\n\n if (!window.posthog) {\n this.logger.error(\"window.posthog is not available\");\n return;\n }\n\n window.posthog.capture(\n \"add_to_cart\",\n this.enhanceWithAffiliateParams(params)\n );\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 */\n private trackCheckoutStarted(event: ICheckoutStartedEvent): void {\n const params = {\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 window.posthog?.capture(\n \"checkout_started\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a checkout completed event\n * @param event The checkout completed event\n */\n private trackCheckoutCompleted(event: ICheckoutCompletedEvent): void {\n const params = {\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 window.posthog?.capture(\n \"purchase\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Track a search event\n * @param event The search event\n */\n private trackSearch(event: ISearchEvent): void {\n const params = {\n search_term: event.searchTerm,\n results_count: event.resultsCount,\n content_ids: event.content_ids,\n };\n\n window.posthog?.capture(\"search\", this.enhanceWithAffiliateParams(params));\n }\n\n /**\n * Track an add payment info event\n * @param event The add payment info event\n */\n private trackAddPaymentInfo(event: IAddPaymentInfoEvent): void {\n const params = {\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 window.posthog?.capture(\n \"add_payment_info\",\n this.enhanceWithAffiliateParams(params)\n );\n }\n\n /**\n * Convert an event to PostHog 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 return params;\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\";\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.domain,\n shopifySalesChannel: ShopifySalesChannel.headless,\n shopId: `gid://shopify/Shop/${this.shopId}`,\n currency: this.currency,\n acceptedLanguage: DEFAULT_LANGUAGE,\n ...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(event: TEvent): 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 this.logger.debug(\"Processing Shopify Analytics event\", {\n eventType: event.type,\n eventData: event,\n });\n\n try {\n switch (event.type) {\n case EventType.PAGE_VIEW:\n this.sendPageView(AnalyticsEventName.PAGE_VIEW);\n this.logger.debug(\"Sent PAGE_VIEW event to Shopify Analytics\");\n break;\n\n case EventType.VIEW_CONTENT:\n this.sendPageView(AnalyticsEventName.PRODUCT_VIEW);\n this.logger.debug(\"Sent PRODUCT_VIEW event to Shopify Analytics\");\n break;\n\n case EventType.ADD_TO_CART:\n this.trackAddToCart(event);\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 this.sendPageView(AnalyticsEventName.PAGE_VIEW, {\n pageType: \"checkout\",\n });\n this.logger.debug(\n \"Sent checkout PAGE_VIEW event to Shopify Analytics\"\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\";\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 */\n public async trackEvent(event: TEvent): 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 try {\n this.logger.debug(\"Processing event\", { eventType: event.type });\n\n // Enhanced event data with affiliate parameters\n const enhancedEvent = this.enhanceWithAffiliateParams(event);\n\n switch (event.type) {\n case EventType.PRODUCT_VIEW:\n this.trackProductView(enhancedEvent);\n break;\n\n case EventType.COLLECTION_VIEW:\n this.trackCollectionView(enhancedEvent);\n break;\n\n case EventType.PAGE_VIEW:\n this.trackPageView(enhancedEvent);\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(type: string, eventData: any): void {\n this.logger.debug(`Sending ${type}`, { eventData });\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,\n detail: eventData,\n },\n });\n window.dispatchEvent(customEvent);\n this.logger.debug(`${type} sent successfully`);\n }\n }\n\n /**\n * Track product view event\n */\n private trackCollectionView(event: any): void {\n this.sendKwikPassEvent(\"collection\", {\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 }\n\n /**\n * Track collection view event\n */\n private trackProductView(event: any): void {\n this.sendKwikPassEvent(\"product\", {\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 }\n\n /**\n * Track page view event\n */\n private trackPageView(event: any): void {\n this.sendKwikPassEvent(\"other\", {\n path: event.path,\n title: event.title,\n referrer: event.referrer,\n timestamp: event.timestamp || Date.now(),\n });\n }\n}\n","import { BaseAdapter } from \"./base-adapter\";\nimport type { TEvent } from \"../types\";\nimport { EventType } from \"../types\";\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 */\n public async trackEvent(event: TEvent): 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 parameters\n const enhancedEvent = this.enhanceWithAffiliateParams(event);\n\n switch (event.type) {\n case EventType.STARTED_CHECKOUT_GK:\n this.trackStartedCheckoutGK(enhancedEvent);\n break;\n\n case EventType.MOBILE_ADDED_GK:\n this.trackMobileAddedGK(enhancedEvent);\n break;\n\n case EventType.ADDRESS_SELECTED_GK:\n this.trackAddressSelectedGK(enhancedEvent);\n break;\n\n case EventType.ADDRESS_COMPLETED_GK:\n this.trackAddressCompletedGK(enhancedEvent);\n break;\n\n case EventType.ADDRESS_ADDED_GK:\n this.trackAddressAddedGK(enhancedEvent);\n break;\n\n case EventType.PIN_CODE_ADDED_GK:\n this.trackPinCodeAddedGK(enhancedEvent);\n break;\n\n case EventType.PAYMENT_METHOD_SELECTED_GK:\n this.trackPaymentMethodSelectedGK(enhancedEvent);\n break;\n\n case EventType.PAYMENT_COMPLETED_GK:\n this.trackPaymentCompletedGK(enhancedEvent);\n break;\n\n case EventType.ORDER_SUCCESS:\n this.trackOrderSuccess(enhancedEvent);\n break;\n\n case EventType.ORDER_COMPLETED:\n this.trackOrderCompleted(enhancedEvent);\n break;\n\n case EventType.CART_VIEWED:\n this.trackCartViewed(enhancedEvent);\n break;\n\n case EventType.CHECKOUT_STARTED:\n this.trackCheckoutStarted(enhancedEvent);\n break;\n\n case EventType.CHECKOUT_COMPLETED:\n this.trackCheckoutCompleted(enhancedEvent);\n break;\n\n case EventType.ADD_PAYMENT_INFO:\n this.trackAddPaymentInfo(enhancedEvent);\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(eventName: string, eventData: any): void {\n this.logger.debug(`Sending ${eventName}`, { eventData });\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?.(eventName, eventData);\n this.logger.debug(`${eventName} sent via SDK successfully`);\n } catch (error) {\n this.logger.error(\n `Error sending GoKwik event ${eventName} 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_${eventName}`, {\n detail: eventData,\n });\n window.dispatchEvent(customEvent);\n this.logger.debug(`${eventName} sent via custom event successfully`);\n }\n }\n }\n\n /**\n * Track started checkout GK event\n */\n private trackStartedCheckoutGK(event: any): void {\n this.sendGoKwikEvent(\"started_checkout\", {\n cart_value: event.cartValue,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track mobile added GK event\n */\n private trackMobileAddedGK(event: any): void {\n this.sendGoKwikEvent(\"mobile_added\", {\n mobile: event.mobile,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track address selected GK event\n */\n private trackAddressSelectedGK(event: any): void {\n this.sendGoKwikEvent(\"address_selected\", {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track address completed GK event\n */\n private trackAddressCompletedGK(event: any): void {\n this.sendGoKwikEvent(\"address_completed\", {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track address added GK event\n */\n private trackAddressAddedGK(event: any): void {\n this.sendGoKwikEvent(\"address_added\", {\n address_id: event.addressId,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track PIN code added GK event\n */\n private trackPinCodeAddedGK(event: any): void {\n this.sendGoKwikEvent(\"pin_code_added\", {\n pin_code: event.pinCode,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track payment method selected GK event\n */\n private trackPaymentMethodSelectedGK(event: any): void {\n this.sendGoKwikEvent(\"payment_method_selected\", {\n payment_method: event.paymentMethod,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track payment completed GK event\n */\n private trackPaymentCompletedGK(event: any): void {\n this.sendGoKwikEvent(\"payment_completed\", {\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track order success event\n */\n private trackOrderSuccess(event: any): void {\n this.sendGoKwikEvent(\"order_success\", {\n order_id: event.orderId,\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track order completed event\n */\n private trackOrderCompleted(event: any): void {\n this.sendGoKwikEvent(\"order_completed\", {\n order_id: event.orderId,\n amount: event.amount,\n currency: event.currency,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track cart viewed event\n */\n private trackCartViewed(event: any): void {\n this.sendGoKwikEvent(\"cart_viewed\", {\n cart_id: event.cartId,\n products: event.products,\n timestamp: event.timestamp || Date.now(),\n });\n }\n\n /**\n * Track checkout started event\n */\n private trackCheckoutStarted(event: any): void {\n this.sendGoKwikEvent(\"checkout_started\", {\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 }\n\n /**\n * Track checkout completed event\n */\n private trackCheckoutCompleted(event: any): void {\n this.sendGoKwikEvent(\"checkout_completed\", {\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 }\n\n /**\n * Track add payment info event\n */\n private trackAddPaymentInfo(event: any): void {\n this.sendGoKwikEvent(\"add_payment_info\", {\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 }\n}\n"],"mappings":"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","names":["logger","DEFAULT_CURRENCY"]}
@@ -0,0 +1,213 @@
1
+ "use client";
2
+
3
+ // src/events/publisher.ts
4
+ var EventPublisher = class _EventPublisher {
5
+ /**
6
+ * Private constructor to enforce singleton pattern
7
+ */
8
+ constructor() {
9
+ this.subscribers = [];
10
+ }
11
+ /**
12
+ * Get the singleton instance of EventPublisher
13
+ */
14
+ static getInstance() {
15
+ if (!_EventPublisher.instance) {
16
+ _EventPublisher.instance = new _EventPublisher();
17
+ }
18
+ return _EventPublisher.instance;
19
+ }
20
+ /**
21
+ * Subscribe to events
22
+ * @param callback Function to be called when an event is published
23
+ * @returns Unsubscribe function
24
+ */
25
+ subscribe(callback) {
26
+ this.subscribers.push(callback);
27
+ return () => {
28
+ this.subscribers = this.subscribers.filter(
29
+ (subscriber) => subscriber !== callback
30
+ );
31
+ };
32
+ }
33
+ /**
34
+ * Publish an event to all subscribers
35
+ * @param event The event to publish
36
+ */
37
+ publish(event) {
38
+ try {
39
+ console.log("EventPublisher: Received event", {
40
+ type: event.type,
41
+ data: event
42
+ });
43
+ const eventWithTimestamp = !event.timestamp ? { ...event, timestamp: Date.now() } : event;
44
+ console.log("EventPublisher: Number of subscribers:", this.subscribers.length);
45
+ for (const subscriber of this.subscribers) {
46
+ try {
47
+ console.log("EventPublisher: Notifying subscriber");
48
+ subscriber(eventWithTimestamp);
49
+ console.log("EventPublisher: Subscriber notified successfully");
50
+ } catch (error) {
51
+ console.error("EventPublisher: Error in subscriber:", error);
52
+ }
53
+ }
54
+ console.log("EventPublisher: Event processing completed");
55
+ } catch (error) {
56
+ console.error("Error publishing event:", error, event);
57
+ }
58
+ }
59
+ };
60
+ var eventPublisher = EventPublisher.getInstance();
61
+ function publishEvent(event) {
62
+ try {
63
+ eventPublisher.publish(event);
64
+ } catch (error) {
65
+ console.error("Error in publishEvent helper:", error);
66
+ }
67
+ }
68
+
69
+ // src/events/subscriber.ts
70
+ var EventSubscriber = class _EventSubscriber {
71
+ /**
72
+ * Private constructor to enforce singleton pattern
73
+ */
74
+ constructor() {
75
+ this.adapters = [];
76
+ this.initialized = false;
77
+ this.eventQueue = [];
78
+ this.unsubscribe = null;
79
+ }
80
+ /**
81
+ * Get the singleton instance of EventSubscriber
82
+ */
83
+ static getInstance() {
84
+ if (!_EventSubscriber.instance) {
85
+ _EventSubscriber.instance = new _EventSubscriber();
86
+ }
87
+ return _EventSubscriber.instance;
88
+ }
89
+ /**
90
+ * Register a tracking adapter
91
+ * @param adapter The tracking adapter to register
92
+ */
93
+ registerAdapter(adapter) {
94
+ const existingAdapter = this.adapters.find((a) => a.name === adapter.name);
95
+ if (existingAdapter) {
96
+ console.warn(
97
+ `Tracking adapter with name "${adapter.name}" is already registered. Skipping.`
98
+ );
99
+ return;
100
+ }
101
+ this.adapters.push(adapter);
102
+ if (this.initialized) {
103
+ this.initializeAdapter(adapter).catch((error) => {
104
+ console.error(`Failed to initialize adapter "${adapter.name}":`, error);
105
+ });
106
+ }
107
+ }
108
+ /**
109
+ * Unregister a tracking adapter by name
110
+ * @param adapterName The name of the adapter to unregister
111
+ */
112
+ unregisterAdapter(adapterName) {
113
+ this.adapters = this.adapters.filter(
114
+ (adapter) => adapter.name !== adapterName
115
+ );
116
+ }
117
+ /**
118
+ * Initialize all registered adapters
119
+ */
120
+ async initialize() {
121
+ console.log("Initializing EventSubscriber...");
122
+ if (this.initialized) {
123
+ console.log("EventSubscriber already initialized");
124
+ return;
125
+ }
126
+ this.unsubscribe = eventPublisher.subscribe(this.handleEvent.bind(this));
127
+ console.log("Subscribed to event publisher");
128
+ console.log(`Initializing ${this.adapters.length} adapters...`);
129
+ await Promise.all(
130
+ this.adapters.map((adapter) => this.initializeAdapter(adapter))
131
+ );
132
+ this.initialized = true;
133
+ console.log("EventSubscriber initialization complete");
134
+ this.processEventQueue();
135
+ }
136
+ /**
137
+ * Initialize a single adapter
138
+ * @param adapter The adapter to initialize
139
+ */
140
+ async initializeAdapter(adapter) {
141
+ try {
142
+ await adapter.initialize();
143
+ console.log(
144
+ `Tracking adapter "${adapter.name}" initialized successfully.`
145
+ );
146
+ } catch (error) {
147
+ console.error(`Failed to initialize adapter "${adapter.name}":`, error);
148
+ }
149
+ }
150
+ /**
151
+ * Handle an event by forwarding it to all enabled adapters
152
+ * @param event The event to handle
153
+ */
154
+ handleEvent(event) {
155
+ console.log("Handling event:", event.type);
156
+ if (!this.initialized) {
157
+ console.log("Subscriber not initialized, queueing event");
158
+ this.eventQueue.push(event);
159
+ return;
160
+ }
161
+ for (const adapter of this.adapters) {
162
+ if (adapter.isEnabled()) {
163
+ console.log(`Forwarding event to adapter: ${adapter.name}`);
164
+ adapter.trackEvent(event).catch((error) => {
165
+ console.error(
166
+ `Error tracking event in adapter "${adapter.name}":`,
167
+ error
168
+ );
169
+ });
170
+ } else {
171
+ console.log(`Adapter ${adapter.name} is disabled, skipping`);
172
+ }
173
+ }
174
+ }
175
+ /**
176
+ * Process any events that were queued before initialization
177
+ */
178
+ processEventQueue() {
179
+ if (this.eventQueue.length === 0) {
180
+ return;
181
+ }
182
+ console.log(`Processing ${this.eventQueue.length} queued events.`);
183
+ for (const event of this.eventQueue) {
184
+ this.handleEvent(event);
185
+ }
186
+ this.eventQueue = [];
187
+ }
188
+ /**
189
+ * Shutdown the subscriber and all adapters
190
+ */
191
+ shutdown() {
192
+ if (this.unsubscribe) {
193
+ this.unsubscribe();
194
+ this.unsubscribe = null;
195
+ }
196
+ this.initialized = false;
197
+ this.eventQueue = [];
198
+ }
199
+ /**
200
+ * Get all registered adapters
201
+ */
202
+ getAdapters() {
203
+ return [...this.adapters];
204
+ }
205
+ };
206
+ var eventSubscriber = EventSubscriber.getInstance();
207
+
208
+ export {
209
+ eventPublisher,
210
+ publishEvent,
211
+ eventSubscriber
212
+ };
213
+ //# sourceMappingURL=chunk-JVEGG6JV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/events/publisher.ts","../src/events/subscriber.ts"],"sourcesContent":["import type { TEvent } from \"../types\";\n\n/**\n * EventPublisher class responsible for publishing events to subscribers\n */\nclass EventPublisher {\n private static instance: EventPublisher;\n private subscribers: Array<(event: TEvent) => void> = [];\n\n /**\n * Private constructor to enforce singleton pattern\n */\n private constructor() {}\n\n /**\n * Get the singleton instance of EventPublisher\n */\n public static getInstance(): EventPublisher {\n if (!EventPublisher.instance) {\n EventPublisher.instance = new EventPublisher();\n }\n return EventPublisher.instance;\n }\n\n /**\n * Subscribe to events\n * @param callback Function to be called when an event is published\n * @returns Unsubscribe function\n */\n public subscribe(callback: (event: TEvent) => void): () => void {\n this.subscribers.push(callback);\n\n // Return unsubscribe function\n return () => {\n this.subscribers = this.subscribers.filter(\n (subscriber) => subscriber !== callback,\n );\n };\n }\n\n /**\n * Publish an event to all subscribers\n * @param event The event to publish\n */\n public publish(event: TEvent): void {\n try {\n console.log(\"EventPublisher: Received event\", {\n type: event.type,\n data: event\n });\n\n // Add timestamp if not already present\n const eventWithTimestamp = !event.timestamp\n ? { ...event, timestamp: Date.now() }\n : event;\n\n console.log(\"EventPublisher: Number of subscribers:\", this.subscribers.length);\n\n // Notify all subscribers\n for (const subscriber of this.subscribers) {\n try {\n console.log(\"EventPublisher: Notifying subscriber\");\n subscriber(eventWithTimestamp);\n console.log(\"EventPublisher: Subscriber notified successfully\");\n } catch (error) {\n console.error(\"EventPublisher: Error in subscriber:\", error);\n // Continue with other subscribers even if one fails\n }\n }\n\n console.log(\"EventPublisher: Event processing completed\");\n } catch (error) {\n console.error(\"Error publishing event:\", error, event);\n // Silently fail to prevent app crashes due to event publishing issues\n }\n }\n}\n\n// Export singleton instance\nexport const eventPublisher = EventPublisher.getInstance();\n\n/**\n * Helper function to publish events\n * @param event The event to publish\n */\nexport function publishEvent(event: TEvent): void {\n try {\n eventPublisher.publish(event);\n } catch (error) {\n console.error(\"Error in publishEvent helper:\", error);\n // Silently fail to prevent app crashes due to event publishing issues\n }\n}\n","import type { TEvent } from \"../types\";\nimport { eventPublisher } from \"./publisher\";\n\n/**\n * Interface for tracking adapters\n */\nexport interface TrackingAdapter {\n /**\n * Name of the tracking adapter\n */\n name: string;\n\n /**\n * Whether the adapter is enabled\n */\n isEnabled: () => boolean;\n\n /**\n * Initialize the adapter\n */\n initialize: () => Promise<void>;\n\n /**\n * Track an event\n */\n trackEvent: (event: TEvent) => Promise<void>;\n}\n\n/**\n * EventSubscriber class responsible for managing tracking adapters and forwarding events\n */\nclass EventSubscriber {\n private static instance: EventSubscriber;\n private adapters: TrackingAdapter[] = [];\n private initialized = false;\n private eventQueue: TEvent[] = [];\n private unsubscribe: (() => void) | null = null;\n\n /**\n * Private constructor to enforce singleton pattern\n */\n private constructor() {}\n\n /**\n * Get the singleton instance of EventSubscriber\n */\n public static getInstance(): EventSubscriber {\n if (!EventSubscriber.instance) {\n EventSubscriber.instance = new EventSubscriber();\n }\n return EventSubscriber.instance;\n }\n\n /**\n * Register a tracking adapter\n * @param adapter The tracking adapter to register\n */\n public registerAdapter(adapter: TrackingAdapter): void {\n // Check if adapter with the same name already exists\n const existingAdapter = this.adapters.find((a) => a.name === adapter.name);\n if (existingAdapter) {\n console.warn(\n `Tracking adapter with name \"${adapter.name}\" is already registered. Skipping.`,\n );\n return;\n }\n\n this.adapters.push(adapter);\n\n // If already initialized, initialize the new adapter\n if (this.initialized) {\n this.initializeAdapter(adapter).catch((error) => {\n console.error(`Failed to initialize adapter \"${adapter.name}\":`, error);\n });\n }\n }\n\n /**\n * Unregister a tracking adapter by name\n * @param adapterName The name of the adapter to unregister\n */\n public unregisterAdapter(adapterName: string): void {\n this.adapters = this.adapters.filter(\n (adapter) => adapter.name !== adapterName,\n );\n }\n\n /**\n * Initialize all registered adapters\n */\n public async initialize(): Promise<void> {\n console.log(\"Initializing EventSubscriber...\");\n \n if (this.initialized) {\n console.log(\"EventSubscriber already initialized\");\n return;\n }\n\n // Subscribe to events\n this.unsubscribe = eventPublisher.subscribe(this.handleEvent.bind(this));\n console.log(\"Subscribed to event publisher\");\n\n // Initialize all adapters\n console.log(`Initializing ${this.adapters.length} adapters...`);\n await Promise.all(\n this.adapters.map((adapter) => this.initializeAdapter(adapter)),\n );\n\n this.initialized = true;\n console.log(\"EventSubscriber initialization complete\");\n\n // Process any queued events\n this.processEventQueue();\n }\n\n /**\n * Initialize a single adapter\n * @param adapter The adapter to initialize\n */\n private async initializeAdapter(adapter: TrackingAdapter): Promise<void> {\n try {\n await adapter.initialize();\n console.log(\n `Tracking adapter \"${adapter.name}\" initialized successfully.`,\n );\n } catch (error) {\n console.error(`Failed to initialize adapter \"${adapter.name}\":`, error);\n }\n }\n\n /**\n * Handle an event by forwarding it to all enabled adapters\n * @param event The event to handle\n */\n private handleEvent(event: TEvent): void {\n console.log(\"Handling event:\", event.type);\n \n if (!this.initialized) {\n console.log(\"Subscriber not initialized, queueing event\");\n this.eventQueue.push(event);\n return;\n }\n\n // Forward the event to all enabled adapters\n for (const adapter of this.adapters) {\n if (adapter.isEnabled()) {\n console.log(`Forwarding event to adapter: ${adapter.name}`);\n adapter.trackEvent(event).catch((error) => {\n console.error(\n `Error tracking event in adapter \"${adapter.name}\":`,\n error,\n );\n });\n } else {\n console.log(`Adapter ${adapter.name} is disabled, skipping`);\n }\n }\n }\n\n /**\n * Process any events that were queued before initialization\n */\n private processEventQueue(): void {\n if (this.eventQueue.length === 0) {\n return;\n }\n\n console.log(`Processing ${this.eventQueue.length} queued events.`);\n\n // Process each queued event\n for (const event of this.eventQueue) {\n this.handleEvent(event);\n }\n\n // Clear the queue\n this.eventQueue = [];\n }\n\n /**\n * Shutdown the subscriber and all adapters\n */\n public shutdown(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n this.initialized = false;\n this.eventQueue = [];\n }\n\n /**\n * Get all registered adapters\n */\n public getAdapters(): TrackingAdapter[] {\n return [...this.adapters];\n }\n}\n\n// Export singleton instance\nexport const eventSubscriber = EventSubscriber.getInstance();\n"],"mappings":";;;AAKA,IAAM,iBAAN,MAAM,gBAAe;AAAA;AAAA;AAAA;AAAA,EAOX,cAAc;AALtB,SAAQ,cAA8C,CAAC;AAAA,EAKhC;AAAA;AAAA;AAAA;AAAA,EAKvB,OAAc,cAA8B;AAC1C,QAAI,CAAC,gBAAe,UAAU;AAC5B,sBAAe,WAAW,IAAI,gBAAe;AAAA,IAC/C;AACA,WAAO,gBAAe;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,UAAU,UAA+C;AAC9D,SAAK,YAAY,KAAK,QAAQ;AAG9B,WAAO,MAAM;AACX,WAAK,cAAc,KAAK,YAAY;AAAA,QAClC,CAAC,eAAe,eAAe;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QAAQ,OAAqB;AAClC,QAAI;AACF,cAAQ,IAAI,kCAAkC;AAAA,QAC5C,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,MACR,CAAC;AAGD,YAAM,qBAAqB,CAAC,MAAM,YAC9B,EAAE,GAAG,OAAO,WAAW,KAAK,IAAI,EAAE,IAClC;AAEJ,cAAQ,IAAI,0CAA0C,KAAK,YAAY,MAAM;AAG7E,iBAAW,cAAc,KAAK,aAAa;AACzC,YAAI;AACF,kBAAQ,IAAI,sCAAsC;AAClD,qBAAW,kBAAkB;AAC7B,kBAAQ,IAAI,kDAAkD;AAAA,QAChE,SAAS,OAAO;AACd,kBAAQ,MAAM,wCAAwC,KAAK;AAAA,QAE7D;AAAA,MACF;AAEA,cAAQ,IAAI,4CAA4C;AAAA,IAC1D,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,OAAO,KAAK;AAAA,IAEvD;AAAA,EACF;AACF;AAGO,IAAM,iBAAiB,eAAe,YAAY;AAMlD,SAAS,aAAa,OAAqB;AAChD,MAAI;AACF,mBAAe,QAAQ,KAAK;AAAA,EAC9B,SAAS,OAAO;AACd,YAAQ,MAAM,iCAAiC,KAAK;AAAA,EAEtD;AACF;;;AC7DA,IAAM,kBAAN,MAAM,iBAAgB;AAAA;AAAA;AAAA;AAAA,EAUZ,cAAc;AARtB,SAAQ,WAA8B,CAAC;AACvC,SAAQ,cAAc;AACtB,SAAQ,aAAuB,CAAC;AAChC,SAAQ,cAAmC;AAAA,EAKpB;AAAA;AAAA;AAAA;AAAA,EAKvB,OAAc,cAA+B;AAC3C,QAAI,CAAC,iBAAgB,UAAU;AAC7B,uBAAgB,WAAW,IAAI,iBAAgB;AAAA,IACjD;AACA,WAAO,iBAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,gBAAgB,SAAgC;AAErD,UAAM,kBAAkB,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,IAAI;AACzE,QAAI,iBAAiB;AACnB,cAAQ;AAAA,QACN,+BAA+B,QAAQ,IAAI;AAAA,MAC7C;AACA;AAAA,IACF;AAEA,SAAK,SAAS,KAAK,OAAO;AAG1B,QAAI,KAAK,aAAa;AACpB,WAAK,kBAAkB,OAAO,EAAE,MAAM,CAAC,UAAU;AAC/C,gBAAQ,MAAM,iCAAiC,QAAQ,IAAI,MAAM,KAAK;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,kBAAkB,aAA2B;AAClD,SAAK,WAAW,KAAK,SAAS;AAAA,MAC5B,CAAC,YAAY,QAAQ,SAAS;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,aAA4B;AACvC,YAAQ,IAAI,iCAAiC;AAE7C,QAAI,KAAK,aAAa;AACpB,cAAQ,IAAI,qCAAqC;AACjD;AAAA,IACF;AAGA,SAAK,cAAc,eAAe,UAAU,KAAK,YAAY,KAAK,IAAI,CAAC;AACvE,YAAQ,IAAI,+BAA+B;AAG3C,YAAQ,IAAI,gBAAgB,KAAK,SAAS,MAAM,cAAc;AAC9D,UAAM,QAAQ;AAAA,MACZ,KAAK,SAAS,IAAI,CAAC,YAAY,KAAK,kBAAkB,OAAO,CAAC;AAAA,IAChE;AAEA,SAAK,cAAc;AACnB,YAAQ,IAAI,yCAAyC;AAGrD,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kBAAkB,SAAyC;AACvE,QAAI;AACF,YAAM,QAAQ,WAAW;AACzB,cAAQ;AAAA,QACN,qBAAqB,QAAQ,IAAI;AAAA,MACnC;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,QAAQ,IAAI,MAAM,KAAK;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,OAAqB;AACvC,YAAQ,IAAI,mBAAmB,MAAM,IAAI;AAEzC,QAAI,CAAC,KAAK,aAAa;AACrB,cAAQ,IAAI,4CAA4C;AACxD,WAAK,WAAW,KAAK,KAAK;AAC1B;AAAA,IACF;AAGA,eAAW,WAAW,KAAK,UAAU;AACnC,UAAI,QAAQ,UAAU,GAAG;AACvB,gBAAQ,IAAI,gCAAgC,QAAQ,IAAI,EAAE;AAC1D,gBAAQ,WAAW,KAAK,EAAE,MAAM,CAAC,UAAU;AACzC,kBAAQ;AAAA,YACN,oCAAoC,QAAQ,IAAI;AAAA,YAChD;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,IAAI,WAAW,QAAQ,IAAI,wBAAwB;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AAChC,QAAI,KAAK,WAAW,WAAW,GAAG;AAChC;AAAA,IACF;AAEA,YAAQ,IAAI,cAAc,KAAK,WAAW,MAAM,iBAAiB;AAGjE,eAAW,SAAS,KAAK,YAAY;AACnC,WAAK,YAAY,KAAK;AAAA,IACxB;AAGA,SAAK,aAAa,CAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKO,WAAiB;AACtB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY;AACjB,WAAK,cAAc;AAAA,IACrB;AAEA,SAAK,cAAc;AACnB,SAAK,aAAa,CAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKO,cAAiC;AACtC,WAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,EAC1B;AACF;AAGO,IAAM,kBAAkB,gBAAgB,YAAY;","names":[]}
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import {
3
+ GoogleAdapter,
4
+ MoengageAdapter,
5
+ PixelAdapter,
6
+ PostHogAdapter
7
+ } from "./chunk-4MZH5OLR.mjs";
8
+
9
+ // src/events/init.ts
10
+ async function initializeEventTracking(adapters) {
11
+ const { eventSubscriber: eventSubscriber2 } = await import("./subscriber-IFZJU57V.mjs");
12
+ for (const adapter of adapters) {
13
+ eventSubscriber2.registerAdapter(adapter);
14
+ }
15
+ await eventSubscriber2.initialize();
16
+ }
17
+ async function initTracking(config) {
18
+ console.log("Initializing event tracking system...");
19
+ const adapters = [];
20
+ if (config.pixelId) {
21
+ const pixelAdapter = new PixelAdapter({
22
+ pixelId: config.pixelId
23
+ });
24
+ adapters.push(pixelAdapter);
25
+ }
26
+ if (config.gaId) {
27
+ const gaAdapter = new GoogleAdapter({
28
+ measurementId: config.gaId
29
+ });
30
+ adapters.push(gaAdapter);
31
+ }
32
+ if (config.moengageAppId) {
33
+ const moengageAdapter = new MoengageAdapter({
34
+ appId: config.moengageAppId,
35
+ enableUserIdentification: true,
36
+ region: config.moengageRegion || "dc_01",
37
+ debug: config.enableDebugLogs || false
38
+ });
39
+ adapters.push(moengageAdapter);
40
+ }
41
+ const posthogAdapter = new PostHogAdapter({
42
+ enableDebugLogs: config.enableDebugLogs || false
43
+ });
44
+ adapters.push(posthogAdapter);
45
+ console.log(
46
+ "Configured adapters:",
47
+ adapters.map((a) => a.name)
48
+ );
49
+ await initializeEventTracking(adapters);
50
+ console.log("Event tracking system initialized successfully");
51
+ }
52
+
53
+ export {
54
+ initializeEventTracking,
55
+ initTracking
56
+ };
57
+ //# sourceMappingURL=chunk-P4OJDCEZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/events/init.ts"],"sourcesContent":["import {\n PixelAdapter,\n GoogleAdapter,\n MoengageAdapter,\n PostHogAdapter,\n} from \"../adapters\";\n\n/**\n * Initialize the event tracking system with the provided adapters\n * @param adapters Array of tracking adapters to register\n */\nexport async function initializeEventTracking(\n adapters: import(\"./subscriber\").TrackingAdapter[]\n): Promise<void> {\n // Import the subscriber\n const { eventSubscriber } = await import(\"./subscriber\");\n\n // Register each adapter using for...of instead of forEach\n for (const adapter of adapters) {\n eventSubscriber.registerAdapter(adapter);\n }\n\n // Initialize the subscriber\n await eventSubscriber.initialize();\n}\n\n/**\n * Example initialization function with common adapters\n * This is a convenience function that shows how to set up common tracking adapters\n * Users can customize this based on their needs\n */\nexport async function initTracking(config: {\n pixelId?: string;\n gaId?: string;\n moengageAppId?: string;\n moengageRegion?: string;\n enableDebugLogs?: boolean;\n}) {\n console.log(\"Initializing event tracking system...\");\n\n const adapters = [];\n\n // Facebook Pixel\n if (config.pixelId) {\n const pixelAdapter = new PixelAdapter({\n pixelId: config.pixelId,\n });\n adapters.push(pixelAdapter);\n }\n\n // Google Analytics\n if (config.gaId) {\n const gaAdapter = new GoogleAdapter({\n measurementId: config.gaId,\n });\n adapters.push(gaAdapter);\n }\n\n // MoEngage\n if (config.moengageAppId) {\n const moengageAdapter = new MoengageAdapter({\n appId: config.moengageAppId,\n enableUserIdentification: true,\n region: config.moengageRegion || \"dc_01\",\n debug: config.enableDebugLogs || false,\n });\n adapters.push(moengageAdapter);\n }\n\n // PostHog\n const posthogAdapter = new PostHogAdapter({\n enableDebugLogs: config.enableDebugLogs || false,\n });\n adapters.push(posthogAdapter);\n\n console.log(\n \"Configured adapters:\",\n adapters.map((a) => a.name)\n );\n\n await initializeEventTracking(adapters);\n console.log(\"Event tracking system initialized successfully\");\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,wBACpB,UACe;AAEf,QAAM,EAAE,iBAAAA,iBAAgB,IAAI,MAAM,OAAO,2BAAc;AAGvD,aAAW,WAAW,UAAU;AAC9B,IAAAA,iBAAgB,gBAAgB,OAAO;AAAA,EACzC;AAGA,QAAMA,iBAAgB,WAAW;AACnC;AAOA,eAAsB,aAAa,QAMhC;AACD,UAAQ,IAAI,uCAAuC;AAEnD,QAAM,WAAW,CAAC;AAGlB,MAAI,OAAO,SAAS;AAClB,UAAM,eAAe,IAAI,aAAa;AAAA,MACpC,SAAS,OAAO;AAAA,IAClB,CAAC;AACD,aAAS,KAAK,YAAY;AAAA,EAC5B;AAGA,MAAI,OAAO,MAAM;AACf,UAAM,YAAY,IAAI,cAAc;AAAA,MAClC,eAAe,OAAO;AAAA,IACxB,CAAC;AACD,aAAS,KAAK,SAAS;AAAA,EACzB;AAGA,MAAI,OAAO,eAAe;AACxB,UAAM,kBAAkB,IAAI,gBAAgB;AAAA,MAC1C,OAAO,OAAO;AAAA,MACd,0BAA0B;AAAA,MAC1B,QAAQ,OAAO,kBAAkB;AAAA,MACjC,OAAO,OAAO,mBAAmB;AAAA,IACnC,CAAC;AACD,aAAS,KAAK,eAAe;AAAA,EAC/B;AAGA,QAAM,iBAAiB,IAAI,eAAe;AAAA,IACxC,iBAAiB,OAAO,mBAAmB;AAAA,EAC7C,CAAC;AACD,WAAS,KAAK,cAAc;AAE5B,UAAQ;AAAA,IACN;AAAA,IACA,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC5B;AAEA,QAAM,wBAAwB,QAAQ;AACtC,UAAQ,IAAI,gDAAgD;AAC9D;","names":["eventSubscriber"]}