@schibsted/sps-sdk 4.10.1 → 4.11.0-CBT-19898.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/actions/dismiss.d.ts +13 -1
- package/dist/cjs/actions/dismiss.js +13 -1
- package/dist/cjs/actions/dismiss.js.map +1 -1
- package/dist/cjs/apiClient.d.ts +15 -4
- package/dist/cjs/apiClient.js +6 -4
- package/dist/cjs/apiClient.js.map +1 -1
- package/dist/cjs/sps/placement.d.ts +14 -1
- package/dist/cjs/sps/placement.js.map +1 -1
- package/dist/cjs/sps.d.ts +18 -4
- package/dist/cjs/sps.js +26 -6
- package/dist/cjs/sps.js.map +1 -1
- package/dist/cjs/utils/placementCookies.d.ts +2 -0
- package/dist/cjs/utils/placementCookies.js +25 -1
- package/dist/cjs/utils/placementCookies.js.map +1 -1
- package/dist/esm/actions/dismiss.d.ts +13 -1
- package/dist/esm/actions/dismiss.js +14 -2
- package/dist/esm/actions/dismiss.js.map +1 -1
- package/dist/esm/apiClient.d.ts +15 -4
- package/dist/esm/apiClient.js +6 -4
- package/dist/esm/apiClient.js.map +1 -1
- package/dist/esm/sps/placement.d.ts +14 -1
- package/dist/esm/sps/placement.js.map +1 -1
- package/dist/esm/sps.d.ts +18 -4
- package/dist/esm/sps.js +26 -6
- package/dist/esm/sps.js.map +1 -1
- package/dist/esm/utils/placementCookies.d.ts +2 -0
- package/dist/esm/utils/placementCookies.js +22 -0
- package/dist/esm/utils/placementCookies.js.map +1 -1
- package/dist/public-scripts/sps-pulse-helpers.v2.2.0.min.js +1 -1
- package/package.json +1 -1
|
@@ -6,9 +6,21 @@ export declare const isDismissed: (placementType: PlacementType, iframeId?: stri
|
|
|
6
6
|
*/
|
|
7
7
|
export interface AddDismissOptions {
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* The maximum number of times the user may dismiss the placement before the schedule
|
|
10
|
+
* expiry TTL is used instead of {@link hideDuration}.
|
|
11
|
+
* Set to `null` to disable the limit.
|
|
12
|
+
*/
|
|
13
|
+
dismissLimit: number | null;
|
|
14
|
+
/**
|
|
15
|
+
* Duration in milliseconds to hide the placement after each dismiss while the count
|
|
16
|
+
* is below {@link dismissLimit}.
|
|
10
17
|
*/
|
|
11
18
|
hideDuration: number;
|
|
19
|
+
/**
|
|
20
|
+
* Unix timestamp (ms) at which the schedule expires. Used as the cookie TTL when
|
|
21
|
+
* {@link dismissLimit} is reached. Set to `null` to fall back to {@link hideDuration}.
|
|
22
|
+
*/
|
|
23
|
+
scheduleEndDate: number | null;
|
|
12
24
|
}
|
|
13
25
|
export declare const addDismiss: (placementType: PlacementType, iframeId: string, options: AddDismissOptions) => void;
|
|
14
26
|
export declare const getDismissScript: (placementType: PlacementTypeWithStringContent) => string;
|
|
@@ -28,7 +28,19 @@ const addDismiss = (placementType, iframeId, options) => {
|
|
|
28
28
|
if (event.data.type === `${DISMISS_KEY}:${placementType}`) {
|
|
29
29
|
console.log("[SPS sdk] - Dismiss issued by user", event);
|
|
30
30
|
const currentOptions = dismissListenerKeys.get(key);
|
|
31
|
-
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const scheduleEnd = currentOptions.scheduleEndDate ?? null;
|
|
33
|
+
const timeUntilScheduleEnd = scheduleEnd !== null ? Math.max(0, scheduleEnd - now) : null;
|
|
34
|
+
let pauseDuration = timeUntilScheduleEnd !== null
|
|
35
|
+
? Math.min(currentOptions.hideDuration, timeUntilScheduleEnd)
|
|
36
|
+
: currentOptions.hideDuration;
|
|
37
|
+
if (currentOptions.dismissLimit !== null && scheduleEnd !== null) {
|
|
38
|
+
const count = (0, placementCookies_1.incrementDismissCount)(placementType, iframeId, scheduleEnd);
|
|
39
|
+
if (!isNaN(count) && count >= currentOptions.dismissLimit) {
|
|
40
|
+
pauseDuration = timeUntilScheduleEnd ?? 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
(0, placementCookies_1.setDismissCookie)(placementType, pauseDuration, iframeId);
|
|
32
44
|
document.getElementById(iframeId)?.remove();
|
|
33
45
|
}
|
|
34
46
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dismiss.js","sourceRoot":"","sources":["../../../src/actions/dismiss.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"dismiss.js","sourceRoot":"","sources":["../../../src/actions/dismiss.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/apiClient.d.ts
CHANGED
|
@@ -45,9 +45,20 @@ export type SPSPosterResponse<T extends PlacementType> = {
|
|
|
45
45
|
*/
|
|
46
46
|
failReason?: string;
|
|
47
47
|
/**
|
|
48
|
-
* Duration in milliseconds to hide the placement after each dismiss
|
|
48
|
+
* Duration in milliseconds to hide the placement after each dismiss while the dismiss
|
|
49
|
+
* count is below {@link dismissLimit}.
|
|
49
50
|
*/
|
|
50
51
|
hideDuration?: number;
|
|
52
|
+
/**
|
|
53
|
+
* The maximum number of times the user may dismiss the placement before the schedule
|
|
54
|
+
* expiry TTL ({@link scheduleEndDate}) is used instead of {@link hideDuration}.
|
|
55
|
+
*/
|
|
56
|
+
dismissLimit?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Unix timestamp (ms) at which the schedule expires. Used as the cookie TTL when
|
|
59
|
+
* {@link dismissLimit} is reached.
|
|
60
|
+
*/
|
|
61
|
+
scheduleEndDate?: number | null;
|
|
51
62
|
};
|
|
52
63
|
/**
|
|
53
64
|
* Returned by the SPS API when there is no content to display for the given placement.
|
|
@@ -115,11 +126,11 @@ export type ApiDecision = {
|
|
|
115
126
|
* @param endpoint - The SPS API base endpoint URL.
|
|
116
127
|
* @param cookies - Optional cookie string forwarded as the `Cookie` request header.
|
|
117
128
|
* @param excludedPlacementTypes - Optional placement types to exclude from the result.
|
|
118
|
-
* @returns An object with a `placements` array, or `
|
|
129
|
+
* @returns An object with a `placements` array, or `null` on error.
|
|
119
130
|
*/
|
|
120
|
-
export declare const fetchPlacementsByContext: (publication: string, context: "frontpage" | "article", endpoint: string, cookies?: string, excludedPlacementTypes?: PlacementType[]) => Promise<{
|
|
131
|
+
export declare const fetchPlacementsByContext: (publication: string, context: "frontpage" | "article", endpoint: string, cookies?: string, excludedPlacementTypes?: PlacementType[], timeoutMs?: number) => Promise<{
|
|
121
132
|
placements: SPSPosterResponseWithPlacementType[];
|
|
122
|
-
}>;
|
|
133
|
+
} | null>;
|
|
123
134
|
/**
|
|
124
135
|
* Fetches priority-ordered decisions (content keys only) for a given page context from the SPS API.
|
|
125
136
|
*
|
package/dist/cjs/apiClient.js
CHANGED
|
@@ -109,27 +109,29 @@ exports.fetchDecision = fetchDecision;
|
|
|
109
109
|
* @param endpoint - The SPS API base endpoint URL.
|
|
110
110
|
* @param cookies - Optional cookie string forwarded as the `Cookie` request header.
|
|
111
111
|
* @param excludedPlacementTypes - Optional placement types to exclude from the result.
|
|
112
|
-
* @returns An object with a `placements` array, or `
|
|
112
|
+
* @returns An object with a `placements` array, or `null` on error.
|
|
113
113
|
*/
|
|
114
|
-
const fetchPlacementsByContext = async (publication, context, endpoint, cookies, excludedPlacementTypes) => {
|
|
114
|
+
const fetchPlacementsByContext = async (publication, context, endpoint, cookies, excludedPlacementTypes, timeoutMs) => {
|
|
115
115
|
try {
|
|
116
116
|
const url = new URL(`${endpoint}/${publication}/placements/${context}`);
|
|
117
117
|
excludedPlacementTypes?.forEach((placementType) => {
|
|
118
118
|
url.searchParams.append("excludedPlacementTypes[]", placementType);
|
|
119
119
|
});
|
|
120
|
+
const signal = timeoutMs !== undefined ? AbortSignal.timeout(timeoutMs) : undefined;
|
|
120
121
|
const response = await fetch(url.toString(), {
|
|
121
122
|
credentials: "include",
|
|
122
123
|
headers: { ...(cookies && { Cookie: cookies }) },
|
|
124
|
+
signal,
|
|
123
125
|
});
|
|
124
126
|
if (!response.ok) {
|
|
125
127
|
console.error(`[SPS sdk] Error fetching placements: ${response.status} ${response.statusText}`);
|
|
126
|
-
return
|
|
128
|
+
return null;
|
|
127
129
|
}
|
|
128
130
|
return response.json();
|
|
129
131
|
}
|
|
130
132
|
catch (error) {
|
|
131
133
|
console.error("[SPS sdk] Error fetching placements:", error);
|
|
132
|
-
return
|
|
134
|
+
return null;
|
|
133
135
|
}
|
|
134
136
|
};
|
|
135
137
|
exports.fetchPlacementsByContext = fetchPlacementsByContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/apiClient.ts"],"names":[],"mappings":";;;AAAA,qDAK4B;AAC5B,qCAA8C;
|
|
1
|
+
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/apiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export type PlacementTypeWithOptionalFallback = Exclude<keyof PlacementContentMa
|
|
|
12
12
|
* Placement types that do __not__ require any parameters to be passed to SPS.
|
|
13
13
|
*/
|
|
14
14
|
export type PlacementTypeWithOptionalProps = Exclude<keyof PlacementContentMap, "salesposter" | "ip" | "bottombar">;
|
|
15
|
-
export type PlacementTypeWithStringContent = Exclude<keyof PlacementContentMap, "coreheader">;
|
|
15
|
+
export type PlacementTypeWithStringContent = Exclude<keyof PlacementContentMap, "kyststripe" | "benefit" | "coreheader" | "kystbenefit">;
|
|
16
16
|
/**
|
|
17
17
|
* Determines whether the given placement type is a landing page placement
|
|
18
18
|
* @param placementType the placement type to check
|
|
@@ -24,6 +24,7 @@ export declare const isLandingPagePlacement: (placementType: PlacementType) => b
|
|
|
24
24
|
* HTML placements map to `string`; JSON placements map to their respective object shapes.
|
|
25
25
|
*/
|
|
26
26
|
export type PlacementContentMap = {
|
|
27
|
+
kyststripe: Kyststripe;
|
|
27
28
|
coreheader: Record<string, string>;
|
|
28
29
|
bottombar: string;
|
|
29
30
|
foldup: string;
|
|
@@ -42,3 +43,15 @@ export type PlacementContentMap = {
|
|
|
42
43
|
campaignpage: string;
|
|
43
44
|
staticpage: string;
|
|
44
45
|
};
|
|
46
|
+
export type Kyststripe = {
|
|
47
|
+
showBuyAboStripe: boolean;
|
|
48
|
+
desktopText: string;
|
|
49
|
+
mobileText: string;
|
|
50
|
+
buttonText: string;
|
|
51
|
+
buyLink: string;
|
|
52
|
+
backgroundColor: string;
|
|
53
|
+
textColor: string;
|
|
54
|
+
buttonBgColor: string;
|
|
55
|
+
buttonTxtColor: string;
|
|
56
|
+
buttonId: string;
|
|
57
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placement.js","sourceRoot":"","sources":["../../../src/sps/placement.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"placement.js","sourceRoot":"","sources":["../../../src/sps/placement.ts"],"names":[],"mappings":";;;AAgCA;;;;GAIG;AACI,MAAM,sBAAsB,GAAG,CAAC,aAA4B,EAAW,EAAE;IAC9E,OAAO,aAAa,KAAK,cAAc,IAAI,aAAa,KAAK,YAAY,CAAC;AAC5E,CAAC,CAAC;AAFW,QAAA,sBAAsB,0BAEjC"}
|
package/dist/cjs/sps.d.ts
CHANGED
|
@@ -84,7 +84,7 @@ export type SpsRequestOptions<T extends PlacementType> = {
|
|
|
84
84
|
};
|
|
85
85
|
/**
|
|
86
86
|
* Maximum milliseconds to wait for the API before aborting the request.
|
|
87
|
-
*
|
|
87
|
+
* On timeout, a configured fallback is returned; otherwise the placement renders no content.
|
|
88
88
|
*/
|
|
89
89
|
timeoutMs?: number;
|
|
90
90
|
};
|
|
@@ -92,9 +92,22 @@ export type SpsRequestOptions<T extends PlacementType> = {
|
|
|
92
92
|
* Options for {@link SPS.getFrontpagePlacements} and {@link SPS.getArticlePagePlacements}.
|
|
93
93
|
* @typeParam T - The placement type
|
|
94
94
|
*/
|
|
95
|
-
export type SpsContextPlacementsOptions<T extends PlacementType> = SpsRequestOptions<T> & {
|
|
95
|
+
export type SpsContextPlacementsOptions<T extends PlacementType> = Omit<SpsRequestOptions<T>, "fallbackPoster" | "showFallbackPosterOnNoContent"> & {
|
|
96
96
|
/** Placement types to exclude from the priority-ordered result. */
|
|
97
97
|
excludedPlacementTypes?: PlacementType[];
|
|
98
|
+
/**
|
|
99
|
+
* Per-type fallback posters to return when the SPS context API call fails entirely
|
|
100
|
+
* (network error or non-OK response). Each entry is enriched the same way as a real poster.
|
|
101
|
+
*/
|
|
102
|
+
fallbackPosters?: FallbackPostersMap;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Maps placement types to their fallback poster content.
|
|
106
|
+
* Used by {@link SPS.getFrontpagePlacements} and {@link SPS.getArticlePagePlacements}
|
|
107
|
+
* to return pre-configured posters when the SPS API call fails entirely.
|
|
108
|
+
*/
|
|
109
|
+
export type FallbackPostersMap = {
|
|
110
|
+
[T in PlacementType]?: SPSPosterResponse<T>;
|
|
98
111
|
};
|
|
99
112
|
/**
|
|
100
113
|
* Options for {@link SPS.getFrontpageDecisions} and {@link SPS.getArticlePageDecisions}.
|
|
@@ -263,7 +276,7 @@ export declare class SPS {
|
|
|
263
276
|
* placeholder variables and appends tracking search params to links.
|
|
264
277
|
*
|
|
265
278
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
266
|
-
* @returns Array of enriched placements for the frontpage context, or `[]`
|
|
279
|
+
* @returns Array of enriched placements for the frontpage context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
267
280
|
*/
|
|
268
281
|
getFrontpagePlacements(options?: SpsContextPlacementsOptions<PlacementType>): Promise<(Poster<PlacementType> & {
|
|
269
282
|
type: PlacementType;
|
|
@@ -276,12 +289,13 @@ export declare class SPS {
|
|
|
276
289
|
* placeholder variables and appends tracking search params to links.
|
|
277
290
|
*
|
|
278
291
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
279
|
-
* @returns Array of enriched placements for the article page context, or `[]`
|
|
292
|
+
* @returns Array of enriched placements for the article page context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
280
293
|
*/
|
|
281
294
|
getArticlePagePlacements(options?: SpsContextPlacementsOptions<PlacementType>): Promise<(Poster<PlacementType> & {
|
|
282
295
|
type: PlacementType;
|
|
283
296
|
})[]>;
|
|
284
297
|
private enrichContextPlacements;
|
|
298
|
+
private enrichFallbackPosters;
|
|
285
299
|
/**
|
|
286
300
|
* Fetches priority-ordered decisions (content keys + segment names) for the frontpage context.
|
|
287
301
|
* Works in both browser and server environments.
|
package/dist/cjs/sps.js
CHANGED
|
@@ -183,6 +183,8 @@ class SPS {
|
|
|
183
183
|
if (posterResponse.hideDuration) {
|
|
184
184
|
(0, dismiss_1.addDismiss)(placementType, iframeId, {
|
|
185
185
|
hideDuration: posterResponse.hideDuration,
|
|
186
|
+
dismissLimit: posterResponse.dismissLimit ?? null,
|
|
187
|
+
scheduleEndDate: posterResponse.scheduleEndDate ?? null,
|
|
186
188
|
});
|
|
187
189
|
}
|
|
188
190
|
(0, consent_1.addConsentForwarding)(iframeId);
|
|
@@ -204,12 +206,15 @@ class SPS {
|
|
|
204
206
|
* placeholder variables and appends tracking search params to links.
|
|
205
207
|
*
|
|
206
208
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
207
|
-
* @returns Array of enriched placements for the frontpage context, or `[]`
|
|
209
|
+
* @returns Array of enriched placements for the frontpage context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
208
210
|
*/
|
|
209
211
|
async getFrontpagePlacements(options = {}) {
|
|
210
212
|
await this.validateClientEnvironment();
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
+
const result = await (0, apiClient_1.fetchPlacementsByContext)(this.publication, "frontpage", this.endpoint, undefined, options.excludedPlacementTypes, options.timeoutMs);
|
|
214
|
+
if (!result) {
|
|
215
|
+
return options.fallbackPosters ? this.enrichFallbackPosters(options) : [];
|
|
216
|
+
}
|
|
217
|
+
return this.enrichContextPlacements(result.placements, options);
|
|
213
218
|
}
|
|
214
219
|
/**
|
|
215
220
|
* Fetches priority-ordered placements (full content) for the article page context.
|
|
@@ -219,12 +224,15 @@ class SPS {
|
|
|
219
224
|
* placeholder variables and appends tracking search params to links.
|
|
220
225
|
*
|
|
221
226
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
222
|
-
* @returns Array of enriched placements for the article page context, or `[]`
|
|
227
|
+
* @returns Array of enriched placements for the article page context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
223
228
|
*/
|
|
224
229
|
async getArticlePagePlacements(options = {}) {
|
|
225
230
|
await this.validateClientEnvironment();
|
|
226
|
-
const
|
|
227
|
-
|
|
231
|
+
const result = await (0, apiClient_1.fetchPlacementsByContext)(this.publication, "article", this.endpoint, undefined, options.excludedPlacementTypes, options.timeoutMs);
|
|
232
|
+
if (!result) {
|
|
233
|
+
return options.fallbackPosters ? this.enrichFallbackPosters(options) : [];
|
|
234
|
+
}
|
|
235
|
+
return this.enrichContextPlacements(result.placements, options);
|
|
228
236
|
}
|
|
229
237
|
async enrichContextPlacements(placements, options) {
|
|
230
238
|
return Promise.all(placements.map(async (placement) => {
|
|
@@ -234,6 +242,18 @@ class SPS {
|
|
|
234
242
|
return { ...enriched, type: placement.placementType };
|
|
235
243
|
}));
|
|
236
244
|
}
|
|
245
|
+
async enrichFallbackPosters(options) {
|
|
246
|
+
return Promise.all(Object.entries(options.fallbackPosters ?? {})
|
|
247
|
+
.filter(([placementType]) => !options.excludedPlacementTypes?.includes(placementType))
|
|
248
|
+
.filter(([, poster]) => poster !== undefined)
|
|
249
|
+
.map(async ([placementType, poster]) => {
|
|
250
|
+
const enriched = await this.enrichPosterResponse(poster, placementType, options, undefined, {
|
|
251
|
+
failReason: "fallbackPoster - context API call failed",
|
|
252
|
+
segmentNames: poster.segmentNames ?? [],
|
|
253
|
+
});
|
|
254
|
+
return { ...enriched, type: placementType };
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
237
257
|
/**
|
|
238
258
|
* Fetches priority-ordered decisions (content keys + segment names) for the frontpage context.
|
|
239
259
|
* Works in both browser and server environments.
|
package/dist/cjs/sps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sps.js","sourceRoot":"","sources":["../../src/sps.ts"],"names":[],"mappings":";;;AAAA,wBASW;AACX,8EAK2C;AAC3C,uFAG6C;AAE7C,2CAQqB;AAOrB,+CAAgF;AAChF,+CAAyD;
|
|
1
|
+
{"version":3,"file":"sps.js","sourceRoot":"","sources":["../../src/sps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare const getDismissCookieName: (type: string, elementId: string) => string;
|
|
2
|
+
export declare const getDismissCountCookieName: (type: string, elementId: string) => string;
|
|
2
3
|
export declare const parseCookies: (cookieString: string) => Record<string, string>;
|
|
3
4
|
export declare const decodeDismissCount: (value: string) => {
|
|
4
5
|
count: number;
|
|
5
6
|
scheduleEndDate: number | null;
|
|
6
7
|
};
|
|
8
|
+
export declare const incrementDismissCount: (type: string, elementId: string, scheduleEndDate: number) => number;
|
|
7
9
|
export declare const setDismissCookie: (type: string, pauseDuration: number, elementId: string) => void;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.setDismissCookie = exports.decodeDismissCount = exports.parseCookies = exports.getDismissCookieName = void 0;
|
|
3
|
+
exports.setDismissCookie = exports.incrementDismissCount = exports.decodeDismissCount = exports.parseCookies = exports.getDismissCountCookieName = exports.getDismissCookieName = void 0;
|
|
4
4
|
const DISMISS_PREFIX = "sps-dismissed-";
|
|
5
|
+
const DISMISS_COUNT_PREFIX = "sps-dismiss-count-";
|
|
5
6
|
const getDismissCookieName = (type, elementId) => `${DISMISS_PREFIX}${type}-${elementId}`;
|
|
6
7
|
exports.getDismissCookieName = getDismissCookieName;
|
|
8
|
+
const getDismissCountCookieName = (type, elementId) => `${DISMISS_COUNT_PREFIX}${type}-${elementId}`;
|
|
9
|
+
exports.getDismissCountCookieName = getDismissCountCookieName;
|
|
7
10
|
const parseCookies = (cookieString) => {
|
|
8
11
|
if (!cookieString) {
|
|
9
12
|
return {};
|
|
@@ -14,6 +17,7 @@ const parseCookies = (cookieString) => {
|
|
|
14
17
|
}));
|
|
15
18
|
};
|
|
16
19
|
exports.parseCookies = parseCookies;
|
|
20
|
+
const encodeDismissCount = (count, scheduleEndDate) => scheduleEndDate != null ? `${count}:${scheduleEndDate}` : String(count);
|
|
17
21
|
const decodeDismissCount = (value) => {
|
|
18
22
|
const [rawCount = "0", rawDate] = value.split(":");
|
|
19
23
|
return {
|
|
@@ -22,6 +26,26 @@ const decodeDismissCount = (value) => {
|
|
|
22
26
|
};
|
|
23
27
|
};
|
|
24
28
|
exports.decodeDismissCount = decodeDismissCount;
|
|
29
|
+
const incrementDismissCount = (type, elementId, scheduleEndDate) => {
|
|
30
|
+
if (typeof document === "undefined") {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
const key = (0, exports.getDismissCountCookieName)(type, elementId);
|
|
34
|
+
const cookies = (0, exports.parseCookies)(document.cookie);
|
|
35
|
+
const raw = cookies[key];
|
|
36
|
+
let current = 0;
|
|
37
|
+
if (raw != null) {
|
|
38
|
+
const { count, scheduleEndDate: storedDate } = (0, exports.decodeDismissCount)(raw);
|
|
39
|
+
if (storedDate === scheduleEndDate && !isNaN(count)) {
|
|
40
|
+
current = count;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const next = current + 1;
|
|
44
|
+
const ttl = Math.max(0, Math.floor((scheduleEndDate - Date.now()) / 1000));
|
|
45
|
+
document.cookie = `${key}=${encodeDismissCount(next, scheduleEndDate)}; Max-Age=${ttl}; Path=/; SameSite=Lax`;
|
|
46
|
+
return next;
|
|
47
|
+
};
|
|
48
|
+
exports.incrementDismissCount = incrementDismissCount;
|
|
25
49
|
const setDismissCookie = (type, pauseDuration, elementId) => {
|
|
26
50
|
if (typeof document === "undefined") {
|
|
27
51
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placementCookies.js","sourceRoot":"","sources":["../../../src/utils/placementCookies.ts"],"names":[],"mappings":";;;AAAA,MAAM,cAAc,GAAG,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"placementCookies.js","sourceRoot":"","sources":["../../../src/utils/placementCookies.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,21 @@ export declare const isDismissed: (placementType: PlacementType, iframeId?: stri
|
|
|
6
6
|
*/
|
|
7
7
|
export interface AddDismissOptions {
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* The maximum number of times the user may dismiss the placement before the schedule
|
|
10
|
+
* expiry TTL is used instead of {@link hideDuration}.
|
|
11
|
+
* Set to `null` to disable the limit.
|
|
12
|
+
*/
|
|
13
|
+
dismissLimit: number | null;
|
|
14
|
+
/**
|
|
15
|
+
* Duration in milliseconds to hide the placement after each dismiss while the count
|
|
16
|
+
* is below {@link dismissLimit}.
|
|
10
17
|
*/
|
|
11
18
|
hideDuration: number;
|
|
19
|
+
/**
|
|
20
|
+
* Unix timestamp (ms) at which the schedule expires. Used as the cookie TTL when
|
|
21
|
+
* {@link dismissLimit} is reached. Set to `null` to fall back to {@link hideDuration}.
|
|
22
|
+
*/
|
|
23
|
+
scheduleEndDate: number | null;
|
|
12
24
|
}
|
|
13
25
|
export declare const addDismiss: (placementType: PlacementType, iframeId: string, options: AddDismissOptions) => void;
|
|
14
26
|
export declare const getDismissScript: (placementType: PlacementTypeWithStringContent) => string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { setDismissCookie, getDismissCookieName, parseCookies } from "../utils/placementCookies.js";
|
|
1
|
+
import { setDismissCookie, incrementDismissCount, getDismissCookieName, parseCookies, } from "../utils/placementCookies.js";
|
|
2
2
|
const DISMISS_KEY = "sps-dismiss-click";
|
|
3
3
|
const dismissListenerKeys = new Map();
|
|
4
4
|
export const getDismissIframeId = (placementType) => `sps-${placementType}-poster`;
|
|
@@ -23,7 +23,19 @@ export const addDismiss = (placementType, iframeId, options) => {
|
|
|
23
23
|
if (event.data.type === `${DISMISS_KEY}:${placementType}`) {
|
|
24
24
|
console.log("[SPS sdk] - Dismiss issued by user", event);
|
|
25
25
|
const currentOptions = dismissListenerKeys.get(key);
|
|
26
|
-
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const scheduleEnd = currentOptions.scheduleEndDate ?? null;
|
|
28
|
+
const timeUntilScheduleEnd = scheduleEnd !== null ? Math.max(0, scheduleEnd - now) : null;
|
|
29
|
+
let pauseDuration = timeUntilScheduleEnd !== null
|
|
30
|
+
? Math.min(currentOptions.hideDuration, timeUntilScheduleEnd)
|
|
31
|
+
: currentOptions.hideDuration;
|
|
32
|
+
if (currentOptions.dismissLimit !== null && scheduleEnd !== null) {
|
|
33
|
+
const count = incrementDismissCount(placementType, iframeId, scheduleEnd);
|
|
34
|
+
if (!isNaN(count) && count >= currentOptions.dismissLimit) {
|
|
35
|
+
pauseDuration = timeUntilScheduleEnd ?? 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
setDismissCookie(placementType, pauseDuration, iframeId);
|
|
27
39
|
document.getElementById(iframeId)?.remove();
|
|
28
40
|
}
|
|
29
41
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dismiss.js","sourceRoot":"","sources":["../../../src/actions/dismiss.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"dismiss.js","sourceRoot":"","sources":["../../../src/actions/dismiss.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/apiClient.d.ts
CHANGED
|
@@ -45,9 +45,20 @@ export type SPSPosterResponse<T extends PlacementType> = {
|
|
|
45
45
|
*/
|
|
46
46
|
failReason?: string;
|
|
47
47
|
/**
|
|
48
|
-
* Duration in milliseconds to hide the placement after each dismiss
|
|
48
|
+
* Duration in milliseconds to hide the placement after each dismiss while the dismiss
|
|
49
|
+
* count is below {@link dismissLimit}.
|
|
49
50
|
*/
|
|
50
51
|
hideDuration?: number;
|
|
52
|
+
/**
|
|
53
|
+
* The maximum number of times the user may dismiss the placement before the schedule
|
|
54
|
+
* expiry TTL ({@link scheduleEndDate}) is used instead of {@link hideDuration}.
|
|
55
|
+
*/
|
|
56
|
+
dismissLimit?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Unix timestamp (ms) at which the schedule expires. Used as the cookie TTL when
|
|
59
|
+
* {@link dismissLimit} is reached.
|
|
60
|
+
*/
|
|
61
|
+
scheduleEndDate?: number | null;
|
|
51
62
|
};
|
|
52
63
|
/**
|
|
53
64
|
* Returned by the SPS API when there is no content to display for the given placement.
|
|
@@ -115,11 +126,11 @@ export type ApiDecision = {
|
|
|
115
126
|
* @param endpoint - The SPS API base endpoint URL.
|
|
116
127
|
* @param cookies - Optional cookie string forwarded as the `Cookie` request header.
|
|
117
128
|
* @param excludedPlacementTypes - Optional placement types to exclude from the result.
|
|
118
|
-
* @returns An object with a `placements` array, or `
|
|
129
|
+
* @returns An object with a `placements` array, or `null` on error.
|
|
119
130
|
*/
|
|
120
|
-
export declare const fetchPlacementsByContext: (publication: string, context: "frontpage" | "article", endpoint: string, cookies?: string, excludedPlacementTypes?: PlacementType[]) => Promise<{
|
|
131
|
+
export declare const fetchPlacementsByContext: (publication: string, context: "frontpage" | "article", endpoint: string, cookies?: string, excludedPlacementTypes?: PlacementType[], timeoutMs?: number) => Promise<{
|
|
121
132
|
placements: SPSPosterResponseWithPlacementType[];
|
|
122
|
-
}>;
|
|
133
|
+
} | null>;
|
|
123
134
|
/**
|
|
124
135
|
* Fetches priority-ordered decisions (content keys only) for a given page context from the SPS API.
|
|
125
136
|
*
|
package/dist/esm/apiClient.js
CHANGED
|
@@ -104,27 +104,29 @@ export const fetchDecision = async (url, params, userJwtToken, cookie) => {
|
|
|
104
104
|
* @param endpoint - The SPS API base endpoint URL.
|
|
105
105
|
* @param cookies - Optional cookie string forwarded as the `Cookie` request header.
|
|
106
106
|
* @param excludedPlacementTypes - Optional placement types to exclude from the result.
|
|
107
|
-
* @returns An object with a `placements` array, or `
|
|
107
|
+
* @returns An object with a `placements` array, or `null` on error.
|
|
108
108
|
*/
|
|
109
|
-
export const fetchPlacementsByContext = async (publication, context, endpoint, cookies, excludedPlacementTypes) => {
|
|
109
|
+
export const fetchPlacementsByContext = async (publication, context, endpoint, cookies, excludedPlacementTypes, timeoutMs) => {
|
|
110
110
|
try {
|
|
111
111
|
const url = new URL(`${endpoint}/${publication}/placements/${context}`);
|
|
112
112
|
excludedPlacementTypes?.forEach((placementType) => {
|
|
113
113
|
url.searchParams.append("excludedPlacementTypes[]", placementType);
|
|
114
114
|
});
|
|
115
|
+
const signal = timeoutMs !== undefined ? AbortSignal.timeout(timeoutMs) : undefined;
|
|
115
116
|
const response = await fetch(url.toString(), {
|
|
116
117
|
credentials: "include",
|
|
117
118
|
headers: { ...(cookies && { Cookie: cookies }) },
|
|
119
|
+
signal,
|
|
118
120
|
});
|
|
119
121
|
if (!response.ok) {
|
|
120
122
|
console.error(`[SPS sdk] Error fetching placements: ${response.status} ${response.statusText}`);
|
|
121
|
-
return
|
|
123
|
+
return null;
|
|
122
124
|
}
|
|
123
125
|
return response.json();
|
|
124
126
|
}
|
|
125
127
|
catch (error) {
|
|
126
128
|
console.error("[SPS sdk] Error fetching placements:", error);
|
|
127
|
-
return
|
|
129
|
+
return null;
|
|
128
130
|
}
|
|
129
131
|
};
|
|
130
132
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/apiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export type PlacementTypeWithOptionalFallback = Exclude<keyof PlacementContentMa
|
|
|
12
12
|
* Placement types that do __not__ require any parameters to be passed to SPS.
|
|
13
13
|
*/
|
|
14
14
|
export type PlacementTypeWithOptionalProps = Exclude<keyof PlacementContentMap, "salesposter" | "ip" | "bottombar">;
|
|
15
|
-
export type PlacementTypeWithStringContent = Exclude<keyof PlacementContentMap, "coreheader">;
|
|
15
|
+
export type PlacementTypeWithStringContent = Exclude<keyof PlacementContentMap, "kyststripe" | "benefit" | "coreheader" | "kystbenefit">;
|
|
16
16
|
/**
|
|
17
17
|
* Determines whether the given placement type is a landing page placement
|
|
18
18
|
* @param placementType the placement type to check
|
|
@@ -24,6 +24,7 @@ export declare const isLandingPagePlacement: (placementType: PlacementType) => b
|
|
|
24
24
|
* HTML placements map to `string`; JSON placements map to their respective object shapes.
|
|
25
25
|
*/
|
|
26
26
|
export type PlacementContentMap = {
|
|
27
|
+
kyststripe: Kyststripe;
|
|
27
28
|
coreheader: Record<string, string>;
|
|
28
29
|
bottombar: string;
|
|
29
30
|
foldup: string;
|
|
@@ -42,3 +43,15 @@ export type PlacementContentMap = {
|
|
|
42
43
|
campaignpage: string;
|
|
43
44
|
staticpage: string;
|
|
44
45
|
};
|
|
46
|
+
export type Kyststripe = {
|
|
47
|
+
showBuyAboStripe: boolean;
|
|
48
|
+
desktopText: string;
|
|
49
|
+
mobileText: string;
|
|
50
|
+
buttonText: string;
|
|
51
|
+
buyLink: string;
|
|
52
|
+
backgroundColor: string;
|
|
53
|
+
textColor: string;
|
|
54
|
+
buttonBgColor: string;
|
|
55
|
+
buttonTxtColor: string;
|
|
56
|
+
buttonId: string;
|
|
57
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placement.js","sourceRoot":"","sources":["../../../src/sps/placement.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"placement.js","sourceRoot":"","sources":["../../../src/sps/placement.ts"],"names":[],"mappings":"AAgCA;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,aAA4B,EAAW,EAAE;IAC9E,OAAO,aAAa,KAAK,cAAc,IAAI,aAAa,KAAK,YAAY,CAAC;AAC5E,CAAC,CAAC"}
|
package/dist/esm/sps.d.ts
CHANGED
|
@@ -84,7 +84,7 @@ export type SpsRequestOptions<T extends PlacementType> = {
|
|
|
84
84
|
};
|
|
85
85
|
/**
|
|
86
86
|
* Maximum milliseconds to wait for the API before aborting the request.
|
|
87
|
-
*
|
|
87
|
+
* On timeout, a configured fallback is returned; otherwise the placement renders no content.
|
|
88
88
|
*/
|
|
89
89
|
timeoutMs?: number;
|
|
90
90
|
};
|
|
@@ -92,9 +92,22 @@ export type SpsRequestOptions<T extends PlacementType> = {
|
|
|
92
92
|
* Options for {@link SPS.getFrontpagePlacements} and {@link SPS.getArticlePagePlacements}.
|
|
93
93
|
* @typeParam T - The placement type
|
|
94
94
|
*/
|
|
95
|
-
export type SpsContextPlacementsOptions<T extends PlacementType> = SpsRequestOptions<T> & {
|
|
95
|
+
export type SpsContextPlacementsOptions<T extends PlacementType> = Omit<SpsRequestOptions<T>, "fallbackPoster" | "showFallbackPosterOnNoContent"> & {
|
|
96
96
|
/** Placement types to exclude from the priority-ordered result. */
|
|
97
97
|
excludedPlacementTypes?: PlacementType[];
|
|
98
|
+
/**
|
|
99
|
+
* Per-type fallback posters to return when the SPS context API call fails entirely
|
|
100
|
+
* (network error or non-OK response). Each entry is enriched the same way as a real poster.
|
|
101
|
+
*/
|
|
102
|
+
fallbackPosters?: FallbackPostersMap;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Maps placement types to their fallback poster content.
|
|
106
|
+
* Used by {@link SPS.getFrontpagePlacements} and {@link SPS.getArticlePagePlacements}
|
|
107
|
+
* to return pre-configured posters when the SPS API call fails entirely.
|
|
108
|
+
*/
|
|
109
|
+
export type FallbackPostersMap = {
|
|
110
|
+
[T in PlacementType]?: SPSPosterResponse<T>;
|
|
98
111
|
};
|
|
99
112
|
/**
|
|
100
113
|
* Options for {@link SPS.getFrontpageDecisions} and {@link SPS.getArticlePageDecisions}.
|
|
@@ -263,7 +276,7 @@ export declare class SPS {
|
|
|
263
276
|
* placeholder variables and appends tracking search params to links.
|
|
264
277
|
*
|
|
265
278
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
266
|
-
* @returns Array of enriched placements for the frontpage context, or `[]`
|
|
279
|
+
* @returns Array of enriched placements for the frontpage context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
267
280
|
*/
|
|
268
281
|
getFrontpagePlacements(options?: SpsContextPlacementsOptions<PlacementType>): Promise<(Poster<PlacementType> & {
|
|
269
282
|
type: PlacementType;
|
|
@@ -276,12 +289,13 @@ export declare class SPS {
|
|
|
276
289
|
* placeholder variables and appends tracking search params to links.
|
|
277
290
|
*
|
|
278
291
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
279
|
-
* @returns Array of enriched placements for the article page context, or `[]`
|
|
292
|
+
* @returns Array of enriched placements for the article page context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
280
293
|
*/
|
|
281
294
|
getArticlePagePlacements(options?: SpsContextPlacementsOptions<PlacementType>): Promise<(Poster<PlacementType> & {
|
|
282
295
|
type: PlacementType;
|
|
283
296
|
})[]>;
|
|
284
297
|
private enrichContextPlacements;
|
|
298
|
+
private enrichFallbackPosters;
|
|
285
299
|
/**
|
|
286
300
|
* Fetches priority-ordered decisions (content keys + segment names) for the frontpage context.
|
|
287
301
|
* Works in both browser and server environments.
|
package/dist/esm/sps.js
CHANGED
|
@@ -181,6 +181,8 @@ export class SPS {
|
|
|
181
181
|
if (posterResponse.hideDuration) {
|
|
182
182
|
addDismiss(placementType, iframeId, {
|
|
183
183
|
hideDuration: posterResponse.hideDuration,
|
|
184
|
+
dismissLimit: posterResponse.dismissLimit ?? null,
|
|
185
|
+
scheduleEndDate: posterResponse.scheduleEndDate ?? null,
|
|
184
186
|
});
|
|
185
187
|
}
|
|
186
188
|
addConsentForwarding(iframeId);
|
|
@@ -202,12 +204,15 @@ export class SPS {
|
|
|
202
204
|
* placeholder variables and appends tracking search params to links.
|
|
203
205
|
*
|
|
204
206
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
205
|
-
* @returns Array of enriched placements for the frontpage context, or `[]`
|
|
207
|
+
* @returns Array of enriched placements for the frontpage context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
206
208
|
*/
|
|
207
209
|
async getFrontpagePlacements(options = {}) {
|
|
208
210
|
await this.validateClientEnvironment();
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
+
const result = await fetchPlacementsByContext(this.publication, "frontpage", this.endpoint, undefined, options.excludedPlacementTypes, options.timeoutMs);
|
|
212
|
+
if (!result) {
|
|
213
|
+
return options.fallbackPosters ? this.enrichFallbackPosters(options) : [];
|
|
214
|
+
}
|
|
215
|
+
return this.enrichContextPlacements(result.placements, options);
|
|
211
216
|
}
|
|
212
217
|
/**
|
|
213
218
|
* Fetches priority-ordered placements (full content) for the article page context.
|
|
@@ -217,12 +222,15 @@ export class SPS {
|
|
|
217
222
|
* placeholder variables and appends tracking search params to links.
|
|
218
223
|
*
|
|
219
224
|
* @param options - Optional request options including tracking context, URL rewrite callbacks, and `excludedPlacementTypes`.
|
|
220
|
-
* @returns Array of enriched placements for the article page context, or `[]`
|
|
225
|
+
* @returns Array of enriched placements for the article page context, fallback posters (if configured) on API failure, or `[]` otherwise.
|
|
221
226
|
*/
|
|
222
227
|
async getArticlePagePlacements(options = {}) {
|
|
223
228
|
await this.validateClientEnvironment();
|
|
224
|
-
const
|
|
225
|
-
|
|
229
|
+
const result = await fetchPlacementsByContext(this.publication, "article", this.endpoint, undefined, options.excludedPlacementTypes, options.timeoutMs);
|
|
230
|
+
if (!result) {
|
|
231
|
+
return options.fallbackPosters ? this.enrichFallbackPosters(options) : [];
|
|
232
|
+
}
|
|
233
|
+
return this.enrichContextPlacements(result.placements, options);
|
|
226
234
|
}
|
|
227
235
|
async enrichContextPlacements(placements, options) {
|
|
228
236
|
return Promise.all(placements.map(async (placement) => {
|
|
@@ -232,6 +240,18 @@ export class SPS {
|
|
|
232
240
|
return { ...enriched, type: placement.placementType };
|
|
233
241
|
}));
|
|
234
242
|
}
|
|
243
|
+
async enrichFallbackPosters(options) {
|
|
244
|
+
return Promise.all(Object.entries(options.fallbackPosters ?? {})
|
|
245
|
+
.filter(([placementType]) => !options.excludedPlacementTypes?.includes(placementType))
|
|
246
|
+
.filter(([, poster]) => poster !== undefined)
|
|
247
|
+
.map(async ([placementType, poster]) => {
|
|
248
|
+
const enriched = await this.enrichPosterResponse(poster, placementType, options, undefined, {
|
|
249
|
+
failReason: "fallbackPoster - context API call failed",
|
|
250
|
+
segmentNames: poster.segmentNames ?? [],
|
|
251
|
+
});
|
|
252
|
+
return { ...enriched, type: placementType };
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
235
255
|
/**
|
|
236
256
|
* Fetches priority-ordered decisions (content keys + segment names) for the frontpage context.
|
|
237
257
|
* Works in both browser and server environments.
|
package/dist/esm/sps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sps.js","sourceRoot":"","sources":["../../src/sps.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,GAOZ,MAAM,GAAG,CAAC;AACX,OAAO,EACL,oBAAoB,GAIrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,wBAAwB,EACxB,WAAW,GAIZ,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"sps.js","sourceRoot":"","sources":["../../src/sps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare const getDismissCookieName: (type: string, elementId: string) => string;
|
|
2
|
+
export declare const getDismissCountCookieName: (type: string, elementId: string) => string;
|
|
2
3
|
export declare const parseCookies: (cookieString: string) => Record<string, string>;
|
|
3
4
|
export declare const decodeDismissCount: (value: string) => {
|
|
4
5
|
count: number;
|
|
5
6
|
scheduleEndDate: number | null;
|
|
6
7
|
};
|
|
8
|
+
export declare const incrementDismissCount: (type: string, elementId: string, scheduleEndDate: number) => number;
|
|
7
9
|
export declare const setDismissCookie: (type: string, pauseDuration: number, elementId: string) => void;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const DISMISS_PREFIX = "sps-dismissed-";
|
|
2
|
+
const DISMISS_COUNT_PREFIX = "sps-dismiss-count-";
|
|
2
3
|
export const getDismissCookieName = (type, elementId) => `${DISMISS_PREFIX}${type}-${elementId}`;
|
|
4
|
+
export const getDismissCountCookieName = (type, elementId) => `${DISMISS_COUNT_PREFIX}${type}-${elementId}`;
|
|
3
5
|
export const parseCookies = (cookieString) => {
|
|
4
6
|
if (!cookieString) {
|
|
5
7
|
return {};
|
|
@@ -9,6 +11,7 @@ export const parseCookies = (cookieString) => {
|
|
|
9
11
|
return [key.trim(), rest.join("=").trim()];
|
|
10
12
|
}));
|
|
11
13
|
};
|
|
14
|
+
const encodeDismissCount = (count, scheduleEndDate) => scheduleEndDate != null ? `${count}:${scheduleEndDate}` : String(count);
|
|
12
15
|
export const decodeDismissCount = (value) => {
|
|
13
16
|
const [rawCount = "0", rawDate] = value.split(":");
|
|
14
17
|
return {
|
|
@@ -16,6 +19,25 @@ export const decodeDismissCount = (value) => {
|
|
|
16
19
|
scheduleEndDate: rawDate != null ? parseInt(rawDate, 10) : null,
|
|
17
20
|
};
|
|
18
21
|
};
|
|
22
|
+
export const incrementDismissCount = (type, elementId, scheduleEndDate) => {
|
|
23
|
+
if (typeof document === "undefined") {
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
const key = getDismissCountCookieName(type, elementId);
|
|
27
|
+
const cookies = parseCookies(document.cookie);
|
|
28
|
+
const raw = cookies[key];
|
|
29
|
+
let current = 0;
|
|
30
|
+
if (raw != null) {
|
|
31
|
+
const { count, scheduleEndDate: storedDate } = decodeDismissCount(raw);
|
|
32
|
+
if (storedDate === scheduleEndDate && !isNaN(count)) {
|
|
33
|
+
current = count;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const next = current + 1;
|
|
37
|
+
const ttl = Math.max(0, Math.floor((scheduleEndDate - Date.now()) / 1000));
|
|
38
|
+
document.cookie = `${key}=${encodeDismissCount(next, scheduleEndDate)}; Max-Age=${ttl}; Path=/; SameSite=Lax`;
|
|
39
|
+
return next;
|
|
40
|
+
};
|
|
19
41
|
export const setDismissCookie = (type, pauseDuration, elementId) => {
|
|
20
42
|
if (typeof document === "undefined") {
|
|
21
43
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placementCookies.js","sourceRoot":"","sources":["../../../src/utils/placementCookies.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"placementCookies.js","sourceRoot":"","sources":["../../../src/utils/placementCookies.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var SpsPulseHelpersBundle=(()=>{var
|
|
1
|
+
"use strict";var SpsPulseHelpersBundle=(()=>{var V=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var re=Object.prototype.hasOwnProperty;var se=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ne(t))!re.call(e,r)&&r!==n&&V(e,r,{get:()=>t[r],enumerable:!(s=te(t,r))||s.enumerable});return e};var oe=e=>se(V({},"__esModule",{value:!0}),e);var ye={};var y="pulse-tracker-proxy",ae=`${y}:request`,he=`${y}:ack`,j=`${y}:invoke`,W=`${y}:return`,C=`${y}:return-error`,G=["trackAnonymousViewUIElement","trackEngagementAudio","trackEngagementForm","trackEngagementHealthUIElement","trackEngagementOffer","trackEngagementTeaser","trackEngagementUIElement","trackEngagementVideo","trackEngagementVideoAd","trackEngagementWidget","trackCompletedHealthAction","trackImpressionAdSlot","trackImpressionForm","trackImpressionHealthUIElement","trackImpressionOffer","trackImpressionPlayer","trackImpressionTeaser","trackImpressionUIElement","trackImpressionWidget","trackLeaveArticle","trackLeaveAudioPage","trackLeaveError","trackLeaveFrontpage","trackLeaveLandingpage","trackLeaveListing","trackLeaveLockedArticle","trackLeaveLockedAudioPage","trackLeaveLockedVideoPage","trackLeavePage","trackLeaveSportsPage","trackLeaveVideoPage","trackLeaveWeather","trackViewArticle","trackViewAudioPage","trackViewError","trackViewFrontpage","trackViewHealthPage","trackViewLandingpage","trackViewListing","trackViewLockedArticle","trackViewLockedAudioPage","trackViewLockedVideoPage","trackViewPage","trackViewSportsPage","trackViewTitle","trackViewVideoPage","trackViewWeather","trackLegacyViewArticle","trackLegacyViewLoginPoster","trackLegacyViewSalesPoster","trackLegacyViewListing","trackLegacyViewFrontpage","trackLegacyViewPage","trackLegacyViewUIElement","trackLegacyClickUIElement"];function v(e){return e!==null&&typeof e=="object"&&"type"in e&&typeof e.type=="string"&&e.type.startsWith(y)}function D(e,{target:t,timeout:n,debug:s=()=>{}}){return new Promise((r,c)=>{let a=new MessageChannel,p=n?setTimeout(()=>{a.port1.close(),c(new Error(`Message of type ${e.type} timed out`))},n):void 0,i=o=>{if(s("[Pulse Tracker Proxy] Received the response on the MessageChannel",o),!v(o.data)){s("[Pulse Tracker Proxy] Response was not a valid Proxy Message",o.data);return}o.data.type===C&&(s("[Pulse Tracker Proxy] Received an return error response",o.data.error),clearTimeout(p),a.port1.close(),c(new Error(o.data.error))),s("[Pulse Tracker Proxy] Received a valid response",o.data),clearTimeout(p),a.port1.close(),r(o.data)};a.port1.onmessage=i,s("[Pulse Tracker Proxy] Sending message to target window",e),t.postMessage(e,"*",[a.port2])})}var q="2.0.0-rc.9";function L(e){let t="tracker"in e&&typeof e.tracker=="object"?e.tracker:{};return{...e,tracker:{...t,proxyVersion:q}}}function _(e,t,n){let s="provider"in e&&typeof e.provider=="object"?e.provider:{};return{...e,provider:{...s,component:t,componentVersion:n}}}var R=class{constructor(t,n,s,r){this.target=t,this.component=n,this.componentVersion=s,this.debug=r}track(...t){this.debug("[Pulse Tracker Proxy] Calling `track`",t);let[n,s,...r]=t,c=L(s),a=_(c,this.component,this.componentVersion),p=[n,a,...r];return this.invoke({method:"track",args:p})}async invoke(t){this.debug("[Pulse Tracker Proxy] Invoking remote function",t);let n=await D({type:j,payload:t},{target:this.target});if(!v(n))throw this.debug("[Pulse Tracker Proxy] Invalid response from proxy",n),new Error("Invalid response from proxy");if(n.type===C)throw this.debug("[Pulse Tracker Proxy] Error response from proxy",n.error),new Error(n.error);if(n.type===W)return this.debug("[Pulse Tracker Proxy] Successful response from proxy",n.payload),n.payload;throw this.debug("[Pulse Tracker Proxy] Unhandled response from proxy",n),new Error("Unexpected response from proxy")}};var ie=Object.fromEntries(G.map(e=>[e,function(...t){this.debug("[Pulse Tracker Proxy] Calling `track`",t);let[n,...s]=t,r=L(n),a=[_(r,this.component,this.componentVersion),...s];return this.invoke({method:e,args:a})}]));function ce(){return class extends R{constructor(e,t,n,s){super(e,t,n,s),s("[Pulse TPaaS Proxy] Initialized"),Object.assign(this,ie)}}}var pe=ce();var le=e=>e==="payment.schibsted.com"||e.startsWith("bestilling.")||e==="pay.pre.schibsted.digital"||e.startsWith("test-bestilling."),me=e=>e==="login.schibsted.com"||e==="identity-pre.schibsted.com",H=e=>{var t;try{let s=new URL((t=e.getAttribute("href"))!=null?t:"").hostname;if(me(s))return"Login";if(le(s))return"Purchase"}catch{return}};var B=e=>{var t;try{let n=new URL((t=e.getAttribute("href"))!=null?t:""),r=new URLSearchParams(n.search).get("code");return r?r.split(","):[]}catch{return[]}};var S=e=>{var n;let t=(n=e==null?void 0:e.toLowerCase())!=null?n:"";if(t.includes("meter"))return"Meter";if(t.includes("paid")||t.includes("subscription"))return"Paid";if(t.includes("login"))return"Login"};function K(e,t,n,s){let{campaign:r,articleType:c,abTestGroup:a,placementType:p,experiment:i,legacy:o,contentName:l,pulseEvents:m}=t,d=400,T="",h=0;function f(g){var b,k,x,U,M;try{let w=g.target,P=(b=w==null?void 0:w.closest)==null?void 0:b.call(w,"a");if(!P)return;let E=P.textContent||P.getAttribute("href")||`${p} button`,F=`a|${E}`,N=Date.now();if(F===T&&N-h<d)return;T=F,h=N;let O=H(P),ee=O==="Purchase"?B(P):[];m.tpaas&&e.trackEngagementOffer({placement:{containerName:"page",offerPlacement:p},object:{objectId:s,objectSdrn:n,campaign:r,name:l,offerCodes:ee,offerType:S(c)},...i?{experiments:[{experimentSdrn:`${n}:experiment:${u(i)}`,name:i,platform:"SPS",variant:a||""}]}:{},engagement:{action:"Click",elementName:E},page:{},provider:{stage:"Test"},target:{info:{url:(k=P.getAttribute("href"))!=null?k:""}}}),m.legacy&&e.trackLegacyClickUIElement({object:{id:u(E),elementType:"Button",name:E,containerName:"Page",custom:{...o==null?void 0:o.offerData}},...o?{origin:o.pulseOrigin}:{},target:{url:(M=(U=(x=P.getAttribute("href"))==null?void 0:x.split("?"))==null?void 0:U[0])!=null?M:""},...O?{intent:O}:{},...i?{experiments:[{id:`experiment:${u(i)}`,name:i,platform:"SPS",variant:a}]}:{}})}catch{}}return document.addEventListener("click",f,!0),()=>document.removeEventListener("click",f,!0)}function Y(e,t,n,s,r){let{campaign:c,articleType:a,abTestGroup:p,placementType:i,experiment:o,legacy:l,contentName:m,pulseEvents:d}=t;d.tpaas&&e.trackImpressionOffer({placement:{foldPosition:r,containerName:"page",offerPlacement:i},object:{campaign:c,name:m,objectId:s,objectSdrn:n,offerCodes:[],offerType:S(a)},...o?{experiments:[{experimentSdrn:`${n}:experiment:${u(o)}`,name:o,platform:"SPS",variant:p||""}]}:{},page:{},provider:{stage:"Test"},target:{info:{}}}),d.legacy&&e.trackLegacyViewUIElement({object:{id:u(m),elementType:i,name:m,placement:{},custom:{...l==null?void 0:l.offerData,...l==null?void 0:l.custom}},...o?{experiments:[{id:`${n}:experiment:${u(o)}`,name:o,platform:"SPS",variant:p}]}:{},...l?{origin:l.pulseOrigin}:{}})}async function z(e,t,n){let{placementType:s,legacy:r,pulseEvents:c}=t,a=window.location.pathname,i=`landingpage-${s==="campaignpage"?"CAMPAIGN":"STATIC"}-${A(a)}`.toLowerCase();c.legacy&&await e.trackLegacyViewPage({object:{pageId:i,name:document.title,"spt:custom":{...r==null?void 0:r.offerData,...r==null?void 0:r.custom}},origin:r==null?void 0:r.pulseOrigin}),c.tpaas&&await e.trackViewLandingpage({object:{objectId:i,objectSdrn:n,title:document.title},page:{},provider:{stage:"Test"}},{leaveTracking:{objectElement:"body",pageElement:"body",objectResizable:!1}})}var $={"sps-pulse-helpers":"2.2.0","pulse-tracker-proxy":"1.2.0"};var I=e=>e==="campaignpage"||e==="staticpage";var J=!1,Q=!1,X="script[data-sps-pulse-config='true']",u=e=>e.toLowerCase().replace(/ /g,"-").replace(/[^-a-z:0-9]/g,""),A=e=>{var t,n;return(e==null?void 0:e.replace((n=(t=window.__landingpages)==null?void 0:t.rootUrl)!=null?n:"","").replace(/^\/|\/$/g,""))||""};async function Z(){if(console.log("[SPS-Pulse-Helpers] boot initiated"),J)return;J=!0;let e=null;try{let t=document.querySelector(X);if(!t){console.warn(`[SPS-Pulse-Helpers] Config script tag not found with selector ${X}`);return}e=JSON.parse(t.textContent)}catch(t){console.warn("[SPS-Pulse-Helpers] Failed to parse config from script tag",t);return}try{let t=window.getPulseTrackerProxy;if(!t||typeof t!="function"){console.warn("[SPS-Pulse-Helpers] PulseTrackerProxy not available");return}let{placementType:n,publication:s,contentName:r}=e,c=I(n)?A(window.location.pathname):u(r),a=`sdrn:${s}:element:offer:${n}:${c}`,p=crypto==null?void 0:crypto.randomUUID(),i=await t({component:"SPS-SDK",componentVersion:$["sps-pulse-helpers"]});K(i,e,a,p);let o=f=>{Q||(Q=!0,Y(i,e,a,p,f))};if(I(n)){await z(i,e,a),o("Above");return}let l=window.frameElement,m=window.parent.IntersectionObserver;if(!l||!m){console.warn("[SPS-Pulse-Helpers] No iframe or IntersectionObserver available. Pulse View event will not be fired.");return}let d="Unknown",T=!0,h=new m(f=>{var x;let g=f[0],b=(x=g==null?void 0:g.intersectionRatio)!=null?x:0,k=(g==null?void 0:g.isIntersecting)&&b>=1/3;T&&(T=!1,d=k?"Above":"Below"),k&&(h.disconnect(),o(d))},{root:null,threshold:[0,1/3]});h.observe(l)}catch(t){console.warn("[SPS-Pulse-Helpers] boot failed",t)}}Z();return oe(ye);})();
|