@adv-re/segment-wrapper 4.36.2 → 5.0.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 +50 -45
- package/dist/index.d.mts +17 -92
- package/dist/index.d.ts +17 -92
- package/dist/index.js +177 -307
- package/dist/index.mjs +174 -305
- package/package.json +2 -2
- package/umd/index.js +1 -1
package/dist/index.mjs
CHANGED
|
@@ -98,237 +98,6 @@ var getAdobeMCVisitorID = async () => {
|
|
|
98
98
|
return getConfig("importAdobeVisitorId") === true ? importVisitorApiAndGetAdobeMCVisitorID() : getAdobeMarketingCloudVisitorIdFromWindow();
|
|
99
99
|
};
|
|
100
100
|
|
|
101
|
-
// src/events.ts
|
|
102
|
-
var EVENTS = {
|
|
103
|
-
GA4_INIT_EVENT_SENT: "ga4InitEventSent"
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
// src/middlewares/source/pageReferrer.ts
|
|
107
|
-
var referrerState = {
|
|
108
|
-
spaReferrer: "",
|
|
109
|
-
referrer: ""
|
|
110
|
-
};
|
|
111
|
-
var utils = {
|
|
112
|
-
/**
|
|
113
|
-
* @returns The referrer of the document
|
|
114
|
-
*/
|
|
115
|
-
getDocumentReferrer: () => document.referrer,
|
|
116
|
-
/**
|
|
117
|
-
* @returns The actual location with protocol, domain and pathname
|
|
118
|
-
*/
|
|
119
|
-
getActualLocation: () => {
|
|
120
|
-
const { origin, pathname } = window.location;
|
|
121
|
-
return `${origin}${pathname}`;
|
|
122
|
-
},
|
|
123
|
-
/**
|
|
124
|
-
* @returns The actual query string
|
|
125
|
-
*/
|
|
126
|
-
getActualQueryString: () => {
|
|
127
|
-
const { search } = window.location;
|
|
128
|
-
return search;
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
var getPageReferrer = ({ isPageTrack = false } = {}) => {
|
|
132
|
-
const { referrer, spaReferrer } = referrerState;
|
|
133
|
-
const referrerToUse = isPageTrack ? referrer : spaReferrer;
|
|
134
|
-
return referrerToUse || utils.getDocumentReferrer();
|
|
135
|
-
};
|
|
136
|
-
var updatePageReferrer = () => {
|
|
137
|
-
referrerState.spaReferrer = getPageReferrer({ isPageTrack: true });
|
|
138
|
-
referrerState.referrer = utils.getActualLocation();
|
|
139
|
-
};
|
|
140
|
-
var pageReferrer = ({ payload, next }) => {
|
|
141
|
-
const {
|
|
142
|
-
obj: { context }
|
|
143
|
-
} = payload;
|
|
144
|
-
const { isPageTrack } = context;
|
|
145
|
-
const referrer = getPageReferrer({ isPageTrack });
|
|
146
|
-
payload.obj.context = {
|
|
147
|
-
...context,
|
|
148
|
-
page: {
|
|
149
|
-
...context.page,
|
|
150
|
-
referrer
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
if (isPageTrack) {
|
|
154
|
-
updatePageReferrer();
|
|
155
|
-
}
|
|
156
|
-
next(payload);
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
// src/repositories/googleRepository.ts
|
|
160
|
-
var FIELDS = {
|
|
161
|
-
clientId: "client_id",
|
|
162
|
-
sessionId: "session_id"
|
|
163
|
-
};
|
|
164
|
-
var DEFAULT_DATA_LAYER_NAME = "dataLayer";
|
|
165
|
-
var CONSENT_STATES = {
|
|
166
|
-
granted: "granted",
|
|
167
|
-
denied: "denied"
|
|
168
|
-
};
|
|
169
|
-
var CONSENT_STATE_GRANTED_VALUE = 1;
|
|
170
|
-
var CONSENT_STATE_DENIED_VALUE = 2;
|
|
171
|
-
var STC = {
|
|
172
|
-
QUERY: "stc",
|
|
173
|
-
SPLIT_SYMBOL: "-",
|
|
174
|
-
CAMPAIGN_SPLIT_SYMBOL: ":"
|
|
175
|
-
};
|
|
176
|
-
var UTM_CAMPAIGN = "utm_campaign";
|
|
177
|
-
var UTM_MEDIUM = "utm_medium";
|
|
178
|
-
var UTM_SOURCE = "utm_source";
|
|
179
|
-
var UTM_CONTENT = "utm_content";
|
|
180
|
-
var UTM_CAMPAIGN_ID = "utm_id";
|
|
181
|
-
var UTM_TERM = "utm_term";
|
|
182
|
-
var STC_MEDIUM_TRANSFORMATIONS = {
|
|
183
|
-
aff: "affiliate",
|
|
184
|
-
dis: "display",
|
|
185
|
-
em: "email",
|
|
186
|
-
met: "paid-metasearch",
|
|
187
|
-
sem: "paid-search",
|
|
188
|
-
rt: "display",
|
|
189
|
-
sm: "social-media",
|
|
190
|
-
sp: "paid-social",
|
|
191
|
-
pn: "push-notification",
|
|
192
|
-
cs: "cross-sites"
|
|
193
|
-
};
|
|
194
|
-
var STC_INVALID_CONTENT = "na";
|
|
195
|
-
var DEFAULT_GA_INIT_EVENT = "sui";
|
|
196
|
-
var EMPTY_STC = { medium: null, source: null, campaign: null };
|
|
197
|
-
var loadScript = async (src) => new Promise(function(resolve, reject) {
|
|
198
|
-
const script = document.createElement("script");
|
|
199
|
-
script.src = src;
|
|
200
|
-
script.onload = () => resolve();
|
|
201
|
-
script.onerror = reject;
|
|
202
|
-
document.head.appendChild(script);
|
|
203
|
-
});
|
|
204
|
-
var loadGoogleAnalytics = async () => {
|
|
205
|
-
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
206
|
-
const dataLayerName = getConfig("googleAnalyticsDataLayer") || DEFAULT_DATA_LAYER_NAME;
|
|
207
|
-
if (!googleAnalyticsMeasurementId) return Promise.resolve(false);
|
|
208
|
-
const gtagScript = `https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsMeasurementId}&l=${dataLayerName}`;
|
|
209
|
-
return loadScript(gtagScript).then(() => true);
|
|
210
|
-
};
|
|
211
|
-
var triggerGoogleAnalyticsInitEvent = (sessionId) => {
|
|
212
|
-
const eventName = getConfig("googleAnalyticsInitEvent") ?? DEFAULT_GA_INIT_EVENT;
|
|
213
|
-
const eventPrefix = `ga_event_${eventName}_`;
|
|
214
|
-
const eventKey = `${eventPrefix}${sessionId}`;
|
|
215
|
-
if (typeof window.gtag === "undefined") return;
|
|
216
|
-
if (!localStorage.getItem(eventKey)) {
|
|
217
|
-
window.gtag("event", eventName);
|
|
218
|
-
console.log(`Sending GA4 event "${eventName}" for the session "${sessionId}"`);
|
|
219
|
-
localStorage.setItem(eventKey, "true");
|
|
220
|
-
if (typeof window.dispatchEvent === "function") {
|
|
221
|
-
const event = new CustomEvent(EVENTS.GA4_INIT_EVENT_SENT, {
|
|
222
|
-
detail: { eventName, sessionId }
|
|
223
|
-
});
|
|
224
|
-
window.dispatchEvent(event);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
Object.keys(localStorage).forEach((key) => {
|
|
228
|
-
if (key.startsWith(eventPrefix) && key !== eventKey) {
|
|
229
|
-
localStorage.removeItem(key);
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
};
|
|
233
|
-
var getGoogleField = async (field) => {
|
|
234
|
-
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
235
|
-
if (!googleAnalyticsMeasurementId) return Promise.resolve(void 0);
|
|
236
|
-
return new Promise((resolve) => {
|
|
237
|
-
window.gtag?.("get", googleAnalyticsMeasurementId, field, resolve);
|
|
238
|
-
});
|
|
239
|
-
};
|
|
240
|
-
var trackingTagsTypes = {
|
|
241
|
-
STC: "stc",
|
|
242
|
-
UTM: "utm"
|
|
243
|
-
};
|
|
244
|
-
var getCampaignDetails = ({ needsTransformation = true } = {}) => {
|
|
245
|
-
const { medium, source, campaign, content, term } = readQueryParams();
|
|
246
|
-
if (!medium || !source || !campaign) return null;
|
|
247
|
-
const [id, name] = campaign.split(STC.CAMPAIGN_SPLIT_SYMBOL);
|
|
248
|
-
if (!id && !name) return null;
|
|
249
|
-
const needsContent = typeof content !== "undefined" && content !== STC_INVALID_CONTENT;
|
|
250
|
-
return {
|
|
251
|
-
campaign: {
|
|
252
|
-
medium: needsTransformation && STC_MEDIUM_TRANSFORMATIONS[medium] || medium,
|
|
253
|
-
...typeof name !== "undefined" && { id },
|
|
254
|
-
name: name ?? id,
|
|
255
|
-
source,
|
|
256
|
-
...needsContent && { content },
|
|
257
|
-
...typeof term !== "undefined" && { term }
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
};
|
|
261
|
-
function readQueryParams() {
|
|
262
|
-
const search = utils.getActualQueryString();
|
|
263
|
-
const searchParams = new URLSearchParams(search);
|
|
264
|
-
return getConfig("trackingTagsType") === trackingTagsTypes.UTM ? readFromUtm(searchParams) : readFromStc(searchParams);
|
|
265
|
-
}
|
|
266
|
-
function readFromStc(searchParams) {
|
|
267
|
-
if (!hasStc(searchParams)) return EMPTY_STC;
|
|
268
|
-
const stc = searchParams.get(STC.QUERY);
|
|
269
|
-
const [medium, source, campaign, content, term] = stc?.split(STC.SPLIT_SYMBOL) || [];
|
|
270
|
-
return { medium, source, campaign, content, term };
|
|
271
|
-
}
|
|
272
|
-
function hasStc(searchParams) {
|
|
273
|
-
return searchParams.has(STC.QUERY);
|
|
274
|
-
}
|
|
275
|
-
function readFromUtm(searchParams) {
|
|
276
|
-
const campaignId = searchParams.get(UTM_CAMPAIGN_ID);
|
|
277
|
-
const campaignName = searchParams.get(UTM_CAMPAIGN);
|
|
278
|
-
const medium = searchParams.get(UTM_MEDIUM);
|
|
279
|
-
const source = searchParams.get(UTM_SOURCE);
|
|
280
|
-
const content = searchParams.get(UTM_CONTENT);
|
|
281
|
-
const term = searchParams.get(UTM_TERM);
|
|
282
|
-
const campaign = campaignId ? `${campaignId}${STC.CAMPAIGN_SPLIT_SYMBOL}${campaignName}` : campaignName;
|
|
283
|
-
const missingAnyMandatoryFields = !medium || !source || !campaign;
|
|
284
|
-
if (missingAnyMandatoryFields && hasStc(searchParams)) {
|
|
285
|
-
return readFromStc(searchParams);
|
|
286
|
-
}
|
|
287
|
-
return {
|
|
288
|
-
campaign,
|
|
289
|
-
medium,
|
|
290
|
-
source,
|
|
291
|
-
content: content ?? void 0,
|
|
292
|
-
term: term ?? void 0
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
var getGoogleClientId = async () => getGoogleField(FIELDS.clientId);
|
|
296
|
-
var getGoogleSessionId = async () => {
|
|
297
|
-
const sessionId = await getGoogleField(FIELDS.sessionId);
|
|
298
|
-
if (sessionId) {
|
|
299
|
-
triggerGoogleAnalyticsInitEvent(sessionId);
|
|
300
|
-
}
|
|
301
|
-
return sessionId;
|
|
302
|
-
};
|
|
303
|
-
function getGoogleConsentValue(consentType = "analytics_storage") {
|
|
304
|
-
try {
|
|
305
|
-
const value = window.google_tag_data?.ics?.getConsentState?.(consentType);
|
|
306
|
-
if (value === CONSENT_STATE_GRANTED_VALUE) return CONSENT_STATES.granted;
|
|
307
|
-
if (value === CONSENT_STATE_DENIED_VALUE) return CONSENT_STATES.denied;
|
|
308
|
-
return void 0;
|
|
309
|
-
} catch {
|
|
310
|
-
return void 0;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
var getConsentState = () => getGoogleConsentValue() ?? CONSENT_STATES.denied;
|
|
314
|
-
var setGoogleUserId = (userId) => {
|
|
315
|
-
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
316
|
-
if (!googleAnalyticsMeasurementId || !userId) return;
|
|
317
|
-
window.gtag?.("set", "user_id", userId);
|
|
318
|
-
};
|
|
319
|
-
var sendGoogleConsents = (mode = "default", consents) => {
|
|
320
|
-
window.gtag?.(
|
|
321
|
-
"consent",
|
|
322
|
-
mode,
|
|
323
|
-
consents || {
|
|
324
|
-
analytics_storage: CONSENT_STATES.denied,
|
|
325
|
-
ad_user_data: CONSENT_STATES.denied,
|
|
326
|
-
ad_personalization: CONSENT_STATES.denied,
|
|
327
|
-
ad_storage: CONSENT_STATES.denied
|
|
328
|
-
}
|
|
329
|
-
);
|
|
330
|
-
};
|
|
331
|
-
|
|
332
101
|
// src/tcf.ts
|
|
333
102
|
var TCF_COOKIE_KEY = "borosTcf";
|
|
334
103
|
var TCF_API_VERSION = 2;
|
|
@@ -382,17 +151,30 @@ var checkTcfIsAvailable = () => {
|
|
|
382
151
|
};
|
|
383
152
|
var checkHasUserConsentedAnalytics = (userConsents) => NEEDED_PURPOSES.analytics.every((purposeId) => userConsents[`${purposeId}`]);
|
|
384
153
|
var checkHasUserConsentedAdvertising = (userConsents) => NEEDED_PURPOSES.advertising.every((purposeId) => userConsents[`${purposeId}`]);
|
|
385
|
-
var trackTcf = ({ gdprPrivacy }) =>
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
)
|
|
154
|
+
var trackTcf = ({ gdprPrivacy }) => {
|
|
155
|
+
const isAnalyticsAccepted = gdprPrivacy.analytics === USER_GDPR.ACCEPTED;
|
|
156
|
+
const isAdvertisingAccepted = gdprPrivacy.advertising === USER_GDPR.ACCEPTED;
|
|
157
|
+
return segmentWrapper_default.track(
|
|
158
|
+
CMP_TRACK_EVENT,
|
|
159
|
+
{
|
|
160
|
+
...TCF_TRACK_PROPERTIES,
|
|
161
|
+
...getConfig("tcfTrackDefaultProperties") || {}
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
// Consent Mode properties for Segment → GA4 mapping (v5)
|
|
165
|
+
// These are mapped in Segment Dashboard from context.google_consents.* to GA4 Consent Mode
|
|
166
|
+
google_consents: {
|
|
167
|
+
analytics_storage: isAnalyticsAccepted ? "granted" : "denied",
|
|
168
|
+
ad_storage: isAdvertisingAccepted ? "granted" : "denied",
|
|
169
|
+
ad_user_data: isAdvertisingAccepted ? "granted" : "denied",
|
|
170
|
+
ad_personalization: isAdvertisingAccepted ? "granted" : "denied"
|
|
171
|
+
},
|
|
172
|
+
// Keep gdpr_privacy in context for compatibility with other integrations
|
|
173
|
+
gdpr_privacy: gdprPrivacy.analytics,
|
|
174
|
+
gdpr_privacy_advertising: gdprPrivacy.advertising
|
|
175
|
+
}
|
|
176
|
+
);
|
|
177
|
+
};
|
|
396
178
|
var getGdprPrivacyValue = () => {
|
|
397
179
|
const gdprPrivacyValue = gdprState.get();
|
|
398
180
|
if (gdprPrivacyValue !== void 0) return Promise.resolve(gdprPrivacyValue);
|
|
@@ -574,14 +356,10 @@ var getTrackIntegrations = async ({
|
|
|
574
356
|
}) => {
|
|
575
357
|
const isGdprAccepted = checkAnalyticsGdprIsAccepted(gdprPrivacyValue);
|
|
576
358
|
let marketingCloudVisitorId;
|
|
577
|
-
let sessionId;
|
|
578
|
-
let clientId;
|
|
579
359
|
try {
|
|
580
360
|
if (isGdprAccepted) {
|
|
581
361
|
marketingCloudVisitorId = await getAdobeMCVisitorID();
|
|
582
362
|
}
|
|
583
|
-
sessionId = await getGoogleSessionId();
|
|
584
|
-
clientId = await getGoogleClientId();
|
|
585
363
|
} catch (error) {
|
|
586
364
|
console.error(error);
|
|
587
365
|
}
|
|
@@ -589,10 +367,7 @@ var getTrackIntegrations = async ({
|
|
|
589
367
|
return {
|
|
590
368
|
...restOfIntegrations,
|
|
591
369
|
"Adobe Analytics": marketingCloudVisitorId ? { marketingCloudVisitorId } : true,
|
|
592
|
-
"Google Analytics 4":
|
|
593
|
-
clientId,
|
|
594
|
-
sessionId
|
|
595
|
-
} : true
|
|
370
|
+
"Google Analytics 4": true
|
|
596
371
|
};
|
|
597
372
|
};
|
|
598
373
|
var getRestOfIntegrations = ({
|
|
@@ -631,9 +406,6 @@ var getExternalIds = ({
|
|
|
631
406
|
);
|
|
632
407
|
return { externalIds: uniqueExternalIds };
|
|
633
408
|
};
|
|
634
|
-
var getConsentValue = (gdprValue) => {
|
|
635
|
-
return gdprValue === USER_GDPR.ACCEPTED ? CONSENT_STATES.granted : CONSENT_STATES.denied;
|
|
636
|
-
};
|
|
637
409
|
var decorateContextWithNeededData = async ({
|
|
638
410
|
event = "",
|
|
639
411
|
context = {}
|
|
@@ -645,10 +417,6 @@ var decorateContextWithNeededData = async ({
|
|
|
645
417
|
getTrackIntegrations({ gdprPrivacyValue, event }),
|
|
646
418
|
getXandrId({ gdprPrivacyValueAdvertising })
|
|
647
419
|
]);
|
|
648
|
-
const analyticsConsentValue = getGoogleConsentValue("analytics_storage") ?? getConsentValue(gdprPrivacyValueAnalytics);
|
|
649
|
-
const adUserDataConsentValue = getGoogleConsentValue("ad_user_data") ?? getConsentValue(gdprPrivacyValueAdvertising);
|
|
650
|
-
const adPersonalizationConsentValue = getGoogleConsentValue("ad_personalization") ?? getConsentValue(gdprPrivacyValueAdvertising);
|
|
651
|
-
const adStorageConsentValue = getGoogleConsentValue("ad_storage") ?? getConsentValue(gdprPrivacyValueAdvertising);
|
|
652
420
|
if (!isGdprAccepted) {
|
|
653
421
|
context.integrations = {
|
|
654
422
|
...context.integrations ?? {},
|
|
@@ -657,21 +425,13 @@ var decorateContextWithNeededData = async ({
|
|
|
657
425
|
Webhook: true
|
|
658
426
|
};
|
|
659
427
|
}
|
|
660
|
-
const google_consents = {
|
|
661
|
-
analytics_storage: analyticsConsentValue,
|
|
662
|
-
ad_user_data: adUserDataConsentValue,
|
|
663
|
-
ad_personalization: adPersonalizationConsentValue,
|
|
664
|
-
ad_storage: adStorageConsentValue
|
|
665
|
-
};
|
|
666
428
|
return {
|
|
667
429
|
...context,
|
|
668
430
|
...!isGdprAccepted && { ip: "0.0.0.0" },
|
|
669
431
|
...getExternalIds({ context, xandrId }),
|
|
670
|
-
|
|
671
|
-
clientVersion: `segment-wrapper@${"4.36.2"}`,
|
|
432
|
+
clientVersion: `segment-wrapper@${"5.0.0-beta.0"}`,
|
|
672
433
|
gdpr_privacy: gdprPrivacyValueAnalytics,
|
|
673
434
|
gdpr_privacy_advertising: gdprPrivacyValueAdvertising,
|
|
674
|
-
google_consents,
|
|
675
435
|
integrations: {
|
|
676
436
|
...context.integrations,
|
|
677
437
|
...integrations
|
|
@@ -697,10 +457,6 @@ var track = (event, properties, context = {}, callback) => new Promise((resolve)
|
|
|
697
457
|
resolve();
|
|
698
458
|
}
|
|
699
459
|
};
|
|
700
|
-
const needsConsentManagement = getConfig("googleAnalyticsConsentManagement");
|
|
701
|
-
if (needsConsentManagement && event === CMP_TRACK_EVENT) {
|
|
702
|
-
sendGoogleConsents("update", newContext.google_consents);
|
|
703
|
-
}
|
|
704
460
|
window.analytics.track(
|
|
705
461
|
event,
|
|
706
462
|
newProperties,
|
|
@@ -720,7 +476,6 @@ var track = (event, properties, context = {}, callback) => new Promise((resolve)
|
|
|
720
476
|
var identify = async (userIdParam, traits, options, callback) => {
|
|
721
477
|
const gdprPrivacyValue = await getGdprPrivacyValue();
|
|
722
478
|
const userId = getUserId(userIdParam);
|
|
723
|
-
setGoogleUserId(userId);
|
|
724
479
|
return window.analytics.identify(
|
|
725
480
|
userId,
|
|
726
481
|
checkAnalyticsGdprIsAccepted(gdprPrivacyValue) ? traits : {},
|
|
@@ -764,16 +519,148 @@ if (isClient) {
|
|
|
764
519
|
}
|
|
765
520
|
}
|
|
766
521
|
|
|
522
|
+
// src/middlewares/source/pageReferrer.ts
|
|
523
|
+
var referrerState = {
|
|
524
|
+
spaReferrer: "",
|
|
525
|
+
referrer: ""
|
|
526
|
+
};
|
|
527
|
+
var utils = {
|
|
528
|
+
/**
|
|
529
|
+
* @returns The referrer of the document
|
|
530
|
+
*/
|
|
531
|
+
getDocumentReferrer: () => document.referrer,
|
|
532
|
+
/**
|
|
533
|
+
* @returns The actual location with protocol, domain and pathname
|
|
534
|
+
*/
|
|
535
|
+
getActualLocation: () => {
|
|
536
|
+
const { origin, pathname } = window.location;
|
|
537
|
+
return `${origin}${pathname}`;
|
|
538
|
+
},
|
|
539
|
+
/**
|
|
540
|
+
* @returns The actual query string
|
|
541
|
+
*/
|
|
542
|
+
getActualQueryString: () => {
|
|
543
|
+
const { search } = window.location;
|
|
544
|
+
return search;
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
var getPageReferrer = ({ isPageTrack = false } = {}) => {
|
|
548
|
+
const { referrer, spaReferrer } = referrerState;
|
|
549
|
+
const referrerToUse = isPageTrack ? referrer : spaReferrer;
|
|
550
|
+
return referrerToUse || utils.getDocumentReferrer();
|
|
551
|
+
};
|
|
552
|
+
var updatePageReferrer = () => {
|
|
553
|
+
referrerState.spaReferrer = getPageReferrer({ isPageTrack: true });
|
|
554
|
+
referrerState.referrer = utils.getActualLocation();
|
|
555
|
+
};
|
|
556
|
+
var pageReferrer = ({ payload, next }) => {
|
|
557
|
+
const {
|
|
558
|
+
obj: { context }
|
|
559
|
+
} = payload;
|
|
560
|
+
const { isPageTrack } = context;
|
|
561
|
+
const referrer = getPageReferrer({ isPageTrack });
|
|
562
|
+
payload.obj.context = {
|
|
563
|
+
...context,
|
|
564
|
+
page: {
|
|
565
|
+
...context.page,
|
|
566
|
+
referrer
|
|
567
|
+
}
|
|
568
|
+
};
|
|
569
|
+
if (isPageTrack) {
|
|
570
|
+
updatePageReferrer();
|
|
571
|
+
}
|
|
572
|
+
next(payload);
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
// src/repositories/googleRepository.ts
|
|
576
|
+
var STC = {
|
|
577
|
+
QUERY: "stc",
|
|
578
|
+
SPLIT_SYMBOL: "-",
|
|
579
|
+
CAMPAIGN_SPLIT_SYMBOL: ":"
|
|
580
|
+
};
|
|
581
|
+
var UTM_CAMPAIGN = "utm_campaign";
|
|
582
|
+
var UTM_MEDIUM = "utm_medium";
|
|
583
|
+
var UTM_SOURCE = "utm_source";
|
|
584
|
+
var UTM_CONTENT = "utm_content";
|
|
585
|
+
var UTM_CAMPAIGN_ID = "utm_id";
|
|
586
|
+
var UTM_TERM = "utm_term";
|
|
587
|
+
var STC_MEDIUM_TRANSFORMATIONS = {
|
|
588
|
+
aff: "affiliate",
|
|
589
|
+
dis: "display",
|
|
590
|
+
em: "email",
|
|
591
|
+
met: "paid-metasearch",
|
|
592
|
+
sem: "paid-search",
|
|
593
|
+
rt: "display",
|
|
594
|
+
sm: "social-media",
|
|
595
|
+
sp: "paid-social",
|
|
596
|
+
pn: "push-notification",
|
|
597
|
+
cs: "cross-sites"
|
|
598
|
+
};
|
|
599
|
+
var STC_INVALID_CONTENT = "na";
|
|
600
|
+
var EMPTY_STC = { medium: null, source: null, campaign: null };
|
|
601
|
+
var trackingTagsTypes = {
|
|
602
|
+
STC: "stc",
|
|
603
|
+
UTM: "utm"
|
|
604
|
+
};
|
|
605
|
+
var getCampaignDetails = ({ needsTransformation = true } = {}) => {
|
|
606
|
+
const { medium, source, campaign, content, term } = readQueryParams();
|
|
607
|
+
if (!medium || !source || !campaign) return null;
|
|
608
|
+
const [id, name] = campaign.split(STC.CAMPAIGN_SPLIT_SYMBOL);
|
|
609
|
+
if (!id && !name) return null;
|
|
610
|
+
const needsContent = typeof content !== "undefined" && content !== STC_INVALID_CONTENT;
|
|
611
|
+
return {
|
|
612
|
+
campaign: {
|
|
613
|
+
medium: needsTransformation && STC_MEDIUM_TRANSFORMATIONS[medium] || medium,
|
|
614
|
+
...typeof name !== "undefined" && { id },
|
|
615
|
+
name: name ?? id,
|
|
616
|
+
source,
|
|
617
|
+
...needsContent && { content },
|
|
618
|
+
...typeof term !== "undefined" && { term }
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
};
|
|
622
|
+
function readQueryParams() {
|
|
623
|
+
const search = utils.getActualQueryString();
|
|
624
|
+
const searchParams = new URLSearchParams(search);
|
|
625
|
+
return getConfig("trackingTagsType") === trackingTagsTypes.UTM ? readFromUtm(searchParams) : readFromStc(searchParams);
|
|
626
|
+
}
|
|
627
|
+
function readFromStc(searchParams) {
|
|
628
|
+
if (!hasStc(searchParams)) return EMPTY_STC;
|
|
629
|
+
const stc = searchParams.get(STC.QUERY);
|
|
630
|
+
const [medium, source, campaign, content, term] = stc?.split(STC.SPLIT_SYMBOL) || [];
|
|
631
|
+
return { medium, source, campaign, content, term };
|
|
632
|
+
}
|
|
633
|
+
function hasStc(searchParams) {
|
|
634
|
+
return searchParams.has(STC.QUERY);
|
|
635
|
+
}
|
|
636
|
+
function readFromUtm(searchParams) {
|
|
637
|
+
const campaignId = searchParams.get(UTM_CAMPAIGN_ID);
|
|
638
|
+
const campaignName = searchParams.get(UTM_CAMPAIGN);
|
|
639
|
+
const medium = searchParams.get(UTM_MEDIUM);
|
|
640
|
+
const source = searchParams.get(UTM_SOURCE);
|
|
641
|
+
const content = searchParams.get(UTM_CONTENT);
|
|
642
|
+
const term = searchParams.get(UTM_TERM);
|
|
643
|
+
const campaign = campaignId ? `${campaignId}${STC.CAMPAIGN_SPLIT_SYMBOL}${campaignName}` : campaignName;
|
|
644
|
+
const missingAnyMandatoryFields = !medium || !source || !campaign;
|
|
645
|
+
if (missingAnyMandatoryFields && hasStc(searchParams)) {
|
|
646
|
+
return readFromStc(searchParams);
|
|
647
|
+
}
|
|
648
|
+
return {
|
|
649
|
+
campaign,
|
|
650
|
+
medium,
|
|
651
|
+
source,
|
|
652
|
+
content: content ?? void 0,
|
|
653
|
+
term: term ?? void 0
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
|
|
767
657
|
// src/middlewares/source/campaignContext.ts
|
|
768
658
|
var campaignContext = ({ payload, next }) => {
|
|
769
|
-
const
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
...campaignDetails
|
|
775
|
-
};
|
|
776
|
-
}
|
|
659
|
+
const campaignDetails = getCampaignDetails();
|
|
660
|
+
payload.obj.context = {
|
|
661
|
+
...payload.obj.context,
|
|
662
|
+
...campaignDetails
|
|
663
|
+
};
|
|
777
664
|
next(payload);
|
|
778
665
|
};
|
|
779
666
|
|
|
@@ -1001,6 +888,11 @@ var TCFEvents = /* @__PURE__ */ ((TCFEvents2) => {
|
|
|
1001
888
|
return TCFEvents2;
|
|
1002
889
|
})(TCFEvents || {});
|
|
1003
890
|
|
|
891
|
+
// src/events.ts
|
|
892
|
+
var EVENTS = {
|
|
893
|
+
GA4_INIT_EVENT_SENT: "ga4InitEventSent"
|
|
894
|
+
};
|
|
895
|
+
|
|
1004
896
|
// src/utils/storage.ts
|
|
1005
897
|
var storage = ({
|
|
1006
898
|
type = "localStorage",
|
|
@@ -1066,36 +958,11 @@ var addMiddlewares = () => {
|
|
|
1066
958
|
}
|
|
1067
959
|
};
|
|
1068
960
|
if (isClient && window.analytics) {
|
|
1069
|
-
const googleAnalyticsMeasurementId = getConfig("googleAnalyticsMeasurementId");
|
|
1070
|
-
const dataLayerName = getConfig("googleAnalyticsDataLayer") || DEFAULT_DATA_LAYER_NAME;
|
|
1071
|
-
const needsConsentManagement = getConfig("googleAnalyticsConsentManagement");
|
|
1072
|
-
if (googleAnalyticsMeasurementId) {
|
|
1073
|
-
const googleAnalyticsConfig = getConfig("googleAnalyticsConfig");
|
|
1074
|
-
window[dataLayerName] = window[dataLayerName] || [];
|
|
1075
|
-
window.gtag = window.gtag || function gtag() {
|
|
1076
|
-
;
|
|
1077
|
-
window[dataLayerName].push(arguments);
|
|
1078
|
-
};
|
|
1079
|
-
window.gtag("js", /* @__PURE__ */ new Date());
|
|
1080
|
-
if (needsConsentManagement) {
|
|
1081
|
-
sendGoogleConsents();
|
|
1082
|
-
}
|
|
1083
|
-
window.gtag("config", googleAnalyticsMeasurementId, {
|
|
1084
|
-
cookie_prefix: "segment",
|
|
1085
|
-
send_page_view: false,
|
|
1086
|
-
...googleAnalyticsConfig,
|
|
1087
|
-
...getCampaignDetails()
|
|
1088
|
-
});
|
|
1089
|
-
loadGoogleAnalytics().catch((error) => {
|
|
1090
|
-
console.error("[segment-wrapper] Failed to load Google Analytics", error);
|
|
1091
|
-
});
|
|
1092
|
-
}
|
|
1093
961
|
window.analytics.ready(checkAnonymousId);
|
|
1094
962
|
window.analytics.addSourceMiddleware ? addMiddlewares() : window.analytics.ready(addMiddlewares);
|
|
1095
963
|
}
|
|
1096
964
|
var index_default = segmentWrapper_default;
|
|
1097
965
|
export {
|
|
1098
|
-
CONSENT_STATES,
|
|
1099
966
|
EVENTS,
|
|
1100
967
|
TCFEvents,
|
|
1101
968
|
UserGDPR,
|
|
@@ -1105,6 +972,7 @@ export {
|
|
|
1105
972
|
index_default as default,
|
|
1106
973
|
getAdobeMCVisitorID,
|
|
1107
974
|
getAdobeVisitorData,
|
|
975
|
+
getCampaignDetails,
|
|
1108
976
|
getConfig,
|
|
1109
977
|
getStorageItem,
|
|
1110
978
|
getUniversalId,
|
|
@@ -1119,5 +987,6 @@ export {
|
|
|
1119
987
|
setConfig,
|
|
1120
988
|
setStorageItem,
|
|
1121
989
|
storage,
|
|
1122
|
-
toCookieDomain
|
|
990
|
+
toCookieDomain,
|
|
991
|
+
trackingTagsTypes
|
|
1123
992
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adv-re/segment-wrapper",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-beta.0",
|
|
4
4
|
"description": "Modern TypeScript abstraction layer on top of the Segment library",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"./src/utils/patchAnalytics.ts",
|
|
@@ -63,4 +63,4 @@
|
|
|
63
63
|
},
|
|
64
64
|
"author": "",
|
|
65
65
|
"license": "ISC"
|
|
66
|
-
}
|
|
66
|
+
}
|