@nemme/js-sdk 0.7.0 → 0.8.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/dist/chunks/{client-DhycnG8v.js → client-DNUAujt4.js} +62 -50
- package/dist/chunks/client-DNUAujt4.js.map +1 -0
- package/dist/chunks/client-TSUaCkOO.js +2 -0
- package/dist/chunks/client-TSUaCkOO.js.map +1 -0
- package/dist/client.d.ts +3 -1
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +2 -2
- package/dist/nemme-sdk.umd.js +13 -5
- package/dist/nemme-sdk.umd.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.esm.js +1 -1
- package/dist/tracking/tracking-manager.d.ts +4 -1
- package/package.json +1 -1
- package/dist/chunks/client-BF32gejA.js +0 -2
- package/dist/chunks/client-BF32gejA.js.map +0 -1
- package/dist/chunks/client-DhycnG8v.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { h
|
|
1
|
+
import { h, l as u } from "./httpClient-D2IO92uv.js";
|
|
2
2
|
class f {
|
|
3
3
|
logger;
|
|
4
4
|
headers;
|
|
@@ -10,7 +10,7 @@ class f {
|
|
|
10
10
|
}
|
|
11
11
|
async loadDeliveries() {
|
|
12
12
|
this.logger.debug("Loading deliveries");
|
|
13
|
-
const e = await
|
|
13
|
+
const e = await h.get("/external/deliveries", { headers: this.headers });
|
|
14
14
|
if (!e.ok) {
|
|
15
15
|
this.logger.error("Failed to load deliveries", e.error), this.deliveries = [];
|
|
16
16
|
return;
|
|
@@ -54,7 +54,7 @@ class f {
|
|
|
54
54
|
try {
|
|
55
55
|
const r = await this.createDeliveryResponse(e);
|
|
56
56
|
if (!this.formManager) {
|
|
57
|
-
const s = await import("./form-manager-DRUgPPf5.js").then((
|
|
57
|
+
const s = await import("./form-manager-DRUgPPf5.js").then((n) => n.f);
|
|
58
58
|
this.formManager = new s.FormManager(this.logger, this.headers, this.formConfig);
|
|
59
59
|
}
|
|
60
60
|
await this.formManager.fetchAndDisplayForm(
|
|
@@ -78,23 +78,23 @@ class f {
|
|
|
78
78
|
} catch {
|
|
79
79
|
i = e.startsWith("/") ? e : `/${e}`;
|
|
80
80
|
}
|
|
81
|
-
const r = (
|
|
82
|
-
if (!
|
|
83
|
-
let d =
|
|
81
|
+
const r = (g) => {
|
|
82
|
+
if (!g) return "/";
|
|
83
|
+
let d = g.startsWith("/") ? g : `/${g}`;
|
|
84
84
|
return d.length > 1 && d.endsWith("/") && (d = d.slice(0, -1)), d;
|
|
85
|
-
}, s = r(i),
|
|
85
|
+
}, s = r(i), n = r(t), a = n.replace(/\*\*/g, "§DOUBLE_STAR§").replace(/\*/g, "§SINGLE_STAR§").replace(/\?/g, "§QUESTION§").replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/§SINGLE_STAR§/g, "[^/]*").replace(/§DOUBLE_STAR§/g, ".*").replace(/§QUESTION§/g, "."), o = new RegExp(`^${a}$`).test(s);
|
|
86
86
|
return this.logger.debug("URL pattern matching", {
|
|
87
87
|
originalUrl: e,
|
|
88
88
|
pathname: i,
|
|
89
89
|
normalizedPathname: s,
|
|
90
90
|
pattern: t,
|
|
91
|
-
normalizedPattern:
|
|
92
|
-
regexPattern:
|
|
93
|
-
matches:
|
|
94
|
-
}),
|
|
91
|
+
normalizedPattern: n,
|
|
92
|
+
regexPattern: a,
|
|
93
|
+
matches: o
|
|
94
|
+
}), o;
|
|
95
95
|
}
|
|
96
96
|
async createDeliveryResponse(e) {
|
|
97
|
-
const t = await
|
|
97
|
+
const t = await h.post(
|
|
98
98
|
`/external/deliveries/${e.id}/responses`,
|
|
99
99
|
{},
|
|
100
100
|
{ headers: this.headers }
|
|
@@ -107,7 +107,7 @@ class f {
|
|
|
107
107
|
}
|
|
108
108
|
async updateDeliveryResponse(e, t, i = !1, r = !1) {
|
|
109
109
|
try {
|
|
110
|
-
await
|
|
110
|
+
await h.patch(
|
|
111
111
|
`/external/deliveries/${e}/responses/${t}`,
|
|
112
112
|
{ wasDismissed: i, wasCompleted: r },
|
|
113
113
|
{ headers: this.headers }
|
|
@@ -117,7 +117,7 @@ class f {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
async isDeliveryValid(e) {
|
|
120
|
-
const t = await
|
|
120
|
+
const t = await h.get(`/external/deliveries/${e.id}/should-deliver`, {
|
|
121
121
|
headers: this.headers
|
|
122
122
|
});
|
|
123
123
|
return t.ok ? t.data : (this.logger.error(`Failed to check delivery validity for delivery: ${e.id}`, t.error), !1);
|
|
@@ -131,6 +131,7 @@ class y {
|
|
|
131
131
|
onPageView;
|
|
132
132
|
onEvent;
|
|
133
133
|
trackUrlParamChanges = !0;
|
|
134
|
+
getPage;
|
|
134
135
|
// Batching
|
|
135
136
|
backlog = [];
|
|
136
137
|
flushTimeout = null;
|
|
@@ -151,11 +152,12 @@ class y {
|
|
|
151
152
|
sessionId: i,
|
|
152
153
|
eventDefinitions: r,
|
|
153
154
|
batchConfig: s,
|
|
154
|
-
onPageView:
|
|
155
|
-
onEvent:
|
|
156
|
-
trackUrlParamChanges: l
|
|
155
|
+
onPageView: n,
|
|
156
|
+
onEvent: a,
|
|
157
|
+
trackUrlParamChanges: l,
|
|
158
|
+
getPage: o
|
|
157
159
|
}) {
|
|
158
|
-
this.logger = e, this.headers = t, this.sessionId = i, this.eventDefinitions = r, this.onPageView =
|
|
160
|
+
this.logger = e, this.headers = t, this.sessionId = i, this.eventDefinitions = r, this.onPageView = n, this.onEvent = a, this.getPage = o, typeof l == "boolean" && (this.trackUrlParamChanges = l), this.flushEvents = this.flushEvents.bind(this), this.handlePopState = this.handlePopState.bind(this), this.handleVisibilityChange = this.handleVisibilityChange.bind(this), this.setupBatching(s);
|
|
159
161
|
}
|
|
160
162
|
setupBatching(e) {
|
|
161
163
|
typeof e == "boolean" ? this.batchConfig.enabled = e : e && (this.batchConfig = {
|
|
@@ -185,18 +187,18 @@ class y {
|
|
|
185
187
|
}
|
|
186
188
|
const { eventKey: t, data: i = {} } = e;
|
|
187
189
|
this.logger.debug("Tracking event", { eventKey: t, data: i });
|
|
188
|
-
const r =
|
|
190
|
+
const r = this.getPageUrl(), s = {
|
|
189
191
|
sessionId: this.sessionId,
|
|
190
192
|
eventKey: t,
|
|
191
193
|
data: i || {},
|
|
192
194
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
193
195
|
page: r
|
|
194
196
|
};
|
|
195
|
-
this.sanitizeEventData(s) && (this.validateEvent(s), this.batchConfig.enabled ? (this.backlog.push(s), this.scheduleFlush()) : await this.sendEvents([s]), t === this.EVENT_PAGE_VIEW ? this.onPageView?.(
|
|
197
|
+
this.sanitizeEventData(s) && (this.validateEvent(s), this.batchConfig.enabled ? (this.backlog.push(s), this.scheduleFlush()) : await this.sendEvents([s]), t === this.EVENT_PAGE_VIEW ? this.onPageView?.(r) : this.onEvent?.(s, r));
|
|
196
198
|
}
|
|
197
199
|
async trackPageView() {
|
|
198
200
|
if (typeof window > "u") return;
|
|
199
|
-
const e =
|
|
201
|
+
const e = this.getPageUrl();
|
|
200
202
|
if (!this.trackUrlParamChanges) {
|
|
201
203
|
const t = this.getPageKeyWithoutQuery(e);
|
|
202
204
|
if (this.lastTrackedPageKey === t)
|
|
@@ -210,6 +212,12 @@ class y {
|
|
|
210
212
|
}
|
|
211
213
|
});
|
|
212
214
|
}
|
|
215
|
+
getPageUrl() {
|
|
216
|
+
if (this.getPage)
|
|
217
|
+
return this.getPage();
|
|
218
|
+
const e = window.location.href;
|
|
219
|
+
return window.location.protocol === "file:" ? `/${window.location.pathname.split("/").pop() || ""}${window.location.hash}` : e;
|
|
220
|
+
}
|
|
213
221
|
getPageKeyWithoutQuery(e) {
|
|
214
222
|
try {
|
|
215
223
|
const t = new URL(e);
|
|
@@ -257,13 +265,13 @@ class y {
|
|
|
257
265
|
const i = t.properties, r = e.data;
|
|
258
266
|
if (r)
|
|
259
267
|
for (const s of Object.keys(r)) {
|
|
260
|
-
const
|
|
261
|
-
if (!
|
|
268
|
+
const n = r[s], a = i.find((l) => l.name === s);
|
|
269
|
+
if (!a) {
|
|
262
270
|
this.logger.warn(`Property ${s} is not registered for event ${e.eventKey}`);
|
|
263
271
|
continue;
|
|
264
272
|
}
|
|
265
|
-
typeof
|
|
266
|
-
`Property ${
|
|
273
|
+
typeof n !== a.type && this.logger.warn(
|
|
274
|
+
`Property ${a.name} has type ${a.type} but value is of type ${typeof n}`
|
|
267
275
|
);
|
|
268
276
|
}
|
|
269
277
|
}
|
|
@@ -296,9 +304,9 @@ class y {
|
|
|
296
304
|
if (e.length !== 0)
|
|
297
305
|
if (e.length === 1) {
|
|
298
306
|
const t = e[0];
|
|
299
|
-
await
|
|
307
|
+
await h.post("/external/trackings/track", t, { headers: this.headers });
|
|
300
308
|
} else
|
|
301
|
-
await
|
|
309
|
+
await h.post("/external/trackings/batch", e, { headers: this.headers });
|
|
302
310
|
}
|
|
303
311
|
}
|
|
304
312
|
class p {
|
|
@@ -328,30 +336,33 @@ class p {
|
|
|
328
336
|
*/
|
|
329
337
|
async init({
|
|
330
338
|
userIdentifier: e,
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
339
|
+
secretKey: t,
|
|
340
|
+
debug: i = !1,
|
|
341
|
+
batch: r,
|
|
342
|
+
formConfig: s,
|
|
343
|
+
deactivate: n = !1,
|
|
344
|
+
trackUrlParamChanges: a,
|
|
345
|
+
getPage: l
|
|
336
346
|
}) {
|
|
337
|
-
if (this._initialized = !1, this._lastInitError = null, this.trackingManager?.destroy(), this.trackingManager = void 0,
|
|
347
|
+
if (this._initialized = !1, this._lastInitError = null, this.trackingManager?.destroy(), this.trackingManager = void 0, n)
|
|
338
348
|
return this.clientLogger.info("Nemme client deactivated and will stop initialization."), this._initialized = !0, this._lastInitError = null, this.clientLogger.configure({ enabled: !1 }), this;
|
|
339
349
|
if (!e) throw new Error("userIdentifier is required parameter");
|
|
340
350
|
this._userIdentifier = e, this.clientLogger.configure({
|
|
341
|
-
enabled:
|
|
342
|
-
level:
|
|
351
|
+
enabled: i,
|
|
352
|
+
level: i ? "debug" : "info"
|
|
343
353
|
}), this.headers = {
|
|
344
354
|
"X-Client-Key": this.clientKey,
|
|
345
|
-
"X-User-Id": this._userIdentifier
|
|
346
|
-
|
|
355
|
+
"X-User-Id": this._userIdentifier,
|
|
356
|
+
...t && { "X-Client-Secret": t }
|
|
357
|
+
}, this.formConfig = s;
|
|
347
358
|
try {
|
|
348
|
-
const
|
|
349
|
-
await this.initializeManagers(
|
|
359
|
+
const o = await this.initializeSession();
|
|
360
|
+
await this.initializeManagers(o, r, a, l), this._initialized = !0, this._lastInitError = null, this.clientLogger.info("Nemme client initialized", {
|
|
350
361
|
clientKey: this.clientKey,
|
|
351
362
|
userIdentifier: this._userIdentifier
|
|
352
363
|
});
|
|
353
|
-
} catch (
|
|
354
|
-
this.clientLogger.error("Error during initialization:",
|
|
364
|
+
} catch (o) {
|
|
365
|
+
this.clientLogger.error("Error during initialization:", o), this._initialized = !1, this._lastInitError = o instanceof Error ? o : new Error("Error during initialization");
|
|
355
366
|
}
|
|
356
367
|
return this;
|
|
357
368
|
}
|
|
@@ -370,7 +381,7 @@ class p {
|
|
|
370
381
|
}
|
|
371
382
|
async initializeSession() {
|
|
372
383
|
try {
|
|
373
|
-
const e = await
|
|
384
|
+
const e = await h.post(
|
|
374
385
|
"/external/trackings/initialize",
|
|
375
386
|
{},
|
|
376
387
|
{ headers: this.headers }
|
|
@@ -382,27 +393,28 @@ class p {
|
|
|
382
393
|
throw this.clientLogger.error("Error during initialization", e), e;
|
|
383
394
|
}
|
|
384
395
|
}
|
|
385
|
-
async initializeManagers(e, t, i) {
|
|
386
|
-
const
|
|
396
|
+
async initializeManagers(e, t, i, r) {
|
|
397
|
+
const s = new f(this.clientLogger, this.headers, this.formConfig), n = new y({
|
|
387
398
|
logger: this.clientLogger,
|
|
388
399
|
headers: this.headers,
|
|
389
400
|
sessionId: e.sessionId,
|
|
390
401
|
eventDefinitions: e.eventDefinitions,
|
|
391
402
|
batchConfig: t,
|
|
392
403
|
trackUrlParamChanges: i,
|
|
404
|
+
getPage: r,
|
|
393
405
|
onPageView: async (a) => {
|
|
394
|
-
await
|
|
406
|
+
await s.evaluateDeliveryTriggers({ url: a });
|
|
395
407
|
},
|
|
396
|
-
onEvent: async (a,
|
|
397
|
-
await
|
|
408
|
+
onEvent: async (a, l) => {
|
|
409
|
+
await s.evaluateDeliveryTriggers({ eventKey: a.eventKey, eventData: a.data, url: l });
|
|
398
410
|
}
|
|
399
411
|
});
|
|
400
|
-
await
|
|
412
|
+
await s.loadDeliveries(), typeof window < "u" && (await n.setupPageViewTracking(), await n.trackPageView(), await n.flush()), this.trackingManager = n;
|
|
401
413
|
}
|
|
402
414
|
}
|
|
403
|
-
const w = (
|
|
415
|
+
const w = (c) => new p(c);
|
|
404
416
|
export {
|
|
405
417
|
p as N,
|
|
406
418
|
w as i
|
|
407
419
|
};
|
|
408
|
-
//# sourceMappingURL=client-
|
|
420
|
+
//# sourceMappingURL=client-DNUAujt4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-DNUAujt4.js","sources":["../../src/deliveries/delivery-manager.ts","../../src/tracking/tracking-manager.ts","../../src/client.ts"],"sourcesContent":["import { httpClient } from '../networking';\nimport type { FormConfig, ProductType } from '../types/forms';\nimport { Logger } from '../utils';\n\nexport type Trigger = {\n triggerType: 'page_url' | 'custom_event';\n urlPattern?: string;\n eventKey?: string;\n};\n\nexport type Channel = {\n channelType: string;\n channelStyle: string;\n};\n\nexport type Audience = {\n audienceType: string;\n};\n\nexport type Frequency = {\n frequencyType: string;\n};\n\nexport type Delivery = {\n id: number;\n productSlug: string;\n productType: ProductType;\n triggers: Trigger[];\n // channels: Channel[];\n // audiences: Audience[];\n // frequency: Frequency| null;\n};\n\nexport type DeliveryResponse = {\n id: number;\n shownAt: string;\n wasDismissed: boolean;\n wasCompleted: boolean;\n userId: string;\n respondedAt: string;\n};\n\nexport type TriggerContext = {\n url: string;\n eventKey?: string;\n eventData?: Record<string, unknown>;\n};\n\nexport class DeliveryManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private formConfig?: FormConfig;\n private formManager?: {\n fetchAndDisplayForm: (\n productSlug: string,\n onDismiss: () => Promise<void>,\n onComplete: (formState?: unknown) => Promise<void>\n ) => Promise<void>;\n };\n private deliveries: Delivery[] = [];\n\n constructor(logger: Logger, headers: Record<string, string>, formConfig?: FormConfig) {\n this.logger = logger;\n this.headers = headers;\n this.formConfig = formConfig;\n }\n\n public async loadDeliveries(): Promise<void> {\n this.logger.debug('Loading deliveries');\n const response = await httpClient.get<Delivery[]>('/external/deliveries', { headers: this.headers });\n if (!response.ok) {\n this.logger.error('Failed to load deliveries', response.error);\n this.deliveries = [];\n return;\n }\n this.deliveries = response.data;\n this.logger.info(`Loaded ${this.deliveries.length} deliveries`);\n }\n\n public async evaluateDeliveryTriggers(context: TriggerContext): Promise<void> {\n for (const delivery of this.deliveries) {\n for (const trigger of delivery.triggers) {\n if (this.shouldTriggerDelivery(trigger, context)) {\n const deliveryValid = await this.isDeliveryValid(delivery);\n if (!deliveryValid) {\n this.logger.debug(`Delivery ${delivery.id} is not valid, skipping`);\n continue;\n }\n await this.executeDelivery(delivery, trigger);\n return; // Stop after first match\n }\n }\n }\n }\n\n private shouldTriggerDelivery(trigger: Trigger, context: TriggerContext): boolean {\n if (this.hasActiveDelivery()) {\n return false;\n }\n switch (trigger.triggerType) {\n case 'page_url':\n return trigger.urlPattern ? this.matchesUrlPattern(context.url, trigger.urlPattern) : true;\n case 'custom_event':\n return trigger.eventKey ? context.eventKey === trigger.eventKey : false;\n default:\n return false;\n }\n }\n\n private hasActiveDelivery(): boolean {\n return document.getElementById('nm') !== null;\n }\n\n private async executeDelivery(delivery: Delivery, trigger: Trigger): Promise<void> {\n const productType = delivery.productType;\n if (productType === 'FRM') {\n this.logger.debug(`Triggering form delivery: ${delivery.productSlug}`, {\n triggerType: trigger.triggerType,\n urlPattern: trigger.urlPattern,\n eventKey: trigger.eventKey\n });\n\n try {\n const deliveryResponse = await this.createDeliveryResponse(delivery);\n if (!this.formManager) {\n const mod = await import('../forms/form-manager');\n this.formManager = new mod.FormManager(this.logger, this.headers, this.formConfig);\n }\n await this.formManager.fetchAndDisplayForm(\n delivery.productSlug,\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was cancelled`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, true);\n },\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was completed`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, false, true);\n }\n );\n } catch (error) {\n this.logger.error(`Failed to load form for delivery: ${delivery.productSlug}`, error);\n }\n }\n }\n\n private matchesUrlPattern(url: string, pattern: string): boolean {\n // Extract pathname from URL (remove protocol, host, query params, etc.)\n let pathname: string;\n try {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n } catch {\n // If URL parsing fails, assume it's already a pathname\n pathname = url.startsWith('/') ? url : `/${url}`;\n }\n\n // Normalize paths: remove trailing slash (except for root) and ensure leading slash\n const normalizePath = (p: string): string => {\n if (!p) return '/';\n let s = p.startsWith('/') ? p : `/${p}`;\n if (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s;\n };\n\n const normalizedPathname = normalizePath(pathname);\n const normalizedPattern = normalizePath(pattern);\n\n // Convert glob pattern to regex\n // First, replace glob tokens with placeholders, then escape regex special chars, then restore\n const regexPattern = normalizedPattern\n .replace(/\\*\\*/g, '§DOUBLE_STAR§')\n .replace(/\\*/g, '§SINGLE_STAR§')\n .replace(/\\?/g, '§QUESTION§')\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex special characters\n .replace(/§SINGLE_STAR§/g, '[^/]*') // * matches anything except /\n .replace(/§DOUBLE_STAR§/g, '.*') // ** matches anything including /\n .replace(/§QUESTION§/g, '.'); // ? matches single character\n\n const regex = new RegExp(`^${regexPattern}$`);\n const result = regex.test(normalizedPathname);\n\n this.logger.debug(`URL pattern matching`, {\n originalUrl: url,\n pathname,\n normalizedPathname,\n pattern,\n normalizedPattern,\n regexPattern,\n matches: result\n });\n\n return result;\n }\n\n private async createDeliveryResponse(delivery: Delivery): Promise<DeliveryResponse | undefined> {\n const response = await httpClient.post<DeliveryResponse>(\n `/external/deliveries/${delivery.id}/responses`,\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n this.logger.error(`Failed to create delivery response for delivery: ${delivery.id}`, response.error);\n return undefined;\n }\n return response.data;\n }\n\n private async updateDeliveryResponse(\n deliveryId: number,\n deliveryResponseId: number,\n dismissed: boolean = false,\n completed: boolean = false\n ): Promise<void> {\n try {\n await httpClient.patch(\n `/external/deliveries/${deliveryId}/responses/${deliveryResponseId}`,\n { wasDismissed: dismissed, wasCompleted: completed },\n { headers: this.headers }\n );\n } catch (error) {\n this.logger.error(`Failed to update delivery response: ${deliveryResponseId} for delivery: ${deliveryId}`, error);\n }\n }\n\n private async isDeliveryValid(delivery: Delivery): Promise<boolean> {\n const response = await httpClient.get<boolean>(`/external/deliveries/${delivery.id}/should-deliver`, {\n headers: this.headers\n });\n if (!response.ok) {\n this.logger.error(`Failed to check delivery validity for delivery: ${delivery.id}`, response.error);\n return false;\n }\n return response.data;\n }\n}\n","import { httpClient } from '../networking';\nimport { Logger } from '../utils';\n\nexport type Config = {\n logger: Logger;\n headers: Record<string, string>;\n sessionId: number;\n eventDefinitions: EventDefinition[];\n batchConfig?: boolean | BatchConfig;\n onPageView?: (url: string) => Promise<void>;\n onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n trackUrlParamChanges?: boolean;\n getPage?: () => string;\n};\n\nexport type BatchConfig = {\n enabled?: boolean;\n size?: number;\n delayMs?: number;\n sendOnUnload?: boolean;\n};\n\nexport type TrackEventOptions<T extends string = string> = {\n eventKey: T;\n data?: Record<string, unknown>;\n};\n\ntype HistoryParams = Parameters<typeof history.pushState>;\n\ntype EventOptions = TrackEventOptions & {\n sessionId: number;\n timestamp: string;\n page: string;\n};\n\ntype EventProperties = {\n name: string;\n type: string;\n};\n\nexport type EventDefinition = {\n properties: EventProperties[];\n eventKey: string;\n};\n\n/**\n * Manages event tracking, batching, and page view tracking\n */\nexport class TrackingManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private sessionId?: number;\n private eventDefinitions: EventDefinition[] = [];\n private onPageView?: (url: string) => Promise<void>;\n private onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n private trackUrlParamChanges = true;\n private getPage?: () => string;\n\n // Batching\n private backlog: Array<EventOptions> = [];\n private flushTimeout: number | null = null;\n private batchConfig: Required<BatchConfig> = {\n enabled: true,\n size: 10,\n delayMs: 10000, // 10 seconds\n sendOnUnload: true\n };\n\n // Page view tracking\n private originalHistoryMethods: {\n pushState: typeof history.pushState;\n replaceState: typeof history.replaceState;\n } | null = null;\n\n private readonly EVENT_PAGE_VIEW = 'page_view';\n private lastTrackedPageKey?: string;\n\n constructor({\n logger,\n headers,\n sessionId,\n eventDefinitions,\n batchConfig,\n onPageView,\n onEvent,\n trackUrlParamChanges,\n getPage\n }: Config) {\n this.logger = logger;\n this.headers = headers;\n this.sessionId = sessionId;\n this.eventDefinitions = eventDefinitions;\n this.onPageView = onPageView;\n this.onEvent = onEvent;\n this.getPage = getPage;\n if (typeof trackUrlParamChanges === 'boolean') {\n this.trackUrlParamChanges = trackUrlParamChanges;\n }\n\n // Bind methods before setting up event listeners\n this.flushEvents = this.flushEvents.bind(this);\n this.handlePopState = this.handlePopState.bind(this);\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n\n this.setupBatching(batchConfig);\n }\n\n private setupBatching(batchConfig?: boolean | BatchConfig): void {\n if (typeof batchConfig === 'boolean') {\n this.batchConfig.enabled = batchConfig;\n } else if (batchConfig) {\n this.batchConfig = {\n ...this.batchConfig,\n ...batchConfig\n };\n }\n\n // Setup unload handler if batching is enabled\n if (this.batchConfig.enabled && this.batchConfig.sendOnUnload && typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this.flushEvents);\n window.addEventListener('pagehide', this.flushEvents);\n }\n }\n\n public async setupPageViewTracking(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n this.originalHistoryMethods = {\n pushState: history.pushState,\n replaceState: history.replaceState\n };\n\n const originalPushState = history.pushState;\n history.pushState = async (...args: HistoryParams) => {\n originalPushState.apply(history, args);\n await this.trackPageView();\n };\n\n const originalReplaceState = history.replaceState;\n history.replaceState = async (...args: HistoryParams) => {\n originalReplaceState.apply(history, args);\n await this.trackPageView();\n };\n\n window.addEventListener('popstate', this.handlePopState);\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.sessionId) {\n this.logger.warn('Tracking manager not initialized, cannot track event');\n return;\n }\n\n const { eventKey, data = {} } = options;\n this.logger.debug('Tracking event', { eventKey, data });\n const url = this.getPageUrl();\n const event: EventOptions = {\n sessionId: this.sessionId,\n eventKey,\n data: data || {},\n timestamp: new Date().toISOString(),\n page: url\n };\n\n if (!this.sanitizeEventData(event)) {\n return;\n }\n\n this.validateEvent(event);\n\n if (this.batchConfig.enabled) {\n this.backlog.push(event);\n this.scheduleFlush();\n } else {\n await this.sendEvents([event]);\n }\n\n if (eventKey === this.EVENT_PAGE_VIEW) {\n this.onPageView?.(url);\n } else {\n this.onEvent?.(event, url);\n }\n }\n\n public async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const url = this.getPageUrl();\n\n if (!this.trackUrlParamChanges) {\n const currentPageKey = this.getPageKeyWithoutQuery(url);\n\n if (this.lastTrackedPageKey === currentPageKey) {\n return;\n }\n\n this.lastTrackedPageKey = currentPageKey;\n }\n\n await this.track({\n eventKey: this.EVENT_PAGE_VIEW,\n data: {\n title: document.title\n }\n });\n }\n\n private getPageUrl(): string {\n if (this.getPage) {\n return this.getPage();\n }\n\n const url = window.location.href;\n\n if (window.location.protocol === 'file:') {\n const filename = window.location.pathname.split('/').pop() || '';\n return `/${filename}${window.location.hash}`;\n }\n\n return url;\n }\n\n private getPageKeyWithoutQuery(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}${parsed.hash}`;\n } catch {\n const [base] = url.split('?');\n return base;\n }\n }\n\n /**\n * Manually flush any pending events\n */\n public async flush(): Promise<void> {\n return this.flushEvents();\n }\n\n /**\n * Clean up event listeners and restore original history methods\n */\n public destroy(): void {\n if (this.originalHistoryMethods) {\n history.pushState = this.originalHistoryMethods.pushState;\n history.replaceState = this.originalHistoryMethods.replaceState;\n this.originalHistoryMethods = null;\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n window.removeEventListener('beforeunload', this.flushEvents);\n window.removeEventListener('pagehide', this.flushEvents);\n }\n\n // Clear any pending flush timeout\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n }\n\n private sanitizeEventData(event: EventOptions): boolean {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return true;\n if (!event.data) return true;\n\n const data = event.data;\n\n for (const key of Object.keys(data)) {\n const value = data[key];\n\n if (typeof value === 'string' && value === '[object Object]') {\n this.logger.error(`Property ${key} contains [object Object], dropping event ${event.eventKey}`);\n return false;\n }\n\n const valueType = typeof value;\n\n if (valueType !== 'boolean' && valueType !== 'number' && valueType !== 'string') {\n this.logger.warn(`Property ${key} has unsupported type ${valueType}, removing from event ${event.eventKey}`);\n delete data[key];\n continue;\n }\n\n if (typeof value === 'string') {\n data[key] = value.toLowerCase();\n }\n }\n\n return true;\n }\n\n private validateEvent(event: EventOptions): void {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return;\n\n const eventDefinition = this.eventDefinitions.find(def => def.eventKey === event.eventKey);\n if (!eventDefinition) {\n this.logger.warn(`Event ${event.eventKey} is not registered`);\n return;\n }\n\n const definedProperties = eventDefinition.properties;\n const eventProperties = event.data;\n if (!eventProperties) return;\n\n for (const eventPropertyKey of Object.keys(eventProperties)) {\n const eventProperty = eventProperties[eventPropertyKey];\n const definedProperty = definedProperties.find(prop => prop.name === eventPropertyKey);\n\n if (!definedProperty) {\n this.logger.warn(`Property ${eventPropertyKey} is not registered for event ${event.eventKey}`);\n continue;\n }\n\n if (typeof eventProperty !== definedProperty.type) {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n }\n }\n\n private async handlePopState(): Promise<void> {\n await this.trackPageView();\n }\n\n private async handleVisibilityChange(): Promise<void> {\n if (document.visibilityState === 'visible') {\n await this.trackPageView();\n }\n }\n\n private scheduleFlush(): void {\n if (this.backlog.length >= this.batchConfig.size) {\n this.flushEvents();\n return;\n }\n\n if (!this.flushTimeout) {\n this.flushTimeout = window.setTimeout(() => {\n this.flushEvents();\n }, this.batchConfig.delayMs);\n }\n }\n\n private async flushEvents(): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n if (this.backlog.length === 0) return;\n\n const eventsToSend = [...this.backlog];\n this.backlog = [];\n\n try {\n await this.sendEvents(eventsToSend);\n } catch (error) {\n this.backlog.unshift(...eventsToSend);\n this.logger.error('Failed to send batched events', error);\n }\n }\n\n private async sendEvents(events: Array<EventOptions>): Promise<void> {\n if (events.length === 0) return;\n\n if (events.length === 1) {\n const event = events[0];\n await httpClient.post('/external/trackings/track', event, { headers: this.headers });\n } else {\n await httpClient.post('/external/trackings/batch', events, { headers: this.headers });\n }\n }\n}\n","import { DeliveryManager } from './deliveries/delivery-manager';\nimport { httpClient, HttpResponse } from './networking';\nimport { BatchConfig, EventDefinition, TrackEventOptions, TrackingManager } from './tracking/tracking-manager';\nimport { FormConfig } from './types/forms';\nimport { Logger, logger } from './utils';\n\nexport type ClientConfigType = {\n userIdentifier: string;\n secretKey?: string;\n debug?: boolean;\n batch?: boolean | BatchConfig;\n formConfig?: FormConfig;\n deactivate?: boolean;\n trackUrlParamChanges?: boolean;\n getPage?: () => string;\n};\n\n// Re-export types for backward compatibility\nexport type { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';\n\ntype InitializeResponse = {\n sessionId: number;\n eventDefinitions: EventDefinition[];\n};\n\n/**\n * Main client class for the Nemme SDK\n * Coordinates initialization, tracking, and form management\n */\nexport class NemmeClient {\n readonly clientKey: string;\n private _userIdentifier?: string;\n private _initialized = false;\n private _lastInitError: Error | null = null;\n private clientLogger: Logger = logger.child('client');\n private headers: Record<string, string> = {};\n private formConfig?: FormConfig;\n\n get userIdentifier(): string | undefined {\n return this._userIdentifier;\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n get lastInitError(): Error | null {\n return this._lastInitError;\n }\n\n constructor(clientKey: string) {\n this.clientKey = clientKey;\n }\n\n // Module managers\n private trackingManager?: TrackingManager;\n\n /**\n * Create a new Nemme SDK client instance\n */\n public async init({\n userIdentifier,\n secretKey,\n debug = false,\n batch,\n formConfig,\n deactivate = false,\n trackUrlParamChanges,\n getPage\n }: ClientConfigType): Promise<NemmeClient> {\n this._initialized = false;\n this._lastInitError = null;\n this.trackingManager?.destroy();\n this.trackingManager = undefined;\n\n if (deactivate) {\n this.clientLogger.info('Nemme client deactivated and will stop initialization.');\n this._initialized = true;\n this._lastInitError = null;\n this.clientLogger.configure({ enabled: false });\n return this;\n }\n if (!userIdentifier) throw new Error('userIdentifier is required parameter');\n this._userIdentifier = userIdentifier;\n\n // Configure logger based on debug setting\n this.clientLogger.configure({\n enabled: debug,\n level: debug ? 'debug' : 'info'\n });\n\n this.headers = {\n 'X-Client-Key': this.clientKey,\n 'X-User-Id': this._userIdentifier,\n ...(secretKey && { 'X-Client-Secret': secretKey })\n };\n\n this.formConfig = formConfig;\n\n try {\n const session = await this.initializeSession();\n await this.initializeManagers(session, batch, trackUrlParamChanges, getPage);\n this._initialized = true;\n this._lastInitError = null;\n this.clientLogger.info('Nemme client initialized', {\n clientKey: this.clientKey,\n userIdentifier: this._userIdentifier\n });\n } catch (error) {\n this.clientLogger.error('Error during initialization:', error);\n this._initialized = false;\n this._lastInitError = error instanceof Error ? error : new Error('Error during initialization');\n }\n\n return this;\n }\n\n public async flush(): Promise<void> {\n return this.trackingManager?.flush();\n }\n\n public destroy(): void {\n this.trackingManager?.destroy();\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this._initialized || !this.trackingManager) {\n this.clientLogger.warn('Nemme client not initialized, some operations may fail');\n return;\n }\n\n return this.trackingManager.track(options);\n }\n\n private async initializeSession(): Promise<InitializeResponse> {\n try {\n const response: HttpResponse<InitializeResponse> = await httpClient.post(\n '/external/trackings/initialize',\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n throw new Error(response.error?.message || 'Request for initialising session failed');\n }\n return response.data;\n } catch (error) {\n this.clientLogger.error('Error during initialization', error);\n throw error;\n }\n }\n\n private async initializeManagers(\n session: InitializeResponse,\n batchConfig?: boolean | BatchConfig,\n trackUrlParamChanges?: boolean,\n getPage?: () => string\n ): Promise<void> {\n const deliveryManager = new DeliveryManager(this.clientLogger, this.headers, this.formConfig);\n const trackingManager = new TrackingManager({\n logger: this.clientLogger,\n headers: this.headers,\n sessionId: session.sessionId,\n eventDefinitions: session.eventDefinitions,\n batchConfig,\n trackUrlParamChanges,\n getPage,\n onPageView: async (url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ url });\n },\n onEvent: async (event: TrackEventOptions, url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ eventKey: event.eventKey, eventData: event.data, url });\n }\n });\n\n await deliveryManager.loadDeliveries();\n\n if (typeof window !== 'undefined') {\n await trackingManager.setupPageViewTracking();\n await trackingManager.trackPageView();\n await trackingManager.flush();\n }\n\n this.trackingManager = trackingManager;\n }\n}\n\nexport const initAsModule = (clientKey: string) => new NemmeClient(clientKey);\n"],"names":["DeliveryManager","logger","headers","formConfig","response","httpClient","context","delivery","trigger","deliveryResponse","mod","error","url","pattern","pathname","normalizePath","p","s","normalizedPathname","normalizedPattern","regexPattern","result","deliveryId","deliveryResponseId","dismissed","completed","TrackingManager","sessionId","eventDefinitions","batchConfig","onPageView","onEvent","trackUrlParamChanges","getPage","originalPushState","args","originalReplaceState","options","eventKey","data","event","currentPageKey","parsed","base","key","value","valueType","eventDefinition","def","definedProperties","eventProperties","eventPropertyKey","eventProperty","definedProperty","prop","eventsToSend","events","NemmeClient","clientKey","userIdentifier","secretKey","debug","batch","deactivate","session","deliveryManager","trackingManager","initAsModule"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const h=require("./httpClient-hrn9Ffa2.js");class f{logger;headers;formConfig;formManager;deliveries=[];constructor(e,t,i){this.logger=e,this.headers=t,this.formConfig=i}async loadDeliveries(){this.logger.debug("Loading deliveries");const e=await h.httpClient.get("/external/deliveries",{headers:this.headers});if(!e.ok){this.logger.error("Failed to load deliveries",e.error),this.deliveries=[];return}this.deliveries=e.data,this.logger.info(`Loaded ${this.deliveries.length} deliveries`)}async evaluateDeliveryTriggers(e){for(const t of this.deliveries)for(const i of t.triggers)if(this.shouldTriggerDelivery(i,e)){if(!await this.isDeliveryValid(t)){this.logger.debug(`Delivery ${t.id} is not valid, skipping`);continue}await this.executeDelivery(t,i);return}}shouldTriggerDelivery(e,t){if(this.hasActiveDelivery())return!1;switch(e.triggerType){case"page_url":return e.urlPattern?this.matchesUrlPattern(t.url,e.urlPattern):!0;case"custom_event":return e.eventKey?t.eventKey===e.eventKey:!1;default:return!1}}hasActiveDelivery(){return document.getElementById("nm")!==null}async executeDelivery(e,t){if(e.productType==="FRM"){this.logger.debug(`Triggering form delivery: ${e.productSlug}`,{triggerType:t.triggerType,urlPattern:t.urlPattern,eventKey:t.eventKey});try{const r=await this.createDeliveryResponse(e);if(!this.formManager){const s=await Promise.resolve().then(()=>require("./form-manager-CdG9IzjD.js")).then(n=>n.formManager);this.formManager=new s.FormManager(this.logger,this.headers,this.formConfig)}await this.formManager.fetchAndDisplayForm(e.productSlug,async()=>{this.logger.debug(`Form for delivery: ${e.productSlug} was cancelled`),r&&await this.updateDeliveryResponse(e.id,r.id,!0)},async()=>{this.logger.debug(`Form for delivery: ${e.productSlug} was completed`),r&&await this.updateDeliveryResponse(e.id,r.id,!1,!0)})}catch(r){this.logger.error(`Failed to load form for delivery: ${e.productSlug}`,r)}}}matchesUrlPattern(e,t){let i;try{i=new URL(e).pathname}catch{i=e.startsWith("/")?e:`/${e}`}const r=g=>{if(!g)return"/";let d=g.startsWith("/")?g:`/${g}`;return d.length>1&&d.endsWith("/")&&(d=d.slice(0,-1)),d},s=r(i),n=r(t),a=n.replace(/\*\*/g,"§DOUBLE_STAR§").replace(/\*/g,"§SINGLE_STAR§").replace(/\?/g,"§QUESTION§").replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/§SINGLE_STAR§/g,"[^/]*").replace(/§DOUBLE_STAR§/g,".*").replace(/§QUESTION§/g,"."),o=new RegExp(`^${a}$`).test(s);return this.logger.debug("URL pattern matching",{originalUrl:e,pathname:i,normalizedPathname:s,pattern:t,normalizedPattern:n,regexPattern:a,matches:o}),o}async createDeliveryResponse(e){const t=await h.httpClient.post(`/external/deliveries/${e.id}/responses`,{},{headers:this.headers});if(!t.ok){this.logger.error(`Failed to create delivery response for delivery: ${e.id}`,t.error);return}return t.data}async updateDeliveryResponse(e,t,i=!1,r=!1){try{await h.httpClient.patch(`/external/deliveries/${e}/responses/${t}`,{wasDismissed:i,wasCompleted:r},{headers:this.headers})}catch(s){this.logger.error(`Failed to update delivery response: ${t} for delivery: ${e}`,s)}}async isDeliveryValid(e){const t=await h.httpClient.get(`/external/deliveries/${e.id}/should-deliver`,{headers:this.headers});return t.ok?t.data:(this.logger.error(`Failed to check delivery validity for delivery: ${e.id}`,t.error),!1)}}class y{logger;headers;sessionId;eventDefinitions=[];onPageView;onEvent;trackUrlParamChanges=!0;getPage;backlog=[];flushTimeout=null;batchConfig={enabled:!0,size:10,delayMs:1e4,sendOnUnload:!0};originalHistoryMethods=null;EVENT_PAGE_VIEW="page_view";lastTrackedPageKey;constructor({logger:e,headers:t,sessionId:i,eventDefinitions:r,batchConfig:s,onPageView:n,onEvent:a,trackUrlParamChanges:l,getPage:o}){this.logger=e,this.headers=t,this.sessionId=i,this.eventDefinitions=r,this.onPageView=n,this.onEvent=a,this.getPage=o,typeof l=="boolean"&&(this.trackUrlParamChanges=l),this.flushEvents=this.flushEvents.bind(this),this.handlePopState=this.handlePopState.bind(this),this.handleVisibilityChange=this.handleVisibilityChange.bind(this),this.setupBatching(s)}setupBatching(e){typeof e=="boolean"?this.batchConfig.enabled=e:e&&(this.batchConfig={...this.batchConfig,...e}),this.batchConfig.enabled&&this.batchConfig.sendOnUnload&&typeof window<"u"&&(window.addEventListener("beforeunload",this.flushEvents),window.addEventListener("pagehide",this.flushEvents))}async setupPageViewTracking(){if(typeof window>"u")return;this.originalHistoryMethods={pushState:history.pushState,replaceState:history.replaceState};const e=history.pushState;history.pushState=async(...i)=>{e.apply(history,i),await this.trackPageView()};const t=history.replaceState;history.replaceState=async(...i)=>{t.apply(history,i),await this.trackPageView()},window.addEventListener("popstate",this.handlePopState),document.addEventListener("visibilitychange",this.handleVisibilityChange)}async track(e){if(!this.sessionId){this.logger.warn("Tracking manager not initialized, cannot track event");return}const{eventKey:t,data:i={}}=e;this.logger.debug("Tracking event",{eventKey:t,data:i});const r=this.getPageUrl(),s={sessionId:this.sessionId,eventKey:t,data:i||{},timestamp:new Date().toISOString(),page:r};this.sanitizeEventData(s)&&(this.validateEvent(s),this.batchConfig.enabled?(this.backlog.push(s),this.scheduleFlush()):await this.sendEvents([s]),t===this.EVENT_PAGE_VIEW?this.onPageView?.(r):this.onEvent?.(s,r))}async trackPageView(){if(typeof window>"u")return;const e=this.getPageUrl();if(!this.trackUrlParamChanges){const t=this.getPageKeyWithoutQuery(e);if(this.lastTrackedPageKey===t)return;this.lastTrackedPageKey=t}await this.track({eventKey:this.EVENT_PAGE_VIEW,data:{title:document.title}})}getPageUrl(){if(this.getPage)return this.getPage();const e=window.location.href;return window.location.protocol==="file:"?`/${window.location.pathname.split("/").pop()||""}${window.location.hash}`:e}getPageKeyWithoutQuery(e){try{const t=new URL(e);return`${t.origin}${t.pathname}${t.hash}`}catch{const[t]=e.split("?");return t}}async flush(){return this.flushEvents()}destroy(){this.originalHistoryMethods&&(history.pushState=this.originalHistoryMethods.pushState,history.replaceState=this.originalHistoryMethods.replaceState,this.originalHistoryMethods=null),typeof window<"u"&&(window.removeEventListener("popstate",this.handlePopState),document.removeEventListener("visibilitychange",this.handleVisibilityChange),window.removeEventListener("beforeunload",this.flushEvents),window.removeEventListener("pagehide",this.flushEvents)),this.flushTimeout&&(clearTimeout(this.flushTimeout),this.flushTimeout=null)}sanitizeEventData(e){if(e.eventKey===this.EVENT_PAGE_VIEW||!e.data)return!0;const t=e.data;for(const i of Object.keys(t)){const r=t[i];if(typeof r=="string"&&r==="[object Object]")return this.logger.error(`Property ${i} contains [object Object], dropping event ${e.eventKey}`),!1;const s=typeof r;if(s!=="boolean"&&s!=="number"&&s!=="string"){this.logger.warn(`Property ${i} has unsupported type ${s}, removing from event ${e.eventKey}`),delete t[i];continue}typeof r=="string"&&(t[i]=r.toLowerCase())}return!0}validateEvent(e){if(e.eventKey===this.EVENT_PAGE_VIEW)return;const t=this.eventDefinitions.find(s=>s.eventKey===e.eventKey);if(!t){this.logger.warn(`Event ${e.eventKey} is not registered`);return}const i=t.properties,r=e.data;if(r)for(const s of Object.keys(r)){const n=r[s],a=i.find(l=>l.name===s);if(!a){this.logger.warn(`Property ${s} is not registered for event ${e.eventKey}`);continue}typeof n!==a.type&&this.logger.warn(`Property ${a.name} has type ${a.type} but value is of type ${typeof n}`)}}async handlePopState(){await this.trackPageView()}async handleVisibilityChange(){document.visibilityState==="visible"&&await this.trackPageView()}scheduleFlush(){if(this.backlog.length>=this.batchConfig.size){this.flushEvents();return}this.flushTimeout||(this.flushTimeout=window.setTimeout(()=>{this.flushEvents()},this.batchConfig.delayMs))}async flushEvents(){if(this.flushTimeout&&(clearTimeout(this.flushTimeout),this.flushTimeout=null),this.backlog.length===0)return;const e=[...this.backlog];this.backlog=[];try{await this.sendEvents(e)}catch(t){this.backlog.unshift(...e),this.logger.error("Failed to send batched events",t)}}async sendEvents(e){if(e.length!==0)if(e.length===1){const t=e[0];await h.httpClient.post("/external/trackings/track",t,{headers:this.headers})}else await h.httpClient.post("/external/trackings/batch",e,{headers:this.headers})}}class u{clientKey;_userIdentifier;_initialized=!1;_lastInitError=null;clientLogger=h.logger.child("client");headers={};formConfig;get userIdentifier(){return this._userIdentifier}get initialized(){return this._initialized}get lastInitError(){return this._lastInitError}constructor(e){this.clientKey=e}trackingManager;async init({userIdentifier:e,secretKey:t,debug:i=!1,batch:r,formConfig:s,deactivate:n=!1,trackUrlParamChanges:a,getPage:l}){if(this._initialized=!1,this._lastInitError=null,this.trackingManager?.destroy(),this.trackingManager=void 0,n)return this.clientLogger.info("Nemme client deactivated and will stop initialization."),this._initialized=!0,this._lastInitError=null,this.clientLogger.configure({enabled:!1}),this;if(!e)throw new Error("userIdentifier is required parameter");this._userIdentifier=e,this.clientLogger.configure({enabled:i,level:i?"debug":"info"}),this.headers={"X-Client-Key":this.clientKey,"X-User-Id":this._userIdentifier,...t&&{"X-Client-Secret":t}},this.formConfig=s;try{const o=await this.initializeSession();await this.initializeManagers(o,r,a,l),this._initialized=!0,this._lastInitError=null,this.clientLogger.info("Nemme client initialized",{clientKey:this.clientKey,userIdentifier:this._userIdentifier})}catch(o){this.clientLogger.error("Error during initialization:",o),this._initialized=!1,this._lastInitError=o instanceof Error?o:new Error("Error during initialization")}return this}async flush(){return this.trackingManager?.flush()}destroy(){this.trackingManager?.destroy()}async track(e){if(!this._initialized||!this.trackingManager){this.clientLogger.warn("Nemme client not initialized, some operations may fail");return}return this.trackingManager.track(e)}async initializeSession(){try{const e=await h.httpClient.post("/external/trackings/initialize",{},{headers:this.headers});if(!e.ok)throw new Error(e.error?.message||"Request for initialising session failed");return e.data}catch(e){throw this.clientLogger.error("Error during initialization",e),e}}async initializeManagers(e,t,i,r){const s=new f(this.clientLogger,this.headers,this.formConfig),n=new y({logger:this.clientLogger,headers:this.headers,sessionId:e.sessionId,eventDefinitions:e.eventDefinitions,batchConfig:t,trackUrlParamChanges:i,getPage:r,onPageView:async a=>{await s.evaluateDeliveryTriggers({url:a})},onEvent:async(a,l)=>{await s.evaluateDeliveryTriggers({eventKey:a.eventKey,eventData:a.data,url:l})}});await s.loadDeliveries(),typeof window<"u"&&(await n.setupPageViewTracking(),await n.trackPageView(),await n.flush()),this.trackingManager=n}}const p=c=>new u(c);exports.NemmeClient=u;exports.initAsModule=p;
|
|
2
|
+
//# sourceMappingURL=client-TSUaCkOO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-TSUaCkOO.js","sources":["../../src/deliveries/delivery-manager.ts","../../src/tracking/tracking-manager.ts","../../src/client.ts"],"sourcesContent":["import { httpClient } from '../networking';\nimport type { FormConfig, ProductType } from '../types/forms';\nimport { Logger } from '../utils';\n\nexport type Trigger = {\n triggerType: 'page_url' | 'custom_event';\n urlPattern?: string;\n eventKey?: string;\n};\n\nexport type Channel = {\n channelType: string;\n channelStyle: string;\n};\n\nexport type Audience = {\n audienceType: string;\n};\n\nexport type Frequency = {\n frequencyType: string;\n};\n\nexport type Delivery = {\n id: number;\n productSlug: string;\n productType: ProductType;\n triggers: Trigger[];\n // channels: Channel[];\n // audiences: Audience[];\n // frequency: Frequency| null;\n};\n\nexport type DeliveryResponse = {\n id: number;\n shownAt: string;\n wasDismissed: boolean;\n wasCompleted: boolean;\n userId: string;\n respondedAt: string;\n};\n\nexport type TriggerContext = {\n url: string;\n eventKey?: string;\n eventData?: Record<string, unknown>;\n};\n\nexport class DeliveryManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private formConfig?: FormConfig;\n private formManager?: {\n fetchAndDisplayForm: (\n productSlug: string,\n onDismiss: () => Promise<void>,\n onComplete: (formState?: unknown) => Promise<void>\n ) => Promise<void>;\n };\n private deliveries: Delivery[] = [];\n\n constructor(logger: Logger, headers: Record<string, string>, formConfig?: FormConfig) {\n this.logger = logger;\n this.headers = headers;\n this.formConfig = formConfig;\n }\n\n public async loadDeliveries(): Promise<void> {\n this.logger.debug('Loading deliveries');\n const response = await httpClient.get<Delivery[]>('/external/deliveries', { headers: this.headers });\n if (!response.ok) {\n this.logger.error('Failed to load deliveries', response.error);\n this.deliveries = [];\n return;\n }\n this.deliveries = response.data;\n this.logger.info(`Loaded ${this.deliveries.length} deliveries`);\n }\n\n public async evaluateDeliveryTriggers(context: TriggerContext): Promise<void> {\n for (const delivery of this.deliveries) {\n for (const trigger of delivery.triggers) {\n if (this.shouldTriggerDelivery(trigger, context)) {\n const deliveryValid = await this.isDeliveryValid(delivery);\n if (!deliveryValid) {\n this.logger.debug(`Delivery ${delivery.id} is not valid, skipping`);\n continue;\n }\n await this.executeDelivery(delivery, trigger);\n return; // Stop after first match\n }\n }\n }\n }\n\n private shouldTriggerDelivery(trigger: Trigger, context: TriggerContext): boolean {\n if (this.hasActiveDelivery()) {\n return false;\n }\n switch (trigger.triggerType) {\n case 'page_url':\n return trigger.urlPattern ? this.matchesUrlPattern(context.url, trigger.urlPattern) : true;\n case 'custom_event':\n return trigger.eventKey ? context.eventKey === trigger.eventKey : false;\n default:\n return false;\n }\n }\n\n private hasActiveDelivery(): boolean {\n return document.getElementById('nm') !== null;\n }\n\n private async executeDelivery(delivery: Delivery, trigger: Trigger): Promise<void> {\n const productType = delivery.productType;\n if (productType === 'FRM') {\n this.logger.debug(`Triggering form delivery: ${delivery.productSlug}`, {\n triggerType: trigger.triggerType,\n urlPattern: trigger.urlPattern,\n eventKey: trigger.eventKey\n });\n\n try {\n const deliveryResponse = await this.createDeliveryResponse(delivery);\n if (!this.formManager) {\n const mod = await import('../forms/form-manager');\n this.formManager = new mod.FormManager(this.logger, this.headers, this.formConfig);\n }\n await this.formManager.fetchAndDisplayForm(\n delivery.productSlug,\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was cancelled`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, true);\n },\n async () => {\n this.logger.debug(`Form for delivery: ${delivery.productSlug} was completed`);\n if (deliveryResponse) await this.updateDeliveryResponse(delivery.id, deliveryResponse.id, false, true);\n }\n );\n } catch (error) {\n this.logger.error(`Failed to load form for delivery: ${delivery.productSlug}`, error);\n }\n }\n }\n\n private matchesUrlPattern(url: string, pattern: string): boolean {\n // Extract pathname from URL (remove protocol, host, query params, etc.)\n let pathname: string;\n try {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n } catch {\n // If URL parsing fails, assume it's already a pathname\n pathname = url.startsWith('/') ? url : `/${url}`;\n }\n\n // Normalize paths: remove trailing slash (except for root) and ensure leading slash\n const normalizePath = (p: string): string => {\n if (!p) return '/';\n let s = p.startsWith('/') ? p : `/${p}`;\n if (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s;\n };\n\n const normalizedPathname = normalizePath(pathname);\n const normalizedPattern = normalizePath(pattern);\n\n // Convert glob pattern to regex\n // First, replace glob tokens with placeholders, then escape regex special chars, then restore\n const regexPattern = normalizedPattern\n .replace(/\\*\\*/g, '§DOUBLE_STAR§')\n .replace(/\\*/g, '§SINGLE_STAR§')\n .replace(/\\?/g, '§QUESTION§')\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex special characters\n .replace(/§SINGLE_STAR§/g, '[^/]*') // * matches anything except /\n .replace(/§DOUBLE_STAR§/g, '.*') // ** matches anything including /\n .replace(/§QUESTION§/g, '.'); // ? matches single character\n\n const regex = new RegExp(`^${regexPattern}$`);\n const result = regex.test(normalizedPathname);\n\n this.logger.debug(`URL pattern matching`, {\n originalUrl: url,\n pathname,\n normalizedPathname,\n pattern,\n normalizedPattern,\n regexPattern,\n matches: result\n });\n\n return result;\n }\n\n private async createDeliveryResponse(delivery: Delivery): Promise<DeliveryResponse | undefined> {\n const response = await httpClient.post<DeliveryResponse>(\n `/external/deliveries/${delivery.id}/responses`,\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n this.logger.error(`Failed to create delivery response for delivery: ${delivery.id}`, response.error);\n return undefined;\n }\n return response.data;\n }\n\n private async updateDeliveryResponse(\n deliveryId: number,\n deliveryResponseId: number,\n dismissed: boolean = false,\n completed: boolean = false\n ): Promise<void> {\n try {\n await httpClient.patch(\n `/external/deliveries/${deliveryId}/responses/${deliveryResponseId}`,\n { wasDismissed: dismissed, wasCompleted: completed },\n { headers: this.headers }\n );\n } catch (error) {\n this.logger.error(`Failed to update delivery response: ${deliveryResponseId} for delivery: ${deliveryId}`, error);\n }\n }\n\n private async isDeliveryValid(delivery: Delivery): Promise<boolean> {\n const response = await httpClient.get<boolean>(`/external/deliveries/${delivery.id}/should-deliver`, {\n headers: this.headers\n });\n if (!response.ok) {\n this.logger.error(`Failed to check delivery validity for delivery: ${delivery.id}`, response.error);\n return false;\n }\n return response.data;\n }\n}\n","import { httpClient } from '../networking';\nimport { Logger } from '../utils';\n\nexport type Config = {\n logger: Logger;\n headers: Record<string, string>;\n sessionId: number;\n eventDefinitions: EventDefinition[];\n batchConfig?: boolean | BatchConfig;\n onPageView?: (url: string) => Promise<void>;\n onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n trackUrlParamChanges?: boolean;\n getPage?: () => string;\n};\n\nexport type BatchConfig = {\n enabled?: boolean;\n size?: number;\n delayMs?: number;\n sendOnUnload?: boolean;\n};\n\nexport type TrackEventOptions<T extends string = string> = {\n eventKey: T;\n data?: Record<string, unknown>;\n};\n\ntype HistoryParams = Parameters<typeof history.pushState>;\n\ntype EventOptions = TrackEventOptions & {\n sessionId: number;\n timestamp: string;\n page: string;\n};\n\ntype EventProperties = {\n name: string;\n type: string;\n};\n\nexport type EventDefinition = {\n properties: EventProperties[];\n eventKey: string;\n};\n\n/**\n * Manages event tracking, batching, and page view tracking\n */\nexport class TrackingManager {\n private logger: Logger;\n private headers: Record<string, string>;\n private sessionId?: number;\n private eventDefinitions: EventDefinition[] = [];\n private onPageView?: (url: string) => Promise<void>;\n private onEvent?: (event: TrackEventOptions, url: string) => Promise<void>;\n private trackUrlParamChanges = true;\n private getPage?: () => string;\n\n // Batching\n private backlog: Array<EventOptions> = [];\n private flushTimeout: number | null = null;\n private batchConfig: Required<BatchConfig> = {\n enabled: true,\n size: 10,\n delayMs: 10000, // 10 seconds\n sendOnUnload: true\n };\n\n // Page view tracking\n private originalHistoryMethods: {\n pushState: typeof history.pushState;\n replaceState: typeof history.replaceState;\n } | null = null;\n\n private readonly EVENT_PAGE_VIEW = 'page_view';\n private lastTrackedPageKey?: string;\n\n constructor({\n logger,\n headers,\n sessionId,\n eventDefinitions,\n batchConfig,\n onPageView,\n onEvent,\n trackUrlParamChanges,\n getPage\n }: Config) {\n this.logger = logger;\n this.headers = headers;\n this.sessionId = sessionId;\n this.eventDefinitions = eventDefinitions;\n this.onPageView = onPageView;\n this.onEvent = onEvent;\n this.getPage = getPage;\n if (typeof trackUrlParamChanges === 'boolean') {\n this.trackUrlParamChanges = trackUrlParamChanges;\n }\n\n // Bind methods before setting up event listeners\n this.flushEvents = this.flushEvents.bind(this);\n this.handlePopState = this.handlePopState.bind(this);\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n\n this.setupBatching(batchConfig);\n }\n\n private setupBatching(batchConfig?: boolean | BatchConfig): void {\n if (typeof batchConfig === 'boolean') {\n this.batchConfig.enabled = batchConfig;\n } else if (batchConfig) {\n this.batchConfig = {\n ...this.batchConfig,\n ...batchConfig\n };\n }\n\n // Setup unload handler if batching is enabled\n if (this.batchConfig.enabled && this.batchConfig.sendOnUnload && typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this.flushEvents);\n window.addEventListener('pagehide', this.flushEvents);\n }\n }\n\n public async setupPageViewTracking(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n this.originalHistoryMethods = {\n pushState: history.pushState,\n replaceState: history.replaceState\n };\n\n const originalPushState = history.pushState;\n history.pushState = async (...args: HistoryParams) => {\n originalPushState.apply(history, args);\n await this.trackPageView();\n };\n\n const originalReplaceState = history.replaceState;\n history.replaceState = async (...args: HistoryParams) => {\n originalReplaceState.apply(history, args);\n await this.trackPageView();\n };\n\n window.addEventListener('popstate', this.handlePopState);\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this.sessionId) {\n this.logger.warn('Tracking manager not initialized, cannot track event');\n return;\n }\n\n const { eventKey, data = {} } = options;\n this.logger.debug('Tracking event', { eventKey, data });\n const url = this.getPageUrl();\n const event: EventOptions = {\n sessionId: this.sessionId,\n eventKey,\n data: data || {},\n timestamp: new Date().toISOString(),\n page: url\n };\n\n if (!this.sanitizeEventData(event)) {\n return;\n }\n\n this.validateEvent(event);\n\n if (this.batchConfig.enabled) {\n this.backlog.push(event);\n this.scheduleFlush();\n } else {\n await this.sendEvents([event]);\n }\n\n if (eventKey === this.EVENT_PAGE_VIEW) {\n this.onPageView?.(url);\n } else {\n this.onEvent?.(event, url);\n }\n }\n\n public async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const url = this.getPageUrl();\n\n if (!this.trackUrlParamChanges) {\n const currentPageKey = this.getPageKeyWithoutQuery(url);\n\n if (this.lastTrackedPageKey === currentPageKey) {\n return;\n }\n\n this.lastTrackedPageKey = currentPageKey;\n }\n\n await this.track({\n eventKey: this.EVENT_PAGE_VIEW,\n data: {\n title: document.title\n }\n });\n }\n\n private getPageUrl(): string {\n if (this.getPage) {\n return this.getPage();\n }\n\n const url = window.location.href;\n\n if (window.location.protocol === 'file:') {\n const filename = window.location.pathname.split('/').pop() || '';\n return `/${filename}${window.location.hash}`;\n }\n\n return url;\n }\n\n private getPageKeyWithoutQuery(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}${parsed.hash}`;\n } catch {\n const [base] = url.split('?');\n return base;\n }\n }\n\n /**\n * Manually flush any pending events\n */\n public async flush(): Promise<void> {\n return this.flushEvents();\n }\n\n /**\n * Clean up event listeners and restore original history methods\n */\n public destroy(): void {\n if (this.originalHistoryMethods) {\n history.pushState = this.originalHistoryMethods.pushState;\n history.replaceState = this.originalHistoryMethods.replaceState;\n this.originalHistoryMethods = null;\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n window.removeEventListener('beforeunload', this.flushEvents);\n window.removeEventListener('pagehide', this.flushEvents);\n }\n\n // Clear any pending flush timeout\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n }\n\n private sanitizeEventData(event: EventOptions): boolean {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return true;\n if (!event.data) return true;\n\n const data = event.data;\n\n for (const key of Object.keys(data)) {\n const value = data[key];\n\n if (typeof value === 'string' && value === '[object Object]') {\n this.logger.error(`Property ${key} contains [object Object], dropping event ${event.eventKey}`);\n return false;\n }\n\n const valueType = typeof value;\n\n if (valueType !== 'boolean' && valueType !== 'number' && valueType !== 'string') {\n this.logger.warn(`Property ${key} has unsupported type ${valueType}, removing from event ${event.eventKey}`);\n delete data[key];\n continue;\n }\n\n if (typeof value === 'string') {\n data[key] = value.toLowerCase();\n }\n }\n\n return true;\n }\n\n private validateEvent(event: EventOptions): void {\n if (event.eventKey === this.EVENT_PAGE_VIEW) return;\n\n const eventDefinition = this.eventDefinitions.find(def => def.eventKey === event.eventKey);\n if (!eventDefinition) {\n this.logger.warn(`Event ${event.eventKey} is not registered`);\n return;\n }\n\n const definedProperties = eventDefinition.properties;\n const eventProperties = event.data;\n if (!eventProperties) return;\n\n for (const eventPropertyKey of Object.keys(eventProperties)) {\n const eventProperty = eventProperties[eventPropertyKey];\n const definedProperty = definedProperties.find(prop => prop.name === eventPropertyKey);\n\n if (!definedProperty) {\n this.logger.warn(`Property ${eventPropertyKey} is not registered for event ${event.eventKey}`);\n continue;\n }\n\n if (typeof eventProperty !== definedProperty.type) {\n this.logger.warn(\n `Property ${definedProperty.name} has type ${definedProperty.type} but value is of type ${typeof eventProperty}`\n );\n }\n }\n }\n\n private async handlePopState(): Promise<void> {\n await this.trackPageView();\n }\n\n private async handleVisibilityChange(): Promise<void> {\n if (document.visibilityState === 'visible') {\n await this.trackPageView();\n }\n }\n\n private scheduleFlush(): void {\n if (this.backlog.length >= this.batchConfig.size) {\n this.flushEvents();\n return;\n }\n\n if (!this.flushTimeout) {\n this.flushTimeout = window.setTimeout(() => {\n this.flushEvents();\n }, this.batchConfig.delayMs);\n }\n }\n\n private async flushEvents(): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n if (this.backlog.length === 0) return;\n\n const eventsToSend = [...this.backlog];\n this.backlog = [];\n\n try {\n await this.sendEvents(eventsToSend);\n } catch (error) {\n this.backlog.unshift(...eventsToSend);\n this.logger.error('Failed to send batched events', error);\n }\n }\n\n private async sendEvents(events: Array<EventOptions>): Promise<void> {\n if (events.length === 0) return;\n\n if (events.length === 1) {\n const event = events[0];\n await httpClient.post('/external/trackings/track', event, { headers: this.headers });\n } else {\n await httpClient.post('/external/trackings/batch', events, { headers: this.headers });\n }\n }\n}\n","import { DeliveryManager } from './deliveries/delivery-manager';\nimport { httpClient, HttpResponse } from './networking';\nimport { BatchConfig, EventDefinition, TrackEventOptions, TrackingManager } from './tracking/tracking-manager';\nimport { FormConfig } from './types/forms';\nimport { Logger, logger } from './utils';\n\nexport type ClientConfigType = {\n userIdentifier: string;\n secretKey?: string;\n debug?: boolean;\n batch?: boolean | BatchConfig;\n formConfig?: FormConfig;\n deactivate?: boolean;\n trackUrlParamChanges?: boolean;\n getPage?: () => string;\n};\n\n// Re-export types for backward compatibility\nexport type { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';\n\ntype InitializeResponse = {\n sessionId: number;\n eventDefinitions: EventDefinition[];\n};\n\n/**\n * Main client class for the Nemme SDK\n * Coordinates initialization, tracking, and form management\n */\nexport class NemmeClient {\n readonly clientKey: string;\n private _userIdentifier?: string;\n private _initialized = false;\n private _lastInitError: Error | null = null;\n private clientLogger: Logger = logger.child('client');\n private headers: Record<string, string> = {};\n private formConfig?: FormConfig;\n\n get userIdentifier(): string | undefined {\n return this._userIdentifier;\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n get lastInitError(): Error | null {\n return this._lastInitError;\n }\n\n constructor(clientKey: string) {\n this.clientKey = clientKey;\n }\n\n // Module managers\n private trackingManager?: TrackingManager;\n\n /**\n * Create a new Nemme SDK client instance\n */\n public async init({\n userIdentifier,\n secretKey,\n debug = false,\n batch,\n formConfig,\n deactivate = false,\n trackUrlParamChanges,\n getPage\n }: ClientConfigType): Promise<NemmeClient> {\n this._initialized = false;\n this._lastInitError = null;\n this.trackingManager?.destroy();\n this.trackingManager = undefined;\n\n if (deactivate) {\n this.clientLogger.info('Nemme client deactivated and will stop initialization.');\n this._initialized = true;\n this._lastInitError = null;\n this.clientLogger.configure({ enabled: false });\n return this;\n }\n if (!userIdentifier) throw new Error('userIdentifier is required parameter');\n this._userIdentifier = userIdentifier;\n\n // Configure logger based on debug setting\n this.clientLogger.configure({\n enabled: debug,\n level: debug ? 'debug' : 'info'\n });\n\n this.headers = {\n 'X-Client-Key': this.clientKey,\n 'X-User-Id': this._userIdentifier,\n ...(secretKey && { 'X-Client-Secret': secretKey })\n };\n\n this.formConfig = formConfig;\n\n try {\n const session = await this.initializeSession();\n await this.initializeManagers(session, batch, trackUrlParamChanges, getPage);\n this._initialized = true;\n this._lastInitError = null;\n this.clientLogger.info('Nemme client initialized', {\n clientKey: this.clientKey,\n userIdentifier: this._userIdentifier\n });\n } catch (error) {\n this.clientLogger.error('Error during initialization:', error);\n this._initialized = false;\n this._lastInitError = error instanceof Error ? error : new Error('Error during initialization');\n }\n\n return this;\n }\n\n public async flush(): Promise<void> {\n return this.trackingManager?.flush();\n }\n\n public destroy(): void {\n this.trackingManager?.destroy();\n }\n\n public async track<T extends TrackEventOptions>(options: T): Promise<void> {\n if (!this._initialized || !this.trackingManager) {\n this.clientLogger.warn('Nemme client not initialized, some operations may fail');\n return;\n }\n\n return this.trackingManager.track(options);\n }\n\n private async initializeSession(): Promise<InitializeResponse> {\n try {\n const response: HttpResponse<InitializeResponse> = await httpClient.post(\n '/external/trackings/initialize',\n {},\n { headers: this.headers }\n );\n if (!response.ok) {\n throw new Error(response.error?.message || 'Request for initialising session failed');\n }\n return response.data;\n } catch (error) {\n this.clientLogger.error('Error during initialization', error);\n throw error;\n }\n }\n\n private async initializeManagers(\n session: InitializeResponse,\n batchConfig?: boolean | BatchConfig,\n trackUrlParamChanges?: boolean,\n getPage?: () => string\n ): Promise<void> {\n const deliveryManager = new DeliveryManager(this.clientLogger, this.headers, this.formConfig);\n const trackingManager = new TrackingManager({\n logger: this.clientLogger,\n headers: this.headers,\n sessionId: session.sessionId,\n eventDefinitions: session.eventDefinitions,\n batchConfig,\n trackUrlParamChanges,\n getPage,\n onPageView: async (url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ url });\n },\n onEvent: async (event: TrackEventOptions, url: string) => {\n await deliveryManager.evaluateDeliveryTriggers({ eventKey: event.eventKey, eventData: event.data, url });\n }\n });\n\n await deliveryManager.loadDeliveries();\n\n if (typeof window !== 'undefined') {\n await trackingManager.setupPageViewTracking();\n await trackingManager.trackPageView();\n await trackingManager.flush();\n }\n\n this.trackingManager = trackingManager;\n }\n}\n\nexport const initAsModule = (clientKey: string) => new NemmeClient(clientKey);\n"],"names":["DeliveryManager","logger","headers","formConfig","response","httpClient","context","delivery","trigger","deliveryResponse","mod","error","url","pattern","pathname","normalizePath","p","s","normalizedPathname","normalizedPattern","regexPattern","result","deliveryId","deliveryResponseId","dismissed","completed","TrackingManager","sessionId","eventDefinitions","batchConfig","onPageView","onEvent","trackUrlParamChanges","getPage","originalPushState","args","originalReplaceState","options","eventKey","data","event","currentPageKey","parsed","base","key","value","valueType","eventDefinition","def","definedProperties","eventProperties","eventPropertyKey","eventProperty","definedProperty","prop","eventsToSend","events","NemmeClient","clientKey","userIdentifier","secretKey","debug","batch","deactivate","session","deliveryManager","trackingManager","initAsModule"],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -2,11 +2,13 @@ import { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';
|
|
|
2
2
|
import { FormConfig } from './types/forms';
|
|
3
3
|
export type ClientConfigType = {
|
|
4
4
|
userIdentifier: string;
|
|
5
|
+
secretKey?: string;
|
|
5
6
|
debug?: boolean;
|
|
6
7
|
batch?: boolean | BatchConfig;
|
|
7
8
|
formConfig?: FormConfig;
|
|
8
9
|
deactivate?: boolean;
|
|
9
10
|
trackUrlParamChanges?: boolean;
|
|
11
|
+
getPage?: () => string;
|
|
10
12
|
};
|
|
11
13
|
export type { BatchConfig, TrackEventOptions } from './tracking/tracking-manager';
|
|
12
14
|
/**
|
|
@@ -29,7 +31,7 @@ export declare class NemmeClient {
|
|
|
29
31
|
/**
|
|
30
32
|
* Create a new Nemme SDK client instance
|
|
31
33
|
*/
|
|
32
|
-
init({ userIdentifier, debug, batch, formConfig, deactivate, trackUrlParamChanges }: ClientConfigType): Promise<NemmeClient>;
|
|
34
|
+
init({ userIdentifier, secretKey, debug, batch, formConfig, deactivate, trackUrlParamChanges, getPage }: ClientConfigType): Promise<NemmeClient>;
|
|
33
35
|
flush(): Promise<void>;
|
|
34
36
|
destroy(): void;
|
|
35
37
|
track<T extends TrackEventOptions>(options: T): Promise<void>;
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/client-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/client-TSUaCkOO.js"),t=i=>e.initAsModule(i);exports.NemmeClient=e.NemmeClient;exports.NemmeSDK=t;exports.default=t;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as m } from "./chunks/client-
|
|
2
|
-
import { N as i } from "./chunks/client-
|
|
1
|
+
import { i as m } from "./chunks/client-DNUAujt4.js";
|
|
2
|
+
import { N as i } from "./chunks/client-DNUAujt4.js";
|
|
3
3
|
const t = (e) => m(e);
|
|
4
4
|
export {
|
|
5
5
|
i as NemmeClient,
|