@adv-re/segment-wrapper 4.36.0-beta.0
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/README.md +240 -0
- package/dist/index.d.mts +916 -0
- package/dist/index.d.ts +916 -0
- package/dist/index.js +1145 -0
- package/dist/index.mjs +1085 -0
- package/package.json +61 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,1085 @@
|
|
|
1
|
+
// src/config.ts
|
|
2
|
+
var MPI_CONFIG_KEY = "__mpi";
|
|
3
|
+
var isClient = typeof window !== "undefined";
|
|
4
|
+
var getWindowWithMPI = () => {
|
|
5
|
+
return isClient ? window : void 0;
|
|
6
|
+
};
|
|
7
|
+
function getConfig(key) {
|
|
8
|
+
const win = getWindowWithMPI();
|
|
9
|
+
const config = win?.[MPI_CONFIG_KEY]?.segmentWrapper || {};
|
|
10
|
+
return key ? config[key] : config;
|
|
11
|
+
}
|
|
12
|
+
var setConfig = (key, value) => {
|
|
13
|
+
const win = getWindowWithMPI();
|
|
14
|
+
if (!win) {
|
|
15
|
+
console.warn("[segment-wrapper] Cannot set config in non-browser environment");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
win[MPI_CONFIG_KEY] = win[MPI_CONFIG_KEY] || {};
|
|
19
|
+
win[MPI_CONFIG_KEY].segmentWrapper = win[MPI_CONFIG_KEY].segmentWrapper || {};
|
|
20
|
+
win[MPI_CONFIG_KEY].segmentWrapper[key] = value;
|
|
21
|
+
};
|
|
22
|
+
var initConfig = (config) => {
|
|
23
|
+
const win = getWindowWithMPI();
|
|
24
|
+
if (!win) {
|
|
25
|
+
console.warn("[segment-wrapper] Cannot initialize config in non-browser environment");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
win[MPI_CONFIG_KEY] = win[MPI_CONFIG_KEY] || {};
|
|
29
|
+
win[MPI_CONFIG_KEY].segmentWrapper = {
|
|
30
|
+
...win[MPI_CONFIG_KEY].segmentWrapper,
|
|
31
|
+
...config
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
var clearConfig = () => {
|
|
35
|
+
const win = getWindowWithMPI();
|
|
36
|
+
if (!win || !win[MPI_CONFIG_KEY]) return;
|
|
37
|
+
win[MPI_CONFIG_KEY].segmentWrapper = {};
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// src/repositories/adobeRepository.ts
|
|
41
|
+
var mcvid;
|
|
42
|
+
var getGlobalConfig = () => {
|
|
43
|
+
return {
|
|
44
|
+
ADOBE_ORG_ID: window.__SEGMENT_WRAPPER?.ADOBE_ORG_ID,
|
|
45
|
+
DEFAULT_DEMDEX_VERSION: window.__SEGMENT_WRAPPER?.DEFAULT_DEMDEX_VERSION ?? "3.3.0",
|
|
46
|
+
TIME_BETWEEN_RETRIES: window.__SEGMENT_WRAPPER?.TIME_BETWEEN_RETRIES ?? 15,
|
|
47
|
+
TIMES_TO_RETRY: window.__SEGMENT_WRAPPER?.TIMES_TO_RETRY ?? 80,
|
|
48
|
+
SERVERS: {
|
|
49
|
+
trackingServer: window.__SEGMENT_WRAPPER?.TRACKING_SERVER,
|
|
50
|
+
trackingServerSecure: window.__SEGMENT_WRAPPER?.TRACKING_SERVER
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
var getDemdex = () => {
|
|
55
|
+
const config = getGlobalConfig();
|
|
56
|
+
if (window.Visitor && config.ADOBE_ORG_ID) {
|
|
57
|
+
return window.Visitor.getInstance(config.ADOBE_ORG_ID, config.SERVERS);
|
|
58
|
+
}
|
|
59
|
+
return void 0;
|
|
60
|
+
};
|
|
61
|
+
var getMarketingCloudVisitorID = (demdex) => {
|
|
62
|
+
const mcvid2 = demdex?.getMarketingCloudVisitorID();
|
|
63
|
+
return mcvid2;
|
|
64
|
+
};
|
|
65
|
+
var getAdobeVisitorData = () => {
|
|
66
|
+
const demdex = getDemdex();
|
|
67
|
+
const config = getGlobalConfig();
|
|
68
|
+
const version = demdex?.version ?? config.DEFAULT_DEMDEX_VERSION;
|
|
69
|
+
const { trackingServer } = config.SERVERS;
|
|
70
|
+
return Promise.resolve({ trackingServer, version });
|
|
71
|
+
};
|
|
72
|
+
var getAdobeMarketingCloudVisitorIdFromWindow = () => {
|
|
73
|
+
if (mcvid) return Promise.resolve(mcvid);
|
|
74
|
+
const config = getGlobalConfig();
|
|
75
|
+
return new Promise((resolve) => {
|
|
76
|
+
function retry(retries) {
|
|
77
|
+
if (retries === 0) return resolve("");
|
|
78
|
+
const demdex = getDemdex();
|
|
79
|
+
mcvid = getMarketingCloudVisitorID(demdex);
|
|
80
|
+
if (mcvid) {
|
|
81
|
+
resolve(mcvid);
|
|
82
|
+
} else {
|
|
83
|
+
window.setTimeout(() => retry(--retries), config.TIME_BETWEEN_RETRIES);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
retry(config.TIMES_TO_RETRY);
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
var importVisitorApiAndGetAdobeMCVisitorID = async () => {
|
|
90
|
+
return getAdobeMarketingCloudVisitorIdFromWindow();
|
|
91
|
+
};
|
|
92
|
+
var getAdobeMCVisitorID = async () => {
|
|
93
|
+
const getCustomAdobeVisitorId = getConfig("getCustomAdobeVisitorId");
|
|
94
|
+
if (typeof getCustomAdobeVisitorId === "function") {
|
|
95
|
+
return getCustomAdobeVisitorId();
|
|
96
|
+
}
|
|
97
|
+
return getConfig("importAdobeVisitorId") === true ? importVisitorApiAndGetAdobeMCVisitorID() : getAdobeMarketingCloudVisitorIdFromWindow();
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// src/events.ts
|
|
101
|
+
var EVENTS = {
|
|
102
|
+
GA4_INIT_EVENT_SENT: "ga4InitEventSent"
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// src/middlewares/source/pageReferrer.ts
|
|
106
|
+
var referrerState = {
|
|
107
|
+
spaReferrer: "",
|
|
108
|
+
referrer: ""
|
|
109
|
+
};
|
|
110
|
+
var utils = {
|
|
111
|
+
/**
|
|
112
|
+
* @returns The referrer of the document
|
|
113
|
+
*/
|
|
114
|
+
getDocumentReferrer: () => document.referrer,
|
|
115
|
+
/**
|
|
116
|
+
* @returns The actual location with protocol, domain and pathname
|
|
117
|
+
*/
|
|
118
|
+
getActualLocation: () => {
|
|
119
|
+
const { origin, pathname } = window.location;
|
|
120
|
+
return `${origin}${pathname}`;
|
|
121
|
+
},
|
|
122
|
+
/**
|
|
123
|
+
* @returns The actual query string
|
|
124
|
+
*/
|
|
125
|
+
getActualQueryString: () => {
|
|
126
|
+
const { search } = window.location;
|
|
127
|
+
return search;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
var getPageReferrer = ({ isPageTrack = false } = {}) => {
|
|
131
|
+
const { referrer, spaReferrer } = referrerState;
|
|
132
|
+
const referrerToUse = isPageTrack ? referrer : spaReferrer;
|
|
133
|
+
return referrerToUse || utils.getDocumentReferrer();
|
|
134
|
+
};
|
|
135
|
+
var updatePageReferrer = () => {
|
|
136
|
+
referrerState.spaReferrer = getPageReferrer({ isPageTrack: true });
|
|
137
|
+
referrerState.referrer = utils.getActualLocation();
|
|
138
|
+
};
|
|
139
|
+
var pageReferrer = ({ payload, next }) => {
|
|
140
|
+
const {
|
|
141
|
+
obj: { context }
|
|
142
|
+
} = payload;
|
|
143
|
+
const { isPageTrack } = context;
|
|
144
|
+
const referrer = getPageReferrer({ isPageTrack });
|
|
145
|
+
payload.obj.context = {
|
|
146
|
+
...context,
|
|
147
|
+
page: {
|
|
148
|
+
...context.page,
|
|
149
|
+
referrer
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
if (isPageTrack) {
|
|
153
|
+
updatePageReferrer();
|
|
154
|
+
}
|
|
155
|
+
next(payload);
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// src/repositories/googleRepository.ts
|
|
159
|
+
var FIELDS = {
|
|
160
|
+
clientId: "client_id",
|
|
161
|
+
sessionId: "session_id"
|
|
162
|
+
};
|
|
163
|
+
var DEFAULT_DATA_LAYER_NAME = "dataLayer";
|
|
164
|
+
var CONSENT_STATES = {
|
|
165
|
+
granted: "granted",
|
|
166
|
+
denied: "denied"
|
|
167
|
+
};
|
|
168
|
+
var CONSENT_STATE_GRANTED_VALUE = 1;
|
|
169
|
+
var CONSENT_STATE_DENIED_VALUE = 2;
|
|
170
|
+
var STC = {
|
|
171
|
+
QUERY: "stc",
|
|
172
|
+
SPLIT_SYMBOL: "-",
|
|
173
|
+
CAMPAIGN_SPLIT_SYMBOL: ":"
|
|
174
|
+
};
|
|
175
|
+
var UTM_CAMPAIGN = "utm_campaign";
|
|
176
|
+
var UTM_MEDIUM = "utm_medium";
|
|
177
|
+
var UTM_SOURCE = "utm_source";
|
|
178
|
+
var UTM_CONTENT = "utm_content";
|
|
179
|
+
var UTM_CAMPAIGN_ID = "utm_id";
|
|
180
|
+
var UTM_TERM = "utm_term";
|
|
181
|
+
var STC_MEDIUM_TRANSFORMATIONS = {
|
|
182
|
+
aff: "affiliate",
|
|
183
|
+
dis: "display",
|
|
184
|
+
em: "email",
|
|
185
|
+
met: "paid-metasearch",
|
|
186
|
+
sem: "paid-search",
|
|
187
|
+
rt: "display",
|
|
188
|
+
sm: "social-media",
|
|
189
|
+
sp: "paid-social",
|
|
190
|
+
pn: "push-notification",
|
|
191
|
+
cs: "cross-sites"
|
|
192
|
+
};
|
|
193
|
+
var STC_INVALID_CONTENT = "na";
|
|
194
|
+
var DEFAULT_GA_INIT_EVENT = "sui";
|
|
195
|
+
var EMPTY_STC = { medium: null, source: null, campaign: null };
|
|
196
|
+
var loadScript = async (src) => new Promise(function(resolve, reject) {
|
|
197
|
+
const script = document.createElement("script");
|
|
198
|
+
script.src = src;
|
|
199
|
+
script.onload = () => resolve();
|
|
200
|
+
script.onerror = reject;
|
|
201
|
+
document.head.appendChild(script);
|
|
202
|
+
});
|
|
203
|
+
var loadGoogleAnalytics = async () => {
|
|
204
|
+
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
205
|
+
const dataLayerName = getConfig("googleAnalyticsDataLayer") || DEFAULT_DATA_LAYER_NAME;
|
|
206
|
+
if (!googleAnalyticsMeasurementId) return Promise.resolve(false);
|
|
207
|
+
const gtagScript = `https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsMeasurementId}&l=${dataLayerName}`;
|
|
208
|
+
return loadScript(gtagScript).then(() => true);
|
|
209
|
+
};
|
|
210
|
+
var triggerGoogleAnalyticsInitEvent = (sessionId) => {
|
|
211
|
+
const eventName = getConfig("googleAnalyticsInitEvent") ?? DEFAULT_GA_INIT_EVENT;
|
|
212
|
+
const eventPrefix = `ga_event_${eventName}_`;
|
|
213
|
+
const eventKey = `${eventPrefix}${sessionId}`;
|
|
214
|
+
if (typeof window.gtag === "undefined") return;
|
|
215
|
+
if (!localStorage.getItem(eventKey)) {
|
|
216
|
+
window.gtag("event", eventName);
|
|
217
|
+
console.log(`Sending GA4 event "${eventName}" for the session "${sessionId}"`);
|
|
218
|
+
localStorage.setItem(eventKey, "true");
|
|
219
|
+
if (typeof window.dispatchEvent === "function") {
|
|
220
|
+
const event = new CustomEvent(EVENTS.GA4_INIT_EVENT_SENT, {
|
|
221
|
+
detail: { eventName, sessionId }
|
|
222
|
+
});
|
|
223
|
+
window.dispatchEvent(event);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
Object.keys(localStorage).forEach((key) => {
|
|
227
|
+
if (key.startsWith(eventPrefix) && key !== eventKey) {
|
|
228
|
+
localStorage.removeItem(key);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
};
|
|
232
|
+
var getGoogleField = async (field) => {
|
|
233
|
+
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
234
|
+
if (!googleAnalyticsMeasurementId) return Promise.resolve(void 0);
|
|
235
|
+
return new Promise((resolve) => {
|
|
236
|
+
window.gtag?.("get", googleAnalyticsMeasurementId, field, resolve);
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
var trackingTagsTypes = {
|
|
240
|
+
STC: "stc",
|
|
241
|
+
UTM: "utm"
|
|
242
|
+
};
|
|
243
|
+
var getCampaignDetails = ({ needsTransformation = true } = {}) => {
|
|
244
|
+
const { medium, source, campaign, content, term } = readQueryParams();
|
|
245
|
+
if (!medium || !source || !campaign) return null;
|
|
246
|
+
const [id, name] = campaign.split(STC.CAMPAIGN_SPLIT_SYMBOL);
|
|
247
|
+
if (!id && !name) return null;
|
|
248
|
+
const needsContent = typeof content !== "undefined" && content !== STC_INVALID_CONTENT;
|
|
249
|
+
return {
|
|
250
|
+
campaign: {
|
|
251
|
+
medium: needsTransformation && STC_MEDIUM_TRANSFORMATIONS[medium] || medium,
|
|
252
|
+
...typeof name !== "undefined" && { id },
|
|
253
|
+
name: name ?? id,
|
|
254
|
+
source,
|
|
255
|
+
...needsContent && { content },
|
|
256
|
+
...typeof term !== "undefined" && { term }
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
function readQueryParams() {
|
|
261
|
+
const search = utils.getActualQueryString();
|
|
262
|
+
const searchParams = new URLSearchParams(search);
|
|
263
|
+
return getConfig("trackingTagsType") === trackingTagsTypes.UTM ? readFromUtm(searchParams) : readFromStc(searchParams);
|
|
264
|
+
}
|
|
265
|
+
function readFromStc(searchParams) {
|
|
266
|
+
if (!hasStc(searchParams)) return EMPTY_STC;
|
|
267
|
+
const stc = searchParams.get(STC.QUERY);
|
|
268
|
+
const [medium, source, campaign, content, term] = stc?.split(STC.SPLIT_SYMBOL) || [];
|
|
269
|
+
return { medium, source, campaign, content, term };
|
|
270
|
+
}
|
|
271
|
+
function hasStc(searchParams) {
|
|
272
|
+
return searchParams.has(STC.QUERY);
|
|
273
|
+
}
|
|
274
|
+
function readFromUtm(searchParams) {
|
|
275
|
+
const campaignId = searchParams.get(UTM_CAMPAIGN_ID);
|
|
276
|
+
const campaignName = searchParams.get(UTM_CAMPAIGN);
|
|
277
|
+
const medium = searchParams.get(UTM_MEDIUM);
|
|
278
|
+
const source = searchParams.get(UTM_SOURCE);
|
|
279
|
+
const content = searchParams.get(UTM_CONTENT);
|
|
280
|
+
const term = searchParams.get(UTM_TERM);
|
|
281
|
+
const campaign = campaignId ? `${campaignId}${STC.CAMPAIGN_SPLIT_SYMBOL}${campaignName}` : campaignName;
|
|
282
|
+
const missingAnyMandatoryFields = !medium || !source || !campaign;
|
|
283
|
+
if (missingAnyMandatoryFields && hasStc(searchParams)) {
|
|
284
|
+
return readFromStc(searchParams);
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
campaign,
|
|
288
|
+
medium,
|
|
289
|
+
source,
|
|
290
|
+
content: content ?? void 0,
|
|
291
|
+
term: term ?? void 0
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
var getGoogleClientId = async () => getGoogleField(FIELDS.clientId);
|
|
295
|
+
var getGoogleSessionId = async () => {
|
|
296
|
+
const sessionId = await getGoogleField(FIELDS.sessionId);
|
|
297
|
+
if (sessionId) {
|
|
298
|
+
triggerGoogleAnalyticsInitEvent(sessionId);
|
|
299
|
+
}
|
|
300
|
+
return sessionId;
|
|
301
|
+
};
|
|
302
|
+
function getGoogleConsentValue(consentType = "analytics_storage") {
|
|
303
|
+
try {
|
|
304
|
+
const value = window.google_tag_data?.ics?.getConsentState?.(consentType);
|
|
305
|
+
if (value === CONSENT_STATE_GRANTED_VALUE) return CONSENT_STATES.granted;
|
|
306
|
+
if (value === CONSENT_STATE_DENIED_VALUE) return CONSENT_STATES.denied;
|
|
307
|
+
return void 0;
|
|
308
|
+
} catch {
|
|
309
|
+
return void 0;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
var getConsentState = () => getGoogleConsentValue() ?? CONSENT_STATES.denied;
|
|
313
|
+
var setGoogleUserId = (userId) => {
|
|
314
|
+
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
315
|
+
if (!googleAnalyticsMeasurementId || !userId) return;
|
|
316
|
+
window.gtag?.("set", "user_id", userId);
|
|
317
|
+
};
|
|
318
|
+
var sendGoogleConsents = (mode = "default", consents) => {
|
|
319
|
+
window.gtag?.(
|
|
320
|
+
"consent",
|
|
321
|
+
mode,
|
|
322
|
+
consents || {
|
|
323
|
+
analytics_storage: CONSENT_STATES.denied,
|
|
324
|
+
ad_user_data: CONSENT_STATES.denied,
|
|
325
|
+
ad_personalization: CONSENT_STATES.denied,
|
|
326
|
+
ad_storage: CONSENT_STATES.denied
|
|
327
|
+
}
|
|
328
|
+
);
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
// src/tcf.ts
|
|
332
|
+
var TCF_COOKIE_KEY = "borosTcf";
|
|
333
|
+
var TCF_API_VERSION = 2;
|
|
334
|
+
var TCF_TRACK_PROPERTIES = {
|
|
335
|
+
channel: "GDPR"
|
|
336
|
+
};
|
|
337
|
+
var NEEDED_PURPOSES = {
|
|
338
|
+
analytics: [1, 8, 10],
|
|
339
|
+
advertising: [3]
|
|
340
|
+
};
|
|
341
|
+
var TCF_EVENTS = {
|
|
342
|
+
/** Event that determines that the tcData has been loaded */
|
|
343
|
+
LOADED: "tcloaded",
|
|
344
|
+
/** Event that determines that the user has performed an action */
|
|
345
|
+
USER_ACTION_COMPLETE: "useractioncomplete"
|
|
346
|
+
};
|
|
347
|
+
var CMP_TRACK_EVENT = "CMP Submitted";
|
|
348
|
+
var USER_GDPR = {
|
|
349
|
+
ACCEPTED: "accepted",
|
|
350
|
+
DECLINED: "declined",
|
|
351
|
+
UNKNOWN: "unknown"
|
|
352
|
+
};
|
|
353
|
+
var gdprState = {
|
|
354
|
+
listeners: [],
|
|
355
|
+
value: void 0,
|
|
356
|
+
addListener: (callback) => gdprState.listeners.push(callback),
|
|
357
|
+
get: () => gdprState.value,
|
|
358
|
+
set: (value) => {
|
|
359
|
+
const { analytics, advertising } = value || {};
|
|
360
|
+
gdprState.value = {
|
|
361
|
+
analytics,
|
|
362
|
+
advertising
|
|
363
|
+
};
|
|
364
|
+
gdprState.listeners.forEach((fn) => fn(value));
|
|
365
|
+
gdprState.listeners = [];
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
function readCookie(key) {
|
|
369
|
+
if (!isClient) return null;
|
|
370
|
+
const re = new RegExp(key + "=([^;]+)");
|
|
371
|
+
const value = re.exec(document.cookie);
|
|
372
|
+
return value !== null ? unescape(value[1]) : null;
|
|
373
|
+
}
|
|
374
|
+
var checkTcfIsAvailable = () => {
|
|
375
|
+
if (getConfig("initialized")) return false;
|
|
376
|
+
const isTcfApiAvailable = !!window.__tcfapi;
|
|
377
|
+
if (!isTcfApiAvailable) {
|
|
378
|
+
console.warn("[tcfTracking] window.__tcfapi is not available on client and TCF won't be tracked.");
|
|
379
|
+
}
|
|
380
|
+
return isTcfApiAvailable;
|
|
381
|
+
};
|
|
382
|
+
var checkHasUserConsentedAnalytics = (userConsents) => NEEDED_PURPOSES.analytics.every((purposeId) => userConsents[`${purposeId}`]);
|
|
383
|
+
var checkHasUserConsentedAdvertising = (userConsents) => NEEDED_PURPOSES.advertising.every((purposeId) => userConsents[`${purposeId}`]);
|
|
384
|
+
var trackTcf = ({ gdprPrivacy }) => segmentWrapper_default.track(
|
|
385
|
+
CMP_TRACK_EVENT,
|
|
386
|
+
{
|
|
387
|
+
...TCF_TRACK_PROPERTIES,
|
|
388
|
+
...getConfig("tcfTrackDefaultProperties") || {}
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
gdpr_privacy: gdprPrivacy.analytics,
|
|
392
|
+
gdpr_privacy_advertising: gdprPrivacy.advertising
|
|
393
|
+
}
|
|
394
|
+
);
|
|
395
|
+
var getGdprPrivacyValue = () => {
|
|
396
|
+
const gdprPrivacyValue = gdprState.get();
|
|
397
|
+
if (gdprPrivacyValue !== void 0) return Promise.resolve(gdprPrivacyValue);
|
|
398
|
+
return new Promise((resolve) => {
|
|
399
|
+
gdprState.addListener((gdprPrivacyValue2) => resolve(gdprPrivacyValue2));
|
|
400
|
+
});
|
|
401
|
+
};
|
|
402
|
+
var checkAnalyticsGdprIsAccepted = (gdprPrivacyValue) => {
|
|
403
|
+
return gdprPrivacyValue?.analytics === USER_GDPR.ACCEPTED;
|
|
404
|
+
};
|
|
405
|
+
var setGdprStateBy = (purposeConsents) => {
|
|
406
|
+
const hasAnalyticsConsents = checkHasUserConsentedAnalytics(purposeConsents);
|
|
407
|
+
const hasAdvertisingConsents = checkHasUserConsentedAdvertising(purposeConsents);
|
|
408
|
+
const gdprAnalyticsStateKey = hasAnalyticsConsents ? USER_GDPR.ACCEPTED : USER_GDPR.DECLINED;
|
|
409
|
+
const gdprAdvertisingStateKey = hasAdvertisingConsents ? USER_GDPR.ACCEPTED : USER_GDPR.DECLINED;
|
|
410
|
+
gdprState.set({
|
|
411
|
+
analytics: gdprAnalyticsStateKey,
|
|
412
|
+
advertising: gdprAdvertisingStateKey
|
|
413
|
+
});
|
|
414
|
+
return {
|
|
415
|
+
analytics: gdprAnalyticsStateKey,
|
|
416
|
+
advertising: gdprAdvertisingStateKey
|
|
417
|
+
};
|
|
418
|
+
};
|
|
419
|
+
var getConsentsFromCookie = () => {
|
|
420
|
+
const cookieValue = readCookie(TCF_COOKIE_KEY);
|
|
421
|
+
if (!cookieValue) return;
|
|
422
|
+
try {
|
|
423
|
+
const { purpose } = JSON.parse(window.atob(cookieValue));
|
|
424
|
+
const { consents } = purpose;
|
|
425
|
+
return consents;
|
|
426
|
+
} catch (e) {
|
|
427
|
+
console.error(e);
|
|
428
|
+
return void 0;
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
var initializeGdprState = () => {
|
|
432
|
+
const consents = getConsentsFromCookie();
|
|
433
|
+
if (consents) setGdprStateBy(consents);
|
|
434
|
+
};
|
|
435
|
+
var initializeIsFirstVisit = () => {
|
|
436
|
+
const consents = getConsentsFromCookie();
|
|
437
|
+
setConfig("isFirstVisit", !consents);
|
|
438
|
+
};
|
|
439
|
+
function initTcfTracking() {
|
|
440
|
+
if (!isClient) return;
|
|
441
|
+
initializeGdprState();
|
|
442
|
+
initializeIsFirstVisit();
|
|
443
|
+
if (!checkTcfIsAvailable()) {
|
|
444
|
+
const analyticsGdprState = gdprState.get()?.analytics;
|
|
445
|
+
if (analyticsGdprState === void 0)
|
|
446
|
+
gdprState.set({
|
|
447
|
+
analytics: USER_GDPR.UNKNOWN,
|
|
448
|
+
advertising: USER_GDPR.UNKNOWN
|
|
449
|
+
});
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
setConfig("initialized", true);
|
|
453
|
+
window.__tcfapi?.("addEventListener", TCF_API_VERSION, ({ eventStatus, purpose }, success) => {
|
|
454
|
+
if (!success) return Promise.resolve();
|
|
455
|
+
if (eventStatus === TCF_EVENTS.USER_ACTION_COMPLETE || eventStatus === TCF_EVENTS.LOADED) {
|
|
456
|
+
const { consents } = purpose;
|
|
457
|
+
const gdprStateKey = setGdprStateBy(consents);
|
|
458
|
+
if (eventStatus === TCF_EVENTS.USER_ACTION_COMPLETE) {
|
|
459
|
+
const { analytics: analyticsStateKey, advertising: advertisingStateKey } = gdprStateKey;
|
|
460
|
+
const gdprPrivacy = {
|
|
461
|
+
analytics: analyticsStateKey,
|
|
462
|
+
advertising: advertisingStateKey
|
|
463
|
+
};
|
|
464
|
+
const MIGRATION_DIDOMI_SEGMENT_WRAPPER_FLAG = "didomi-migration";
|
|
465
|
+
const isDidomiMigration = isClient && window.sessionStorage.getItem(MIGRATION_DIDOMI_SEGMENT_WRAPPER_FLAG);
|
|
466
|
+
return !isDidomiMigration && trackTcf({
|
|
467
|
+
gdprPrivacy
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// src/utils/cookies.ts
|
|
475
|
+
var ONE_YEAR = 31536e3;
|
|
476
|
+
var DEFAULT_PATH = "/";
|
|
477
|
+
var DEFAULT_SAME_SITE = "Lax";
|
|
478
|
+
function readCookie2(cookieName) {
|
|
479
|
+
if (typeof document === "undefined") return null;
|
|
480
|
+
const re = new RegExp(`${cookieName}=([^;]+)`);
|
|
481
|
+
const value = re.exec(document.cookie);
|
|
482
|
+
return value !== null ? unescape(value[1]) : null;
|
|
483
|
+
}
|
|
484
|
+
function saveCookie(cookieName, data, options = {}) {
|
|
485
|
+
if (typeof document === "undefined" || typeof window === "undefined") return;
|
|
486
|
+
const { maxAge = ONE_YEAR, path = DEFAULT_PATH, reduceDomain = true, sameSite = DEFAULT_SAME_SITE } = options;
|
|
487
|
+
const domain = reduceDomain ? toCookieDomain() : window.location.hostname;
|
|
488
|
+
const cookieValue = [
|
|
489
|
+
`${cookieName}=${data}`,
|
|
490
|
+
`domain=${domain}`,
|
|
491
|
+
`path=${path}`,
|
|
492
|
+
`max-age=${maxAge}`,
|
|
493
|
+
`SameSite=${sameSite}`
|
|
494
|
+
].join(";");
|
|
495
|
+
document.cookie = cookieValue;
|
|
496
|
+
}
|
|
497
|
+
function removeCookie(cookieName, options = {}) {
|
|
498
|
+
if (typeof document === "undefined" || typeof window === "undefined") return;
|
|
499
|
+
const { path = DEFAULT_PATH, reduceDomain = true } = options;
|
|
500
|
+
const domain = reduceDomain ? toCookieDomain() : window.location.hostname;
|
|
501
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path}; domain=${domain}`;
|
|
502
|
+
}
|
|
503
|
+
var toCookieDomain = (domain) => {
|
|
504
|
+
const hostname = domain !== void 0 ? domain : typeof window !== "undefined" ? window.location.hostname : "";
|
|
505
|
+
const DOT = ".";
|
|
506
|
+
const hostDomainParts = hostname.split(DOT).reverse();
|
|
507
|
+
if (hostDomainParts.length === 1) {
|
|
508
|
+
return hostDomainParts[0];
|
|
509
|
+
}
|
|
510
|
+
const cookieDomainParts = [];
|
|
511
|
+
for (const part of hostDomainParts) {
|
|
512
|
+
cookieDomainParts.push(part);
|
|
513
|
+
if (part.length > 3) break;
|
|
514
|
+
}
|
|
515
|
+
return `${DOT}${cookieDomainParts.reverse().join(DOT)}`;
|
|
516
|
+
};
|
|
517
|
+
|
|
518
|
+
// src/repositories/xandrRepository.ts
|
|
519
|
+
var XANDR_ID_SERVER_URL = "https://secure.adnxs.com/getuidj?consent=1";
|
|
520
|
+
var XANDR_ID_COOKIE = "adit-xandr-id";
|
|
521
|
+
var USER_OPTED_OUT_XANDR_ID_VALUE = 0;
|
|
522
|
+
function getRemoteXandrId() {
|
|
523
|
+
if (!isClient) return Promise.resolve(null);
|
|
524
|
+
return window.fetch(XANDR_ID_SERVER_URL, {
|
|
525
|
+
credentials: "include"
|
|
526
|
+
}).then((response) => response.json()).then((json) => json?.uid).catch(() => null);
|
|
527
|
+
}
|
|
528
|
+
function getXandrId({ gdprPrivacyValueAdvertising }) {
|
|
529
|
+
if (!isClient) return null;
|
|
530
|
+
if (gdprPrivacyValueAdvertising !== USER_GDPR.ACCEPTED) {
|
|
531
|
+
removeCookie(XANDR_ID_COOKIE);
|
|
532
|
+
return null;
|
|
533
|
+
}
|
|
534
|
+
const checkValid = (xandrId) => xandrId !== null && Number(xandrId) > USER_OPTED_OUT_XANDR_ID_VALUE;
|
|
535
|
+
const storedXandrId = readCookie2(XANDR_ID_COOKIE);
|
|
536
|
+
const isValidXandrId = checkValid(storedXandrId);
|
|
537
|
+
if (!isValidXandrId) {
|
|
538
|
+
getRemoteXandrId().then((xandrId) => {
|
|
539
|
+
if (typeof xandrId === "string") {
|
|
540
|
+
saveCookie(XANDR_ID_COOKIE, xandrId);
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
setConfig("xandrId", storedXandrId);
|
|
545
|
+
return isValidXandrId ? storedXandrId : null;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// src/segmentWrapper.ts
|
|
549
|
+
var DEFAULT_PROPERTIES = { platform: "web" };
|
|
550
|
+
var INTEGRATIONS_WHEN_NO_CONSENTS = {
|
|
551
|
+
All: false
|
|
552
|
+
};
|
|
553
|
+
var INTEGRATIONS_WHEN_NO_CONSENTS_CMP_SUBMITTED = {
|
|
554
|
+
All: true
|
|
555
|
+
};
|
|
556
|
+
var getUserId = (userId) => {
|
|
557
|
+
const prefix = getConfig("userIdPrefix");
|
|
558
|
+
if (!prefix) {
|
|
559
|
+
return userId;
|
|
560
|
+
}
|
|
561
|
+
if (typeof userId === "number" || typeof userId === "string" && !userId.startsWith(prefix)) {
|
|
562
|
+
return `${prefix}${userId}`;
|
|
563
|
+
}
|
|
564
|
+
return userId;
|
|
565
|
+
};
|
|
566
|
+
var getDefaultProperties = () => ({
|
|
567
|
+
...DEFAULT_PROPERTIES,
|
|
568
|
+
...getConfig("defaultProperties")
|
|
569
|
+
});
|
|
570
|
+
var getTrackIntegrations = async ({
|
|
571
|
+
gdprPrivacyValue,
|
|
572
|
+
event
|
|
573
|
+
}) => {
|
|
574
|
+
const isGdprAccepted = checkAnalyticsGdprIsAccepted(gdprPrivacyValue);
|
|
575
|
+
let marketingCloudVisitorId;
|
|
576
|
+
let sessionId;
|
|
577
|
+
let clientId;
|
|
578
|
+
try {
|
|
579
|
+
if (isGdprAccepted) {
|
|
580
|
+
marketingCloudVisitorId = await getAdobeMCVisitorID();
|
|
581
|
+
}
|
|
582
|
+
sessionId = await getGoogleSessionId();
|
|
583
|
+
clientId = await getGoogleClientId();
|
|
584
|
+
} catch (error) {
|
|
585
|
+
console.error(error);
|
|
586
|
+
}
|
|
587
|
+
const restOfIntegrations = getRestOfIntegrations({ isGdprAccepted, event });
|
|
588
|
+
return {
|
|
589
|
+
...restOfIntegrations,
|
|
590
|
+
"Adobe Analytics": marketingCloudVisitorId ? { marketingCloudVisitorId } : true,
|
|
591
|
+
"Google Analytics 4": clientId && sessionId ? {
|
|
592
|
+
clientId,
|
|
593
|
+
sessionId
|
|
594
|
+
} : true
|
|
595
|
+
};
|
|
596
|
+
};
|
|
597
|
+
var getRestOfIntegrations = ({
|
|
598
|
+
isGdprAccepted,
|
|
599
|
+
event
|
|
600
|
+
}) => {
|
|
601
|
+
const isCMPSubmittedEvent = event === "CMP Submitted";
|
|
602
|
+
if (isCMPSubmittedEvent) {
|
|
603
|
+
return INTEGRATIONS_WHEN_NO_CONSENTS_CMP_SUBMITTED;
|
|
604
|
+
}
|
|
605
|
+
return isGdprAccepted ? {} : INTEGRATIONS_WHEN_NO_CONSENTS;
|
|
606
|
+
};
|
|
607
|
+
var getExternalIds = ({
|
|
608
|
+
context,
|
|
609
|
+
xandrId
|
|
610
|
+
}) => {
|
|
611
|
+
const shouldSendXandrId = getConfig("sendXandrId") !== false;
|
|
612
|
+
const isValidXandrId = xandrId && parseInt(xandrId) !== 0;
|
|
613
|
+
if (!shouldSendXandrId || !isValidXandrId) {
|
|
614
|
+
return {};
|
|
615
|
+
}
|
|
616
|
+
const SEGMENT_COLLECTION = "users";
|
|
617
|
+
const SEGMENT_ENCODING = "none";
|
|
618
|
+
const SEGMENT_TYPE = "xandr_id";
|
|
619
|
+
const externalIds = [
|
|
620
|
+
...Array.isArray(context?.externalIds) ? context.externalIds : [],
|
|
621
|
+
{
|
|
622
|
+
collection: SEGMENT_COLLECTION,
|
|
623
|
+
encoding: SEGMENT_ENCODING,
|
|
624
|
+
id: xandrId,
|
|
625
|
+
type: SEGMENT_TYPE
|
|
626
|
+
}
|
|
627
|
+
];
|
|
628
|
+
const uniqueExternalIds = externalIds.filter(
|
|
629
|
+
({ id: idFilter, type: typeFilter }, index) => index === externalIds.findIndex(({ id: idFind, type: typeFind }) => idFilter === idFind && typeFilter === typeFind)
|
|
630
|
+
);
|
|
631
|
+
return { externalIds: uniqueExternalIds };
|
|
632
|
+
};
|
|
633
|
+
var getConsentValue = (gdprValue) => {
|
|
634
|
+
return gdprValue === USER_GDPR.ACCEPTED ? CONSENT_STATES.granted : CONSENT_STATES.denied;
|
|
635
|
+
};
|
|
636
|
+
var decorateContextWithNeededData = async ({
|
|
637
|
+
event = "",
|
|
638
|
+
context = {}
|
|
639
|
+
}) => {
|
|
640
|
+
const gdprPrivacyValue = await getGdprPrivacyValue();
|
|
641
|
+
const { analytics: gdprPrivacyValueAnalytics, advertising: gdprPrivacyValueAdvertising } = gdprPrivacyValue || {};
|
|
642
|
+
const isGdprAccepted = checkAnalyticsGdprIsAccepted(gdprPrivacyValue);
|
|
643
|
+
const [integrations, xandrId] = await Promise.all([
|
|
644
|
+
getTrackIntegrations({ gdprPrivacyValue, event }),
|
|
645
|
+
getXandrId({ gdprPrivacyValueAdvertising })
|
|
646
|
+
]);
|
|
647
|
+
const analyticsConsentValue = getGoogleConsentValue("analytics_storage") ?? getConsentValue(gdprPrivacyValueAnalytics);
|
|
648
|
+
const adUserDataConsentValue = getGoogleConsentValue("ad_user_data") ?? getConsentValue(gdprPrivacyValueAdvertising);
|
|
649
|
+
const adPersonalizationConsentValue = getGoogleConsentValue("ad_personalization") ?? getConsentValue(gdprPrivacyValueAdvertising);
|
|
650
|
+
const adStorageConsentValue = getGoogleConsentValue("ad_storage") ?? getConsentValue(gdprPrivacyValueAdvertising);
|
|
651
|
+
if (!isGdprAccepted) {
|
|
652
|
+
context.integrations = {
|
|
653
|
+
...context.integrations ?? {},
|
|
654
|
+
Personas: false,
|
|
655
|
+
Webhooks: true,
|
|
656
|
+
Webhook: true
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
const google_consents = {
|
|
660
|
+
analytics_storage: analyticsConsentValue,
|
|
661
|
+
ad_user_data: adUserDataConsentValue,
|
|
662
|
+
ad_personalization: adPersonalizationConsentValue,
|
|
663
|
+
ad_storage: adStorageConsentValue
|
|
664
|
+
};
|
|
665
|
+
return {
|
|
666
|
+
...context,
|
|
667
|
+
...!isGdprAccepted && { ip: "0.0.0.0" },
|
|
668
|
+
...getExternalIds({ context, xandrId }),
|
|
669
|
+
analytics_storage: getConsentState(),
|
|
670
|
+
clientVersion: `segment-wrapper@${"4.36.0-beta.0"}`,
|
|
671
|
+
gdpr_privacy: gdprPrivacyValueAnalytics,
|
|
672
|
+
gdpr_privacy_advertising: gdprPrivacyValueAdvertising,
|
|
673
|
+
google_consents,
|
|
674
|
+
integrations: {
|
|
675
|
+
...context.integrations,
|
|
676
|
+
...integrations
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
};
|
|
680
|
+
var track = (event, properties, context = {}, callback) => new Promise((resolve) => {
|
|
681
|
+
const initTrack = async () => {
|
|
682
|
+
const newContext = await decorateContextWithNeededData({
|
|
683
|
+
context,
|
|
684
|
+
event
|
|
685
|
+
});
|
|
686
|
+
const newProperties = {
|
|
687
|
+
...getDefaultProperties(),
|
|
688
|
+
...properties
|
|
689
|
+
};
|
|
690
|
+
const newCallback = async (...args) => {
|
|
691
|
+
if (callback) callback(...args);
|
|
692
|
+
const [gdprPrivacyValue] = await Promise.all([getGdprPrivacyValue()]);
|
|
693
|
+
if (checkAnalyticsGdprIsAccepted(gdprPrivacyValue)) {
|
|
694
|
+
resolve();
|
|
695
|
+
} else {
|
|
696
|
+
resolve();
|
|
697
|
+
}
|
|
698
|
+
};
|
|
699
|
+
const needsConsentManagement = getConfig("googleAnalyticsConsentManagement");
|
|
700
|
+
if (needsConsentManagement && event === CMP_TRACK_EVENT) {
|
|
701
|
+
sendGoogleConsents("update", newContext.google_consents);
|
|
702
|
+
}
|
|
703
|
+
window.analytics.track(
|
|
704
|
+
event,
|
|
705
|
+
newProperties,
|
|
706
|
+
{
|
|
707
|
+
...newContext,
|
|
708
|
+
context: {
|
|
709
|
+
integrations: {
|
|
710
|
+
...newContext.integrations
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
newCallback
|
|
715
|
+
);
|
|
716
|
+
};
|
|
717
|
+
initTrack();
|
|
718
|
+
});
|
|
719
|
+
var identify = async (userIdParam, traits, options, callback) => {
|
|
720
|
+
const gdprPrivacyValue = await getGdprPrivacyValue();
|
|
721
|
+
const userId = getUserId(userIdParam);
|
|
722
|
+
setGoogleUserId(userId);
|
|
723
|
+
return window.analytics.identify(
|
|
724
|
+
userId,
|
|
725
|
+
checkAnalyticsGdprIsAccepted(gdprPrivacyValue) ? traits : {},
|
|
726
|
+
options,
|
|
727
|
+
callback
|
|
728
|
+
);
|
|
729
|
+
};
|
|
730
|
+
var page = (event, properties, context = {}, callback) => {
|
|
731
|
+
;
|
|
732
|
+
context.isPageTrack = true;
|
|
733
|
+
return track(event ?? "", properties, context, callback);
|
|
734
|
+
};
|
|
735
|
+
var reset = () => Promise.resolve(window.analytics.reset());
|
|
736
|
+
var segmentWrapper_default = { page, identify, track, reset };
|
|
737
|
+
|
|
738
|
+
// src/utils/patchAnalytics.ts
|
|
739
|
+
var MPI_PATCH_FIELD = "__mpi_patch";
|
|
740
|
+
function monkeyPatchAnalyticsTrack() {
|
|
741
|
+
const { track: originalTrack } = window.analytics;
|
|
742
|
+
window.analytics.track = (...args) => {
|
|
743
|
+
const [event, properties, contextFromArgs, fn] = args;
|
|
744
|
+
const newProperties = {
|
|
745
|
+
...getDefaultProperties(),
|
|
746
|
+
...properties
|
|
747
|
+
};
|
|
748
|
+
decorateContextWithNeededData({
|
|
749
|
+
context: contextFromArgs,
|
|
750
|
+
event
|
|
751
|
+
}).then((context) => {
|
|
752
|
+
originalTrack.call(window.analytics, event, newProperties, context, fn);
|
|
753
|
+
});
|
|
754
|
+
return window.analytics;
|
|
755
|
+
};
|
|
756
|
+
window.analytics[MPI_PATCH_FIELD] = true;
|
|
757
|
+
}
|
|
758
|
+
if (isClient) {
|
|
759
|
+
if (!window.analytics) {
|
|
760
|
+
console.warn("[segment-wrapper] Segment Analytics is not loaded so patch is not applied.");
|
|
761
|
+
} else if (!window.analytics[MPI_PATCH_FIELD]) {
|
|
762
|
+
void (window.analytics.initialized ? monkeyPatchAnalyticsTrack() : window.analytics.ready(monkeyPatchAnalyticsTrack));
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
// src/middlewares/source/campaignContext.ts
|
|
767
|
+
var campaignContext = ({ payload, next }) => {
|
|
768
|
+
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
769
|
+
if (googleAnalyticsMeasurementId) {
|
|
770
|
+
const campaignDetails = getCampaignDetails();
|
|
771
|
+
payload.obj.context = {
|
|
772
|
+
...payload.obj.context,
|
|
773
|
+
...campaignDetails
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
next(payload);
|
|
777
|
+
};
|
|
778
|
+
|
|
779
|
+
// src/middlewares/source/defaultContextProperties.ts
|
|
780
|
+
var DEFAULT_CONTEXT = { platform: "web" };
|
|
781
|
+
var defaultContextProperties = ({ payload, next }) => {
|
|
782
|
+
const defaultContext = getConfig("defaultContext") || {};
|
|
783
|
+
payload.obj.context = {
|
|
784
|
+
...DEFAULT_CONTEXT,
|
|
785
|
+
...defaultContext,
|
|
786
|
+
...payload.obj.context
|
|
787
|
+
};
|
|
788
|
+
next(payload);
|
|
789
|
+
};
|
|
790
|
+
|
|
791
|
+
// src/middlewares/source/pageData.ts
|
|
792
|
+
var createPageDataMiddleware = () => {
|
|
793
|
+
let last = null;
|
|
794
|
+
return ({ payload, next }) => {
|
|
795
|
+
try {
|
|
796
|
+
const { obj } = payload;
|
|
797
|
+
const { event, type } = obj;
|
|
798
|
+
if (type !== "track") {
|
|
799
|
+
next(payload);
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
if (typeof event === "string" && event.endsWith("Viewed")) {
|
|
803
|
+
const { page_name: name, page_type: type2 } = obj.properties || {};
|
|
804
|
+
last = { name, type: type2 };
|
|
805
|
+
next(payload);
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
if (!last) {
|
|
809
|
+
next(payload);
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
next({
|
|
813
|
+
...payload,
|
|
814
|
+
obj: {
|
|
815
|
+
...obj,
|
|
816
|
+
properties: {
|
|
817
|
+
...obj.properties,
|
|
818
|
+
page_name_origin: last.name,
|
|
819
|
+
page_type: obj.properties?.page_type || last.type
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
});
|
|
823
|
+
} catch (error) {
|
|
824
|
+
console.error(error);
|
|
825
|
+
next(payload);
|
|
826
|
+
}
|
|
827
|
+
};
|
|
828
|
+
};
|
|
829
|
+
var pageData = createPageDataMiddleware();
|
|
830
|
+
|
|
831
|
+
// src/middlewares/source/userScreenInfo.ts
|
|
832
|
+
var userScreenInfo = ({ payload, next }) => {
|
|
833
|
+
payload.obj.context = {
|
|
834
|
+
...payload.obj.context,
|
|
835
|
+
screen: {
|
|
836
|
+
height: window.innerHeight,
|
|
837
|
+
width: window.innerWidth,
|
|
838
|
+
density: window.devicePixelRatio
|
|
839
|
+
}
|
|
840
|
+
};
|
|
841
|
+
next(payload);
|
|
842
|
+
};
|
|
843
|
+
|
|
844
|
+
// src/middlewares/source/userTraits.ts
|
|
845
|
+
var getUserTraits = (gdprPrivacyValue) => {
|
|
846
|
+
const isUserTraitsEnabled = getConfig("isUserTraitsEnabled");
|
|
847
|
+
const user = window.analytics.user?.();
|
|
848
|
+
const isGdprAccepted = checkAnalyticsGdprIsAccepted(gdprPrivacyValue);
|
|
849
|
+
const userId = user?.id();
|
|
850
|
+
return {
|
|
851
|
+
anonymousId: user?.anonymousId(),
|
|
852
|
+
...userId && { userId },
|
|
853
|
+
...isGdprAccepted && isUserTraitsEnabled && user?.traits() || {}
|
|
854
|
+
};
|
|
855
|
+
};
|
|
856
|
+
var userTraits = async ({ payload, next }) => {
|
|
857
|
+
const gdprPrivacyValue = await getGdprPrivacyValue();
|
|
858
|
+
let traits;
|
|
859
|
+
try {
|
|
860
|
+
traits = getUserTraits(gdprPrivacyValue);
|
|
861
|
+
} catch (error) {
|
|
862
|
+
console.error(error);
|
|
863
|
+
}
|
|
864
|
+
payload.obj.context = {
|
|
865
|
+
...payload.obj.context,
|
|
866
|
+
traits: {
|
|
867
|
+
...payload.obj.context.traits || {},
|
|
868
|
+
...traits
|
|
869
|
+
}
|
|
870
|
+
};
|
|
871
|
+
next(payload);
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
// src/utils/hashEmail.ts
|
|
875
|
+
import md5 from "tiny-hashes/md5";
|
|
876
|
+
import sha256 from "tiny-hashes/sha256";
|
|
877
|
+
var PLUS_AND_DOT = /\.|\+.*$/g;
|
|
878
|
+
function normalizeEmail(email) {
|
|
879
|
+
if (typeof email !== "string") return "";
|
|
880
|
+
const lowercaseEmail = email.toLowerCase();
|
|
881
|
+
const emailParts = lowercaseEmail.split(/@/);
|
|
882
|
+
if (emailParts.length !== 2) return "";
|
|
883
|
+
const [usernameRaw, domain] = emailParts;
|
|
884
|
+
const username = usernameRaw.replace(PLUS_AND_DOT, "");
|
|
885
|
+
return `${username}@${domain}`;
|
|
886
|
+
}
|
|
887
|
+
function createUniversalId(email) {
|
|
888
|
+
const normalizedEmail = normalizeEmail(email);
|
|
889
|
+
return normalizedEmail ? sha256(normalizedEmail) : "";
|
|
890
|
+
}
|
|
891
|
+
function hashEmail(email) {
|
|
892
|
+
const normalizedEmail = normalizeEmail(email);
|
|
893
|
+
return normalizedEmail ? md5(normalizedEmail) : "";
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
// src/universalId.ts
|
|
897
|
+
var USER_DATA_READY_EVENT = "USER_DATA_READY";
|
|
898
|
+
var getUniversalIdFromConfig = () => getConfig("universalId");
|
|
899
|
+
var getUniversalId = () => {
|
|
900
|
+
let universalId = getUniversalIdFromConfig();
|
|
901
|
+
if (universalId) {
|
|
902
|
+
setUniversalIdInitialized();
|
|
903
|
+
return universalId;
|
|
904
|
+
}
|
|
905
|
+
const userEmail = getConfig("userEmail");
|
|
906
|
+
if (userEmail) {
|
|
907
|
+
universalId = createUniversalId(userEmail);
|
|
908
|
+
setUniversalId(universalId);
|
|
909
|
+
setUniversalIdInitialized();
|
|
910
|
+
return universalId;
|
|
911
|
+
}
|
|
912
|
+
setUniversalIdInitialized();
|
|
913
|
+
return void 0;
|
|
914
|
+
};
|
|
915
|
+
var getUserDataAndNotify = () => {
|
|
916
|
+
if (!isClient) return void 0;
|
|
917
|
+
const universalId = getUniversalId();
|
|
918
|
+
const userEmail = getConfig("userEmail");
|
|
919
|
+
if (typeof window !== "undefined" && typeof window.dispatchEvent === "function") {
|
|
920
|
+
const event = new CustomEvent(USER_DATA_READY_EVENT, {
|
|
921
|
+
detail: { universalId, userEmail }
|
|
922
|
+
});
|
|
923
|
+
window.dispatchEvent(event);
|
|
924
|
+
}
|
|
925
|
+
return { universalId, userEmail };
|
|
926
|
+
};
|
|
927
|
+
var setUniversalIdInitialized = () => {
|
|
928
|
+
setConfig("universalIdInitialized", true);
|
|
929
|
+
};
|
|
930
|
+
var setUniversalId = (universalId) => {
|
|
931
|
+
setConfig("universalId", universalId);
|
|
932
|
+
};
|
|
933
|
+
|
|
934
|
+
// src/utils/checkAnonymousId.ts
|
|
935
|
+
var checkAnonymousId = () => {
|
|
936
|
+
if (typeof window === "undefined") return;
|
|
937
|
+
const win = window;
|
|
938
|
+
const analytics = win.analytics;
|
|
939
|
+
if (!analytics) {
|
|
940
|
+
console.warn("[segment-wrapper] Analytics is not available");
|
|
941
|
+
return;
|
|
942
|
+
}
|
|
943
|
+
const SEGMENT_ID_USER_WITHOUT_CONSENTS = win.__SEGMENT_WRAPPER?.SEGMENT_ID_USER_WITHOUT_CONSENTS ?? "anonymous_user";
|
|
944
|
+
const anonymousId = analytics.user?.()?.anonymousId();
|
|
945
|
+
if (anonymousId === SEGMENT_ID_USER_WITHOUT_CONSENTS) {
|
|
946
|
+
if ("setAnonymousId" in analytics && typeof analytics.setAnonymousId === "function") {
|
|
947
|
+
;
|
|
948
|
+
analytics.setAnonymousId(null);
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
};
|
|
952
|
+
|
|
953
|
+
// src/types/tcf.ts
|
|
954
|
+
var UserGDPR = /* @__PURE__ */ ((UserGDPR2) => {
|
|
955
|
+
UserGDPR2["ACCEPTED"] = "accepted";
|
|
956
|
+
UserGDPR2["DECLINED"] = "declined";
|
|
957
|
+
UserGDPR2["UNKNOWN"] = "unknown";
|
|
958
|
+
return UserGDPR2;
|
|
959
|
+
})(UserGDPR || {});
|
|
960
|
+
var TCFEvents = /* @__PURE__ */ ((TCFEvents2) => {
|
|
961
|
+
TCFEvents2["LOADED"] = "tcloaded";
|
|
962
|
+
TCFEvents2["USER_ACTION_COMPLETE"] = "useractioncomplete";
|
|
963
|
+
return TCFEvents2;
|
|
964
|
+
})(TCFEvents || {});
|
|
965
|
+
|
|
966
|
+
// src/utils/storage.ts
|
|
967
|
+
var storage = ({
|
|
968
|
+
type = "localStorage",
|
|
969
|
+
method = "getItem",
|
|
970
|
+
key,
|
|
971
|
+
value
|
|
972
|
+
}) => {
|
|
973
|
+
try {
|
|
974
|
+
if (typeof window === "undefined") {
|
|
975
|
+
return null;
|
|
976
|
+
}
|
|
977
|
+
const storageObj = window[type];
|
|
978
|
+
if (!storageObj) {
|
|
979
|
+
console.warn(`[segment-wrapper] ${type} is not available`);
|
|
980
|
+
return null;
|
|
981
|
+
}
|
|
982
|
+
if (method === "getItem") {
|
|
983
|
+
return storageObj.getItem(key);
|
|
984
|
+
}
|
|
985
|
+
if (method === "setItem") {
|
|
986
|
+
if (value === void 0) {
|
|
987
|
+
console.warn("[segment-wrapper] storage.setItem requires a value");
|
|
988
|
+
return;
|
|
989
|
+
}
|
|
990
|
+
storageObj.setItem(key, value);
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
993
|
+
if (method === "removeItem") {
|
|
994
|
+
storageObj.removeItem(key);
|
|
995
|
+
return;
|
|
996
|
+
}
|
|
997
|
+
} catch (e) {
|
|
998
|
+
console.error("[segment-wrapper] Storage error:", e);
|
|
999
|
+
return null;
|
|
1000
|
+
}
|
|
1001
|
+
};
|
|
1002
|
+
var getStorageItem = (key, type = "localStorage") => {
|
|
1003
|
+
return storage({ key, type, method: "getItem" }) || null;
|
|
1004
|
+
};
|
|
1005
|
+
var setStorageItem = (key, value, type = "localStorage") => {
|
|
1006
|
+
storage({ key, value, type, method: "setItem" });
|
|
1007
|
+
};
|
|
1008
|
+
var removeStorageItem = (key, type = "localStorage") => {
|
|
1009
|
+
storage({ key, type, method: "removeItem" });
|
|
1010
|
+
};
|
|
1011
|
+
|
|
1012
|
+
// src/index.ts
|
|
1013
|
+
initTcfTracking();
|
|
1014
|
+
try {
|
|
1015
|
+
getUserDataAndNotify();
|
|
1016
|
+
} catch (error) {
|
|
1017
|
+
console.error("[segment-wrapper] UniversalID could not be initialized", error);
|
|
1018
|
+
}
|
|
1019
|
+
var addMiddlewares = () => {
|
|
1020
|
+
const experimentalPageDataMiddleware = getConfig("experimentalPageDataMiddleware");
|
|
1021
|
+
window.analytics.addSourceMiddleware?.(userTraits);
|
|
1022
|
+
window.analytics.addSourceMiddleware?.(defaultContextProperties);
|
|
1023
|
+
window.analytics.addSourceMiddleware?.(campaignContext);
|
|
1024
|
+
window.analytics.addSourceMiddleware?.(userScreenInfo);
|
|
1025
|
+
window.analytics.addSourceMiddleware?.(pageReferrer);
|
|
1026
|
+
if (experimentalPageDataMiddleware) {
|
|
1027
|
+
window.analytics.addSourceMiddleware?.(pageData);
|
|
1028
|
+
}
|
|
1029
|
+
};
|
|
1030
|
+
if (isClient && window.analytics) {
|
|
1031
|
+
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
1032
|
+
const dataLayerName = getConfig("googleAnalyticsDataLayer") || DEFAULT_DATA_LAYER_NAME;
|
|
1033
|
+
const needsConsentManagement = getConfig("googleAnalyticsConsentManagement");
|
|
1034
|
+
if (googleAnalyticsMeasurementId) {
|
|
1035
|
+
const googleAnalyticsConfig = getConfig("googleAnalyticsConfig");
|
|
1036
|
+
window[dataLayerName] = window[dataLayerName] || [];
|
|
1037
|
+
window.gtag = window.gtag || function gtag() {
|
|
1038
|
+
;
|
|
1039
|
+
window[dataLayerName].push(arguments);
|
|
1040
|
+
};
|
|
1041
|
+
window.gtag("js", /* @__PURE__ */ new Date());
|
|
1042
|
+
if (needsConsentManagement) {
|
|
1043
|
+
sendGoogleConsents();
|
|
1044
|
+
}
|
|
1045
|
+
window.gtag("config", googleAnalyticsMeasurementId, {
|
|
1046
|
+
cookie_prefix: "segment",
|
|
1047
|
+
send_page_view: false,
|
|
1048
|
+
...googleAnalyticsConfig,
|
|
1049
|
+
...getCampaignDetails()
|
|
1050
|
+
});
|
|
1051
|
+
loadGoogleAnalytics().catch((error) => {
|
|
1052
|
+
console.error("[segment-wrapper] Failed to load Google Analytics", error);
|
|
1053
|
+
});
|
|
1054
|
+
}
|
|
1055
|
+
window.analytics.ready(checkAnonymousId);
|
|
1056
|
+
window.analytics.addSourceMiddleware ? addMiddlewares() : window.analytics.ready(addMiddlewares);
|
|
1057
|
+
}
|
|
1058
|
+
var index_default = segmentWrapper_default;
|
|
1059
|
+
export {
|
|
1060
|
+
CONSENT_STATES,
|
|
1061
|
+
EVENTS,
|
|
1062
|
+
TCFEvents,
|
|
1063
|
+
UserGDPR,
|
|
1064
|
+
checkAnonymousId,
|
|
1065
|
+
clearConfig,
|
|
1066
|
+
createUniversalId,
|
|
1067
|
+
index_default as default,
|
|
1068
|
+
getAdobeMCVisitorID,
|
|
1069
|
+
getAdobeVisitorData,
|
|
1070
|
+
getConfig,
|
|
1071
|
+
getStorageItem,
|
|
1072
|
+
getUniversalId,
|
|
1073
|
+
hashEmail,
|
|
1074
|
+
initConfig,
|
|
1075
|
+
isClient,
|
|
1076
|
+
normalizeEmail,
|
|
1077
|
+
readCookie2 as readCookie,
|
|
1078
|
+
removeCookie,
|
|
1079
|
+
removeStorageItem,
|
|
1080
|
+
saveCookie,
|
|
1081
|
+
setConfig,
|
|
1082
|
+
setStorageItem,
|
|
1083
|
+
storage,
|
|
1084
|
+
toCookieDomain
|
|
1085
|
+
};
|