@contentful/experiences-client 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +1 -87
- package/dist/create-delivery-client.d.ts +1 -15
- package/dist/create-delivery-client.js +1 -15
- package/dist/create-delivery-client.js.map +1 -1
- package/dist/index.d.ts +1 -10
- package/dist/index.js +0 -19
- package/dist/index.js.map +1 -1
- package/package.json +2 -5
- package/dist/constants.d.ts +0 -11
- package/dist/constants.js +0 -7
- package/dist/constants.js.map +0 -1
- package/dist/contentful-experiences.d.ts +0 -76
- package/dist/contentful-experiences.js +0 -104
- package/dist/contentful-experiences.js.map +0 -1
- package/dist/create-optimization-client.d.ts +0 -20
- package/dist/create-optimization-client.js +0 -30
- package/dist/create-optimization-client.js.map +0 -1
- package/dist/event-builder.d.ts +0 -444
- package/dist/event-builder.js +0 -282
- package/dist/event-builder.js.map +0 -1
- package/dist/runtime-event-handoff.d.ts +0 -33
- package/dist/runtime-event-handoff.js +0 -68
- package/dist/runtime-event-handoff.js.map +0 -1
- package/dist/runtime-event-methods.d.ts +0 -52
- package/dist/runtime-event-methods.js +0 -109
- package/dist/runtime-event-methods.js.map +0 -1
- package/dist/sdk-info.d.ts +0 -12
- package/dist/sdk-info.js +0 -8
- package/dist/sdk-info.js.map +0 -1
package/dist/event-builder.js
DELETED
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Campaign as OptimizationCampaign,
|
|
3
|
-
ExoEntityKind as OptimizationExoEntityKind,
|
|
4
|
-
GeoLocation as OptimizationGeoLocation,
|
|
5
|
-
Page as OptimizationPage,
|
|
6
|
-
PageEventContext as OptimizationPageEventContext,
|
|
7
|
-
parseWithFriendlyError as parseOptimizationSchema,
|
|
8
|
-
Properties as OptimizationProperties,
|
|
9
|
-
Screen as OptimizationScreen,
|
|
10
|
-
Traits as OptimizationTraits
|
|
11
|
-
} from "@contentful/optimization-api-client/api-schemas";
|
|
12
|
-
import { createScopedLogger as createOptimizationScopedLogger } from "@contentful/optimization-api-client/logger";
|
|
13
|
-
import { merge } from "es-toolkit/object";
|
|
14
|
-
import * as z from "zod/mini";
|
|
15
|
-
const eventBuilderLogger = createOptimizationScopedLogger("Experiences:EventBuilder");
|
|
16
|
-
const UTM_CAMPAIGN_PARAMETERS = [
|
|
17
|
-
["utm_campaign", "name"],
|
|
18
|
-
["utm_source", "source"],
|
|
19
|
-
["utm_medium", "medium"],
|
|
20
|
-
["utm_term", "term"],
|
|
21
|
-
["utm_content", "content"]
|
|
22
|
-
];
|
|
23
|
-
function extractCampaignFromUrl(url) {
|
|
24
|
-
if (url === void 0) return void 0;
|
|
25
|
-
try {
|
|
26
|
-
const { searchParams } = new URL(url);
|
|
27
|
-
const campaign = {};
|
|
28
|
-
let hasCampaignParameter = false;
|
|
29
|
-
for (const [parameter, property] of UTM_CAMPAIGN_PARAMETERS) {
|
|
30
|
-
if (!searchParams.has(parameter)) continue;
|
|
31
|
-
campaign[property] = searchParams.get(parameter) ?? "";
|
|
32
|
-
hasCampaignParameter = true;
|
|
33
|
-
}
|
|
34
|
-
return hasCampaignParameter ? campaign : void 0;
|
|
35
|
-
} catch {
|
|
36
|
-
return void 0;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
const UniversalEventBuilderArgs = z.object({
|
|
40
|
-
campaign: z.optional(OptimizationCampaign),
|
|
41
|
-
locale: z.optional(z.string()),
|
|
42
|
-
location: z.optional(OptimizationGeoLocation),
|
|
43
|
-
page: z.optional(OptimizationPage),
|
|
44
|
-
screen: z.optional(OptimizationScreen),
|
|
45
|
-
userAgent: z.optional(z.string())
|
|
46
|
-
});
|
|
47
|
-
const InteractionBuilderArgsBase = z.extend(UniversalEventBuilderArgs, {
|
|
48
|
-
entityId: z.string(),
|
|
49
|
-
entityKind: OptimizationExoEntityKind,
|
|
50
|
-
entityKindId: z.optional(z.string()),
|
|
51
|
-
entryIds: z.optional(z.array(z.string())),
|
|
52
|
-
optimizationId: z.optional(z.string()),
|
|
53
|
-
parameters: z.optional(z.record(z.string(), z.json())),
|
|
54
|
-
parentExperienceId: z.optional(z.string()),
|
|
55
|
-
variantId: z.optional(z.string()),
|
|
56
|
-
variantIndex: z.optional(z.number())
|
|
57
|
-
});
|
|
58
|
-
const ViewBuilderArgs = z.extend(InteractionBuilderArgsBase, {
|
|
59
|
-
viewId: z.string(),
|
|
60
|
-
viewDurationMs: z.int().check(z.minimum(0))
|
|
61
|
-
});
|
|
62
|
-
const ClickBuilderArgs = InteractionBuilderArgsBase;
|
|
63
|
-
const HoverBuilderArgs = z.extend(InteractionBuilderArgsBase, {
|
|
64
|
-
hoverId: z.string(),
|
|
65
|
-
hoverDurationMs: z.int().check(z.minimum(0))
|
|
66
|
-
});
|
|
67
|
-
const FlagInteractionBuilderArgsBase = z.extend(UniversalEventBuilderArgs, {
|
|
68
|
-
componentId: z.string(),
|
|
69
|
-
experienceId: z.optional(z.string()),
|
|
70
|
-
variantIndex: z.optional(z.number())
|
|
71
|
-
});
|
|
72
|
-
const FlagViewBuilderArgs = z.extend(FlagInteractionBuilderArgsBase, {
|
|
73
|
-
viewId: z.optional(z.string()),
|
|
74
|
-
viewDurationMs: z.optional(z.number())
|
|
75
|
-
});
|
|
76
|
-
const IdentifyBuilderArgs = z.extend(UniversalEventBuilderArgs, {
|
|
77
|
-
traits: z.optional(OptimizationTraits),
|
|
78
|
-
userId: z.string()
|
|
79
|
-
});
|
|
80
|
-
const PageViewBuilderArgs = z.extend(UniversalEventBuilderArgs, {
|
|
81
|
-
properties: z.optional(z.partial(OptimizationPage))
|
|
82
|
-
});
|
|
83
|
-
const TrackBuilderArgs = z.extend(UniversalEventBuilderArgs, {
|
|
84
|
-
event: z.string(),
|
|
85
|
-
properties: z.optional(z.prefault(OptimizationProperties, {}))
|
|
86
|
-
});
|
|
87
|
-
const PAGE_CONTEXT_CONFLICT_KEYS = ["path", "query", "search", "url"];
|
|
88
|
-
function warnIfPageContextConflicts(explicitPage, properties) {
|
|
89
|
-
if (!explicitPage) return;
|
|
90
|
-
const conflictingKeys = PAGE_CONTEXT_CONFLICT_KEYS.filter((key) => {
|
|
91
|
-
const { [key]: explicitValue } = explicitPage;
|
|
92
|
-
const { [key]: propertyValue } = properties;
|
|
93
|
-
return JSON.stringify(explicitValue) !== JSON.stringify(propertyValue);
|
|
94
|
-
});
|
|
95
|
-
if (conflictingKeys.length === 0) return;
|
|
96
|
-
eventBuilderLogger.warn(
|
|
97
|
-
`Explicit page context differs from page event properties for: ${conflictingKeys.join(", ")}`
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
const DEFAULT_PAGE_PROPERTIES = {
|
|
101
|
-
path: "",
|
|
102
|
-
query: {},
|
|
103
|
-
referrer: "",
|
|
104
|
-
search: "",
|
|
105
|
-
title: "",
|
|
106
|
-
url: ""
|
|
107
|
-
};
|
|
108
|
-
class EventBuilder {
|
|
109
|
-
app;
|
|
110
|
-
channel;
|
|
111
|
-
library;
|
|
112
|
-
getLocale;
|
|
113
|
-
getPageProperties;
|
|
114
|
-
getUserAgent;
|
|
115
|
-
getConsent;
|
|
116
|
-
constructor(config) {
|
|
117
|
-
const { app, channel, library, getLocale, getPageProperties, getUserAgent, getConsent } = config;
|
|
118
|
-
this.app = app;
|
|
119
|
-
this.channel = channel;
|
|
120
|
-
this.library = library;
|
|
121
|
-
this.getLocale = getLocale ?? (() => "en-US");
|
|
122
|
-
this.getPageProperties = getPageProperties ?? (() => DEFAULT_PAGE_PROPERTIES);
|
|
123
|
-
this.getUserAgent = getUserAgent ?? (() => void 0);
|
|
124
|
-
this.getConsent = getConsent ?? (() => void 0);
|
|
125
|
-
}
|
|
126
|
-
buildUniversalEventProperties({
|
|
127
|
-
campaign,
|
|
128
|
-
locale,
|
|
129
|
-
location,
|
|
130
|
-
page,
|
|
131
|
-
screen,
|
|
132
|
-
userAgent
|
|
133
|
-
}) {
|
|
134
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
135
|
-
const resolvedPage = page ?? this.getPageProperties();
|
|
136
|
-
return {
|
|
137
|
-
channel: this.channel,
|
|
138
|
-
context: {
|
|
139
|
-
app: this.app,
|
|
140
|
-
campaign: campaign ?? extractCampaignFromUrl(resolvedPage.url) ?? {},
|
|
141
|
-
gdpr: { isConsentGiven: this.getConsent() === true },
|
|
142
|
-
library: this.library,
|
|
143
|
-
locale: locale ?? this.getLocale() ?? "en-US",
|
|
144
|
-
location,
|
|
145
|
-
page: resolvedPage,
|
|
146
|
-
screen,
|
|
147
|
-
userAgent: userAgent ?? this.getUserAgent()
|
|
148
|
-
},
|
|
149
|
-
messageId: crypto.randomUUID(),
|
|
150
|
-
originalTimestamp: timestamp,
|
|
151
|
-
sentAt: timestamp,
|
|
152
|
-
timestamp
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
buildInteractionBase(args) {
|
|
156
|
-
const { campaign, locale, location, page, screen, userAgent, ...interactionProperties } = args;
|
|
157
|
-
return {
|
|
158
|
-
...this.buildUniversalEventProperties({
|
|
159
|
-
campaign,
|
|
160
|
-
locale,
|
|
161
|
-
location,
|
|
162
|
-
page,
|
|
163
|
-
screen,
|
|
164
|
-
userAgent
|
|
165
|
-
}),
|
|
166
|
-
...interactionProperties
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
buildView(args) {
|
|
170
|
-
const { viewId, viewDurationMs, ...interaction } = parseOptimizationSchema(
|
|
171
|
-
ViewBuilderArgs,
|
|
172
|
-
args
|
|
173
|
-
);
|
|
174
|
-
return {
|
|
175
|
-
...this.buildInteractionBase(interaction),
|
|
176
|
-
type: "exo_node_view",
|
|
177
|
-
viewId,
|
|
178
|
-
viewDurationMs
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
buildClick(args) {
|
|
182
|
-
const interaction = parseOptimizationSchema(ClickBuilderArgs, args);
|
|
183
|
-
return {
|
|
184
|
-
...this.buildInteractionBase(interaction),
|
|
185
|
-
type: "exo_node_click"
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
buildHover(args) {
|
|
189
|
-
const { hoverId, hoverDurationMs, ...interaction } = parseOptimizationSchema(
|
|
190
|
-
HoverBuilderArgs,
|
|
191
|
-
args
|
|
192
|
-
);
|
|
193
|
-
return {
|
|
194
|
-
...this.buildInteractionBase(interaction),
|
|
195
|
-
type: "exo_node_hover",
|
|
196
|
-
hoverId,
|
|
197
|
-
hoverDurationMs
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
buildFlagView(args) {
|
|
201
|
-
const { componentId, experienceId, variantIndex, viewId, viewDurationMs, ...universal } = parseOptimizationSchema(FlagViewBuilderArgs, args);
|
|
202
|
-
return {
|
|
203
|
-
...this.buildUniversalEventProperties(universal),
|
|
204
|
-
...viewDurationMs === void 0 ? {} : { viewDurationMs },
|
|
205
|
-
...viewId === void 0 ? {} : { viewId },
|
|
206
|
-
type: "component",
|
|
207
|
-
componentType: "Variable",
|
|
208
|
-
componentId,
|
|
209
|
-
experienceId,
|
|
210
|
-
variantIndex: variantIndex ?? 0
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
buildIdentify(args) {
|
|
214
|
-
const {
|
|
215
|
-
traits = {},
|
|
216
|
-
userId,
|
|
217
|
-
...universal
|
|
218
|
-
} = parseOptimizationSchema(IdentifyBuilderArgs, args);
|
|
219
|
-
return {
|
|
220
|
-
...this.buildUniversalEventProperties(universal),
|
|
221
|
-
type: "identify",
|
|
222
|
-
traits,
|
|
223
|
-
userId
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
buildPageView(args = {}) {
|
|
227
|
-
const { properties = {}, ...universal } = parseOptimizationSchema(PageViewBuilderArgs, args);
|
|
228
|
-
const propertiesCampaign = extractCampaignFromUrl(properties.url);
|
|
229
|
-
const pageProperties = this.getPageProperties();
|
|
230
|
-
const merged = merge(
|
|
231
|
-
{
|
|
232
|
-
...pageProperties,
|
|
233
|
-
title: pageProperties.title ?? DEFAULT_PAGE_PROPERTIES.title
|
|
234
|
-
},
|
|
235
|
-
properties
|
|
236
|
-
);
|
|
237
|
-
warnIfPageContextConflicts(universal.page, merged);
|
|
238
|
-
const {
|
|
239
|
-
context: { screen: _, ...universalContext },
|
|
240
|
-
...universalProperties
|
|
241
|
-
} = this.buildUniversalEventProperties({
|
|
242
|
-
...universal,
|
|
243
|
-
campaign: universal.campaign ?? propertiesCampaign,
|
|
244
|
-
page: universal.page ?? merged
|
|
245
|
-
});
|
|
246
|
-
const context = parseOptimizationSchema(OptimizationPageEventContext, universalContext);
|
|
247
|
-
return {
|
|
248
|
-
...universalProperties,
|
|
249
|
-
context,
|
|
250
|
-
type: "page",
|
|
251
|
-
properties: merged
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
buildTrack(args) {
|
|
255
|
-
const {
|
|
256
|
-
event,
|
|
257
|
-
properties = {},
|
|
258
|
-
...universal
|
|
259
|
-
} = parseOptimizationSchema(TrackBuilderArgs, args);
|
|
260
|
-
return {
|
|
261
|
-
...this.buildUniversalEventProperties(universal),
|
|
262
|
-
type: "track",
|
|
263
|
-
event,
|
|
264
|
-
properties
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
var event_builder_default = EventBuilder;
|
|
269
|
-
export {
|
|
270
|
-
ClickBuilderArgs,
|
|
271
|
-
DEFAULT_PAGE_PROPERTIES,
|
|
272
|
-
FlagViewBuilderArgs,
|
|
273
|
-
HoverBuilderArgs,
|
|
274
|
-
IdentifyBuilderArgs,
|
|
275
|
-
InteractionBuilderArgsBase,
|
|
276
|
-
PageViewBuilderArgs,
|
|
277
|
-
TrackBuilderArgs,
|
|
278
|
-
UniversalEventBuilderArgs,
|
|
279
|
-
ViewBuilderArgs,
|
|
280
|
-
event_builder_default as default
|
|
281
|
-
};
|
|
282
|
-
//# sourceMappingURL=event-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-builder.ts"],"sourcesContent":["/* eslint-disable no-redeclare */\n\nimport {\n type App as OptimizationApp,\n Campaign as OptimizationCampaign,\n type Channel as OptimizationChannel,\n type ExoClickEvent as OptimizationExoClickEvent,\n ExoEntityKind as OptimizationExoEntityKind,\n type ExoHoverEvent as OptimizationExoHoverEvent,\n type ExoViewEvent as OptimizationExoViewEvent,\n GeoLocation as OptimizationGeoLocation,\n type IdentifyEvent as OptimizationIdentifyEvent,\n type Library as OptimizationLibrary,\n Page as OptimizationPage,\n PageEventContext as OptimizationPageEventContext,\n type PageViewEvent as OptimizationPageViewEvent,\n parseWithFriendlyError as parseOptimizationSchema,\n Properties as OptimizationProperties,\n Screen as OptimizationScreen,\n type TrackEvent as OptimizationTrackEvent,\n Traits as OptimizationTraits,\n UniversalEventProperties as OptimizationUniversalEventProperties,\n type ViewEvent as OptimizationViewEvent,\n} from '@contentful/optimization-api-client/api-schemas';\nimport { createScopedLogger as createOptimizationScopedLogger } from '@contentful/optimization-api-client/logger';\nimport { merge } from 'es-toolkit/object';\nimport * as z from 'zod/mini';\n\nconst eventBuilderLogger = createOptimizationScopedLogger('Experiences:EventBuilder');\n\nconst UTM_CAMPAIGN_PARAMETERS = [\n ['utm_campaign', 'name'],\n ['utm_source', 'source'],\n ['utm_medium', 'medium'],\n ['utm_term', 'term'],\n ['utm_content', 'content'],\n] as const;\n\nfunction extractCampaignFromUrl(url: string | undefined): OptimizationCampaign | undefined {\n if (url === undefined) return undefined;\n\n try {\n const { searchParams } = new URL(url);\n const campaign: OptimizationCampaign = {};\n let hasCampaignParameter = false;\n\n for (const [parameter, property] of UTM_CAMPAIGN_PARAMETERS) {\n if (!searchParams.has(parameter)) continue;\n\n campaign[property] = searchParams.get(parameter) ?? '';\n hasCampaignParameter = true;\n }\n\n return hasCampaignParameter ? campaign : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface EventBuilderConfig {\n app?: OptimizationApp;\n channel: OptimizationChannel;\n library: OptimizationLibrary;\n getLocale?: () => string | undefined;\n getPageProperties?: () => OptimizationPage;\n getUserAgent?: () => string | undefined;\n getConsent?: () => boolean | undefined;\n}\n\nexport const UniversalEventBuilderArgs = z.object({\n campaign: z.optional(OptimizationCampaign),\n locale: z.optional(z.string()),\n location: z.optional(OptimizationGeoLocation),\n page: z.optional(OptimizationPage),\n screen: z.optional(OptimizationScreen),\n userAgent: z.optional(z.string()),\n});\n\nexport type UniversalEventBuilderArgs = z.infer<typeof UniversalEventBuilderArgs>;\n\nexport const InteractionBuilderArgsBase = z.extend(UniversalEventBuilderArgs, {\n entityId: z.string(),\n entityKind: OptimizationExoEntityKind,\n entityKindId: z.optional(z.string()),\n entryIds: z.optional(z.array(z.string())),\n optimizationId: z.optional(z.string()),\n parameters: z.optional(z.record(z.string(), z.json())),\n parentExperienceId: z.optional(z.string()),\n variantId: z.optional(z.string()),\n variantIndex: z.optional(z.number()),\n});\n\nexport type InteractionBuilderArgsBase = z.infer<typeof InteractionBuilderArgsBase>;\n\nexport const ViewBuilderArgs = z.extend(InteractionBuilderArgsBase, {\n viewId: z.string(),\n viewDurationMs: z.int().check(z.minimum(0)),\n});\n\nexport type ViewBuilderArgs = z.infer<typeof ViewBuilderArgs>;\n\nexport const ClickBuilderArgs = InteractionBuilderArgsBase;\n\nexport type ClickBuilderArgs = z.infer<typeof ClickBuilderArgs>;\n\nexport const HoverBuilderArgs = z.extend(InteractionBuilderArgsBase, {\n hoverId: z.string(),\n hoverDurationMs: z.int().check(z.minimum(0)),\n});\n\nexport type HoverBuilderArgs = z.infer<typeof HoverBuilderArgs>;\n\nconst FlagInteractionBuilderArgsBase = z.extend(UniversalEventBuilderArgs, {\n componentId: z.string(),\n experienceId: z.optional(z.string()),\n variantIndex: z.optional(z.number()),\n});\n\nexport const FlagViewBuilderArgs = z.extend(FlagInteractionBuilderArgsBase, {\n viewId: z.optional(z.string()),\n viewDurationMs: z.optional(z.number()),\n});\n\nexport type FlagViewBuilderArgs = z.infer<typeof FlagViewBuilderArgs>;\n\nexport const IdentifyBuilderArgs = z.extend(UniversalEventBuilderArgs, {\n traits: z.optional(OptimizationTraits),\n userId: z.string(),\n});\n\nexport type IdentifyBuilderArgs = z.infer<typeof IdentifyBuilderArgs>;\n\nexport const PageViewBuilderArgs = z.extend(UniversalEventBuilderArgs, {\n properties: z.optional(z.partial(OptimizationPage)),\n});\n\nexport type PageViewBuilderArgs = z.infer<typeof PageViewBuilderArgs>;\n\nexport const TrackBuilderArgs = z.extend(UniversalEventBuilderArgs, {\n event: z.string(),\n properties: z.optional(z.prefault(OptimizationProperties, {})),\n});\n\nexport type TrackBuilderArgs = z.infer<typeof TrackBuilderArgs>;\n\nconst PAGE_CONTEXT_CONFLICT_KEYS = ['path', 'query', 'search', 'url'] as const;\n\nfunction warnIfPageContextConflicts(\n explicitPage: OptimizationPage | undefined,\n properties: OptimizationPage\n): void {\n if (!explicitPage) return;\n\n const conflictingKeys = PAGE_CONTEXT_CONFLICT_KEYS.filter((key) => {\n const { [key]: explicitValue } = explicitPage;\n const { [key]: propertyValue } = properties;\n return JSON.stringify(explicitValue) !== JSON.stringify(propertyValue);\n });\n\n if (conflictingKeys.length === 0) return;\n\n eventBuilderLogger.warn(\n `Explicit page context differs from page event properties for: ${conflictingKeys.join(', ')}`\n );\n}\n\nexport const DEFAULT_PAGE_PROPERTIES: OptimizationPage = {\n path: '',\n query: {},\n referrer: '',\n search: '',\n title: '',\n url: '',\n};\n\nclass EventBuilder {\n app?: OptimizationApp;\n channel: OptimizationChannel;\n library: OptimizationLibrary;\n getLocale: () => string | undefined;\n getPageProperties: () => OptimizationPage;\n getUserAgent: () => string | undefined;\n getConsent: () => boolean | undefined;\n\n constructor(config: EventBuilderConfig) {\n const { app, channel, library, getLocale, getPageProperties, getUserAgent, getConsent } =\n config;\n this.app = app;\n this.channel = channel;\n this.library = library;\n this.getLocale = getLocale ?? (() => 'en-US');\n this.getPageProperties = getPageProperties ?? (() => DEFAULT_PAGE_PROPERTIES);\n this.getUserAgent = getUserAgent ?? (() => undefined);\n this.getConsent = getConsent ?? (() => undefined);\n }\n\n protected buildUniversalEventProperties({\n campaign,\n locale,\n location,\n page,\n screen,\n userAgent,\n }: UniversalEventBuilderArgs): OptimizationUniversalEventProperties {\n const timestamp = new Date().toISOString();\n const resolvedPage = page ?? this.getPageProperties();\n\n return {\n channel: this.channel,\n context: {\n app: this.app,\n campaign: campaign ?? extractCampaignFromUrl(resolvedPage.url) ?? {},\n gdpr: { isConsentGiven: this.getConsent() === true },\n library: this.library,\n locale: locale ?? this.getLocale() ?? 'en-US',\n location,\n page: resolvedPage,\n screen,\n userAgent: userAgent ?? this.getUserAgent(),\n },\n messageId: crypto.randomUUID(),\n originalTimestamp: timestamp,\n sentAt: timestamp,\n timestamp,\n };\n }\n\n private buildInteractionBase(\n args: InteractionBuilderArgsBase\n ): OptimizationUniversalEventProperties & InteractionBuilderArgsBase {\n const { campaign, locale, location, page, screen, userAgent, ...interactionProperties } = args;\n\n return {\n ...this.buildUniversalEventProperties({\n campaign,\n locale,\n location,\n page,\n screen,\n userAgent,\n }),\n ...interactionProperties,\n };\n }\n\n buildView(args: ViewBuilderArgs): OptimizationExoViewEvent {\n const { viewId, viewDurationMs, ...interaction } = parseOptimizationSchema(\n ViewBuilderArgs,\n args\n );\n\n return {\n ...this.buildInteractionBase(interaction),\n type: 'exo_node_view',\n viewId,\n viewDurationMs,\n };\n }\n\n buildClick(args: ClickBuilderArgs): OptimizationExoClickEvent {\n const interaction = parseOptimizationSchema(ClickBuilderArgs, args);\n\n return {\n ...this.buildInteractionBase(interaction),\n type: 'exo_node_click',\n };\n }\n\n buildHover(args: HoverBuilderArgs): OptimizationExoHoverEvent {\n const { hoverId, hoverDurationMs, ...interaction } = parseOptimizationSchema(\n HoverBuilderArgs,\n args\n );\n\n return {\n ...this.buildInteractionBase(interaction),\n type: 'exo_node_hover',\n hoverId,\n hoverDurationMs,\n };\n }\n\n buildFlagView(args: FlagViewBuilderArgs): OptimizationViewEvent {\n const { componentId, experienceId, variantIndex, viewId, viewDurationMs, ...universal } =\n parseOptimizationSchema(FlagViewBuilderArgs, args);\n\n return {\n ...this.buildUniversalEventProperties(universal),\n ...(viewDurationMs === undefined ? {} : { viewDurationMs }),\n ...(viewId === undefined ? {} : { viewId }),\n type: 'component',\n componentType: 'Variable',\n componentId,\n experienceId,\n variantIndex: variantIndex ?? 0,\n };\n }\n\n buildIdentify(args: IdentifyBuilderArgs): OptimizationIdentifyEvent {\n const {\n traits = {},\n userId,\n ...universal\n } = parseOptimizationSchema(IdentifyBuilderArgs, args);\n\n return {\n ...this.buildUniversalEventProperties(universal),\n type: 'identify',\n traits,\n userId,\n };\n }\n\n buildPageView(args: PageViewBuilderArgs = {}): OptimizationPageViewEvent {\n const { properties = {}, ...universal } = parseOptimizationSchema(PageViewBuilderArgs, args);\n const propertiesCampaign = extractCampaignFromUrl(properties.url);\n const pageProperties = this.getPageProperties();\n const merged = merge(\n {\n ...pageProperties,\n title: pageProperties.title ?? DEFAULT_PAGE_PROPERTIES.title,\n },\n properties\n );\n\n warnIfPageContextConflicts(universal.page, merged);\n\n const {\n context: { screen: _, ...universalContext },\n ...universalProperties\n } = this.buildUniversalEventProperties({\n ...universal,\n campaign: universal.campaign ?? propertiesCampaign,\n page: universal.page ?? merged,\n });\n\n const context = parseOptimizationSchema(OptimizationPageEventContext, universalContext);\n\n return {\n ...universalProperties,\n context,\n type: 'page',\n properties: merged,\n };\n }\n\n buildTrack(args: TrackBuilderArgs): OptimizationTrackEvent {\n const {\n event,\n properties = {},\n ...universal\n } = parseOptimizationSchema(TrackBuilderArgs, args);\n\n return {\n ...this.buildUniversalEventProperties(universal),\n type: 'track',\n event,\n properties,\n };\n }\n}\n\nexport default EventBuilder;\n"],"mappings":"AAEA;AAAA,EAEE,YAAY;AAAA,EAGZ,iBAAiB;AAAA,EAGjB,eAAe;AAAA,EAGf,QAAQ;AAAA,EACR,oBAAoB;AAAA,EAEpB,0BAA0B;AAAA,EAC1B,cAAc;AAAA,EACd,UAAU;AAAA,EAEV,UAAU;AAAA,OAGL;AACP,SAAS,sBAAsB,sCAAsC;AACrE,SAAS,aAAa;AACtB,YAAY,OAAO;AAEnB,MAAM,qBAAqB,+BAA+B,0BAA0B;AAEpF,MAAM,0BAA0B;AAAA,EAC9B,CAAC,gBAAgB,MAAM;AAAA,EACvB,CAAC,cAAc,QAAQ;AAAA,EACvB,CAAC,cAAc,QAAQ;AAAA,EACvB,CAAC,YAAY,MAAM;AAAA,EACnB,CAAC,eAAe,SAAS;AAC3B;AAEA,SAAS,uBAAuB,KAA2D;AACzF,MAAI,QAAQ,OAAW,QAAO;AAE9B,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,IAAI,GAAG;AACpC,UAAM,WAAiC,CAAC;AACxC,QAAI,uBAAuB;AAE3B,eAAW,CAAC,WAAW,QAAQ,KAAK,yBAAyB;AAC3D,UAAI,CAAC,aAAa,IAAI,SAAS,EAAG;AAElC,eAAS,QAAQ,IAAI,aAAa,IAAI,SAAS,KAAK;AACpD,6BAAuB;AAAA,IACzB;AAEA,WAAO,uBAAuB,WAAW;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYO,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,UAAU,EAAE,SAAS,oBAAoB;AAAA,EACzC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC7B,UAAU,EAAE,SAAS,uBAAuB;AAAA,EAC5C,MAAM,EAAE,SAAS,gBAAgB;AAAA,EACjC,QAAQ,EAAE,SAAS,kBAAkB;AAAA,EACrC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;AAClC,CAAC;AAIM,MAAM,6BAA6B,EAAE,OAAO,2BAA2B;AAAA,EAC5E,UAAU,EAAE,OAAO;AAAA,EACnB,YAAY;AAAA,EACZ,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACnC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAAA,EACxC,gBAAgB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACrC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;AAAA,EACrD,oBAAoB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACzC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAChC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AACrC,CAAC;AAIM,MAAM,kBAAkB,EAAE,OAAO,4BAA4B;AAAA,EAClE,QAAQ,EAAE,OAAO;AAAA,EACjB,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAIM,MAAM,mBAAmB;AAIzB,MAAM,mBAAmB,EAAE,OAAO,4BAA4B;AAAA,EACnE,SAAS,EAAE,OAAO;AAAA,EAClB,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAID,MAAM,iCAAiC,EAAE,OAAO,2BAA2B;AAAA,EACzE,aAAa,EAAE,OAAO;AAAA,EACtB,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACnC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AACrC,CAAC;AAEM,MAAM,sBAAsB,EAAE,OAAO,gCAAgC;AAAA,EAC1E,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC7B,gBAAgB,EAAE,SAAS,EAAE,OAAO,CAAC;AACvC,CAAC;AAIM,MAAM,sBAAsB,EAAE,OAAO,2BAA2B;AAAA,EACrE,QAAQ,EAAE,SAAS,kBAAkB;AAAA,EACrC,QAAQ,EAAE,OAAO;AACnB,CAAC;AAIM,MAAM,sBAAsB,EAAE,OAAO,2BAA2B;AAAA,EACrE,YAAY,EAAE,SAAS,EAAE,QAAQ,gBAAgB,CAAC;AACpD,CAAC;AAIM,MAAM,mBAAmB,EAAE,OAAO,2BAA2B;AAAA,EAClE,OAAO,EAAE,OAAO;AAAA,EAChB,YAAY,EAAE,SAAS,EAAE,SAAS,wBAAwB,CAAC,CAAC,CAAC;AAC/D,CAAC;AAID,MAAM,6BAA6B,CAAC,QAAQ,SAAS,UAAU,KAAK;AAEpE,SAAS,2BACP,cACA,YACM;AACN,MAAI,CAAC,aAAc;AAEnB,QAAM,kBAAkB,2BAA2B,OAAO,CAAC,QAAQ;AACjE,UAAM,EAAE,CAAC,GAAG,GAAG,cAAc,IAAI;AACjC,UAAM,EAAE,CAAC,GAAG,GAAG,cAAc,IAAI;AACjC,WAAO,KAAK,UAAU,aAAa,MAAM,KAAK,UAAU,aAAa;AAAA,EACvE,CAAC;AAED,MAAI,gBAAgB,WAAW,EAAG;AAElC,qBAAmB;AAAA,IACjB,iEAAiE,gBAAgB,KAAK,IAAI,CAAC;AAAA,EAC7F;AACF;AAEO,MAAM,0BAA4C;AAAA,EACvD,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AACP;AAEA,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAA4B;AACtC,UAAM,EAAE,KAAK,SAAS,SAAS,WAAW,mBAAmB,cAAc,WAAW,IACpF;AACF,SAAK,MAAM;AACX,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,YAAY,cAAc,MAAM;AACrC,SAAK,oBAAoB,sBAAsB,MAAM;AACrD,SAAK,eAAe,iBAAiB,MAAM;AAC3C,SAAK,aAAa,eAAe,MAAM;AAAA,EACzC;AAAA,EAEU,8BAA8B;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAoE;AAClE,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAM,eAAe,QAAQ,KAAK,kBAAkB;AAEpD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,QACP,KAAK,KAAK;AAAA,QACV,UAAU,YAAY,uBAAuB,aAAa,GAAG,KAAK,CAAC;AAAA,QACnE,MAAM,EAAE,gBAAgB,KAAK,WAAW,MAAM,KAAK;AAAA,QACnD,SAAS,KAAK;AAAA,QACd,QAAQ,UAAU,KAAK,UAAU,KAAK;AAAA,QACtC;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,WAAW,aAAa,KAAK,aAAa;AAAA,MAC5C;AAAA,MACA,WAAW,OAAO,WAAW;AAAA,MAC7B,mBAAmB;AAAA,MACnB,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBACN,MACmE;AACnE,UAAM,EAAE,UAAU,QAAQ,UAAU,MAAM,QAAQ,WAAW,GAAG,sBAAsB,IAAI;AAE1F,WAAO;AAAA,MACL,GAAG,KAAK,8BAA8B;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,UAAU,MAAiD;AACzD,UAAM,EAAE,QAAQ,gBAAgB,GAAG,YAAY,IAAI;AAAA,MACjD;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG,KAAK,qBAAqB,WAAW;AAAA,MACxC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,MAAmD;AAC5D,UAAM,cAAc,wBAAwB,kBAAkB,IAAI;AAElE,WAAO;AAAA,MACL,GAAG,KAAK,qBAAqB,WAAW;AAAA,MACxC,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,WAAW,MAAmD;AAC5D,UAAM,EAAE,SAAS,iBAAiB,GAAG,YAAY,IAAI;AAAA,MACnD;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG,KAAK,qBAAqB,WAAW;AAAA,MACxC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,MAAkD;AAC9D,UAAM,EAAE,aAAa,cAAc,cAAc,QAAQ,gBAAgB,GAAG,UAAU,IACpF,wBAAwB,qBAAqB,IAAI;AAEnD,WAAO;AAAA,MACL,GAAG,KAAK,8BAA8B,SAAS;AAAA,MAC/C,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,MACzD,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MACzC,MAAM;AAAA,MACN,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA,cAAc,gBAAgB;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,cAAc,MAAsD;AAClE,UAAM;AAAA,MACJ,SAAS,CAAC;AAAA,MACV;AAAA,MACA,GAAG;AAAA,IACL,IAAI,wBAAwB,qBAAqB,IAAI;AAErD,WAAO;AAAA,MACL,GAAG,KAAK,8BAA8B,SAAS;AAAA,MAC/C,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,OAA4B,CAAC,GAA8B;AACvE,UAAM,EAAE,aAAa,CAAC,GAAG,GAAG,UAAU,IAAI,wBAAwB,qBAAqB,IAAI;AAC3F,UAAM,qBAAqB,uBAAuB,WAAW,GAAG;AAChE,UAAM,iBAAiB,KAAK,kBAAkB;AAC9C,UAAM,SAAS;AAAA,MACb;AAAA,QACE,GAAG;AAAA,QACH,OAAO,eAAe,SAAS,wBAAwB;AAAA,MACzD;AAAA,MACA;AAAA,IACF;AAEA,+BAA2B,UAAU,MAAM,MAAM;AAEjD,UAAM;AAAA,MACJ,SAAS,EAAE,QAAQ,GAAG,GAAG,iBAAiB;AAAA,MAC1C,GAAG;AAAA,IACL,IAAI,KAAK,8BAA8B;AAAA,MACrC,GAAG;AAAA,MACH,UAAU,UAAU,YAAY;AAAA,MAChC,MAAM,UAAU,QAAQ;AAAA,IAC1B,CAAC;AAED,UAAM,UAAU,wBAAwB,8BAA8B,gBAAgB;AAEtF,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,MAAM;AAAA,MACN,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA,WAAW,MAAgD;AACzD,UAAM;AAAA,MACJ;AAAA,MACA,aAAa,CAAC;AAAA,MACd,GAAG;AAAA,IACL,IAAI,wBAAwB,kBAAkB,IAAI;AAElD,WAAO;AAAA,MACL,GAAG,KAAK,8BAA8B,SAAS;AAAA,MAC/C,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,wBAAQ;","names":[]}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { ExperienceEvent, InsightsEvent } from '@contentful/optimization-api-client/api-schemas';
|
|
2
|
-
|
|
3
|
-
declare const RUNTIME_EVENT_HANDOFF_VERSION: 1;
|
|
4
|
-
/** Server-only delivery choice. Browser runtimes always commit received handoffs. */
|
|
5
|
-
type RuntimeServerEventDelivery = 'commit' | 'handoff';
|
|
6
|
-
type RuntimeEventHandoffEvent = {
|
|
7
|
-
readonly transport: 'personalization';
|
|
8
|
-
readonly event: ExperienceEvent;
|
|
9
|
-
} | {
|
|
10
|
-
readonly transport: 'analytics';
|
|
11
|
-
readonly event: InsightsEvent;
|
|
12
|
-
};
|
|
13
|
-
/** Plain JSON passed from one Node request to its paired Web runtime. */
|
|
14
|
-
interface RuntimeEventHandoff {
|
|
15
|
-
readonly version: typeof RUNTIME_EVENT_HANDOFF_VERSION;
|
|
16
|
-
readonly spaceId: string;
|
|
17
|
-
readonly environmentId: string;
|
|
18
|
-
/** Profile known before any preflight event was evaluated. */
|
|
19
|
-
readonly initialProfileId?: string;
|
|
20
|
-
readonly events: readonly RuntimeEventHandoffEvent[];
|
|
21
|
-
/** App-defined route identity for a successfully staged initial page event. */
|
|
22
|
-
readonly initialPageRouteKey?: string;
|
|
23
|
-
}
|
|
24
|
-
/** Returned only after the complete Web replay succeeds. */
|
|
25
|
-
interface RuntimeEventHandoffReceipt {
|
|
26
|
-
readonly initialPageRouteKey?: string;
|
|
27
|
-
}
|
|
28
|
-
/** Enforces the private response payload cap without parsing trusted Node data. */
|
|
29
|
-
declare function assertRuntimeEventHandoffSize(input: unknown): void;
|
|
30
|
-
/** Validates an untrusted serialized handoff before Web starts any transport. */
|
|
31
|
-
declare function parseRuntimeEventHandoff(input: unknown): RuntimeEventHandoff;
|
|
32
|
-
|
|
33
|
-
export { RUNTIME_EVENT_HANDOFF_VERSION, type RuntimeEventHandoff, type RuntimeEventHandoffEvent, type RuntimeEventHandoffReceipt, type RuntimeServerEventDelivery, assertRuntimeEventHandoffSize, parseRuntimeEventHandoff };
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ExperienceEvent as PersonalizationEventSchema,
|
|
3
|
-
InsightsEvent as AnalyticsEventSchema,
|
|
4
|
-
parseWithFriendlyError as parseOptimizationSchema
|
|
5
|
-
} from "@contentful/optimization-api-client/api-schemas";
|
|
6
|
-
import * as z from "zod/mini";
|
|
7
|
-
const RUNTIME_EVENT_HANDOFF_VERSION = 1;
|
|
8
|
-
const RUNTIME_EVENT_HANDOFF_MAX_BYTES = 64 * 1024;
|
|
9
|
-
const encoder = new globalThis.TextEncoder();
|
|
10
|
-
const RuntimeEventHandoffSchema = z.object({
|
|
11
|
-
version: z.literal(RUNTIME_EVENT_HANDOFF_VERSION),
|
|
12
|
-
spaceId: z.string(),
|
|
13
|
-
environmentId: z.string(),
|
|
14
|
-
initialProfileId: z.optional(z.string()),
|
|
15
|
-
events: z.array(
|
|
16
|
-
z.discriminatedUnion("transport", [
|
|
17
|
-
z.object({
|
|
18
|
-
transport: z.literal("personalization"),
|
|
19
|
-
event: PersonalizationEventSchema
|
|
20
|
-
}),
|
|
21
|
-
z.object({
|
|
22
|
-
transport: z.literal("analytics"),
|
|
23
|
-
event: AnalyticsEventSchema
|
|
24
|
-
})
|
|
25
|
-
])
|
|
26
|
-
),
|
|
27
|
-
initialPageRouteKey: z.optional(z.string())
|
|
28
|
-
});
|
|
29
|
-
function assertRuntimeEventHandoffSize(input) {
|
|
30
|
-
let serialized;
|
|
31
|
-
try {
|
|
32
|
-
serialized = JSON.stringify(input);
|
|
33
|
-
} catch (error) {
|
|
34
|
-
throw new TypeError("Runtime event handoff must be JSON serializable", { cause: error });
|
|
35
|
-
}
|
|
36
|
-
if (serialized === void 0) throw new TypeError("Runtime event handoff is not serializable");
|
|
37
|
-
if (encoder.encode(serialized).byteLength > RUNTIME_EVENT_HANDOFF_MAX_BYTES) {
|
|
38
|
-
throw new TypeError(
|
|
39
|
-
`Runtime event handoff exceeds ${RUNTIME_EVENT_HANDOFF_MAX_BYTES} serialized bytes`
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function parseRuntimeEventHandoff(input) {
|
|
44
|
-
assertRuntimeEventHandoffSize(input);
|
|
45
|
-
const handoff = parseOptimizationSchema(RuntimeEventHandoffSchema, input);
|
|
46
|
-
if (handoff.initialPageRouteKey !== void 0 && !handoff.events.some(
|
|
47
|
-
(entry) => entry.transport === "personalization" && entry.event.type === "page"
|
|
48
|
-
)) {
|
|
49
|
-
throw new TypeError("Runtime event handoff initial page requires a staged page event");
|
|
50
|
-
}
|
|
51
|
-
let hasProfile = handoff.initialProfileId !== void 0;
|
|
52
|
-
for (const entry of handoff.events) {
|
|
53
|
-
if (entry.transport === "personalization") {
|
|
54
|
-
hasProfile = true;
|
|
55
|
-
} else if (!hasProfile) {
|
|
56
|
-
throw new TypeError(
|
|
57
|
-
"Runtime event handoff Analytics events require an initial or preceding Personalization profile"
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return handoff;
|
|
62
|
-
}
|
|
63
|
-
export {
|
|
64
|
-
RUNTIME_EVENT_HANDOFF_VERSION,
|
|
65
|
-
assertRuntimeEventHandoffSize,
|
|
66
|
-
parseRuntimeEventHandoff
|
|
67
|
-
};
|
|
68
|
-
//# sourceMappingURL=runtime-event-handoff.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime-event-handoff.ts"],"sourcesContent":["import {\n ExperienceEvent as PersonalizationEventSchema,\n InsightsEvent as AnalyticsEventSchema,\n parseWithFriendlyError as parseOptimizationSchema,\n type ExperienceEvent as PersonalizationEvent,\n type InsightsEvent as AnalyticsEvent,\n} from '@contentful/optimization-api-client/api-schemas';\nimport * as z from 'zod/mini';\n\nexport const RUNTIME_EVENT_HANDOFF_VERSION = 1 as const;\n\nconst RUNTIME_EVENT_HANDOFF_MAX_BYTES = 64 * 1024;\nconst encoder = new globalThis.TextEncoder();\nconst RuntimeEventHandoffSchema = z.object({\n version: z.literal(RUNTIME_EVENT_HANDOFF_VERSION),\n spaceId: z.string(),\n environmentId: z.string(),\n initialProfileId: z.optional(z.string()),\n events: z.array(\n z.discriminatedUnion('transport', [\n z.object({\n transport: z.literal('personalization'),\n event: PersonalizationEventSchema,\n }),\n z.object({\n transport: z.literal('analytics'),\n event: AnalyticsEventSchema,\n }),\n ])\n ),\n initialPageRouteKey: z.optional(z.string()),\n});\n\n/** Server-only delivery choice. Browser runtimes always commit received handoffs. */\nexport type RuntimeServerEventDelivery = 'commit' | 'handoff';\n\nexport type RuntimeEventHandoffEvent =\n | { readonly transport: 'personalization'; readonly event: PersonalizationEvent }\n | { readonly transport: 'analytics'; readonly event: AnalyticsEvent };\n\n/** Plain JSON passed from one Node request to its paired Web runtime. */\nexport interface RuntimeEventHandoff {\n readonly version: typeof RUNTIME_EVENT_HANDOFF_VERSION;\n readonly spaceId: string;\n readonly environmentId: string;\n /** Profile known before any preflight event was evaluated. */\n readonly initialProfileId?: string;\n readonly events: readonly RuntimeEventHandoffEvent[];\n /** App-defined route identity for a successfully staged initial page event. */\n readonly initialPageRouteKey?: string;\n}\n\n/** Returned only after the complete Web replay succeeds. */\nexport interface RuntimeEventHandoffReceipt {\n readonly initialPageRouteKey?: string;\n}\n\n/** Enforces the private response payload cap without parsing trusted Node data. */\nexport function assertRuntimeEventHandoffSize(input: unknown): void {\n let serialized: string | undefined;\n try {\n serialized = JSON.stringify(input);\n } catch (error) {\n throw new TypeError('Runtime event handoff must be JSON serializable', { cause: error });\n }\n if (serialized === undefined) throw new TypeError('Runtime event handoff is not serializable');\n if (encoder.encode(serialized).byteLength > RUNTIME_EVENT_HANDOFF_MAX_BYTES) {\n throw new TypeError(\n `Runtime event handoff exceeds ${RUNTIME_EVENT_HANDOFF_MAX_BYTES} serialized bytes`\n );\n }\n}\n\n/** Validates an untrusted serialized handoff before Web starts any transport. */\nexport function parseRuntimeEventHandoff(input: unknown): RuntimeEventHandoff {\n assertRuntimeEventHandoffSize(input);\n const handoff = parseOptimizationSchema(RuntimeEventHandoffSchema, input);\n\n if (\n handoff.initialPageRouteKey !== undefined &&\n !handoff.events.some(\n (entry) => entry.transport === 'personalization' && entry.event.type === 'page'\n )\n ) {\n throw new TypeError('Runtime event handoff initial page requires a staged page event');\n }\n\n let hasProfile = handoff.initialProfileId !== undefined;\n for (const entry of handoff.events) {\n if (entry.transport === 'personalization') {\n hasProfile = true;\n } else if (!hasProfile) {\n throw new TypeError(\n 'Runtime event handoff Analytics events require an initial or preceding Personalization profile'\n );\n }\n }\n\n return handoff;\n}\n"],"mappings":"AAAA;AAAA,EACE,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,0BAA0B;AAAA,OAGrB;AACP,YAAY,OAAO;AAEZ,MAAM,gCAAgC;AAE7C,MAAM,kCAAkC,KAAK;AAC7C,MAAM,UAAU,IAAI,WAAW,YAAY;AAC3C,MAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,SAAS,EAAE,QAAQ,6BAA6B;AAAA,EAChD,SAAS,EAAE,OAAO;AAAA,EAClB,eAAe,EAAE,OAAO;AAAA,EACxB,kBAAkB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACvC,QAAQ,EAAE;AAAA,IACR,EAAE,mBAAmB,aAAa;AAAA,MAChC,EAAE,OAAO;AAAA,QACP,WAAW,EAAE,QAAQ,iBAAiB;AAAA,QACtC,OAAO;AAAA,MACT,CAAC;AAAA,MACD,EAAE,OAAO;AAAA,QACP,WAAW,EAAE,QAAQ,WAAW;AAAA,QAChC,OAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA,qBAAqB,EAAE,SAAS,EAAE,OAAO,CAAC;AAC5C,CAAC;AA2BM,SAAS,8BAA8B,OAAsB;AAClE,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,UAAU,KAAK;AAAA,EACnC,SAAS,OAAO;AACd,UAAM,IAAI,UAAU,mDAAmD,EAAE,OAAO,MAAM,CAAC;AAAA,EACzF;AACA,MAAI,eAAe,OAAW,OAAM,IAAI,UAAU,2CAA2C;AAC7F,MAAI,QAAQ,OAAO,UAAU,EAAE,aAAa,iCAAiC;AAC3E,UAAM,IAAI;AAAA,MACR,iCAAiC,+BAA+B;AAAA,IAClE;AAAA,EACF;AACF;AAGO,SAAS,yBAAyB,OAAqC;AAC5E,gCAA8B,KAAK;AACnC,QAAM,UAAU,wBAAwB,2BAA2B,KAAK;AAExE,MACE,QAAQ,wBAAwB,UAChC,CAAC,QAAQ,OAAO;AAAA,IACd,CAAC,UAAU,MAAM,cAAc,qBAAqB,MAAM,MAAM,SAAS;AAAA,EAC3E,GACA;AACA,UAAM,IAAI,UAAU,iEAAiE;AAAA,EACvF;AAEA,MAAI,aAAa,QAAQ,qBAAqB;AAC9C,aAAW,SAAS,QAAQ,QAAQ;AAClC,QAAI,MAAM,cAAc,mBAAmB;AACzC,mBAAa;AAAA,IACf,WAAW,CAAC,YAAY;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { ExperienceApiClient, InsightsApiClient } from '@contentful/optimization-api-client';
|
|
2
|
-
import { PartialProfile, ExperienceEvent, OptimizationData, InsightsEvent } from '@contentful/optimization-api-client/api-schemas';
|
|
3
|
-
export { OptimizationData as EventOptimizationData, PartialProfile as EventProfile, PartialProfile as EventProfileSchema } from '@contentful/optimization-api-client/api-schemas';
|
|
4
|
-
import EventBuilder, { UniversalEventBuilderArgs, IdentifyBuilderArgs, PageViewBuilderArgs, TrackBuilderArgs, ViewBuilderArgs, ClickBuilderArgs, HoverBuilderArgs, FlagViewBuilderArgs } from './event-builder.js';
|
|
5
|
-
import 'zod/mini';
|
|
6
|
-
|
|
7
|
-
type PersonalizationEventMethod = 'identify' | 'page' | 'track';
|
|
8
|
-
type AnalyticsEventMethod = 'trackView' | 'trackClick' | 'trackHover' | 'trackFlagView';
|
|
9
|
-
/** The Optimization API surface used by the shared runtime. */
|
|
10
|
-
interface RuntimeOptimizationApiClient {
|
|
11
|
-
readonly personalization: Pick<ExperienceApiClient, 'upsertProfile'>;
|
|
12
|
-
readonly analytics: Pick<InsightsApiClient, 'sendBatchEvents'>;
|
|
13
|
-
}
|
|
14
|
-
/** Internal strategy used by a runtime to commit or stage built events. */
|
|
15
|
-
interface RuntimeEventDispatch {
|
|
16
|
-
personalization(event: ExperienceEvent, profile: PartialProfile | undefined): Promise<OptimizationData>;
|
|
17
|
-
analytics(event: InsightsEvent, profile: PartialProfile): Promise<boolean>;
|
|
18
|
-
}
|
|
19
|
-
/** Runtime-owned state and context used to bind otherwise stateless event methods. */
|
|
20
|
-
interface RuntimeEventBindings {
|
|
21
|
-
getProfile: () => PartialProfile | undefined;
|
|
22
|
-
setProfile: (profile: PartialProfile) => void;
|
|
23
|
-
/** Changes when an external session boundary must invalidate an in-flight profile response. */
|
|
24
|
-
getProfileRevision?: () => number;
|
|
25
|
-
getEventContext?: () => UniversalEventBuilderArgs;
|
|
26
|
-
getConsent?: () => boolean | undefined;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Event-triggering surface shared by the public Node and Web runtimes.
|
|
30
|
-
* Profile-producing calls are not serialized; await them before another
|
|
31
|
-
* profile-producing or Analytics call on the same bound runtime. In Node
|
|
32
|
-
* handoff mode an Analytics `true` means accepted into the handoff journal,
|
|
33
|
-
* not delivered to the Analytics transport.
|
|
34
|
-
*/
|
|
35
|
-
interface RuntimeEventMethods {
|
|
36
|
-
readonly profile: PartialProfile | undefined;
|
|
37
|
-
identify(args: IdentifyBuilderArgs): Promise<OptimizationData>;
|
|
38
|
-
page(args?: PageViewBuilderArgs): Promise<OptimizationData>;
|
|
39
|
-
track(args: TrackBuilderArgs): Promise<OptimizationData>;
|
|
40
|
-
trackView(args: ViewBuilderArgs): Promise<boolean>;
|
|
41
|
-
trackClick(args: ClickBuilderArgs): Promise<boolean>;
|
|
42
|
-
trackHover(args: HoverBuilderArgs): Promise<boolean>;
|
|
43
|
-
trackFlagView(args: FlagViewBuilderArgs): Promise<boolean>;
|
|
44
|
-
}
|
|
45
|
-
/** Thrown when an Analytics event is triggered before a profile is available. */
|
|
46
|
-
declare class EventProfileRequiredError extends Error {
|
|
47
|
-
readonly method: AnalyticsEventMethod;
|
|
48
|
-
constructor(method: AnalyticsEventMethod);
|
|
49
|
-
}
|
|
50
|
-
declare function createRuntimeEventMethods(api: RuntimeOptimizationApiClient, eventBuilder: EventBuilder, bindings: RuntimeEventBindings, dispatch?: RuntimeEventDispatch): RuntimeEventMethods;
|
|
51
|
-
|
|
52
|
-
export { type AnalyticsEventMethod, EventProfileRequiredError, type PersonalizationEventMethod, type RuntimeEventBindings, type RuntimeEventDispatch, type RuntimeEventMethods, type RuntimeOptimizationApiClient, createRuntimeEventMethods };
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PartialProfile as EventProfileSchema
|
|
3
|
-
} from "@contentful/optimization-api-client/api-schemas";
|
|
4
|
-
class EventProfileRequiredError extends Error {
|
|
5
|
-
method;
|
|
6
|
-
constructor(method) {
|
|
7
|
-
super(
|
|
8
|
-
`${method}() requires a current event profile. Supply an initial profile or await identify(), page(), or track() first.`
|
|
9
|
-
);
|
|
10
|
-
this.name = "EventProfileRequiredError";
|
|
11
|
-
this.method = method;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
class BoundRuntimeEventMethods {
|
|
15
|
-
constructor(eventBuilder, bindings, dispatch) {
|
|
16
|
-
this.eventBuilder = eventBuilder;
|
|
17
|
-
this.bindings = bindings;
|
|
18
|
-
this.dispatch = dispatch;
|
|
19
|
-
}
|
|
20
|
-
eventBuilder;
|
|
21
|
-
bindings;
|
|
22
|
-
dispatch;
|
|
23
|
-
get profile() {
|
|
24
|
-
return this.bindings.getProfile();
|
|
25
|
-
}
|
|
26
|
-
async identify(args) {
|
|
27
|
-
return this.sendPersonalizationEvent(
|
|
28
|
-
this.eventBuilder.buildIdentify(this.withEventContext(args))
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
async page(args = {}) {
|
|
32
|
-
return this.sendPersonalizationEvent(
|
|
33
|
-
this.eventBuilder.buildPageView(this.withEventContext(args))
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
async track(args) {
|
|
37
|
-
return this.sendPersonalizationEvent(this.eventBuilder.buildTrack(this.withEventContext(args)));
|
|
38
|
-
}
|
|
39
|
-
async trackView(args) {
|
|
40
|
-
return this.sendAnalyticsEvent(
|
|
41
|
-
"trackView",
|
|
42
|
-
this.eventBuilder.buildView(this.withEventContext(args))
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
async trackClick(args) {
|
|
46
|
-
return this.sendAnalyticsEvent(
|
|
47
|
-
"trackClick",
|
|
48
|
-
this.eventBuilder.buildClick(this.withEventContext(args))
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
async trackHover(args) {
|
|
52
|
-
return this.sendAnalyticsEvent(
|
|
53
|
-
"trackHover",
|
|
54
|
-
this.eventBuilder.buildHover(this.withEventContext(args))
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
async trackFlagView(args) {
|
|
58
|
-
return this.sendAnalyticsEvent(
|
|
59
|
-
"trackFlagView",
|
|
60
|
-
this.eventBuilder.buildFlagView(this.withEventContext(args))
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
withEventContext(args) {
|
|
64
|
-
return { ...this.bindings.getEventContext?.(), ...args };
|
|
65
|
-
}
|
|
66
|
-
withConsent(event) {
|
|
67
|
-
const consent = this.bindings.getConsent?.();
|
|
68
|
-
if (consent === void 0) return event;
|
|
69
|
-
return {
|
|
70
|
-
...event,
|
|
71
|
-
context: {
|
|
72
|
-
...event.context,
|
|
73
|
-
gdpr: { ...event.context.gdpr, isConsentGiven: consent }
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
async sendPersonalizationEvent(event) {
|
|
78
|
-
const eventWithConsent = this.withConsent(event);
|
|
79
|
-
const profileRevision = this.bindings.getProfileRevision?.();
|
|
80
|
-
const data = await this.dispatch.personalization(eventWithConsent, this.profile);
|
|
81
|
-
if (profileRevision === void 0 || this.bindings.getProfileRevision?.() === profileRevision) {
|
|
82
|
-
this.bindings.setProfile(data.profile);
|
|
83
|
-
}
|
|
84
|
-
return data;
|
|
85
|
-
}
|
|
86
|
-
async sendAnalyticsEvent(method, event) {
|
|
87
|
-
const profile = this.profile;
|
|
88
|
-
if (profile === void 0) throw new EventProfileRequiredError(method);
|
|
89
|
-
return this.dispatch.analytics(this.withConsent(event), profile);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function createDirectEventDispatch(api) {
|
|
93
|
-
return {
|
|
94
|
-
personalization: (event, profile) => api.personalization.upsertProfile(
|
|
95
|
-
{ profileId: profile?.id, events: [event] },
|
|
96
|
-
{ locale: event.context.locale }
|
|
97
|
-
),
|
|
98
|
-
analytics: (event, profile) => api.analytics.sendBatchEvents([{ profile, events: [event] }])
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
function createRuntimeEventMethods(api, eventBuilder, bindings, dispatch = createDirectEventDispatch(api)) {
|
|
102
|
-
return new BoundRuntimeEventMethods(eventBuilder, bindings, dispatch);
|
|
103
|
-
}
|
|
104
|
-
export {
|
|
105
|
-
EventProfileRequiredError,
|
|
106
|
-
EventProfileSchema,
|
|
107
|
-
createRuntimeEventMethods
|
|
108
|
-
};
|
|
109
|
-
//# sourceMappingURL=runtime-event-methods.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime-event-methods.ts"],"sourcesContent":["import type {\n ExperienceApiClient as PersonalizationApiClient,\n InsightsApiClient as AnalyticsApiClient,\n} from '@contentful/optimization-api-client';\nimport {\n PartialProfile as EventProfileSchema,\n type ExperienceEvent as PersonalizationEvent,\n type InsightsEvent as AnalyticsEvent,\n type OptimizationData as EventOptimizationData,\n type PartialProfile as EventProfile,\n} from '@contentful/optimization-api-client/api-schemas';\nimport type EventBuilder from './event-builder.js';\nimport type {\n ClickBuilderArgs,\n FlagViewBuilderArgs,\n HoverBuilderArgs,\n IdentifyBuilderArgs,\n PageViewBuilderArgs,\n TrackBuilderArgs,\n UniversalEventBuilderArgs,\n ViewBuilderArgs,\n} from './event-builder.js';\n\n/** Runtime schema for profiles retained by public runtime leaves. */\nexport { EventProfileSchema };\nexport type { EventOptimizationData, EventProfile };\n\nexport type PersonalizationEventMethod = 'identify' | 'page' | 'track';\nexport type AnalyticsEventMethod = 'trackView' | 'trackClick' | 'trackHover' | 'trackFlagView';\n\n/** The Optimization API surface used by the shared runtime. */\nexport interface RuntimeOptimizationApiClient {\n readonly personalization: Pick<PersonalizationApiClient, 'upsertProfile'>;\n readonly analytics: Pick<AnalyticsApiClient, 'sendBatchEvents'>;\n}\n\n/** Internal strategy used by a runtime to commit or stage built events. */\nexport interface RuntimeEventDispatch {\n personalization(\n event: PersonalizationEvent,\n profile: EventProfile | undefined\n ): Promise<EventOptimizationData>;\n analytics(event: AnalyticsEvent, profile: EventProfile): Promise<boolean>;\n}\n\n/** Runtime-owned state and context used to bind otherwise stateless event methods. */\nexport interface RuntimeEventBindings {\n getProfile: () => EventProfile | undefined;\n setProfile: (profile: EventProfile) => void;\n /** Changes when an external session boundary must invalidate an in-flight profile response. */\n getProfileRevision?: () => number;\n getEventContext?: () => UniversalEventBuilderArgs;\n getConsent?: () => boolean | undefined;\n}\n\n/**\n * Event-triggering surface shared by the public Node and Web runtimes.\n * Profile-producing calls are not serialized; await them before another\n * profile-producing or Analytics call on the same bound runtime. In Node\n * handoff mode an Analytics `true` means accepted into the handoff journal,\n * not delivered to the Analytics transport.\n */\nexport interface RuntimeEventMethods {\n readonly profile: EventProfile | undefined;\n identify(args: IdentifyBuilderArgs): Promise<EventOptimizationData>;\n page(args?: PageViewBuilderArgs): Promise<EventOptimizationData>;\n track(args: TrackBuilderArgs): Promise<EventOptimizationData>;\n trackView(args: ViewBuilderArgs): Promise<boolean>;\n trackClick(args: ClickBuilderArgs): Promise<boolean>;\n trackHover(args: HoverBuilderArgs): Promise<boolean>;\n trackFlagView(args: FlagViewBuilderArgs): Promise<boolean>;\n}\n\n/** Thrown when an Analytics event is triggered before a profile is available. */\nexport class EventProfileRequiredError extends Error {\n readonly method: AnalyticsEventMethod;\n\n constructor(method: AnalyticsEventMethod) {\n super(\n `${method}() requires a current event profile. Supply an initial profile or await identify(), page(), or track() first.`\n );\n this.name = 'EventProfileRequiredError';\n this.method = method;\n }\n}\n\nclass BoundRuntimeEventMethods implements RuntimeEventMethods {\n constructor(\n private readonly eventBuilder: EventBuilder,\n private readonly bindings: RuntimeEventBindings,\n private readonly dispatch: RuntimeEventDispatch\n ) {}\n\n get profile(): EventProfile | undefined {\n return this.bindings.getProfile();\n }\n\n async identify(args: IdentifyBuilderArgs): Promise<EventOptimizationData> {\n return this.sendPersonalizationEvent(\n this.eventBuilder.buildIdentify(this.withEventContext(args))\n );\n }\n\n async page(args: PageViewBuilderArgs = {}): Promise<EventOptimizationData> {\n return this.sendPersonalizationEvent(\n this.eventBuilder.buildPageView(this.withEventContext(args))\n );\n }\n\n async track(args: TrackBuilderArgs): Promise<EventOptimizationData> {\n return this.sendPersonalizationEvent(this.eventBuilder.buildTrack(this.withEventContext(args)));\n }\n\n async trackView(args: ViewBuilderArgs): Promise<boolean> {\n return this.sendAnalyticsEvent(\n 'trackView',\n this.eventBuilder.buildView(this.withEventContext(args))\n );\n }\n\n async trackClick(args: ClickBuilderArgs): Promise<boolean> {\n return this.sendAnalyticsEvent(\n 'trackClick',\n this.eventBuilder.buildClick(this.withEventContext(args))\n );\n }\n\n async trackHover(args: HoverBuilderArgs): Promise<boolean> {\n return this.sendAnalyticsEvent(\n 'trackHover',\n this.eventBuilder.buildHover(this.withEventContext(args))\n );\n }\n\n async trackFlagView(args: FlagViewBuilderArgs): Promise<boolean> {\n return this.sendAnalyticsEvent(\n 'trackFlagView',\n this.eventBuilder.buildFlagView(this.withEventContext(args))\n );\n }\n\n private withEventContext<TArgs extends UniversalEventBuilderArgs>(args: TArgs): TArgs {\n return { ...this.bindings.getEventContext?.(), ...args } as TArgs;\n }\n\n private withConsent<TEvent extends PersonalizationEvent | AnalyticsEvent>(event: TEvent): TEvent {\n const consent = this.bindings.getConsent?.();\n if (consent === undefined) return event;\n\n return {\n ...event,\n context: {\n ...event.context,\n gdpr: { ...event.context.gdpr, isConsentGiven: consent },\n },\n } as TEvent;\n }\n\n private async sendPersonalizationEvent(\n event: PersonalizationEvent\n ): Promise<EventOptimizationData> {\n const eventWithConsent = this.withConsent(event);\n const profileRevision = this.bindings.getProfileRevision?.();\n const data = await this.dispatch.personalization(eventWithConsent, this.profile);\n if (profileRevision === undefined || this.bindings.getProfileRevision?.() === profileRevision) {\n this.bindings.setProfile(data.profile);\n }\n return data;\n }\n\n private async sendAnalyticsEvent(\n method: AnalyticsEventMethod,\n event: AnalyticsEvent\n ): Promise<boolean> {\n const profile = this.profile;\n if (profile === undefined) throw new EventProfileRequiredError(method);\n return this.dispatch.analytics(this.withConsent(event), profile);\n }\n}\n\nfunction createDirectEventDispatch(api: RuntimeOptimizationApiClient): RuntimeEventDispatch {\n return {\n personalization: (event, profile) =>\n api.personalization.upsertProfile(\n { profileId: profile?.id, events: [event] },\n { locale: event.context.locale }\n ),\n analytics: (event, profile) => api.analytics.sendBatchEvents([{ profile, events: [event] }]),\n };\n}\n\nexport function createRuntimeEventMethods(\n api: RuntimeOptimizationApiClient,\n eventBuilder: EventBuilder,\n bindings: RuntimeEventBindings,\n dispatch: RuntimeEventDispatch = createDirectEventDispatch(api)\n): RuntimeEventMethods {\n return new BoundRuntimeEventMethods(eventBuilder, bindings, dispatch);\n}\n"],"mappings":"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","names":[]}
|
package/dist/sdk-info.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default library metadata attached to the context of built Events.
|
|
3
|
-
*
|
|
4
|
-
* Build artifacts receive their package metadata through tsup defines. Source
|
|
5
|
-
* execution (including tests) uses stable fallback values instead.
|
|
6
|
-
*/
|
|
7
|
-
declare const DEFAULT_EVENT_CONTEXT_LIBRARY: {
|
|
8
|
-
name: string;
|
|
9
|
-
version: string;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export { DEFAULT_EVENT_CONTEXT_LIBRARY };
|
package/dist/sdk-info.js
DELETED
package/dist/sdk-info.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk-info.ts"],"sourcesContent":["declare const __DEFAULT_EVENT_CONTEXT_LIBRARY_NAME__: string | undefined;\ndeclare const __DEFAULT_EVENT_CONTEXT_LIBRARY_VERSION__: string | undefined;\n\n/**\n * Default library metadata attached to the context of built Events.\n *\n * Build artifacts receive their package metadata through tsup defines. Source\n * execution (including tests) uses stable fallback values instead.\n */\nexport const DEFAULT_EVENT_CONTEXT_LIBRARY = {\n name:\n typeof __DEFAULT_EVENT_CONTEXT_LIBRARY_NAME__ === 'string'\n ? __DEFAULT_EVENT_CONTEXT_LIBRARY_NAME__\n : '@contentful/experiences-client',\n version:\n typeof __DEFAULT_EVENT_CONTEXT_LIBRARY_VERSION__ === 'string'\n ? __DEFAULT_EVENT_CONTEXT_LIBRARY_VERSION__\n : '0.0.0',\n};\n"],"mappings":"AASO,MAAM,gCAAgC;AAAA,EAC3C,MACE,OACI,mCACA;AAAA,EACN,SACE,OACI,UACA;AACR;","names":[]}
|