1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
import * as validation from "@jet/environment/json/validation";
import { isNothing, isSome } from "@jet/environment/types/optional";
import { asJSONData } from "../../../foundation/json-parsing/server-data";
import * as productVariant from "../../product-page/product-page-variants";
import * as metricsUtil from "./util";
class MetricsLocationStackItem {
constructor() {
this.position = 0;
}
}
export function newLocationTracker() {
return {
rootPosition: 0,
locationStack: [],
};
}
/**
* @param locationTracker The location tracker to copy
* @returns A copy of the location tracker
*/
export function createLocationTrackerCopy(locationTracker) {
const locationStackCopy = [];
for (const locationStackEntry of locationTracker.locationStack) {
locationStackCopy.push({
...locationStackEntry,
});
}
return {
rootPosition: locationTracker.rootPosition,
locationStack: locationStackCopy,
};
}
export function createContentLocation(objectGraph, options, title) {
const locations = stackItemsToLocationStack(options.locationTracker);
const contentLocation = newContentLocation(objectGraph, options, title);
return [contentLocation, ...locations];
}
export function createBasicLocation(objectGraph, options, title) {
const locations = stackItemsToLocationStack(options.locationTracker);
const basicLocation = newBasicLocation(objectGraph, options, title);
return [basicLocation, ...locations];
}
export function pushContentLocation(objectGraph, options, title) {
const stackItem = new MetricsLocationStackItem();
stackItem.location = newContentLocation(objectGraph, options, title);
options.locationTracker.locationStack.unshift(stackItem);
}
export function pushBasicLocation(objectGraph, options, title) {
const stackItem = new MetricsLocationStackItem();
stackItem.location = newBasicLocation(objectGraph, options, title);
options.locationTracker.locationStack.unshift(stackItem);
}
export function popLocation(tracker) {
if (tracker.locationStack.length === 0) {
validation.unexpectedType("ignoredValue", "non-empty location stack", "empty location stack");
return;
}
tracker.locationStack.shift();
}
export function currentPosition(tracker) {
const stackItem = lastStackItemAdded(tracker);
if (stackItem) {
return stackItem.position;
}
else {
return tracker.rootPosition;
}
}
export function previousPosition(tracker) {
if (tracker.locationStack.length < 2) {
return null;
}
return tracker.locationStack[1].position;
}
export function currentLocation(tracker) {
const stackItem = lastStackItemAdded(tracker);
if (stackItem) {
return stackItem.location;
}
else {
return null;
}
}
/**
* Set current position of tracker. This is necessary when large today modules are broken apart into multipart shelves.
* We need to preserve the position of content within server-response, not our logical shelves.
* @param tracker Tracker update position of.
* @param position Position to set to.
*/
export function setCurrentPosition(tracker, position) {
const stackItem = lastStackItemAdded(tracker);
if (stackItem) {
stackItem.position = position;
}
else {
tracker.rootPosition = position;
}
}
export function nextPosition(tracker) {
const stackItem = lastStackItemAdded(tracker);
if (stackItem) {
stackItem.position++;
}
else {
tracker.rootPosition++;
}
}
function newContentLocation(objectGraph, options, title) {
var _a;
const base = newBasicLocation(objectGraph, options, title);
// Use the location tracker if there is no id override
if (!options.id && options.locationTracker) {
base.idType = "sequential";
base.id = currentPosition(options.locationTracker).toString();
}
else {
// If there is a id specified, use that
const idType = metricsUtil.idTypeForMetricsOptions(options);
if (isSome(idType)) {
base.idType = idType;
}
let id = options.id;
if ((_a = options.anonymizationOptions) === null || _a === void 0 ? void 0 : _a.anonymizationString) {
id = options.anonymizationOptions.anonymizationString;
}
base.id = isNothing(id) ? "" : id;
}
if (options.fcKind) {
base.fcKind = options.fcKind;
}
if (options.displayStyle) {
base.displayStyle = options.displayStyle;
}
if (options.inAppEventId) {
base.inAppEventId = options.inAppEventId;
}
if (options.relatedSubjectIds) {
base.relatedSubjectIds = options.relatedSubjectIds;
}
if (options.canonicalId) {
base.canonicalId = options.canonicalId;
}
if (options.optimizationEntityId) {
base.optimizationEntityId = options.optimizationEntityId;
}
if (options.optimizationId) {
base.optimizationId = options.optimizationId;
}
if (isSome(options.rowIndex)) {
base.rowIndex = options.rowIndex;
}
if (options.productVariantData) {
Object.assign(base, productVariant.contentFieldsForProductVariantData(options.productVariantData));
}
return base;
}
function newBasicLocation(objectGraph, options, title) {
var _a, _b;
let name = title;
if ((_a = options.anonymizationOptions) === null || _a === void 0 ? void 0 : _a.anonymizationString) {
name = options.anonymizationOptions.anonymizationString;
}
const location = {
locationPosition: currentPosition(options.locationTracker),
locationType: metricsUtil.targetTypeForMetricsOptions(objectGraph, options),
name: isNothing(name) ? "" : name,
};
if (isSome(options.badges)) {
location.badges = (_b = asJSONData(options.badges)) !== null && _b !== void 0 ? _b : undefined;
}
if (options.recoMetricsData) {
Object.assign(location, options.recoMetricsData);
}
return location;
}
function stackItemsToLocationStack(tracker) {
return tracker.locationStack.map((stackItem) => {
return stackItem.location;
});
}
function lastStackItemAdded(tracker) {
const length = tracker.locationStack.length;
if (length === 0) {
return null;
}
return tracker.locationStack[0];
}
//# sourceMappingURL=location.js.map
|