@absmartly/sdk-plugins 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/absmartly-cookie.min.js +1 -1
- package/dist/absmartly-dom-changes-core.min.js +1 -1
- package/dist/absmartly-dom-changes-lite.min.js +1 -1
- package/dist/absmartly-overrides-full.min.js +1 -1
- package/dist/absmartly-overrides-lite.min.js +1 -1
- package/dist/absmartly-sdk-plugins.min.js +1 -1
- package/dist/absmartly-vitals.min.js +1 -1
- package/es/analytics/AnalyticsPlugin.js +96 -0
- package/es/analytics/AnalyticsPlugin.js.map +1 -0
- package/es/analytics/index.js +2 -0
- package/es/analytics/index.js.map +1 -0
- package/es/analytics/types.js +2 -0
- package/es/analytics/types.js.map +1 -0
- package/es/cookies/CookiePlugin.js +59 -18
- package/es/cookies/CookiePlugin.js.map +1 -1
- package/es/cookies/cookieUtils.js +2 -1
- package/es/cookies/cookieUtils.js.map +1 -1
- package/es/core/DOMChangesPluginLite.js +206 -101
- package/es/core/DOMChangesPluginLite.js.map +1 -1
- package/es/core/DOMManipulatorLite.js +187 -122
- package/es/core/DOMManipulatorLite.js.map +1 -1
- package/es/core/ExposureTracker.js +310 -108
- package/es/core/ExposureTracker.js.map +1 -1
- package/es/core/HTMLInjector.js +11 -1
- package/es/core/HTMLInjector.js.map +1 -1
- package/es/core/PendingChangeManager.js +125 -65
- package/es/core/PendingChangeManager.js.map +1 -1
- package/es/generated/buildInfo.js +3 -0
- package/es/generated/buildInfo.js.map +1 -0
- package/es/index.js +1 -0
- package/es/index.js.map +1 -1
- package/es/overrides/BrowserCookieAdapter.js +3 -31
- package/es/overrides/BrowserCookieAdapter.js.map +1 -1
- package/es/overrides/OverridesPlugin.js +39 -107
- package/es/overrides/OverridesPlugin.js.map +1 -1
- package/es/overrides/OverridesPluginLite.js +5 -136
- package/es/overrides/OverridesPluginLite.js.map +1 -1
- package/es/parsers/VariantExtractor.js +21 -18
- package/es/parsers/VariantExtractor.js.map +1 -1
- package/es/url-redirect/URLRedirectExtractor.js +8 -2
- package/es/url-redirect/URLRedirectExtractor.js.map +1 -1
- package/es/url-redirect/URLRedirectMatcher.js +136 -5
- package/es/url-redirect/URLRedirectMatcher.js.map +1 -1
- package/es/url-redirect/URLRedirectPlugin.js +16 -6
- package/es/url-redirect/URLRedirectPlugin.js.map +1 -1
- package/es/utils/URLMatcher.js +4 -3
- package/es/utils/URLMatcher.js.map +1 -1
- package/es/utils/debug.js +15 -3
- package/es/utils/debug.js.map +1 -1
- package/es/utils/persistence.js +143 -75
- package/es/utils/persistence.js.map +1 -1
- package/es/utils/plugin-registry.js.map +1 -1
- package/es/vitals/WebVitalsPlugin.js +9 -4
- package/es/vitals/WebVitalsPlugin.js.map +1 -1
- package/lib/analytics/AnalyticsPlugin.d.ts +8 -0
- package/lib/analytics/AnalyticsPlugin.js +99 -0
- package/lib/analytics/AnalyticsPlugin.js.map +1 -0
- package/lib/analytics/index.d.ts +2 -0
- package/lib/analytics/index.js +6 -0
- package/lib/analytics/index.js.map +1 -0
- package/lib/analytics/types.d.ts +5 -0
- package/lib/analytics/types.js +3 -0
- package/lib/analytics/types.js.map +1 -0
- package/lib/cookies/CookiePlugin.js +59 -18
- package/lib/cookies/CookiePlugin.js.map +1 -1
- package/lib/cookies/cookieUtils.d.ts +0 -4
- package/lib/cookies/cookieUtils.js +6 -5
- package/lib/cookies/cookieUtils.js.map +1 -1
- package/lib/core/DOMChangesPluginLite.d.ts +3 -0
- package/lib/core/DOMChangesPluginLite.js +206 -101
- package/lib/core/DOMChangesPluginLite.js.map +1 -1
- package/lib/core/DOMManipulatorLite.js +187 -122
- package/lib/core/DOMManipulatorLite.js.map +1 -1
- package/lib/core/ExposureTracker.js +310 -108
- package/lib/core/ExposureTracker.js.map +1 -1
- package/lib/core/HTMLInjector.d.ts +1 -0
- package/lib/core/HTMLInjector.js +11 -1
- package/lib/core/HTMLInjector.js.map +1 -1
- package/lib/core/PendingChangeManager.d.ts +0 -1
- package/lib/core/PendingChangeManager.js +125 -65
- package/lib/core/PendingChangeManager.js.map +1 -1
- package/lib/generated/buildInfo.d.ts +2 -0
- package/lib/generated/buildInfo.js +6 -0
- package/lib/generated/buildInfo.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/overrides/BrowserCookieAdapter.js +3 -31
- package/lib/overrides/BrowserCookieAdapter.js.map +1 -1
- package/lib/overrides/OverridesPlugin.js +39 -107
- package/lib/overrides/OverridesPlugin.js.map +1 -1
- package/lib/overrides/OverridesPluginLite.d.ts +5 -1
- package/lib/overrides/OverridesPluginLite.js +5 -136
- package/lib/overrides/OverridesPluginLite.js.map +1 -1
- package/lib/parsers/VariantExtractor.js +21 -18
- package/lib/parsers/VariantExtractor.js.map +1 -1
- package/lib/types/index.d.ts +5 -0
- package/lib/url-redirect/URLRedirectExtractor.js +8 -2
- package/lib/url-redirect/URLRedirectExtractor.js.map +1 -1
- package/lib/url-redirect/URLRedirectMatcher.d.ts +3 -0
- package/lib/url-redirect/URLRedirectMatcher.js +136 -5
- package/lib/url-redirect/URLRedirectMatcher.js.map +1 -1
- package/lib/url-redirect/URLRedirectPlugin.js +15 -5
- package/lib/url-redirect/URLRedirectPlugin.js.map +1 -1
- package/lib/url-redirect/types.d.ts +1 -1
- package/lib/utils/URLMatcher.d.ts +1 -7
- package/lib/utils/URLMatcher.js +4 -3
- package/lib/utils/URLMatcher.js.map +1 -1
- package/lib/utils/debug.d.ts +6 -1
- package/lib/utils/debug.js +16 -3
- package/lib/utils/debug.js.map +1 -1
- package/lib/utils/persistence.js +143 -75
- package/lib/utils/persistence.js.map +1 -1
- package/lib/utils/plugin-registry.d.ts +1 -0
- package/lib/utils/plugin-registry.js.map +1 -1
- package/lib/vitals/WebVitalsPlugin.js +9 -4
- package/lib/vitals/WebVitalsPlugin.js.map +1 -1
- package/package.json +14 -6
- package/types/analytics/AnalyticsPlugin.d.ts +8 -0
- package/types/analytics/index.d.ts +2 -0
- package/types/analytics/types.d.ts +5 -0
- package/types/cookies/cookieUtils.d.ts +0 -4
- package/types/core/DOMChangesPluginLite.d.ts +3 -0
- package/types/core/HTMLInjector.d.ts +1 -0
- package/types/core/PendingChangeManager.d.ts +0 -1
- package/types/generated/buildInfo.d.ts +2 -0
- package/types/index.d.ts +2 -0
- package/types/overrides/OverridesPluginLite.d.ts +5 -1
- package/types/types/index.d.ts +5 -0
- package/types/url-redirect/URLRedirectMatcher.d.ts +3 -0
- package/types/url-redirect/types.d.ts +1 -1
- package/types/utils/URLMatcher.d.ts +1 -7
- package/types/utils/debug.d.ts +6 -1
- package/types/utils/plugin-registry.d.ts +1 -0
|
@@ -34,6 +34,17 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
34
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
+
var __values = (this && this.__values) || function(o) {
|
|
38
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
39
|
+
if (m) return m.call(o);
|
|
40
|
+
if (o && typeof o.length === "number") return {
|
|
41
|
+
next: function () {
|
|
42
|
+
if (o && i >= o.length) o = void 0;
|
|
43
|
+
return { value: o && o[i++], done: !o };
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
47
|
+
};
|
|
37
48
|
var __read = (this && this.__read) || function (o, n) {
|
|
38
49
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
39
50
|
if (!m) return o;
|
|
@@ -78,7 +89,7 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
78
89
|
* @param hasViewportTrigger - Whether ANY variant matching URL filter has viewport trigger
|
|
79
90
|
*/
|
|
80
91
|
ExposureTracker.prototype.registerExperiment = function (experimentName, currentVariant, currentChanges, allVariantsChanges, hasImmediateTrigger, hasViewportTrigger) {
|
|
81
|
-
var
|
|
92
|
+
var e_1, _a, e_2, _b, e_3, _c, e_4, _d;
|
|
82
93
|
if (this.debug) {
|
|
83
94
|
logDebug("[EXPOSURE] [".concat(experimentName, "] Registering experiment for exposure tracking"), {
|
|
84
95
|
experimentName: experimentName,
|
|
@@ -101,36 +112,55 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
101
112
|
// We need to track ALL possible positions where elements could be
|
|
102
113
|
var moveElements = new Map(); // selector -> Set of target parent positions
|
|
103
114
|
var deleteElements = new Set(); // selectors for delete changes
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
115
|
+
try {
|
|
116
|
+
for (var allVariantsChanges_1 = __values(allVariantsChanges), allVariantsChanges_1_1 = allVariantsChanges_1.next(); !allVariantsChanges_1_1.done; allVariantsChanges_1_1 = allVariantsChanges_1.next()) {
|
|
117
|
+
var variantChanges = allVariantsChanges_1_1.value;
|
|
118
|
+
try {
|
|
119
|
+
for (var variantChanges_1 = (e_2 = void 0, __values(variantChanges)), variantChanges_1_1 = variantChanges_1.next(); !variantChanges_1_1.done; variantChanges_1_1 = variantChanges_1.next()) {
|
|
120
|
+
var change = variantChanges_1_1.value;
|
|
121
|
+
if (change.trigger_on_view) {
|
|
122
|
+
if (change.type === 'move') {
|
|
123
|
+
if (!moveElements.has(change.selector)) {
|
|
124
|
+
moveElements.set(change.selector, new Set());
|
|
125
|
+
}
|
|
126
|
+
// Add the target parent for this move
|
|
127
|
+
if (change.targetSelector) {
|
|
128
|
+
moveElements.get(change.selector).add(change.targetSelector);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (change.type === 'delete') {
|
|
132
|
+
// Track delete changes - need special handling for placeholders
|
|
133
|
+
deleteElements.add(change.selector);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
// For other non-move, non-delete changes, track the selector directly
|
|
137
|
+
viewportSelectors.add(change.selector);
|
|
138
|
+
}
|
|
114
139
|
}
|
|
115
140
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
// For other non-move, non-delete changes, track the selector directly
|
|
122
|
-
viewportSelectors.add(change.selector);
|
|
141
|
+
}
|
|
142
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
143
|
+
finally {
|
|
144
|
+
try {
|
|
145
|
+
if (variantChanges_1_1 && !variantChanges_1_1.done && (_b = variantChanges_1.return)) _b.call(variantChanges_1);
|
|
123
146
|
}
|
|
147
|
+
finally { if (e_2) throw e_2.error; }
|
|
124
148
|
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
152
|
+
finally {
|
|
153
|
+
try {
|
|
154
|
+
if (allVariantsChanges_1_1 && !allVariantsChanges_1_1.done && (_a = allVariantsChanges_1.return)) _a.call(allVariantsChanges_1);
|
|
155
|
+
}
|
|
156
|
+
finally { if (e_1) throw e_1.error; }
|
|
157
|
+
}
|
|
158
|
+
var _loop_1 = function (selector) {
|
|
159
|
+
var e_5, _f;
|
|
131
160
|
// Collect all move changes for this element across ALL variants
|
|
132
161
|
var allMovesForElement = [];
|
|
133
|
-
|
|
162
|
+
for (var variantIndex = 0; variantIndex < allVariantsChanges.length; variantIndex++) {
|
|
163
|
+
var variantChanges = allVariantsChanges[variantIndex];
|
|
134
164
|
var moveChange = variantChanges.find(function (c) { return c.type === 'move' && c.selector === selector && c.trigger_on_view; });
|
|
135
165
|
if (moveChange === null || moveChange === void 0 ? void 0 : moveChange.targetSelector) {
|
|
136
166
|
allMovesForElement.push({
|
|
@@ -139,43 +169,68 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
139
169
|
variantIndex: variantIndex,
|
|
140
170
|
});
|
|
141
171
|
}
|
|
142
|
-
}
|
|
172
|
+
}
|
|
143
173
|
// Check if current variant has a move for this element
|
|
144
174
|
var currentMoveIndex = allMovesForElement.findIndex(function (m) { return m.variantIndex === currentVariant; });
|
|
145
175
|
if (currentMoveIndex >= 0) {
|
|
146
176
|
// Current variant HAS a move - track the element in its moved position
|
|
147
177
|
viewportSelectors.add(selector);
|
|
148
178
|
// For all OTHER variant positions, create container-based placeholders
|
|
149
|
-
|
|
179
|
+
for (var index = 0; index < allMovesForElement.length; index++) {
|
|
180
|
+
var move = allMovesForElement[index];
|
|
150
181
|
if (index !== currentMoveIndex) {
|
|
151
182
|
// Create placeholder at the position where element WOULD be in another variant
|
|
152
|
-
|
|
183
|
+
this_1.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
|
|
153
184
|
}
|
|
154
|
-
}
|
|
185
|
+
}
|
|
155
186
|
}
|
|
156
187
|
else {
|
|
157
188
|
// Current variant does NOT have a move - element stays in original position
|
|
158
189
|
viewportSelectors.add(selector);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
190
|
+
try {
|
|
191
|
+
// For ALL variant moves, create placeholders at those positions
|
|
192
|
+
for (var allMovesForElement_1 = (e_5 = void 0, __values(allMovesForElement)), allMovesForElement_1_1 = allMovesForElement_1.next(); !allMovesForElement_1_1.done; allMovesForElement_1_1 = allMovesForElement_1.next()) {
|
|
193
|
+
var move = allMovesForElement_1_1.value;
|
|
194
|
+
this_1.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
198
|
+
finally {
|
|
199
|
+
try {
|
|
200
|
+
if (allMovesForElement_1_1 && !allMovesForElement_1_1.done && (_f = allMovesForElement_1.return)) _f.call(allMovesForElement_1);
|
|
201
|
+
}
|
|
202
|
+
finally { if (e_5) throw e_5.error; }
|
|
203
|
+
}
|
|
163
204
|
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
205
|
+
};
|
|
206
|
+
var this_1 = this;
|
|
207
|
+
try {
|
|
208
|
+
// For cross-variant move tracking, we need to track the EXACT POSITION where
|
|
209
|
+
// elements would appear in other variants. We use container-based invisible elements
|
|
210
|
+
// positioned exactly where the element would be, using CSS positioning.
|
|
211
|
+
for (var moveElements_1 = __values(moveElements), moveElements_1_1 = moveElements_1.next(); !moveElements_1_1.done; moveElements_1_1 = moveElements_1.next()) {
|
|
212
|
+
var _e = __read(moveElements_1_1.value, 1), selector = _e[0];
|
|
213
|
+
_loop_1(selector);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
217
|
+
finally {
|
|
218
|
+
try {
|
|
219
|
+
if (moveElements_1_1 && !moveElements_1_1.done && (_c = moveElements_1.return)) _c.call(moveElements_1);
|
|
220
|
+
}
|
|
221
|
+
finally { if (e_3) throw e_3.error; }
|
|
222
|
+
}
|
|
223
|
+
var _loop_2 = function (selector) {
|
|
169
224
|
// Check if current variant has a delete for this selector
|
|
170
225
|
var currentVariantHasDelete = currentChanges.some(function (c) { return c.type === 'delete' && c.selector === selector && c.trigger_on_view; });
|
|
171
226
|
if (currentVariantHasDelete) {
|
|
172
227
|
// Current variant will delete this element - replace with in-place placeholder
|
|
173
|
-
var placeholdersCreated =
|
|
228
|
+
var placeholdersCreated = this_2.createInPlacePlaceholder(experimentName, selector);
|
|
174
229
|
// If no placeholders created (element doesn't exist yet), track the selector
|
|
175
230
|
// so when element appears via MutationObserver, it will be tracked
|
|
176
231
|
if (placeholdersCreated === 0) {
|
|
177
232
|
viewportSelectors.add(selector);
|
|
178
|
-
if (
|
|
233
|
+
if (this_2.debug) {
|
|
179
234
|
logDebug("[EXPOSURE] [".concat(experimentName, "] Delete element doesn't exist yet - tracking selector for when it appears"), { selector: selector });
|
|
180
235
|
}
|
|
181
236
|
}
|
|
@@ -184,7 +239,24 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
184
239
|
// Current variant doesn't delete - track the real element
|
|
185
240
|
viewportSelectors.add(selector);
|
|
186
241
|
}
|
|
187
|
-
}
|
|
242
|
+
};
|
|
243
|
+
var this_2 = this;
|
|
244
|
+
try {
|
|
245
|
+
// For cross-variant delete tracking, we need to handle elements that are deleted in some variants
|
|
246
|
+
// For variants with delete: replace element with 1px placeholder in the same position
|
|
247
|
+
// For variants without delete: track the actual element
|
|
248
|
+
for (var deleteElements_1 = __values(deleteElements), deleteElements_1_1 = deleteElements_1.next(); !deleteElements_1_1.done; deleteElements_1_1 = deleteElements_1.next()) {
|
|
249
|
+
var selector = deleteElements_1_1.value;
|
|
250
|
+
_loop_2(selector);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
254
|
+
finally {
|
|
255
|
+
try {
|
|
256
|
+
if (deleteElements_1_1 && !deleteElements_1_1.done && (_d = deleteElements_1.return)) _d.call(deleteElements_1);
|
|
257
|
+
}
|
|
258
|
+
finally { if (e_4) throw e_4.error; }
|
|
259
|
+
}
|
|
188
260
|
// Trigger flags are now passed in from DOMChangesPluginLite after URL filtering
|
|
189
261
|
// This ensures only variants matching the current URL determine trigger behavior
|
|
190
262
|
// Store experiment tracking info
|
|
@@ -293,7 +365,7 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
293
365
|
* Returns the number of placeholders created
|
|
294
366
|
*/
|
|
295
367
|
ExposureTracker.prototype.createInPlacePlaceholder = function (experimentName, selector) {
|
|
296
|
-
var
|
|
368
|
+
var _a;
|
|
297
369
|
var elements = document.querySelectorAll(selector);
|
|
298
370
|
if (elements.length === 0) {
|
|
299
371
|
if (this.debug) {
|
|
@@ -302,15 +374,15 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
302
374
|
return 0;
|
|
303
375
|
}
|
|
304
376
|
var placeholdersCreated = 0;
|
|
305
|
-
|
|
306
|
-
var
|
|
377
|
+
for (var index = 0; index < elements.length; index++) {
|
|
378
|
+
var element = elements[index];
|
|
307
379
|
// Create unique ID for the placeholder (remove special chars from selector for valid ID)
|
|
308
380
|
var selectorId = selector.replace(/[^a-zA-Z0-9-]/g, '_');
|
|
309
381
|
var placeholderId = "absmartly-delete-".concat(experimentName, "-").concat(selectorId, "-").concat(index);
|
|
310
382
|
var placeholderKey = "".concat(experimentName, "-delete-").concat(selector, "-").concat(index);
|
|
311
383
|
// Check if this element already has a placeholder
|
|
312
384
|
if (element.hasAttribute('data-absmartly-delete-placeholder')) {
|
|
313
|
-
|
|
385
|
+
continue;
|
|
314
386
|
}
|
|
315
387
|
// Create minimal placeholder using inline styles
|
|
316
388
|
// This will be observable by IntersectionObserver but won't affect layout
|
|
@@ -325,14 +397,14 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
325
397
|
// Insert placeholder before the element, then remove the element
|
|
326
398
|
(_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(placeholder, element);
|
|
327
399
|
element.remove();
|
|
328
|
-
|
|
400
|
+
this.placeholders.set(placeholderKey, placeholder);
|
|
329
401
|
// Track the placeholder for viewport visibility
|
|
330
|
-
|
|
402
|
+
this.trackElement(placeholder, experimentName);
|
|
331
403
|
placeholdersCreated++;
|
|
332
|
-
if (
|
|
404
|
+
if (this.debug) {
|
|
333
405
|
logDebug("[ABsmartly] Created in-place delete placeholder for ".concat(selector, " in experiment ").concat(experimentName));
|
|
334
406
|
}
|
|
335
|
-
}
|
|
407
|
+
}
|
|
336
408
|
return placeholdersCreated;
|
|
337
409
|
};
|
|
338
410
|
/**
|
|
@@ -372,20 +444,40 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
372
444
|
* Set up observers for the given selectors
|
|
373
445
|
*/
|
|
374
446
|
ExposureTracker.prototype.observeSelectors = function (experimentName, selectors) {
|
|
375
|
-
var
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
elements.
|
|
381
|
-
|
|
382
|
-
|
|
447
|
+
var e_6, _a, e_7, _b;
|
|
448
|
+
try {
|
|
449
|
+
for (var selectors_1 = __values(selectors), selectors_1_1 = selectors_1.next(); !selectors_1_1.done; selectors_1_1 = selectors_1.next()) {
|
|
450
|
+
var selector = selectors_1_1.value;
|
|
451
|
+
// Try to find existing elements
|
|
452
|
+
var elements = document.querySelectorAll(selector);
|
|
453
|
+
if (elements.length > 0) {
|
|
454
|
+
try {
|
|
455
|
+
for (var elements_1 = (e_7 = void 0, __values(elements)), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
|
|
456
|
+
var element = elements_1_1.value;
|
|
457
|
+
this.trackElement(element, experimentName);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
461
|
+
finally {
|
|
462
|
+
try {
|
|
463
|
+
if (elements_1_1 && !elements_1_1.done && (_b = elements_1.return)) _b.call(elements_1);
|
|
464
|
+
}
|
|
465
|
+
finally { if (e_7) throw e_7.error; }
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
// Element doesn't exist yet, set up mutation observer to watch for it
|
|
470
|
+
this.watchForSelector(selector, experimentName);
|
|
471
|
+
}
|
|
383
472
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
473
|
+
}
|
|
474
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
475
|
+
finally {
|
|
476
|
+
try {
|
|
477
|
+
if (selectors_1_1 && !selectors_1_1.done && (_a = selectors_1.return)) _a.call(selectors_1);
|
|
387
478
|
}
|
|
388
|
-
|
|
479
|
+
finally { if (e_6) throw e_6.error; }
|
|
480
|
+
}
|
|
389
481
|
};
|
|
390
482
|
/**
|
|
391
483
|
* Track an element for viewport visibility
|
|
@@ -419,11 +511,22 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
419
511
|
ExposureTracker.prototype.setupIntersectionObserver = function () {
|
|
420
512
|
var _this = this;
|
|
421
513
|
this.observer = new IntersectionObserver(function (entries) {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
514
|
+
var e_8, _a;
|
|
515
|
+
try {
|
|
516
|
+
for (var entries_1 = __values(entries), entries_1_1 = entries_1.next(); !entries_1_1.done; entries_1_1 = entries_1.next()) {
|
|
517
|
+
var entry = entries_1_1.value;
|
|
518
|
+
if (entry.isIntersecting) {
|
|
519
|
+
_this.handleElementVisible(entry.target);
|
|
520
|
+
}
|
|
425
521
|
}
|
|
426
|
-
}
|
|
522
|
+
}
|
|
523
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
524
|
+
finally {
|
|
525
|
+
try {
|
|
526
|
+
if (entries_1_1 && !entries_1_1.done && (_a = entries_1.return)) _a.call(entries_1);
|
|
527
|
+
}
|
|
528
|
+
finally { if (e_8) throw e_8.error; }
|
|
529
|
+
}
|
|
427
530
|
}, {
|
|
428
531
|
threshold: 0.01, // Trigger when even 1% is visible
|
|
429
532
|
rootMargin: '0px',
|
|
@@ -435,14 +538,35 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
435
538
|
ExposureTracker.prototype.setupMutationObserver = function () {
|
|
436
539
|
var _this = this;
|
|
437
540
|
this.mutationObserver = new MutationObserver(function (mutations) {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
541
|
+
var e_9, _a, e_10, _b;
|
|
542
|
+
try {
|
|
543
|
+
for (var mutations_1 = __values(mutations), mutations_1_1 = mutations_1.next(); !mutations_1_1.done; mutations_1_1 = mutations_1.next()) {
|
|
544
|
+
var mutation = mutations_1_1.value;
|
|
545
|
+
try {
|
|
546
|
+
for (var _c = (e_10 = void 0, __values(mutation.addedNodes)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
547
|
+
var node = _d.value;
|
|
548
|
+
if (node instanceof Element) {
|
|
549
|
+
// Check if this element or its children match any tracked selectors
|
|
550
|
+
_this.checkNewElement(node);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
443
553
|
}
|
|
444
|
-
|
|
445
|
-
|
|
554
|
+
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
555
|
+
finally {
|
|
556
|
+
try {
|
|
557
|
+
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
|
558
|
+
}
|
|
559
|
+
finally { if (e_10) throw e_10.error; }
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
564
|
+
finally {
|
|
565
|
+
try {
|
|
566
|
+
if (mutations_1_1 && !mutations_1_1.done && (_a = mutations_1.return)) _a.call(mutations_1);
|
|
567
|
+
}
|
|
568
|
+
finally { if (e_9) throw e_9.error; }
|
|
569
|
+
}
|
|
446
570
|
});
|
|
447
571
|
this.mutationObserver.observe(document.body, {
|
|
448
572
|
childList: true,
|
|
@@ -453,42 +577,86 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
453
577
|
* Check if a newly added element needs tracking
|
|
454
578
|
*/
|
|
455
579
|
ExposureTracker.prototype.checkNewElement = function (element) {
|
|
456
|
-
var
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
580
|
+
var e_11, _a, e_12, _b, e_13, _c;
|
|
581
|
+
try {
|
|
582
|
+
for (var _d = __values(this.experiments), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
583
|
+
var _f = __read(_e.value, 2), experimentName = _f[0], tracking = _f[1];
|
|
584
|
+
try {
|
|
585
|
+
for (var _g = (e_12 = void 0, __values(tracking.allPossibleSelectors)), _h = _g.next(); !_h.done; _h = _g.next()) {
|
|
586
|
+
var selector = _h.value;
|
|
587
|
+
if (element.matches(selector)) {
|
|
588
|
+
this.trackElement(element, experimentName);
|
|
589
|
+
}
|
|
590
|
+
try {
|
|
591
|
+
// Also check children
|
|
592
|
+
for (var _j = (e_13 = void 0, __values(element.querySelectorAll(selector))), _k = _j.next(); !_k.done; _k = _j.next()) {
|
|
593
|
+
var child = _k.value;
|
|
594
|
+
this.trackElement(child, experimentName);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
catch (e_13_1) { e_13 = { error: e_13_1 }; }
|
|
598
|
+
finally {
|
|
599
|
+
try {
|
|
600
|
+
if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
|
|
601
|
+
}
|
|
602
|
+
finally { if (e_13) throw e_13.error; }
|
|
603
|
+
}
|
|
604
|
+
}
|
|
461
605
|
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
606
|
+
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
|
607
|
+
finally {
|
|
608
|
+
try {
|
|
609
|
+
if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
|
|
610
|
+
}
|
|
611
|
+
finally { if (e_12) throw e_12.error; }
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
616
|
+
finally {
|
|
617
|
+
try {
|
|
618
|
+
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
619
|
+
}
|
|
620
|
+
finally { if (e_11) throw e_11.error; }
|
|
621
|
+
}
|
|
468
622
|
};
|
|
469
623
|
/**
|
|
470
624
|
* Handle when an element becomes visible
|
|
471
625
|
*/
|
|
472
626
|
ExposureTracker.prototype.handleElementVisible = function (element) {
|
|
473
|
-
var
|
|
627
|
+
var e_14, _a;
|
|
474
628
|
var tracked = this.trackedElements.get(element);
|
|
475
629
|
if (!tracked)
|
|
476
630
|
return;
|
|
477
|
-
|
|
478
|
-
var experiment =
|
|
631
|
+
var _loop_3 = function (experimentName) {
|
|
632
|
+
var experiment = this_3.experiments.get(experimentName);
|
|
479
633
|
if (experiment && !experiment.triggered) {
|
|
480
634
|
// Don't await here to avoid blocking the visibility handler
|
|
481
|
-
|
|
635
|
+
this_3.triggerExposure(experimentName).catch(function (error) {
|
|
482
636
|
logDebug("[ABsmartly] Failed to trigger exposure for ".concat(experimentName, ":"), error);
|
|
483
637
|
});
|
|
484
|
-
if (
|
|
638
|
+
if (this_3.debug) {
|
|
485
639
|
var selector = tracked.isPlaceholder
|
|
486
640
|
? element.getAttribute('data-absmartly-original-selector')
|
|
487
|
-
:
|
|
641
|
+
: this_3.getElementSelector(element);
|
|
488
642
|
logDebug("[ABsmartly] Triggering exposure for ".concat(experimentName, " via ").concat(selector));
|
|
489
643
|
}
|
|
490
644
|
}
|
|
491
|
-
}
|
|
645
|
+
};
|
|
646
|
+
var this_3 = this;
|
|
647
|
+
try {
|
|
648
|
+
for (var _b = __values(tracked.experiments), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
649
|
+
var experimentName = _c.value;
|
|
650
|
+
_loop_3(experimentName);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
|
654
|
+
finally {
|
|
655
|
+
try {
|
|
656
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
657
|
+
}
|
|
658
|
+
finally { if (e_14) throw e_14.error; }
|
|
659
|
+
}
|
|
492
660
|
};
|
|
493
661
|
/**
|
|
494
662
|
* Trigger exposure for an experiment
|
|
@@ -535,30 +703,51 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
535
703
|
* Clean up tracking for an experiment that has been triggered
|
|
536
704
|
*/
|
|
537
705
|
ExposureTracker.prototype.cleanupExperiment = function (experimentName) {
|
|
538
|
-
var
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
706
|
+
var e_15, _a, e_16, _b;
|
|
707
|
+
try {
|
|
708
|
+
// Remove from tracked elements
|
|
709
|
+
for (var _c = __values(this.trackedElements), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
710
|
+
var _e = __read(_d.value, 2), element = _e[0], tracked = _e[1];
|
|
711
|
+
tracked.experiments.delete(experimentName);
|
|
712
|
+
if (tracked.experiments.size === 0) {
|
|
713
|
+
this.observer.unobserve(element);
|
|
714
|
+
this.trackedElements.delete(element);
|
|
715
|
+
}
|
|
545
716
|
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
_this.placeholders.delete(key);
|
|
717
|
+
}
|
|
718
|
+
catch (e_15_1) { e_15 = { error: e_15_1 }; }
|
|
719
|
+
finally {
|
|
720
|
+
try {
|
|
721
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
552
722
|
}
|
|
553
|
-
|
|
723
|
+
finally { if (e_15) throw e_15.error; }
|
|
724
|
+
}
|
|
725
|
+
try {
|
|
726
|
+
// Remove placeholders
|
|
727
|
+
for (var _f = __values(this.placeholders), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
728
|
+
var _h = __read(_g.value, 2), key = _h[0], placeholder = _h[1];
|
|
729
|
+
if (key.startsWith("".concat(experimentName, "-"))) {
|
|
730
|
+
placeholder.remove();
|
|
731
|
+
this.placeholders.delete(key);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
|
736
|
+
finally {
|
|
737
|
+
try {
|
|
738
|
+
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
739
|
+
}
|
|
740
|
+
finally { if (e_16) throw e_16.error; }
|
|
741
|
+
}
|
|
554
742
|
// Don't delete the experiment - keep it in the map so isTriggered() can still return true
|
|
555
743
|
// Just clear the selectors since we don't need to track them anymore
|
|
556
744
|
var experiment = this.experiments.get(experimentName);
|
|
557
745
|
if (experiment) {
|
|
558
746
|
experiment.allPossibleSelectors.clear();
|
|
559
747
|
}
|
|
560
|
-
// Clean up mutation observer if
|
|
561
|
-
|
|
748
|
+
// Clean up mutation observer if all experiments have been triggered
|
|
749
|
+
var allTriggered = Array.from(this.experiments.values()).every(function (exp) { return exp.triggered; });
|
|
750
|
+
if (allTriggered && this.mutationObserver) {
|
|
562
751
|
this.mutationObserver.disconnect();
|
|
563
752
|
this.mutationObserver = null;
|
|
564
753
|
}
|
|
@@ -596,13 +785,26 @@ var ExposureTracker = /** @class */ (function () {
|
|
|
596
785
|
* Clean up all resources
|
|
597
786
|
*/
|
|
598
787
|
ExposureTracker.prototype.destroy = function () {
|
|
788
|
+
var e_17, _a;
|
|
599
789
|
// Disconnect observers
|
|
600
790
|
this.observer.disconnect();
|
|
601
791
|
if (this.mutationObserver) {
|
|
602
792
|
this.mutationObserver.disconnect();
|
|
603
793
|
}
|
|
604
|
-
|
|
605
|
-
|
|
794
|
+
try {
|
|
795
|
+
// Remove all placeholders
|
|
796
|
+
for (var _b = __values(this.placeholders.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
797
|
+
var placeholder = _c.value;
|
|
798
|
+
placeholder.remove();
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
catch (e_17_1) { e_17 = { error: e_17_1 }; }
|
|
802
|
+
finally {
|
|
803
|
+
try {
|
|
804
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
805
|
+
}
|
|
806
|
+
finally { if (e_17) throw e_17.error; }
|
|
807
|
+
}
|
|
606
808
|
// Clear all tracking
|
|
607
809
|
this.experiments.clear();
|
|
608
810
|
this.trackedElements.clear();
|