@xenia-martech/sdk-js 1.1.0 → 1.2.0-dev.2

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 (63) hide show
  1. package/README.md +50 -0
  2. package/assets/coverage.json +1 -0
  3. package/dist/{actions-CKeiofxJ.d.cts → actions-BcdlokGO.d.cts} +192 -4
  4. package/dist/{actions-CKeiofxJ.d.ts → actions-BcdlokGO.d.ts} +192 -4
  5. package/dist/api-BEPW0Uan.d.cts +88 -0
  6. package/dist/api-CktVQ6Gl.d.ts +88 -0
  7. package/dist/{chunk-U2WBBOYT.cjs → chunk-3PYPPIUM.cjs} +35 -10
  8. package/dist/chunk-3PYPPIUM.cjs.map +1 -0
  9. package/dist/{chunk-FYSEKFIY.js → chunk-7NGJC7CF.js} +249 -3
  10. package/dist/chunk-7NGJC7CF.js.map +1 -0
  11. package/dist/{chunk-WYAMPEVV.js → chunk-DWFVDNU5.js} +28 -3
  12. package/dist/chunk-DWFVDNU5.js.map +1 -0
  13. package/dist/{chunk-JEKVN7HK.cjs → chunk-IBNIRT7J.cjs} +251 -2
  14. package/dist/chunk-IBNIRT7J.cjs.map +1 -0
  15. package/dist/{chunk-TLTG3BTC.js → chunk-OUZU4Z5B.js} +2 -2
  16. package/dist/{chunk-TLTG3BTC.js.map → chunk-OUZU4Z5B.js.map} +1 -1
  17. package/dist/{chunk-5D7SJIO4.cjs → chunk-PKWANLT7.cjs} +2 -2
  18. package/dist/{chunk-5D7SJIO4.cjs.map → chunk-PKWANLT7.cjs.map} +1 -1
  19. package/dist/client/index.cjs +314 -12
  20. package/dist/client/index.cjs.map +1 -1
  21. package/dist/client/index.d.cts +2 -2
  22. package/dist/client/index.d.ts +2 -2
  23. package/dist/client/index.js +312 -13
  24. package/dist/client/index.js.map +1 -1
  25. package/dist/client/react/index.cjs +402 -16
  26. package/dist/client/react/index.cjs.map +1 -1
  27. package/dist/client/react/index.d.cts +53 -3
  28. package/dist/client/react/index.d.ts +53 -3
  29. package/dist/client/react/index.js +396 -17
  30. package/dist/client/react/index.js.map +1 -1
  31. package/dist/cms/contentful.cjs +138 -0
  32. package/dist/cms/contentful.cjs.map +1 -0
  33. package/dist/cms/contentful.d.cts +57 -0
  34. package/dist/cms/contentful.d.ts +57 -0
  35. package/dist/cms/contentful.js +134 -0
  36. package/dist/cms/contentful.js.map +1 -0
  37. package/dist/{cookie-names-QYMiEMAq.d.cts → cookie-names-BACctagz.d.cts} +1 -1
  38. package/dist/{cookie-names-8FxbGKGS.d.ts → cookie-names-CLqtmGBM.d.ts} +1 -1
  39. package/dist/index.cjs +35 -23
  40. package/dist/index.d.cts +4 -3
  41. package/dist/index.d.ts +4 -3
  42. package/dist/index.js +2 -2
  43. package/dist/next/index.cjs +41 -9
  44. package/dist/next/index.cjs.map +1 -1
  45. package/dist/next/index.d.cts +32 -3
  46. package/dist/next/index.d.ts +32 -3
  47. package/dist/next/index.js +14 -3
  48. package/dist/next/index.js.map +1 -1
  49. package/dist/{api-URhxxi4x.d.cts → personalize-content-Clc1oMYY.d.cts} +152 -69
  50. package/dist/{api-URhxxi4x.d.ts → personalize-content-Clc1oMYY.d.ts} +152 -69
  51. package/dist/server/index.cjs +29 -17
  52. package/dist/server/index.d.cts +5 -4
  53. package/dist/server/index.d.ts +5 -4
  54. package/dist/server/index.js +4 -4
  55. package/dist/xenia-sdk.iife.js +3 -3
  56. package/dist/xenia-sdk.iife.js.map +1 -1
  57. package/dist/{xenia-server-Cti94W49.d.cts → xenia-server-BWhWD0La.d.ts} +15 -1
  58. package/dist/{xenia-server-DDtQp6Wi.d.ts → xenia-server-o_wDOcei.d.cts} +15 -1
  59. package/package.json +15 -1
  60. package/dist/chunk-FYSEKFIY.js.map +0 -1
  61. package/dist/chunk-JEKVN7HK.cjs.map +0 -1
  62. package/dist/chunk-U2WBBOYT.cjs.map +0 -1
  63. package/dist/chunk-WYAMPEVV.js.map +0 -1
@@ -0,0 +1,138 @@
1
+ 'use strict';
2
+
3
+ // src/cms/contentful.ts
4
+ var KINDS = /* @__PURE__ */ new Set(["static", "runtime"]);
5
+ var OPS = /* @__PURE__ */ new Set(["replace", "expand", "items"]);
6
+ function contentfulAdapter(options = {}) {
7
+ const markerField = options.markerField ?? "xenia";
8
+ const variantsField = options.variantsField ?? "xeniaVariants";
9
+ const include = options.include ?? 4;
10
+ const getEntries = async (query, locale) => {
11
+ const q = { include, ...locale ? { locale } : {}, ...query };
12
+ if (options.client) {
13
+ const res2 = await options.client.getEntries(q);
14
+ return resolveCollection(res2);
15
+ }
16
+ if (!options.space || !options.accessToken) {
17
+ throw new Error("contentfulAdapter: pass `client` or `space` + `accessToken` to fetch replacements");
18
+ }
19
+ const params = new URLSearchParams();
20
+ for (const [k, v] of Object.entries(q)) if (v !== void 0) params.set(k, String(v));
21
+ const url = `https://${options.host ?? "cdn.contentful.com"}/spaces/${encodeURIComponent(options.space)}/environments/${encodeURIComponent(options.environment ?? "master")}/entries?${params}`;
22
+ const res = await (options.fetch ?? fetch)(url, { headers: { Authorization: `Bearer ${options.accessToken}` } });
23
+ if (!res.ok) throw new Error(`Contentful CDA ${res.status}`);
24
+ return resolveCollection(await res.json());
25
+ };
26
+ return {
27
+ entryId(value) {
28
+ const sys = value?.sys;
29
+ return sys && sys.type === "Entry" && typeof sys.id === "string" ? sys.id : void 0;
30
+ },
31
+ marker(entry) {
32
+ return parseMarker(entry.fields?.[markerField]);
33
+ },
34
+ staticVariants(entry) {
35
+ const v = entry.fields?.[variantsField];
36
+ return Array.isArray(v) ? v.filter((x) => x?.sys?.type === "Entry") : [];
37
+ },
38
+ getField: (entry, field) => entry.fields?.[field],
39
+ setField(entry, field, value) {
40
+ entry.fields = entry.fields ?? {};
41
+ entry.fields[field] = value;
42
+ },
43
+ mergeItems(entry, replacement) {
44
+ for (const [key, value] of Object.entries(replacement.fields ?? {})) {
45
+ if (Array.isArray(value)) entry.fields[key] = value;
46
+ }
47
+ },
48
+ clearMarker(entry) {
49
+ if (!entry.fields) return;
50
+ delete entry.fields[markerField];
51
+ delete entry.fields[variantsField];
52
+ },
53
+ prepare: (payload) => resolveCollection(payload, true),
54
+ fetchEntries: (ids, locale) => getEntries({ "sys.id[in]": ids.join(","), limit: ids.length }, locale),
55
+ queryEntries(query, locale) {
56
+ const q = { content_type: query.contentType, limit: query.limit };
57
+ if (query.order) q.order = query.order;
58
+ for (const f of query.filters ?? []) Object.assign(q, filterParam(f));
59
+ return getEntries(q, locale);
60
+ },
61
+ async fetchPage(ref, locale) {
62
+ const q = typeof ref === "string" ? { "sys.id": ref } : { content_type: ref.contentType };
63
+ if (typeof ref !== "string") for (const [k, v] of Object.entries(ref.fields)) q[`fields.${k}`] = v;
64
+ return (await getEntries({ ...q, limit: 1 }, locale))[0] ?? null;
65
+ }
66
+ };
67
+ }
68
+ function parseMarker(raw) {
69
+ let value = raw;
70
+ if (typeof value === "string") {
71
+ try {
72
+ value = JSON.parse(value);
73
+ } catch {
74
+ return null;
75
+ }
76
+ }
77
+ if (!value || typeof value !== "object") return null;
78
+ const m = value;
79
+ if (!KINDS.has(m.kind)) return null;
80
+ return {
81
+ kind: m.kind,
82
+ op: OPS.has(m.op) ? m.op : "replace",
83
+ field: typeof m.field === "string" && m.field ? m.field : void 0,
84
+ limit: typeof m.limit === "number" ? m.limit : void 0
85
+ };
86
+ }
87
+ function filterParam(f) {
88
+ const path = /^(fields|sys|metadata)\./.test(f.field) ? f.field : `fields.${f.field}`;
89
+ const op = f.op ?? "eq";
90
+ return { [op === "eq" ? path : `${path}[${op}]`]: f.value };
91
+ }
92
+ function resolveCollection(payload, asPage = false) {
93
+ const p = payload;
94
+ if (!p || typeof p !== "object" || !Array.isArray(p.items)) return payload;
95
+ if (!p.includes) return asPage ? payload : p.items;
96
+ const index = /* @__PURE__ */ new Map();
97
+ const key = (type, id) => `${type}:${id}`;
98
+ for (const e of [...p.items, ...p.includes.Entry ?? []]) {
99
+ if (e?.sys?.id) index.set(key(e.sys.type, e.sys.id), e);
100
+ }
101
+ for (const a of p.includes.Asset ?? []) if (a?.sys?.id) index.set(key("Asset", a.sys.id), a);
102
+ const done = /* @__PURE__ */ new Map();
103
+ const inProgress = /* @__PURE__ */ new Set();
104
+ const resolve = (value) => {
105
+ if (Array.isArray(value)) return value.map(resolve);
106
+ if (!value || typeof value !== "object") return value;
107
+ const sys = value.sys;
108
+ if (sys?.type === "Link" && sys.linkType && sys.id) {
109
+ const target = index.get(key(sys.linkType, sys.id));
110
+ if (!target || inProgress.has(target)) return value;
111
+ return resolveEntity(target);
112
+ }
113
+ if (sys && (sys.type === "Entry" || sys.type === "Asset")) return resolveEntity(value);
114
+ const out = {};
115
+ for (const [k, v] of Object.entries(value)) out[k] = resolve(v);
116
+ return out;
117
+ };
118
+ const resolveEntity = (entity) => {
119
+ if (done.has(entity)) return done.get(entity);
120
+ const e = entity;
121
+ const copy = { ...e, fields: {} };
122
+ done.set(entity, copy);
123
+ inProgress.add(entity);
124
+ for (const [k, v] of Object.entries(e.fields ?? {})) copy.fields[k] = resolve(v);
125
+ inProgress.delete(entity);
126
+ return copy;
127
+ };
128
+ const items = p.items.map(resolve);
129
+ if (!asPage) return items;
130
+ const { includes: _drop, ...rest } = p;
131
+ return { ...rest, items };
132
+ }
133
+
134
+ exports.contentfulAdapter = contentfulAdapter;
135
+ exports.parseMarker = parseMarker;
136
+ exports.resolveCollection = resolveCollection;
137
+ //# sourceMappingURL=contentful.cjs.map
138
+ //# sourceMappingURL=contentful.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cms/contentful.ts"],"names":["res"],"mappings":"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","file":"contentful.cjs","sourcesContent":["/**\n * Contentful adapter for {@link personalizeContent}.\n *\n * Works with either a contentful.js client (`createClient(...)`, links resolved by the client) or\n * raw Content Delivery API credentials (links resolved here). Pages can be passed as an entry, an\n * array of entries, or a raw CDA collection response (`{ items, includes }`).\n *\n * Expects the two fields Xenia adds to personalized content types: `xenia` (JSON marker) and\n * `xeniaVariants` (references, static replacements only). Single-locale payloads only — don't\n * fetch with `withAllLocales` / `locale=*`.\n */\n\nimport type { CmsAdapter, XeniaMarker } from \"../core/personalize-content\";\nimport type { EntryFilter } from \"../core/types\";\n\n/** The subset of a contentful.js client this adapter calls. */\nexport interface ContentfulClientLike {\n getEntries(query: Record<string, unknown>): Promise<{ items: unknown[]; includes?: unknown }>;\n}\n\nexport interface ContentfulAdapterOptions {\n /** A contentful.js client. Takes precedence over raw credentials. */\n client?: ContentfulClientLike;\n space?: string;\n accessToken?: string;\n environment?: string;\n /** `cdn.contentful.com` (default) or `preview.contentful.com`. */\n host?: string;\n /** Link depth fetched with pages and replacement entries (0-10). Default 4 — raise it for deeper pages. */\n include?: number;\n /** Marker field ids, if your content types name them differently. */\n markerField?: string;\n variantsField?: string;\n fetch?: typeof fetch;\n}\n\ntype Entry = { sys: { id: string; type: string; contentType?: unknown }; fields: Record<string, unknown> };\n\nconst KINDS = new Set([\"static\", \"runtime\"]);\nconst OPS = new Set([\"replace\", \"expand\", \"items\"]);\n\nexport function contentfulAdapter(options: ContentfulAdapterOptions = {}): CmsAdapter<Entry> {\n const markerField = options.markerField ?? \"xenia\";\n const variantsField = options.variantsField ?? \"xeniaVariants\";\n const include = options.include ?? 4;\n\n const getEntries = async (query: Record<string, unknown>, locale?: string): Promise<Entry[]> => {\n const q = { include, ...(locale ? { locale } : {}), ...query };\n if (options.client) {\n const res = await options.client.getEntries(q);\n return resolveCollection(res) as Entry[];\n }\n if (!options.space || !options.accessToken) {\n throw new Error(\"contentfulAdapter: pass `client` or `space` + `accessToken` to fetch replacements\");\n }\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(q)) if (v !== undefined) params.set(k, String(v));\n const url =\n `https://${options.host ?? \"cdn.contentful.com\"}/spaces/${encodeURIComponent(options.space)}` +\n `/environments/${encodeURIComponent(options.environment ?? \"master\")}/entries?${params}`;\n const res = await (options.fetch ?? fetch)(url, { headers: { Authorization: `Bearer ${options.accessToken}` } });\n if (!res.ok) throw new Error(`Contentful CDA ${res.status}`);\n return resolveCollection(await res.json()) as Entry[];\n };\n\n return {\n entryId(value) {\n const sys = (value as Entry | null)?.sys;\n return sys && sys.type === \"Entry\" && typeof sys.id === \"string\" ? sys.id : undefined;\n },\n\n marker(entry) {\n return parseMarker(entry.fields?.[markerField]);\n },\n\n staticVariants(entry) {\n const v = entry.fields?.[variantsField];\n return Array.isArray(v) ? v.filter((x): x is Entry => (x as Entry)?.sys?.type === \"Entry\") : [];\n },\n\n getField: (entry, field) => entry.fields?.[field],\n setField(entry, field, value) {\n entry.fields = entry.fields ?? {};\n entry.fields[field] = value;\n },\n\n mergeItems(entry, replacement) {\n for (const [key, value] of Object.entries(replacement.fields ?? {})) {\n if (Array.isArray(value)) entry.fields[key] = value;\n }\n },\n\n clearMarker(entry) {\n if (!entry.fields) return;\n delete entry.fields[markerField];\n delete entry.fields[variantsField];\n },\n\n prepare: (payload) => resolveCollection(payload, true),\n\n fetchEntries: (ids, locale) => getEntries({ \"sys.id[in]\": ids.join(\",\"), limit: ids.length }, locale),\n\n queryEntries(query, locale) {\n const q: Record<string, unknown> = { content_type: query.contentType, limit: query.limit };\n if (query.order) q.order = query.order;\n for (const f of query.filters ?? []) Object.assign(q, filterParam(f));\n return getEntries(q, locale);\n },\n\n async fetchPage(ref, locale) {\n const q: Record<string, unknown> =\n typeof ref === \"string\" ? { \"sys.id\": ref } : { content_type: ref.contentType };\n if (typeof ref !== \"string\") for (const [k, v] of Object.entries(ref.fields)) q[`fields.${k}`] = v;\n return (await getEntries({ ...q, limit: 1 }, locale))[0] ?? null;\n },\n };\n}\n\n/** Parse the `xenia` field (object, or its JSON text). Unknown shapes → not personalized. */\nexport function parseMarker(raw: unknown): XeniaMarker | null {\n let value = raw;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n return null;\n }\n }\n if (!value || typeof value !== \"object\") return null;\n const m = value as Record<string, unknown>;\n if (!KINDS.has(m.kind as string)) return null;\n return {\n kind: m.kind as XeniaMarker[\"kind\"],\n op: OPS.has(m.op as string) ? (m.op as XeniaMarker[\"op\"]) : \"replace\",\n field: typeof m.field === \"string\" && m.field ? m.field : undefined,\n limit: typeof m.limit === \"number\" ? m.limit : undefined,\n };\n}\n\n/** CMS-neutral filter → CDA query param (`fields.category[in]=a,b`). */\nfunction filterParam(f: EntryFilter): Record<string, string> {\n const path = /^(fields|sys|metadata)\\./.test(f.field) ? f.field : `fields.${f.field}`;\n const op = f.op ?? \"eq\";\n return { [op === \"eq\" ? path : `${path}[${op}]`]: f.value };\n}\n\n/**\n * Resolve CDA links in a raw collection response (`{ items, includes }`) into nested entries.\n * Shared entries become shared objects; a link back to an entry still being resolved (a cycle)\n * stays a link stub, so the result stays JSON-serializable (RSC props, caches). Anything that is\n * not a raw collection (an entry, an array, contentful.js output) is returned as-is. With\n * `asPage` the collection shape is kept (minus `includes`); otherwise just the resolved `items`.\n */\nexport function resolveCollection(payload: unknown, asPage = false): unknown {\n const p = payload as { items?: unknown[]; includes?: { Entry?: Entry[]; Asset?: unknown[] } } | null;\n if (!p || typeof p !== \"object\" || !Array.isArray(p.items)) return payload;\n if (!p.includes) return asPage ? payload : p.items;\n\n const index = new Map<string, unknown>();\n const key = (type: string, id: string) => `${type}:${id}`;\n for (const e of [...p.items, ...(p.includes.Entry ?? [])] as Entry[]) {\n if (e?.sys?.id) index.set(key(e.sys.type, e.sys.id), e);\n }\n for (const a of (p.includes.Asset ?? []) as Entry[]) if (a?.sys?.id) index.set(key(\"Asset\", a.sys.id), a);\n\n const done = new Map<unknown, unknown>();\n const inProgress = new Set<unknown>();\n\n const resolve = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(resolve);\n if (!value || typeof value !== \"object\") return value;\n const sys = (value as Entry).sys as { type?: string; linkType?: string; id?: string } | undefined;\n if (sys?.type === \"Link\" && sys.linkType && sys.id) {\n const target = index.get(key(sys.linkType, sys.id));\n if (!target || inProgress.has(target)) return value; // unresolvable or cyclic → keep the stub\n return resolveEntity(target);\n }\n if (sys && (sys.type === \"Entry\" || sys.type === \"Asset\")) return resolveEntity(value);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = resolve(v);\n return out;\n };\n\n const resolveEntity = (entity: unknown): unknown => {\n if (done.has(entity)) return done.get(entity);\n const e = entity as Entry;\n const copy: Entry = { ...e, fields: {} as Record<string, unknown> };\n done.set(entity, copy);\n inProgress.add(entity);\n for (const [k, v] of Object.entries(e.fields ?? {})) copy.fields[k] = resolve(v);\n inProgress.delete(entity);\n return copy;\n };\n\n const items = p.items.map(resolve);\n if (!asPage) return items;\n const { includes: _drop, ...rest } = p;\n return { ...rest, items };\n}\n\n"]}
@@ -0,0 +1,57 @@
1
+ import { C as CmsAdapter, X as XeniaMarker } from '../personalize-content-Clc1oMYY.cjs';
2
+
3
+ /**
4
+ * Contentful adapter for {@link personalizeContent}.
5
+ *
6
+ * Works with either a contentful.js client (`createClient(...)`, links resolved by the client) or
7
+ * raw Content Delivery API credentials (links resolved here). Pages can be passed as an entry, an
8
+ * array of entries, or a raw CDA collection response (`{ items, includes }`).
9
+ *
10
+ * Expects the two fields Xenia adds to personalized content types: `xenia` (JSON marker) and
11
+ * `xeniaVariants` (references, static replacements only). Single-locale payloads only — don't
12
+ * fetch with `withAllLocales` / `locale=*`.
13
+ */
14
+
15
+ /** The subset of a contentful.js client this adapter calls. */
16
+ interface ContentfulClientLike {
17
+ getEntries(query: Record<string, unknown>): Promise<{
18
+ items: unknown[];
19
+ includes?: unknown;
20
+ }>;
21
+ }
22
+ interface ContentfulAdapterOptions {
23
+ /** A contentful.js client. Takes precedence over raw credentials. */
24
+ client?: ContentfulClientLike;
25
+ space?: string;
26
+ accessToken?: string;
27
+ environment?: string;
28
+ /** `cdn.contentful.com` (default) or `preview.contentful.com`. */
29
+ host?: string;
30
+ /** Link depth fetched with pages and replacement entries (0-10). Default 4 — raise it for deeper pages. */
31
+ include?: number;
32
+ /** Marker field ids, if your content types name them differently. */
33
+ markerField?: string;
34
+ variantsField?: string;
35
+ fetch?: typeof fetch;
36
+ }
37
+ type Entry = {
38
+ sys: {
39
+ id: string;
40
+ type: string;
41
+ contentType?: unknown;
42
+ };
43
+ fields: Record<string, unknown>;
44
+ };
45
+ declare function contentfulAdapter(options?: ContentfulAdapterOptions): CmsAdapter<Entry>;
46
+ /** Parse the `xenia` field (object, or its JSON text). Unknown shapes → not personalized. */
47
+ declare function parseMarker(raw: unknown): XeniaMarker | null;
48
+ /**
49
+ * Resolve CDA links in a raw collection response (`{ items, includes }`) into nested entries.
50
+ * Shared entries become shared objects; a link back to an entry still being resolved (a cycle)
51
+ * stays a link stub, so the result stays JSON-serializable (RSC props, caches). Anything that is
52
+ * not a raw collection (an entry, an array, contentful.js output) is returned as-is. With
53
+ * `asPage` the collection shape is kept (minus `includes`); otherwise just the resolved `items`.
54
+ */
55
+ declare function resolveCollection(payload: unknown, asPage?: boolean): unknown;
56
+
57
+ export { type ContentfulAdapterOptions, type ContentfulClientLike, contentfulAdapter, parseMarker, resolveCollection };
@@ -0,0 +1,57 @@
1
+ import { C as CmsAdapter, X as XeniaMarker } from '../personalize-content-Clc1oMYY.js';
2
+
3
+ /**
4
+ * Contentful adapter for {@link personalizeContent}.
5
+ *
6
+ * Works with either a contentful.js client (`createClient(...)`, links resolved by the client) or
7
+ * raw Content Delivery API credentials (links resolved here). Pages can be passed as an entry, an
8
+ * array of entries, or a raw CDA collection response (`{ items, includes }`).
9
+ *
10
+ * Expects the two fields Xenia adds to personalized content types: `xenia` (JSON marker) and
11
+ * `xeniaVariants` (references, static replacements only). Single-locale payloads only — don't
12
+ * fetch with `withAllLocales` / `locale=*`.
13
+ */
14
+
15
+ /** The subset of a contentful.js client this adapter calls. */
16
+ interface ContentfulClientLike {
17
+ getEntries(query: Record<string, unknown>): Promise<{
18
+ items: unknown[];
19
+ includes?: unknown;
20
+ }>;
21
+ }
22
+ interface ContentfulAdapterOptions {
23
+ /** A contentful.js client. Takes precedence over raw credentials. */
24
+ client?: ContentfulClientLike;
25
+ space?: string;
26
+ accessToken?: string;
27
+ environment?: string;
28
+ /** `cdn.contentful.com` (default) or `preview.contentful.com`. */
29
+ host?: string;
30
+ /** Link depth fetched with pages and replacement entries (0-10). Default 4 — raise it for deeper pages. */
31
+ include?: number;
32
+ /** Marker field ids, if your content types name them differently. */
33
+ markerField?: string;
34
+ variantsField?: string;
35
+ fetch?: typeof fetch;
36
+ }
37
+ type Entry = {
38
+ sys: {
39
+ id: string;
40
+ type: string;
41
+ contentType?: unknown;
42
+ };
43
+ fields: Record<string, unknown>;
44
+ };
45
+ declare function contentfulAdapter(options?: ContentfulAdapterOptions): CmsAdapter<Entry>;
46
+ /** Parse the `xenia` field (object, or its JSON text). Unknown shapes → not personalized. */
47
+ declare function parseMarker(raw: unknown): XeniaMarker | null;
48
+ /**
49
+ * Resolve CDA links in a raw collection response (`{ items, includes }`) into nested entries.
50
+ * Shared entries become shared objects; a link back to an entry still being resolved (a cycle)
51
+ * stays a link stub, so the result stays JSON-serializable (RSC props, caches). Anything that is
52
+ * not a raw collection (an entry, an array, contentful.js output) is returned as-is. With
53
+ * `asPage` the collection shape is kept (minus `includes`); otherwise just the resolved `items`.
54
+ */
55
+ declare function resolveCollection(payload: unknown, asPage?: boolean): unknown;
56
+
57
+ export { type ContentfulAdapterOptions, type ContentfulClientLike, contentfulAdapter, parseMarker, resolveCollection };
@@ -0,0 +1,134 @@
1
+ // src/cms/contentful.ts
2
+ var KINDS = /* @__PURE__ */ new Set(["static", "runtime"]);
3
+ var OPS = /* @__PURE__ */ new Set(["replace", "expand", "items"]);
4
+ function contentfulAdapter(options = {}) {
5
+ const markerField = options.markerField ?? "xenia";
6
+ const variantsField = options.variantsField ?? "xeniaVariants";
7
+ const include = options.include ?? 4;
8
+ const getEntries = async (query, locale) => {
9
+ const q = { include, ...locale ? { locale } : {}, ...query };
10
+ if (options.client) {
11
+ const res2 = await options.client.getEntries(q);
12
+ return resolveCollection(res2);
13
+ }
14
+ if (!options.space || !options.accessToken) {
15
+ throw new Error("contentfulAdapter: pass `client` or `space` + `accessToken` to fetch replacements");
16
+ }
17
+ const params = new URLSearchParams();
18
+ for (const [k, v] of Object.entries(q)) if (v !== void 0) params.set(k, String(v));
19
+ const url = `https://${options.host ?? "cdn.contentful.com"}/spaces/${encodeURIComponent(options.space)}/environments/${encodeURIComponent(options.environment ?? "master")}/entries?${params}`;
20
+ const res = await (options.fetch ?? fetch)(url, { headers: { Authorization: `Bearer ${options.accessToken}` } });
21
+ if (!res.ok) throw new Error(`Contentful CDA ${res.status}`);
22
+ return resolveCollection(await res.json());
23
+ };
24
+ return {
25
+ entryId(value) {
26
+ const sys = value?.sys;
27
+ return sys && sys.type === "Entry" && typeof sys.id === "string" ? sys.id : void 0;
28
+ },
29
+ marker(entry) {
30
+ return parseMarker(entry.fields?.[markerField]);
31
+ },
32
+ staticVariants(entry) {
33
+ const v = entry.fields?.[variantsField];
34
+ return Array.isArray(v) ? v.filter((x) => x?.sys?.type === "Entry") : [];
35
+ },
36
+ getField: (entry, field) => entry.fields?.[field],
37
+ setField(entry, field, value) {
38
+ entry.fields = entry.fields ?? {};
39
+ entry.fields[field] = value;
40
+ },
41
+ mergeItems(entry, replacement) {
42
+ for (const [key, value] of Object.entries(replacement.fields ?? {})) {
43
+ if (Array.isArray(value)) entry.fields[key] = value;
44
+ }
45
+ },
46
+ clearMarker(entry) {
47
+ if (!entry.fields) return;
48
+ delete entry.fields[markerField];
49
+ delete entry.fields[variantsField];
50
+ },
51
+ prepare: (payload) => resolveCollection(payload, true),
52
+ fetchEntries: (ids, locale) => getEntries({ "sys.id[in]": ids.join(","), limit: ids.length }, locale),
53
+ queryEntries(query, locale) {
54
+ const q = { content_type: query.contentType, limit: query.limit };
55
+ if (query.order) q.order = query.order;
56
+ for (const f of query.filters ?? []) Object.assign(q, filterParam(f));
57
+ return getEntries(q, locale);
58
+ },
59
+ async fetchPage(ref, locale) {
60
+ const q = typeof ref === "string" ? { "sys.id": ref } : { content_type: ref.contentType };
61
+ if (typeof ref !== "string") for (const [k, v] of Object.entries(ref.fields)) q[`fields.${k}`] = v;
62
+ return (await getEntries({ ...q, limit: 1 }, locale))[0] ?? null;
63
+ }
64
+ };
65
+ }
66
+ function parseMarker(raw) {
67
+ let value = raw;
68
+ if (typeof value === "string") {
69
+ try {
70
+ value = JSON.parse(value);
71
+ } catch {
72
+ return null;
73
+ }
74
+ }
75
+ if (!value || typeof value !== "object") return null;
76
+ const m = value;
77
+ if (!KINDS.has(m.kind)) return null;
78
+ return {
79
+ kind: m.kind,
80
+ op: OPS.has(m.op) ? m.op : "replace",
81
+ field: typeof m.field === "string" && m.field ? m.field : void 0,
82
+ limit: typeof m.limit === "number" ? m.limit : void 0
83
+ };
84
+ }
85
+ function filterParam(f) {
86
+ const path = /^(fields|sys|metadata)\./.test(f.field) ? f.field : `fields.${f.field}`;
87
+ const op = f.op ?? "eq";
88
+ return { [op === "eq" ? path : `${path}[${op}]`]: f.value };
89
+ }
90
+ function resolveCollection(payload, asPage = false) {
91
+ const p = payload;
92
+ if (!p || typeof p !== "object" || !Array.isArray(p.items)) return payload;
93
+ if (!p.includes) return asPage ? payload : p.items;
94
+ const index = /* @__PURE__ */ new Map();
95
+ const key = (type, id) => `${type}:${id}`;
96
+ for (const e of [...p.items, ...p.includes.Entry ?? []]) {
97
+ if (e?.sys?.id) index.set(key(e.sys.type, e.sys.id), e);
98
+ }
99
+ for (const a of p.includes.Asset ?? []) if (a?.sys?.id) index.set(key("Asset", a.sys.id), a);
100
+ const done = /* @__PURE__ */ new Map();
101
+ const inProgress = /* @__PURE__ */ new Set();
102
+ const resolve = (value) => {
103
+ if (Array.isArray(value)) return value.map(resolve);
104
+ if (!value || typeof value !== "object") return value;
105
+ const sys = value.sys;
106
+ if (sys?.type === "Link" && sys.linkType && sys.id) {
107
+ const target = index.get(key(sys.linkType, sys.id));
108
+ if (!target || inProgress.has(target)) return value;
109
+ return resolveEntity(target);
110
+ }
111
+ if (sys && (sys.type === "Entry" || sys.type === "Asset")) return resolveEntity(value);
112
+ const out = {};
113
+ for (const [k, v] of Object.entries(value)) out[k] = resolve(v);
114
+ return out;
115
+ };
116
+ const resolveEntity = (entity) => {
117
+ if (done.has(entity)) return done.get(entity);
118
+ const e = entity;
119
+ const copy = { ...e, fields: {} };
120
+ done.set(entity, copy);
121
+ inProgress.add(entity);
122
+ for (const [k, v] of Object.entries(e.fields ?? {})) copy.fields[k] = resolve(v);
123
+ inProgress.delete(entity);
124
+ return copy;
125
+ };
126
+ const items = p.items.map(resolve);
127
+ if (!asPage) return items;
128
+ const { includes: _drop, ...rest } = p;
129
+ return { ...rest, items };
130
+ }
131
+
132
+ export { contentfulAdapter, parseMarker, resolveCollection };
133
+ //# sourceMappingURL=contentful.js.map
134
+ //# sourceMappingURL=contentful.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cms/contentful.ts"],"names":["res"],"mappings":"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","file":"contentful.js","sourcesContent":["/**\n * Contentful adapter for {@link personalizeContent}.\n *\n * Works with either a contentful.js client (`createClient(...)`, links resolved by the client) or\n * raw Content Delivery API credentials (links resolved here). Pages can be passed as an entry, an\n * array of entries, or a raw CDA collection response (`{ items, includes }`).\n *\n * Expects the two fields Xenia adds to personalized content types: `xenia` (JSON marker) and\n * `xeniaVariants` (references, static replacements only). Single-locale payloads only — don't\n * fetch with `withAllLocales` / `locale=*`.\n */\n\nimport type { CmsAdapter, XeniaMarker } from \"../core/personalize-content\";\nimport type { EntryFilter } from \"../core/types\";\n\n/** The subset of a contentful.js client this adapter calls. */\nexport interface ContentfulClientLike {\n getEntries(query: Record<string, unknown>): Promise<{ items: unknown[]; includes?: unknown }>;\n}\n\nexport interface ContentfulAdapterOptions {\n /** A contentful.js client. Takes precedence over raw credentials. */\n client?: ContentfulClientLike;\n space?: string;\n accessToken?: string;\n environment?: string;\n /** `cdn.contentful.com` (default) or `preview.contentful.com`. */\n host?: string;\n /** Link depth fetched with pages and replacement entries (0-10). Default 4 — raise it for deeper pages. */\n include?: number;\n /** Marker field ids, if your content types name them differently. */\n markerField?: string;\n variantsField?: string;\n fetch?: typeof fetch;\n}\n\ntype Entry = { sys: { id: string; type: string; contentType?: unknown }; fields: Record<string, unknown> };\n\nconst KINDS = new Set([\"static\", \"runtime\"]);\nconst OPS = new Set([\"replace\", \"expand\", \"items\"]);\n\nexport function contentfulAdapter(options: ContentfulAdapterOptions = {}): CmsAdapter<Entry> {\n const markerField = options.markerField ?? \"xenia\";\n const variantsField = options.variantsField ?? \"xeniaVariants\";\n const include = options.include ?? 4;\n\n const getEntries = async (query: Record<string, unknown>, locale?: string): Promise<Entry[]> => {\n const q = { include, ...(locale ? { locale } : {}), ...query };\n if (options.client) {\n const res = await options.client.getEntries(q);\n return resolveCollection(res) as Entry[];\n }\n if (!options.space || !options.accessToken) {\n throw new Error(\"contentfulAdapter: pass `client` or `space` + `accessToken` to fetch replacements\");\n }\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(q)) if (v !== undefined) params.set(k, String(v));\n const url =\n `https://${options.host ?? \"cdn.contentful.com\"}/spaces/${encodeURIComponent(options.space)}` +\n `/environments/${encodeURIComponent(options.environment ?? \"master\")}/entries?${params}`;\n const res = await (options.fetch ?? fetch)(url, { headers: { Authorization: `Bearer ${options.accessToken}` } });\n if (!res.ok) throw new Error(`Contentful CDA ${res.status}`);\n return resolveCollection(await res.json()) as Entry[];\n };\n\n return {\n entryId(value) {\n const sys = (value as Entry | null)?.sys;\n return sys && sys.type === \"Entry\" && typeof sys.id === \"string\" ? sys.id : undefined;\n },\n\n marker(entry) {\n return parseMarker(entry.fields?.[markerField]);\n },\n\n staticVariants(entry) {\n const v = entry.fields?.[variantsField];\n return Array.isArray(v) ? v.filter((x): x is Entry => (x as Entry)?.sys?.type === \"Entry\") : [];\n },\n\n getField: (entry, field) => entry.fields?.[field],\n setField(entry, field, value) {\n entry.fields = entry.fields ?? {};\n entry.fields[field] = value;\n },\n\n mergeItems(entry, replacement) {\n for (const [key, value] of Object.entries(replacement.fields ?? {})) {\n if (Array.isArray(value)) entry.fields[key] = value;\n }\n },\n\n clearMarker(entry) {\n if (!entry.fields) return;\n delete entry.fields[markerField];\n delete entry.fields[variantsField];\n },\n\n prepare: (payload) => resolveCollection(payload, true),\n\n fetchEntries: (ids, locale) => getEntries({ \"sys.id[in]\": ids.join(\",\"), limit: ids.length }, locale),\n\n queryEntries(query, locale) {\n const q: Record<string, unknown> = { content_type: query.contentType, limit: query.limit };\n if (query.order) q.order = query.order;\n for (const f of query.filters ?? []) Object.assign(q, filterParam(f));\n return getEntries(q, locale);\n },\n\n async fetchPage(ref, locale) {\n const q: Record<string, unknown> =\n typeof ref === \"string\" ? { \"sys.id\": ref } : { content_type: ref.contentType };\n if (typeof ref !== \"string\") for (const [k, v] of Object.entries(ref.fields)) q[`fields.${k}`] = v;\n return (await getEntries({ ...q, limit: 1 }, locale))[0] ?? null;\n },\n };\n}\n\n/** Parse the `xenia` field (object, or its JSON text). Unknown shapes → not personalized. */\nexport function parseMarker(raw: unknown): XeniaMarker | null {\n let value = raw;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n return null;\n }\n }\n if (!value || typeof value !== \"object\") return null;\n const m = value as Record<string, unknown>;\n if (!KINDS.has(m.kind as string)) return null;\n return {\n kind: m.kind as XeniaMarker[\"kind\"],\n op: OPS.has(m.op as string) ? (m.op as XeniaMarker[\"op\"]) : \"replace\",\n field: typeof m.field === \"string\" && m.field ? m.field : undefined,\n limit: typeof m.limit === \"number\" ? m.limit : undefined,\n };\n}\n\n/** CMS-neutral filter → CDA query param (`fields.category[in]=a,b`). */\nfunction filterParam(f: EntryFilter): Record<string, string> {\n const path = /^(fields|sys|metadata)\\./.test(f.field) ? f.field : `fields.${f.field}`;\n const op = f.op ?? \"eq\";\n return { [op === \"eq\" ? path : `${path}[${op}]`]: f.value };\n}\n\n/**\n * Resolve CDA links in a raw collection response (`{ items, includes }`) into nested entries.\n * Shared entries become shared objects; a link back to an entry still being resolved (a cycle)\n * stays a link stub, so the result stays JSON-serializable (RSC props, caches). Anything that is\n * not a raw collection (an entry, an array, contentful.js output) is returned as-is. With\n * `asPage` the collection shape is kept (minus `includes`); otherwise just the resolved `items`.\n */\nexport function resolveCollection(payload: unknown, asPage = false): unknown {\n const p = payload as { items?: unknown[]; includes?: { Entry?: Entry[]; Asset?: unknown[] } } | null;\n if (!p || typeof p !== \"object\" || !Array.isArray(p.items)) return payload;\n if (!p.includes) return asPage ? payload : p.items;\n\n const index = new Map<string, unknown>();\n const key = (type: string, id: string) => `${type}:${id}`;\n for (const e of [...p.items, ...(p.includes.Entry ?? [])] as Entry[]) {\n if (e?.sys?.id) index.set(key(e.sys.type, e.sys.id), e);\n }\n for (const a of (p.includes.Asset ?? []) as Entry[]) if (a?.sys?.id) index.set(key(\"Asset\", a.sys.id), a);\n\n const done = new Map<unknown, unknown>();\n const inProgress = new Set<unknown>();\n\n const resolve = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(resolve);\n if (!value || typeof value !== \"object\") return value;\n const sys = (value as Entry).sys as { type?: string; linkType?: string; id?: string } | undefined;\n if (sys?.type === \"Link\" && sys.linkType && sys.id) {\n const target = index.get(key(sys.linkType, sys.id));\n if (!target || inProgress.has(target)) return value; // unresolvable or cyclic → keep the stub\n return resolveEntity(target);\n }\n if (sys && (sys.type === \"Entry\" || sys.type === \"Asset\")) return resolveEntity(value);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = resolve(v);\n return out;\n };\n\n const resolveEntity = (entity: unknown): unknown => {\n if (done.has(entity)) return done.get(entity);\n const e = entity as Entry;\n const copy: Entry = { ...e, fields: {} as Record<string, unknown> };\n done.set(entity, copy);\n inProgress.add(entity);\n for (const [k, v] of Object.entries(e.fields ?? {})) copy.fields[k] = resolve(v);\n inProgress.delete(entity);\n return copy;\n };\n\n const items = p.items.map(resolve);\n if (!asPage) return items;\n const { includes: _drop, ...rest } = p;\n return { ...rest, items };\n}\n\n"]}
@@ -1,4 +1,4 @@
1
- import { m as RetryConfig, C as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, X as XeniaAction, d as ConsentState } from './api-URhxxi4x.cjs';
1
+ import { y as RetryConfig, e as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, K as XeniaAction, f as ConsentState } from './personalize-content-Clc1oMYY.cjs';
2
2
 
3
3
  /** Returns true when running in a browser environment (SSR-safe). */
4
4
  declare function isBrowser(): boolean;
@@ -1,4 +1,4 @@
1
- import { m as RetryConfig, C as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, X as XeniaAction, d as ConsentState } from './api-URhxxi4x.js';
1
+ import { y as RetryConfig, e as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, K as XeniaAction, f as ConsentState } from './personalize-content-Clc1oMYY.js';
2
2
 
3
3
  /** Returns true when running in a browser environment (SSR-safe). */
4
4
  declare function isBrowser(): boolean;
package/dist/index.cjs CHANGED
@@ -1,93 +1,105 @@
1
1
  'use strict';
2
2
 
3
- var chunk5D7SJIO4_cjs = require('./chunk-5D7SJIO4.cjs');
4
- var chunkJEKVN7HK_cjs = require('./chunk-JEKVN7HK.cjs');
3
+ var chunkPKWANLT7_cjs = require('./chunk-PKWANLT7.cjs');
4
+ var chunkIBNIRT7J_cjs = require('./chunk-IBNIRT7J.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "LocalStorageResponseStore", {
9
9
  enumerable: true,
10
- get: function () { return chunk5D7SJIO4_cjs.LocalStorageResponseStore; }
10
+ get: function () { return chunkPKWANLT7_cjs.LocalStorageResponseStore; }
11
11
  });
12
12
  Object.defineProperty(exports, "MemoryResponseStore", {
13
13
  enumerable: true,
14
- get: function () { return chunk5D7SJIO4_cjs.MemoryResponseStore; }
14
+ get: function () { return chunkPKWANLT7_cjs.MemoryResponseStore; }
15
15
  });
16
16
  Object.defineProperty(exports, "extractContentSwaps", {
17
17
  enumerable: true,
18
- get: function () { return chunk5D7SJIO4_cjs.extractContentSwaps; }
18
+ get: function () { return chunkPKWANLT7_cjs.extractContentSwaps; }
19
19
  });
20
20
  Object.defineProperty(exports, "spliceSlots", {
21
21
  enumerable: true,
22
- get: function () { return chunk5D7SJIO4_cjs.spliceSlots; }
22
+ get: function () { return chunkPKWANLT7_cjs.spliceSlots; }
23
23
  });
24
24
  Object.defineProperty(exports, "CONSENT_COOKIE", {
25
25
  enumerable: true,
26
- get: function () { return chunkJEKVN7HK_cjs.CONSENT_COOKIE; }
26
+ get: function () { return chunkIBNIRT7J_cjs.CONSENT_COOKIE; }
27
27
  });
28
28
  Object.defineProperty(exports, "CircuitOpenError", {
29
29
  enumerable: true,
30
- get: function () { return chunkJEKVN7HK_cjs.CircuitOpenError; }
30
+ get: function () { return chunkIBNIRT7J_cjs.CircuitOpenError; }
31
31
  });
32
32
  Object.defineProperty(exports, "DEFAULT_PREFIX", {
33
33
  enumerable: true,
34
- get: function () { return chunkJEKVN7HK_cjs.DEFAULT_PREFIX; }
34
+ get: function () { return chunkIBNIRT7J_cjs.DEFAULT_PREFIX; }
35
35
  });
36
36
  Object.defineProperty(exports, "HttpClient", {
37
37
  enumerable: true,
38
- get: function () { return chunkJEKVN7HK_cjs.HttpClient; }
38
+ get: function () { return chunkIBNIRT7J_cjs.HttpClient; }
39
39
  });
40
40
  Object.defineProperty(exports, "HttpError", {
41
41
  enumerable: true,
42
- get: function () { return chunkJEKVN7HK_cjs.HttpError; }
42
+ get: function () { return chunkIBNIRT7J_cjs.HttpError; }
43
43
  });
44
44
  Object.defineProperty(exports, "MAX_EVENT_ID_LENGTH", {
45
45
  enumerable: true,
46
- get: function () { return chunkJEKVN7HK_cjs.MAX_EVENT_ID_LENGTH; }
46
+ get: function () { return chunkIBNIRT7J_cjs.MAX_EVENT_ID_LENGTH; }
47
47
  });
48
48
  Object.defineProperty(exports, "VISITOR_COOKIE", {
49
49
  enumerable: true,
50
- get: function () { return chunkJEKVN7HK_cjs.VISITOR_COOKIE; }
50
+ get: function () { return chunkIBNIRT7J_cjs.VISITOR_COOKIE; }
51
51
  });
52
52
  Object.defineProperty(exports, "XeniaApi", {
53
53
  enumerable: true,
54
- get: function () { return chunkJEKVN7HK_cjs.XeniaApi; }
54
+ get: function () { return chunkIBNIRT7J_cjs.XeniaApi; }
55
55
  });
56
56
  Object.defineProperty(exports, "buildUrl", {
57
57
  enumerable: true,
58
- get: function () { return chunkJEKVN7HK_cjs.buildUrl; }
58
+ get: function () { return chunkIBNIRT7J_cjs.buildUrl; }
59
59
  });
60
60
  Object.defineProperty(exports, "consentCookie", {
61
61
  enumerable: true,
62
- get: function () { return chunkJEKVN7HK_cjs.consentCookie; }
62
+ get: function () { return chunkIBNIRT7J_cjs.consentCookie; }
63
63
  });
64
64
  Object.defineProperty(exports, "consentCookieName", {
65
65
  enumerable: true,
66
- get: function () { return chunkJEKVN7HK_cjs.consentCookieName; }
66
+ get: function () { return chunkIBNIRT7J_cjs.consentCookieName; }
67
67
  });
68
68
  Object.defineProperty(exports, "contextFromUrl", {
69
69
  enumerable: true,
70
- get: function () { return chunkJEKVN7HK_cjs.contextFromUrl; }
70
+ get: function () { return chunkIBNIRT7J_cjs.contextFromUrl; }
71
71
  });
72
72
  Object.defineProperty(exports, "generateUlid", {
73
73
  enumerable: true,
74
- get: function () { return chunkJEKVN7HK_cjs.generateUlid; }
74
+ get: function () { return chunkIBNIRT7J_cjs.generateUlid; }
75
75
  });
76
76
  Object.defineProperty(exports, "isBrowser", {
77
77
  enumerable: true,
78
- get: function () { return chunkJEKVN7HK_cjs.isBrowser; }
78
+ get: function () { return chunkIBNIRT7J_cjs.isBrowser; }
79
79
  });
80
80
  Object.defineProperty(exports, "parseActions", {
81
81
  enumerable: true,
82
- get: function () { return chunkJEKVN7HK_cjs.parseActions; }
82
+ get: function () { return chunkIBNIRT7J_cjs.parseActions; }
83
+ });
84
+ Object.defineProperty(exports, "pendingTargets", {
85
+ enumerable: true,
86
+ get: function () { return chunkIBNIRT7J_cjs.pendingTargets; }
87
+ });
88
+ Object.defineProperty(exports, "personalizeContent", {
89
+ enumerable: true,
90
+ get: function () { return chunkIBNIRT7J_cjs.personalizeContent; }
91
+ });
92
+ Object.defineProperty(exports, "personalizePage", {
93
+ enumerable: true,
94
+ get: function () { return chunkIBNIRT7J_cjs.personalizePage; }
83
95
  });
84
96
  Object.defineProperty(exports, "toEventId", {
85
97
  enumerable: true,
86
- get: function () { return chunkJEKVN7HK_cjs.toEventId; }
98
+ get: function () { return chunkIBNIRT7J_cjs.toEventId; }
87
99
  });
88
100
  Object.defineProperty(exports, "visitorCookieName", {
89
101
  enumerable: true,
90
- get: function () { return chunkJEKVN7HK_cjs.visitorCookieName; }
102
+ get: function () { return chunkIBNIRT7J_cjs.visitorCookieName; }
91
103
  });
92
104
  //# sourceMappingURL=index.cjs.map
93
105
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -1,6 +1,7 @@
1
- import { J as JsonValue, E as EventContext, W as WebhookResponse } from './api-URhxxi4x.cjs';
2
- export { A as AnalyticsContext, a as AnalyticsEventName, b as AnalyticsIdentity, c as AnalyticsIngestResponse, C as CircuitBreakerConfig, d as ConsentState, e as EventIdentity, H as HttpMethod, I as IdentifyRequest, f as IdentifyResponse, g as InteractionType, h as JsonObject, M as MessageCta, i as MessagePlacement, P as PersonalizationSwap, R as ResolveBatchItem, j as ResolveBatchResult, k as ResolveOptions, l as ResolveResult, m as RetryConfig, T as TrackOptions, n as WidgetFormSubmit, o as WidgetPrize, p as WidgetSegment, q as WidgetSubmitResponse, r as WidgetType, X as XeniaAction, s as XeniaApi, t as XeniaConfig, u as XeniaEvent } from './api-URhxxi4x.cjs';
3
- export { C as CONSENT_COOKIE, a as CircuitOpenError, D as DEFAULT_PREFIX, H as HttpClient, b as HttpClientOptions, c as HttpError, d as HttpResult, R as RequestOptions, V as VISITOR_COOKIE, e as buildUrl, f as consentCookie, g as consentCookieName, i as isBrowser, p as parseActions, v as visitorCookieName } from './cookie-names-QYMiEMAq.cjs';
1
+ export { X as XeniaApi } from './api-BEPW0Uan.cjs';
2
+ export { C as CONSENT_COOKIE, a as CircuitOpenError, D as DEFAULT_PREFIX, H as HttpClient, b as HttpClientOptions, c as HttpError, d as HttpResult, R as RequestOptions, V as VISITOR_COOKIE, e as buildUrl, f as consentCookie, g as consentCookieName, i as isBrowser, p as parseActions, v as visitorCookieName } from './cookie-names-BACctagz.cjs';
3
+ import { J as JsonValue, E as EventContext, W as WebhookResponse } from './personalize-content-Clc1oMYY.cjs';
4
+ export { A as AnalyticsContext, a as AnalyticsEventName, b as AnalyticsIdentity, c as AnalyticsIngestResponse, d as AppliedSwap, e as CircuitBreakerConfig, C as CmsAdapter, f as ConsentState, g as EntryDecision, h as EntryFilter, i as EntryQuery, j as EntryResolver, k as EntrySwapOp, l as EventIdentity, H as HttpMethod, I as IdentifyRequest, m as IdentifyResponse, n as InteractionType, o as JsonObject, M as MessageCta, p as MessagePlacement, P as PagePersonalizeOptions, q as PageRef, r as PersonalizationSwap, s as PersonalizeContentOptions, t as PersonalizeContentResult, R as ResolveBatchItem, u as ResolveBatchResult, v as ResolveEntriesResult, w as ResolveOptions, x as ResolveResult, y as RetryConfig, T as TrackOptions, z as WidgetFormSubmit, B as WidgetPrize, D as WidgetSegment, F as WidgetSubmitResponse, G as WidgetType, K as XeniaAction, L as XeniaConfig, N as XeniaEvent, X as XeniaMarker, O as pendingTargets, Q as personalizeContent, S as personalizePage } from './personalize-content-Clc1oMYY.cjs';
4
5
 
5
6
  /**
6
7
  * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { J as JsonValue, E as EventContext, W as WebhookResponse } from './api-URhxxi4x.js';
2
- export { A as AnalyticsContext, a as AnalyticsEventName, b as AnalyticsIdentity, c as AnalyticsIngestResponse, C as CircuitBreakerConfig, d as ConsentState, e as EventIdentity, H as HttpMethod, I as IdentifyRequest, f as IdentifyResponse, g as InteractionType, h as JsonObject, M as MessageCta, i as MessagePlacement, P as PersonalizationSwap, R as ResolveBatchItem, j as ResolveBatchResult, k as ResolveOptions, l as ResolveResult, m as RetryConfig, T as TrackOptions, n as WidgetFormSubmit, o as WidgetPrize, p as WidgetSegment, q as WidgetSubmitResponse, r as WidgetType, X as XeniaAction, s as XeniaApi, t as XeniaConfig, u as XeniaEvent } from './api-URhxxi4x.js';
3
- export { C as CONSENT_COOKIE, a as CircuitOpenError, D as DEFAULT_PREFIX, H as HttpClient, b as HttpClientOptions, c as HttpError, d as HttpResult, R as RequestOptions, V as VISITOR_COOKIE, e as buildUrl, f as consentCookie, g as consentCookieName, i as isBrowser, p as parseActions, v as visitorCookieName } from './cookie-names-8FxbGKGS.js';
1
+ export { X as XeniaApi } from './api-CktVQ6Gl.js';
2
+ export { C as CONSENT_COOKIE, a as CircuitOpenError, D as DEFAULT_PREFIX, H as HttpClient, b as HttpClientOptions, c as HttpError, d as HttpResult, R as RequestOptions, V as VISITOR_COOKIE, e as buildUrl, f as consentCookie, g as consentCookieName, i as isBrowser, p as parseActions, v as visitorCookieName } from './cookie-names-CLqtmGBM.js';
3
+ import { J as JsonValue, E as EventContext, W as WebhookResponse } from './personalize-content-Clc1oMYY.js';
4
+ export { A as AnalyticsContext, a as AnalyticsEventName, b as AnalyticsIdentity, c as AnalyticsIngestResponse, d as AppliedSwap, e as CircuitBreakerConfig, C as CmsAdapter, f as ConsentState, g as EntryDecision, h as EntryFilter, i as EntryQuery, j as EntryResolver, k as EntrySwapOp, l as EventIdentity, H as HttpMethod, I as IdentifyRequest, m as IdentifyResponse, n as InteractionType, o as JsonObject, M as MessageCta, p as MessagePlacement, P as PagePersonalizeOptions, q as PageRef, r as PersonalizationSwap, s as PersonalizeContentOptions, t as PersonalizeContentResult, R as ResolveBatchItem, u as ResolveBatchResult, v as ResolveEntriesResult, w as ResolveOptions, x as ResolveResult, y as RetryConfig, T as TrackOptions, z as WidgetFormSubmit, B as WidgetPrize, D as WidgetSegment, F as WidgetSubmitResponse, G as WidgetType, K as XeniaAction, L as XeniaConfig, N as XeniaEvent, X as XeniaMarker, O as pendingTargets, Q as personalizeContent, S as personalizePage } from './personalize-content-Clc1oMYY.js';
4
5
 
5
6
  /**
6
7
  * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):