@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
@@ -84,6 +84,7 @@ var debug_1 = require("../utils/debug");
84
84
  var URLMatcher_1 = require("../utils/URLMatcher");
85
85
  var persistence_1 = require("../utils/persistence");
86
86
  var plugin_registry_1 = require("../utils/plugin-registry");
87
+ var buildInfo_1 = require("../generated/buildInfo");
87
88
  var DOMChangesPluginLite = /** @class */ (function () {
88
89
  function DOMChangesPluginLite(config) {
89
90
  var _this = this;
@@ -96,6 +97,9 @@ var DOMChangesPluginLite = /** @class */ (function () {
96
97
  this.persistenceManager = null;
97
98
  this.antiFlickerTimeout = null;
98
99
  this.antiFlickerStyleId = 'absmartly-antiflicker';
100
+ this.originalPushState = null;
101
+ this.originalReplaceState = null;
102
+ this.popstateHandler = null;
99
103
  this.config = {
100
104
  context: config.context,
101
105
  autoApply: (_a = config.autoApply) !== null && _a !== void 0 ? _a : true,
@@ -202,6 +206,10 @@ var DOMChangesPluginLite = /** @class */ (function () {
202
206
  case 4:
203
207
  error_1 = _a.sent();
204
208
  (0, debug_1.logDebug)('[ABsmartly] Failed to initialize plugin:', error_1);
209
+ this.emit('error', {
210
+ type: 'initialization_error',
211
+ error: (error_1 === null || error_1 === void 0 ? void 0 : error_1.message) || String(error_1),
212
+ });
205
213
  throw error_1;
206
214
  case 5: return [2 /*return*/];
207
215
  }
@@ -211,45 +219,96 @@ var DOMChangesPluginLite = /** @class */ (function () {
211
219
  DOMChangesPluginLite.prototype.setupMutationObserver = function () {
212
220
  var _this = this;
213
221
  var observer = new MutationObserver(function (mutations) {
214
- // Re-apply ALL changes to elements that were replaced by React (hydration mismatch)
215
- mutations.forEach(function (mutation) {
216
- if (mutation.type === 'childList') {
217
- // Check if any added nodes match our applied change selectors
218
- mutation.addedNodes.forEach(function (node) {
219
- var _a;
220
- if (node.nodeType === Node.ELEMENT_NODE) {
221
- var element_1 = node;
222
- // Check all experiments with applied changes (not just style changes)
223
- var appliedChanges = ((_a = _this.persistenceManager) === null || _a === void 0 ? void 0 : _a.getAppliedChanges()) || new Map();
224
- appliedChanges.forEach(function (changes, experimentName) {
225
- changes.forEach(function (change) {
222
+ var e_1, _a, e_2, _b, e_3, _c, e_4, _d, e_5, _e;
223
+ var _f;
224
+ try {
225
+ // Re-apply ALL changes to elements that were replaced by React (hydration mismatch)
226
+ for (var mutations_1 = __values(mutations), mutations_1_1 = mutations_1.next(); !mutations_1_1.done; mutations_1_1 = mutations_1.next()) {
227
+ var mutation = mutations_1_1.value;
228
+ if (mutation.type === 'childList') {
229
+ try {
230
+ // Check if any added nodes match our applied change selectors
231
+ for (var _g = (e_2 = void 0, __values(mutation.addedNodes)), _h = _g.next(); !_h.done; _h = _g.next()) {
232
+ var node = _h.value;
233
+ if (node.nodeType === Node.ELEMENT_NODE) {
234
+ var element = node;
235
+ // Check all experiments with applied changes (not just style changes)
236
+ var appliedChanges = ((_f = _this.persistenceManager) === null || _f === void 0 ? void 0 : _f.getAppliedChanges()) || new Map();
226
237
  try {
227
- // Check if this new element or any of its descendants match the selector
228
- var matchingElements = element_1.matches(change.selector)
229
- ? [element_1]
230
- : Array.from(element_1.querySelectorAll(change.selector));
231
- matchingElements.forEach(function (matchingEl) {
232
- if (_this.config.debug) {
233
- (0, debug_1.logDebug)('[SPA-REAPPLY] Re-applying change to newly added element (React hydration recovery)', {
234
- experimentName: experimentName,
235
- selector: change.selector,
236
- element: matchingEl.tagName,
237
- changeType: change.type,
238
- });
238
+ for (var appliedChanges_1 = (e_3 = void 0, __values(appliedChanges)), appliedChanges_1_1 = appliedChanges_1.next(); !appliedChanges_1_1.done; appliedChanges_1_1 = appliedChanges_1.next()) {
239
+ var _j = __read(appliedChanges_1_1.value, 2), experimentName = _j[0], changes = _j[1];
240
+ try {
241
+ for (var changes_1 = (e_4 = void 0, __values(changes)), changes_1_1 = changes_1.next(); !changes_1_1.done; changes_1_1 = changes_1.next()) {
242
+ var change = changes_1_1.value;
243
+ try {
244
+ // Check if this new element or any of its descendants match the selector
245
+ var matchingElements = element.matches(change.selector)
246
+ ? [element]
247
+ : Array.from(element.querySelectorAll(change.selector));
248
+ try {
249
+ for (var matchingElements_1 = (e_5 = void 0, __values(matchingElements)), matchingElements_1_1 = matchingElements_1.next(); !matchingElements_1_1.done; matchingElements_1_1 = matchingElements_1.next()) {
250
+ var matchingEl = matchingElements_1_1.value;
251
+ if (_this.config.debug) {
252
+ (0, debug_1.logDebug)('[SPA-REAPPLY] Re-applying change to newly added element (React hydration recovery)', {
253
+ experimentName: experimentName,
254
+ selector: change.selector,
255
+ element: matchingEl.tagName,
256
+ changeType: change.type,
257
+ });
258
+ }
259
+ // Re-apply the change to the new element (ALL types: style, class, attribute, html, text, etc.)
260
+ _this.domManipulator.applyChange(change, experimentName);
261
+ }
262
+ }
263
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
264
+ finally {
265
+ try {
266
+ if (matchingElements_1_1 && !matchingElements_1_1.done && (_e = matchingElements_1.return)) _e.call(matchingElements_1);
267
+ }
268
+ finally { if (e_5) throw e_5.error; }
269
+ }
270
+ }
271
+ catch (e) {
272
+ // Invalid selector, skip
273
+ }
274
+ }
239
275
  }
240
- // Re-apply the change to the new element (ALL types: style, class, attribute, html, text, etc.)
241
- _this.domManipulator.applyChange(change, experimentName);
242
- });
276
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
277
+ finally {
278
+ try {
279
+ if (changes_1_1 && !changes_1_1.done && (_d = changes_1.return)) _d.call(changes_1);
280
+ }
281
+ finally { if (e_4) throw e_4.error; }
282
+ }
283
+ }
243
284
  }
244
- catch (e) {
245
- // Invalid selector, skip
285
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
286
+ finally {
287
+ try {
288
+ if (appliedChanges_1_1 && !appliedChanges_1_1.done && (_c = appliedChanges_1.return)) _c.call(appliedChanges_1);
289
+ }
290
+ finally { if (e_3) throw e_3.error; }
246
291
  }
247
- });
248
- });
292
+ }
293
+ }
249
294
  }
250
- });
295
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
296
+ finally {
297
+ try {
298
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
299
+ }
300
+ finally { if (e_2) throw e_2.error; }
301
+ }
302
+ }
251
303
  }
252
- });
304
+ }
305
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
306
+ finally {
307
+ try {
308
+ if (mutations_1_1 && !mutations_1_1.done && (_a = mutations_1.return)) _a.call(mutations_1);
309
+ }
310
+ finally { if (e_1) throw e_1.error; }
311
+ }
253
312
  });
254
313
  // Wait for document.body to exist before observing
255
314
  // This prevents "parameter 1 is not of type 'Node'" errors when SDK loads in <head>
@@ -304,24 +363,23 @@ var DOMChangesPluginLite = /** @class */ (function () {
304
363
  });
305
364
  }); };
306
365
  // Listen to popstate (back/forward navigation)
307
- window.addEventListener('popstate', handleURLChange);
366
+ this.popstateHandler = handleURLChange;
367
+ window.addEventListener('popstate', this.popstateHandler);
308
368
  // Intercept pushState and replaceState
309
- var originalPushState = history.pushState;
310
- var originalReplaceState = history.replaceState;
311
- history.pushState = function () {
312
- var args = [];
313
- for (var _i = 0; _i < arguments.length; _i++) {
314
- args[_i] = arguments[_i];
369
+ this.originalPushState = history.pushState;
370
+ this.originalReplaceState = history.replaceState;
371
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
372
+ var self = this;
373
+ history.pushState = function (data, unused, url) {
374
+ if (self.originalPushState) {
375
+ self.originalPushState.call(history, data, unused, url);
315
376
  }
316
- originalPushState.apply(history, args);
317
377
  handleURLChange();
318
378
  };
319
- history.replaceState = function () {
320
- var args = [];
321
- for (var _i = 0; _i < arguments.length; _i++) {
322
- args[_i] = arguments[_i];
379
+ history.replaceState = function (data, unused, url) {
380
+ if (self.originalReplaceState) {
381
+ self.originalReplaceState.call(history, data, unused, url);
323
382
  }
324
- originalReplaceState.apply(history, args);
325
383
  handleURLChange();
326
384
  };
327
385
  if (this.config.debug) {
@@ -335,18 +393,14 @@ var DOMChangesPluginLite = /** @class */ (function () {
335
393
  DOMChangesPluginLite.prototype.removeAllChanges = function () {
336
394
  return __awaiter(this, void 0, void 0, function () {
337
395
  return __generator(this, function (_a) {
338
- // Clear exposed experiments - ExposureTracker will re-register on next applyChanges
396
+ // ExposureTracker will re-register on next applyChanges
339
397
  this.exposedExperiments.clear();
340
- // Clear style managers - StyleSheetManager doesn't have a remove method
341
- // The stylesheets will be reused or cleared on next applyChanges
398
+ // StyleSheetManager doesn't have a remove method, stylesheets will be reused on next applyChanges
342
399
  this.styleManagers.clear();
343
- // Clear applied changes
344
400
  if (this.persistenceManager) {
345
401
  this.persistenceManager.clearAll();
346
402
  }
347
- // Clear HTML injections
348
403
  this.htmlInjector.destroy();
349
- // Clear variant extractor cache to force re-extraction
350
404
  this.variantExtractor.clearCache();
351
405
  if (this.config.debug) {
352
406
  (0, debug_1.logDebug)('[ABsmartly] All change tracking cleared for URL change');
@@ -426,10 +480,10 @@ var DOMChangesPluginLite = /** @class */ (function () {
426
480
  };
427
481
  DOMChangesPluginLite.prototype.applyChanges = function (experimentName) {
428
482
  return __awaiter(this, void 0, void 0, function () {
429
- var startTime, currentURL, error_3, allExperiments, totalApplied, experimentStats, allExperiments_1, allExperiments_1_1, _a, expName, experimentData, currentVariant, variantData, urlFilter, globalDefaults, anyVariantMatchesURL, shouldApplyVisualChanges, changes, allVariantChanges, hasAnyChangesInAnyVariant, stats, changes_1, changes_1_1, change, success, elements, hasAnyViewportTriggerInAnyVariant, hasAnyImmediateTriggerInAnyVariant, allVariantsData, allVariantsData_1, allVariantsData_1_1, _b, variantIndex, variantData_1, variantChanges, variantMatchesURL, config, urlFilterConfig, variantChanges_1, variantChanges_1_1, change, duration;
430
- var e_1, _c, e_2, _d, e_3, _e, e_4, _f;
431
- return __generator(this, function (_g) {
432
- switch (_g.label) {
483
+ var startTime, currentURL, error_3, allExperiments, totalApplied, experimentStats, allExperiments_1, allExperiments_1_1, _a, expName, experimentData, currentVariant, variantData, urlFilter, globalDefaults, anyVariantMatchesURL, shouldApplyVisualChanges, changes, allVariantChanges, hasAnyChangesInAnyVariant, stats, changes_2, changes_2_1, change, success, elements, hasAnyViewportTriggerInAnyVariant, hasAnyImmediateTriggerInAnyVariant, allVariantsData, allVariantsData_1, allVariantsData_1_1, _b, idx, data, allVariantsData_2, allVariantsData_2_1, _c, variantIndex, variantData_1, variantChanges, variantMatchesURL, config, urlFilterConfig, variantChanges_1, variantChanges_1_1, change, duration;
484
+ var e_6, _d, e_7, _e, e_8, _f, e_9, _g, e_10, _h;
485
+ return __generator(this, function (_j) {
486
+ switch (_j.label) {
433
487
  case 0:
434
488
  startTime = performance.now();
435
489
  currentURL = window.location.href;
@@ -444,15 +498,15 @@ var DOMChangesPluginLite = /** @class */ (function () {
444
498
  (0, debug_1.logDebug)('[ABsmartly] Current URL:', currentURL);
445
499
  (0, debug_1.logDebug)('[ABsmartly] Context ready:', true);
446
500
  }
447
- _g.label = 1;
501
+ _j.label = 1;
448
502
  case 1:
449
- _g.trys.push([1, 3, , 4]);
503
+ _j.trys.push([1, 3, , 4]);
450
504
  return [4 /*yield*/, this.config.context.ready()];
451
505
  case 2:
452
- _g.sent();
506
+ _j.sent();
453
507
  return [3 /*break*/, 4];
454
508
  case 3:
455
- error_3 = _g.sent();
509
+ error_3 = _j.sent();
456
510
  (0, debug_1.logDebug)('[ABsmartly] Failed to wait for context ready:', error_3);
457
511
  return [2 /*return*/];
458
512
  case 4:
@@ -538,8 +592,8 @@ var DOMChangesPluginLite = /** @class */ (function () {
538
592
  // Apply visual changes only if URL matches for user's variant AND user has changes
539
593
  if (shouldApplyVisualChanges && changes && changes.length > 0) {
540
594
  try {
541
- for (changes_1 = (e_2 = void 0, __values(changes)), changes_1_1 = changes_1.next(); !changes_1_1.done; changes_1_1 = changes_1.next()) {
542
- change = changes_1_1.value;
595
+ for (changes_2 = (e_7 = void 0, __values(changes)), changes_2_1 = changes_2.next(); !changes_2_1.done; changes_2_1 = changes_2.next()) {
596
+ change = changes_2_1.value;
543
597
  // Skip delete changes with viewport triggers - they must be applied AFTER exposure
544
598
  // Otherwise the element is removed before it can be observed
545
599
  if (change.type === 'delete' && change.trigger_on_view) {
@@ -569,12 +623,12 @@ var DOMChangesPluginLite = /** @class */ (function () {
569
623
  }
570
624
  }
571
625
  }
572
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
626
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
573
627
  finally {
574
628
  try {
575
- if (changes_1_1 && !changes_1_1.done && (_d = changes_1.return)) _d.call(changes_1);
629
+ if (changes_2_1 && !changes_2_1.done && (_e = changes_2.return)) _e.call(changes_2);
576
630
  }
577
- finally { if (e_2) throw e_2.error; }
631
+ finally { if (e_7) throw e_7.error; }
578
632
  }
579
633
  }
580
634
  else if (changes && changes.length > 0) {
@@ -588,21 +642,31 @@ var DOMChangesPluginLite = /** @class */ (function () {
588
642
  allVariantsDataSize: allVariantsData.size,
589
643
  allVariantChangesLength: allVariantChanges.length,
590
644
  });
591
- // Log the structure of each variant's data
592
- allVariantsData.forEach(function (data, idx) {
593
- (0, debug_1.logDebug)("[ABsmartly] Variant ".concat(idx, " data structure:"), {
594
- isArray: Array.isArray(data),
595
- isObject: typeof data === 'object',
596
- hasUrlFilter: data && typeof data === 'object' && !Array.isArray(data) && 'urlFilter' in data,
597
- keys: data && typeof data === 'object' && !Array.isArray(data) ? Object.keys(data) : 'N/A',
598
- });
599
- });
645
+ try {
646
+ // Log the structure of each variant's data
647
+ for (allVariantsData_1 = (e_8 = void 0, __values(allVariantsData)), allVariantsData_1_1 = allVariantsData_1.next(); !allVariantsData_1_1.done; allVariantsData_1_1 = allVariantsData_1.next()) {
648
+ _b = __read(allVariantsData_1_1.value, 2), idx = _b[0], data = _b[1];
649
+ (0, debug_1.logDebug)("[ABsmartly] Variant ".concat(idx, " data structure:"), {
650
+ isArray: Array.isArray(data),
651
+ isObject: typeof data === 'object',
652
+ hasUrlFilter: data && typeof data === 'object' && !Array.isArray(data) && 'urlFilter' in data,
653
+ keys: data && typeof data === 'object' && !Array.isArray(data) ? Object.keys(data) : 'N/A',
654
+ });
655
+ }
656
+ }
657
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
658
+ finally {
659
+ try {
660
+ if (allVariantsData_1_1 && !allVariantsData_1_1.done && (_f = allVariantsData_1.return)) _f.call(allVariantsData_1);
661
+ }
662
+ finally { if (e_8) throw e_8.error; }
663
+ }
600
664
  }
601
665
  try {
602
666
  // Loop through ALL variants (not just ones with changes)
603
667
  // We need to check URL filters from the raw data, which includes variants without changes
604
- for (allVariantsData_1 = (e_3 = void 0, __values(allVariantsData)), allVariantsData_1_1 = allVariantsData_1.next(); !allVariantsData_1_1.done; allVariantsData_1_1 = allVariantsData_1.next()) {
605
- _b = __read(allVariantsData_1_1.value, 2), variantIndex = _b[0], variantData_1 = _b[1];
668
+ for (allVariantsData_2 = (e_9 = void 0, __values(allVariantsData)), allVariantsData_2_1 = allVariantsData_2.next(); !allVariantsData_2_1.done; allVariantsData_2_1 = allVariantsData_2.next()) {
669
+ _c = __read(allVariantsData_2_1.value, 2), variantIndex = _c[0], variantData_1 = _c[1];
606
670
  variantChanges = allVariantChanges[variantIndex];
607
671
  if (!variantChanges || variantChanges.length === 0) {
608
672
  continue;
@@ -622,7 +686,7 @@ var DOMChangesPluginLite = /** @class */ (function () {
622
686
  // Only collect trigger types from variants whose URL filters match
623
687
  if (variantMatchesURL) {
624
688
  try {
625
- for (variantChanges_1 = (e_4 = void 0, __values(variantChanges)), variantChanges_1_1 = variantChanges_1.next(); !variantChanges_1_1.done; variantChanges_1_1 = variantChanges_1.next()) {
689
+ for (variantChanges_1 = (e_10 = void 0, __values(variantChanges)), variantChanges_1_1 = variantChanges_1.next(); !variantChanges_1_1.done; variantChanges_1_1 = variantChanges_1.next()) {
626
690
  change = variantChanges_1_1.value;
627
691
  if (change.trigger_on_view) {
628
692
  hasAnyViewportTriggerInAnyVariant = true;
@@ -636,12 +700,12 @@ var DOMChangesPluginLite = /** @class */ (function () {
636
700
  }
637
701
  }
638
702
  }
639
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
703
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
640
704
  finally {
641
705
  try {
642
- if (variantChanges_1_1 && !variantChanges_1_1.done && (_f = variantChanges_1.return)) _f.call(variantChanges_1);
706
+ if (variantChanges_1_1 && !variantChanges_1_1.done && (_h = variantChanges_1.return)) _h.call(variantChanges_1);
643
707
  }
644
- finally { if (e_4) throw e_4.error; }
708
+ finally { if (e_10) throw e_10.error; }
645
709
  }
646
710
  if (this.config.debug) {
647
711
  (0, debug_1.logDebug)("[ABsmartly] Variant ".concat(variantIndex, " matches URL - hasImmediate: ").concat(hasAnyImmediateTriggerInAnyVariant, ", hasViewport: ").concat(hasAnyViewportTriggerInAnyVariant));
@@ -657,12 +721,12 @@ var DOMChangesPluginLite = /** @class */ (function () {
657
721
  }
658
722
  }
659
723
  }
660
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
724
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
661
725
  finally {
662
726
  try {
663
- if (allVariantsData_1_1 && !allVariantsData_1_1.done && (_e = allVariantsData_1.return)) _e.call(allVariantsData_1);
727
+ if (allVariantsData_2_1 && !allVariantsData_2_1.done && (_g = allVariantsData_2.return)) _g.call(allVariantsData_2);
664
728
  }
665
- finally { if (e_3) throw e_3.error; }
729
+ finally { if (e_9) throw e_9.error; }
666
730
  }
667
731
  if (this.config.debug) {
668
732
  (0, debug_1.logDebug)("[TRIGGER-DETECTION] [".concat(expName, "] Final trigger decision for '").concat(expName, "':"), {
@@ -708,12 +772,12 @@ var DOMChangesPluginLite = /** @class */ (function () {
708
772
  (0, debug_1.logExperimentSummary)(expName, stats.total, stats.success, stats.pending);
709
773
  }
710
774
  }
711
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
775
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
712
776
  finally {
713
777
  try {
714
- if (allExperiments_1_1 && !allExperiments_1_1.done && (_c = allExperiments_1.return)) _c.call(allExperiments_1);
778
+ if (allExperiments_1_1 && !allExperiments_1_1.done && (_d = allExperiments_1.return)) _d.call(allExperiments_1);
715
779
  }
716
- finally { if (e_1) throw e_1.error; }
780
+ finally { if (e_6) throw e_6.error; }
717
781
  }
718
782
  duration = performance.now() - startTime;
719
783
  (0, debug_1.logPerformance)('Apply changes', duration, {
@@ -742,6 +806,7 @@ var DOMChangesPluginLite = /** @class */ (function () {
742
806
  if (this.config.hideUntilReady) {
743
807
  this.showContent();
744
808
  }
809
+ (0, debug_1.logDebug)('[ABsmartly] DOM changes applied');
745
810
  this.emit('changes-applied', { count: totalApplied, experimentName: experimentName });
746
811
  return [2 /*return*/];
747
812
  }
@@ -752,7 +817,7 @@ var DOMChangesPluginLite = /** @class */ (function () {
752
817
  * Get all experiments with their variant data and metadata
753
818
  */
754
819
  DOMChangesPluginLite.prototype.getAllExperimentsData = function () {
755
- var e_5, _a;
820
+ var e_11, _a;
756
821
  var experiments = new Map();
757
822
  var allVariants = this.variantExtractor.extractAllChanges();
758
823
  (0, debug_1.logDebug)('[GET-EXPERIMENTS] Extracting experiment data from context', {
@@ -804,6 +869,8 @@ var DOMChangesPluginLite = /** @class */ (function () {
804
869
  globalDefaults = {
805
870
  waitForElement: config.waitForElement,
806
871
  persistStyle: config.persistStyle,
872
+ persistAttribute: config.persistAttribute,
873
+ persistScript: config.persistScript,
807
874
  important: config.important,
808
875
  observerRoot: config.observerRoot,
809
876
  };
@@ -811,12 +878,12 @@ var DOMChangesPluginLite = /** @class */ (function () {
811
878
  experiments.set(expName, { variantData: variantData, urlFilter: urlFilter, globalDefaults: globalDefaults });
812
879
  }
813
880
  }
814
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
881
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
815
882
  finally {
816
883
  try {
817
884
  if (allVariants_1_1 && !allVariants_1_1.done && (_a = allVariants_1.return)) _a.call(allVariants_1);
818
885
  }
819
- finally { if (e_5) throw e_5.error; }
886
+ finally { if (e_11) throw e_11.error; }
820
887
  }
821
888
  return experiments;
822
889
  };
@@ -840,8 +907,8 @@ var DOMChangesPluginLite = /** @class */ (function () {
840
907
  }
841
908
  // Apply global defaults to each change
842
909
  return changes.map(function (change) {
843
- var _a, _b, _c, _d;
844
- return (__assign(__assign({}, change), { waitForElement: (_a = change.waitForElement) !== null && _a !== void 0 ? _a : globalDefaults.waitForElement, persistStyle: (_b = change.persistStyle) !== null && _b !== void 0 ? _b : globalDefaults.persistStyle, important: (_c = change.important) !== null && _c !== void 0 ? _c : globalDefaults.important, observerRoot: (_d = change.observerRoot) !== null && _d !== void 0 ? _d : globalDefaults.observerRoot }));
910
+ var _a, _b, _c, _d, _e, _f;
911
+ return (__assign(__assign({}, change), { waitForElement: (_a = change.waitForElement) !== null && _a !== void 0 ? _a : globalDefaults.waitForElement, persistStyle: (_b = change.persistStyle) !== null && _b !== void 0 ? _b : globalDefaults.persistStyle, persistAttribute: (_c = change.persistAttribute) !== null && _c !== void 0 ? _c : globalDefaults.persistAttribute, persistScript: (_d = change.persistScript) !== null && _d !== void 0 ? _d : globalDefaults.persistScript, important: (_e = change.important) !== null && _e !== void 0 ? _e : globalDefaults.important, observerRoot: (_f = change.observerRoot) !== null && _f !== void 0 ? _f : globalDefaults.observerRoot }));
845
912
  });
846
913
  };
847
914
  /**
@@ -869,14 +936,16 @@ var DOMChangesPluginLite = /** @class */ (function () {
869
936
  globalDefaults = {
870
937
  waitForElement: config.waitForElement,
871
938
  persistStyle: config.persistStyle,
939
+ persistAttribute: config.persistAttribute,
940
+ persistScript: config.persistScript,
872
941
  important: config.important,
873
942
  observerRoot: config.observerRoot,
874
943
  };
875
944
  }
876
945
  // Apply global defaults
877
946
  var processedChanges = variantChanges.map(function (change) {
878
- var _a, _b, _c, _d;
879
- return (__assign(__assign({}, change), { waitForElement: (_a = change.waitForElement) !== null && _a !== void 0 ? _a : globalDefaults.waitForElement, persistStyle: (_b = change.persistStyle) !== null && _b !== void 0 ? _b : globalDefaults.persistStyle, important: (_c = change.important) !== null && _c !== void 0 ? _c : globalDefaults.important, observerRoot: (_d = change.observerRoot) !== null && _d !== void 0 ? _d : globalDefaults.observerRoot }));
947
+ var _a, _b, _c, _d, _e, _f;
948
+ return (__assign(__assign({}, change), { waitForElement: (_a = change.waitForElement) !== null && _a !== void 0 ? _a : globalDefaults.waitForElement, persistStyle: (_b = change.persistStyle) !== null && _b !== void 0 ? _b : globalDefaults.persistStyle, persistAttribute: (_c = change.persistAttribute) !== null && _c !== void 0 ? _c : globalDefaults.persistAttribute, persistScript: (_d = change.persistScript) !== null && _d !== void 0 ? _d : globalDefaults.persistScript, important: (_e = change.important) !== null && _e !== void 0 ? _e : globalDefaults.important, observerRoot: (_f = change.observerRoot) !== null && _f !== void 0 ? _f : globalDefaults.observerRoot }));
880
949
  });
881
950
  processedVariants.push(processedChanges);
882
951
  };
@@ -921,12 +990,23 @@ var DOMChangesPluginLite = /** @class */ (function () {
921
990
  change: change,
922
991
  });
923
992
  }
993
+ else {
994
+ this.emit('change_failed', {
995
+ experimentName: experimentName,
996
+ change: change,
997
+ reason: 'selector_not_found_or_apply_failed',
998
+ });
999
+ }
924
1000
  return success;
925
1001
  }
926
1002
  catch (error) {
927
- if (this.config.debug) {
928
- (0, debug_1.logDebug)('[ABsmartly] Error applying change:', error);
929
- }
1003
+ (0, debug_1.logDebug)('[ABsmartly] Error applying change:', error);
1004
+ this.emit('error', {
1005
+ type: 'change_apply_error',
1006
+ experimentName: experimentName,
1007
+ change: change,
1008
+ error: (error === null || error === void 0 ? void 0 : error.message) || String(error),
1009
+ });
930
1010
  return false;
931
1011
  }
932
1012
  };
@@ -948,7 +1028,7 @@ var DOMChangesPluginLite = /** @class */ (function () {
948
1028
  }
949
1029
  };
950
1030
  DOMChangesPluginLite.prototype.emit = function (event, data) {
951
- var e_6, _a;
1031
+ var e_12, _a;
952
1032
  var listeners = this.eventListeners.get(event) || [];
953
1033
  try {
954
1034
  for (var listeners_1 = __values(listeners), listeners_1_1 = listeners_1.next(); !listeners_1_1.done; listeners_1_1 = listeners_1.next()) {
@@ -961,12 +1041,12 @@ var DOMChangesPluginLite = /** @class */ (function () {
961
1041
  }
962
1042
  }
963
1043
  }
964
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
1044
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
965
1045
  finally {
966
1046
  try {
967
1047
  if (listeners_1_1 && !listeners_1_1.done && (_a = listeners_1.return)) _a.call(listeners_1);
968
1048
  }
969
- finally { if (e_6) throw e_6.error; }
1049
+ finally { if (e_12) throw e_12.error; }
970
1050
  }
971
1051
  };
972
1052
  DOMChangesPluginLite.prototype.getStyleManager = function (experimentName) {
@@ -1017,10 +1097,23 @@ var DOMChangesPluginLite = /** @class */ (function () {
1017
1097
  }
1018
1098
  };
1019
1099
  DOMChangesPluginLite.prototype.destroy = function () {
1100
+ var e_13, _a;
1020
1101
  this.domManipulator.destroy();
1021
1102
  this.exposureTracker.destroy();
1022
1103
  this.htmlInjector.destroy();
1023
- this.styleManagers.forEach(function (manager) { return manager.destroy(); });
1104
+ try {
1105
+ for (var _b = __values(this.styleManagers.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
1106
+ var manager = _c.value;
1107
+ manager.destroy();
1108
+ }
1109
+ }
1110
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
1111
+ finally {
1112
+ try {
1113
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
1114
+ }
1115
+ finally { if (e_13) throw e_13.error; }
1116
+ }
1024
1117
  this.styleManagers.clear();
1025
1118
  if (this.mutationObserver) {
1026
1119
  this.mutationObserver.disconnect();
@@ -1039,6 +1132,18 @@ var DOMChangesPluginLite = /** @class */ (function () {
1039
1132
  if (antiFlickerStyle) {
1040
1133
  antiFlickerStyle.remove();
1041
1134
  }
1135
+ // Restore history methods
1136
+ if (this.originalPushState) {
1137
+ history.pushState = this.originalPushState;
1138
+ }
1139
+ if (this.originalReplaceState) {
1140
+ history.replaceState = this.originalReplaceState;
1141
+ }
1142
+ // Remove popstate listener
1143
+ if (this.popstateHandler) {
1144
+ window.removeEventListener('popstate', this.popstateHandler);
1145
+ this.popstateHandler = null;
1146
+ }
1042
1147
  this.eventListeners.clear();
1043
1148
  this.exposedExperiments.clear();
1044
1149
  this.unregisterFromContext();
@@ -1194,7 +1299,7 @@ var DOMChangesPluginLite = /** @class */ (function () {
1194
1299
  this.persistenceManager.unwatchElement(element, experimentName);
1195
1300
  }
1196
1301
  };
1197
- DOMChangesPluginLite.VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '1.1.2';
1302
+ DOMChangesPluginLite.VERSION = buildInfo_1.BUILD_VERSION;
1198
1303
  return DOMChangesPluginLite;
1199
1304
  }());
1200
1305
  exports.DOMChangesPluginLite = DOMChangesPluginLite;