@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.
Files changed (118) hide show
  1. package/dist/cjs/actions/dismiss.d.ts +6 -0
  2. package/dist/cjs/actions/dismiss.js +102 -0
  3. package/dist/cjs/actions/dismiss.js.map +1 -0
  4. package/dist/cjs/apiClient.d.ts +89 -0
  5. package/dist/cjs/apiClient.js +98 -0
  6. package/dist/cjs/apiClient.js.map +1 -0
  7. package/dist/cjs/index.d.ts +17 -0
  8. package/dist/cjs/index.js +34 -0
  9. package/dist/cjs/index.js.map +1 -0
  10. package/dist/cjs/package.json +1 -0
  11. package/dist/cjs/sps/endpoint.d.ts +7 -0
  12. package/dist/cjs/sps/endpoint.js +42 -0
  13. package/dist/cjs/sps/endpoint.js.map +1 -0
  14. package/dist/cjs/sps/placement.d.ts +62 -0
  15. package/dist/cjs/sps/placement.js +3 -0
  16. package/dist/cjs/sps/placement.js.map +1 -0
  17. package/dist/cjs/sps/publication.d.ts +23 -0
  18. package/dist/cjs/sps/publication.js +28 -0
  19. package/dist/cjs/sps/publication.js.map +1 -0
  20. package/dist/cjs/sps/queryBuilder.d.ts +21 -0
  21. package/dist/cjs/sps/queryBuilder.js +31 -0
  22. package/dist/cjs/sps/queryBuilder.js.map +1 -0
  23. package/dist/cjs/sps/rewrite-salesposter-variables.d.ts +35 -0
  24. package/dist/cjs/sps/rewrite-salesposter-variables.js +112 -0
  25. package/dist/cjs/sps/rewrite-salesposter-variables.js.map +1 -0
  26. package/dist/cjs/sps.d.ts +234 -0
  27. package/dist/cjs/sps.js +237 -0
  28. package/dist/cjs/sps.js.map +1 -0
  29. package/dist/cjs/tracking/create-tracking-params.d.ts +116 -0
  30. package/dist/cjs/tracking/create-tracking-params.js +62 -0
  31. package/dist/cjs/tracking/create-tracking-params.js.map +1 -0
  32. package/dist/cjs/tracking/poster-data-to-pulse-object.d.ts +22 -0
  33. package/dist/cjs/tracking/poster-data-to-pulse-object.js +32 -0
  34. package/dist/cjs/tracking/poster-data-to-pulse-object.js.map +1 -0
  35. package/dist/cjs/tracking/tracking-to-pulse-origin.d.ts +14 -0
  36. package/dist/cjs/tracking/tracking-to-pulse-origin.js +15 -0
  37. package/dist/cjs/tracking/tracking-to-pulse-origin.js.map +1 -0
  38. package/dist/cjs/tracking/tracking-to-search-params.d.ts +10 -0
  39. package/dist/cjs/tracking/tracking-to-search-params.js +26 -0
  40. package/dist/cjs/tracking/tracking-to-search-params.js.map +1 -0
  41. package/dist/cjs/utils/pulse.d.ts +15 -0
  42. package/dist/cjs/utils/pulse.js +27 -0
  43. package/dist/cjs/utils/pulse.js.map +1 -0
  44. package/dist/cjs/utils/pulseProxy.d.ts +30 -0
  45. package/dist/cjs/utils/pulseProxy.js +28 -0
  46. package/dist/cjs/utils/pulseProxy.js.map +1 -0
  47. package/dist/cjs/utils/source.d.ts +9 -0
  48. package/dist/cjs/utils/source.js +113 -0
  49. package/dist/cjs/utils/source.js.map +1 -0
  50. package/dist/cjs/utils/url.d.ts +3 -0
  51. package/dist/cjs/utils/url.js +16 -0
  52. package/dist/cjs/utils/url.js.map +1 -0
  53. package/dist/cjs/utils/utm.d.ts +19 -0
  54. package/dist/cjs/utils/utm.js +30 -0
  55. package/dist/cjs/utils/utm.js.map +1 -0
  56. package/dist/cjs/utils/xDomainId.d.ts +1 -0
  57. package/dist/cjs/utils/xDomainId.js +14 -0
  58. package/dist/cjs/utils/xDomainId.js.map +1 -0
  59. package/dist/esm/actions/dismiss.d.ts +6 -0
  60. package/dist/esm/actions/dismiss.js +96 -0
  61. package/dist/esm/actions/dismiss.js.map +1 -0
  62. package/dist/esm/apiClient.d.ts +89 -0
  63. package/dist/esm/apiClient.js +93 -0
  64. package/dist/esm/apiClient.js.map +1 -0
  65. package/dist/esm/index.d.ts +17 -0
  66. package/dist/esm/index.js +18 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/sps/endpoint.d.ts +7 -0
  69. package/dist/esm/sps/endpoint.js +37 -0
  70. package/dist/esm/sps/endpoint.js.map +1 -0
  71. package/dist/esm/sps/placement.d.ts +62 -0
  72. package/dist/esm/sps/placement.js +2 -0
  73. package/dist/esm/sps/placement.js.map +1 -0
  74. package/dist/esm/sps/publication.d.ts +23 -0
  75. package/dist/esm/sps/publication.js +25 -0
  76. package/dist/esm/sps/publication.js.map +1 -0
  77. package/dist/esm/sps/queryBuilder.d.ts +21 -0
  78. package/dist/esm/sps/queryBuilder.js +26 -0
  79. package/dist/esm/sps/queryBuilder.js.map +1 -0
  80. package/dist/esm/sps/rewrite-salesposter-variables.d.ts +35 -0
  81. package/dist/esm/sps/rewrite-salesposter-variables.js +106 -0
  82. package/dist/esm/sps/rewrite-salesposter-variables.js.map +1 -0
  83. package/dist/esm/sps.d.ts +234 -0
  84. package/dist/esm/sps.js +234 -0
  85. package/dist/esm/sps.js.map +1 -0
  86. package/dist/esm/tracking/create-tracking-params.d.ts +116 -0
  87. package/dist/esm/tracking/create-tracking-params.js +59 -0
  88. package/dist/esm/tracking/create-tracking-params.js.map +1 -0
  89. package/dist/esm/tracking/poster-data-to-pulse-object.d.ts +22 -0
  90. package/dist/esm/tracking/poster-data-to-pulse-object.js +29 -0
  91. package/dist/esm/tracking/poster-data-to-pulse-object.js.map +1 -0
  92. package/dist/esm/tracking/tracking-to-pulse-origin.d.ts +14 -0
  93. package/dist/esm/tracking/tracking-to-pulse-origin.js +12 -0
  94. package/dist/esm/tracking/tracking-to-pulse-origin.js.map +1 -0
  95. package/dist/esm/tracking/tracking-to-search-params.d.ts +10 -0
  96. package/dist/esm/tracking/tracking-to-search-params.js +23 -0
  97. package/dist/esm/tracking/tracking-to-search-params.js.map +1 -0
  98. package/dist/esm/utils/pulse.d.ts +15 -0
  99. package/dist/esm/utils/pulse.js +24 -0
  100. package/dist/esm/utils/pulse.js.map +1 -0
  101. package/dist/esm/utils/pulseProxy.d.ts +30 -0
  102. package/dist/esm/utils/pulseProxy.js +24 -0
  103. package/dist/esm/utils/pulseProxy.js.map +1 -0
  104. package/dist/esm/utils/source.d.ts +9 -0
  105. package/dist/esm/utils/source.js +108 -0
  106. package/dist/esm/utils/source.js.map +1 -0
  107. package/dist/esm/utils/url.d.ts +3 -0
  108. package/dist/esm/utils/url.js +10 -0
  109. package/dist/esm/utils/url.js.map +1 -0
  110. package/dist/esm/utils/utm.d.ts +19 -0
  111. package/dist/esm/utils/utm.js +27 -0
  112. package/dist/esm/utils/utm.js.map +1 -0
  113. package/dist/esm/utils/xDomainId.d.ts +1 -0
  114. package/dist/esm/utils/xDomainId.js +10 -0
  115. package/dist/esm/utils/xDomainId.js.map +1 -0
  116. package/dist/public-scripts/pulse-tracker-proxy.v0.1.0.min.js +1 -0
  117. package/dist/public-scripts/sps-pulse-helpers.v0.2.0.min.js +1 -0
  118. 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,3 @@
1
+ export declare const getUrlWithoutParams: (url: string) => string;
2
+ export declare const addSearchParams: (url: string, searchParams: URLSearchParams) => string;
3
+ export declare const sanitizeQueryParam: (str: string) => string;
@@ -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,10 @@
1
+ export const generateXDomainId = () => {
2
+ try {
3
+ return crypto?.randomUUID();
4
+ }
5
+ catch (error) {
6
+ console.error("Salesposter-utils: Error generating xDomainId", error);
7
+ return undefined;
8
+ }
9
+ };
10
+ //# sourceMappingURL=xDomainId.js.map
@@ -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"}