@gradial/aci 0.1.52-rc.2 → 0.1.52-rc.21

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 (123) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +4 -4
  3. package/dist/astro/preview.js +2 -17
  4. package/dist/audience-data-models.d.ts +289 -16
  5. package/dist/audience-data-models.js +99 -2
  6. package/dist/cli/compile-registry.d.mts +5 -1
  7. package/dist/cli/compile-registry.mjs +25 -10
  8. package/dist/cli/validate-content.d.mts +31 -1
  9. package/dist/cli/validate-content.mjs +50 -12
  10. package/dist/collect/aci.js +1 -1
  11. package/dist/collect/aci.js.sha256 +1 -1
  12. package/dist/collect/api.d.ts +3 -7
  13. package/dist/collect/api.js +2 -8
  14. package/dist/collect/batcher.d.ts +6 -5
  15. package/dist/collect/batcher.js +6 -5
  16. package/dist/collect/index.js +1 -1
  17. package/dist/content/provider.d.ts +1 -0
  18. package/dist/content/resolve-slots.d.ts +9 -2
  19. package/dist/content/resolve-slots.js +5 -3
  20. package/dist/content/types.d.ts +2 -0
  21. package/dist/edge/expression-capabilities.v1.d.ts +106 -0
  22. package/dist/edge/expression-capabilities.v1.js +165 -0
  23. package/dist/internal/domain/edge/compose.d.ts +24 -0
  24. package/dist/internal/domain/edge/compose.js +89 -0
  25. package/dist/internal/domain/edge/identity.js +1 -1
  26. package/dist/internal/domain/edge/index.d.ts +2 -0
  27. package/dist/internal/domain/edge/index.js +2 -0
  28. package/dist/internal/domain/edge/mimic_token.d.ts +13 -0
  29. package/dist/internal/domain/edge/mimic_token.js +58 -0
  30. package/dist/internal/domain/edge/personalization-core.d.ts +69 -5
  31. package/dist/internal/domain/edge/personalization-core.js +693 -58
  32. package/dist/internal/domain/edge/record/codec.d.ts +5 -2
  33. package/dist/internal/domain/edge/record/codec.js +85 -12
  34. package/dist/internal/domain/edge/resolve.js +38 -18
  35. package/dist/internal/domain/edge/testdata/flat_only_validator_v1.d.ts +10 -0
  36. package/dist/internal/domain/edge/testdata/flat_only_validator_v1.js +253 -0
  37. package/dist/internal/domain/edge/types.d.ts +52 -9
  38. package/dist/internal/domain/edge/types.js +3 -3
  39. package/dist/mimic/core.d.ts +2 -0
  40. package/dist/mimic/core.js +31 -0
  41. package/dist/next/error-seat-payload.js +1 -1
  42. package/dist/next/hosted-page-target.d.ts +7 -0
  43. package/dist/next/hosted-page-target.js +39 -0
  44. package/dist/next/index.d.ts +0 -1
  45. package/dist/next/index.js +0 -1
  46. package/dist/next/page.d.ts +29 -6
  47. package/dist/next/page.js +47 -25
  48. package/dist/next/server.js +28 -1
  49. package/dist/next/vercel-edge-projection-v1.d.ts +0 -9
  50. package/dist/next/vercel-edge-projection-v1.js +9 -539
  51. package/dist/preview/core.d.ts +1 -0
  52. package/dist/preview/core.js +27 -0
  53. package/dist/providers/s3.js +4 -3
  54. package/dist/react/VideoPlayer.d.ts +1 -1
  55. package/dist/react/index.d.ts +1 -1
  56. package/dist/types/block-ref.d.ts +2 -0
  57. package/dist/types/block-ref.js +1 -0
  58. package/package.json +16 -7
  59. package/src/cli/compile-registry.mjs +24 -10
  60. package/src/cli/validate-content.mjs +52 -13
  61. package/src/types/block-ref.test.ts +45 -0
  62. package/src/types/block-ref.ts +2 -0
  63. package/templates/astro/starter-content/src/fixtures/atomicBlocks.ts +7 -6
  64. package/templates/astro/starter-content/src/fixtures/composition.ts +3 -2
  65. package/templates/astro/starter-content/src/fixtures/sections.ts +2 -1
  66. package/templates/astro/template/package.json.tmpl +1 -1
  67. package/templates/astro/template/src/layouts/SiteLayout.astro +2 -2
  68. package/templates/common/.agents/skills/aci/SKILL.md +6 -0
  69. package/templates/common/.agents/skills/authoring/SKILL.md +11 -3
  70. package/templates/common/.agents/skills/authoring/references/block-slots.md +3 -0
  71. package/templates/common/.agents/skills/dam-delivery/SKILL.md +228 -0
  72. package/templates/common/.agents/skills/dam-delivery/references/parameter-contract.md +107 -0
  73. package/templates/common/.agents/skills/dam-delivery/references/permalink-grammar.md +131 -0
  74. package/templates/common/.content/pages/{home/_index.json → _index.json} +10 -0
  75. package/templates/common/.content/schemas/site.schema.json +1 -1
  76. package/templates/common/.nvmrc +1 -1
  77. package/templates/common/starter-content/.content/.rules-baseline.json +8 -0
  78. package/templates/common/starter-content/.content/config/site.json +1 -1
  79. package/templates/common/starter-content/.content/content-rules/no-public-resource-paths.json +6 -0
  80. package/templates/common/starter-content/.content/fragments/navbar/_index.json +23 -20
  81. package/templates/common/starter-content/.content/fragments/site-footer/_index.json +59 -56
  82. package/templates/common/starter-content/.content/pages/404/_index.json +1 -0
  83. package/templates/common/starter-content/.content/pages/about/_index.json +3 -0
  84. package/templates/common/starter-content/.content/pages/error/_index.json +1 -0
  85. package/templates/common/starter-content/.content/pages/home/_index.json +9 -0
  86. package/templates/common/starter-content/.content/patterns/components/button.json +55 -0
  87. package/templates/common/starter-content/.content/patterns/components/container.json +62 -0
  88. package/templates/common/starter-content/.content/patterns/components/feature_card.json +30 -0
  89. package/templates/common/starter-content/.content/patterns/components/feature_grid.json +57 -0
  90. package/templates/common/starter-content/.content/patterns/components/home_hero.json +142 -0
  91. package/templates/common/starter-content/.content/patterns/components/personalization_choice.json +42 -0
  92. package/templates/common/starter-content/.content/patterns/components/site-footer.json +203 -0
  93. package/templates/common/starter-content/.content/patterns/components/site-navigation.json +115 -0
  94. package/templates/common/starter-content/.content/patterns/components/stats_bar.json +45 -0
  95. package/templates/common/starter-content/.content/patterns/layouts/default.json +14 -0
  96. package/templates/common/starter-content/.content/schemas/site.schema.json +1 -1
  97. package/templates/nextjs/template/.aci.yaml +10 -0
  98. package/templates/nextjs/template/package.json.tmpl +4 -3
  99. package/templates/nextjs/template/src/app/_components/c15t-bridge.ts +30 -0
  100. package/templates/nextjs/template/src/app/_components/c15t-consent-ui.tsx +37 -0
  101. package/templates/nextjs/template/src/app/_components/consent-manager.css +63 -0
  102. package/templates/nextjs/template/src/app/_components/consent-manager.tsx +76 -0
  103. package/templates/nextjs/template/src/app/layout.tsx +2 -0
  104. package/dist/edge/personalization-core.d.ts +0 -11
  105. package/dist/edge/personalization-core.js +0 -269
  106. package/dist/next/collect-route.d.ts +0 -19
  107. package/dist/next/collect-route.js +0 -459
  108. package/dist/next/envelope-digest.d.ts +0 -21
  109. package/dist/next/envelope-digest.js +0 -58
  110. package/dist/next/middleware.d.ts +0 -40
  111. package/dist/next/middleware.js +0 -475
  112. package/dist/next/personalization-host.d.ts +0 -134
  113. package/dist/next/personalization-host.js +0 -270
  114. package/dist/next/root-layout.d.ts +0 -4
  115. package/dist/next/root-layout.js +0 -5
  116. package/dist/next/vercel-collect-sdk-route.d.ts +0 -27
  117. package/dist/next/vercel-collect-sdk-route.js +0 -181
  118. package/dist/next/vercel-personalization.d.ts +0 -4
  119. package/dist/next/vercel-personalization.js +0 -4
  120. package/dist/next/vercel-s3-personalization.d.ts +0 -79
  121. package/dist/next/vercel-s3-personalization.js +0 -570
  122. /package/templates/common/.content/overlays/audience/preference-blue/pages/{home/_index.json → _index.json} +0 -0
  123. /package/templates/common/.content/overlays/audience/preference-red/pages/{home/_index.json → _index.json} +0 -0
@@ -1,269 +0,0 @@
1
- // Runtime-neutral personalization selection. Vercel imports this module and
2
- // the CloudFront Terraform wrapper inlines the same source into its function.
3
- // Keep this file free of platform APIs and dependencies.
4
- export function selectPersonalizationVariant(request, route, claims, experiments, identity) {
5
- return resolvePersonalizationDecision(request, route, claims, experiments, identity).variant;
6
- }
7
- export function resolvePersonalizationDecision(request, route, claims, experiments, identity) {
8
- if (!route)
9
- return { variant: null, experiment: null };
10
- let variant = selectRuleVariant(request, route, claims, experiments);
11
- let experiment = null;
12
- if (identity && identity.usable && route.variants && experiments) {
13
- const candidates = Object.values(experiments)
14
- .filter((item) => (item.kind === 'ab' || item.kind === 'abn') && item.status === 'running')
15
- .filter((item) => routeHasExperiment(route, item.id))
16
- .sort((left, right) => (right.priority || 0) - (left.priority || 0)
17
- || String(left.id || '').localeCompare(String(right.id || '')));
18
- for (let index = 0; index < candidates.length; index++) {
19
- const item = candidates[index];
20
- const assignment = assignExperiment(item, identity);
21
- const candidate = assignment && route.variants[assignment.variantKey];
22
- if (!candidate)
23
- continue;
24
- if (!variant || betterVariant(candidate.priority || 0, candidate.variantKey, variant.priority || 0, variant.variantKey)) {
25
- variant = candidate;
26
- experiment = assignment;
27
- }
28
- break;
29
- }
30
- }
31
- return { variant: variant || null, experiment };
32
- }
33
- function selectRuleVariant(request, route, claims, experiments) {
34
- if (!route.variants)
35
- return null;
36
- const matches = [];
37
- for (const key in route.variants) {
38
- const variant = route.variants[key];
39
- const values = variant.variantValues || variantValuesFromKey(key);
40
- const experimentID = String(values.experiment || '').trim();
41
- if (experimentID && (!experiments || !experiments[experimentID]
42
- || experiments[experimentID].status !== 'running'))
43
- continue;
44
- if (!requestDimensionsMatch(request, values))
45
- continue;
46
- const membershipMatch = (values.audience && claims && (claims.aud || []).includes(values.audience))
47
- || (values.segment && claims && (claims.seg || []).includes(values.segment));
48
- const ruleMatch = variant.rule ? evaluateRule(request, variant.rule) : false;
49
- if (membershipMatch || ruleMatch)
50
- matches.push(variant);
51
- }
52
- matches.sort((left, right) => (right.priority || 0) - (left.priority || 0)
53
- || String(left.variantKey || '').localeCompare(String(right.variantKey || '')));
54
- return matches[0] || null;
55
- }
56
- // CloudFront KVS values are capped at 1 KiB. The variant map key is the
57
- // canonical encoding of its dimensions, so compact route records omit the
58
- // duplicated variantValues object and recover it at the edge.
59
- function variantValuesFromKey(key) {
60
- const values = {};
61
- const parts = String(key || '').replace(/&/g, ';').split(';');
62
- for (let index = 0; index < parts.length; index++) {
63
- const separator = parts[index].indexOf('=');
64
- if (separator > 0)
65
- values[parts[index].slice(0, separator)] = parts[index].slice(separator + 1);
66
- }
67
- return values;
68
- }
69
- function routeHasExperiment(route, experimentID) {
70
- for (const key in route.variants || {}) {
71
- const values = route.variants[key].variantValues || variantValuesFromKey(key);
72
- if (values.experiment === experimentID)
73
- return true;
74
- }
75
- return false;
76
- }
77
- function assignExperiment(experiment, identity) {
78
- const version = String(experiment.allocationVersion || '').trim();
79
- const salt = String(experiment.salt || '').trim();
80
- const siteID = String(identity.siteId || '').trim();
81
- const identityKey = `${String(identity.namespace || '').trim()}:${String(identity.identityHash || '').trim()}`;
82
- if (!version || !salt || !siteID || identityKey === ':')
83
- return null;
84
- const input = [siteID, String(experiment.id || ''), version, identityKey, salt].join('\0');
85
- const bucket = sha256Bucket(input);
86
- let cumulative = 0;
87
- const arms = experiment.arms || [];
88
- for (let index = 0; index < arms.length; index++) {
89
- const arm = arms[index];
90
- if ((arm.allocationBasisPoints || 0) <= 0)
91
- continue;
92
- cumulative += arm.allocationBasisPoints;
93
- if (bucket < cumulative) {
94
- return {
95
- experimentId: experiment.id,
96
- armId: arm.id,
97
- allocationVersion: version,
98
- variantKey: arm.variantKey,
99
- bucket,
100
- };
101
- }
102
- }
103
- return null;
104
- }
105
- function betterVariant(candidatePriority, candidateKey, bestPriority, bestKey) {
106
- if (candidatePriority !== bestPriority)
107
- return candidatePriority > bestPriority;
108
- return String(candidateKey || '').localeCompare(String(bestKey || '')) < 0;
109
- }
110
- function requestDimensionsMatch(request, values) {
111
- for (const rawKey in values) {
112
- const rawWant = values[rawKey];
113
- const key = String(rawKey).trim();
114
- const normalized = key.toLowerCase();
115
- const want = String(rawWant).trim();
116
- if (!key || !want || ['audience', 'segment', 'experiment', 'experimentarm'].includes(normalized))
117
- continue;
118
- const candidates = (request.query[key] || []).concat(request.query['aci_' + key] || [], request.headers['x-aci-' + normalized] || '', request.headers['x-gradial-' + normalized] || '', request.cookies[key] || '', request.cookies['aci_' + key] || '');
119
- if (normalized === 'locale') {
120
- const locales = String(request.headers['accept-language'] || '')
121
- .split(',').map((part) => part.split(';')[0].trim()).filter(Boolean);
122
- for (let localeIndex = 0; localeIndex < locales.length; localeIndex++)
123
- candidates.push(locales[localeIndex]);
124
- }
125
- if (!candidates.some((candidate) => normalized === 'locale'
126
- ? String(candidate).toLowerCase() === want.toLowerCase()
127
- : String(candidate) === want))
128
- return false;
129
- }
130
- return true;
131
- }
132
- function evaluateRule(request, rule) {
133
- const all = rule.all || [];
134
- const any = rule.any || [];
135
- if (all.length + any.length === 0)
136
- return false;
137
- return all.every((condition) => evaluateCondition(request, condition))
138
- && (any.length === 0 || any.some((condition) => evaluateCondition(request, condition)));
139
- }
140
- function evaluateCondition(request, condition) {
141
- const values = signalValues(request, condition.field);
142
- if (condition.operator === 'exists')
143
- return values.length > 0;
144
- if (values.length === 0 || !['string', 'number', 'boolean'].includes(typeof condition.value))
145
- return false;
146
- const expected = String(condition.value);
147
- return values.some((value) => {
148
- switch (condition.operator) {
149
- case 'equals': return value === expected;
150
- case 'contains': return value.includes(expected);
151
- case 'startsWith': return value.startsWith(expected);
152
- default: return false;
153
- }
154
- });
155
- }
156
- function signalValues(request, field) {
157
- if (field.startsWith('query.'))
158
- return request.query[field.slice(6)] || [];
159
- if (field.startsWith('header.'))
160
- return request.headers[field.slice(7).toLowerCase()] ? [request.headers[field.slice(7).toLowerCase()]] : [];
161
- if (field.startsWith('cookie.'))
162
- return request.cookies[field.slice(7)] ? [request.cookies[field.slice(7)]] : [];
163
- if (field.startsWith('utm.'))
164
- return request.query['utm_' + field.slice(4)] || [];
165
- if (field.startsWith('geo.')) {
166
- const geo = request.signals && request.signals.geo;
167
- const value = geo && geo[field.slice(4).toLowerCase()];
168
- return value ? [value] : [];
169
- }
170
- if (field === 'referrer') {
171
- const value = request.headers.referer || request.headers.referrer;
172
- return value ? [value] : [];
173
- }
174
- return [];
175
- }
176
- // SHA-256 mirrors experiment.assignment.go: the first eight digest bytes are
177
- // interpreted big-endian and reduced modulo 10,000 basis points.
178
- // CLOUDFRONT_STRIP_START — the build script removes this block for CloudFront
179
- // Functions (experiment bucketing moves to the hosting Lambda to stay under
180
- // the 10 KiB function size limit).
181
- function sha256Bucket(value) {
182
- const bytes = utf8(value);
183
- const words = new Uint32Array(64);
184
- const bitLength = bytes.length * 8;
185
- const paddedLength = ((bytes.length + 9 + 63) >> 6) << 6;
186
- const data = new Uint8Array(paddedLength);
187
- data.set(bytes);
188
- data[bytes.length] = 128;
189
- // The message length is a 64-bit big-endian integer across the final
190
- // eight bytes. The previous code wrote a single truncated byte into each
191
- // word's most significant position, corrupting every digest (caught by
192
- // the assignment parity vectors, spec experiment-variant-caching REQ-9).
193
- const bitsHigh = Math.floor(bitLength / 0x100000000);
194
- const bitsLow = bitLength >>> 0;
195
- data[paddedLength - 8] = (bitsHigh >>> 24) & 255;
196
- data[paddedLength - 7] = (bitsHigh >>> 16) & 255;
197
- data[paddedLength - 6] = (bitsHigh >>> 8) & 255;
198
- data[paddedLength - 5] = bitsHigh & 255;
199
- data[paddedLength - 4] = (bitsLow >>> 24) & 255;
200
- data[paddedLength - 3] = (bitsLow >>> 16) & 255;
201
- data[paddedLength - 2] = (bitsLow >>> 8) & 255;
202
- data[paddedLength - 1] = bitsLow & 255;
203
- let a = 0x6a09e667, b = 0xbb67ae85, c = 0x3c6ef372, d = 0xa54ff53a;
204
- let e = 0x510e527f, f = 0x9b05688c, g = 0x1f83d9ab, h = 0x5be0cd19;
205
- const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
206
- for (let offset = 0; offset < paddedLength; offset += 64) {
207
- for (let i = 0; i < 16; i++) {
208
- const p = offset + i * 4;
209
- words[i] = (data[p] << 24) | (data[p + 1] << 16) | (data[p + 2] << 8) | data[p + 3];
210
- }
211
- for (let i = 16; i < 64; i++) {
212
- const x = words[i - 15], y = words[i - 2];
213
- words[i] = (words[i - 16] + (rotr(x, 7) ^ rotr(x, 18) ^ (x >>> 3)) + words[i - 7] + (rotr(y, 17) ^ rotr(y, 19) ^ (y >>> 10))) >>> 0;
214
- }
215
- let aa = a, bb = b, cc = c, dd = d, ee = e, ff = f, gg = g, hh = h;
216
- for (let i = 0; i < 64; i++) {
217
- const s1 = rotr(ee, 6) ^ rotr(ee, 11) ^ rotr(ee, 25);
218
- const ch = (ee & ff) ^ (~ee & gg);
219
- const t1 = (hh + s1 + ch + k[i] + words[i]) >>> 0;
220
- const s0 = rotr(aa, 2) ^ rotr(aa, 13) ^ rotr(aa, 22);
221
- const maj = (aa & bb) ^ (aa & cc) ^ (bb & cc);
222
- const t2 = (s0 + maj) >>> 0;
223
- hh = gg;
224
- gg = ff;
225
- ff = ee;
226
- ee = (dd + t1) >>> 0;
227
- dd = cc;
228
- cc = bb;
229
- bb = aa;
230
- aa = (t1 + t2) >>> 0;
231
- }
232
- a = (a + aa) >>> 0;
233
- b = (b + bb) >>> 0;
234
- c = (c + cc) >>> 0;
235
- d = (d + dd) >>> 0;
236
- e = (e + ee) >>> 0;
237
- f = (f + ff) >>> 0;
238
- g = (g + gg) >>> 0;
239
- h = (h + hh) >>> 0;
240
- }
241
- // Reduce the 64-bit big-endian value modulo 10000 in 32-bit halves:
242
- // (hi*2^32 + lo) % 10000 == ((hi%10000) * (2^32 % 10000) + lo%10000) % 10000,
243
- // and 2^32 % 10000 = 7296. Multiplying hi by 2^32 directly exceeds
244
- // Number.MAX_SAFE_INTEGER and rounds away the low bits — that float error
245
- // made most JS buckets diverge from assignment.go (caught by the
246
- // assignment parity vectors, spec experiment-variant-caching REQ-9).
247
- return (((a >>> 0) % 10000) * 7296 + ((b >>> 0) % 10000)) % 10000;
248
- }
249
- function rotr(value, amount) { return (value >>> amount) | (value << (32 - amount)); }
250
- function utf8(value) {
251
- const out = [];
252
- for (let i = 0; i < value.length; i++) {
253
- let code = value.charCodeAt(i);
254
- if (code >= 0xd800 && code <= 0xdbff && i + 1 < value.length) {
255
- const next = value.charCodeAt(++i);
256
- code = 0x10000 + ((code - 0xd800) << 10) + (next - 0xdc00);
257
- }
258
- if (code < 0x80)
259
- out.push(code);
260
- else if (code < 0x800)
261
- out.push(0xc0 | (code >> 6), 0x80 | (code & 63));
262
- else if (code < 0x10000)
263
- out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 63), 0x80 | (code & 63));
264
- else
265
- out.push(0xf0 | (code >> 18), 0x80 | ((code >> 12) & 63), 0x80 | ((code >> 6) & 63), 0x80 | (code & 63));
266
- }
267
- return new Uint8Array(out);
268
- }
269
- // CLOUDFRONT_STRIP_END
@@ -1,19 +0,0 @@
1
- import { type IdentitySigningKeys, type PersonalizationCollectionStore } from './personalization-host.js';
2
- export interface PersonalizationCollectRouteConfig {
3
- siteId: string;
4
- store: PersonalizationCollectionStore;
5
- identityKeys: IdentitySigningKeys;
6
- /**
7
- * Claims verify keys (kid -> secret) for withdrawal EVIDENCE
8
- * (anonymous-experiments REQ-6): suppression fires only when the request
9
- * presents a signature-verified aci_claims cookie — presence alone is
10
- * spoofable, and under universal minting an unverified trigger would
11
- * suppress every reject-all visitor. Empty = evidence never verifies =
12
- * suppression disabled (fails safe).
13
- */
14
- claimsKeys?: Record<string, string>;
15
- retentionSeconds?: number;
16
- secureCookies?: boolean;
17
- now?: () => Date;
18
- }
19
- export declare function createPersonalizationCollectRoute(config: PersonalizationCollectRouteConfig): (request: Request) => Promise<Response>;