@absmartly/sdk-plugins 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/absmartly-cookie.min.js +1 -1
- package/dist/absmartly-dom-changes-core.min.js +1 -1
- package/dist/absmartly-dom-changes-lite.min.js +1 -1
- package/dist/absmartly-overrides-full.min.js +1 -1
- package/dist/absmartly-overrides-lite.min.js +1 -1
- package/dist/absmartly-sdk-plugins.min.js +1 -1
- package/dist/absmartly-vitals.min.js +1 -1
- package/es/analytics/AnalyticsPlugin.js +96 -0
- package/es/analytics/AnalyticsPlugin.js.map +1 -0
- package/es/analytics/index.js +2 -0
- package/es/analytics/index.js.map +1 -0
- package/es/analytics/types.js +2 -0
- package/es/analytics/types.js.map +1 -0
- package/es/cookies/CookiePlugin.js +59 -18
- package/es/cookies/CookiePlugin.js.map +1 -1
- package/es/cookies/cookieUtils.js +2 -1
- package/es/cookies/cookieUtils.js.map +1 -1
- package/es/core/DOMChangesPluginLite.js +206 -101
- package/es/core/DOMChangesPluginLite.js.map +1 -1
- package/es/core/DOMManipulatorLite.js +187 -122
- package/es/core/DOMManipulatorLite.js.map +1 -1
- package/es/core/ExposureTracker.js +310 -108
- package/es/core/ExposureTracker.js.map +1 -1
- package/es/core/HTMLInjector.js +11 -1
- package/es/core/HTMLInjector.js.map +1 -1
- package/es/core/PendingChangeManager.js +125 -65
- package/es/core/PendingChangeManager.js.map +1 -1
- package/es/generated/buildInfo.js +3 -0
- package/es/generated/buildInfo.js.map +1 -0
- package/es/index.js +1 -0
- package/es/index.js.map +1 -1
- package/es/overrides/BrowserCookieAdapter.js +3 -31
- package/es/overrides/BrowserCookieAdapter.js.map +1 -1
- package/es/overrides/OverridesPlugin.js +39 -107
- package/es/overrides/OverridesPlugin.js.map +1 -1
- package/es/overrides/OverridesPluginLite.js +5 -136
- package/es/overrides/OverridesPluginLite.js.map +1 -1
- package/es/parsers/VariantExtractor.js +21 -18
- package/es/parsers/VariantExtractor.js.map +1 -1
- package/es/url-redirect/URLRedirectExtractor.js +8 -2
- package/es/url-redirect/URLRedirectExtractor.js.map +1 -1
- package/es/url-redirect/URLRedirectMatcher.js +136 -5
- package/es/url-redirect/URLRedirectMatcher.js.map +1 -1
- package/es/url-redirect/URLRedirectPlugin.js +16 -6
- package/es/url-redirect/URLRedirectPlugin.js.map +1 -1
- package/es/utils/URLMatcher.js +4 -3
- package/es/utils/URLMatcher.js.map +1 -1
- package/es/utils/debug.js +15 -3
- package/es/utils/debug.js.map +1 -1
- package/es/utils/persistence.js +143 -75
- package/es/utils/persistence.js.map +1 -1
- package/es/utils/plugin-registry.js.map +1 -1
- package/es/vitals/WebVitalsPlugin.js +9 -4
- package/es/vitals/WebVitalsPlugin.js.map +1 -1
- package/lib/analytics/AnalyticsPlugin.d.ts +8 -0
- package/lib/analytics/AnalyticsPlugin.js +99 -0
- package/lib/analytics/AnalyticsPlugin.js.map +1 -0
- package/lib/analytics/index.d.ts +2 -0
- package/lib/analytics/index.js +6 -0
- package/lib/analytics/index.js.map +1 -0
- package/lib/analytics/types.d.ts +5 -0
- package/lib/analytics/types.js +3 -0
- package/lib/analytics/types.js.map +1 -0
- package/lib/cookies/CookiePlugin.js +59 -18
- package/lib/cookies/CookiePlugin.js.map +1 -1
- package/lib/cookies/cookieUtils.d.ts +0 -4
- package/lib/cookies/cookieUtils.js +6 -5
- package/lib/cookies/cookieUtils.js.map +1 -1
- package/lib/core/DOMChangesPluginLite.d.ts +3 -0
- package/lib/core/DOMChangesPluginLite.js +206 -101
- package/lib/core/DOMChangesPluginLite.js.map +1 -1
- package/lib/core/DOMManipulatorLite.js +187 -122
- package/lib/core/DOMManipulatorLite.js.map +1 -1
- package/lib/core/ExposureTracker.js +310 -108
- package/lib/core/ExposureTracker.js.map +1 -1
- package/lib/core/HTMLInjector.d.ts +1 -0
- package/lib/core/HTMLInjector.js +11 -1
- package/lib/core/HTMLInjector.js.map +1 -1
- package/lib/core/PendingChangeManager.d.ts +0 -1
- package/lib/core/PendingChangeManager.js +125 -65
- package/lib/core/PendingChangeManager.js.map +1 -1
- package/lib/generated/buildInfo.d.ts +2 -0
- package/lib/generated/buildInfo.js +6 -0
- package/lib/generated/buildInfo.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/overrides/BrowserCookieAdapter.js +3 -31
- package/lib/overrides/BrowserCookieAdapter.js.map +1 -1
- package/lib/overrides/OverridesPlugin.js +39 -107
- package/lib/overrides/OverridesPlugin.js.map +1 -1
- package/lib/overrides/OverridesPluginLite.d.ts +5 -1
- package/lib/overrides/OverridesPluginLite.js +5 -136
- package/lib/overrides/OverridesPluginLite.js.map +1 -1
- package/lib/parsers/VariantExtractor.js +21 -18
- package/lib/parsers/VariantExtractor.js.map +1 -1
- package/lib/types/index.d.ts +5 -0
- package/lib/url-redirect/URLRedirectExtractor.js +8 -2
- package/lib/url-redirect/URLRedirectExtractor.js.map +1 -1
- package/lib/url-redirect/URLRedirectMatcher.d.ts +3 -0
- package/lib/url-redirect/URLRedirectMatcher.js +136 -5
- package/lib/url-redirect/URLRedirectMatcher.js.map +1 -1
- package/lib/url-redirect/URLRedirectPlugin.js +15 -5
- package/lib/url-redirect/URLRedirectPlugin.js.map +1 -1
- package/lib/url-redirect/types.d.ts +1 -1
- package/lib/utils/URLMatcher.d.ts +1 -7
- package/lib/utils/URLMatcher.js +4 -3
- package/lib/utils/URLMatcher.js.map +1 -1
- package/lib/utils/debug.d.ts +6 -1
- package/lib/utils/debug.js +16 -3
- package/lib/utils/debug.js.map +1 -1
- package/lib/utils/persistence.js +143 -75
- package/lib/utils/persistence.js.map +1 -1
- package/lib/utils/plugin-registry.d.ts +1 -0
- package/lib/utils/plugin-registry.js.map +1 -1
- package/lib/vitals/WebVitalsPlugin.js +9 -4
- package/lib/vitals/WebVitalsPlugin.js.map +1 -1
- package/package.json +14 -6
- package/types/analytics/AnalyticsPlugin.d.ts +8 -0
- package/types/analytics/index.d.ts +2 -0
- package/types/analytics/types.d.ts +5 -0
- package/types/cookies/cookieUtils.d.ts +0 -4
- package/types/core/DOMChangesPluginLite.d.ts +3 -0
- package/types/core/HTMLInjector.d.ts +1 -0
- package/types/core/PendingChangeManager.d.ts +0 -1
- package/types/generated/buildInfo.d.ts +2 -0
- package/types/index.d.ts +2 -0
- package/types/overrides/OverridesPluginLite.d.ts +5 -1
- package/types/types/index.d.ts +5 -0
- package/types/url-redirect/URLRedirectMatcher.d.ts +3 -0
- package/types/url-redirect/types.d.ts +1 -1
- package/types/utils/URLMatcher.d.ts +1 -7
- package/types/utils/debug.d.ts +6 -1
- package/types/utils/plugin-registry.d.ts +1 -0
|
@@ -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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
// Check
|
|
223
|
-
var
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
|
|
241
|
-
|
|
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 (
|
|
245
|
-
|
|
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
|
-
|
|
366
|
+
this.popstateHandler = handleURLChange;
|
|
367
|
+
window.addEventListener('popstate', this.popstateHandler);
|
|
308
368
|
// Intercept pushState and replaceState
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
321
|
-
|
|
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
|
-
//
|
|
396
|
+
// ExposureTracker will re-register on next applyChanges
|
|
339
397
|
this.exposedExperiments.clear();
|
|
340
|
-
//
|
|
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,
|
|
430
|
-
var
|
|
431
|
-
return __generator(this, function (
|
|
432
|
-
switch (
|
|
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
|
-
|
|
501
|
+
_j.label = 1;
|
|
448
502
|
case 1:
|
|
449
|
-
|
|
503
|
+
_j.trys.push([1, 3, , 4]);
|
|
450
504
|
return [4 /*yield*/, this.config.context.ready()];
|
|
451
505
|
case 2:
|
|
452
|
-
|
|
506
|
+
_j.sent();
|
|
453
507
|
return [3 /*break*/, 4];
|
|
454
508
|
case 3:
|
|
455
|
-
error_3 =
|
|
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 (
|
|
542
|
-
change =
|
|
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 (
|
|
626
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
573
627
|
finally {
|
|
574
628
|
try {
|
|
575
|
-
if (
|
|
629
|
+
if (changes_2_1 && !changes_2_1.done && (_e = changes_2.return)) _e.call(changes_2);
|
|
576
630
|
}
|
|
577
|
-
finally { if (
|
|
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
|
-
|
|
592
|
-
|
|
593
|
-
(0,
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
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 (
|
|
605
|
-
|
|
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 = (
|
|
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 (
|
|
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 && (
|
|
706
|
+
if (variantChanges_1_1 && !variantChanges_1_1.done && (_h = variantChanges_1.return)) _h.call(variantChanges_1);
|
|
643
707
|
}
|
|
644
|
-
finally { if (
|
|
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 (
|
|
724
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
661
725
|
finally {
|
|
662
726
|
try {
|
|
663
|
-
if (
|
|
727
|
+
if (allVariantsData_2_1 && !allVariantsData_2_1.done && (_g = allVariantsData_2.return)) _g.call(allVariantsData_2);
|
|
664
728
|
}
|
|
665
|
-
finally { if (
|
|
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 (
|
|
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 && (
|
|
778
|
+
if (allExperiments_1_1 && !allExperiments_1_1.done && (_d = allExperiments_1.return)) _d.call(allExperiments_1);
|
|
715
779
|
}
|
|
716
|
-
finally { if (
|
|
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
|
|
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 (
|
|
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 (
|
|
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,
|
|
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,
|
|
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
|
-
|
|
928
|
-
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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 =
|
|
1302
|
+
DOMChangesPluginLite.VERSION = buildInfo_1.BUILD_VERSION;
|
|
1198
1303
|
return DOMChangesPluginLite;
|
|
1199
1304
|
}());
|
|
1200
1305
|
exports.DOMChangesPluginLite = DOMChangesPluginLite;
|