@xenia-martech/sdk-js 1.2.0-dev.1 → 1.2.0-dev.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +6 -1
  2. package/dist/{actions-D9_aAvCv.d.cts → actions-Bhji05Pe.d.cts} +19 -4
  3. package/dist/{actions-D9_aAvCv.d.ts → actions-Bhji05Pe.d.ts} +19 -4
  4. package/dist/{api-CktVQ6Gl.d.ts → api-BqSvWgBZ.d.cts} +4 -2
  5. package/dist/{api-BEPW0Uan.d.cts → api-ByoECRhR.d.ts} +4 -2
  6. package/dist/{chunk-DWFVDNU5.js → chunk-INM2SPH4.js} +4 -4
  7. package/dist/chunk-INM2SPH4.js.map +1 -0
  8. package/dist/{chunk-7NGJC7CF.js → chunk-TGG5Y4QD.js} +17 -6
  9. package/dist/chunk-TGG5Y4QD.js.map +1 -0
  10. package/dist/{chunk-3PYPPIUM.cjs → chunk-TRRMMPBH.cjs} +13 -13
  11. package/dist/chunk-TRRMMPBH.cjs.map +1 -0
  12. package/dist/{chunk-IBNIRT7J.cjs → chunk-YZG6JR4E.cjs} +17 -6
  13. package/dist/chunk-YZG6JR4E.cjs.map +1 -0
  14. package/dist/client/index.cjs +43 -8
  15. package/dist/client/index.cjs.map +1 -1
  16. package/dist/client/index.d.cts +2 -2
  17. package/dist/client/index.d.ts +2 -2
  18. package/dist/client/index.js +43 -8
  19. package/dist/client/index.js.map +1 -1
  20. package/dist/client/react/index.cjs +46 -11
  21. package/dist/client/react/index.cjs.map +1 -1
  22. package/dist/client/react/index.d.cts +2 -2
  23. package/dist/client/react/index.d.ts +2 -2
  24. package/dist/client/react/index.js +46 -11
  25. package/dist/client/react/index.js.map +1 -1
  26. package/dist/cms/contentful.cjs +2 -1
  27. package/dist/cms/contentful.cjs.map +1 -1
  28. package/dist/cms/contentful.d.cts +1 -1
  29. package/dist/cms/contentful.d.ts +1 -1
  30. package/dist/cms/contentful.js +2 -1
  31. package/dist/cms/contentful.js.map +1 -1
  32. package/dist/{cookie-names-CLqtmGBM.d.ts → cookie-names-Bxd-VNyJ.d.ts} +1 -1
  33. package/dist/{cookie-names-BACctagz.d.cts → cookie-names-RXVfGYPE.d.cts} +1 -1
  34. package/dist/index.cjs +21 -21
  35. package/dist/index.d.cts +4 -4
  36. package/dist/index.d.ts +4 -4
  37. package/dist/index.js +1 -1
  38. package/dist/next/index.cjs +9 -9
  39. package/dist/next/index.d.cts +3 -3
  40. package/dist/next/index.d.ts +3 -3
  41. package/dist/next/index.js +2 -2
  42. package/dist/{personalize-content-Clc1oMYY.d.cts → personalize-content-Bf6YZdkZ.d.cts} +12 -1
  43. package/dist/{personalize-content-Clc1oMYY.d.ts → personalize-content-Bf6YZdkZ.d.ts} +12 -1
  44. package/dist/server/index.cjs +19 -19
  45. package/dist/server/index.d.cts +5 -5
  46. package/dist/server/index.d.ts +5 -5
  47. package/dist/server/index.js +3 -3
  48. package/dist/xenia-sdk.iife.js +3 -3
  49. package/dist/xenia-sdk.iife.js.map +1 -1
  50. package/dist/{xenia-server-BWhWD0La.d.ts → xenia-server-CcjQenru.d.ts} +2 -2
  51. package/dist/{xenia-server-o_wDOcei.d.cts → xenia-server-MlI3Khya.d.cts} +2 -2
  52. package/package.json +1 -1
  53. package/dist/chunk-3PYPPIUM.cjs.map +0 -1
  54. package/dist/chunk-7NGJC7CF.js.map +0 -1
  55. package/dist/chunk-DWFVDNU5.js.map +0 -1
  56. package/dist/chunk-IBNIRT7J.cjs.map +0 -1
@@ -1,5 +1,5 @@
1
- import { I as InteractionType, X as XeniaConfig, a as XeniaEvent, M as MessageCta, b as MessageTemplateFn, c as MessageComponentRenderer, W as WidgetFormSubmit, d as WidgetSubmitResponse, e as XeniaAction, f as MessagePlacement, C as ConsentState } from '../actions-D9_aAvCv.cjs';
2
- export { A as AnalyticsContext, g as AnalyticsEventName, h as AnalyticsIdentity, i as AnalyticsIngestResponse, j as AppliedSwap, k as ClientEvent, l as CmsAdapter, m as ContentSwap, n as IdentifyRequest, o as IdentifyResponse, p as Identity, J as JsonValue, q as MessageMountContext, r as MessageRenderContext, P as PagePersonalizeOptions, s as PageRef, t as PersonalizationSwap, R as ResolveBatchItem, u as ResolveBatchResult, v as ResolveOptions, w as ResolveResult, T as TrackOptions, x as WebhookResponse, y as WidgetPrize, z as WidgetSegment, B as WidgetType, D as XeniaClient, E as XeniaClientOptions, F as XeniaMarker, G as createXeniaClient, H as extractContentSwaps, K as parseActions, L as pendingTargets, N as personalizeContent, O as personalizePage, Q as spliceSlots } from '../actions-D9_aAvCv.cjs';
1
+ import { I as InteractionType, X as XeniaConfig, a as XeniaEvent, M as MessageCta, b as MessageTemplateFn, c as MessageComponentRenderer, W as WidgetFormSubmit, d as WidgetSubmitResponse, e as XeniaAction, f as MessagePlacement, C as ConsentState } from '../actions-Bhji05Pe.cjs';
2
+ export { A as AnalyticsContext, g as AnalyticsEventName, h as AnalyticsIdentity, i as AnalyticsIngestResponse, j as AppliedSwap, k as ClientEvent, l as CmsAdapter, m as ContentSwap, n as IdentifyRequest, o as IdentifyResponse, p as Identity, J as JsonValue, q as MessageMountContext, r as MessageRenderContext, P as PagePersonalizeOptions, s as PageRef, t as PersonalizationSwap, R as ResolveBatchItem, u as ResolveBatchResult, v as ResolveOptions, w as ResolveResult, T as TrackOptions, x as WebhookResponse, y as WidgetPrize, z as WidgetSegment, B as WidgetType, D as XeniaClient, E as XeniaClientOptions, F as XeniaMarker, G as createXeniaClient, H as extractContentSwaps, K as parseActions, L as pendingTargets, N as personalizeContent, O as personalizePage, Q as spliceSlots } from '../actions-Bhji05Pe.cjs';
3
3
 
4
4
  interface Parsed {
5
5
  eventId: string;
@@ -1,5 +1,5 @@
1
- import { I as InteractionType, X as XeniaConfig, a as XeniaEvent, M as MessageCta, b as MessageTemplateFn, c as MessageComponentRenderer, W as WidgetFormSubmit, d as WidgetSubmitResponse, e as XeniaAction, f as MessagePlacement, C as ConsentState } from '../actions-D9_aAvCv.js';
2
- export { A as AnalyticsContext, g as AnalyticsEventName, h as AnalyticsIdentity, i as AnalyticsIngestResponse, j as AppliedSwap, k as ClientEvent, l as CmsAdapter, m as ContentSwap, n as IdentifyRequest, o as IdentifyResponse, p as Identity, J as JsonValue, q as MessageMountContext, r as MessageRenderContext, P as PagePersonalizeOptions, s as PageRef, t as PersonalizationSwap, R as ResolveBatchItem, u as ResolveBatchResult, v as ResolveOptions, w as ResolveResult, T as TrackOptions, x as WebhookResponse, y as WidgetPrize, z as WidgetSegment, B as WidgetType, D as XeniaClient, E as XeniaClientOptions, F as XeniaMarker, G as createXeniaClient, H as extractContentSwaps, K as parseActions, L as pendingTargets, N as personalizeContent, O as personalizePage, Q as spliceSlots } from '../actions-D9_aAvCv.js';
1
+ import { I as InteractionType, X as XeniaConfig, a as XeniaEvent, M as MessageCta, b as MessageTemplateFn, c as MessageComponentRenderer, W as WidgetFormSubmit, d as WidgetSubmitResponse, e as XeniaAction, f as MessagePlacement, C as ConsentState } from '../actions-Bhji05Pe.js';
2
+ export { A as AnalyticsContext, g as AnalyticsEventName, h as AnalyticsIdentity, i as AnalyticsIngestResponse, j as AppliedSwap, k as ClientEvent, l as CmsAdapter, m as ContentSwap, n as IdentifyRequest, o as IdentifyResponse, p as Identity, J as JsonValue, q as MessageMountContext, r as MessageRenderContext, P as PagePersonalizeOptions, s as PageRef, t as PersonalizationSwap, R as ResolveBatchItem, u as ResolveBatchResult, v as ResolveOptions, w as ResolveResult, T as TrackOptions, x as WebhookResponse, y as WidgetPrize, z as WidgetSegment, B as WidgetType, D as XeniaClient, E as XeniaClientOptions, F as XeniaMarker, G as createXeniaClient, H as extractContentSwaps, K as parseActions, L as pendingTargets, N as personalizeContent, O as personalizePage, Q as spliceSlots } from '../actions-Bhji05Pe.js';
3
3
 
4
4
  interface Parsed {
5
5
  eventId: string;
@@ -546,7 +546,7 @@ var XeniaApi = class {
546
546
  * ({@link personalizeContent}) calls this once per round with the runtime
547
547
  * targets it found; callers rarely need it directly.
548
548
  */
549
- async resolveEntries(entryIds, opts = {}) {
549
+ async resolveEntries(entryIds, opts) {
550
550
  const { data } = await this.http.request({
551
551
  method: "POST",
552
552
  path: "/api/personalization/resolve-entries",
@@ -554,7 +554,8 @@ var XeniaApi = class {
554
554
  body: compact({
555
555
  entryIds,
556
556
  data: opts.data,
557
- locale: opts.locale
557
+ locale: opts.locale,
558
+ contentKey: opts.contentKey
558
559
  })
559
560
  });
560
561
  return data;
@@ -678,7 +679,7 @@ var DEFAULT_TIMEOUT_MS = 300;
678
679
  var DEFAULT_MAX_ROUNDS = 3;
679
680
  var copyOf = (v) => v && typeof v === "object" && typeof structuredClone === "function" ? structuredClone(v) : v;
680
681
  async function personalizeContent(payload, options) {
681
- const { cms } = options;
682
+ const cms = scopedAdapter(options.cms, options.contentKey);
682
683
  const maxRounds = options.maxRounds ?? DEFAULT_MAX_ROUNDS;
683
684
  const deadline = Date.now() + (options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
684
685
  const applied = [];
@@ -877,7 +878,8 @@ function withDeadline(promise, deadline) {
877
878
  })
878
879
  ]).finally(() => clearTimeout(timer));
879
880
  }
880
- function pendingTargets(payload, cms) {
881
+ function pendingTargets(payload, adapter, contentKey) {
882
+ const cms = scopedAdapter(adapter, contentKey);
881
883
  try {
882
884
  let content = typeof structuredClone === "function" ? structuredClone(payload) : payload;
883
885
  content = cms.prepare ? cms.prepare(content) : content;
@@ -888,6 +890,15 @@ function pendingTargets(payload, cms) {
888
890
  return [];
889
891
  }
890
892
  }
893
+ function scopedAdapter(cms, contentKey) {
894
+ return {
895
+ ...cms,
896
+ marker(entry) {
897
+ const m = cms.marker(entry);
898
+ return m && contentKey && m.keys?.includes(contentKey) ? m : null;
899
+ }
900
+ };
901
+ }
891
902
  async function personalizePage(ref, options) {
892
903
  let page;
893
904
  try {
@@ -1229,6 +1240,20 @@ var AutoTracker = class {
1229
1240
  }
1230
1241
  };
1231
1242
 
1243
+ // src/server/cookies.ts
1244
+ function parseCookies(header) {
1245
+ const out = {};
1246
+ if (!header) return out;
1247
+ for (const part of header.split(";")) {
1248
+ const idx = part.indexOf("=");
1249
+ if (idx === -1) continue;
1250
+ const key = part.slice(0, idx).trim();
1251
+ const value = part.slice(idx + 1).trim();
1252
+ if (key) out[key] = decodeURIComponent(value);
1253
+ }
1254
+ return out;
1255
+ }
1256
+
1232
1257
  // src/client/identity.ts
1233
1258
  var SESSION_TIMEOUT_MS = 30 * 60 * 1e3;
1234
1259
  var Identity = class {
@@ -1276,10 +1301,19 @@ var Identity = class {
1276
1301
  } catch {
1277
1302
  }
1278
1303
  }
1304
+ /** The visitor id already in the cookie — e.g. minted by `xeniaProxy()` on the first request. */
1305
+ readVisitorCookie() {
1306
+ if (!this.cookie || typeof document === "undefined") return null;
1307
+ try {
1308
+ return parseCookies(document.cookie)[this.cookieName()] || null;
1309
+ } catch {
1310
+ return null;
1311
+ }
1312
+ }
1279
1313
  // ── Device id ────────────────────────────────────────────────────────────
1280
1314
  /**
1281
- * Resolve a stable device id: localStorage cache → MediaDevices → SHA-256
1282
- * browser fingerprint. Cached for the session and across reloads.
1315
+ * Resolve a stable device id: localStorage cache → the visitor cookie a server already set →
1316
+ * MediaDevices → SHA-256 browser fingerprint. Cached for the session and across reloads.
1283
1317
  */
1284
1318
  async resolveDeviceId() {
1285
1319
  if (this.deviceId) {
@@ -1296,7 +1330,8 @@ var Identity = class {
1296
1330
  }
1297
1331
  } catch {
1298
1332
  }
1299
- let id = await this.mediaDeviceId();
1333
+ let id = this.readVisitorCookie();
1334
+ if (!id) id = await this.mediaDeviceId();
1300
1335
  if (!id) id = await this.fingerprint();
1301
1336
  this.deviceId = id;
1302
1337
  try {
@@ -2375,7 +2410,7 @@ var XeniaClient = class {
2375
2410
  return personalizePage(ref, { ...opts, resolve: this.entryResolver(opts) });
2376
2411
  }
2377
2412
  entryResolver(opts) {
2378
- const resolveOpts = this.withVisitor({ data: opts.data, locale: opts.locale });
2413
+ const resolveOpts = { ...this.withVisitor({ data: opts.data, locale: opts.locale }), contentKey: opts.contentKey };
2379
2414
  return async (ids) => (await this.api.resolveEntries(ids, resolveOpts)).decisions ?? [];
2380
2415
  }
2381
2416
  /** The SDK-owned visitor anchor: the `identify()`/`config.visitorId` id, else the device id. */