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