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.
- package/LICENSE +21 -0
- package/README.md +769 -0
- package/dist/adapters/index.d.mts +4 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.js +2405 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +23 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/affiliate/index.d.mts +138 -0
- package/dist/affiliate/index.d.ts +138 -0
- package/dist/affiliate/index.js +816 -0
- package/dist/affiliate/index.js.map +1 -0
- package/dist/affiliate/index.mjs +74 -0
- package/dist/affiliate/index.mjs.map +1 -0
- package/dist/affiliate-tracker-BgHwibPv.d.mts +144 -0
- package/dist/affiliate-tracker-BgHwibPv.d.ts +144 -0
- package/dist/chunk-3TQR5DOP.mjs +79 -0
- package/dist/chunk-3TQR5DOP.mjs.map +1 -0
- package/dist/chunk-4MZH5OLR.mjs +2375 -0
- package/dist/chunk-4MZH5OLR.mjs.map +1 -0
- package/dist/chunk-JVEGG6JV.mjs +213 -0
- package/dist/chunk-JVEGG6JV.mjs.map +1 -0
- package/dist/chunk-P4OJDCEZ.mjs +57 -0
- package/dist/chunk-P4OJDCEZ.mjs.map +1 -0
- package/dist/chunk-TNXTKEGS.mjs +758 -0
- package/dist/chunk-TNXTKEGS.mjs.map +1 -0
- package/dist/events/index.d.mts +112 -0
- package/dist/events/index.d.ts +112 -0
- package/dist/events/index.js +2131 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/index.mjs +30 -0
- package/dist/events/index.mjs.map +1 -0
- package/dist/index-BnNRgdUv.d.ts +676 -0
- package/dist/index-GODWc1s6.d.mts +676 -0
- package/dist/index.d.mts +38 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +3269 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +190 -0
- package/dist/index.mjs.map +1 -0
- package/dist/subscriber-43gnCKWe.d.ts +80 -0
- package/dist/subscriber-IFZJU57V.mjs +8 -0
- package/dist/subscriber-IFZJU57V.mjs.map +1 -0
- package/dist/subscriber-sWesj_5p.d.mts +80 -0
- package/dist/types.d.mts +991 -0
- package/dist/types.d.ts +991 -0
- package/dist/types.js +102 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +8 -0
- package/dist/types.mjs.map +1 -0
- 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
|