@schibsted/sps-sdk 3.0.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/dist/cjs/actions/dismiss.d.ts +6 -0
- package/dist/cjs/actions/dismiss.js +102 -0
- package/dist/cjs/actions/dismiss.js.map +1 -0
- package/dist/cjs/apiClient.d.ts +89 -0
- package/dist/cjs/apiClient.js +98 -0
- package/dist/cjs/apiClient.js.map +1 -0
- package/dist/cjs/index.d.ts +17 -0
- package/dist/cjs/index.js +34 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/sps/endpoint.d.ts +7 -0
- package/dist/cjs/sps/endpoint.js +42 -0
- package/dist/cjs/sps/endpoint.js.map +1 -0
- package/dist/cjs/sps/placement.d.ts +62 -0
- package/dist/cjs/sps/placement.js +3 -0
- package/dist/cjs/sps/placement.js.map +1 -0
- package/dist/cjs/sps/publication.d.ts +23 -0
- package/dist/cjs/sps/publication.js +28 -0
- package/dist/cjs/sps/publication.js.map +1 -0
- package/dist/cjs/sps/queryBuilder.d.ts +21 -0
- package/dist/cjs/sps/queryBuilder.js +31 -0
- package/dist/cjs/sps/queryBuilder.js.map +1 -0
- package/dist/cjs/sps/rewrite-salesposter-variables.d.ts +35 -0
- package/dist/cjs/sps/rewrite-salesposter-variables.js +112 -0
- package/dist/cjs/sps/rewrite-salesposter-variables.js.map +1 -0
- package/dist/cjs/sps.d.ts +234 -0
- package/dist/cjs/sps.js +237 -0
- package/dist/cjs/sps.js.map +1 -0
- package/dist/cjs/tracking/create-tracking-params.d.ts +116 -0
- package/dist/cjs/tracking/create-tracking-params.js +62 -0
- package/dist/cjs/tracking/create-tracking-params.js.map +1 -0
- package/dist/cjs/tracking/poster-data-to-pulse-object.d.ts +22 -0
- package/dist/cjs/tracking/poster-data-to-pulse-object.js +32 -0
- package/dist/cjs/tracking/poster-data-to-pulse-object.js.map +1 -0
- package/dist/cjs/tracking/tracking-to-pulse-origin.d.ts +14 -0
- package/dist/cjs/tracking/tracking-to-pulse-origin.js +15 -0
- package/dist/cjs/tracking/tracking-to-pulse-origin.js.map +1 -0
- package/dist/cjs/tracking/tracking-to-search-params.d.ts +10 -0
- package/dist/cjs/tracking/tracking-to-search-params.js +26 -0
- package/dist/cjs/tracking/tracking-to-search-params.js.map +1 -0
- package/dist/cjs/utils/pulse.d.ts +15 -0
- package/dist/cjs/utils/pulse.js +27 -0
- package/dist/cjs/utils/pulse.js.map +1 -0
- package/dist/cjs/utils/pulseProxy.d.ts +30 -0
- package/dist/cjs/utils/pulseProxy.js +28 -0
- package/dist/cjs/utils/pulseProxy.js.map +1 -0
- package/dist/cjs/utils/source.d.ts +9 -0
- package/dist/cjs/utils/source.js +113 -0
- package/dist/cjs/utils/source.js.map +1 -0
- package/dist/cjs/utils/url.d.ts +3 -0
- package/dist/cjs/utils/url.js +16 -0
- package/dist/cjs/utils/url.js.map +1 -0
- package/dist/cjs/utils/utm.d.ts +19 -0
- package/dist/cjs/utils/utm.js +30 -0
- package/dist/cjs/utils/utm.js.map +1 -0
- package/dist/cjs/utils/xDomainId.d.ts +1 -0
- package/dist/cjs/utils/xDomainId.js +14 -0
- package/dist/cjs/utils/xDomainId.js.map +1 -0
- package/dist/esm/actions/dismiss.d.ts +6 -0
- package/dist/esm/actions/dismiss.js +96 -0
- package/dist/esm/actions/dismiss.js.map +1 -0
- package/dist/esm/apiClient.d.ts +89 -0
- package/dist/esm/apiClient.js +93 -0
- package/dist/esm/apiClient.js.map +1 -0
- package/dist/esm/index.d.ts +17 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/sps/endpoint.d.ts +7 -0
- package/dist/esm/sps/endpoint.js +37 -0
- package/dist/esm/sps/endpoint.js.map +1 -0
- package/dist/esm/sps/placement.d.ts +62 -0
- package/dist/esm/sps/placement.js +2 -0
- package/dist/esm/sps/placement.js.map +1 -0
- package/dist/esm/sps/publication.d.ts +23 -0
- package/dist/esm/sps/publication.js +25 -0
- package/dist/esm/sps/publication.js.map +1 -0
- package/dist/esm/sps/queryBuilder.d.ts +21 -0
- package/dist/esm/sps/queryBuilder.js +26 -0
- package/dist/esm/sps/queryBuilder.js.map +1 -0
- package/dist/esm/sps/rewrite-salesposter-variables.d.ts +35 -0
- package/dist/esm/sps/rewrite-salesposter-variables.js +106 -0
- package/dist/esm/sps/rewrite-salesposter-variables.js.map +1 -0
- package/dist/esm/sps.d.ts +234 -0
- package/dist/esm/sps.js +234 -0
- package/dist/esm/sps.js.map +1 -0
- package/dist/esm/tracking/create-tracking-params.d.ts +116 -0
- package/dist/esm/tracking/create-tracking-params.js +59 -0
- package/dist/esm/tracking/create-tracking-params.js.map +1 -0
- package/dist/esm/tracking/poster-data-to-pulse-object.d.ts +22 -0
- package/dist/esm/tracking/poster-data-to-pulse-object.js +29 -0
- package/dist/esm/tracking/poster-data-to-pulse-object.js.map +1 -0
- package/dist/esm/tracking/tracking-to-pulse-origin.d.ts +14 -0
- package/dist/esm/tracking/tracking-to-pulse-origin.js +12 -0
- package/dist/esm/tracking/tracking-to-pulse-origin.js.map +1 -0
- package/dist/esm/tracking/tracking-to-search-params.d.ts +10 -0
- package/dist/esm/tracking/tracking-to-search-params.js +23 -0
- package/dist/esm/tracking/tracking-to-search-params.js.map +1 -0
- package/dist/esm/utils/pulse.d.ts +15 -0
- package/dist/esm/utils/pulse.js +24 -0
- package/dist/esm/utils/pulse.js.map +1 -0
- package/dist/esm/utils/pulseProxy.d.ts +30 -0
- package/dist/esm/utils/pulseProxy.js +24 -0
- package/dist/esm/utils/pulseProxy.js.map +1 -0
- package/dist/esm/utils/source.d.ts +9 -0
- package/dist/esm/utils/source.js +108 -0
- package/dist/esm/utils/source.js.map +1 -0
- package/dist/esm/utils/url.d.ts +3 -0
- package/dist/esm/utils/url.js +10 -0
- package/dist/esm/utils/url.js.map +1 -0
- package/dist/esm/utils/utm.d.ts +19 -0
- package/dist/esm/utils/utm.js +27 -0
- package/dist/esm/utils/utm.js.map +1 -0
- package/dist/esm/utils/xDomainId.d.ts +1 -0
- package/dist/esm/utils/xDomainId.js +10 -0
- package/dist/esm/utils/xDomainId.js.map +1 -0
- package/dist/public-scripts/pulse-tracker-proxy.v0.1.0.min.js +1 -0
- package/dist/public-scripts/sps-pulse-helpers.v0.2.0.min.js +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { type PulseTracker } from "../utils/pulse.js";
|
|
2
|
+
import { type UtmTags } from "../utils/utm.js";
|
|
3
|
+
import { type PulseOrigin } from "./tracking-to-pulse-origin.js";
|
|
4
|
+
import { type PulseObject } from "./poster-data-to-pulse-object.js";
|
|
5
|
+
export type ContentType = "article" | "podcast" | "video" | "other";
|
|
6
|
+
export type DeviceType = "mobile" | "tablet" | "desktop";
|
|
7
|
+
/**
|
|
8
|
+
* Input options for {@link createTrackingParams}.
|
|
9
|
+
*/
|
|
10
|
+
export interface TrackingParamsProps {
|
|
11
|
+
/**
|
|
12
|
+
* The ID of the content the salesposter is displayed on, e.g. an article ID.
|
|
13
|
+
* */
|
|
14
|
+
contentId: string;
|
|
15
|
+
/**
|
|
16
|
+
* The type of content the salesposter is displayed on.
|
|
17
|
+
*/
|
|
18
|
+
contentType: ContentType;
|
|
19
|
+
/**
|
|
20
|
+
* Used to pass any additional parameters to the salesposter as query parameters.
|
|
21
|
+
*/
|
|
22
|
+
additionalParams?: Record<string, string>;
|
|
23
|
+
/**
|
|
24
|
+
* If `true`, `'-lead'` will be postfixed to the `utm_content` parameter.
|
|
25
|
+
*/
|
|
26
|
+
appendSalesLead?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* The browser document object.
|
|
29
|
+
* */
|
|
30
|
+
document: {
|
|
31
|
+
referrer: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Used for `utm_medium` if no other `utm_medium` is provided.
|
|
35
|
+
* Example values: `'metered'`, `'subscription'`.
|
|
36
|
+
* NOTE: Potentially deprecated.
|
|
37
|
+
*/
|
|
38
|
+
paywallType?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Overrides the default `utm_url` parameter.
|
|
41
|
+
* Note: Still overridden by any `utm_url` present in search-params or `utmTagOverrides`.
|
|
42
|
+
*/
|
|
43
|
+
utmUrlDefault?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Pass to override UTM params, or when they are not present in `window.location.href`.
|
|
46
|
+
*/
|
|
47
|
+
utmTagOverrides?: UtmTags;
|
|
48
|
+
/**
|
|
49
|
+
* The browser window object.
|
|
50
|
+
*/
|
|
51
|
+
window: {
|
|
52
|
+
location: {
|
|
53
|
+
href: string;
|
|
54
|
+
search: string;
|
|
55
|
+
};
|
|
56
|
+
pulse?: (tracker: PulseTracker) => void;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Custom fields to add to the Pulse `.object` field returned from the SDK.
|
|
60
|
+
*/
|
|
61
|
+
pulseObject?: Omit<PulseObject, "accessLevel" | "accessLevelName" | "salesPosterType" | "category" | "tags" | "url">;
|
|
62
|
+
}
|
|
63
|
+
export interface PosterData {
|
|
64
|
+
placementType: string;
|
|
65
|
+
campaign: string;
|
|
66
|
+
articleType?: string;
|
|
67
|
+
section?: string;
|
|
68
|
+
tags?: string[];
|
|
69
|
+
abTestGroup?: string;
|
|
70
|
+
failReason?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* UTM-style tracking parameters and metadata derived from the current page context
|
|
74
|
+
* and the SPS placement response. Included in every {@link Poster} response.
|
|
75
|
+
*/
|
|
76
|
+
export interface TrackingData {
|
|
77
|
+
utm_source: string;
|
|
78
|
+
utm_medium?: string;
|
|
79
|
+
utm_content: string;
|
|
80
|
+
utm_campaign: string;
|
|
81
|
+
utm_term?: string;
|
|
82
|
+
utm_url: string;
|
|
83
|
+
content_id: string;
|
|
84
|
+
type: ContentType;
|
|
85
|
+
x_domain_id?: `${string}-${string}-${string}-${string}-${string}`;
|
|
86
|
+
x_env_id?: string;
|
|
87
|
+
failReason?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Offer-level tracking fields appended to the purchase-flow URL by the SDK.
|
|
91
|
+
*/
|
|
92
|
+
export interface OfferTrackingData {
|
|
93
|
+
offer_placement?: string;
|
|
94
|
+
offer_type?: string;
|
|
95
|
+
offer_campaign?: string;
|
|
96
|
+
offer_test_group?: string;
|
|
97
|
+
offer_cta?: string;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The full tracking context returned by {@link createTrackingParams}, containing all
|
|
101
|
+
* representations of the tracking data needed for Pulse events and purchase-flow links.
|
|
102
|
+
*/
|
|
103
|
+
export interface SalesposterTrackingParamsResponse {
|
|
104
|
+
trackingData: TrackingData;
|
|
105
|
+
pulseOrigin: PulseOrigin;
|
|
106
|
+
pulseObject: PulseObject;
|
|
107
|
+
searchParams: URLSearchParams;
|
|
108
|
+
offerData: OfferTrackingData;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates the tracking parameters for use towards purchase flow
|
|
112
|
+
* @param options {@link TrackingParamsProps}
|
|
113
|
+
* @param posterData The metadata for the placement that will be used for tracking unless overridden. If passed, a pulse object will also be generated.
|
|
114
|
+
* @returns The full tracking context including UTM parameters, Pulse objects, and search params.
|
|
115
|
+
*/
|
|
116
|
+
export declare function createTrackingParams(options: TrackingParamsProps, posterData?: PosterData): Promise<SalesposterTrackingParamsResponse>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getEnvIdFromPulseTracker } from "../utils/pulse.js";
|
|
2
|
+
import { getSourceFromDocument } from "../utils/source.js";
|
|
3
|
+
import { sanitizeQueryParam } from "../utils/url.js";
|
|
4
|
+
import { getUtmFromUrl } from "../utils/utm.js";
|
|
5
|
+
import { generateXDomainId } from "../utils/xDomainId.js";
|
|
6
|
+
import { trackingToPulseOrigin } from "./tracking-to-pulse-origin.js";
|
|
7
|
+
import { trackingToSearchParams } from "./tracking-to-search-params.js";
|
|
8
|
+
import { posterDataToPulseObject } from "./poster-data-to-pulse-object.js";
|
|
9
|
+
const NO_DATA = "";
|
|
10
|
+
/**
|
|
11
|
+
* Creates the tracking parameters for use towards purchase flow
|
|
12
|
+
* @param options {@link TrackingParamsProps}
|
|
13
|
+
* @param posterData The metadata for the placement that will be used for tracking unless overridden. If passed, a pulse object will also be generated.
|
|
14
|
+
* @returns The full tracking context including UTM parameters, Pulse objects, and search params.
|
|
15
|
+
*/
|
|
16
|
+
export async function createTrackingParams(options, posterData) {
|
|
17
|
+
const { contentId, contentType, appendSalesLead = false, paywallType = "", additionalParams, utmTagOverrides, utmUrlDefault, pulseObject: pulseObjectParams, document: _document, window: _window, } = options;
|
|
18
|
+
const xEnvId = await getEnvIdFromPulseTracker(options.window);
|
|
19
|
+
const xDomainId = generateXDomainId();
|
|
20
|
+
const { campaign, placementType, articleType, abTestGroup } = posterData || {};
|
|
21
|
+
const salesLeadFlag = appendSalesLead ? "-lead" : "";
|
|
22
|
+
const utmFromUrl = getUtmFromUrl(options.window.location.href);
|
|
23
|
+
const { utm_content = utmFromUrl["utm_content"] || "", utm_campaign = utmFromUrl["utm_campaign"] || "", utm_source = utmFromUrl["utm_source"] || "", utm_medium = utmFromUrl["utm_medium"] || "", utm_term = utmFromUrl["utm_term"] || "",
|
|
24
|
+
// utm_url defaults to the current page
|
|
25
|
+
utm_url = utmUrlDefault || options.window.location.href.split(/[?#]/)[0].replace(/\/$/, ""), } = utmTagOverrides ?? {};
|
|
26
|
+
const utmMediumFromPlacementType = placementType === "coreheader" ? "navbar" : placementType;
|
|
27
|
+
const trackingData = {
|
|
28
|
+
utm_source: utm_source
|
|
29
|
+
? sanitizeQueryParam(utm_source)
|
|
30
|
+
: getSourceFromDocument(_document, _window),
|
|
31
|
+
utm_medium: sanitizeQueryParam(utm_medium) || paywallType || utmMediumFromPlacementType || NO_DATA,
|
|
32
|
+
utm_content: (sanitizeQueryParam(utm_content) || articleType || NO_DATA) + salesLeadFlag,
|
|
33
|
+
utm_campaign: sanitizeQueryParam(utm_campaign) || campaign || NO_DATA,
|
|
34
|
+
utm_term: sanitizeQueryParam(utm_term) || NO_DATA,
|
|
35
|
+
utm_url: sanitizeQueryParam(utm_url) || NO_DATA,
|
|
36
|
+
content_id: contentId || NO_DATA,
|
|
37
|
+
type: contentType,
|
|
38
|
+
x_domain_id: xDomainId,
|
|
39
|
+
x_env_id: xEnvId || NO_DATA,
|
|
40
|
+
// device: deviceType || NO_DATA, Might be added later
|
|
41
|
+
};
|
|
42
|
+
const offerData = {
|
|
43
|
+
offer_placement: placementType,
|
|
44
|
+
offer_type: articleType,
|
|
45
|
+
offer_campaign: campaign,
|
|
46
|
+
offer_test_group: abTestGroup,
|
|
47
|
+
};
|
|
48
|
+
const pulseOrigin = trackingToPulseOrigin(trackingData, posterData?.failReason);
|
|
49
|
+
const pulseObject = posterDataToPulseObject(_window, pulseObjectParams, posterData);
|
|
50
|
+
const searchParams = trackingToSearchParams({ ...trackingData, ...offerData }, additionalParams);
|
|
51
|
+
return {
|
|
52
|
+
trackingData,
|
|
53
|
+
pulseOrigin,
|
|
54
|
+
pulseObject,
|
|
55
|
+
searchParams,
|
|
56
|
+
offerData,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=create-tracking-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-tracking-params.js","sourceRoot":"","sources":["../../../src/tracking/create-tracking-params.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PosterData, TrackingParamsProps } from "./create-tracking-params.js";
|
|
2
|
+
/**
|
|
3
|
+
* .object fields for Pulse. Varying schema for each event, dependent on type of content / placement.
|
|
4
|
+
* @param name Name of the source object (e.g. article name, placement type, etc.)
|
|
5
|
+
* @param authors Only for articles
|
|
6
|
+
* @param wordCount Only for articles
|
|
7
|
+
*/
|
|
8
|
+
export interface PulseObject {
|
|
9
|
+
name: string | null;
|
|
10
|
+
authors: string[] | null;
|
|
11
|
+
wordCount: number | null;
|
|
12
|
+
salesPosterType: string | null;
|
|
13
|
+
accessLevel: string | null;
|
|
14
|
+
accessLevelName: string | null;
|
|
15
|
+
category: string | null;
|
|
16
|
+
tags: string[] | null;
|
|
17
|
+
url: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Converts the poster data passed to SPS to the object parameters usable by the pulse-tracker
|
|
21
|
+
*/
|
|
22
|
+
export declare function posterDataToPulseObject(window: TrackingParamsProps["window"], pulseObject?: TrackingParamsProps["pulseObject"], data?: PosterData): PulseObject;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const accessLevelMap = (articleType) => {
|
|
2
|
+
switch (articleType) {
|
|
3
|
+
case "closed":
|
|
4
|
+
case "true":
|
|
5
|
+
case "metered":
|
|
6
|
+
case "subscription":
|
|
7
|
+
return "Paid";
|
|
8
|
+
case "open":
|
|
9
|
+
return "Free";
|
|
10
|
+
default:
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Converts the poster data passed to SPS to the object parameters usable by the pulse-tracker
|
|
16
|
+
*/
|
|
17
|
+
export function posterDataToPulseObject(window, pulseObject, data) {
|
|
18
|
+
const { articleType, section, tags } = data || {};
|
|
19
|
+
return {
|
|
20
|
+
...(pulseObject || { name: null, authors: null, wordCount: null }),
|
|
21
|
+
salesPosterType: accessLevelMap(articleType),
|
|
22
|
+
accessLevel: accessLevelMap(articleType),
|
|
23
|
+
accessLevelName: articleType ?? null,
|
|
24
|
+
category: section ?? null,
|
|
25
|
+
tags: tags ?? null,
|
|
26
|
+
url: window.location.href,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=poster-data-to-pulse-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poster-data-to-pulse-object.js","sourceRoot":"","sources":["../../../src/tracking/poster-data-to-pulse-object.ts"],"names":[],"mappings":"AAoBA,MAAM,cAAc,GAAG,CAAC,WAAoB,EAAE,EAAE;IAC9C,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAqC,EACrC,WAAgD,EAChD,IAAiB;IAEjB,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAElD,OAAO;QACL,GAAG,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAClE,eAAe,EAAE,cAAc,CAAC,WAAW,CAAC;QAC5C,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC;QACxC,eAAe,EAAE,WAAW,IAAI,IAAI;QACpC,QAAQ,EAAE,OAAO,IAAI,IAAI;QACzB,IAAI,EAAE,IAAI,IAAI,IAAI;QAClB,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TrackingData } from "./create-tracking-params.js";
|
|
2
|
+
/**
|
|
3
|
+
* Pulse `.origin` object shape for poster-triggered Pulse events.
|
|
4
|
+
*/
|
|
5
|
+
export interface PulseOrigin {
|
|
6
|
+
campaign: string;
|
|
7
|
+
channel: string | undefined;
|
|
8
|
+
content: string;
|
|
9
|
+
source: string;
|
|
10
|
+
terms: string | undefined;
|
|
11
|
+
xDomainId: `${string}-${string}-${string}-${string}-${string}` | undefined;
|
|
12
|
+
failReason?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function trackingToPulseOrigin(data: TrackingData, failReason?: string): PulseOrigin;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function trackingToPulseOrigin(data, failReason) {
|
|
2
|
+
return {
|
|
3
|
+
campaign: data.utm_campaign,
|
|
4
|
+
channel: data.utm_medium,
|
|
5
|
+
content: data.utm_content,
|
|
6
|
+
source: data.utm_source,
|
|
7
|
+
terms: data.utm_term,
|
|
8
|
+
xDomainId: data.x_domain_id,
|
|
9
|
+
failReason: failReason || undefined,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=tracking-to-pulse-origin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracking-to-pulse-origin.js","sourceRoot":"","sources":["../../../src/tracking/tracking-to-pulse-origin.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,qBAAqB,CAAC,IAAkB,EAAE,UAAmB;IAC3E,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,OAAO,EAAE,IAAI,CAAC,UAAU;QACxB,OAAO,EAAE,IAAI,CAAC,WAAW;QACzB,MAAM,EAAE,IAAI,CAAC,UAAU;QACvB,KAAK,EAAE,IAAI,CAAC,QAAQ;QACpB,SAAS,EAAE,IAAI,CAAC,WAAW;QAC3B,UAAU,EAAE,UAAU,IAAI,SAAS;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OfferTrackingData, TrackingData } from "./create-tracking-params.js";
|
|
2
|
+
/**
|
|
3
|
+
* Transforms the TrackingParams to a URLSearchParams object
|
|
4
|
+
* @param data the TrackingParams object
|
|
5
|
+
* @param additionalParams Any additional parameters to be added to the URLSearchParams
|
|
6
|
+
* @returns URLSearchParams object with the tracking parameters
|
|
7
|
+
*/
|
|
8
|
+
export declare function trackingToSearchParams(data: TrackingData & OfferTrackingData & {
|
|
9
|
+
referer?: string;
|
|
10
|
+
}, additionalParams?: Record<string, string>): URLSearchParams;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms the TrackingParams to a URLSearchParams object
|
|
3
|
+
* @param data the TrackingParams object
|
|
4
|
+
* @param additionalParams Any additional parameters to be added to the URLSearchParams
|
|
5
|
+
* @returns URLSearchParams object with the tracking parameters
|
|
6
|
+
*/
|
|
7
|
+
export function trackingToSearchParams(data, additionalParams) {
|
|
8
|
+
const searchParams = new URLSearchParams();
|
|
9
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
10
|
+
if (typeof value !== "undefined" && value !== "") {
|
|
11
|
+
searchParams.append(key, value);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
if (additionalParams) {
|
|
15
|
+
Object.entries(additionalParams).forEach(([key, value]) => {
|
|
16
|
+
if (typeof value !== "undefined" && value !== "") {
|
|
17
|
+
searchParams.append(key, value);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return searchParams;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=tracking-to-search-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracking-to-search-params.js","sourceRoot":"","sources":["../../../src/tracking/tracking-to-search-params.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAA6D,EAC7D,gBAAyC;IAEzC,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;IAE3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACjD,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACxD,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACjD,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Pulse tracker API shape exposed on `window.pulse`.
|
|
3
|
+
* A callback that receives a tracker instance when the Pulse tracker is ready.
|
|
4
|
+
*/
|
|
5
|
+
export type PulseTracker = (tracker: {
|
|
6
|
+
getEnvironmentId: () => Promise<string>;
|
|
7
|
+
}) => void;
|
|
8
|
+
/**
|
|
9
|
+
* Fetches the environment ID from the Pulse Tracker exposed on window.
|
|
10
|
+
* @param window the browser window object
|
|
11
|
+
* @returns string environment ID if Pulse Tracker is available, otherwise undefined
|
|
12
|
+
*/
|
|
13
|
+
export declare function getEnvIdFromPulseTracker(window: {
|
|
14
|
+
pulse?: (tracker: PulseTracker) => void;
|
|
15
|
+
}): Promise<string | undefined>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetches the environment ID from the Pulse Tracker exposed on window.
|
|
3
|
+
* @param window the browser window object
|
|
4
|
+
* @returns string environment ID if Pulse Tracker is available, otherwise undefined
|
|
5
|
+
*/
|
|
6
|
+
export async function getEnvIdFromPulseTracker(window) {
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
const pulseTracker = window.pulse;
|
|
9
|
+
if (pulseTracker) {
|
|
10
|
+
pulseTracker(async (tracker) => {
|
|
11
|
+
try {
|
|
12
|
+
resolve(await tracker.getEnvironmentId());
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
resolve(undefined);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
resolve(undefined);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=pulse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../../../src/utils/pulse.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAE9C;IACC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;QAClC,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC7B,IAAI,CAAC;oBACH,OAAO,CAAC,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PulseOrigin } from "../tracking/tracking-to-pulse-origin.js";
|
|
2
|
+
import type { PlacementType } from "../sps/placement.js";
|
|
3
|
+
import type { OfferTrackingData } from "../tracking/create-tracking-params.js";
|
|
4
|
+
export interface SPSPulseTrackingParams {
|
|
5
|
+
/**
|
|
6
|
+
* Pulse origin data from tracking data
|
|
7
|
+
*/
|
|
8
|
+
pulseOrigin: PulseOrigin;
|
|
9
|
+
/**
|
|
10
|
+
* Publication name
|
|
11
|
+
*/
|
|
12
|
+
publication: string;
|
|
13
|
+
/**
|
|
14
|
+
* Placement type for the salesposter
|
|
15
|
+
*/
|
|
16
|
+
placementType: PlacementType;
|
|
17
|
+
/**
|
|
18
|
+
* CDN URL for loading pulse proxy scripts, set by the environment argument when initializing the SPS instance
|
|
19
|
+
*/
|
|
20
|
+
cdnUrl: string;
|
|
21
|
+
/**
|
|
22
|
+
* New TPaaS offer tracking params
|
|
23
|
+
*/
|
|
24
|
+
offerData: OfferTrackingData;
|
|
25
|
+
/**
|
|
26
|
+
* Experiment identifier from the SPS response
|
|
27
|
+
*/
|
|
28
|
+
experiment?: string | null;
|
|
29
|
+
}
|
|
30
|
+
export declare const injectPulseProxyScripts: (root: HTMLElement, { pulseOrigin, publication, placementType, cdnUrl, offerData, experiment, }: SPSPulseTrackingParams) => void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const SPS_PULSE_HELPERS_VERSION = "0.2.0";
|
|
2
|
+
const PULSE_TRACKER_PROXY_VERSION = "0.1.0";
|
|
3
|
+
export const injectPulseProxyScripts = (root, { pulseOrigin, publication, placementType, cdnUrl, offerData, experiment, }) => {
|
|
4
|
+
const HELPERS_SRC = `${cdnUrl}/public-scripts/sps-pulse-helpers.v${SPS_PULSE_HELPERS_VERSION}.min.js`;
|
|
5
|
+
const PROXY_SRC = `${cdnUrl}/public-scripts/pulse-tracker-proxy.v${PULSE_TRACKER_PROXY_VERSION}.min.js`;
|
|
6
|
+
const configScript = document.createElement("script");
|
|
7
|
+
configScript.type = "application/json";
|
|
8
|
+
configScript.setAttribute("data-sps-pulse-config", "true");
|
|
9
|
+
configScript.textContent = JSON.stringify({
|
|
10
|
+
pulseOrigin,
|
|
11
|
+
publication,
|
|
12
|
+
placementType,
|
|
13
|
+
offerData,
|
|
14
|
+
...(experiment && { experiment }),
|
|
15
|
+
});
|
|
16
|
+
const helpersScript = document.createElement("script");
|
|
17
|
+
helpersScript.src = HELPERS_SRC;
|
|
18
|
+
const proxyScript = document.createElement("script");
|
|
19
|
+
proxyScript.src = PROXY_SRC;
|
|
20
|
+
root.appendChild(configScript);
|
|
21
|
+
root.appendChild(proxyScript);
|
|
22
|
+
root.appendChild(helpersScript);
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=pulseProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pulseProxy.js","sourceRoot":"","sources":["../../../src/utils/pulseProxy.ts"],"names":[],"mappings":"AAIA,MAAM,yBAAyB,GAAG,OAAO,CAAC;AAC1C,MAAM,2BAA2B,GAAG,OAAO,CAAC;AA6B5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,IAAiB,EACjB,EACE,WAAW,EACX,WAAW,EACX,aAAa,EACb,MAAM,EACN,SAAS,EACT,UAAU,GACa,EACzB,EAAE;IACF,MAAM,WAAW,GAAG,GAAG,MAAM,sCAAsC,yBAAyB,SAAS,CAAC;IACtG,MAAM,SAAS,GAAG,GAAG,MAAM,wCAAwC,2BAA2B,SAAS,CAAC;IAExG,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtD,YAAY,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACvC,YAAY,CAAC,YAAY,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IAC3D,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;QACxC,WAAW;QACX,WAAW;QACX,aAAa;QACb,SAAS;QACT,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC;KAClC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvD,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC;IAEhC,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrD,WAAW,CAAC,GAAG,GAAG,SAAS,CAAC;IAE5B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC/B,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC9B,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;AAClC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const getSourceFromReferrerAndQuery: (referrer: URL, rQuery: string | null) => string;
|
|
2
|
+
export declare const getSourceFromDocument: (_document?: {
|
|
3
|
+
referrer: string;
|
|
4
|
+
}, _window?: {
|
|
5
|
+
location: {
|
|
6
|
+
href: string;
|
|
7
|
+
search: string;
|
|
8
|
+
};
|
|
9
|
+
}) => string;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add brand domains to this list to be able to track the source of the user
|
|
3
|
+
* Keep in mind that the order of the domains matters, as the first match will be used.
|
|
4
|
+
*/
|
|
5
|
+
const internalHostNames = {
|
|
6
|
+
"tv.vg.no": "vgtv", // Must be before vg
|
|
7
|
+
"vg.no": "vg",
|
|
8
|
+
"aftenbladet.no": "sa",
|
|
9
|
+
"bt.no": "bt",
|
|
10
|
+
"e24.no": "e24",
|
|
11
|
+
"vink.aftenposten.no": "vink", // Must be before aftenposten
|
|
12
|
+
"aftenposten.no": "ap",
|
|
13
|
+
"tv.aftonbladet.se": "abtv", // Must be before aftonbladet
|
|
14
|
+
"aftonbladet.se": "ab",
|
|
15
|
+
"svd.se": "svd",
|
|
16
|
+
"omni.se": "omni",
|
|
17
|
+
};
|
|
18
|
+
const externalHostNames = {
|
|
19
|
+
"facebook.com": "facebook",
|
|
20
|
+
"messenger.com": "messenger",
|
|
21
|
+
google: "google",
|
|
22
|
+
instagram: "instagram",
|
|
23
|
+
linkedin: "linkedin",
|
|
24
|
+
"lnkd.in": "linkedin",
|
|
25
|
+
snapchat: "snapchat",
|
|
26
|
+
"sol.no": "sol",
|
|
27
|
+
slack: "slack",
|
|
28
|
+
};
|
|
29
|
+
const referrerInHostList = (host, hostList) => Object.keys(hostList).find((partialHost) => host.includes(partialHost));
|
|
30
|
+
const getMatchingReferrer = (referrer) => {
|
|
31
|
+
let matchingReferrer = referrerInHostList(referrer.host, internalHostNames);
|
|
32
|
+
if (matchingReferrer) {
|
|
33
|
+
return {
|
|
34
|
+
type: "internal",
|
|
35
|
+
matchingReferrer,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
matchingReferrer = referrerInHostList(referrer.host, externalHostNames);
|
|
39
|
+
if (matchingReferrer) {
|
|
40
|
+
return {
|
|
41
|
+
type: "external",
|
|
42
|
+
matchingReferrer,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
type: "",
|
|
47
|
+
matchingReferrer: "",
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
const getInternalSource = (matchingReferrer, referrer) => {
|
|
51
|
+
if (referrer.pathname.search(/^\/?$/) >= 0) {
|
|
52
|
+
return `${internalHostNames[matchingReferrer]}-front`;
|
|
53
|
+
}
|
|
54
|
+
if (referrer.pathname.search(/\/[ai]\/[a-zA-Z0-9]+\//) >= 0) {
|
|
55
|
+
return `${internalHostNames[matchingReferrer]}-article`;
|
|
56
|
+
}
|
|
57
|
+
// Matches /video/123124/ used by vgtv & abtv
|
|
58
|
+
if (referrer.pathname.search(/\/video\/[\d]+\//) >= 0) {
|
|
59
|
+
return `${internalHostNames[matchingReferrer]}-video`;
|
|
60
|
+
}
|
|
61
|
+
// Matches /serier/serie-navn/s1e1/ used by vgtv
|
|
62
|
+
if (referrer.pathname.search(/\/serier\/.*\/s[\d]+e[\d]+\//) >= 0) {
|
|
63
|
+
return `${internalHostNames[matchingReferrer]}-serier`;
|
|
64
|
+
}
|
|
65
|
+
if (referrer.pathname.search(/\/([a-z-]+)[/]?$/) >= 0) {
|
|
66
|
+
return `${internalHostNames[matchingReferrer]}-listing`;
|
|
67
|
+
}
|
|
68
|
+
return `${internalHostNames[matchingReferrer]}-unknown`;
|
|
69
|
+
};
|
|
70
|
+
const getExternalSource = (matchingReferrer, rQuery) => {
|
|
71
|
+
if (rQuery) {
|
|
72
|
+
return `${externalHostNames[matchingReferrer]}-spons`;
|
|
73
|
+
}
|
|
74
|
+
return `${externalHostNames[matchingReferrer]}`;
|
|
75
|
+
};
|
|
76
|
+
export const getSourceFromReferrerAndQuery = (referrer, rQuery) => {
|
|
77
|
+
const { type, matchingReferrer } = getMatchingReferrer(referrer);
|
|
78
|
+
if (type === "internal") {
|
|
79
|
+
return getInternalSource(matchingReferrer, referrer);
|
|
80
|
+
}
|
|
81
|
+
if (type === "external") {
|
|
82
|
+
return getExternalSource(matchingReferrer, rQuery);
|
|
83
|
+
}
|
|
84
|
+
return referrer.hostname.replace(/^www\./, "");
|
|
85
|
+
};
|
|
86
|
+
export const getSourceFromDocument = (_document = document, _window = window) => {
|
|
87
|
+
const documentReferrer = _document.referrer;
|
|
88
|
+
let referrer;
|
|
89
|
+
try {
|
|
90
|
+
referrer = new URL(documentReferrer);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
referrer = null;
|
|
94
|
+
}
|
|
95
|
+
const queryString = _window.location.search.substring(1);
|
|
96
|
+
const searchParams = new URLSearchParams(queryString);
|
|
97
|
+
// r as query-param is used by brands to mark sponsored content. Can probably be deprecated in favor of utm-tags
|
|
98
|
+
const rQuery = searchParams.get("r");
|
|
99
|
+
const utm_source = searchParams.get("utm_source");
|
|
100
|
+
if (utm_source) {
|
|
101
|
+
return utm_source;
|
|
102
|
+
}
|
|
103
|
+
if (!referrer || !referrer.host) {
|
|
104
|
+
return "";
|
|
105
|
+
}
|
|
106
|
+
return getSourceFromReferrerAndQuery(referrer, rQuery);
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/utils/source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const getUrlWithoutParams = (url) => url.split(/[?#]/)[0].replace(/\/$/, "");
|
|
2
|
+
export const addSearchParams = (url, searchParams) => {
|
|
3
|
+
const currentUrl = new URL(url);
|
|
4
|
+
searchParams.forEach((value, key) => {
|
|
5
|
+
currentUrl.searchParams.append(key, value);
|
|
6
|
+
});
|
|
7
|
+
return currentUrl.toString();
|
|
8
|
+
};
|
|
9
|
+
export const sanitizeQueryParam = (str) => str?.replace(/[\s]/gi, "-");
|
|
10
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAU,EAAE,CACzD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,YAA6B,EAAU,EAAE;IACpF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAClC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface UtmTags {
|
|
2
|
+
utm_campaign?: string;
|
|
3
|
+
utm_content?: string;
|
|
4
|
+
utm_medium?: string;
|
|
5
|
+
utm_source?: string;
|
|
6
|
+
utm_term?: string;
|
|
7
|
+
/**
|
|
8
|
+
* The URL of the current page, including query parameters
|
|
9
|
+
*/
|
|
10
|
+
utm_url?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Pass the current URL to get the UTM tags from it
|
|
14
|
+
* It will read the following values: 'utm_source', 'utm_medium',
|
|
15
|
+
'utm_campaign', 'utm_content', 'utm_term' & 'utm_url'.
|
|
16
|
+
* @param url of the current page including query parameters
|
|
17
|
+
* @returns UtmTags object with the UTM tags from the URL
|
|
18
|
+
*/
|
|
19
|
+
export declare function getUtmFromUrl(url: string): UtmTags;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const UTM_ALLOWLIST = [
|
|
2
|
+
"utm_source",
|
|
3
|
+
"utm_medium",
|
|
4
|
+
"utm_campaign",
|
|
5
|
+
"utm_content",
|
|
6
|
+
"utm_term",
|
|
7
|
+
"utm_url",
|
|
8
|
+
];
|
|
9
|
+
/**
|
|
10
|
+
* Pass the current URL to get the UTM tags from it
|
|
11
|
+
* It will read the following values: 'utm_source', 'utm_medium',
|
|
12
|
+
'utm_campaign', 'utm_content', 'utm_term' & 'utm_url'.
|
|
13
|
+
* @param url of the current page including query parameters
|
|
14
|
+
* @returns UtmTags object with the UTM tags from the URL
|
|
15
|
+
*/
|
|
16
|
+
export function getUtmFromUrl(url) {
|
|
17
|
+
const urlObject = new URL(url);
|
|
18
|
+
const utmTags = new URLSearchParams(urlObject.search);
|
|
19
|
+
const result = {};
|
|
20
|
+
UTM_ALLOWLIST.forEach((key) => {
|
|
21
|
+
if (utmTags.has(key)) {
|
|
22
|
+
result[key] = utmTags.get(key);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=utm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utm.js","sourceRoot":"","sources":["../../../src/utils/utm.ts"],"names":[],"mappings":"AAYA,MAAM,aAAa,GAAsB;IACvC,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,aAAa;IACb,UAAU;IACV,SAAS;CACV,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const generateXDomainId: () => `${string}-${string}-${string}-${string}-${string}` | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xDomainId.js","sourceRoot":"","sources":["../../../src/utils/xDomainId.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAEnB,EAAE;IACd,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC"}
|