@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
@@ -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 _this = this;
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
- allVariantsChanges.forEach(function (variantChanges) {
108
- variantChanges.forEach(function (change) {
109
- if (change.trigger_on_view) {
110
- if (change.type === 'move') {
111
- if (!moveElements.has(change.selector)) {
112
- moveElements.set(change.selector, new Set());
113
- }
114
- // Add the target parent for this move
115
- if (change.targetSelector) {
116
- moveElements.get(change.selector).add(change.targetSelector);
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
- else if (change.type === 'delete') {
120
- // Track delete changes - need special handling for placeholders
121
- deleteElements.add(change.selector);
122
- }
123
- else {
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
- // For cross-variant move tracking, we need to track the EXACT POSITION where
131
- // elements would appear in other variants. We use container-based invisible elements
132
- // positioned exactly where the element would be, using CSS positioning.
133
- moveElements.forEach(function (_targetParents, selector) {
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
- allVariantsChanges.forEach(function (variantChanges, variantIndex) {
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
- allMovesForElement.forEach(function (move, index) {
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
- _this.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
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
- // For ALL variant moves, create placeholders at those positions
163
- allMovesForElement.forEach(function (move) {
164
- _this.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
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
- // For cross-variant delete tracking, we need to handle elements that are deleted in some variants
169
- // For variants with delete: replace element with 1px placeholder in the same position
170
- // For variants without delete: track the actual element
171
- deleteElements.forEach(function (selector) {
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 = _this.createInPlacePlaceholder(experimentName, selector);
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 (_this.debug) {
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 _this = this;
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
- elements.forEach(function (element, index) {
309
- var _a;
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
- return;
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
- _this.placeholders.set(placeholderKey, placeholder);
403
+ this.placeholders.set(placeholderKey, placeholder);
332
404
  // Track the placeholder for viewport visibility
333
- _this.trackElement(placeholder, experimentName);
405
+ this.trackElement(placeholder, experimentName);
334
406
  placeholdersCreated++;
335
- if (_this.debug) {
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 _this = this;
379
- selectors.forEach(function (selector) {
380
- // Try to find existing elements
381
- var elements = document.querySelectorAll(selector);
382
- if (elements.length > 0) {
383
- elements.forEach(function (element) {
384
- _this.trackElement(element, experimentName);
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
- else {
388
- // Element doesn't exist yet, set up mutation observer to watch for it
389
- _this.watchForSelector(selector, experimentName);
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
- entries.forEach(function (entry) {
426
- if (entry.isIntersecting) {
427
- _this.handleElementVisible(entry.target);
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
- mutations.forEach(function (mutation) {
442
- mutation.addedNodes.forEach(function (node) {
443
- if (node instanceof Element) {
444
- // Check if this element or its children match any tracked selectors
445
- _this.checkNewElement(node);
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 _this = this;
460
- this.experiments.forEach(function (tracking, experimentName) {
461
- tracking.allPossibleSelectors.forEach(function (selector) {
462
- if (element.matches(selector)) {
463
- _this.trackElement(element, experimentName);
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
- // Also check children
466
- element.querySelectorAll(selector).forEach(function (child) {
467
- _this.trackElement(child, experimentName);
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 _this = this;
630
+ var e_14, _a;
477
631
  var tracked = this.trackedElements.get(element);
478
632
  if (!tracked)
479
633
  return;
480
- tracked.experiments.forEach(function (experimentName) {
481
- var experiment = _this.experiments.get(experimentName);
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
- _this.triggerExposure(experimentName).catch(function (error) {
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 (_this.debug) {
641
+ if (this_3.debug) {
488
642
  var selector = tracked.isPlaceholder
489
643
  ? element.getAttribute('data-absmartly-original-selector')
490
- : _this.getElementSelector(element);
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 _this = this;
542
- // Remove from tracked elements
543
- this.trackedElements.forEach(function (tracked, element) {
544
- tracked.experiments.delete(experimentName);
545
- if (tracked.experiments.size === 0) {
546
- _this.observer.unobserve(element);
547
- _this.trackedElements.delete(element);
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
- // Remove placeholders
551
- this.placeholders.forEach(function (placeholder, key) {
552
- if (key.startsWith("".concat(experimentName, "-"))) {
553
- placeholder.remove();
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 no experiments left
564
- if (this.experiments.size === 0 && this.mutationObserver) {
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
- // Remove all placeholders
608
- this.placeholders.forEach(function (placeholder) { return placeholder.remove(); });
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();