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

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 (78) hide show
  1. package/README.md +106 -2
  2. package/dist/{actions-Bhji05Pe.d.cts → actions-C18Kv-4w.d.cts} +35 -0
  3. package/dist/{actions-Bhji05Pe.d.ts → actions-C18Kv-4w.d.ts} +35 -0
  4. package/dist/{api-ByoECRhR.d.ts → api-0IycTYJR.d.cts} +1 -1
  5. package/dist/{api-BqSvWgBZ.d.cts → api-COXWLL5L.d.ts} +1 -1
  6. package/dist/{chunk-TRRMMPBH.cjs → chunk-2DR5AVPX.cjs} +10 -45
  7. package/dist/chunk-2DR5AVPX.cjs.map +1 -0
  8. package/dist/chunk-BQ5PJCZ7.js +179 -0
  9. package/dist/chunk-BQ5PJCZ7.js.map +1 -0
  10. package/dist/{chunk-INM2SPH4.js → chunk-GWRDZIVA.js} +4 -36
  11. package/dist/chunk-GWRDZIVA.js.map +1 -0
  12. package/dist/{chunk-TGG5Y4QD.js → chunk-LW5AEJ6K.js} +5 -179
  13. package/dist/chunk-LW5AEJ6K.js.map +1 -0
  14. package/dist/chunk-N5M4PI7C.cjs +192 -0
  15. package/dist/chunk-N5M4PI7C.cjs.map +1 -0
  16. package/dist/chunk-OMMIRSPK.js +336 -0
  17. package/dist/chunk-OMMIRSPK.js.map +1 -0
  18. package/dist/chunk-QEYONKWY.js +42 -0
  19. package/dist/chunk-QEYONKWY.js.map +1 -0
  20. package/dist/{chunk-YZG6JR4E.cjs → chunk-RWE2OCQL.cjs} +5 -190
  21. package/dist/chunk-RWE2OCQL.cjs.map +1 -0
  22. package/dist/chunk-WHGK55JP.cjs +46 -0
  23. package/dist/chunk-WHGK55JP.cjs.map +1 -0
  24. package/dist/chunk-YLMMTKQL.cjs +358 -0
  25. package/dist/chunk-YLMMTKQL.cjs.map +1 -0
  26. package/dist/client/index.cjs +304 -26
  27. package/dist/client/index.cjs.map +1 -1
  28. package/dist/client/index.d.cts +15 -4
  29. package/dist/client/index.d.ts +15 -4
  30. package/dist/client/index.js +304 -26
  31. package/dist/client/index.js.map +1 -1
  32. package/dist/client/react/index.cjs +712 -26
  33. package/dist/client/react/index.cjs.map +1 -1
  34. package/dist/client/react/index.d.cts +32 -3
  35. package/dist/client/react/index.d.ts +32 -3
  36. package/dist/client/react/index.js +713 -29
  37. package/dist/client/react/index.js.map +1 -1
  38. package/dist/cms/contentful.d.cts +2 -1
  39. package/dist/cms/contentful.d.ts +2 -1
  40. package/dist/consent-Cemn91j3.d.ts +248 -0
  41. package/dist/consent-DgWdjsSy.d.cts +248 -0
  42. package/dist/{cookie-names-Bxd-VNyJ.d.ts → cookie-names-BvUaW3uo.d.ts} +1 -1
  43. package/dist/{cookie-names-RXVfGYPE.d.cts → cookie-names-CnL65Oly.d.cts} +1 -1
  44. package/dist/edge/index.cjs +280 -0
  45. package/dist/edge/index.cjs.map +1 -0
  46. package/dist/edge/index.d.cts +61 -0
  47. package/dist/edge/index.d.ts +61 -0
  48. package/dist/edge/index.js +191 -0
  49. package/dist/edge/index.js.map +1 -0
  50. package/dist/index.cjs +41 -40
  51. package/dist/index.d.cts +5 -4
  52. package/dist/index.d.ts +5 -4
  53. package/dist/index.js +2 -1
  54. package/dist/next/index.cjs +320 -15
  55. package/dist/next/index.cjs.map +1 -1
  56. package/dist/next/index.d.cts +180 -6
  57. package/dist/next/index.d.ts +180 -6
  58. package/dist/next/index.js +309 -9
  59. package/dist/next/index.js.map +1 -1
  60. package/dist/personalize-content-c2DDAV6g.d.ts +140 -0
  61. package/dist/personalize-content-ghZPKlf1.d.cts +140 -0
  62. package/dist/server/index.cjs +34 -32
  63. package/dist/server/index.cjs.map +1 -1
  64. package/dist/server/index.d.cts +6 -5
  65. package/dist/server/index.d.ts +6 -5
  66. package/dist/server/index.js +5 -3
  67. package/dist/server/index.js.map +1 -1
  68. package/dist/{personalize-content-Bf6YZdkZ.d.cts → types-DgVHS4Qw.d.cts} +7 -138
  69. package/dist/{personalize-content-Bf6YZdkZ.d.ts → types-DgVHS4Qw.d.ts} +7 -138
  70. package/dist/xenia-sdk.iife.js +3 -3
  71. package/dist/xenia-sdk.iife.js.map +1 -1
  72. package/dist/{xenia-server-MlI3Khya.d.cts → xenia-server-C3O-cWQT.d.cts} +3 -2
  73. package/dist/{xenia-server-CcjQenru.d.ts → xenia-server-DV8Sjmoo.d.ts} +3 -2
  74. package/package.json +14 -1
  75. package/dist/chunk-INM2SPH4.js.map +0 -1
  76. package/dist/chunk-TGG5Y4QD.js.map +0 -1
  77. package/dist/chunk-TRRMMPBH.cjs.map +0 -1
  78. package/dist/chunk-YZG6JR4E.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/edge/matcher.ts","../../src/edge/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Page matching for the Xenia manifest — a port of the backend's\n * `EdgePageMatcher`, which is the reference:\n *\n * - `/women` exactly that path (case, trailing slash, query ignored)\n * - `/women/*` `/women` and everything below it, not `/womenswear`\n * - `/*` every path\n * - `uk.example.com/women` that path on that host only; hostless patterns match any host\n */\n\nexport function normalizePath(path: string | null | undefined): string {\n if (!path || !path.trim()) return \"/\";\n let p = path.trim().toLowerCase();\n const cut = Math.min(\n ...[\"?\", \"#\"].map((c) => (p.includes(c) ? p.indexOf(c) : p.length)),\n );\n p = p.slice(0, cut);\n if (!p.startsWith(\"/\")) p = \"/\" + p;\n while (p.length > 1 && p.endsWith(\"/\")) p = p.slice(0, -1);\n return p;\n}\n\nconst normalizeHost = (host: string | null | undefined) =>\n (host ?? \"\").trim().toLowerCase().replace(/:\\d+$/, \"\");\n\nfunction matches(pattern: string, host: string, path: string): boolean {\n if (!pattern) return false;\n let patternPath = pattern;\n if (!pattern.startsWith(\"/\")) {\n const slash = pattern.indexOf(\"/\");\n const patternHost = slash < 0 ? pattern : pattern.slice(0, slash);\n if (patternHost !== host) return false;\n patternPath = slash < 0 ? \"/\" : pattern.slice(slash);\n }\n if (patternPath === \"/*\") return true;\n if (patternPath.endsWith(\"/*\")) {\n const prefix = patternPath.slice(0, -2);\n return path === prefix || path.startsWith(prefix + \"/\");\n }\n return path === patternPath;\n}\n\nexport function matchesAny(\n patterns: readonly string[] | null | undefined,\n host: string | null | undefined,\n path: string | null | undefined,\n): boolean {\n if (!patterns?.length) return false;\n const h = normalizeHost(host);\n const p = normalizePath(path);\n return patterns.some((pattern) => matches(pattern, h, p));\n}\n","/**\n * Proxy-side Xenia client for the hybrid personalization flow:\n *\n * 1. `match()` — synchronous, in-memory: does any journey target this page?\n * Answered from the manifest, refreshed in the background every\n * `manifestTtlMs`. Pages no journey targets never call Xenia.\n * 2. `decide()` — for targeted pages only: a per-visitor decision cache hit\n * costs nothing; a miss calls Xenia's `/decide` with a hard `budgetMs`\n * deadline. Timeouts and errors resolve to \"no decision\" (base content),\n * never an exception — Xenia can't slow down or break a page.\n *\n * Runtime-agnostic (only `fetch`, `AbortSignal`, `Map`). The decision cache is\n * per process; swap in `cache` for a shared store (Redis, edge KV).\n */\nimport { matchesAny } from \"./matcher\";\nimport type {\n DecideResult,\n DecisionSource,\n EdgeDecision,\n EdgeFacts,\n Manifest,\n ManifestKey,\n ProfileFacts,\n PublicManifest,\n TrailView,\n} from \"./types\";\n\n/** What a visitor's cached decision holds: the decisions and the profile they were made with. */\nexport type CachedDecision = { decisions: EdgeDecision[]; profile?: ProfileFacts | null };\n\nexport type DecisionCache = {\n get(key: string): CachedDecision | undefined;\n set(key: string, value: CachedDecision, ttlMs: number): void;\n};\n\nexport type XeniaEdgeConfig = {\n /** Xenia engine base URL, e.g. `https://engine.xeniamartech.com/xenia`. */\n baseUrl: string;\n /** A server-type SDK token. Never expose it to the browser. */\n token: string;\n /** Hard deadline for one `/decide` call. Default 150 ms. */\n budgetMs?: number;\n /**\n * Where to read the manifest. Default: Xenia's `/edge/manifest` (with the token). A storefront\n * can serve its own CDN-cached copy instead (e.g. a Next.js ISR route) — then no token is sent.\n */\n manifestUrl?: string;\n /**\n * A manifest baked in at build time. An instance starts with it in memory, so a cold start never\n * waits: the first request uses it and triggers a background refresh. Empty version = none.\n */\n initialManifest?: Manifest | PublicManifest;\n /** How long a cold start waits for the first manifest (only without `initialManifest`). Default 300 ms. */\n manifestWaitMs?: number;\n /** Manifest refresh interval. Default 30 s. */\n manifestTtlMs?: number;\n /** How long a visitor keeps a decision. Default 30 min (a session). */\n decisionTtlMs?: number;\n /**\n * How long a provisional decision is kept (see `provisional`): Jev's answer, or the visitor's first\n * signals, usually land seconds later, so the next view should ask again. Default 15 s.\n */\n provisionalDecisionTtlMs?: number;\n cache?: DecisionCache;\n fetch?: typeof fetch;\n onError?: (error: unknown, context: string) => void;\n};\n\nexport type DecideInput = {\n host: string | null;\n path: string;\n visitorId: string;\n facts: EdgeFacts;\n /** Facts that identify this visitor's context for caching (e.g. landing UTM, device). */\n cacheFacts?: EdgeFacts;\n /** The visitor's recent page views, most recent first (see `TrailView`). */\n trail?: TrailView[];\n /** This call's time budget, instead of the client's (a decision that calls a back office). */\n budgetMs?: number;\n /** How long to keep this call's answer, from what it said, instead of the client's. */\n ttlMs?: (answer: CachedDecision) => number;\n};\n\nexport type DecideOutcome = {\n decisions: EdgeDecision[];\n /** The profile Xenia decided with (also on cache hits), when profiles are on. */\n profile?: ProfileFacts | null;\n source: DecisionSource;\n /** Time spent in Xenia, 0 on a cache hit. */\n ms: number;\n};\n\n/** Bounded in-memory LRU with per-entry expiry. */\nexport function memoryDecisionCache(maxEntries = 10_000): DecisionCache {\n const entries = new Map<string, { value: CachedDecision; expires: number }>();\n return {\n get(key) {\n const hit = entries.get(key);\n if (!hit) return undefined;\n entries.delete(key);\n if (hit.expires < Date.now()) return undefined;\n entries.set(key, hit); // most recently used last\n return hit.value;\n },\n set(key, value, ttlMs) {\n entries.delete(key);\n entries.set(key, { value, expires: Date.now() + ttlMs });\n while (entries.size > maxEntries) {\n entries.delete(entries.keys().next().value as string);\n }\n },\n };\n}\n\nconst stableJson = (facts: EdgeFacts | undefined) =>\n JSON.stringify(\n Object.keys(facts ?? {})\n .sort()\n .map((k) => [k, facts![k]]),\n );\n\n/**\n * Xenia's manifest, or a storefront's trimmed public copy (`{version, pages}`). The trimmed form\n * becomes one key-less entry per page pattern: the proxy then decides by path, and Xenia picks the\n * content keys itself.\n */\nfunction normalizeManifest(m: Manifest | PublicManifest): Manifest {\n if (\"keys\" in m && Array.isArray(m.keys)) return m;\n const pages = (m as PublicManifest).pages ?? [];\n return {\n version: m.version,\n generatedAt: \"\",\n keys: pages.map((p) => ({ contentKey: \"\", mode: \"server\" as const, pages: [p] })),\n };\n}\n\n/**\n * A provisional decision, to ask again soon:\n * - a Visitor Intent step that refines with Jev answered from its signals because Jev hasn't yet;\n * - Visitor Intent steps with no answer at all: the visitor's first signals may land any moment —\n * and for a visitor who is the same in every browser from another browser,\n * which this browser's cache facts (trail, clicks) never see.\n * Steps answered from signals alone change with the visitor's own views, which the cache facts do see.\n */\nfunction provisional(profile: ProfileFacts | null | undefined): boolean {\n const answers = profile?.answers;\n if (!answers || typeof answers !== \"object\") return false;\n const steps = Object.values(answers as Record<string, { choice?: string | null; source?: string; jev?: boolean } | null>);\n return steps.some((a) => a?.source === \"signals\" && a.jev === true) || (steps.length > 0 && steps.every((a) => !a?.choice));\n}\n\nexport function createXeniaEdge(config: XeniaEdgeConfig) {\n const baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n const budgetMs = config.budgetMs ?? 150;\n const manifestWaitMs = config.manifestWaitMs ?? 300;\n const manifestTtlMs = config.manifestTtlMs ?? 30_000;\n const decisionTtlMs = config.decisionTtlMs ?? 30 * 60_000;\n const provisionalDecisionTtlMs = config.provisionalDecisionTtlMs ?? 15_000;\n const cache = config.cache ?? memoryDecisionCache();\n const doFetch = config.fetch ?? fetch;\n const onError = config.onError ?? (() => {});\n const auth = { Authorization: `Bearer ${config.token}` };\n\n // A bundled manifest is used right away; manifestAt 0 makes the first request refresh it in the\n // background (currentManifest only blocks when there is no manifest at all).\n let manifest: Manifest | null = config.initialManifest?.version\n ? normalizeManifest(config.initialManifest)\n : null;\n let manifestAt = 0;\n let refreshing: Promise<void> | null = null;\n const inflight = new Map<string, Promise<DecideOutcome>>();\n\n /** Fetch the manifest (304-aware); keeps the last good one on failure. */\n function refreshManifest(): Promise<void> {\n refreshing ??= (async () => {\n try {\n const res = await doFetch(config.manifestUrl ?? `${baseUrl}/api/personalization/edge/manifest`, {\n headers: config.manifestUrl\n ? {}\n : { ...auth, ...(manifest ? { \"If-None-Match\": `\"${manifest.version}\"` } : {}) },\n signal: AbortSignal.timeout(5_000),\n cache: \"no-store\",\n });\n if (res.status === 304) {\n manifestAt = Date.now();\n } else if (res.ok) {\n manifest = normalizeManifest((await res.json()) as Manifest | PublicManifest);\n manifestAt = Date.now();\n } else {\n onError(new Error(`manifest ${res.status}`), \"manifest\");\n manifestAt = Date.now(); // back off for a TTL before retrying\n }\n } catch (e) {\n onError(e, \"manifest\");\n manifestAt = Date.now();\n } finally {\n refreshing = null;\n }\n })();\n return refreshing;\n }\n\n /** The current manifest; stale-while-revalidate, a bounded wait on cold start. */\n async function currentManifest(): Promise<Manifest | null> {\n if (Date.now() - manifestAt > manifestTtlMs) {\n const pending = refreshManifest();\n if (!manifest) {\n await Promise.race([pending, new Promise((r) => setTimeout(r, manifestWaitMs))]);\n }\n }\n return manifest;\n }\n\n /**\n * The content keys targeting this page, or `null` when no manifest is\n * available yet. An empty array means \"don't call Xenia\".\n */\n async function match(host: string | null, path: string): Promise<ManifestKey[] | null> {\n const m = await currentManifest();\n if (!m) return null;\n return m.keys.filter((k) => k.mode !== \"off\" && matchesAny(k.pages, host, path));\n }\n\n async function decide(keys: ManifestKey[], input: DecideInput): Promise<DecideOutcome> {\n const version = manifest?.version ?? \"\";\n // Known keys are sent explicitly; with a trimmed manifest there are none, and Xenia selects\n // the keys whose pages match the path. Either way the cache is shared by every page that\n // matches the same keys / patterns (e.g. all of /women/*).\n const contentKeys = keys.map((k) => k.contentKey).filter(Boolean).sort();\n const scope = contentKeys.length ? contentKeys.join(\",\") : keys.flatMap((k) => k.pages).sort().join(\",\");\n const cacheKey = [version, input.visitorId, scope, stableJson(input.cacheFacts)].join(\"|\");\n\n const cached = cache.get(cacheKey);\n if (cached) return { decisions: cached.decisions, profile: cached.profile, source: \"cache\", ms: 0 };\n\n // Concurrent requests from one visitor (HTML + RSC prefetches) share a call.\n const pending = inflight.get(cacheKey);\n if (pending) return pending;\n\n const call = (async (): Promise<DecideOutcome> => {\n const started = Date.now();\n try {\n const res = await doFetch(`${baseUrl}/api/personalization/edge/decide`, {\n method: \"POST\",\n headers: { ...auth, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n contentKeys,\n host: input.host,\n path: input.path,\n visitorId: input.visitorId,\n facts: input.facts,\n ...(input.trail?.length ? { trail: input.trail } : {}),\n }),\n signal: AbortSignal.timeout(input.budgetMs ?? budgetMs),\n cache: \"no-store\",\n });\n if (!res.ok) {\n onError(new Error(`decide ${res.status}`), \"decide\");\n return { decisions: [], source: \"error\", ms: Date.now() - started };\n }\n const result = (await res.json()) as DecideResult | null;\n // A reply in the wrong shape is an error, never cached: it would break every view for the TTL.\n if (!Array.isArray(result?.decisions)) throw new Error(\"decide: reply has no decisions list\");\n const decisions = result.decisions.filter((d) => d && Array.isArray(d.swaps));\n const answer = { decisions, profile: result.profile };\n cache.set(cacheKey, answer, input.ttlMs?.(answer) ?? (provisional(result.profile) ? provisionalDecisionTtlMs : decisionTtlMs));\n if (manifest && result.version && result.version !== manifest.version) {\n void refreshManifest(); // journeys changed — pick up the new manifest\n }\n return { decisions, profile: result.profile, source: \"xenia\", ms: Date.now() - started };\n } catch (e) {\n const timedOut = e instanceof DOMException && e.name === \"TimeoutError\";\n if (!timedOut) onError(e, \"decide\");\n return { decisions: [], source: timedOut ? \"timeout\" : \"error\", ms: Date.now() - started };\n } finally {\n inflight.delete(cacheKey);\n }\n })();\n inflight.set(cacheKey, call);\n return call;\n }\n\n return { match, decide, refreshManifest };\n}\n\nexport type XeniaEdge = ReturnType<typeof createXeniaEdge>;\n"]}
package/dist/index.cjs CHANGED
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkPKWANLT7_cjs = require('./chunk-PKWANLT7.cjs');
4
- var chunkYZG6JR4E_cjs = require('./chunk-YZG6JR4E.cjs');
4
+ var chunkRWE2OCQL_cjs = require('./chunk-RWE2OCQL.cjs');
5
+ var chunkN5M4PI7C_cjs = require('./chunk-N5M4PI7C.cjs');
5
6
 
6
7
 
7
8
 
@@ -21,85 +22,85 @@ Object.defineProperty(exports, "spliceSlots", {
21
22
  enumerable: true,
22
23
  get: function () { return chunkPKWANLT7_cjs.spliceSlots; }
23
24
  });
24
- Object.defineProperty(exports, "CONSENT_COOKIE", {
25
+ Object.defineProperty(exports, "MAX_EVENT_ID_LENGTH", {
25
26
  enumerable: true,
26
- get: function () { return chunkYZG6JR4E_cjs.CONSENT_COOKIE; }
27
+ get: function () { return chunkRWE2OCQL_cjs.MAX_EVENT_ID_LENGTH; }
27
28
  });
28
- Object.defineProperty(exports, "CircuitOpenError", {
29
+ Object.defineProperty(exports, "XeniaApi", {
29
30
  enumerable: true,
30
- get: function () { return chunkYZG6JR4E_cjs.CircuitOpenError; }
31
+ get: function () { return chunkRWE2OCQL_cjs.XeniaApi; }
31
32
  });
32
- Object.defineProperty(exports, "DEFAULT_PREFIX", {
33
+ Object.defineProperty(exports, "contextFromUrl", {
33
34
  enumerable: true,
34
- get: function () { return chunkYZG6JR4E_cjs.DEFAULT_PREFIX; }
35
+ get: function () { return chunkRWE2OCQL_cjs.contextFromUrl; }
35
36
  });
36
- Object.defineProperty(exports, "HttpClient", {
37
+ Object.defineProperty(exports, "generateUlid", {
37
38
  enumerable: true,
38
- get: function () { return chunkYZG6JR4E_cjs.HttpClient; }
39
+ get: function () { return chunkRWE2OCQL_cjs.generateUlid; }
39
40
  });
40
- Object.defineProperty(exports, "HttpError", {
41
+ Object.defineProperty(exports, "parseActions", {
41
42
  enumerable: true,
42
- get: function () { return chunkYZG6JR4E_cjs.HttpError; }
43
+ get: function () { return chunkRWE2OCQL_cjs.parseActions; }
43
44
  });
44
- Object.defineProperty(exports, "MAX_EVENT_ID_LENGTH", {
45
+ Object.defineProperty(exports, "pendingTargets", {
45
46
  enumerable: true,
46
- get: function () { return chunkYZG6JR4E_cjs.MAX_EVENT_ID_LENGTH; }
47
+ get: function () { return chunkRWE2OCQL_cjs.pendingTargets; }
47
48
  });
48
- Object.defineProperty(exports, "VISITOR_COOKIE", {
49
+ Object.defineProperty(exports, "personalizeContent", {
49
50
  enumerable: true,
50
- get: function () { return chunkYZG6JR4E_cjs.VISITOR_COOKIE; }
51
+ get: function () { return chunkRWE2OCQL_cjs.personalizeContent; }
51
52
  });
52
- Object.defineProperty(exports, "XeniaApi", {
53
+ Object.defineProperty(exports, "personalizePage", {
53
54
  enumerable: true,
54
- get: function () { return chunkYZG6JR4E_cjs.XeniaApi; }
55
+ get: function () { return chunkRWE2OCQL_cjs.personalizePage; }
55
56
  });
56
- Object.defineProperty(exports, "buildUrl", {
57
+ Object.defineProperty(exports, "toEventId", {
57
58
  enumerable: true,
58
- get: function () { return chunkYZG6JR4E_cjs.buildUrl; }
59
+ get: function () { return chunkRWE2OCQL_cjs.toEventId; }
59
60
  });
60
- Object.defineProperty(exports, "consentCookie", {
61
+ Object.defineProperty(exports, "CONSENT_COOKIE", {
61
62
  enumerable: true,
62
- get: function () { return chunkYZG6JR4E_cjs.consentCookie; }
63
+ get: function () { return chunkN5M4PI7C_cjs.CONSENT_COOKIE; }
63
64
  });
64
- Object.defineProperty(exports, "consentCookieName", {
65
+ Object.defineProperty(exports, "CircuitOpenError", {
65
66
  enumerable: true,
66
- get: function () { return chunkYZG6JR4E_cjs.consentCookieName; }
67
+ get: function () { return chunkN5M4PI7C_cjs.CircuitOpenError; }
67
68
  });
68
- Object.defineProperty(exports, "contextFromUrl", {
69
+ Object.defineProperty(exports, "DEFAULT_PREFIX", {
69
70
  enumerable: true,
70
- get: function () { return chunkYZG6JR4E_cjs.contextFromUrl; }
71
+ get: function () { return chunkN5M4PI7C_cjs.DEFAULT_PREFIX; }
71
72
  });
72
- Object.defineProperty(exports, "generateUlid", {
73
+ Object.defineProperty(exports, "HttpClient", {
73
74
  enumerable: true,
74
- get: function () { return chunkYZG6JR4E_cjs.generateUlid; }
75
+ get: function () { return chunkN5M4PI7C_cjs.HttpClient; }
75
76
  });
76
- Object.defineProperty(exports, "isBrowser", {
77
+ Object.defineProperty(exports, "HttpError", {
77
78
  enumerable: true,
78
- get: function () { return chunkYZG6JR4E_cjs.isBrowser; }
79
+ get: function () { return chunkN5M4PI7C_cjs.HttpError; }
79
80
  });
80
- Object.defineProperty(exports, "parseActions", {
81
+ Object.defineProperty(exports, "VISITOR_COOKIE", {
81
82
  enumerable: true,
82
- get: function () { return chunkYZG6JR4E_cjs.parseActions; }
83
+ get: function () { return chunkN5M4PI7C_cjs.VISITOR_COOKIE; }
83
84
  });
84
- Object.defineProperty(exports, "pendingTargets", {
85
+ Object.defineProperty(exports, "buildUrl", {
85
86
  enumerable: true,
86
- get: function () { return chunkYZG6JR4E_cjs.pendingTargets; }
87
+ get: function () { return chunkN5M4PI7C_cjs.buildUrl; }
87
88
  });
88
- Object.defineProperty(exports, "personalizeContent", {
89
+ Object.defineProperty(exports, "consentCookie", {
89
90
  enumerable: true,
90
- get: function () { return chunkYZG6JR4E_cjs.personalizeContent; }
91
+ get: function () { return chunkN5M4PI7C_cjs.consentCookie; }
91
92
  });
92
- Object.defineProperty(exports, "personalizePage", {
93
+ Object.defineProperty(exports, "consentCookieName", {
93
94
  enumerable: true,
94
- get: function () { return chunkYZG6JR4E_cjs.personalizePage; }
95
+ get: function () { return chunkN5M4PI7C_cjs.consentCookieName; }
95
96
  });
96
- Object.defineProperty(exports, "toEventId", {
97
+ Object.defineProperty(exports, "isBrowser", {
97
98
  enumerable: true,
98
- get: function () { return chunkYZG6JR4E_cjs.toEventId; }
99
+ get: function () { return chunkN5M4PI7C_cjs.isBrowser; }
99
100
  });
100
101
  Object.defineProperty(exports, "visitorCookieName", {
101
102
  enumerable: true,
102
- get: function () { return chunkYZG6JR4E_cjs.visitorCookieName; }
103
+ get: function () { return chunkN5M4PI7C_cjs.visitorCookieName; }
103
104
  });
104
105
  //# sourceMappingURL=index.cjs.map
105
106
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -1,7 +1,8 @@
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';
1
+ export { X as XeniaApi } from './api-0IycTYJR.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-CnL65Oly.cjs';
3
+ import { J as JsonValue, E as EventContext, W as WebhookResponse } from './types-DgVHS4Qw.cjs';
4
+ export { A as AnalyticsContext, a as AnalyticsEventName, b as AnalyticsIdentity, c as AnalyticsIngestResponse, C as CircuitBreakerConfig, d as ConsentState, e as EntryDecision, f as EntryFilter, g as EntryQuery, h as EntrySwapOp, i as EventIdentity, H as HttpMethod, I as IdentifyRequest, j as IdentifyResponse, k as InteractionType, l as JsonObject, M as MessageCta, m as MessagePlacement, P as PersonalizationSwap, R as ResolveBatchItem, n as ResolveBatchResult, o as ResolveEntriesResult, p as ResolveOptions, q as ResolveResult, r as RetryConfig, T as TrackOptions, s as WidgetFormSubmit, t as WidgetPrize, u as WidgetSegment, v as WidgetSubmitResponse, w as WidgetType, X as XeniaAction, x as XeniaConfig, y as XeniaEvent } from './types-DgVHS4Qw.cjs';
5
+ export { A as AppliedSwap, C as CmsAdapter, E as EntryResolver, P as PagePersonalizeOptions, a as PageRef, b as PersonalizeContentOptions, c as PersonalizeContentResult, X as XeniaMarker, p as pendingTargets, d as personalizeContent, e as personalizePage } from './personalize-content-ghZPKlf1.cjs';
5
6
 
6
7
  /**
7
8
  * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
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';
1
+ export { X as XeniaApi } from './api-COXWLL5L.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-BvUaW3uo.js';
3
+ import { J as JsonValue, E as EventContext, W as WebhookResponse } from './types-DgVHS4Qw.js';
4
+ export { A as AnalyticsContext, a as AnalyticsEventName, b as AnalyticsIdentity, c as AnalyticsIngestResponse, C as CircuitBreakerConfig, d as ConsentState, e as EntryDecision, f as EntryFilter, g as EntryQuery, h as EntrySwapOp, i as EventIdentity, H as HttpMethod, I as IdentifyRequest, j as IdentifyResponse, k as InteractionType, l as JsonObject, M as MessageCta, m as MessagePlacement, P as PersonalizationSwap, R as ResolveBatchItem, n as ResolveBatchResult, o as ResolveEntriesResult, p as ResolveOptions, q as ResolveResult, r as RetryConfig, T as TrackOptions, s as WidgetFormSubmit, t as WidgetPrize, u as WidgetSegment, v as WidgetSubmitResponse, w as WidgetType, X as XeniaAction, x as XeniaConfig, y as XeniaEvent } from './types-DgVHS4Qw.js';
5
+ export { A as AppliedSwap, C as CmsAdapter, E as EntryResolver, P as PagePersonalizeOptions, a as PageRef, b as PersonalizeContentOptions, c as PersonalizeContentResult, X as XeniaMarker, p as pendingTargets, d as personalizeContent, e as personalizePage } from './personalize-content-c2DDAV6g.js';
5
6
 
6
7
  /**
7
8
  * Generate a ULID (Universally Unique Lexicographically Sortable Identifier):
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
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-TGG5Y4QD.js';
2
+ export { MAX_EVENT_ID_LENGTH, XeniaApi, contextFromUrl, generateUlid, parseActions, pendingTargets, personalizeContent, personalizePage, toEventId } from './chunk-LW5AEJ6K.js';
3
+ export { CONSENT_COOKIE, CircuitOpenError, DEFAULT_PREFIX, HttpClient, HttpError, VISITOR_COOKIE, buildUrl, consentCookie, consentCookieName, isBrowser, visitorCookieName } from './chunk-BQ5PJCZ7.js';
3
4
  //# sourceMappingURL=index.js.map
4
5
  //# sourceMappingURL=index.js.map
@@ -1,10 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var chunkTRRMMPBH_cjs = require('../chunk-TRRMMPBH.cjs');
4
- var chunkYZG6JR4E_cjs = require('../chunk-YZG6JR4E.cjs');
3
+ var chunk2DR5AVPX_cjs = require('../chunk-2DR5AVPX.cjs');
4
+ var chunkRWE2OCQL_cjs = require('../chunk-RWE2OCQL.cjs');
5
+ var chunkYLMMTKQL_cjs = require('../chunk-YLMMTKQL.cjs');
6
+ var chunkWHGK55JP_cjs = require('../chunk-WHGK55JP.cjs');
7
+ var chunkN5M4PI7C_cjs = require('../chunk-N5M4PI7C.cjs');
5
8
  var React = require('react');
6
9
  var headers = require('next/headers');
7
10
  var server = require('next/server');
11
+ var cache = require('next/cache');
8
12
 
9
13
  function _interopNamespace(e) {
10
14
  if (e && e.__esModule) return e;
@@ -26,6 +30,7 @@ function _interopNamespace(e) {
26
30
 
27
31
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
32
 
33
+ // src/next/shared.ts
29
34
  var URL_HEADER = "x-xenia-url";
30
35
  function cookieAttributes(c = {}) {
31
36
  const sameSite = c.sameSite ?? "Lax";
@@ -37,39 +42,334 @@ function cookieAttributes(c = {}) {
37
42
  ...c.domain && { domain: c.domain }
38
43
  };
39
44
  }
40
- function xeniaProxy(request, opts = {}) {
41
- const name = chunkYZG6JR4E_cjs.visitorCookieName(opts.prefix);
42
- const existing = request.cookies.get(name)?.value;
43
- const visitorId = existing ?? chunkYZG6JR4E_cjs.generateUlid();
44
- const forwarded = new Headers(opts.headers ?? request.headers);
45
- forwarded.set(URL_HEADER, request.url);
46
- if (!existing) {
45
+ function forwardedHeaders(headers2, url, newCookie) {
46
+ const forwarded = new Headers(headers2);
47
+ forwarded.set(URL_HEADER, url);
48
+ if (newCookie) {
47
49
  const header = forwarded.get("cookie");
48
- forwarded.set("cookie", header ? `${header}; ${name}=${visitorId}` : `${name}=${visitorId}`);
50
+ forwarded.set("cookie", header ? `${header}; ${newCookie}` : newCookie);
51
+ }
52
+ return forwarded;
53
+ }
54
+
55
+ // src/edge/debug-entries.ts
56
+ function readDebugEntries(raw) {
57
+ if (!raw) return {};
58
+ try {
59
+ let text = decodeURIComponent(raw);
60
+ if (text.startsWith("%")) text = decodeURIComponent(text);
61
+ const parsed = JSON.parse(text);
62
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
63
+ } catch {
64
+ return {};
65
+ }
66
+ }
67
+
68
+ // src/next/edge-debug.ts
69
+ var QA_CITIES = {
70
+ minneapolis: { country: "US", region: "MN", regionName: "Minnesota", city: "Minneapolis", timeZone: "America/Chicago", latitude: "44.98", longitude: "-93.27" },
71
+ chicago: { country: "US", region: "IL", regionName: "Illinois", city: "Chicago", timeZone: "America/Chicago", latitude: "41.88", longitude: "-87.63" },
72
+ miami: { country: "US", region: "FL", regionName: "Florida", city: "Miami", timeZone: "America/New_York", latitude: "25.76", longitude: "-80.19" },
73
+ new_york: { country: "US", region: "NY", regionName: "New York", city: "New York", timeZone: "America/New_York", latitude: "40.71", longitude: "-74.01" },
74
+ los_angeles: { country: "US", region: "CA", regionName: "California", city: "Los Angeles", timeZone: "America/Los_Angeles", latitude: "34.05", longitude: "-118.24" },
75
+ seattle: { country: "US", region: "WA", regionName: "Washington", city: "Seattle", timeZone: "America/Los_Angeles", latitude: "47.61", longitude: "-122.33" },
76
+ london: { country: "GB", region: "ENG", regionName: "England", city: "London", timeZone: "Europe/London", latitude: "51.51", longitude: "-0.13" },
77
+ sydney: { country: "AU", region: "NSW", regionName: "New South Wales", city: "Sydney", timeZone: "Australia/Sydney", latitude: "-33.87", longitude: "151.21" }
78
+ };
79
+ var QA_MAX_AGE_S = 60 * 60;
80
+ var validDate = (d) => typeof d === "string" && /^\d{4}-\d{2}-\d{2}$/.test(d) && !Number.isNaN(Date.parse(d));
81
+ function readQa(request, cities, cookie) {
82
+ const isCity = (c) => typeof c === "string" && Object.hasOwn(cities, c);
83
+ let qa;
84
+ try {
85
+ const saved = JSON.parse(request.cookies.get(cookie)?.value ?? "{}");
86
+ qa = {
87
+ ...isCity(saved?.geo) ? { geo: saved.geo } : {},
88
+ ...validDate(saved?.date) ? { date: saved.date } : {}
89
+ };
90
+ } catch {
91
+ qa = {};
92
+ }
93
+ const p = request.nextUrl.searchParams;
94
+ let changed = false;
95
+ if (p.get("xn_geo") === "off") {
96
+ changed = Object.keys(qa).length > 0;
97
+ qa = {};
98
+ }
99
+ const city = p.get("xn_geo")?.toLowerCase();
100
+ if (isCity(city)) {
101
+ qa = { ...qa, geo: city };
102
+ changed = true;
103
+ }
104
+ const date = p.get("xn_date");
105
+ if (validDate(date)) {
106
+ qa = { ...qa, date };
107
+ changed = true;
108
+ }
109
+ return { qa, changed };
110
+ }
111
+ function rememberQa(response, qa, cookie) {
112
+ if (Object.keys(qa).length) response.cookies.set(cookie, JSON.stringify(qa), { path: "/", maxAge: QA_MAX_AGE_S, sameSite: "lax" });
113
+ else response.cookies.delete(cookie);
114
+ }
115
+ var qaNow = (qa) => qa.date ? /* @__PURE__ */ new Date(`${qa.date}T17:00:00Z`) : void 0;
116
+ var MAX_PAGE = 200;
117
+ var DEBUG_COOKIE_MAX = 3900;
118
+ var DEBUG_MAX_AGE_S = 300;
119
+ var GEO_HEADERS = ["x-xn-geo", "x-nf-geo", "x-country", "x-vercel-ip-country", "cloudfront-viewer-country", "cf-ipcountry"];
120
+ var geoLabel = (g) => g ? `${g.city ? `${g.city}, ` : ""}${g.country ?? "-"}${g.region ? `/${g.region}` : ""} (${g.source ?? "?"})` : "none";
121
+ function sourcesSeen(request) {
122
+ const seen = GEO_HEADERS.filter((n) => request.headers.get(n));
123
+ const g = globalThis;
124
+ if (g.Netlify) seen.push(g.Netlify.context ? "Netlify.context" : "Netlify (no context)");
125
+ return seen;
126
+ }
127
+ function profileSummary(profile) {
128
+ if (!profile) return void 0;
129
+ const answers = Object.fromEntries(
130
+ Object.entries(profile.answers ?? {}).map(([name, a]) => [
131
+ name,
132
+ { ...a, scores: Object.fromEntries(Object.entries(a?.scores ?? {}).filter(([, v]) => v > 0).sort((x, y) => y[1] - x[1]).slice(0, 5)) }
133
+ ])
134
+ );
135
+ return { answers, pageViews: profile.page_views, lastSection: profile.last_section, campaign: profile.last_utm_campaign };
136
+ }
137
+ var SOURCES = { skipped: "site page", "not-targeted": "not targeted", "no-consent": "no consent", error: "error" };
138
+ function debugEntry(info) {
139
+ const { outcome } = info;
140
+ return {
141
+ page: info.ctx.path,
142
+ geo: geoLabel(info.ctx.geo),
143
+ // Structured, for the panel's Request tab.
144
+ request: {
145
+ location: info.ctx.geo,
146
+ via: info.ctx.geoVia,
147
+ seen: sourcesSeen(info.ctx.request),
148
+ ...info.ctx.detectedGeo ? { detected: info.ctx.detectedGeo } : {},
149
+ device: info.ctx.device,
150
+ consent: info.ctx.consent
151
+ },
152
+ source: outcome?.source ?? SOURCES[info.exit] ?? info.exit,
153
+ ...outcome ? { ms: outcome.ms, profile: profileSummary(outcome.profile) } : {},
154
+ decisions: (outcome?.decisions ?? []).map((d) => ({
155
+ key: d.contentKey,
156
+ result: d.personalized ? d.variant || "personalized" : d.reason?.startsWith("suppressed") ? "suppressed" : d.bucket ?? "base",
157
+ reason: d.reason,
158
+ trace: d.trace
159
+ }))
160
+ };
161
+ }
162
+ function writeDebug(request, response, entry, cookie) {
163
+ if (chunkYLMMTKQL_cjs.isPrefetch(request.headers)) return;
164
+ entry = { ...entry, page: entry.page.slice(0, MAX_PAGE) };
165
+ const pages = readDebugEntries(request.cookies.get(cookie)?.value);
166
+ delete pages[entry.page];
167
+ pages[entry.page] = { ...entry, at: Date.now() };
168
+ let entries = Object.entries(pages).slice(-4);
169
+ const encoded = () => encodeURIComponent(JSON.stringify(Object.fromEntries(entries)));
170
+ while (entries.length > 1 && encodeURIComponent(encoded()).length > DEBUG_COOKIE_MAX) entries = entries.slice(1);
171
+ if (encodeURIComponent(encoded()).length > DEBUG_COOKIE_MAX) {
172
+ const { profile: _drop, ...rest } = pages[entry.page];
173
+ entries = [[entry.page, rest]];
174
+ }
175
+ if (encodeURIComponent(encoded()).length > DEBUG_COOKIE_MAX) {
176
+ entries = [[entry.page, { page: entry.page, source: entry.source, note: "entry too large for the debug cookie" }]];
49
177
  }
178
+ response.cookies.set(cookie, encoded(), { path: "/", maxAge: DEBUG_MAX_AGE_S, sameSite: "lax" });
179
+ }
180
+
181
+ // src/next/edge-proxy.ts
182
+ var MAX_QUERY = 20;
183
+ var MAX_QUERY_VALUE = 500;
184
+ async function xeniaEdgeProxy(request, opts) {
185
+ if (request.method !== "GET" && request.method !== "HEAD") return server.NextResponse.next();
186
+ if (chunkYLMMTKQL_cjs.isBot(request.headers.get("user-agent"))) return server.NextResponse.next();
187
+ const started = Date.now();
188
+ const prefix = opts.prefix ?? chunkN5M4PI7C_cjs.DEFAULT_PREFIX;
189
+ const vidCookie = chunkN5M4PI7C_cjs.visitorCookieName(prefix);
190
+ const ctxCookie = `${prefix}_ctx`;
191
+ const trailCookie = chunkYLMMTKQL_cjs.trailCookieName(prefix);
192
+ const { pathname: path } = request.nextUrl;
193
+ const existingVisitorId = request.cookies.get(vidCookie)?.value;
194
+ const landing = chunkYLMMTKQL_cjs.landingContext(request.nextUrl, request.headers.get("referer"), request.cookies.get(ctxCookie)?.value);
195
+ const qaOn = Boolean(opts.qa);
196
+ const cities = typeof opts.qa === "object" && opts.qa.cities || QA_CITIES;
197
+ const qaCookie = `${prefix}_qa_ctx`;
198
+ const { qa, changed: qaChanged } = qaOn ? readQa(request, cities, qaCookie) : { qa: {}, changed: false };
199
+ const detected = chunkYLMMTKQL_cjs.viewerGeo(request, { trust: opts.geoHeaders, devOverride: qaOn && process.env.NODE_ENV === "development" });
200
+ const qaCity = qa.geo && Object.hasOwn(cities, qa.geo) ? cities[qa.geo] : void 0;
201
+ const { geo, via } = qaCity ? { geo: { ...qaCity, source: "qa" }, via: "qa" } : detected;
202
+ const ctx = {
203
+ request,
204
+ host: request.headers.get("host"),
205
+ path,
206
+ visitorId: existingVisitorId ?? chunkRWE2OCQL_cjs.generateUlid(),
207
+ existingVisitorId,
208
+ geo,
209
+ geoVia: via,
210
+ ...qaCity && detected.geo ? { detectedGeo: detected.geo } : {},
211
+ device: chunkYLMMTKQL_cjs.deviceOf(request.headers),
212
+ landing: landing.ctx,
213
+ previousTrail: chunkYLMMTKQL_cjs.readTrail(request.cookies.get(trailCookie)?.value),
214
+ trail: [],
215
+ consent: chunkYLMMTKQL_cjs.edgeConsent(request.headers, { prefix, respectDnt: opts.respectDnt }),
216
+ now: qaNow(qa) ?? /* @__PURE__ */ new Date()
217
+ };
218
+ const newVisitor = () => ctx.visitorId !== existingVisitorId;
219
+ const forwarded = () => forwardedHeaders(request.headers, request.url, newVisitor() ? `${vidCookie}=${ctx.visitorId}` : void 0);
220
+ const base = () => server.NextResponse.next({ request: { headers: forwarded() } });
221
+ const respond = (url) => url ? server.NextResponse.rewrite(url, { request: { headers: forwarded() } }) : base();
222
+ const finish = async (response, exit, desc, rest = {}) => {
223
+ if (newVisitor()) response.cookies.set(vidCookie, ctx.visitorId, cookieAttributes(opts.cookie));
224
+ if (landing.changed || ctx.landing !== landing.ctx) {
225
+ response.cookies.set(ctxCookie, JSON.stringify(ctx.landing), { path: "/", sameSite: "lax", httpOnly: true });
226
+ }
227
+ if (ctx.consent.analytics && chunkYLMMTKQL_cjs.isPageLoad(request.headers) && ctx.trail.length && ctx.trail !== ctx.previousTrail) {
228
+ response.cookies.set(trailCookie, chunkYLMMTKQL_cjs.trailCookieValue(ctx.trail), { path: "/", maxAge: chunkYLMMTKQL_cjs.TRAIL_MAX_AGE_S, sameSite: "lax" });
229
+ }
230
+ response.headers.set("Server-Timing", `xenia;dur=${Date.now() - started};desc="${desc}"`);
231
+ if (qaChanged) rememberQa(response, qa, qaCookie);
232
+ try {
233
+ const info = { ctx, exit, response, ...rest };
234
+ await opts.onDecision?.(info);
235
+ if (opts.debug) writeDebug(request, response, { ...debugEntry(info), ...opts.debugInfo?.(info) }, `${prefix}_debug`);
236
+ } catch (error) {
237
+ opts.onError?.(error);
238
+ }
239
+ return response;
240
+ };
241
+ try {
242
+ return await decideAndRespond();
243
+ } catch (error) {
244
+ opts.onError?.(error);
245
+ return finish(base(), "error", "error");
246
+ }
247
+ async function decideAndRespond() {
248
+ await opts.prepare?.(ctx);
249
+ ctx.trail = chunkYLMMTKQL_cjs.withView(ctx.previousTrail, path);
250
+ if (opts.skip?.(path)) return finish(base(), "skipped", "site page");
251
+ const query = {};
252
+ for (const [k, v] of request.nextUrl.searchParams) {
253
+ if (Object.keys(query).length >= MAX_QUERY) break;
254
+ if (v.length <= MAX_QUERY_VALUE) query[k] = v;
255
+ }
256
+ const facts = {
257
+ ...ctx.landing,
258
+ ...chunkYLMMTKQL_cjs.localTime(ctx.geo, ctx.now),
259
+ device: ctx.device,
260
+ path,
261
+ url: request.nextUrl.href,
262
+ query,
263
+ ...ctx.geo ? { geo: ctx.geo } : {},
264
+ ...ctx.trail[1] ? { previousPath: ctx.trail[1].path } : {},
265
+ ...await opts.facts?.(ctx)
266
+ };
267
+ if (!ctx.consent.personalization) {
268
+ return finish(respond(await opts.rewrite?.(ctx, [], void 0, void 0)), "no-consent", "no consent", { facts });
269
+ }
270
+ const keys = await opts.edge.match(ctx.host, path) ?? [{ contentKey: "", mode: "server", pages: [path] }];
271
+ if (!keys.length) {
272
+ return finish(respond(await opts.rewrite?.(ctx, [], void 0, void 0)), "not-targeted", "not targeted", { facts });
273
+ }
274
+ const pending = opts.alongside?.(ctx, keys);
275
+ const cacheFacts = {
276
+ ...ctx.landing,
277
+ device: ctx.device,
278
+ country: ctx.geo?.country ?? "",
279
+ city: ctx.geo?.city ?? "",
280
+ // A page the visitor hadn't viewed, a time on page, or a click can change their profile.
281
+ pages: ctx.trail.map((t) => t.path).sort().join(" "),
282
+ timed: ctx.trail.filter((t) => t.seconds !== void 0).map((t) => `${t.path}:${Math.round(t.seconds)}`).sort().join(" "),
283
+ clicks: request.cookies.get(`${prefix}_clicks`)?.value ?? "0",
284
+ // A QA date is another moment: never answer it from today's cached decision.
285
+ ...qa.date ? { qaDate: qa.date } : {},
286
+ ...await opts.cacheFacts?.(ctx)
287
+ };
288
+ const outcome = await opts.edge.decide(keys, {
289
+ host: ctx.host,
290
+ path,
291
+ visitorId: ctx.visitorId,
292
+ facts,
293
+ cacheFacts,
294
+ ...ctx.consent.analytics ? { trail: ctx.trail } : {},
295
+ budgetMs: opts.budgetMs?.(ctx)
296
+ });
297
+ const side = await pending;
298
+ const decisions = opts.filterDecisions ? opts.filterDecisions(outcome.decisions, ctx, side, outcome) : outcome.decisions;
299
+ const groups = chunkYLMMTKQL_cjs.swapGroups(decisions);
300
+ let url = await opts.rewrite?.(ctx, groups, side, outcome);
301
+ if (url === void 0 && groups.length) {
302
+ const token = await chunkYLMMTKQL_cjs.encodeVariant(groups, opts.variantSecret, await opts.extra?.(ctx, side, outcome));
303
+ url = request.nextUrl.clone();
304
+ url.pathname = `${opts.variantPrefix ?? "/xv"}/${token}${path === "/" ? "" : path}`;
305
+ }
306
+ return finish(respond(url), "decided", outcome.source, { facts, outcome, side });
307
+ }
308
+ }
309
+ var EMPTY = { version: "", pages: [] };
310
+ var MAX_WEBHOOK_BODY = 64 * 1024;
311
+ function createManifestRoute(opts) {
312
+ return async () => {
313
+ if (!opts.token) return Response.json(EMPTY);
314
+ try {
315
+ const manifest = await chunkYLMMTKQL_cjs.fetchManifest({
316
+ baseUrl: opts.baseUrl,
317
+ token: opts.token,
318
+ ...opts.revalidate !== void 0 ? { init: { next: { revalidate: opts.revalidate } } } : {}
319
+ });
320
+ return Response.json(chunkYLMMTKQL_cjs.trimManifest(manifest));
321
+ } catch (error) {
322
+ if (process.env.NEXT_PHASE === "phase-production-build") {
323
+ console.warn("[xenia] manifest unavailable at build:", error instanceof Error ? error.message : error);
324
+ return Response.json(EMPTY);
325
+ }
326
+ throw error;
327
+ }
328
+ };
329
+ }
330
+ function createRevalidateRoute(opts) {
331
+ return async (request) => {
332
+ const body = await request.text();
333
+ if (body.length > MAX_WEBHOOK_BODY || !await chunkYLMMTKQL_cjs.verifyWebhook({ headers: request.headers, body }, opts.secret ?? "")) {
334
+ return Response.json({ error: "invalid signature" }, { status: 401 });
335
+ }
336
+ const event = request.headers.get("x-xenia-event") ?? "";
337
+ if (event === "ping") return Response.json({ ok: true, event });
338
+ if (event !== "manifest.changed") return Response.json({ ok: true, ignored: event });
339
+ for (const path of opts.paths) cache.revalidatePath(path);
340
+ return Response.json({ ok: true, event, revalidated: opts.paths, ...await opts.onManifestChanged?.() });
341
+ };
342
+ }
343
+
344
+ // src/next/index.ts
345
+ function xeniaProxy(request, opts = {}) {
346
+ const name = chunkN5M4PI7C_cjs.visitorCookieName(opts.prefix);
347
+ const existing = request.cookies.get(name)?.value;
348
+ const visitorId = existing ?? chunkRWE2OCQL_cjs.generateUlid();
349
+ const forwarded = forwardedHeaders(opts.headers ?? request.headers, request.url, existing ? void 0 : `${name}=${visitorId}`);
50
350
  const response = server.NextResponse.next({ request: { headers: forwarded } });
51
351
  if (!existing) response.cookies.set(name, visitorId, cookieAttributes(opts.cookie));
52
352
  return response;
53
353
  }
54
354
  async function xeniaServerFromNext(config) {
55
355
  const [jar, h] = await Promise.all([headers.cookies(), headers.headers()]);
56
- const name = chunkYZG6JR4E_cjs.visitorCookieName(config.prefix);
356
+ const name = chunkN5M4PI7C_cjs.visitorCookieName(config.prefix);
57
357
  let visitorId = config.visitorId ?? jar.get(name)?.value;
58
358
  if (!visitorId) {
59
- visitorId = chunkYZG6JR4E_cjs.generateUlid();
359
+ visitorId = chunkRWE2OCQL_cjs.generateUlid();
60
360
  try {
61
361
  jar.set(name, visitorId, cookieAttributes());
62
362
  } catch {
63
363
  }
64
364
  }
65
- return chunkTRRMMPBH_cjs.createXeniaServer({
365
+ return chunk2DR5AVPX_cjs.createXeniaServer({
66
366
  ...config,
67
367
  visitorId,
68
- context: { ...chunkYZG6JR4E_cjs.contextFromUrl(h.get(URL_HEADER), h.get("referer")), ...config.context }
368
+ context: { ...chunkRWE2OCQL_cjs.contextFromUrl(h.get(URL_HEADER), h.get("referer")), ...config.context }
69
369
  });
70
370
  }
71
371
  async function consentFromNext(prefix) {
72
- return chunkTRRMMPBH_cjs.getConsent((await headers.headers()).get("cookie"), prefix);
372
+ return chunkWHGK55JP_cjs.getConsent((await headers.headers()).get("cookie"), prefix);
73
373
  }
74
374
  var requestStore = typeof React__namespace.cache === "function" ? React__namespace.cache(() => /* @__PURE__ */ new Map()) : () => /* @__PURE__ */ new Map();
75
375
  function personalizeOnce(key, personalize) {
@@ -82,9 +382,14 @@ function personalizeOnce(key, personalize) {
82
382
  return run;
83
383
  }
84
384
 
385
+ exports.QA_CITIES = QA_CITIES;
85
386
  exports.URL_HEADER = URL_HEADER;
86
387
  exports.consentFromNext = consentFromNext;
388
+ exports.createManifestRoute = createManifestRoute;
389
+ exports.createRevalidateRoute = createRevalidateRoute;
87
390
  exports.personalizeOnce = personalizeOnce;
391
+ exports.readDebugEntries = readDebugEntries;
392
+ exports.xeniaEdgeProxy = xeniaEdgeProxy;
88
393
  exports.xeniaProxy = xeniaProxy;
89
394
  exports.xeniaServerFromNext = xeniaServerFromNext;
90
395
  //# sourceMappingURL=index.cjs.map