@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
@@ -81,7 +81,8 @@ function parseMarker(raw) {
81
81
  kind: m.kind,
82
82
  op: OPS.has(m.op) ? m.op : "replace",
83
83
  field: typeof m.field === "string" && m.field ? m.field : void 0,
84
- limit: typeof m.limit === "number" ? m.limit : void 0
84
+ limit: typeof m.limit === "number" ? m.limit : void 0,
85
+ keys: Array.isArray(m.keys) ? m.keys.filter((k) => typeof k === "string") : void 0
85
86
  };
86
87
  }
87
88
  function filterParam(f) {
@@ -1 +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"]}
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 keys: Array.isArray(m.keys) ? m.keys.filter((k): k is string => typeof k === \"string\") : 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 { C as CmsAdapter, X as XeniaMarker } from '../personalize-content-Clc1oMYY.cjs';
1
+ import { C as CmsAdapter, X as XeniaMarker } from '../personalize-content-Bf6YZdkZ.cjs';
2
2
 
3
3
  /**
4
4
  * Contentful adapter for {@link personalizeContent}.
@@ -1,4 +1,4 @@
1
- import { C as CmsAdapter, X as XeniaMarker } from '../personalize-content-Clc1oMYY.js';
1
+ import { C as CmsAdapter, X as XeniaMarker } from '../personalize-content-Bf6YZdkZ.js';
2
2
 
3
3
  /**
4
4
  * Contentful adapter for {@link personalizeContent}.
@@ -79,7 +79,8 @@ function parseMarker(raw) {
79
79
  kind: m.kind,
80
80
  op: OPS.has(m.op) ? m.op : "replace",
81
81
  field: typeof m.field === "string" && m.field ? m.field : void 0,
82
- limit: typeof m.limit === "number" ? m.limit : void 0
82
+ limit: typeof m.limit === "number" ? m.limit : void 0,
83
+ keys: Array.isArray(m.keys) ? m.keys.filter((k) => typeof k === "string") : void 0
83
84
  };
84
85
  }
85
86
  function filterParam(f) {
@@ -1 +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
+ {"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 keys: Array.isArray(m.keys) ? m.keys.filter((k): k is string => typeof k === \"string\") : 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 { y as RetryConfig, e as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, K as XeniaAction, f as ConsentState } from './personalize-content-Clc1oMYY.js';
1
+ import { y as RetryConfig, e as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, K as XeniaAction, f as ConsentState } from './personalize-content-Bf6YZdkZ.js';
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 { y as RetryConfig, e as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, K as XeniaAction, f as ConsentState } from './personalize-content-Clc1oMYY.cjs';
1
+ import { y as RetryConfig, e as CircuitBreakerConfig, H as HttpMethod, J as JsonValue, K as XeniaAction, f as ConsentState } from './personalize-content-Bf6YZdkZ.cjs';
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,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkPKWANLT7_cjs = require('./chunk-PKWANLT7.cjs');
4
- var chunkIBNIRT7J_cjs = require('./chunk-IBNIRT7J.cjs');
4
+ var chunkYZG6JR4E_cjs = require('./chunk-YZG6JR4E.cjs');
5
5
 
6
6
 
7
7
 
@@ -23,83 +23,83 @@ Object.defineProperty(exports, "spliceSlots", {
23
23
  });
24
24
  Object.defineProperty(exports, "CONSENT_COOKIE", {
25
25
  enumerable: true,
26
- get: function () { return chunkIBNIRT7J_cjs.CONSENT_COOKIE; }
26
+ get: function () { return chunkYZG6JR4E_cjs.CONSENT_COOKIE; }
27
27
  });
28
28
  Object.defineProperty(exports, "CircuitOpenError", {
29
29
  enumerable: true,
30
- get: function () { return chunkIBNIRT7J_cjs.CircuitOpenError; }
30
+ get: function () { return chunkYZG6JR4E_cjs.CircuitOpenError; }
31
31
  });
32
32
  Object.defineProperty(exports, "DEFAULT_PREFIX", {
33
33
  enumerable: true,
34
- get: function () { return chunkIBNIRT7J_cjs.DEFAULT_PREFIX; }
34
+ get: function () { return chunkYZG6JR4E_cjs.DEFAULT_PREFIX; }
35
35
  });
36
36
  Object.defineProperty(exports, "HttpClient", {
37
37
  enumerable: true,
38
- get: function () { return chunkIBNIRT7J_cjs.HttpClient; }
38
+ get: function () { return chunkYZG6JR4E_cjs.HttpClient; }
39
39
  });
40
40
  Object.defineProperty(exports, "HttpError", {
41
41
  enumerable: true,
42
- get: function () { return chunkIBNIRT7J_cjs.HttpError; }
42
+ get: function () { return chunkYZG6JR4E_cjs.HttpError; }
43
43
  });
44
44
  Object.defineProperty(exports, "MAX_EVENT_ID_LENGTH", {
45
45
  enumerable: true,
46
- get: function () { return chunkIBNIRT7J_cjs.MAX_EVENT_ID_LENGTH; }
46
+ get: function () { return chunkYZG6JR4E_cjs.MAX_EVENT_ID_LENGTH; }
47
47
  });
48
48
  Object.defineProperty(exports, "VISITOR_COOKIE", {
49
49
  enumerable: true,
50
- get: function () { return chunkIBNIRT7J_cjs.VISITOR_COOKIE; }
50
+ get: function () { return chunkYZG6JR4E_cjs.VISITOR_COOKIE; }
51
51
  });
52
52
  Object.defineProperty(exports, "XeniaApi", {
53
53
  enumerable: true,
54
- get: function () { return chunkIBNIRT7J_cjs.XeniaApi; }
54
+ get: function () { return chunkYZG6JR4E_cjs.XeniaApi; }
55
55
  });
56
56
  Object.defineProperty(exports, "buildUrl", {
57
57
  enumerable: true,
58
- get: function () { return chunkIBNIRT7J_cjs.buildUrl; }
58
+ get: function () { return chunkYZG6JR4E_cjs.buildUrl; }
59
59
  });
60
60
  Object.defineProperty(exports, "consentCookie", {
61
61
  enumerable: true,
62
- get: function () { return chunkIBNIRT7J_cjs.consentCookie; }
62
+ get: function () { return chunkYZG6JR4E_cjs.consentCookie; }
63
63
  });
64
64
  Object.defineProperty(exports, "consentCookieName", {
65
65
  enumerable: true,
66
- get: function () { return chunkIBNIRT7J_cjs.consentCookieName; }
66
+ get: function () { return chunkYZG6JR4E_cjs.consentCookieName; }
67
67
  });
68
68
  Object.defineProperty(exports, "contextFromUrl", {
69
69
  enumerable: true,
70
- get: function () { return chunkIBNIRT7J_cjs.contextFromUrl; }
70
+ get: function () { return chunkYZG6JR4E_cjs.contextFromUrl; }
71
71
  });
72
72
  Object.defineProperty(exports, "generateUlid", {
73
73
  enumerable: true,
74
- get: function () { return chunkIBNIRT7J_cjs.generateUlid; }
74
+ get: function () { return chunkYZG6JR4E_cjs.generateUlid; }
75
75
  });
76
76
  Object.defineProperty(exports, "isBrowser", {
77
77
  enumerable: true,
78
- get: function () { return chunkIBNIRT7J_cjs.isBrowser; }
78
+ get: function () { return chunkYZG6JR4E_cjs.isBrowser; }
79
79
  });
80
80
  Object.defineProperty(exports, "parseActions", {
81
81
  enumerable: true,
82
- get: function () { return chunkIBNIRT7J_cjs.parseActions; }
82
+ get: function () { return chunkYZG6JR4E_cjs.parseActions; }
83
83
  });
84
84
  Object.defineProperty(exports, "pendingTargets", {
85
85
  enumerable: true,
86
- get: function () { return chunkIBNIRT7J_cjs.pendingTargets; }
86
+ get: function () { return chunkYZG6JR4E_cjs.pendingTargets; }
87
87
  });
88
88
  Object.defineProperty(exports, "personalizeContent", {
89
89
  enumerable: true,
90
- get: function () { return chunkIBNIRT7J_cjs.personalizeContent; }
90
+ get: function () { return chunkYZG6JR4E_cjs.personalizeContent; }
91
91
  });
92
92
  Object.defineProperty(exports, "personalizePage", {
93
93
  enumerable: true,
94
- get: function () { return chunkIBNIRT7J_cjs.personalizePage; }
94
+ get: function () { return chunkYZG6JR4E_cjs.personalizePage; }
95
95
  });
96
96
  Object.defineProperty(exports, "toEventId", {
97
97
  enumerable: true,
98
- get: function () { return chunkIBNIRT7J_cjs.toEventId; }
98
+ get: function () { return chunkYZG6JR4E_cjs.toEventId; }
99
99
  });
100
100
  Object.defineProperty(exports, "visitorCookieName", {
101
101
  enumerable: true,
102
- get: function () { return chunkIBNIRT7J_cjs.visitorCookieName; }
102
+ get: function () { return chunkYZG6JR4E_cjs.visitorCookieName; }
103
103
  });
104
104
  //# sourceMappingURL=index.cjs.map
105
105
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
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';
1
+ export { X as XeniaApi } from './api-BqSvWgBZ.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-RXVfGYPE.cjs';
3
+ import { J as JsonValue, E as EventContext, W as WebhookResponse } from './personalize-content-Bf6YZdkZ.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-Bf6YZdkZ.cjs';
5
5
 
6
6
  /**
7
7
  * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
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';
1
+ export { X as XeniaApi } from './api-ByoECRhR.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-Bxd-VNyJ.js';
3
+ import { J as JsonValue, E as EventContext, W as WebhookResponse } from './personalize-content-Bf6YZdkZ.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-Bf6YZdkZ.js';
5
5
 
6
6
  /**
7
7
  * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { LocalStorageResponseStore, MemoryResponseStore, extractContentSwaps, spliceSlots } from './chunk-OUZU4Z5B.js';
2
- export { CONSENT_COOKIE, CircuitOpenError, DEFAULT_PREFIX, HttpClient, HttpError, MAX_EVENT_ID_LENGTH, VISITOR_COOKIE, XeniaApi, buildUrl, consentCookie, consentCookieName, contextFromUrl, generateUlid, isBrowser, parseActions, pendingTargets, personalizeContent, personalizePage, toEventId, visitorCookieName } from './chunk-7NGJC7CF.js';
2
+ export { CONSENT_COOKIE, CircuitOpenError, DEFAULT_PREFIX, HttpClient, HttpError, MAX_EVENT_ID_LENGTH, VISITOR_COOKIE, XeniaApi, buildUrl, consentCookie, consentCookieName, contextFromUrl, generateUlid, isBrowser, parseActions, pendingTargets, personalizeContent, personalizePage, toEventId, visitorCookieName } from './chunk-TGG5Y4QD.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk3PYPPIUM_cjs = require('../chunk-3PYPPIUM.cjs');
4
- var chunkIBNIRT7J_cjs = require('../chunk-IBNIRT7J.cjs');
3
+ var chunkTRRMMPBH_cjs = require('../chunk-TRRMMPBH.cjs');
4
+ var chunkYZG6JR4E_cjs = require('../chunk-YZG6JR4E.cjs');
5
5
  var React = require('react');
6
6
  var headers = require('next/headers');
7
7
  var server = require('next/server');
@@ -38,9 +38,9 @@ function cookieAttributes(c = {}) {
38
38
  };
39
39
  }
40
40
  function xeniaProxy(request, opts = {}) {
41
- const name = chunkIBNIRT7J_cjs.visitorCookieName(opts.prefix);
41
+ const name = chunkYZG6JR4E_cjs.visitorCookieName(opts.prefix);
42
42
  const existing = request.cookies.get(name)?.value;
43
- const visitorId = existing ?? chunkIBNIRT7J_cjs.generateUlid();
43
+ const visitorId = existing ?? chunkYZG6JR4E_cjs.generateUlid();
44
44
  const forwarded = new Headers(opts.headers ?? request.headers);
45
45
  forwarded.set(URL_HEADER, request.url);
46
46
  if (!existing) {
@@ -53,23 +53,23 @@ function xeniaProxy(request, opts = {}) {
53
53
  }
54
54
  async function xeniaServerFromNext(config) {
55
55
  const [jar, h] = await Promise.all([headers.cookies(), headers.headers()]);
56
- const name = chunkIBNIRT7J_cjs.visitorCookieName(config.prefix);
56
+ const name = chunkYZG6JR4E_cjs.visitorCookieName(config.prefix);
57
57
  let visitorId = config.visitorId ?? jar.get(name)?.value;
58
58
  if (!visitorId) {
59
- visitorId = chunkIBNIRT7J_cjs.generateUlid();
59
+ visitorId = chunkYZG6JR4E_cjs.generateUlid();
60
60
  try {
61
61
  jar.set(name, visitorId, cookieAttributes());
62
62
  } catch {
63
63
  }
64
64
  }
65
- return chunk3PYPPIUM_cjs.createXeniaServer({
65
+ return chunkTRRMMPBH_cjs.createXeniaServer({
66
66
  ...config,
67
67
  visitorId,
68
- context: { ...chunkIBNIRT7J_cjs.contextFromUrl(h.get(URL_HEADER), h.get("referer")), ...config.context }
68
+ context: { ...chunkYZG6JR4E_cjs.contextFromUrl(h.get(URL_HEADER), h.get("referer")), ...config.context }
69
69
  });
70
70
  }
71
71
  async function consentFromNext(prefix) {
72
- return chunk3PYPPIUM_cjs.getConsent((await headers.headers()).get("cookie"), prefix);
72
+ return chunkTRRMMPBH_cjs.getConsent((await headers.headers()).get("cookie"), prefix);
73
73
  }
74
74
  var requestStore = typeof React__namespace.cache === "function" ? React__namespace.cache(() => /* @__PURE__ */ new Map()) : () => /* @__PURE__ */ new Map();
75
75
  function personalizeOnce(key, personalize) {
@@ -1,7 +1,7 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
- import { V as VisitorCookieOptions, f as ConsentState, L as XeniaConfig } from '../personalize-content-Clc1oMYY.cjs';
3
- import { X as XeniaServer } from '../xenia-server-o_wDOcei.cjs';
4
- import '../api-BEPW0Uan.cjs';
2
+ import { V as VisitorCookieOptions, f as ConsentState, L as XeniaConfig } from '../personalize-content-Bf6YZdkZ.cjs';
3
+ import { X as XeniaServer } from '../xenia-server-MlI3Khya.cjs';
4
+ import '../api-BqSvWgBZ.cjs';
5
5
 
6
6
  /**
7
7
  * `@xenia-martech/sdk-js/next` — Next.js (App Router, 15+) glue for the server SDK.
@@ -1,7 +1,7 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
- import { V as VisitorCookieOptions, f as ConsentState, L as XeniaConfig } from '../personalize-content-Clc1oMYY.js';
3
- import { X as XeniaServer } from '../xenia-server-BWhWD0La.js';
4
- import '../api-CktVQ6Gl.js';
2
+ import { V as VisitorCookieOptions, f as ConsentState, L as XeniaConfig } from '../personalize-content-Bf6YZdkZ.js';
3
+ import { X as XeniaServer } from '../xenia-server-CcjQenru.js';
4
+ import '../api-ByoECRhR.js';
5
5
 
6
6
  /**
7
7
  * `@xenia-martech/sdk-js/next` — Next.js (App Router, 15+) glue for the server SDK.
@@ -1,5 +1,5 @@
1
- import { createXeniaServer, getConsent } from '../chunk-DWFVDNU5.js';
2
- import { visitorCookieName, generateUlid, contextFromUrl } from '../chunk-7NGJC7CF.js';
1
+ import { createXeniaServer, getConsent } from '../chunk-INM2SPH4.js';
2
+ import { visitorCookieName, generateUlid, contextFromUrl } from '../chunk-TGG5Y4QD.js';
3
3
  import * as React from 'react';
4
4
  import { cookies, headers } from 'next/headers';
5
5
  import { NextResponse } from 'next/server';
@@ -643,6 +643,11 @@ interface XeniaMarker {
643
643
  /** Array field replaced by `op: "items"`. */
644
644
  field?: string;
645
645
  limit?: number;
646
+ /**
647
+ * The content keys (Personalization Resolve identifiers) that personalize this entry. A page only
648
+ * acts on markers that list its `contentKey`; a marker without keys is ignored.
649
+ */
650
+ keys?: string[];
646
651
  }
647
652
  /** What the page resolver needs to know about a CMS's entries. `N` is the entry shape. */
648
653
  interface CmsAdapter<N extends object = Node> {
@@ -697,6 +702,12 @@ interface PersonalizeContentOptions {
697
702
  /** Decides runtime targets. Omit to apply static swaps only (zero network). */
698
703
  resolve?: EntryResolver;
699
704
  locale?: string;
705
+ /**
706
+ * The page's Personalization Resolve identifier (required). Only that journey personalizes the
707
+ * page: a marker that doesn't list this key is plain content, and the backend decides for this key
708
+ * alone — another journey targeting the same section is neither consulted nor run.
709
+ */
710
+ contentKey: string;
700
711
  /** Max network rounds (nesting depth of runtime targets). Default 3. */
701
712
  maxRounds?: number;
702
713
  /** Total budget for all rounds, in ms. Undecided targets keep their base. Default 300. */
@@ -731,7 +742,7 @@ declare function personalizeContent<T>(payload: T, options: PersonalizeContentOp
731
742
  * render a skeleton in exactly those places from the first frame instead of flashing base content.
732
743
  * Nested targets inside a pending one are found once it is decided.
733
744
  */
734
- declare function pendingTargets(payload: unknown, cms: CmsAdapter): string[];
745
+ declare function pendingTargets(payload: unknown, adapter: CmsAdapter, contentKey: string): string[];
735
746
  /**
736
747
  * Fetch a page through `options.cms` and personalize it — {@link personalizeContent} without the
737
748
  * fetch in app code. Never throws: a failed fetch comes back as `content: null` with `error`; a page
@@ -643,6 +643,11 @@ interface XeniaMarker {
643
643
  /** Array field replaced by `op: "items"`. */
644
644
  field?: string;
645
645
  limit?: number;
646
+ /**
647
+ * The content keys (Personalization Resolve identifiers) that personalize this entry. A page only
648
+ * acts on markers that list its `contentKey`; a marker without keys is ignored.
649
+ */
650
+ keys?: string[];
646
651
  }
647
652
  /** What the page resolver needs to know about a CMS's entries. `N` is the entry shape. */
648
653
  interface CmsAdapter<N extends object = Node> {
@@ -697,6 +702,12 @@ interface PersonalizeContentOptions {
697
702
  /** Decides runtime targets. Omit to apply static swaps only (zero network). */
698
703
  resolve?: EntryResolver;
699
704
  locale?: string;
705
+ /**
706
+ * The page's Personalization Resolve identifier (required). Only that journey personalizes the
707
+ * page: a marker that doesn't list this key is plain content, and the backend decides for this key
708
+ * alone — another journey targeting the same section is neither consulted nor run.
709
+ */
710
+ contentKey: string;
700
711
  /** Max network rounds (nesting depth of runtime targets). Default 3. */
701
712
  maxRounds?: number;
702
713
  /** Total budget for all rounds, in ms. Undecided targets keep their base. Default 300. */
@@ -731,7 +742,7 @@ declare function personalizeContent<T>(payload: T, options: PersonalizeContentOp
731
742
  * render a skeleton in exactly those places from the first frame instead of flashing base content.
732
743
  * Nested targets inside a pending one are found once it is decided.
733
744
  */
734
- declare function pendingTargets(payload: unknown, cms: CmsAdapter): string[];
745
+ declare function pendingTargets(payload: unknown, adapter: CmsAdapter, contentKey: string): string[];
735
746
  /**
736
747
  * Fetch a page through `options.cms` and personalize it — {@link personalizeContent} without the
737
748
  * fetch in app code. Never throws: a failed fetch comes back as `content: null` with `error`; a page
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  require('../chunk-PKWANLT7.cjs');
4
- var chunk3PYPPIUM_cjs = require('../chunk-3PYPPIUM.cjs');
5
- var chunkIBNIRT7J_cjs = require('../chunk-IBNIRT7J.cjs');
4
+ var chunkTRRMMPBH_cjs = require('../chunk-TRRMMPBH.cjs');
5
+ var chunkYZG6JR4E_cjs = require('../chunk-YZG6JR4E.cjs');
6
6
 
7
7
  // src/server/token.ts
8
8
  async function refreshSdkToken(opts) {
9
- const http = new chunkIBNIRT7J_cjs.HttpClient({ baseUrl: opts.baseUrl, timeout: opts.timeout });
9
+ const http = new chunkYZG6JR4E_cjs.HttpClient({ baseUrl: opts.baseUrl, timeout: opts.timeout });
10
10
  const { data } = await http.request({
11
11
  method: "POST",
12
12
  path: "/api/personalization/token/refresh",
@@ -39,67 +39,67 @@ function createTokenRoute(config) {
39
39
 
40
40
  Object.defineProperty(exports, "XeniaServer", {
41
41
  enumerable: true,
42
- get: function () { return chunk3PYPPIUM_cjs.XeniaServer; }
42
+ get: function () { return chunkTRRMMPBH_cjs.XeniaServer; }
43
43
  });
44
44
  Object.defineProperty(exports, "createXeniaServer", {
45
45
  enumerable: true,
46
- get: function () { return chunk3PYPPIUM_cjs.createXeniaServer; }
46
+ get: function () { return chunkTRRMMPBH_cjs.createXeniaServer; }
47
47
  });
48
48
  Object.defineProperty(exports, "getConsent", {
49
49
  enumerable: true,
50
- get: function () { return chunk3PYPPIUM_cjs.getConsent; }
50
+ get: function () { return chunkTRRMMPBH_cjs.getConsent; }
51
51
  });
52
52
  Object.defineProperty(exports, "getVisitorId", {
53
53
  enumerable: true,
54
- get: function () { return chunk3PYPPIUM_cjs.getVisitorId; }
54
+ get: function () { return chunkTRRMMPBH_cjs.getVisitorId; }
55
55
  });
56
56
  Object.defineProperty(exports, "parseCookies", {
57
57
  enumerable: true,
58
- get: function () { return chunk3PYPPIUM_cjs.parseCookies; }
58
+ get: function () { return chunkTRRMMPBH_cjs.parseCookies; }
59
59
  });
60
60
  Object.defineProperty(exports, "CONSENT_COOKIE", {
61
61
  enumerable: true,
62
- get: function () { return chunkIBNIRT7J_cjs.CONSENT_COOKIE; }
62
+ get: function () { return chunkYZG6JR4E_cjs.CONSENT_COOKIE; }
63
63
  });
64
64
  Object.defineProperty(exports, "CircuitOpenError", {
65
65
  enumerable: true,
66
- get: function () { return chunkIBNIRT7J_cjs.CircuitOpenError; }
66
+ get: function () { return chunkYZG6JR4E_cjs.CircuitOpenError; }
67
67
  });
68
68
  Object.defineProperty(exports, "VISITOR_COOKIE", {
69
69
  enumerable: true,
70
- get: function () { return chunkIBNIRT7J_cjs.VISITOR_COOKIE; }
70
+ get: function () { return chunkYZG6JR4E_cjs.VISITOR_COOKIE; }
71
71
  });
72
72
  Object.defineProperty(exports, "XeniaApi", {
73
73
  enumerable: true,
74
- get: function () { return chunkIBNIRT7J_cjs.XeniaApi; }
74
+ get: function () { return chunkYZG6JR4E_cjs.XeniaApi; }
75
75
  });
76
76
  Object.defineProperty(exports, "consentCookie", {
77
77
  enumerable: true,
78
- get: function () { return chunkIBNIRT7J_cjs.consentCookie; }
78
+ get: function () { return chunkYZG6JR4E_cjs.consentCookie; }
79
79
  });
80
80
  Object.defineProperty(exports, "consentCookieName", {
81
81
  enumerable: true,
82
- get: function () { return chunkIBNIRT7J_cjs.consentCookieName; }
82
+ get: function () { return chunkYZG6JR4E_cjs.consentCookieName; }
83
83
  });
84
84
  Object.defineProperty(exports, "parseActions", {
85
85
  enumerable: true,
86
- get: function () { return chunkIBNIRT7J_cjs.parseActions; }
86
+ get: function () { return chunkYZG6JR4E_cjs.parseActions; }
87
87
  });
88
88
  Object.defineProperty(exports, "pendingTargets", {
89
89
  enumerable: true,
90
- get: function () { return chunkIBNIRT7J_cjs.pendingTargets; }
90
+ get: function () { return chunkYZG6JR4E_cjs.pendingTargets; }
91
91
  });
92
92
  Object.defineProperty(exports, "personalizeContent", {
93
93
  enumerable: true,
94
- get: function () { return chunkIBNIRT7J_cjs.personalizeContent; }
94
+ get: function () { return chunkYZG6JR4E_cjs.personalizeContent; }
95
95
  });
96
96
  Object.defineProperty(exports, "personalizePage", {
97
97
  enumerable: true,
98
- get: function () { return chunkIBNIRT7J_cjs.personalizePage; }
98
+ get: function () { return chunkYZG6JR4E_cjs.personalizePage; }
99
99
  });
100
100
  Object.defineProperty(exports, "visitorCookieName", {
101
101
  enumerable: true,
102
- get: function () { return chunkIBNIRT7J_cjs.visitorCookieName; }
102
+ get: function () { return chunkYZG6JR4E_cjs.visitorCookieName; }
103
103
  });
104
104
  exports.createTokenRoute = createTokenRoute;
105
105
  exports.refreshSdkToken = refreshSdkToken;