@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.
@@ -1,4 +1,4 @@
1
- import { h as o, l as u } from "./httpClient-D2IO92uv.js";
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 o.get("/external/deliveries", { headers: this.headers });
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((a) => a.f);
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 = (h) => {
82
- if (!h) return "/";
83
- let d = h.startsWith("/") ? h : `/${h}`;
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), a = r(t), n = a.replace(/\*\*/g, "§DOUBLE_STAR§").replace(/\*/g, "§SINGLE_STAR§").replace(/\?/g, "§QUESTION§").replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/§SINGLE_STAR§/g, "[^/]*").replace(/§DOUBLE_STAR§/g, ".*").replace(/§QUESTION§/g, "."), c = new RegExp(`^${n}$`).test(s);
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: a,
92
- regexPattern: n,
93
- matches: c
94
- }), c;
91
+ normalizedPattern: n,
92
+ regexPattern: a,
93
+ matches: o
94
+ }), o;
95
95
  }
96
96
  async createDeliveryResponse(e) {
97
- const t = await o.post(
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 o.patch(
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 o.get(`/external/deliveries/${e.id}/should-deliver`, {
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: a,
155
- onEvent: n,
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 = a, this.onEvent = n, 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);
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 = window.location.href, s = {
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?.(window.location.href) : this.onEvent?.(s, r));
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 = window.location.href;
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 a = r[s], n = i.find((l) => l.name === s);
261
- if (!n) {
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 a !== n.type && this.logger.warn(
266
- `Property ${n.name} has type ${n.type} but value is of type ${typeof a}`
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 o.post("/external/trackings/track", t, { headers: this.headers });
307
+ await h.post("/external/trackings/track", t, { headers: this.headers });
300
308
  } else
301
- await o.post("/external/trackings/batch", e, { headers: this.headers });
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
- debug: t = !1,
332
- batch: i,
333
- formConfig: r,
334
- deactivate: s = !1,
335
- trackUrlParamChanges: a
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, s)
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: t,
342
- level: t ? "debug" : "info"
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
- }, this.formConfig = r;
355
+ "X-User-Id": this._userIdentifier,
356
+ ...t && { "X-Client-Secret": t }
357
+ }, this.formConfig = s;
347
358
  try {
348
- const n = await this.initializeSession();
349
- await this.initializeManagers(n, i, a), this._initialized = !0, this._lastInitError = null, this.clientLogger.info("Nemme client initialized", {
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 (n) {
354
- this.clientLogger.error("Error during initialization:", n), this._initialized = !1, this._lastInitError = n instanceof Error ? n : new 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 o.post(
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 r = new f(this.clientLogger, this.headers, this.formConfig), s = new y({
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 r.evaluateDeliveryTriggers({ url: a });
406
+ await s.evaluateDeliveryTriggers({ url: a });
395
407
  },
396
- onEvent: async (a, n) => {
397
- await r.evaluateDeliveryTriggers({ eventKey: a.eventKey, eventData: a.data, url: n });
408
+ onEvent: async (a, l) => {
409
+ await s.evaluateDeliveryTriggers({ eventKey: a.eventKey, eventData: a.data, url: l });
398
410
  }
399
411
  });
400
- await r.loadDeliveries(), typeof window < "u" && (await s.setupPageViewTracking(), await s.trackPageView(), await s.flush()), this.trackingManager = s;
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 = (g) => new p(g);
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-DhycnG8v.js.map
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":"yDAgDO,MAAMA,CAAgB,CACnB,OACA,QACA,WACA,YAOA,WAAyB,CAAA,EAEjC,YAAYC,EAAgBC,EAAiCC,EAAyB,CACpF,KAAK,OAASF,EACd,KAAK,QAAUC,EACf,KAAK,WAAaC,CACpB,CAEA,MAAa,gBAAgC,CAC3C,KAAK,OAAO,MAAM,oBAAoB,EACtC,MAAMC,EAAW,MAAMC,EAAAA,WAAW,IAAgB,uBAAwB,CAAE,QAAS,KAAK,QAAS,EACnG,GAAI,CAACD,EAAS,GAAI,CAChB,KAAK,OAAO,MAAM,4BAA6BA,EAAS,KAAK,EAC7D,KAAK,WAAa,CAAA,EAClB,MACF,CACA,KAAK,WAAaA,EAAS,KAC3B,KAAK,OAAO,KAAK,UAAU,KAAK,WAAW,MAAM,aAAa,CAChE,CAEA,MAAa,yBAAyBE,EAAwC,CAC5E,UAAWC,KAAY,KAAK,WAC1B,UAAWC,KAAWD,EAAS,SAC7B,GAAI,KAAK,sBAAsBC,EAASF,CAAO,EAAG,CAEhD,GAAI,CADkB,MAAM,KAAK,gBAAgBC,CAAQ,EACrC,CAClB,KAAK,OAAO,MAAM,YAAYA,EAAS,EAAE,yBAAyB,EAClE,QACF,CACA,MAAM,KAAK,gBAAgBA,EAAUC,CAAO,EAC5C,MACF,CAGN,CAEQ,sBAAsBA,EAAkBF,EAAkC,CAChF,GAAI,KAAK,oBACP,MAAO,GAET,OAAQE,EAAQ,YAAA,CACd,IAAK,WACH,OAAOA,EAAQ,WAAa,KAAK,kBAAkBF,EAAQ,IAAKE,EAAQ,UAAU,EAAI,GACxF,IAAK,eACH,OAAOA,EAAQ,SAAWF,EAAQ,WAAaE,EAAQ,SAAW,GACpE,QACE,MAAO,EAAA,CAEb,CAEQ,mBAA6B,CACnC,OAAO,SAAS,eAAe,IAAI,IAAM,IAC3C,CAEA,MAAc,gBAAgBD,EAAoBC,EAAiC,CAEjF,GADoBD,EAAS,cACT,MAAO,CACzB,KAAK,OAAO,MAAM,6BAA6BA,EAAS,WAAW,GAAI,CACrE,YAAaC,EAAQ,YACrB,WAAYA,EAAQ,WACpB,SAAUA,EAAQ,QAAA,CACnB,EAED,GAAI,CACF,MAAMC,EAAmB,MAAM,KAAK,uBAAuBF,CAAQ,EACnE,GAAI,CAAC,KAAK,YAAa,CACrB,MAAMG,EAAM,MAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,4BAAuB,CAAA,EAAA,KAAA,GAAA,EAAA,WAAA,EAChD,KAAK,YAAc,IAAIA,EAAI,YAAY,KAAK,OAAQ,KAAK,QAAS,KAAK,UAAU,CACnF,CACA,MAAM,KAAK,YAAY,oBACrBH,EAAS,YACT,SAAY,CACV,KAAK,OAAO,MAAM,sBAAsBA,EAAS,WAAW,gBAAgB,EACxEE,SAAwB,KAAK,uBAAuBF,EAAS,GAAIE,EAAiB,GAAI,EAAI,CAChG,EACA,SAAY,CACV,KAAK,OAAO,MAAM,sBAAsBF,EAAS,WAAW,gBAAgB,EACxEE,SAAwB,KAAK,uBAAuBF,EAAS,GAAIE,EAAiB,GAAI,GAAO,EAAI,CACvG,CAAA,CAEJ,OAASE,EAAO,CACd,KAAK,OAAO,MAAM,qCAAqCJ,EAAS,WAAW,GAAII,CAAK,CACtF,CACF,CACF,CAEQ,kBAAkBC,EAAaC,EAA0B,CAE/D,IAAIC,EACJ,GAAI,CAEFA,EADe,IAAI,IAAIF,CAAG,EACR,QACpB,MAAQ,CAENE,EAAWF,EAAI,WAAW,GAAG,EAAIA,EAAM,IAAIA,CAAG,EAChD,CAGA,MAAMG,EAAiBC,GAAsB,CAC3C,GAAI,CAACA,EAAG,MAAO,IACf,IAAIC,EAAID,EAAE,WAAW,GAAG,EAAIA,EAAI,IAAIA,CAAC,GACrC,OAAIC,EAAE,OAAS,GAAKA,EAAE,SAAS,GAAG,IAAGA,EAAIA,EAAE,MAAM,EAAG,EAAE,GAC/CA,CACT,EAEMC,EAAqBH,EAAcD,CAAQ,EAC3CK,EAAoBJ,EAAcF,CAAO,EAIzCO,EAAeD,EAClB,QAAQ,QAAS,eAAe,EAChC,QAAQ,MAAO,eAAe,EAC9B,QAAQ,MAAO,YAAY,EAC3B,QAAQ,oBAAqB,MAAM,EACnC,QAAQ,iBAAkB,OAAO,EACjC,QAAQ,iBAAkB,IAAI,EAC9B,QAAQ,cAAe,GAAG,EAGvBE,EADQ,IAAI,OAAO,IAAID,CAAY,GAAG,EACvB,KAAKF,CAAkB,EAE5C,YAAK,OAAO,MAAM,uBAAwB,CACxC,YAAaN,EACb,SAAAE,EACA,mBAAAI,EACA,QAAAL,EACA,kBAAAM,EACA,aAAAC,EACA,QAASC,CAAA,CACV,EAEMA,CACT,CAEA,MAAc,uBAAuBd,EAA2D,CAC9F,MAAMH,EAAW,MAAMC,EAAAA,WAAW,KAChC,wBAAwBE,EAAS,EAAE,aACnC,CAAA,EACA,CAAE,QAAS,KAAK,OAAA,CAAQ,EAE1B,GAAI,CAACH,EAAS,GAAI,CAChB,KAAK,OAAO,MAAM,oDAAoDG,EAAS,EAAE,GAAIH,EAAS,KAAK,EACnG,MACF,CACA,OAAOA,EAAS,IAClB,CAEA,MAAc,uBACZkB,EACAC,EACAC,EAAqB,GACrBC,EAAqB,GACN,CACf,GAAI,CACF,MAAMpB,EAAAA,WAAW,MACf,wBAAwBiB,CAAU,cAAcC,CAAkB,GAClE,CAAE,aAAcC,EAAW,aAAcC,CAAA,EACzC,CAAE,QAAS,KAAK,OAAA,CAAQ,CAE5B,OAASd,EAAO,CACd,KAAK,OAAO,MAAM,uCAAuCY,CAAkB,kBAAkBD,CAAU,GAAIX,CAAK,CAClH,CACF,CAEA,MAAc,gBAAgBJ,EAAsC,CAClE,MAAMH,EAAW,MAAMC,EAAAA,WAAW,IAAa,wBAAwBE,EAAS,EAAE,kBAAmB,CACnG,QAAS,KAAK,OAAA,CACf,EACD,OAAKH,EAAS,GAIPA,EAAS,MAHd,KAAK,OAAO,MAAM,mDAAmDG,EAAS,EAAE,GAAIH,EAAS,KAAK,EAC3F,GAGX,CACF,CC1LO,MAAMsB,CAAgB,CACnB,OACA,QACA,UACA,iBAAsC,CAAA,EACtC,WACA,QACA,qBAAuB,GACvB,QAGA,QAA+B,CAAA,EAC/B,aAA8B,KAC9B,YAAqC,CAC3C,QAAS,GACT,KAAM,GACN,QAAS,IACT,aAAc,EAAA,EAIR,uBAGG,KAEM,gBAAkB,YAC3B,mBAER,YAAY,CACV,OAAAzB,EACA,QAAAC,EACA,UAAAyB,EACA,iBAAAC,EACA,YAAAC,EACA,WAAAC,EACA,QAAAC,EACA,qBAAAC,EACA,QAAAC,CAAA,EACS,CACT,KAAK,OAAShC,EACd,KAAK,QAAUC,EACf,KAAK,UAAYyB,EACjB,KAAK,iBAAmBC,EACxB,KAAK,WAAaE,EAClB,KAAK,QAAUC,EACf,KAAK,QAAUE,EACX,OAAOD,GAAyB,YAClC,KAAK,qBAAuBA,GAI9B,KAAK,YAAc,KAAK,YAAY,KAAK,IAAI,EAC7C,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EACnD,KAAK,uBAAyB,KAAK,uBAAuB,KAAK,IAAI,EAEnE,KAAK,cAAcH,CAAW,CAChC,CAEQ,cAAcA,EAA2C,CAC3D,OAAOA,GAAgB,UACzB,KAAK,YAAY,QAAUA,EAClBA,IACT,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,GAAGA,CAAA,GAKH,KAAK,YAAY,SAAW,KAAK,YAAY,cAAgB,OAAO,OAAW,MACjF,OAAO,iBAAiB,eAAgB,KAAK,WAAW,EACxD,OAAO,iBAAiB,WAAY,KAAK,WAAW,EAExD,CAEA,MAAa,uBAAuC,CAClD,GAAI,OAAO,OAAW,IAAa,OAEnC,KAAK,uBAAyB,CAC5B,UAAW,QAAQ,UACnB,aAAc,QAAQ,YAAA,EAGxB,MAAMK,EAAoB,QAAQ,UAClC,QAAQ,UAAY,SAAUC,IAAwB,CACpDD,EAAkB,MAAM,QAASC,CAAI,EACrC,MAAM,KAAK,cAAA,CACb,EAEA,MAAMC,EAAuB,QAAQ,aACrC,QAAQ,aAAe,SAAUD,IAAwB,CACvDC,EAAqB,MAAM,QAASD,CAAI,EACxC,MAAM,KAAK,cAAA,CACb,EAEA,OAAO,iBAAiB,WAAY,KAAK,cAAc,EACvD,SAAS,iBAAiB,mBAAoB,KAAK,sBAAsB,CAC3E,CAEA,MAAa,MAAmCE,EAA2B,CACzE,GAAI,CAAC,KAAK,UAAW,CACnB,KAAK,OAAO,KAAK,sDAAsD,EACvE,MACF,CAEA,KAAM,CAAE,SAAAC,EAAU,KAAAC,EAAO,CAAA,GAAOF,EAChC,KAAK,OAAO,MAAM,iBAAkB,CAAE,SAAAC,EAAU,KAAAC,EAAM,EACtD,MAAM3B,EAAM,KAAK,WAAA,EACX4B,EAAsB,CAC1B,UAAW,KAAK,UAChB,SAAAF,EACA,KAAMC,GAAQ,CAAA,EACd,UAAW,IAAI,KAAA,EAAO,YAAA,EACtB,KAAM3B,CAAA,EAGH,KAAK,kBAAkB4B,CAAK,IAIjC,KAAK,cAAcA,CAAK,EAEpB,KAAK,YAAY,SACnB,KAAK,QAAQ,KAAKA,CAAK,EACvB,KAAK,cAAA,GAEL,MAAM,KAAK,WAAW,CAACA,CAAK,CAAC,EAG3BF,IAAa,KAAK,gBACpB,KAAK,aAAa1B,CAAG,EAErB,KAAK,UAAU4B,EAAO5B,CAAG,EAE7B,CAEA,MAAa,eAA+B,CAC1C,GAAI,OAAO,OAAW,IAAa,OAEnC,MAAMA,EAAM,KAAK,WAAA,EAEjB,GAAI,CAAC,KAAK,qBAAsB,CAC9B,MAAM6B,EAAiB,KAAK,uBAAuB7B,CAAG,EAEtD,GAAI,KAAK,qBAAuB6B,EAC9B,OAGF,KAAK,mBAAqBA,CAC5B,CAEA,MAAM,KAAK,MAAM,CACf,SAAU,KAAK,gBACf,KAAM,CACJ,MAAO,SAAS,KAAA,CAClB,CACD,CACH,CAEQ,YAAqB,CAC3B,GAAI,KAAK,QACP,OAAO,KAAK,QAAA,EAGd,MAAM7B,EAAM,OAAO,SAAS,KAE5B,OAAI,OAAO,SAAS,WAAa,QAExB,IADU,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,OAAS,EAC3C,GAAG,OAAO,SAAS,IAAI,GAGrCA,CACT,CAEQ,uBAAuBA,EAAqB,CAClD,GAAI,CACF,MAAM8B,EAAS,IAAI,IAAI9B,CAAG,EAC1B,MAAO,GAAG8B,EAAO,MAAM,GAAGA,EAAO,QAAQ,GAAGA,EAAO,IAAI,EACzD,MAAQ,CACN,KAAM,CAACC,CAAI,EAAI/B,EAAI,MAAM,GAAG,EAC5B,OAAO+B,CACT,CACF,CAKA,MAAa,OAAuB,CAClC,OAAO,KAAK,YAAA,CACd,CAKO,SAAgB,CACjB,KAAK,yBACP,QAAQ,UAAY,KAAK,uBAAuB,UAChD,QAAQ,aAAe,KAAK,uBAAuB,aACnD,KAAK,uBAAyB,MAG5B,OAAO,OAAW,MACpB,OAAO,oBAAoB,WAAY,KAAK,cAAc,EAC1D,SAAS,oBAAoB,mBAAoB,KAAK,sBAAsB,EAC5E,OAAO,oBAAoB,eAAgB,KAAK,WAAW,EAC3D,OAAO,oBAAoB,WAAY,KAAK,WAAW,GAIrD,KAAK,eACP,aAAa,KAAK,YAAY,EAC9B,KAAK,aAAe,KAExB,CAEQ,kBAAkBH,EAA8B,CAEtD,GADIA,EAAM,WAAa,KAAK,iBACxB,CAACA,EAAM,KAAM,MAAO,GAExB,MAAMD,EAAOC,EAAM,KAEnB,UAAWI,KAAO,OAAO,KAAKL,CAAI,EAAG,CACnC,MAAMM,EAAQN,EAAKK,CAAG,EAEtB,GAAI,OAAOC,GAAU,UAAYA,IAAU,kBACzC,YAAK,OAAO,MAAM,YAAYD,CAAG,6CAA6CJ,EAAM,QAAQ,EAAE,EACvF,GAGT,MAAMM,EAAY,OAAOD,EAEzB,GAAIC,IAAc,WAAaA,IAAc,UAAYA,IAAc,SAAU,CAC/E,KAAK,OAAO,KAAK,YAAYF,CAAG,yBAAyBE,CAAS,yBAAyBN,EAAM,QAAQ,EAAE,EAC3G,OAAOD,EAAKK,CAAG,EACf,QACF,CAEI,OAAOC,GAAU,WACnBN,EAAKK,CAAG,EAAIC,EAAM,YAAA,EAEtB,CAEA,MAAO,EACT,CAEQ,cAAcL,EAA2B,CAC/C,GAAIA,EAAM,WAAa,KAAK,gBAAiB,OAE7C,MAAMO,EAAkB,KAAK,iBAAiB,QAAYC,EAAI,WAAaR,EAAM,QAAQ,EACzF,GAAI,CAACO,EAAiB,CACpB,KAAK,OAAO,KAAK,SAASP,EAAM,QAAQ,oBAAoB,EAC5D,MACF,CAEA,MAAMS,EAAoBF,EAAgB,WACpCG,EAAkBV,EAAM,KAC9B,GAAKU,EAEL,UAAWC,KAAoB,OAAO,KAAKD,CAAe,EAAG,CAC3D,MAAME,EAAgBF,EAAgBC,CAAgB,EAChDE,EAAkBJ,EAAkB,KAAKK,GAAQA,EAAK,OAASH,CAAgB,EAErF,GAAI,CAACE,EAAiB,CACpB,KAAK,OAAO,KAAK,YAAYF,CAAgB,gCAAgCX,EAAM,QAAQ,EAAE,EAC7F,QACF,CAEI,OAAOY,IAAkBC,EAAgB,MAC3C,KAAK,OAAO,KACV,YAAYA,EAAgB,IAAI,aAAaA,EAAgB,IAAI,yBAAyB,OAAOD,CAAa,EAAA,CAGpH,CACF,CAEA,MAAc,gBAAgC,CAC5C,MAAM,KAAK,cAAA,CACb,CAEA,MAAc,wBAAwC,CAChD,SAAS,kBAAoB,WAC/B,MAAM,KAAK,cAAA,CAEf,CAEQ,eAAsB,CAC5B,GAAI,KAAK,QAAQ,QAAU,KAAK,YAAY,KAAM,CAChD,KAAK,YAAA,EACL,MACF,CAEK,KAAK,eACR,KAAK,aAAe,OAAO,WAAW,IAAM,CAC1C,KAAK,YAAA,CACP,EAAG,KAAK,YAAY,OAAO,EAE/B,CAEA,MAAc,aAA6B,CAMzC,GALI,KAAK,eACP,aAAa,KAAK,YAAY,EAC9B,KAAK,aAAe,MAGlB,KAAK,QAAQ,SAAW,EAAG,OAE/B,MAAMG,EAAe,CAAC,GAAG,KAAK,OAAO,EACrC,KAAK,QAAU,CAAA,EAEf,GAAI,CACF,MAAM,KAAK,WAAWA,CAAY,CACpC,OAAS5C,EAAO,CACd,KAAK,QAAQ,QAAQ,GAAG4C,CAAY,EACpC,KAAK,OAAO,MAAM,gCAAiC5C,CAAK,CAC1D,CACF,CAEA,MAAc,WAAW6C,EAA4C,CACnE,GAAIA,EAAO,SAAW,EAEtB,GAAIA,EAAO,SAAW,EAAG,CACvB,MAAMhB,EAAQgB,EAAO,CAAC,EACtB,MAAMnD,EAAAA,WAAW,KAAK,4BAA6BmC,EAAO,CAAE,QAAS,KAAK,QAAS,CACrF,MACE,MAAMnC,EAAAA,WAAW,KAAK,4BAA6BmD,EAAQ,CAAE,QAAS,KAAK,QAAS,CAExF,CACF,CC3VO,MAAMC,CAAY,CACd,UACD,gBACA,aAAe,GACf,eAA+B,KAC/B,aAAuBxD,EAAAA,OAAO,MAAM,QAAQ,EAC5C,QAAkC,CAAA,EAClC,WAER,IAAI,gBAAqC,CACvC,OAAO,KAAK,eACd,CAEA,IAAI,aAAuB,CACzB,OAAO,KAAK,YACd,CAEA,IAAI,eAA8B,CAChC,OAAO,KAAK,cACd,CAEA,YAAYyD,EAAmB,CAC7B,KAAK,UAAYA,CACnB,CAGQ,gBAKR,MAAa,KAAK,CAChB,eAAAC,EACA,UAAAC,EACA,MAAAC,EAAQ,GACR,MAAAC,EACA,WAAA3D,EACA,WAAA4D,EAAa,GACb,qBAAA/B,EACA,QAAAC,CAAA,EACyC,CAMzC,GALA,KAAK,aAAe,GACpB,KAAK,eAAiB,KACtB,KAAK,iBAAiB,QAAA,EACtB,KAAK,gBAAkB,OAEnB8B,EACF,YAAK,aAAa,KAAK,wDAAwD,EAC/E,KAAK,aAAe,GACpB,KAAK,eAAiB,KACtB,KAAK,aAAa,UAAU,CAAE,QAAS,GAAO,EACvC,KAET,GAAI,CAACJ,EAAgB,MAAM,IAAI,MAAM,sCAAsC,EAC3E,KAAK,gBAAkBA,EAGvB,KAAK,aAAa,UAAU,CAC1B,QAASE,EACT,MAAOA,EAAQ,QAAU,MAAA,CAC1B,EAED,KAAK,QAAU,CACb,eAAgB,KAAK,UACrB,YAAa,KAAK,gBAClB,GAAID,GAAa,CAAE,kBAAmBA,CAAA,CAAU,EAGlD,KAAK,WAAazD,EAElB,GAAI,CACF,MAAM6D,EAAU,MAAM,KAAK,kBAAA,EAC3B,MAAM,KAAK,mBAAmBA,EAASF,EAAO9B,EAAsBC,CAAO,EAC3E,KAAK,aAAe,GACpB,KAAK,eAAiB,KACtB,KAAK,aAAa,KAAK,2BAA4B,CACjD,UAAW,KAAK,UAChB,eAAgB,KAAK,eAAA,CACtB,CACH,OAAStB,EAAO,CACd,KAAK,aAAa,MAAM,+BAAgCA,CAAK,EAC7D,KAAK,aAAe,GACpB,KAAK,eAAiBA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,6BAA6B,CAChG,CAEA,OAAO,IACT,CAEA,MAAa,OAAuB,CAClC,OAAO,KAAK,iBAAiB,MAAA,CAC/B,CAEO,SAAgB,CACrB,KAAK,iBAAiB,QAAA,CACxB,CAEA,MAAa,MAAmC0B,EAA2B,CACzE,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,gBAAiB,CAC/C,KAAK,aAAa,KAAK,wDAAwD,EAC/E,MACF,CAEA,OAAO,KAAK,gBAAgB,MAAMA,CAAO,CAC3C,CAEA,MAAc,mBAAiD,CAC7D,GAAI,CACF,MAAMjC,EAA6C,MAAMC,EAAAA,WAAW,KAClE,iCACA,CAAA,EACA,CAAE,QAAS,KAAK,OAAA,CAAQ,EAE1B,GAAI,CAACD,EAAS,GACZ,MAAM,IAAI,MAAMA,EAAS,OAAO,SAAW,yCAAyC,EAEtF,OAAOA,EAAS,IAClB,OAASO,EAAO,CACd,WAAK,aAAa,MAAM,8BAA+BA,CAAK,EACtDA,CACR,CACF,CAEA,MAAc,mBACZqD,EACAnC,EACAG,EACAC,EACe,CACf,MAAMgC,EAAkB,IAAIjE,EAAgB,KAAK,aAAc,KAAK,QAAS,KAAK,UAAU,EACtFkE,EAAkB,IAAIxC,EAAgB,CAC1C,OAAQ,KAAK,aACb,QAAS,KAAK,QACd,UAAWsC,EAAQ,UACnB,iBAAkBA,EAAQ,iBAC1B,YAAAnC,EACA,qBAAAG,EACA,QAAAC,EACA,WAAY,MAAOrB,GAAgB,CACjC,MAAMqD,EAAgB,yBAAyB,CAAE,IAAArD,EAAK,CACxD,EACA,QAAS,MAAO4B,EAA0B5B,IAAgB,CACxD,MAAMqD,EAAgB,yBAAyB,CAAE,SAAUzB,EAAM,SAAU,UAAWA,EAAM,KAAM,IAAA5B,EAAK,CACzG,CAAA,CACD,EAED,MAAMqD,EAAgB,eAAA,EAElB,OAAO,OAAW,MACpB,MAAMC,EAAgB,sBAAA,EACtB,MAAMA,EAAgB,cAAA,EACtB,MAAMA,EAAgB,MAAA,GAGxB,KAAK,gBAAkBA,CACzB,CACF,CAEO,MAAMC,EAAgBT,GAAsB,IAAID,EAAYC,CAAS"}
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-BF32gejA.js"),t=i=>e.initAsModule(i);exports.NemmeClient=e.NemmeClient;exports.NemmeSDK=t;exports.default=t;
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-DhycnG8v.js";
2
- import { N as i } from "./chunks/client-DhycnG8v.js";
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,