@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.
Files changed (134) hide show
  1. package/dist/absmartly-cookie.min.js +1 -1
  2. package/dist/absmartly-dom-changes-core.min.js +1 -1
  3. package/dist/absmartly-dom-changes-lite.min.js +1 -1
  4. package/dist/absmartly-overrides-full.min.js +1 -1
  5. package/dist/absmartly-overrides-lite.min.js +1 -1
  6. package/dist/absmartly-sdk-plugins.min.js +1 -1
  7. package/dist/absmartly-vitals.min.js +1 -1
  8. package/es/analytics/AnalyticsPlugin.js +96 -0
  9. package/es/analytics/AnalyticsPlugin.js.map +1 -0
  10. package/es/analytics/index.js +2 -0
  11. package/es/analytics/index.js.map +1 -0
  12. package/es/analytics/types.js +2 -0
  13. package/es/analytics/types.js.map +1 -0
  14. package/es/cookies/CookiePlugin.js +59 -18
  15. package/es/cookies/CookiePlugin.js.map +1 -1
  16. package/es/cookies/cookieUtils.js +2 -1
  17. package/es/cookies/cookieUtils.js.map +1 -1
  18. package/es/core/DOMChangesPluginLite.js +206 -101
  19. package/es/core/DOMChangesPluginLite.js.map +1 -1
  20. package/es/core/DOMManipulatorLite.js +187 -122
  21. package/es/core/DOMManipulatorLite.js.map +1 -1
  22. package/es/core/ExposureTracker.js +310 -108
  23. package/es/core/ExposureTracker.js.map +1 -1
  24. package/es/core/HTMLInjector.js +11 -1
  25. package/es/core/HTMLInjector.js.map +1 -1
  26. package/es/core/PendingChangeManager.js +125 -65
  27. package/es/core/PendingChangeManager.js.map +1 -1
  28. package/es/generated/buildInfo.js +3 -0
  29. package/es/generated/buildInfo.js.map +1 -0
  30. package/es/index.js +1 -0
  31. package/es/index.js.map +1 -1
  32. package/es/overrides/BrowserCookieAdapter.js +3 -31
  33. package/es/overrides/BrowserCookieAdapter.js.map +1 -1
  34. package/es/overrides/OverridesPlugin.js +39 -107
  35. package/es/overrides/OverridesPlugin.js.map +1 -1
  36. package/es/overrides/OverridesPluginLite.js +5 -136
  37. package/es/overrides/OverridesPluginLite.js.map +1 -1
  38. package/es/parsers/VariantExtractor.js +21 -18
  39. package/es/parsers/VariantExtractor.js.map +1 -1
  40. package/es/url-redirect/URLRedirectExtractor.js +8 -2
  41. package/es/url-redirect/URLRedirectExtractor.js.map +1 -1
  42. package/es/url-redirect/URLRedirectMatcher.js +136 -5
  43. package/es/url-redirect/URLRedirectMatcher.js.map +1 -1
  44. package/es/url-redirect/URLRedirectPlugin.js +16 -6
  45. package/es/url-redirect/URLRedirectPlugin.js.map +1 -1
  46. package/es/utils/URLMatcher.js +4 -3
  47. package/es/utils/URLMatcher.js.map +1 -1
  48. package/es/utils/debug.js +15 -3
  49. package/es/utils/debug.js.map +1 -1
  50. package/es/utils/persistence.js +143 -75
  51. package/es/utils/persistence.js.map +1 -1
  52. package/es/utils/plugin-registry.js.map +1 -1
  53. package/es/vitals/WebVitalsPlugin.js +9 -4
  54. package/es/vitals/WebVitalsPlugin.js.map +1 -1
  55. package/lib/analytics/AnalyticsPlugin.d.ts +8 -0
  56. package/lib/analytics/AnalyticsPlugin.js +99 -0
  57. package/lib/analytics/AnalyticsPlugin.js.map +1 -0
  58. package/lib/analytics/index.d.ts +2 -0
  59. package/lib/analytics/index.js +6 -0
  60. package/lib/analytics/index.js.map +1 -0
  61. package/lib/analytics/types.d.ts +5 -0
  62. package/lib/analytics/types.js +3 -0
  63. package/lib/analytics/types.js.map +1 -0
  64. package/lib/cookies/CookiePlugin.js +59 -18
  65. package/lib/cookies/CookiePlugin.js.map +1 -1
  66. package/lib/cookies/cookieUtils.d.ts +0 -4
  67. package/lib/cookies/cookieUtils.js +6 -5
  68. package/lib/cookies/cookieUtils.js.map +1 -1
  69. package/lib/core/DOMChangesPluginLite.d.ts +3 -0
  70. package/lib/core/DOMChangesPluginLite.js +206 -101
  71. package/lib/core/DOMChangesPluginLite.js.map +1 -1
  72. package/lib/core/DOMManipulatorLite.js +187 -122
  73. package/lib/core/DOMManipulatorLite.js.map +1 -1
  74. package/lib/core/ExposureTracker.js +310 -108
  75. package/lib/core/ExposureTracker.js.map +1 -1
  76. package/lib/core/HTMLInjector.d.ts +1 -0
  77. package/lib/core/HTMLInjector.js +11 -1
  78. package/lib/core/HTMLInjector.js.map +1 -1
  79. package/lib/core/PendingChangeManager.d.ts +0 -1
  80. package/lib/core/PendingChangeManager.js +125 -65
  81. package/lib/core/PendingChangeManager.js.map +1 -1
  82. package/lib/generated/buildInfo.d.ts +2 -0
  83. package/lib/generated/buildInfo.js +6 -0
  84. package/lib/generated/buildInfo.js.map +1 -0
  85. package/lib/index.d.ts +2 -0
  86. package/lib/index.js +3 -1
  87. package/lib/index.js.map +1 -1
  88. package/lib/overrides/BrowserCookieAdapter.js +3 -31
  89. package/lib/overrides/BrowserCookieAdapter.js.map +1 -1
  90. package/lib/overrides/OverridesPlugin.js +39 -107
  91. package/lib/overrides/OverridesPlugin.js.map +1 -1
  92. package/lib/overrides/OverridesPluginLite.d.ts +5 -1
  93. package/lib/overrides/OverridesPluginLite.js +5 -136
  94. package/lib/overrides/OverridesPluginLite.js.map +1 -1
  95. package/lib/parsers/VariantExtractor.js +21 -18
  96. package/lib/parsers/VariantExtractor.js.map +1 -1
  97. package/lib/types/index.d.ts +5 -0
  98. package/lib/url-redirect/URLRedirectExtractor.js +8 -2
  99. package/lib/url-redirect/URLRedirectExtractor.js.map +1 -1
  100. package/lib/url-redirect/URLRedirectMatcher.d.ts +3 -0
  101. package/lib/url-redirect/URLRedirectMatcher.js +136 -5
  102. package/lib/url-redirect/URLRedirectMatcher.js.map +1 -1
  103. package/lib/url-redirect/URLRedirectPlugin.js +15 -5
  104. package/lib/url-redirect/URLRedirectPlugin.js.map +1 -1
  105. package/lib/url-redirect/types.d.ts +1 -1
  106. package/lib/utils/URLMatcher.d.ts +1 -7
  107. package/lib/utils/URLMatcher.js +4 -3
  108. package/lib/utils/URLMatcher.js.map +1 -1
  109. package/lib/utils/debug.d.ts +6 -1
  110. package/lib/utils/debug.js +16 -3
  111. package/lib/utils/debug.js.map +1 -1
  112. package/lib/utils/persistence.js +143 -75
  113. package/lib/utils/persistence.js.map +1 -1
  114. package/lib/utils/plugin-registry.d.ts +1 -0
  115. package/lib/utils/plugin-registry.js.map +1 -1
  116. package/lib/vitals/WebVitalsPlugin.js +9 -4
  117. package/lib/vitals/WebVitalsPlugin.js.map +1 -1
  118. package/package.json +14 -6
  119. package/types/analytics/AnalyticsPlugin.d.ts +8 -0
  120. package/types/analytics/index.d.ts +2 -0
  121. package/types/analytics/types.d.ts +5 -0
  122. package/types/cookies/cookieUtils.d.ts +0 -4
  123. package/types/core/DOMChangesPluginLite.d.ts +3 -0
  124. package/types/core/HTMLInjector.d.ts +1 -0
  125. package/types/core/PendingChangeManager.d.ts +0 -1
  126. package/types/generated/buildInfo.d.ts +2 -0
  127. package/types/index.d.ts +2 -0
  128. package/types/overrides/OverridesPluginLite.d.ts +5 -1
  129. package/types/types/index.d.ts +5 -0
  130. package/types/url-redirect/URLRedirectMatcher.d.ts +3 -0
  131. package/types/url-redirect/types.d.ts +1 -1
  132. package/types/utils/URLMatcher.d.ts +1 -7
  133. package/types/utils/debug.d.ts +6 -1
  134. 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 _this = this;
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
- allVariantsChanges.forEach(function (variantChanges) {
105
- variantChanges.forEach(function (change) {
106
- if (change.trigger_on_view) {
107
- if (change.type === 'move') {
108
- if (!moveElements.has(change.selector)) {
109
- moveElements.set(change.selector, new Set());
110
- }
111
- // Add the target parent for this move
112
- if (change.targetSelector) {
113
- moveElements.get(change.selector).add(change.targetSelector);
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
- else if (change.type === 'delete') {
117
- // Track delete changes - need special handling for placeholders
118
- deleteElements.add(change.selector);
119
- }
120
- else {
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
- // For cross-variant move tracking, we need to track the EXACT POSITION where
128
- // elements would appear in other variants. We use container-based invisible elements
129
- // positioned exactly where the element would be, using CSS positioning.
130
- moveElements.forEach(function (_targetParents, selector) {
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
- allVariantsChanges.forEach(function (variantChanges, variantIndex) {
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
- allMovesForElement.forEach(function (move, index) {
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
- _this.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
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
- // For ALL variant moves, create placeholders at those positions
160
- allMovesForElement.forEach(function (move) {
161
- _this.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
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
- // For cross-variant delete tracking, we need to handle elements that are deleted in some variants
166
- // For variants with delete: replace element with 1px placeholder in the same position
167
- // For variants without delete: track the actual element
168
- deleteElements.forEach(function (selector) {
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 = _this.createInPlacePlaceholder(experimentName, selector);
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 (_this.debug) {
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 _this = this;
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
- elements.forEach(function (element, index) {
306
- var _a;
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
- return;
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
- _this.placeholders.set(placeholderKey, placeholder);
400
+ this.placeholders.set(placeholderKey, placeholder);
329
401
  // Track the placeholder for viewport visibility
330
- _this.trackElement(placeholder, experimentName);
402
+ this.trackElement(placeholder, experimentName);
331
403
  placeholdersCreated++;
332
- if (_this.debug) {
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 _this = this;
376
- selectors.forEach(function (selector) {
377
- // Try to find existing elements
378
- var elements = document.querySelectorAll(selector);
379
- if (elements.length > 0) {
380
- elements.forEach(function (element) {
381
- _this.trackElement(element, experimentName);
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
- else {
385
- // Element doesn't exist yet, set up mutation observer to watch for it
386
- _this.watchForSelector(selector, experimentName);
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
- entries.forEach(function (entry) {
423
- if (entry.isIntersecting) {
424
- _this.handleElementVisible(entry.target);
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
- mutations.forEach(function (mutation) {
439
- mutation.addedNodes.forEach(function (node) {
440
- if (node instanceof Element) {
441
- // Check if this element or its children match any tracked selectors
442
- _this.checkNewElement(node);
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 _this = this;
457
- this.experiments.forEach(function (tracking, experimentName) {
458
- tracking.allPossibleSelectors.forEach(function (selector) {
459
- if (element.matches(selector)) {
460
- _this.trackElement(element, experimentName);
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
- // Also check children
463
- element.querySelectorAll(selector).forEach(function (child) {
464
- _this.trackElement(child, experimentName);
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 _this = this;
627
+ var e_14, _a;
474
628
  var tracked = this.trackedElements.get(element);
475
629
  if (!tracked)
476
630
  return;
477
- tracked.experiments.forEach(function (experimentName) {
478
- var experiment = _this.experiments.get(experimentName);
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
- _this.triggerExposure(experimentName).catch(function (error) {
635
+ this_3.triggerExposure(experimentName).catch(function (error) {
482
636
  logDebug("[ABsmartly] Failed to trigger exposure for ".concat(experimentName, ":"), error);
483
637
  });
484
- if (_this.debug) {
638
+ if (this_3.debug) {
485
639
  var selector = tracked.isPlaceholder
486
640
  ? element.getAttribute('data-absmartly-original-selector')
487
- : _this.getElementSelector(element);
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 _this = this;
539
- // Remove from tracked elements
540
- this.trackedElements.forEach(function (tracked, element) {
541
- tracked.experiments.delete(experimentName);
542
- if (tracked.experiments.size === 0) {
543
- _this.observer.unobserve(element);
544
- _this.trackedElements.delete(element);
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
- // Remove placeholders
548
- this.placeholders.forEach(function (placeholder, key) {
549
- if (key.startsWith("".concat(experimentName, "-"))) {
550
- placeholder.remove();
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 no experiments left
561
- if (this.experiments.size === 0 && this.mutationObserver) {
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
- // Remove all placeholders
605
- this.placeholders.forEach(function (placeholder) { return placeholder.remove(); });
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();