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,2131 @@
1
+ "use client";
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __esm = (fn, res) => function __init() {
10
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ };
12
+ var __export = (target, all) => {
13
+ for (var name in all)
14
+ __defProp(target, name, { get: all[name], enumerable: true });
15
+ };
16
+ var __copyProps = (to, from, except, desc) => {
17
+ if (from && typeof from === "object" || typeof from === "function") {
18
+ for (let key of __getOwnPropNames(from))
19
+ if (!__hasOwnProp.call(to, key) && key !== except)
20
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25
+ // If the importer is in node compatibility mode or this is not an ESM
26
+ // file that has been converted to a CommonJS file using a Babel-
27
+ // compatible transform (i.e. "__esModule" has not been set), then set
28
+ // "default" to the CommonJS "module.exports" for node compatibility.
29
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30
+ mod
31
+ ));
32
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
+
34
+ // src/events/publisher.ts
35
+ function publishEvent(event) {
36
+ try {
37
+ eventPublisher.publish(event);
38
+ } catch (error) {
39
+ console.error("Error in publishEvent helper:", error);
40
+ }
41
+ }
42
+ var EventPublisher, eventPublisher;
43
+ var init_publisher = __esm({
44
+ "src/events/publisher.ts"() {
45
+ "use strict";
46
+ EventPublisher = class _EventPublisher {
47
+ /**
48
+ * Private constructor to enforce singleton pattern
49
+ */
50
+ constructor() {
51
+ this.subscribers = [];
52
+ }
53
+ /**
54
+ * Get the singleton instance of EventPublisher
55
+ */
56
+ static getInstance() {
57
+ if (!_EventPublisher.instance) {
58
+ _EventPublisher.instance = new _EventPublisher();
59
+ }
60
+ return _EventPublisher.instance;
61
+ }
62
+ /**
63
+ * Subscribe to events
64
+ * @param callback Function to be called when an event is published
65
+ * @returns Unsubscribe function
66
+ */
67
+ subscribe(callback) {
68
+ this.subscribers.push(callback);
69
+ return () => {
70
+ this.subscribers = this.subscribers.filter(
71
+ (subscriber) => subscriber !== callback
72
+ );
73
+ };
74
+ }
75
+ /**
76
+ * Publish an event to all subscribers
77
+ * @param event The event to publish
78
+ */
79
+ publish(event) {
80
+ try {
81
+ console.log("EventPublisher: Received event", {
82
+ type: event.type,
83
+ data: event
84
+ });
85
+ const eventWithTimestamp = !event.timestamp ? { ...event, timestamp: Date.now() } : event;
86
+ console.log("EventPublisher: Number of subscribers:", this.subscribers.length);
87
+ for (const subscriber of this.subscribers) {
88
+ try {
89
+ console.log("EventPublisher: Notifying subscriber");
90
+ subscriber(eventWithTimestamp);
91
+ console.log("EventPublisher: Subscriber notified successfully");
92
+ } catch (error) {
93
+ console.error("EventPublisher: Error in subscriber:", error);
94
+ }
95
+ }
96
+ console.log("EventPublisher: Event processing completed");
97
+ } catch (error) {
98
+ console.error("Error publishing event:", error, event);
99
+ }
100
+ }
101
+ };
102
+ eventPublisher = EventPublisher.getInstance();
103
+ }
104
+ });
105
+
106
+ // src/events/subscriber.ts
107
+ var subscriber_exports = {};
108
+ __export(subscriber_exports, {
109
+ eventSubscriber: () => eventSubscriber
110
+ });
111
+ var EventSubscriber, eventSubscriber;
112
+ var init_subscriber = __esm({
113
+ "src/events/subscriber.ts"() {
114
+ "use strict";
115
+ init_publisher();
116
+ EventSubscriber = class _EventSubscriber {
117
+ /**
118
+ * Private constructor to enforce singleton pattern
119
+ */
120
+ constructor() {
121
+ this.adapters = [];
122
+ this.initialized = false;
123
+ this.eventQueue = [];
124
+ this.unsubscribe = null;
125
+ }
126
+ /**
127
+ * Get the singleton instance of EventSubscriber
128
+ */
129
+ static getInstance() {
130
+ if (!_EventSubscriber.instance) {
131
+ _EventSubscriber.instance = new _EventSubscriber();
132
+ }
133
+ return _EventSubscriber.instance;
134
+ }
135
+ /**
136
+ * Register a tracking adapter
137
+ * @param adapter The tracking adapter to register
138
+ */
139
+ registerAdapter(adapter) {
140
+ const existingAdapter = this.adapters.find((a) => a.name === adapter.name);
141
+ if (existingAdapter) {
142
+ console.warn(
143
+ `Tracking adapter with name "${adapter.name}" is already registered. Skipping.`
144
+ );
145
+ return;
146
+ }
147
+ this.adapters.push(adapter);
148
+ if (this.initialized) {
149
+ this.initializeAdapter(adapter).catch((error) => {
150
+ console.error(`Failed to initialize adapter "${adapter.name}":`, error);
151
+ });
152
+ }
153
+ }
154
+ /**
155
+ * Unregister a tracking adapter by name
156
+ * @param adapterName The name of the adapter to unregister
157
+ */
158
+ unregisterAdapter(adapterName) {
159
+ this.adapters = this.adapters.filter(
160
+ (adapter) => adapter.name !== adapterName
161
+ );
162
+ }
163
+ /**
164
+ * Initialize all registered adapters
165
+ */
166
+ async initialize() {
167
+ console.log("Initializing EventSubscriber...");
168
+ if (this.initialized) {
169
+ console.log("EventSubscriber already initialized");
170
+ return;
171
+ }
172
+ this.unsubscribe = eventPublisher.subscribe(this.handleEvent.bind(this));
173
+ console.log("Subscribed to event publisher");
174
+ console.log(`Initializing ${this.adapters.length} adapters...`);
175
+ await Promise.all(
176
+ this.adapters.map((adapter) => this.initializeAdapter(adapter))
177
+ );
178
+ this.initialized = true;
179
+ console.log("EventSubscriber initialization complete");
180
+ this.processEventQueue();
181
+ }
182
+ /**
183
+ * Initialize a single adapter
184
+ * @param adapter The adapter to initialize
185
+ */
186
+ async initializeAdapter(adapter) {
187
+ try {
188
+ await adapter.initialize();
189
+ console.log(
190
+ `Tracking adapter "${adapter.name}" initialized successfully.`
191
+ );
192
+ } catch (error) {
193
+ console.error(`Failed to initialize adapter "${adapter.name}":`, error);
194
+ }
195
+ }
196
+ /**
197
+ * Handle an event by forwarding it to all enabled adapters
198
+ * @param event The event to handle
199
+ */
200
+ handleEvent(event) {
201
+ console.log("Handling event:", event.type);
202
+ if (!this.initialized) {
203
+ console.log("Subscriber not initialized, queueing event");
204
+ this.eventQueue.push(event);
205
+ return;
206
+ }
207
+ for (const adapter of this.adapters) {
208
+ if (adapter.isEnabled()) {
209
+ console.log(`Forwarding event to adapter: ${adapter.name}`);
210
+ adapter.trackEvent(event).catch((error) => {
211
+ console.error(
212
+ `Error tracking event in adapter "${adapter.name}":`,
213
+ error
214
+ );
215
+ });
216
+ } else {
217
+ console.log(`Adapter ${adapter.name} is disabled, skipping`);
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Process any events that were queued before initialization
223
+ */
224
+ processEventQueue() {
225
+ if (this.eventQueue.length === 0) {
226
+ return;
227
+ }
228
+ console.log(`Processing ${this.eventQueue.length} queued events.`);
229
+ for (const event of this.eventQueue) {
230
+ this.handleEvent(event);
231
+ }
232
+ this.eventQueue = [];
233
+ }
234
+ /**
235
+ * Shutdown the subscriber and all adapters
236
+ */
237
+ shutdown() {
238
+ if (this.unsubscribe) {
239
+ this.unsubscribe();
240
+ this.unsubscribe = null;
241
+ }
242
+ this.initialized = false;
243
+ this.eventQueue = [];
244
+ }
245
+ /**
246
+ * Get all registered adapters
247
+ */
248
+ getAdapters() {
249
+ return [...this.adapters];
250
+ }
251
+ };
252
+ eventSubscriber = EventSubscriber.getInstance();
253
+ }
254
+ });
255
+
256
+ // src/events/index.ts
257
+ var events_exports = {};
258
+ __export(events_exports, {
259
+ DEFAULT_CURRENCY: () => DEFAULT_CURRENCY,
260
+ EventNames: () => EventNames,
261
+ EventType: () => EventType,
262
+ HARDCODED_HANDLE: () => HARDCODED_HANDLE,
263
+ eventPublisher: () => eventPublisher,
264
+ eventSubscriber: () => eventSubscriber,
265
+ initTracking: () => initTracking,
266
+ initializeEventTracking: () => initializeEventTracking,
267
+ publishEvent: () => publishEvent
268
+ });
269
+ module.exports = __toCommonJS(events_exports);
270
+
271
+ // src/types.ts
272
+ var EventType = /* @__PURE__ */ ((EventType2) => {
273
+ EventType2["PRODUCT_VIEW"] = "product_view";
274
+ EventType2["STARTED_ORDER"] = "started_order";
275
+ EventType2["PAGE_VIEW"] = "page_view";
276
+ EventType2["BUTTON_CLICK"] = "button_click";
277
+ EventType2["FORM_SUBMISSION"] = "form_submission";
278
+ EventType2["VIEW_ITEM"] = "view_item";
279
+ EventType2["VIEWED_PRODUCT"] = "viewed_product";
280
+ EventType2["CHECKOUT_PAYMENT"] = "checkout_payment";
281
+ EventType2["COLLECTION_VIEW"] = "collection_view";
282
+ EventType2["ADD_TO_CART"] = "add_to_cart";
283
+ EventType2["REMOVE_FROM_CART"] = "remove_from_cart";
284
+ EventType2["CHECKOUT_STARTED"] = "checkout_started";
285
+ EventType2["CHECKOUT_COMPLETED"] = "checkout_completed";
286
+ EventType2["SEARCH"] = "search";
287
+ EventType2["CART_PAGE_LAND"] = "cart_page_land";
288
+ EventType2["CLOSE_CART"] = "close_cart";
289
+ EventType2["QUANTITY_CHANGE"] = "quantity_change";
290
+ EventType2["FILTER_APPLIED"] = "filter_applied";
291
+ EventType2["NEWSLETTER_SUBSCRIPTION"] = "newsletter_subscription";
292
+ EventType2["USER_SIGNUP"] = "user_signup";
293
+ EventType2["USER_LOGIN"] = "user_login";
294
+ EventType2["CUSTOM"] = "custom";
295
+ EventType2["USER_ENGAGEMENT"] = "user_engagement";
296
+ EventType2["SESSION_START"] = "session_start";
297
+ EventType2["FIRST_VISIT"] = "first_visit";
298
+ EventType2["SCROLL"] = "scroll";
299
+ EventType2["FORM_START"] = "form_start";
300
+ EventType2["ADD_PAYMENT_INFO"] = "add_payment_info";
301
+ EventType2["CART_VIEWED"] = "cart_viewed";
302
+ EventType2["PAGES_SCREENS_PER_SESSION"] = "pages_screens_per_session";
303
+ EventType2["VIEW_CONTENT"] = "view_content";
304
+ EventType2["PURCHASE"] = "purchase";
305
+ EventType2["VIEW_SEARCH_RESULTS"] = "view_search_results";
306
+ EventType2["ORDER_PLACED"] = "order_placed";
307
+ EventType2["BEGIN_CHECKOUT"] = "begin_checkout";
308
+ EventType2["ITEM_PURCHASED"] = "item_purchased";
309
+ EventType2["UPDATE_CART"] = "update_cart";
310
+ EventType2["CUSTOMER_REGISTERED"] = "customer_registered";
311
+ EventType2["CUSTOMER_LOGGED_IN"] = "customer_logged_in";
312
+ EventType2["SHOPIFY_CHECKOUT_UPDATED"] = "shopify_checkout_updated";
313
+ EventType2["SHOPIFY_ABANDONED_CHECKOUT"] = "shopify_abandoned_checkout";
314
+ EventType2["SHOPIFY_ORDER_FULFILLED"] = "shopify_order_fulfilled";
315
+ EventType2["SHOPIFY_CHECKOUT_STARTED"] = "shopify_checkout_started";
316
+ EventType2["SHOPIFY_ADD_TO_CART"] = "shopify_add_to_cart";
317
+ EventType2["SHOPIFY_REMOVED_FROM_CART"] = "shopify_removed_from_cart";
318
+ EventType2["SHOPIFY_UPDATE_CART"] = "shopify_update_cart";
319
+ EventType2["SPINFORM_RESULT"] = "spinform_result";
320
+ EventType2["COUPON_COPIED"] = "coupon_copied";
321
+ EventType2["STARTED_CHECKOUT_GK"] = "started_checkout_gk";
322
+ EventType2["MOBILE_ADDED_GK"] = "mobile_added_gk";
323
+ EventType2["ADDRESS_SELECTED_GK"] = "address_selected_gk";
324
+ EventType2["ADDRESS_COMPLETED_GK"] = "address_completed_gk";
325
+ EventType2["PAYMENT_METHOD_SELECTED_GK"] = "payment_method_selected_gk";
326
+ EventType2["PAYMENT_COMPLETED_GK"] = "payment_completed_gk";
327
+ EventType2["ORDER_SUCCESS"] = "order_success";
328
+ EventType2["ORDER_COMPLETED"] = "order_completed";
329
+ EventType2["PIN_CODE_ADDED_GK"] = "pin_code_added_gk";
330
+ EventType2["ADDRESS_ADDED_GK"] = "address_added_gk";
331
+ EventType2["KP_MP_PHONE_NUMBER_LOGGED_IN"] = "kp_mp_phone_number_logged_in";
332
+ EventType2["KP_PHONE_NUMBER_LOGGED_IN"] = "kp_phone_number_logged_in";
333
+ EventType2["KP_MP_SHOPIFY_LOGGED_IN"] = "kp_mp_shopify_logged_in";
334
+ EventType2["KP_MP_SUCCESSFULLY_LOGGED_OUT"] = "kp_mp_successfully_logged_out";
335
+ EventType2["KP_WHATSAPP_LOGGED_IN"] = "kp_whatsapp_logged_in";
336
+ EventType2["KP_MP_TRUECALLER_LOGGED_IN"] = "kp_mp_truecaller_logged_in";
337
+ EventType2["KP_MP_WHATSAPP_LOGGED_IN"] = "kp_mp_whatsapp_logged_in";
338
+ EventType2["KP_TRUECALLER_LOGGED_IN"] = "kp_truecaller_logged_in";
339
+ EventType2["KP_SHOPIFY_LOGGED_IN"] = "kp_shopify_logged_in";
340
+ EventType2["KP_SUCCESSFULLY_LOGGED_OUT"] = "kp_successfully_logged_out";
341
+ return EventType2;
342
+ })(EventType || {});
343
+
344
+ // src/events/index.ts
345
+ init_publisher();
346
+ init_subscriber();
347
+
348
+ // src/logger/index.ts
349
+ var import_pino = __toESM(require("pino"));
350
+ var NoOpLogger = class _NoOpLogger {
351
+ trace() {
352
+ }
353
+ debug() {
354
+ }
355
+ info() {
356
+ }
357
+ warn() {
358
+ }
359
+ error() {
360
+ }
361
+ fatal() {
362
+ }
363
+ child() {
364
+ return new _NoOpLogger();
365
+ }
366
+ };
367
+ var PinoLogger = class _PinoLogger {
368
+ constructor(logger2) {
369
+ this.logger = logger2;
370
+ }
371
+ trace(message, ...args) {
372
+ this.logger.trace({ args }, message);
373
+ }
374
+ debug(message, ...args) {
375
+ this.logger.debug({ args }, message);
376
+ }
377
+ info(message, ...args) {
378
+ this.logger.info({ args }, message);
379
+ }
380
+ warn(message, ...args) {
381
+ this.logger.warn({ args }, message);
382
+ }
383
+ error(message, error, ...args) {
384
+ this.logger.error({ error, args }, message);
385
+ }
386
+ fatal(message, error, ...args) {
387
+ this.logger.fatal({ error, args }, message);
388
+ }
389
+ child(bindings) {
390
+ return new _PinoLogger(this.logger.child(bindings));
391
+ }
392
+ };
393
+ function createLogger(config = {}) {
394
+ const {
395
+ level = "info",
396
+ enabled = true,
397
+ name = "@shopkit/analytics",
398
+ prettyPrint = false,
399
+ redact = []
400
+ } = config;
401
+ if (!enabled) {
402
+ return new NoOpLogger();
403
+ }
404
+ const pinoConfig = {
405
+ name,
406
+ level,
407
+ redact,
408
+ browser: {
409
+ asObject: true,
410
+ serialize: true,
411
+ write: {
412
+ trace: (o) => console.trace(formatBrowserLog(o)),
413
+ debug: (o) => console.debug(formatBrowserLog(o)),
414
+ info: (o) => console.info(formatBrowserLog(o)),
415
+ warn: (o) => console.warn(formatBrowserLog(o)),
416
+ error: (o) => console.error(formatBrowserLog(o)),
417
+ fatal: (o) => console.error(formatBrowserLog(o))
418
+ }
419
+ }
420
+ };
421
+ if (prettyPrint && typeof window === "undefined") {
422
+ pinoConfig.transport = {
423
+ target: "pino-pretty",
424
+ options: {
425
+ colorize: true,
426
+ translateTime: "HH:MM:ss Z",
427
+ ignore: "pid,hostname"
428
+ }
429
+ };
430
+ }
431
+ const pinoLogger = (0, import_pino.default)(pinoConfig);
432
+ return new PinoLogger(pinoLogger);
433
+ }
434
+ function formatBrowserLog(logObj) {
435
+ const { level, time, msg, name, args, error, ...rest } = logObj;
436
+ let message = `[${name}] ${msg}`;
437
+ if (args && args.length > 0) {
438
+ message += ` ${args.map(
439
+ (arg) => typeof arg === "object" ? JSON.stringify(arg) : String(arg)
440
+ ).join(" ")}`;
441
+ }
442
+ if (error) {
443
+ message += ` Error: ${error.message}`;
444
+ if (error.stack) {
445
+ message += `
446
+ ${error.stack}`;
447
+ }
448
+ }
449
+ if (Object.keys(rest).length > 0) {
450
+ message += ` ${JSON.stringify(rest)}`;
451
+ }
452
+ return message;
453
+ }
454
+ var logger = createLogger({
455
+ enabled: true,
456
+ level: "info",
457
+ prettyPrint: false
458
+ });
459
+ function createAdapterLogger(adapterName, config = {}) {
460
+ const baseLogger = createLogger(config);
461
+ return baseLogger.child({ adapter: adapterName });
462
+ }
463
+
464
+ // src/adapters/base-adapter.ts
465
+ var BaseAdapter = class {
466
+ /**
467
+ * Constructor
468
+ * @param config Configuration for the adapter
469
+ */
470
+ constructor(config = {}) {
471
+ /**
472
+ * Whether the adapter has been initialized
473
+ */
474
+ this.initialized = false;
475
+ this.config = config;
476
+ const loggerConfig = {
477
+ enabled: config.enableDebugLogs ?? true,
478
+ level: config.logLevel ?? "info",
479
+ name: "@shopkit/analytics"
480
+ };
481
+ this.logger = createAdapterLogger("BaseAdapter", loggerConfig);
482
+ }
483
+ /**
484
+ * Initialize logger with proper adapter name
485
+ * Should be called by subclasses after name is available
486
+ */
487
+ initializeLogger() {
488
+ const loggerConfig = {
489
+ enabled: this.config.enableDebugLogs ?? true,
490
+ level: this.config.logLevel ?? "info",
491
+ name: "@shopkit/analytics"
492
+ };
493
+ this.logger = createAdapterLogger(this.name, loggerConfig);
494
+ }
495
+ /**
496
+ * Check if the adapter is enabled
497
+ */
498
+ isEnabled() {
499
+ return this.initialized;
500
+ }
501
+ /**
502
+ * Get a configuration value
503
+ * @param key The configuration key
504
+ * @param defaultValue The default value if the key is not found
505
+ */
506
+ getConfig(key, defaultValue) {
507
+ return key in this.config ? this.config[key] : defaultValue;
508
+ }
509
+ /**
510
+ * Get affiliate parameters from session storage or custom implementation
511
+ * Override this method to provide your own affiliate tracking implementation
512
+ * @returns Affiliate parameters or null if not available
513
+ */
514
+ getAffiliateParams() {
515
+ return null;
516
+ }
517
+ /**
518
+ * Enhance event parameters with affiliate data
519
+ * @param params The original parameters
520
+ * @returns Parameters enhanced with affiliate data
521
+ */
522
+ enhanceWithAffiliateParams(params) {
523
+ const affiliateParams = this.getAffiliateParams();
524
+ if (!affiliateParams) return params;
525
+ return {
526
+ ...params,
527
+ // Add affiliate parameters
528
+ ...affiliateParams
529
+ };
530
+ }
531
+ };
532
+
533
+ // src/adapters/pixel-adapter.ts
534
+ var PixelAdapter = class extends BaseAdapter {
535
+ constructor(config) {
536
+ super(config);
537
+ this.name = "FacebookPixel";
538
+ this.initializeLogger();
539
+ }
540
+ /**
541
+ * Initialize the Facebook Pixel
542
+ */
543
+ async initialize() {
544
+ if (this.initialized) {
545
+ this.logger.debug("Already initialized");
546
+ return;
547
+ }
548
+ if (typeof window === "undefined") {
549
+ this.logger.debug("Skipping initialization on server");
550
+ return;
551
+ }
552
+ if (!window.fbq) {
553
+ this.logger.warn(
554
+ "Facebook Pixel fbq not found. Make sure the script is loaded."
555
+ );
556
+ return;
557
+ }
558
+ const pixelId = this.getConfig("pixelId");
559
+ this.logger.info("Successfully initialized", { pixelId: "***" });
560
+ this.initialized = true;
561
+ }
562
+ /**
563
+ * Track an event with Facebook Pixel
564
+ * @param event The event to track
565
+ */
566
+ async trackEvent(event) {
567
+ if (!this.initialized || typeof window === "undefined" || !window.fbq) {
568
+ this.logger.warn(
569
+ "Cannot track event, adapter not initialized or fbq not available",
570
+ {
571
+ eventType: event.type,
572
+ initialized: this.initialized,
573
+ hasWindow: typeof window !== "undefined",
574
+ hasFbq: !!window?.fbq
575
+ }
576
+ );
577
+ return;
578
+ }
579
+ this.logger.debug("Tracking event", { eventType: event.type });
580
+ switch (event.type) {
581
+ case "page_view" /* PAGE_VIEW */:
582
+ this.trackPageView(event);
583
+ break;
584
+ case "view_content" /* VIEW_CONTENT */:
585
+ this.trackViewContent(event);
586
+ break;
587
+ case "product_view" /* PRODUCT_VIEW */:
588
+ this.trackProductView(event);
589
+ break;
590
+ case "add_to_cart" /* ADD_TO_CART */:
591
+ this.trackAddToCart(event);
592
+ break;
593
+ case "checkout_started" /* CHECKOUT_STARTED */:
594
+ this.trackCheckoutStarted(event);
595
+ break;
596
+ case "checkout_completed" /* CHECKOUT_COMPLETED */:
597
+ this.trackCheckoutCompleted(event);
598
+ break;
599
+ case "purchase" /* PURCHASE */:
600
+ this.trackPurchase(event);
601
+ break;
602
+ case "add_payment_info" /* ADD_PAYMENT_INFO */:
603
+ this.trackAddPaymentInfo(event);
604
+ break;
605
+ case "search" /* SEARCH */:
606
+ this.trackSearch(event);
607
+ break;
608
+ default:
609
+ this.logger.debug("Unhandled event type", { eventType: event.type });
610
+ break;
611
+ }
612
+ }
613
+ /**
614
+ * Track a page view event
615
+ * @param event The page view event
616
+ */
617
+ trackPageView(event) {
618
+ const params = this.enhanceWithAffiliateParams({});
619
+ window.fbq?.("track", "PageView", params);
620
+ this.logger.debug("PageView event tracked", { params });
621
+ }
622
+ /**
623
+ * Track a product view event
624
+ * @param event The product view event
625
+ */
626
+ trackProductView(event) {
627
+ const params = {
628
+ content_type: "product_group",
629
+ content_ids: [event.productId],
630
+ content_name: event.productName,
631
+ content_category: event.category,
632
+ value: event.price,
633
+ currency: event.currency || "INR"
634
+ };
635
+ window.fbq?.(
636
+ "track",
637
+ "ViewContent",
638
+ this.enhanceWithAffiliateParams(params)
639
+ );
640
+ }
641
+ /**
642
+ * Track an add to cart event
643
+ * @param event The add to cart event
644
+ */
645
+ trackAddToCart(event) {
646
+ const params = {
647
+ content_type: "product_group",
648
+ content_ids: [event.productId],
649
+ content_name: event.productName,
650
+ value: event.price,
651
+ currency: event.currency || "INR"
652
+ };
653
+ const enhancedParams = this.enhanceWithAffiliateParams(params);
654
+ window.fbq?.("track", "AddToCart", enhancedParams);
655
+ this.logger.debug("AddToCart event tracked", { params: enhancedParams });
656
+ }
657
+ /**
658
+ * Track a checkout started event
659
+ * @param event The checkout started event
660
+ */
661
+ trackCheckoutStarted(event) {
662
+ const params = {
663
+ content_ids: event.items.map((item) => item.productId),
664
+ content_type: "product_group",
665
+ value: event.cartValue,
666
+ currency: event.currency || "INR",
667
+ num_items: event.itemCount,
668
+ contents: event.items.map((item) => ({
669
+ id: item.productId,
670
+ quantity: item.quantity,
671
+ item_price: item.price
672
+ }))
673
+ };
674
+ window.fbq?.(
675
+ "track",
676
+ "InitiateCheckout",
677
+ this.enhanceWithAffiliateParams(params)
678
+ );
679
+ }
680
+ /**
681
+ * Track a checkout completed event
682
+ * @param event The checkout completed event
683
+ */
684
+ trackCheckoutCompleted(event) {
685
+ const params = {
686
+ value: event.cartValue,
687
+ currency: event.currency || "INR",
688
+ content_type: "product_group",
689
+ content_ids: event.items.map((item) => item.productId),
690
+ num_items: event.itemCount,
691
+ contents: event.items.map((item) => ({
692
+ id: item.productId,
693
+ quantity: item.quantity,
694
+ item_price: item.price
695
+ }))
696
+ };
697
+ window.fbq?.("track", "Purchase", this.enhanceWithAffiliateParams(params));
698
+ }
699
+ /**
700
+ * Track a search event
701
+ * @param event The search event
702
+ */
703
+ trackSearch(event) {
704
+ const params = {
705
+ search_string: event.searchTerm,
706
+ content_category: "product",
707
+ content_ids: event.content_ids || []
708
+ };
709
+ window.fbq?.("track", "Search", this.enhanceWithAffiliateParams(params));
710
+ }
711
+ /**
712
+ * Track an add payment info event
713
+ * @param event The add payment info event
714
+ */
715
+ trackAddPaymentInfo(event) {
716
+ const params = {
717
+ value: event.cartValue,
718
+ currency: event.currency || "INR",
719
+ content_type: "product_group",
720
+ content_ids: event.items.map((item) => item.productId),
721
+ contents: event.items.map((item) => ({
722
+ id: item.productId,
723
+ quantity: item.quantity,
724
+ item_price: item.price
725
+ })),
726
+ payment_type: event.paymentType || ""
727
+ };
728
+ window.fbq?.(
729
+ "track",
730
+ "AddPaymentInfo",
731
+ this.enhanceWithAffiliateParams(params)
732
+ );
733
+ }
734
+ /**
735
+ * Track a view content event
736
+ * @param event The view content event
737
+ */
738
+ trackViewContent(event) {
739
+ const params = {
740
+ content_type: event.content_type || "product",
741
+ content_ids: event.content_ids || [],
742
+ content_name: event.content_name || "",
743
+ content_category: event.content_category || "",
744
+ value: event.value || 0,
745
+ currency: event.currency || "INR"
746
+ };
747
+ window.fbq?.(
748
+ "track",
749
+ "ViewContent",
750
+ this.enhanceWithAffiliateParams(params)
751
+ );
752
+ }
753
+ /**
754
+ * Track a purchase event
755
+ * @param event The purchase event
756
+ */
757
+ trackPurchase(event) {
758
+ const params = {
759
+ value: event.value,
760
+ currency: event.currency || "INR",
761
+ content_type: event.content_type || "product_group",
762
+ content_ids: event.content_ids || [],
763
+ num_items: event.num_items || 1,
764
+ contents: event.contents || []
765
+ };
766
+ window.fbq?.("track", "Purchase", this.enhanceWithAffiliateParams(params));
767
+ }
768
+ /**
769
+ * Convert an event to Facebook Pixel parameters
770
+ * @param event The event to convert
771
+ */
772
+ eventToParams(event) {
773
+ const { type, timestamp, ...params } = event;
774
+ return this.enhanceWithAffiliateParams(params);
775
+ }
776
+ };
777
+
778
+ // src/adapters/google-adapter.ts
779
+ var GoogleAdapter = class extends BaseAdapter {
780
+ constructor(config) {
781
+ super(config);
782
+ this.name = "GoogleAnalytics";
783
+ this.initializeLogger();
784
+ }
785
+ /**
786
+ * Initialize Google Analytics adapter
787
+ * This just checks if gtag is available
788
+ */
789
+ isEnabled() {
790
+ const enabled = this.initialized && typeof window !== "undefined" && !!window.gtag;
791
+ this.logger.debug("Checking if enabled", {
792
+ initialized: this.initialized,
793
+ hasWindow: typeof window !== "undefined",
794
+ hasGtag: !!window?.gtag,
795
+ enabled
796
+ });
797
+ return enabled;
798
+ }
799
+ async initialize() {
800
+ this.logger.info("Starting initialization");
801
+ if (this.initialized) {
802
+ this.logger.debug("Already initialized");
803
+ return;
804
+ }
805
+ if (typeof window === "undefined") {
806
+ this.logger.debug("Skipping initialization on server");
807
+ return;
808
+ }
809
+ const measurementId = this.getConfig("measurementId");
810
+ this.logger.info("Using measurement ID", { measurementId });
811
+ if (!window.gtag) {
812
+ this.logger.warn(
813
+ "Google Analytics gtag not found. Make sure the script is loaded."
814
+ );
815
+ return;
816
+ }
817
+ this.initialized = true;
818
+ this.logger.info("Successfully initialized", { measurementId });
819
+ }
820
+ /**
821
+ * Track an event with Google Analytics
822
+ * @param event The event to track
823
+ */
824
+ async trackEvent(event) {
825
+ this.logger.debug("Attempting to track event", {
826
+ initialized: this.initialized,
827
+ hasWindow: typeof window !== "undefined",
828
+ hasGtag: !!window?.gtag,
829
+ eventType: event.type
830
+ });
831
+ if (!this.initialized || typeof window === "undefined" || !window.gtag) {
832
+ this.logger.warn(
833
+ "Cannot track event, adapter not initialized or gtag not available",
834
+ {
835
+ eventType: event.type,
836
+ initialized: this.initialized,
837
+ hasWindow: typeof window !== "undefined",
838
+ hasGtag: !!window?.gtag
839
+ }
840
+ );
841
+ return;
842
+ }
843
+ const measurementId = this.getConfig("measurementId");
844
+ this.logger.info("Tracking event", {
845
+ eventType: event.type,
846
+ measurementId
847
+ });
848
+ switch (event.type) {
849
+ case "page_view" /* PAGE_VIEW */:
850
+ this.trackPageView(event, measurementId);
851
+ break;
852
+ case "user_engagement" /* USER_ENGAGEMENT */:
853
+ this.trackUserEngagement();
854
+ break;
855
+ case "session_start" /* SESSION_START */:
856
+ this.trackSessionStart();
857
+ break;
858
+ case "first_visit" /* FIRST_VISIT */:
859
+ this.trackFirstVisit();
860
+ break;
861
+ case "view_item" /* VIEW_ITEM */:
862
+ this.trackViewItem(event);
863
+ break;
864
+ case "viewed_product" /* VIEWED_PRODUCT */:
865
+ this.trackViewedProduct(event);
866
+ break;
867
+ case "checkout_payment" /* CHECKOUT_PAYMENT */:
868
+ this.trackCheckoutPayment(event);
869
+ break;
870
+ case "scroll" /* SCROLL */:
871
+ this.trackScroll();
872
+ break;
873
+ case "add_to_cart" /* ADD_TO_CART */:
874
+ case "shopify_add_to_cart" /* SHOPIFY_ADD_TO_CART */:
875
+ this.trackAddToCart(event);
876
+ break;
877
+ case "form_start" /* FORM_START */:
878
+ this.trackFormStart();
879
+ break;
880
+ case "checkout_started" /* CHECKOUT_STARTED */:
881
+ this.trackCheckoutStarted(event);
882
+ break;
883
+ case "form_submission" /* FORM_SUBMISSION */:
884
+ this.trackFormSubmission(event);
885
+ break;
886
+ case "search" /* SEARCH */:
887
+ this.trackSearch(event);
888
+ break;
889
+ case "checkout_completed" /* CHECKOUT_COMPLETED */:
890
+ this.trackCheckoutCompleted(event);
891
+ break;
892
+ case "add_payment_info" /* ADD_PAYMENT_INFO */:
893
+ this.trackAddPaymentInfo(event);
894
+ break;
895
+ case "view_content" /* VIEW_CONTENT */:
896
+ this.trackViewContent(event);
897
+ break;
898
+ case "purchase" /* PURCHASE */:
899
+ this.trackPurchase(event);
900
+ break;
901
+ case "view_search_results" /* VIEW_SEARCH_RESULTS */:
902
+ this.trackViewSearchResults(event);
903
+ break;
904
+ case "order_placed" /* ORDER_PLACED */:
905
+ this.trackOrderPlaced(event);
906
+ break;
907
+ case "begin_checkout" /* BEGIN_CHECKOUT */:
908
+ this.trackBeginCheckout(event);
909
+ break;
910
+ case "custom" /* CUSTOM */:
911
+ this.trackCustomEvent(event);
912
+ break;
913
+ default: {
914
+ const params = this.eventToParams(event);
915
+ window.gtag(
916
+ "event",
917
+ event.type,
918
+ this.enhanceWithAffiliateParams(params)
919
+ );
920
+ break;
921
+ }
922
+ }
923
+ }
924
+ /**
925
+ * Track a page view event
926
+ * @param event The page view event
927
+ * @param measurementId The Google Analytics measurement ID
928
+ */
929
+ trackPageView(event, measurementId) {
930
+ const params = {
931
+ page_path: event.path,
932
+ page_title: event.title || document.title,
933
+ page_location: event.page_location || window.location.href,
934
+ page_referrer: event.page_referrer || document.referrer || void 0,
935
+ ga_session_id: event.ga_session_id || "",
936
+ ga_session_number: event.ga_session_number || "",
937
+ gclid: event.gclid || "",
938
+ engagement_time_msec: event.engagement_time_msec,
939
+ campaign: event.campaign || "",
940
+ campaign_id: event.campaign_id || "",
941
+ content: event.content || "",
942
+ debug_mode: event.debug_mode,
943
+ medium: event.medium || "",
944
+ source: event.page_source || "",
945
+ page_term: event.page_term || "",
946
+ ignore_referrer: event.ignore_referrer,
947
+ batch_ordering_id: event.batch_ordering_id || "",
948
+ batch_page_id: event.batch_page_id || "",
949
+ user_id: event.user_id,
950
+ user_properties: event.user_properties,
951
+ session_engaged: event.session_engaged
952
+ };
953
+ window.gtag?.(
954
+ "event",
955
+ "page_view",
956
+ this.enhanceWithAffiliateParams(params)
957
+ );
958
+ }
959
+ trackUserEngagement() {
960
+ const params = {
961
+ batch_ordering_id: "",
962
+ batch_page_id: "",
963
+ campaign: "",
964
+ ga_session_id: "",
965
+ ga_session_number: "",
966
+ gclid: "",
967
+ ignore_referrer: "",
968
+ medium: "",
969
+ page_location: window.location.href,
970
+ page_path: window.location.pathname,
971
+ page_referrer: document.referrer,
972
+ page_title: document.title,
973
+ source: "",
974
+ srsltid: "",
975
+ term: ""
976
+ };
977
+ window.gtag?.(
978
+ "event",
979
+ "user_engagement",
980
+ this.enhanceWithAffiliateParams(params)
981
+ );
982
+ }
983
+ trackSessionStart() {
984
+ const params = {
985
+ batch_ordering_id: "",
986
+ batch_page_id: "",
987
+ campaign: "",
988
+ campaign_id: "",
989
+ content: "",
990
+ ga_session_id: "",
991
+ ga_session_number: "",
992
+ gclid: "",
993
+ ignore_referrer: "",
994
+ medium: "",
995
+ page_location: window.location.href,
996
+ page_path: window.location.pathname,
997
+ page_referrer: document.referrer,
998
+ page_title: document.title,
999
+ source: "",
1000
+ srsltid: "",
1001
+ term: ""
1002
+ };
1003
+ window.gtag?.(
1004
+ "event",
1005
+ "session_start",
1006
+ this.enhanceWithAffiliateParams(params)
1007
+ );
1008
+ }
1009
+ trackFirstVisit() {
1010
+ const params = {
1011
+ batch_ordering_id: "",
1012
+ batch_page_id: "",
1013
+ campaign: "",
1014
+ campaign_id: "",
1015
+ content: "",
1016
+ debug_mode: "",
1017
+ engagement_time_msec: 0,
1018
+ entrances: 1,
1019
+ ga_session_id: "",
1020
+ ga_session_number: "",
1021
+ gclid: "",
1022
+ ignore_referrer: "",
1023
+ medium: "",
1024
+ page_location: window.location.href,
1025
+ page_path: window.location.pathname,
1026
+ page_referrer: document.referrer,
1027
+ page_title: document.title,
1028
+ page_source: "",
1029
+ page_term: ""
1030
+ };
1031
+ window.gtag?.(
1032
+ "event",
1033
+ "first_visit",
1034
+ this.enhanceWithAffiliateParams(params)
1035
+ );
1036
+ }
1037
+ trackViewItem(event) {
1038
+ window.gtag?.(
1039
+ "event",
1040
+ "view_item",
1041
+ this.enhanceWithAffiliateParams({
1042
+ currency: event.currency,
1043
+ value: event.value,
1044
+ items: event.items
1045
+ })
1046
+ );
1047
+ }
1048
+ trackScroll() {
1049
+ const params = {
1050
+ batch_ordering_id: "",
1051
+ batch_page_id: "",
1052
+ engagement_time_msec: void 0,
1053
+ ga_session_id: "",
1054
+ ga_session_number: "",
1055
+ ignore_referrer: void 0,
1056
+ page_location: window.location.href,
1057
+ page_path: window.location.pathname,
1058
+ page_referrer: document.referrer,
1059
+ page_title: document.title,
1060
+ percent_scrolled: 90
1061
+ // or dynamically captured
1062
+ };
1063
+ window.gtag?.("event", "scroll", this.enhanceWithAffiliateParams(params));
1064
+ }
1065
+ trackCheckoutPayment(event) {
1066
+ window.gtag?.(
1067
+ "event",
1068
+ "checkout_payment",
1069
+ this.enhanceWithAffiliateParams({
1070
+ currency: event.currency,
1071
+ value: event.cartValue,
1072
+ items: event.items.map((item) => ({
1073
+ item_id: item.productId,
1074
+ item_name: item.productName,
1075
+ price: item.price,
1076
+ quantity: item.quantity
1077
+ }))
1078
+ })
1079
+ );
1080
+ }
1081
+ trackViewedProduct(event) {
1082
+ window.gtag?.(
1083
+ "event",
1084
+ "viewed_product",
1085
+ this.enhanceWithAffiliateParams({
1086
+ currency: event.currency,
1087
+ value: event.price,
1088
+ items: [
1089
+ {
1090
+ item_id: event.productId,
1091
+ item_name: event.productName,
1092
+ price: event.price,
1093
+ currency: event.currency
1094
+ }
1095
+ ],
1096
+ view_duration: event.viewDuration
1097
+ })
1098
+ );
1099
+ }
1100
+ trackAddToCart(event) {
1101
+ this.logger.debug("Processing add_to_cart event", { event });
1102
+ const params = {
1103
+ currency: event.currency || "INR",
1104
+ value: event.price * (event.quantity || 1),
1105
+ // Calculate total value
1106
+ items: [
1107
+ {
1108
+ item_id: event.productId,
1109
+ item_name: event.productName,
1110
+ price: event.price,
1111
+ quantity: event.quantity || 1,
1112
+ item_variant: event.variant
1113
+ }
1114
+ ],
1115
+ // GA4-specific parameters
1116
+ batch_ordering_id: event.batch_ordering_id || "",
1117
+ batch_page_id: event.batch_page_id || "",
1118
+ campaign: event.campaign || "",
1119
+ ga_session_id: event.ga_session_id || "",
1120
+ engagement_time_msec: event.engagement_time_msec,
1121
+ session_engaged: event.session_engaged,
1122
+ page_title: event.page_title || document.title,
1123
+ page_location: event.page_location || window.location.href,
1124
+ page_referrer: event.page_referrer || document.referrer,
1125
+ user_id: event.user_id,
1126
+ user_properties: event.user_properties
1127
+ };
1128
+ const enhancedParams = this.enhanceWithAffiliateParams(params);
1129
+ this.logger.debug("Sending add_to_cart event to gtag", {
1130
+ params: enhancedParams
1131
+ });
1132
+ window.gtag?.("event", "add_to_cart", enhancedParams);
1133
+ }
1134
+ trackFormStart() {
1135
+ const params = {
1136
+ batch_ordering_id: "",
1137
+ batch_page_id: "",
1138
+ engagement_time_msec: void 0,
1139
+ first_field_id: "",
1140
+ first_field_name: "",
1141
+ first_field_position: "",
1142
+ first_field_type: "",
1143
+ form_destination: "",
1144
+ form_length: "",
1145
+ form_id: "",
1146
+ ga_session_id: "",
1147
+ ga_session_number: "",
1148
+ ignore_referrer: void 0,
1149
+ page_location: window.location.href,
1150
+ page_referrer: document.referrer,
1151
+ page_title: document.title
1152
+ };
1153
+ window.gtag?.(
1154
+ "event",
1155
+ "form_start",
1156
+ this.enhanceWithAffiliateParams(params)
1157
+ );
1158
+ }
1159
+ trackCheckoutStarted(event) {
1160
+ const params = {
1161
+ batch_ordering_id: "",
1162
+ batch_page_id: "",
1163
+ currency: event.currency || "INR",
1164
+ ecomm_pagetype: "",
1165
+ ecomm_prodid: "",
1166
+ ecomm_totalvalue: event.cartValue,
1167
+ value: event.cartValue,
1168
+ engagement_time_msec: void 0,
1169
+ ga_session_id: "",
1170
+ ga_session_number: "",
1171
+ ignore_referrer: void 0,
1172
+ page_location: window.location.href,
1173
+ page_referrer: document.referrer,
1174
+ page_title: document.title,
1175
+ items: event.items.map((item) => ({
1176
+ item_id: item.productId,
1177
+ item_name: item.productName,
1178
+ price: item.price,
1179
+ quantity: item.quantity,
1180
+ item_variant: item.variant
1181
+ }))
1182
+ };
1183
+ window.gtag?.(
1184
+ "event",
1185
+ "begin_checkout",
1186
+ this.enhanceWithAffiliateParams(params)
1187
+ );
1188
+ }
1189
+ trackFormSubmission(event) {
1190
+ const params = {
1191
+ batch_ordering_id: "",
1192
+ batch_page_id: "",
1193
+ engagement_time_msec: void 0,
1194
+ form_destination: "",
1195
+ form_length: "",
1196
+ form_id: event.formId,
1197
+ ga_session_id: "",
1198
+ ga_session_number: "",
1199
+ ignore_referrer: void 0,
1200
+ page_location: window.location.href,
1201
+ page_referrer: document.referrer,
1202
+ page_title: document.title
1203
+ };
1204
+ window.gtag?.(
1205
+ "event",
1206
+ "form_submit",
1207
+ this.enhanceWithAffiliateParams(params)
1208
+ );
1209
+ }
1210
+ trackSearch(event) {
1211
+ const params = {
1212
+ batch_ordering_id: "",
1213
+ batch_page_id: "",
1214
+ engagement_time_msec: void 0,
1215
+ ga_session_id: "",
1216
+ ga_session_number: "",
1217
+ ignore_referrer: void 0,
1218
+ page_location: window.location.href,
1219
+ page_referrer: document.referrer,
1220
+ page_title: document.title,
1221
+ search_term: event.searchTerm
1222
+ };
1223
+ window.gtag?.("event", "search", this.enhanceWithAffiliateParams(params));
1224
+ }
1225
+ /**
1226
+ * Track a checkout completed event
1227
+ * @param event The checkout completed event
1228
+ */
1229
+ trackCheckoutCompleted(event) {
1230
+ const params = {
1231
+ transaction_id: event.orderId,
1232
+ currency: event.currency || "INR",
1233
+ value: event.cartValue,
1234
+ items: event.items.map((item) => ({
1235
+ item_id: item.productId,
1236
+ item_name: item.productName,
1237
+ price: item.price,
1238
+ quantity: item.quantity,
1239
+ item_variant: item.variant
1240
+ }))
1241
+ };
1242
+ window.gtag?.("event", "purchase", this.enhanceWithAffiliateParams(params));
1243
+ }
1244
+ /**
1245
+ * Track a custom event
1246
+ * @param event The custom event
1247
+ */
1248
+ trackCustomEvent(event) {
1249
+ const params = event.properties || {};
1250
+ window.gtag?.("event", event.name, this.enhanceWithAffiliateParams(params));
1251
+ }
1252
+ /**
1253
+ * Track an add payment info event
1254
+ * @param event The add payment info event
1255
+ */
1256
+ trackAddPaymentInfo(event) {
1257
+ const params = {
1258
+ currency: event.currency || "INR",
1259
+ value: event.cartValue,
1260
+ payment_type: event.paymentType || "",
1261
+ items: event.items.map((item) => ({
1262
+ item_id: item.productId,
1263
+ item_name: item.productName,
1264
+ price: item.price,
1265
+ quantity: item.quantity,
1266
+ item_variant: item.variant
1267
+ }))
1268
+ };
1269
+ window.gtag?.(
1270
+ "event",
1271
+ "add_payment_info",
1272
+ this.enhanceWithAffiliateParams(params)
1273
+ );
1274
+ }
1275
+ /**
1276
+ * Track a view content event
1277
+ * @param event The view content event
1278
+ */
1279
+ trackViewContent(event) {
1280
+ const params = {
1281
+ currency: event.currency || "USD",
1282
+ value: event.value || 0,
1283
+ items: event.items?.map((item) => ({
1284
+ item_id: item.item_id,
1285
+ item_name: item.item_name,
1286
+ item_category: item.item_category,
1287
+ item_category2: item.item_category2,
1288
+ item_category3: item.item_category3,
1289
+ item_category4: item.item_category4,
1290
+ item_category5: item.item_category5,
1291
+ item_brand: item.item_brand,
1292
+ item_variant: item.item_variant,
1293
+ price: item.price,
1294
+ quantity: item.quantity
1295
+ })) || [],
1296
+ // GA4-specific parameters
1297
+ batch_ordering_id: event.batch_ordering_id || "",
1298
+ batch_page_id: event.batch_page_id || "",
1299
+ campaign: event.campaign || "",
1300
+ ga_session_id: event.ga_session_id || "",
1301
+ engagement_time_msec: event.engagement_time_msec,
1302
+ session_engaged: event.session_engaged,
1303
+ page_title: event.page_title || document.title,
1304
+ page_location: event.page_location || window.location.href,
1305
+ page_referrer: event.page_referrer || document.referrer,
1306
+ user_id: event.user_id,
1307
+ user_properties: event.user_properties
1308
+ };
1309
+ window.gtag?.(
1310
+ "event",
1311
+ "view_item",
1312
+ this.enhanceWithAffiliateParams(params)
1313
+ );
1314
+ }
1315
+ /**
1316
+ * Track a purchase event
1317
+ * @param event The purchase event
1318
+ */
1319
+ trackPurchase(event) {
1320
+ const params = {
1321
+ transaction_id: event.transaction_id,
1322
+ value: event.value,
1323
+ currency: event.currency || "USD",
1324
+ coupon: event.coupon,
1325
+ shipping: event.shipping,
1326
+ tax: event.tax,
1327
+ items: event.items?.map((item) => ({
1328
+ item_id: item.item_id,
1329
+ item_name: item.item_name,
1330
+ item_category: item.item_category,
1331
+ item_category2: item.item_category2,
1332
+ item_category3: item.item_category3,
1333
+ item_category4: item.item_category4,
1334
+ item_category5: item.item_category5,
1335
+ item_brand: item.item_brand,
1336
+ item_variant: item.item_variant,
1337
+ price: item.price,
1338
+ quantity: item.quantity
1339
+ })) || [],
1340
+ // GA4-specific parameters
1341
+ batch_ordering_id: event.batch_ordering_id || "",
1342
+ batch_page_id: event.batch_page_id || "",
1343
+ campaign: event.campaign || "",
1344
+ ga_session_id: event.ga_session_id || "",
1345
+ engagement_time_msec: event.engagement_time_msec,
1346
+ session_engaged: event.session_engaged,
1347
+ page_title: event.page_title || document.title,
1348
+ page_location: event.page_location || window.location.href,
1349
+ page_referrer: event.page_referrer || document.referrer,
1350
+ user_id: event.user_id,
1351
+ user_properties: event.user_properties
1352
+ };
1353
+ window.gtag?.("event", "purchase", this.enhanceWithAffiliateParams(params));
1354
+ }
1355
+ /**
1356
+ * Track a view search results event
1357
+ * @param event The view search results event
1358
+ */
1359
+ trackViewSearchResults(event) {
1360
+ const params = {
1361
+ search_term: event.search_term,
1362
+ // GA4-specific parameters
1363
+ batch_ordering_id: event.batch_ordering_id || "",
1364
+ batch_page_id: event.batch_page_id || "",
1365
+ campaign: event.campaign || "",
1366
+ ga_session_id: event.ga_session_id || "",
1367
+ engagement_time_msec: event.engagement_time_msec,
1368
+ session_engaged: event.session_engaged,
1369
+ page_title: event.page_title || document.title,
1370
+ page_location: event.page_location || window.location.href,
1371
+ page_referrer: event.page_referrer || document.referrer,
1372
+ user_id: event.user_id,
1373
+ user_properties: event.user_properties
1374
+ };
1375
+ window.gtag?.(
1376
+ "event",
1377
+ "view_search_results",
1378
+ this.enhanceWithAffiliateParams(params)
1379
+ );
1380
+ }
1381
+ /**
1382
+ * Track an order placed event
1383
+ * @param event The order placed event
1384
+ */
1385
+ trackOrderPlaced(event) {
1386
+ const params = {
1387
+ transaction_id: event.order_id,
1388
+ value: event.total_amount,
1389
+ currency: event.currency || "USD",
1390
+ items: event.items?.map((item) => ({
1391
+ item_id: item.product_id,
1392
+ item_name: item.product_name,
1393
+ item_category: item.category,
1394
+ item_brand: item.brand,
1395
+ item_variant: item.variant,
1396
+ price: item.price,
1397
+ quantity: item.quantity
1398
+ })) || [],
1399
+ // GA4-specific parameters
1400
+ batch_ordering_id: event.batch_ordering_id || "",
1401
+ batch_page_id: event.batch_page_id || "",
1402
+ campaign: event.campaign || "",
1403
+ ga_session_id: event.ga_session_id || "",
1404
+ engagement_time_msec: event.engagement_time_msec,
1405
+ session_engaged: event.session_engaged,
1406
+ page_title: event.page_title || document.title,
1407
+ page_location: event.page_location || window.location.href,
1408
+ page_referrer: event.page_referrer || document.referrer,
1409
+ user_id: event.user_id,
1410
+ user_properties: event.user_properties
1411
+ };
1412
+ window.gtag?.("event", "purchase", this.enhanceWithAffiliateParams(params));
1413
+ }
1414
+ /**
1415
+ * Track a begin checkout event
1416
+ * @param event The begin checkout event
1417
+ */
1418
+ trackBeginCheckout(event) {
1419
+ const params = {
1420
+ currency: event.currency || "USD",
1421
+ value: event.value || 0,
1422
+ coupon: event.coupon,
1423
+ items: event.items?.map((item) => ({
1424
+ item_id: item.item_id,
1425
+ item_name: item.item_name,
1426
+ item_category: item.item_category,
1427
+ item_category2: item.item_category2,
1428
+ item_category3: item.item_category3,
1429
+ item_category4: item.item_category4,
1430
+ item_category5: item.item_category5,
1431
+ item_brand: item.item_brand,
1432
+ item_variant: item.item_variant,
1433
+ price: item.price,
1434
+ quantity: item.quantity
1435
+ })) || [],
1436
+ // GA4-specific parameters
1437
+ batch_ordering_id: event.batch_ordering_id || "",
1438
+ batch_page_id: event.batch_page_id || "",
1439
+ campaign: event.campaign || "",
1440
+ ga_session_id: event.ga_session_id || "",
1441
+ engagement_time_msec: event.engagement_time_msec,
1442
+ session_engaged: event.session_engaged,
1443
+ page_title: event.page_title || document.title,
1444
+ page_location: event.page_location || window.location.href,
1445
+ page_referrer: event.page_referrer || document.referrer,
1446
+ user_id: event.user_id,
1447
+ user_properties: event.user_properties
1448
+ };
1449
+ window.gtag?.(
1450
+ "event",
1451
+ "begin_checkout",
1452
+ this.enhanceWithAffiliateParams(params)
1453
+ );
1454
+ }
1455
+ /**
1456
+ * Convert an event to Google Analytics parameters
1457
+ * @param event The event to convert
1458
+ */
1459
+ eventToParams(event) {
1460
+ const { type, timestamp, ...params } = event;
1461
+ return this.enhanceWithAffiliateParams(params);
1462
+ }
1463
+ };
1464
+
1465
+ // src/constants.ts
1466
+ var EventNames = {
1467
+ // Page events
1468
+ PAGE_VIEWED: "Page Viewed",
1469
+ // Interaction events
1470
+ BUTTON_CLICKED: "Button Clicked",
1471
+ FORM_SUBMITTED: "Form Submitted",
1472
+ // Product events
1473
+ PRODUCT_VIEWED: "Product Viewed",
1474
+ ADDED_TO_CART: "Added To Cart",
1475
+ REMOVED_FROM_CART: "Removed From Cart",
1476
+ // Checkout events
1477
+ CHECKOUT_STARTED: "Checkout Started",
1478
+ PURCHASE_COMPLETED: "Purchase Completed",
1479
+ // Search events
1480
+ SEARCH: "Search",
1481
+ // User events
1482
+ USER_SIGNED_UP: "User Signed Up",
1483
+ USER_LOGGED_IN: "User Logged In",
1484
+ // MoEngage events
1485
+ ITEM_PURCHASED: "Item Purchased",
1486
+ UPDATE_CART: "Update Cart",
1487
+ CUSTOMER_REGISTERED: "Customer Registered",
1488
+ CUSTOMER_LOGGED_IN: "Customer Logged In",
1489
+ SHOPIFY_CHECKOUT_UPDATED: "Shopify - Checkout Updated",
1490
+ SHOPIFY_ABANDONED_CHECKOUT: "Shopify - Abandoned Checkout",
1491
+ SHOPIFY_ORDER_FULFILLED: "Shopify - Order Fulfilled",
1492
+ SHOPIFY_CHECKOUT_STARTED: "Shopify - Checkout Started",
1493
+ SHOPIFY_ADD_TO_CART: "Shopify - Add To Cart",
1494
+ SHOPIFY_REMOVED_FROM_CART: "Shopify - Removed From Cart",
1495
+ SHOPIFY_UPDATE_CART: "Shopify - Update Cart",
1496
+ SPINFORM_RESULT: "Spinform Result",
1497
+ COUPON_COPIED: "Coupon Copied",
1498
+ STARTED_CHECKOUT_GK: "Started Checkout GK",
1499
+ MOBILE_ADDED_GK: "Mobile Added GK",
1500
+ ADDRESS_SELECTED_GK: "Address Selected GK",
1501
+ ADDRESS_COMPLETED_GK: "Address Completed GK",
1502
+ PAYMENT_METHOD_SELECTED_GK: "Payment Method Selected GK",
1503
+ PAYMENT_COMPLETED_GK: "Payment Completed GK",
1504
+ ORDER_SUCCESS: "Order Success",
1505
+ ORDER_COMPLETED: "Order Completed",
1506
+ PIN_CODE_ADDED_GK: "PIN Code Added GK",
1507
+ ADDRESS_ADDED_GK: "Address Added GK",
1508
+ KP_MP_PHONE_NUMBER_LOGGED_IN: "KP MP Phone Number Logged In",
1509
+ KP_PHONE_NUMBER_LOGGED_IN: "KP Phone Number Logged In",
1510
+ KP_MP_SHOPIFY_LOGGED_IN: "KP MP Shopify Logged In",
1511
+ KP_MP_SUCCESSFULLY_LOGGED_OUT: "KP MP Successfully Logged Out",
1512
+ KP_WHATSAPP_LOGGED_IN: "KP Whatsapp Logged In",
1513
+ KP_MP_TRUECALLER_LOGGED_IN: "KP MP Truecaller Logged In",
1514
+ KP_MP_WHATSAPP_LOGGED_IN: "KP MP Whatsapp Logged In",
1515
+ KP_TRUECALLER_LOGGED_IN: "KP Truecaller Logged In",
1516
+ KP_SHOPIFY_LOGGED_IN: "KP Shopify Logged In",
1517
+ KP_SUCCESSFULLY_LOGGED_OUT: "KP Successfully Logged Out"
1518
+ };
1519
+ var DEFAULT_CURRENCY = "INR";
1520
+ var HARDCODED_HANDLE = "ryze-gums";
1521
+
1522
+ // src/adapters/moengage-adapter.ts
1523
+ var import_web_sdk = __toESM(require("@moengage/web-sdk"));
1524
+ var MoengageAdapter = class extends BaseAdapter {
1525
+ constructor(config) {
1526
+ super(config);
1527
+ this.name = "MoEngage";
1528
+ this.sdk = null;
1529
+ this.initializeLogger();
1530
+ }
1531
+ /**
1532
+ * Initialize the MoenGage adapter using the Web SDK
1533
+ */
1534
+ async initialize() {
1535
+ if (this.initialized) {
1536
+ this.logger.debug("Already initialized");
1537
+ return;
1538
+ }
1539
+ if (typeof window === "undefined") {
1540
+ this.logger.debug("Skipping initialization on server");
1541
+ return;
1542
+ }
1543
+ try {
1544
+ const appId = this.getConfig("appId");
1545
+ if (!appId) {
1546
+ this.logger.warn("App ID is required for initialization");
1547
+ return;
1548
+ }
1549
+ const region = this.getConfig("region", "dc_01");
1550
+ const config = {
1551
+ app_id: appId,
1552
+ debug_logs: this.getConfig("debug", false) ? 1 : 0,
1553
+ cluster: region
1554
+ };
1555
+ this.logger.info("Initializing with config", {
1556
+ region,
1557
+ debug: this.getConfig("debug", false),
1558
+ appId: "***"
1559
+ // Hide sensitive data
1560
+ });
1561
+ import_web_sdk.default.initialize(config);
1562
+ this.sdk = window.Moengage;
1563
+ this.logger.info("Successfully initialized with SDK");
1564
+ this.initialized = true;
1565
+ } catch (error) {
1566
+ this.logger.error("Failed to initialize", error);
1567
+ }
1568
+ }
1569
+ /**
1570
+ * Track an event with MoenGage SDK
1571
+ * @param event The event to track
1572
+ */
1573
+ async trackEvent(event) {
1574
+ if (!this.initialized || typeof window === "undefined" || !this.sdk) {
1575
+ this.logger.warn(
1576
+ "Cannot track event, adapter not initialized or SDK not available",
1577
+ {
1578
+ eventType: event.type,
1579
+ initialized: this.initialized,
1580
+ hasWindow: typeof window !== "undefined",
1581
+ hasSdk: !!this.sdk
1582
+ }
1583
+ );
1584
+ return;
1585
+ }
1586
+ this.logger.debug("Tracking event", { eventType: event.type });
1587
+ switch (event.type) {
1588
+ case "page_view" /* PAGE_VIEW */:
1589
+ this.trackPageView(event);
1590
+ break;
1591
+ case "button_click" /* BUTTON_CLICK */:
1592
+ this.trackButtonClick(event);
1593
+ break;
1594
+ case "form_submission" /* FORM_SUBMISSION */:
1595
+ this.trackFormSubmission(event);
1596
+ break;
1597
+ case "product_view" /* PRODUCT_VIEW */:
1598
+ this.trackProductView(event);
1599
+ break;
1600
+ case "add_to_cart" /* ADD_TO_CART */:
1601
+ this.trackAddToCart(event);
1602
+ break;
1603
+ case "remove_from_cart" /* REMOVE_FROM_CART */:
1604
+ this.trackRemoveFromCart(event);
1605
+ break;
1606
+ case "checkout_started" /* CHECKOUT_STARTED */:
1607
+ this.trackCheckoutStarted(event);
1608
+ break;
1609
+ case "checkout_completed" /* CHECKOUT_COMPLETED */:
1610
+ this.trackCheckoutCompleted(event);
1611
+ break;
1612
+ case "search" /* SEARCH */:
1613
+ this.trackSearch(event);
1614
+ break;
1615
+ case "user_signup" /* USER_SIGNUP */:
1616
+ this.trackUserSignup(event);
1617
+ break;
1618
+ case "user_login" /* USER_LOGIN */:
1619
+ this.trackUserLogin(event);
1620
+ break;
1621
+ case "custom" /* CUSTOM */:
1622
+ this.trackCustomEvent(event);
1623
+ break;
1624
+ default:
1625
+ this.sdk.track_event(event.type, this.eventToParams(event));
1626
+ break;
1627
+ }
1628
+ }
1629
+ /**
1630
+ * Track a page view event
1631
+ * @param event The page view event
1632
+ */
1633
+ trackPageView(event) {
1634
+ if (!this.sdk?.track_event) {
1635
+ this.logger.warn("track_event not available for PageView event");
1636
+ return;
1637
+ }
1638
+ const eventData = {
1639
+ page_path: event.path,
1640
+ page_title: event.title,
1641
+ page_url: window.location.href,
1642
+ referrer: event.referrer || document.referrer
1643
+ };
1644
+ this.sdk.track_event(EventNames.PAGE_VIEWED, eventData);
1645
+ this.logger.debug("PageView event tracked", { eventData });
1646
+ }
1647
+ /**
1648
+ * Track a button click event
1649
+ * @param event The button click event
1650
+ */
1651
+ trackButtonClick(event) {
1652
+ this.sdk?.track_event(EventNames.BUTTON_CLICKED, {
1653
+ button_id: event.buttonId,
1654
+ button_text: event.buttonText,
1655
+ location: event.location
1656
+ });
1657
+ }
1658
+ /**
1659
+ * Track a form submission event
1660
+ * @param event The form submission event
1661
+ */
1662
+ trackFormSubmission(event) {
1663
+ this.sdk?.track_event(EventNames.FORM_SUBMITTED, {
1664
+ form_id: event.formId,
1665
+ form_name: event.formName,
1666
+ success: event.success
1667
+ });
1668
+ }
1669
+ /**
1670
+ * Track a product view event
1671
+ * @param event The product view event
1672
+ */
1673
+ trackProductView(event) {
1674
+ this.sdk?.track_event(EventNames.PRODUCT_VIEWED, {
1675
+ product_id: event.productId,
1676
+ product_name: event.productName,
1677
+ price: event.price,
1678
+ currency: event.currency || DEFAULT_CURRENCY,
1679
+ category: event.category
1680
+ });
1681
+ }
1682
+ /**
1683
+ * Track an add to cart event
1684
+ * @param event The add to cart event
1685
+ */
1686
+ trackAddToCart(event) {
1687
+ const quantity = event.quantity ?? 1;
1688
+ this.sdk?.track_event(EventNames.ADDED_TO_CART, {
1689
+ product_id: event.productId,
1690
+ product_name: event.productName,
1691
+ price: event.price,
1692
+ currency: event.currency || DEFAULT_CURRENCY,
1693
+ quantity,
1694
+ variant: event.variant,
1695
+ total_value: event.price * quantity
1696
+ });
1697
+ }
1698
+ /**
1699
+ * Track a remove from cart event
1700
+ * @param event The remove from cart event
1701
+ */
1702
+ trackRemoveFromCart(event) {
1703
+ this.sdk?.track_event(EventNames.REMOVED_FROM_CART, {
1704
+ product_id: event.productId,
1705
+ product_name: event.productName,
1706
+ price: event.price,
1707
+ currency: event.currency || DEFAULT_CURRENCY,
1708
+ quantity: event.quantity,
1709
+ variant: event.variant,
1710
+ total_value: event.price * event.quantity
1711
+ });
1712
+ }
1713
+ /**
1714
+ * Track a checkout started event
1715
+ * @param event The checkout started event
1716
+ */
1717
+ trackCheckoutStarted(event) {
1718
+ this.sdk?.track_event(EventNames.CHECKOUT_STARTED, {
1719
+ cart_value: event.cartValue,
1720
+ currency: event.currency || DEFAULT_CURRENCY,
1721
+ item_count: event.itemCount,
1722
+ items: event.items.map((item) => ({
1723
+ product_id: item.productId,
1724
+ product_name: item.productName,
1725
+ price: item.price,
1726
+ quantity: item.quantity,
1727
+ variant: item.variant
1728
+ }))
1729
+ });
1730
+ }
1731
+ /**
1732
+ * Track a checkout completed event
1733
+ * @param event The checkout completed event
1734
+ */
1735
+ trackCheckoutCompleted(event) {
1736
+ this.sdk?.track_event(EventNames.PURCHASE_COMPLETED, {
1737
+ order_id: event.orderId,
1738
+ cart_value: event.cartValue,
1739
+ currency: event.currency || DEFAULT_CURRENCY,
1740
+ item_count: event.itemCount,
1741
+ items: event.items.map((item) => ({
1742
+ product_id: item.productId,
1743
+ product_name: item.productName,
1744
+ price: item.price,
1745
+ quantity: item.quantity,
1746
+ variant: item.variant
1747
+ }))
1748
+ });
1749
+ }
1750
+ /**
1751
+ * Track a search event
1752
+ * @param event The search event
1753
+ */
1754
+ trackSearch(event) {
1755
+ this.sdk?.track_event(EventNames.SEARCH, {
1756
+ search_term: event.searchTerm,
1757
+ results_count: event.resultsCount
1758
+ });
1759
+ }
1760
+ /**
1761
+ * Track a user signup event
1762
+ * @param event The user signup event
1763
+ */
1764
+ trackUserSignup(event) {
1765
+ this.sdk?.track_event(EventNames.USER_SIGNED_UP, {
1766
+ user_id: event.userId,
1767
+ method: event.method,
1768
+ success: event.success
1769
+ });
1770
+ if (event.userId && this.getConfig("enableUserIdentification", true)) {
1771
+ this.sdk?.add_unique_user_id(event.userId);
1772
+ }
1773
+ }
1774
+ /**
1775
+ * Track a user login event
1776
+ * @param event The user login event
1777
+ */
1778
+ trackUserLogin(event) {
1779
+ this.sdk?.track_event(EventNames.USER_LOGGED_IN, {
1780
+ user_id: event.userId,
1781
+ method: event.method,
1782
+ success: event.success
1783
+ });
1784
+ if (event.userId && this.getConfig("enableUserIdentification", true)) {
1785
+ this.sdk?.add_unique_user_id(event.userId);
1786
+ }
1787
+ }
1788
+ /**
1789
+ * Track a custom event
1790
+ * @param event The custom event
1791
+ */
1792
+ trackCustomEvent(event) {
1793
+ this.sdk?.track_event(event.name, event.properties);
1794
+ }
1795
+ /**
1796
+ * Convert an event to MoenGage parameters
1797
+ * @param event The event to convert
1798
+ */
1799
+ eventToParams(event) {
1800
+ const { type, timestamp, ...params } = event;
1801
+ return params;
1802
+ }
1803
+ /**
1804
+ * Set user attributes in MoenGage
1805
+ * @param attributes User attributes to set
1806
+ */
1807
+ setUserAttributes(attributes) {
1808
+ if (!this.initialized || typeof window === "undefined" || !this.sdk) {
1809
+ this.logger.warn("Cannot set user attributes, adapter not initialized");
1810
+ return;
1811
+ }
1812
+ this.logger.debug("Setting user attributes", {
1813
+ attributeKeys: Object.keys(attributes)
1814
+ });
1815
+ for (const [key, value] of Object.entries(attributes)) {
1816
+ switch (key) {
1817
+ case "firstName":
1818
+ this.sdk?.add_first_name(value);
1819
+ break;
1820
+ case "lastName":
1821
+ this.sdk?.add_last_name(value);
1822
+ break;
1823
+ case "email":
1824
+ this.sdk?.add_email(value);
1825
+ break;
1826
+ case "mobile":
1827
+ this.sdk?.add_mobile(value);
1828
+ break;
1829
+ case "username":
1830
+ this.sdk?.add_user_name(value);
1831
+ break;
1832
+ case "gender":
1833
+ this.sdk?.add_gender(value);
1834
+ break;
1835
+ case "birthday":
1836
+ this.sdk?.add_birthday(value);
1837
+ break;
1838
+ case "userId":
1839
+ this.sdk?.add_unique_user_id(value);
1840
+ break;
1841
+ default:
1842
+ this.sdk?.add_user_attribute(key, value);
1843
+ break;
1844
+ }
1845
+ }
1846
+ }
1847
+ };
1848
+
1849
+ // src/adapters/posthog-adapter.ts
1850
+ var PostHogAdapter = class extends BaseAdapter {
1851
+ constructor(config = {}) {
1852
+ super(config);
1853
+ this.name = "PostHog";
1854
+ this.initializeLogger();
1855
+ }
1856
+ /**
1857
+ * Initialize PostHog
1858
+ */
1859
+ async initialize() {
1860
+ if (this.initialized) {
1861
+ this.logger.debug("Already initialized");
1862
+ return;
1863
+ }
1864
+ if (typeof window === "undefined") {
1865
+ this.logger.debug("Skipping initialization on server");
1866
+ return;
1867
+ }
1868
+ if (!window.posthog) {
1869
+ this.logger.warn(
1870
+ "PostHog object not found. Make sure the script is loaded."
1871
+ );
1872
+ return;
1873
+ }
1874
+ this.logger.info("Successfully initialized");
1875
+ this.initialized = true;
1876
+ }
1877
+ /**
1878
+ * Track an event with PostHog
1879
+ * @param event The event to track
1880
+ */
1881
+ async trackEvent(event) {
1882
+ if (!this.initialized || typeof window === "undefined" || !window.posthog) {
1883
+ this.logger.warn(
1884
+ "Cannot track event, adapter not initialized or posthog not available",
1885
+ {
1886
+ eventType: event.type,
1887
+ initialized: this.initialized,
1888
+ hasWindow: typeof window !== "undefined",
1889
+ hasPosthog: !!window?.posthog
1890
+ }
1891
+ );
1892
+ return;
1893
+ }
1894
+ this.logger.debug("Tracking event", { eventType: event.type });
1895
+ switch (event.type) {
1896
+ case "page_view" /* PAGE_VIEW */:
1897
+ this.trackPageView(event);
1898
+ break;
1899
+ case "product_view" /* PRODUCT_VIEW */:
1900
+ this.trackProductView(event);
1901
+ break;
1902
+ case "add_to_cart" /* ADD_TO_CART */:
1903
+ this.trackAddToCart(event);
1904
+ break;
1905
+ case "checkout_started" /* CHECKOUT_STARTED */:
1906
+ this.trackCheckoutStarted(event);
1907
+ break;
1908
+ case "checkout_completed" /* CHECKOUT_COMPLETED */:
1909
+ this.trackCheckoutCompleted(event);
1910
+ break;
1911
+ case "add_payment_info" /* ADD_PAYMENT_INFO */:
1912
+ this.trackAddPaymentInfo(event);
1913
+ break;
1914
+ case "search" /* SEARCH */:
1915
+ this.trackSearch(event);
1916
+ break;
1917
+ default:
1918
+ const params = this.eventToParams(event);
1919
+ window.posthog?.capture(
1920
+ event.type,
1921
+ this.enhanceWithAffiliateParams(params)
1922
+ );
1923
+ break;
1924
+ }
1925
+ }
1926
+ /**
1927
+ * Track a page view event
1928
+ * @param event The page view event
1929
+ */
1930
+ trackPageView(event) {
1931
+ const params = {
1932
+ path: event.path,
1933
+ title: event.title,
1934
+ referrer: event.referrer
1935
+ };
1936
+ window.posthog?.capture(
1937
+ "$pageview",
1938
+ this.enhanceWithAffiliateParams(params)
1939
+ );
1940
+ }
1941
+ /**
1942
+ * Track a product view event
1943
+ * @param event The product view event
1944
+ */
1945
+ trackProductView(event) {
1946
+ const params = {
1947
+ product_id: event.productId,
1948
+ product_name: event.productName,
1949
+ category: event.category,
1950
+ price: event.price,
1951
+ currency: event.currency || "INR"
1952
+ };
1953
+ window.posthog?.capture(
1954
+ "product_viewed",
1955
+ this.enhanceWithAffiliateParams(params)
1956
+ );
1957
+ }
1958
+ /**
1959
+ * Track an add to cart event
1960
+ * @param event The add to cart event
1961
+ */
1962
+ trackAddToCart(event) {
1963
+ this.logger.debug("Handling ADD_TO_CART event", { event });
1964
+ const params = {
1965
+ product_id: event.productId,
1966
+ product_name: event.productName,
1967
+ price: event.price,
1968
+ currency: event.currency || "INR",
1969
+ quantity: event.quantity,
1970
+ variant: event.variant
1971
+ };
1972
+ this.logger.debug("Sending to PostHog with params", { params });
1973
+ if (!window.posthog) {
1974
+ this.logger.error("window.posthog is not available");
1975
+ return;
1976
+ }
1977
+ window.posthog.capture(
1978
+ "add_to_cart",
1979
+ this.enhanceWithAffiliateParams(params)
1980
+ );
1981
+ this.logger.debug("Event sent to PostHog successfully");
1982
+ }
1983
+ /**
1984
+ * Track a checkout started event
1985
+ * @param event The checkout started event
1986
+ */
1987
+ trackCheckoutStarted(event) {
1988
+ const params = {
1989
+ cart_value: event.cartValue,
1990
+ currency: event.currency || "INR",
1991
+ item_count: event.itemCount,
1992
+ items: event.items.map((item) => ({
1993
+ product_id: item.productId,
1994
+ product_name: item.productName,
1995
+ price: item.price,
1996
+ quantity: item.quantity,
1997
+ variant: item.variant
1998
+ }))
1999
+ };
2000
+ window.posthog?.capture(
2001
+ "checkout_started",
2002
+ this.enhanceWithAffiliateParams(params)
2003
+ );
2004
+ }
2005
+ /**
2006
+ * Track a checkout completed event
2007
+ * @param event The checkout completed event
2008
+ */
2009
+ trackCheckoutCompleted(event) {
2010
+ const params = {
2011
+ order_id: event.orderId,
2012
+ cart_value: event.cartValue,
2013
+ currency: event.currency || "INR",
2014
+ item_count: event.itemCount,
2015
+ items: event.items.map((item) => ({
2016
+ product_id: item.productId,
2017
+ product_name: item.productName,
2018
+ price: item.price,
2019
+ quantity: item.quantity,
2020
+ variant: item.variant
2021
+ }))
2022
+ };
2023
+ window.posthog?.capture(
2024
+ "purchase",
2025
+ this.enhanceWithAffiliateParams(params)
2026
+ );
2027
+ }
2028
+ /**
2029
+ * Track a search event
2030
+ * @param event The search event
2031
+ */
2032
+ trackSearch(event) {
2033
+ const params = {
2034
+ search_term: event.searchTerm,
2035
+ results_count: event.resultsCount,
2036
+ content_ids: event.content_ids
2037
+ };
2038
+ window.posthog?.capture("search", this.enhanceWithAffiliateParams(params));
2039
+ }
2040
+ /**
2041
+ * Track an add payment info event
2042
+ * @param event The add payment info event
2043
+ */
2044
+ trackAddPaymentInfo(event) {
2045
+ const params = {
2046
+ cart_value: event.cartValue,
2047
+ currency: event.currency || "INR",
2048
+ payment_type: event.paymentType,
2049
+ item_count: event.itemCount,
2050
+ items: event.items.map((item) => ({
2051
+ product_id: item.productId,
2052
+ product_name: item.productName,
2053
+ price: item.price,
2054
+ quantity: item.quantity,
2055
+ variant: item.variant
2056
+ }))
2057
+ };
2058
+ window.posthog?.capture(
2059
+ "add_payment_info",
2060
+ this.enhanceWithAffiliateParams(params)
2061
+ );
2062
+ }
2063
+ /**
2064
+ * Convert an event to PostHog parameters
2065
+ * @param event The event to convert
2066
+ */
2067
+ eventToParams(event) {
2068
+ const { type, timestamp, ...params } = event;
2069
+ return params;
2070
+ }
2071
+ };
2072
+
2073
+ // src/adapters/shopify-adapter.ts
2074
+ var import_hydrogen_react = require("@shopify/hydrogen-react");
2075
+
2076
+ // src/events/init.ts
2077
+ async function initializeEventTracking(adapters) {
2078
+ const { eventSubscriber: eventSubscriber2 } = await Promise.resolve().then(() => (init_subscriber(), subscriber_exports));
2079
+ for (const adapter of adapters) {
2080
+ eventSubscriber2.registerAdapter(adapter);
2081
+ }
2082
+ await eventSubscriber2.initialize();
2083
+ }
2084
+ async function initTracking(config) {
2085
+ console.log("Initializing event tracking system...");
2086
+ const adapters = [];
2087
+ if (config.pixelId) {
2088
+ const pixelAdapter = new PixelAdapter({
2089
+ pixelId: config.pixelId
2090
+ });
2091
+ adapters.push(pixelAdapter);
2092
+ }
2093
+ if (config.gaId) {
2094
+ const gaAdapter = new GoogleAdapter({
2095
+ measurementId: config.gaId
2096
+ });
2097
+ adapters.push(gaAdapter);
2098
+ }
2099
+ if (config.moengageAppId) {
2100
+ const moengageAdapter = new MoengageAdapter({
2101
+ appId: config.moengageAppId,
2102
+ enableUserIdentification: true,
2103
+ region: config.moengageRegion || "dc_01",
2104
+ debug: config.enableDebugLogs || false
2105
+ });
2106
+ adapters.push(moengageAdapter);
2107
+ }
2108
+ const posthogAdapter = new PostHogAdapter({
2109
+ enableDebugLogs: config.enableDebugLogs || false
2110
+ });
2111
+ adapters.push(posthogAdapter);
2112
+ console.log(
2113
+ "Configured adapters:",
2114
+ adapters.map((a) => a.name)
2115
+ );
2116
+ await initializeEventTracking(adapters);
2117
+ console.log("Event tracking system initialized successfully");
2118
+ }
2119
+ // Annotate the CommonJS export names for ESM import in node:
2120
+ 0 && (module.exports = {
2121
+ DEFAULT_CURRENCY,
2122
+ EventNames,
2123
+ EventType,
2124
+ HARDCODED_HANDLE,
2125
+ eventPublisher,
2126
+ eventSubscriber,
2127
+ initTracking,
2128
+ initializeEventTracking,
2129
+ publishEvent
2130
+ });
2131
+ //# sourceMappingURL=index.js.map