@absmartly/sdk-plugins 1.0.1

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 (177) hide show
  1. package/README.md +1101 -0
  2. package/dist/absmartly-cookie.min.js +1 -0
  3. package/dist/absmartly-dom-changes-core.min.js +1 -0
  4. package/dist/absmartly-dom-changes-lite.min.js +1 -0
  5. package/dist/absmartly-overrides-full.min.js +1 -0
  6. package/dist/absmartly-overrides-lite.min.js +1 -0
  7. package/dist/absmartly-sdk-plugins.min.js +1 -0
  8. package/dist/absmartly-vitals.min.js +1 -0
  9. package/es/cookies/CookiePlugin.js +410 -0
  10. package/es/cookies/CookiePlugin.js.map +1 -0
  11. package/es/cookies/index.js +2 -0
  12. package/es/cookies/index.js.map +1 -0
  13. package/es/core/DOMChangesPluginLite.js +1124 -0
  14. package/es/core/DOMChangesPluginLite.js.map +1 -0
  15. package/es/core/DOMManipulatorLite.js +410 -0
  16. package/es/core/DOMManipulatorLite.js.map +1 -0
  17. package/es/core/ExposureTracker.js +501 -0
  18. package/es/core/ExposureTracker.js.map +1 -0
  19. package/es/core/HTMLInjector.js +333 -0
  20. package/es/core/HTMLInjector.js.map +1 -0
  21. package/es/core/PendingChangeManager.js +440 -0
  22. package/es/core/PendingChangeManager.js.map +1 -0
  23. package/es/core/StyleSheetManager.js +78 -0
  24. package/es/core/StyleSheetManager.js.map +1 -0
  25. package/es/entries/cookie-only.js +10 -0
  26. package/es/entries/cookie-only.js.map +1 -0
  27. package/es/entries/dom-only.js +13 -0
  28. package/es/entries/dom-only.js.map +1 -0
  29. package/es/entries/dom-with-overrides-full.js +19 -0
  30. package/es/entries/dom-with-overrides-full.js.map +1 -0
  31. package/es/entries/dom-with-overrides-lite.js +15 -0
  32. package/es/entries/dom-with-overrides-lite.js.map +1 -0
  33. package/es/entries/overrides-full-only.js +15 -0
  34. package/es/entries/overrides-full-only.js.map +1 -0
  35. package/es/entries/overrides-lite-only.js +12 -0
  36. package/es/entries/overrides-lite-only.js.map +1 -0
  37. package/es/entries/vitals-only.js +10 -0
  38. package/es/entries/vitals-only.js.map +1 -0
  39. package/es/index.js +17 -0
  40. package/es/index.js.map +1 -0
  41. package/es/overrides/BrowserCookieAdapter.js +76 -0
  42. package/es/overrides/BrowserCookieAdapter.js.map +1 -0
  43. package/es/overrides/OverridesPlugin.js +903 -0
  44. package/es/overrides/OverridesPlugin.js.map +1 -0
  45. package/es/overrides/OverridesPluginFull.js +32 -0
  46. package/es/overrides/OverridesPluginFull.js.map +1 -0
  47. package/es/overrides/OverridesPluginLite.js +352 -0
  48. package/es/overrides/OverridesPluginLite.js.map +1 -0
  49. package/es/overrides/index.js +4 -0
  50. package/es/overrides/index.js.map +1 -0
  51. package/es/overrides/types.js +2 -0
  52. package/es/overrides/types.js.map +1 -0
  53. package/es/parsers/VariantExtractor.js +570 -0
  54. package/es/parsers/VariantExtractor.js.map +1 -0
  55. package/es/types/index.js +2 -0
  56. package/es/types/index.js.map +1 -0
  57. package/es/utils/URLMatcher.js +114 -0
  58. package/es/utils/URLMatcher.js.map +1 -0
  59. package/es/utils/debug.js +184 -0
  60. package/es/utils/debug.js.map +1 -0
  61. package/es/vitals/WebVitalsPlugin.js +379 -0
  62. package/es/vitals/WebVitalsPlugin.js.map +1 -0
  63. package/es/vitals/index.js +2 -0
  64. package/es/vitals/index.js.map +1 -0
  65. package/lib/cookies/CookiePlugin.d.ts +55 -0
  66. package/lib/cookies/CookiePlugin.js +413 -0
  67. package/lib/cookies/CookiePlugin.js.map +1 -0
  68. package/lib/cookies/index.d.ts +2 -0
  69. package/lib/cookies/index.js +6 -0
  70. package/lib/cookies/index.js.map +1 -0
  71. package/lib/core/DOMChangesPluginLite.d.ts +89 -0
  72. package/lib/core/DOMChangesPluginLite.js +1127 -0
  73. package/lib/core/DOMChangesPluginLite.js.map +1 -0
  74. package/lib/core/DOMManipulatorLite.d.ts +21 -0
  75. package/lib/core/DOMManipulatorLite.js +413 -0
  76. package/lib/core/DOMManipulatorLite.js.map +1 -0
  77. package/lib/core/ExposureTracker.d.ts +81 -0
  78. package/lib/core/ExposureTracker.js +504 -0
  79. package/lib/core/ExposureTracker.js.map +1 -0
  80. package/lib/core/HTMLInjector.d.ts +19 -0
  81. package/lib/core/HTMLInjector.js +336 -0
  82. package/lib/core/HTMLInjector.js.map +1 -0
  83. package/lib/core/PendingChangeManager.d.ts +31 -0
  84. package/lib/core/PendingChangeManager.js +443 -0
  85. package/lib/core/PendingChangeManager.js.map +1 -0
  86. package/lib/core/StyleSheetManager.d.ts +16 -0
  87. package/lib/core/StyleSheetManager.js +81 -0
  88. package/lib/core/StyleSheetManager.js.map +1 -0
  89. package/lib/entries/cookie-only.d.ts +8 -0
  90. package/lib/entries/cookie-only.js +12 -0
  91. package/lib/entries/cookie-only.js.map +1 -0
  92. package/lib/entries/dom-only.d.ts +9 -0
  93. package/lib/entries/dom-only.js +29 -0
  94. package/lib/entries/dom-only.js.map +1 -0
  95. package/lib/entries/dom-with-overrides-full.d.ts +15 -0
  96. package/lib/entries/dom-with-overrides-full.js +39 -0
  97. package/lib/entries/dom-with-overrides-full.js.map +1 -0
  98. package/lib/entries/dom-with-overrides-lite.d.ts +11 -0
  99. package/lib/entries/dom-with-overrides-lite.js +32 -0
  100. package/lib/entries/dom-with-overrides-lite.js.map +1 -0
  101. package/lib/entries/overrides-full-only.d.ts +11 -0
  102. package/lib/entries/overrides-full-only.js +33 -0
  103. package/lib/entries/overrides-full-only.js.map +1 -0
  104. package/lib/entries/overrides-lite-only.d.ts +8 -0
  105. package/lib/entries/overrides-lite-only.js +28 -0
  106. package/lib/entries/overrides-lite-only.js.map +1 -0
  107. package/lib/entries/vitals-only.d.ts +8 -0
  108. package/lib/entries/vitals-only.js +12 -0
  109. package/lib/entries/vitals-only.js.map +1 -0
  110. package/lib/index.d.ts +13 -0
  111. package/lib/index.js +34 -0
  112. package/lib/index.js.map +1 -0
  113. package/lib/overrides/BrowserCookieAdapter.d.ts +6 -0
  114. package/lib/overrides/BrowserCookieAdapter.js +79 -0
  115. package/lib/overrides/BrowserCookieAdapter.js.map +1 -0
  116. package/lib/overrides/OverridesPlugin.d.ts +33 -0
  117. package/lib/overrides/OverridesPlugin.js +906 -0
  118. package/lib/overrides/OverridesPlugin.js.map +1 -0
  119. package/lib/overrides/OverridesPluginFull.d.ts +9 -0
  120. package/lib/overrides/OverridesPluginFull.js +35 -0
  121. package/lib/overrides/OverridesPluginFull.js.map +1 -0
  122. package/lib/overrides/OverridesPluginLite.d.ts +27 -0
  123. package/lib/overrides/OverridesPluginLite.js +355 -0
  124. package/lib/overrides/OverridesPluginLite.js.map +1 -0
  125. package/lib/overrides/index.d.ts +3 -0
  126. package/lib/overrides/index.js +23 -0
  127. package/lib/overrides/index.js.map +1 -0
  128. package/lib/overrides/types.d.ts +43 -0
  129. package/lib/overrides/types.js +3 -0
  130. package/lib/overrides/types.js.map +1 -0
  131. package/lib/parsers/VariantExtractor.d.ts +49 -0
  132. package/lib/parsers/VariantExtractor.js +573 -0
  133. package/lib/parsers/VariantExtractor.js.map +1 -0
  134. package/lib/types/index.d.ts +177 -0
  135. package/lib/types/index.js +3 -0
  136. package/lib/types/index.js.map +1 -0
  137. package/lib/utils/URLMatcher.d.ts +20 -0
  138. package/lib/utils/URLMatcher.js +117 -0
  139. package/lib/utils/URLMatcher.js.map +1 -0
  140. package/lib/utils/debug.d.ts +41 -0
  141. package/lib/utils/debug.js +195 -0
  142. package/lib/utils/debug.js.map +1 -0
  143. package/lib/vitals/WebVitalsPlugin.d.ts +37 -0
  144. package/lib/vitals/WebVitalsPlugin.js +382 -0
  145. package/lib/vitals/WebVitalsPlugin.js.map +1 -0
  146. package/lib/vitals/index.d.ts +2 -0
  147. package/lib/vitals/index.js +6 -0
  148. package/lib/vitals/index.js.map +1 -0
  149. package/package.json +94 -0
  150. package/types/cookies/CookiePlugin.d.ts +55 -0
  151. package/types/cookies/index.d.ts +2 -0
  152. package/types/core/DOMChangesPluginLite.d.ts +89 -0
  153. package/types/core/DOMManipulatorLite.d.ts +21 -0
  154. package/types/core/ExposureTracker.d.ts +81 -0
  155. package/types/core/HTMLInjector.d.ts +19 -0
  156. package/types/core/PendingChangeManager.d.ts +31 -0
  157. package/types/core/StyleSheetManager.d.ts +16 -0
  158. package/types/entries/cookie-only.d.ts +8 -0
  159. package/types/entries/dom-only.d.ts +9 -0
  160. package/types/entries/dom-with-overrides-full.d.ts +15 -0
  161. package/types/entries/dom-with-overrides-lite.d.ts +11 -0
  162. package/types/entries/overrides-full-only.d.ts +11 -0
  163. package/types/entries/overrides-lite-only.d.ts +8 -0
  164. package/types/entries/vitals-only.d.ts +8 -0
  165. package/types/index.d.ts +13 -0
  166. package/types/overrides/BrowserCookieAdapter.d.ts +6 -0
  167. package/types/overrides/OverridesPlugin.d.ts +33 -0
  168. package/types/overrides/OverridesPluginFull.d.ts +9 -0
  169. package/types/overrides/OverridesPluginLite.d.ts +27 -0
  170. package/types/overrides/index.d.ts +3 -0
  171. package/types/overrides/types.d.ts +43 -0
  172. package/types/parsers/VariantExtractor.d.ts +49 -0
  173. package/types/types/index.d.ts +177 -0
  174. package/types/utils/URLMatcher.d.ts +20 -0
  175. package/types/utils/debug.d.ts +41 -0
  176. package/types/vitals/WebVitalsPlugin.d.ts +37 -0
  177. package/types/vitals/index.d.ts +2 -0
@@ -0,0 +1,504 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __read = (this && this.__read) || function (o, n) {
39
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
40
+ if (!m) return o;
41
+ var i = m.call(o), r, ar = [], e;
42
+ try {
43
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
44
+ }
45
+ catch (error) { e = { error: error }; }
46
+ finally {
47
+ try {
48
+ if (r && !r.done && (m = i["return"])) m.call(i);
49
+ }
50
+ finally { if (e) throw e.error; }
51
+ }
52
+ return ar;
53
+ };
54
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
55
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
56
+ if (ar || !(i in from)) {
57
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
58
+ ar[i] = from[i];
59
+ }
60
+ }
61
+ return to.concat(ar || Array.prototype.slice.call(from));
62
+ };
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ exports.ExposureTracker = void 0;
65
+ var debug_1 = require("../utils/debug");
66
+ var ExposureTracker = /** @class */ (function () {
67
+ function ExposureTracker(context, debug) {
68
+ if (debug === void 0) { debug = false; }
69
+ this.context = context;
70
+ this.experiments = new Map();
71
+ this.trackedElements = new Map();
72
+ this.mutationObserver = null;
73
+ this.placeholders = new Map(); // experimentName-selector -> placeholder
74
+ this.debug = debug;
75
+ this.setupIntersectionObserver();
76
+ }
77
+ /**
78
+ * Register an experiment with all its variants' changes for comprehensive tracking
79
+ */
80
+ ExposureTracker.prototype.registerExperiment = function (experimentName, currentVariant, currentChanges, allVariantsChanges) {
81
+ var _this = this;
82
+ if (this.debug) {
83
+ (0, debug_1.logDebug)("[ABsmartly] Registering experiment ".concat(experimentName, " for exposure tracking"));
84
+ }
85
+ // Collect all unique selectors that need viewport tracking across ALL variants
86
+ var viewportSelectors = new Set();
87
+ var moveParentSelectors = new Set(); // Parent containers for move changes
88
+ // First pass: collect all move changes across all variants
89
+ // We need to track ALL possible positions where elements could be
90
+ var moveElements = new Map(); // selector -> Set of target parent positions
91
+ allVariantsChanges.forEach(function (variantChanges) {
92
+ variantChanges.forEach(function (change) {
93
+ if (change.trigger_on_view) {
94
+ if (change.type === 'move') {
95
+ if (!moveElements.has(change.selector)) {
96
+ moveElements.set(change.selector, new Set());
97
+ }
98
+ // Add the target parent for this move
99
+ if (change.targetSelector) {
100
+ moveElements.get(change.selector).add(change.targetSelector);
101
+ }
102
+ }
103
+ else {
104
+ // For non-move changes, track the selector directly
105
+ viewportSelectors.add(change.selector);
106
+ }
107
+ }
108
+ });
109
+ });
110
+ // For cross-variant move tracking, we need to track the EXACT POSITION where
111
+ // elements would appear in other variants. We use container-based invisible elements
112
+ // positioned exactly where the element would be, using CSS positioning.
113
+ moveElements.forEach(function (_targetParents, selector) {
114
+ // Collect all move changes for this element across ALL variants
115
+ var allMovesForElement = [];
116
+ allVariantsChanges.forEach(function (variantChanges, variantIndex) {
117
+ var moveChange = variantChanges.find(function (c) { return c.type === 'move' && c.selector === selector && c.trigger_on_view; });
118
+ if (moveChange === null || moveChange === void 0 ? void 0 : moveChange.targetSelector) {
119
+ allMovesForElement.push({
120
+ targetSelector: moveChange.targetSelector,
121
+ position: moveChange.position || 'lastChild',
122
+ variantIndex: variantIndex,
123
+ });
124
+ }
125
+ });
126
+ // Check if current variant has a move for this element
127
+ var currentMoveIndex = allMovesForElement.findIndex(function (m) { return m.variantIndex === currentVariant; });
128
+ if (currentMoveIndex >= 0) {
129
+ // Current variant HAS a move - track the element in its moved position
130
+ viewportSelectors.add(selector);
131
+ // For all OTHER variant positions, create container-based placeholders
132
+ allMovesForElement.forEach(function (move, index) {
133
+ if (index !== currentMoveIndex) {
134
+ // Create placeholder at the position where element WOULD be in another variant
135
+ _this.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
136
+ }
137
+ });
138
+ }
139
+ else {
140
+ // Current variant does NOT have a move - element stays in original position
141
+ viewportSelectors.add(selector);
142
+ // For ALL variant moves, create placeholders at those positions
143
+ allMovesForElement.forEach(function (move) {
144
+ _this.createContainerPlaceholder(experimentName, selector, move.targetSelector, move.position);
145
+ });
146
+ }
147
+ });
148
+ // Determine what triggers are needed by checking ALL variants
149
+ // This ensures experiments are tracked even if the user is in a variant without changes
150
+ var hasImmediateTrigger = false;
151
+ var hasViewportTrigger = false;
152
+ allVariantsChanges.forEach(function (variantChanges) {
153
+ variantChanges.forEach(function (change) {
154
+ if (change.trigger_on_view) {
155
+ hasViewportTrigger = true;
156
+ }
157
+ else {
158
+ hasImmediateTrigger = true;
159
+ }
160
+ });
161
+ });
162
+ // Store experiment tracking info
163
+ var tracking = {
164
+ experimentName: experimentName,
165
+ variant: currentVariant,
166
+ changes: currentChanges,
167
+ allPossibleSelectors: new Set(__spreadArray(__spreadArray([], __read(viewportSelectors), false), __read(moveParentSelectors), false)),
168
+ triggered: false,
169
+ hasImmediateTrigger: hasImmediateTrigger,
170
+ hasViewportTrigger: hasViewportTrigger,
171
+ };
172
+ this.experiments.set(experimentName, tracking);
173
+ if (this.debug) {
174
+ (0, debug_1.logDebug)("[ABsmartly] Experiment ".concat(experimentName, " will track selectors:"), Array.from(tracking.allPossibleSelectors));
175
+ }
176
+ // Trigger immediately if needed
177
+ if (hasImmediateTrigger) {
178
+ // Don't await here to avoid blocking the tracking setup
179
+ this.triggerExposure(experimentName).catch(function (error) {
180
+ (0, debug_1.logDebug)("[ABsmartly] Failed to trigger exposure for ".concat(experimentName, ":"), error);
181
+ });
182
+ }
183
+ else if (hasViewportTrigger) {
184
+ // Only set up viewport observers if there's NO immediate trigger
185
+ // If there's an immediate trigger, the experiment will be triggered and cleaned up right away
186
+ this.observeSelectors(experimentName, tracking.allPossibleSelectors);
187
+ }
188
+ };
189
+ /**
190
+ * Create a container-based placeholder at the hypothetical position
191
+ * Uses inline-block with minimal dimensions to be observable but not affect layout
192
+ */
193
+ ExposureTracker.prototype.createContainerPlaceholder = function (experimentName, originalSelector, targetSelector, position) {
194
+ var _a, _b;
195
+ if (position === void 0) { position = 'lastChild'; }
196
+ var targetElement = document.querySelector(targetSelector);
197
+ if (!targetElement)
198
+ return;
199
+ var placeholderKey = "".concat(experimentName, "-").concat(originalSelector, "-").concat(targetSelector, "-").concat(position);
200
+ // Check if placeholder already exists
201
+ if (this.placeholders.has(placeholderKey)) {
202
+ return;
203
+ }
204
+ // Create minimal placeholder using inline styles
205
+ // This will be observable by IntersectionObserver but won't affect layout
206
+ var placeholder = document.createElement('span');
207
+ placeholder.style.cssText = "\n display: inline-block;\n width: 1px;\n height: 1px;\n position: relative;\n left: -1px;\n visibility: hidden;\n pointer-events: none;\n font-size: 0;\n line-height: 0;\n overflow: hidden;\n ";
208
+ placeholder.setAttribute('data-absmartly-placeholder', 'true');
209
+ placeholder.setAttribute('data-absmartly-original-selector', originalSelector);
210
+ placeholder.setAttribute('data-absmartly-experiment', experimentName);
211
+ placeholder.setAttribute('aria-hidden', 'true');
212
+ // Insert placeholder at the hypothetical position
213
+ switch (position) {
214
+ case 'firstChild':
215
+ targetElement.insertBefore(placeholder, targetElement.firstChild);
216
+ break;
217
+ case 'lastChild':
218
+ targetElement.appendChild(placeholder);
219
+ break;
220
+ case 'before':
221
+ (_a = targetElement.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(placeholder, targetElement);
222
+ break;
223
+ case 'after':
224
+ (_b = targetElement.parentElement) === null || _b === void 0 ? void 0 : _b.insertBefore(placeholder, targetElement.nextSibling);
225
+ break;
226
+ default:
227
+ targetElement.appendChild(placeholder);
228
+ }
229
+ this.placeholders.set(placeholderKey, placeholder);
230
+ // Track the placeholder for viewport visibility
231
+ this.trackElement(placeholder, experimentName);
232
+ if (this.debug) {
233
+ (0, debug_1.logDebug)("[ABsmartly] Created placeholder for ".concat(originalSelector, " at ").concat(targetSelector, " (").concat(position, ")"));
234
+ }
235
+ };
236
+ /**
237
+ * Get the original parent selector for move changes
238
+ * This should be called BEFORE the move is applied
239
+ */
240
+ ExposureTracker.prototype.getOriginalParentForMove = function (selector) {
241
+ var element = document.querySelector(selector);
242
+ if (!(element === null || element === void 0 ? void 0 : element.parentElement))
243
+ return null;
244
+ return this.getStableParentSelector(element.parentElement);
245
+ };
246
+ /**
247
+ * Get a stable selector for a parent element
248
+ */
249
+ ExposureTracker.prototype.getStableParentSelector = function (element) {
250
+ // Try to get a good selector for the parent
251
+ if (element.id) {
252
+ return "#".concat(element.id);
253
+ }
254
+ if (element.className) {
255
+ var classes = element.className.split(' ').filter(function (c) { return c && !c.startsWith('absmartly'); });
256
+ if (classes.length > 0) {
257
+ return ".".concat(classes[0]);
258
+ }
259
+ }
260
+ // Fallback to tag name with positional info
261
+ var parent = element.parentElement;
262
+ if (parent) {
263
+ var siblings = Array.from(parent.children);
264
+ var index = siblings.indexOf(element);
265
+ return "".concat(element.tagName.toLowerCase(), ":nth-child(").concat(index + 1, ")");
266
+ }
267
+ return null;
268
+ };
269
+ /**
270
+ * Set up observers for the given selectors
271
+ */
272
+ ExposureTracker.prototype.observeSelectors = function (experimentName, selectors) {
273
+ var _this = this;
274
+ selectors.forEach(function (selector) {
275
+ // Try to find existing elements
276
+ var elements = document.querySelectorAll(selector);
277
+ if (elements.length > 0) {
278
+ elements.forEach(function (element) {
279
+ _this.trackElement(element, experimentName);
280
+ });
281
+ }
282
+ else {
283
+ // Element doesn't exist yet, set up mutation observer to watch for it
284
+ _this.watchForSelector(selector, experimentName);
285
+ }
286
+ });
287
+ };
288
+ /**
289
+ * Track an element for viewport visibility
290
+ */
291
+ ExposureTracker.prototype.trackElement = function (element, experimentName) {
292
+ if (!this.trackedElements.has(element)) {
293
+ this.trackedElements.set(element, {
294
+ element: element,
295
+ experiments: new Set([experimentName]),
296
+ isPlaceholder: element.hasAttribute('data-absmartly-placeholder'),
297
+ });
298
+ this.observer.observe(element);
299
+ }
300
+ else {
301
+ this.trackedElements.get(element).experiments.add(experimentName);
302
+ }
303
+ };
304
+ /**
305
+ * Watch for elements matching a selector to appear
306
+ */
307
+ ExposureTracker.prototype.watchForSelector = function (_selector, _experimentName) {
308
+ if (!this.mutationObserver) {
309
+ this.setupMutationObserver();
310
+ }
311
+ // Store pending selector (implementation would need a Map for this)
312
+ // For now, we'll rely on checking in mutation callback
313
+ };
314
+ /**
315
+ * Set up the IntersectionObserver for viewport tracking
316
+ */
317
+ ExposureTracker.prototype.setupIntersectionObserver = function () {
318
+ var _this = this;
319
+ this.observer = new IntersectionObserver(function (entries) {
320
+ entries.forEach(function (entry) {
321
+ if (entry.isIntersecting) {
322
+ _this.handleElementVisible(entry.target);
323
+ }
324
+ });
325
+ }, {
326
+ threshold: 0.01, // Trigger when even 1% is visible
327
+ rootMargin: '0px',
328
+ });
329
+ };
330
+ /**
331
+ * Set up MutationObserver for dynamic elements
332
+ */
333
+ ExposureTracker.prototype.setupMutationObserver = function () {
334
+ var _this = this;
335
+ this.mutationObserver = new MutationObserver(function (mutations) {
336
+ mutations.forEach(function (mutation) {
337
+ mutation.addedNodes.forEach(function (node) {
338
+ if (node instanceof Element) {
339
+ // Check if this element or its children match any tracked selectors
340
+ _this.checkNewElement(node);
341
+ }
342
+ });
343
+ });
344
+ });
345
+ this.mutationObserver.observe(document.body, {
346
+ childList: true,
347
+ subtree: true,
348
+ });
349
+ };
350
+ /**
351
+ * Check if a newly added element needs tracking
352
+ */
353
+ ExposureTracker.prototype.checkNewElement = function (element) {
354
+ var _this = this;
355
+ this.experiments.forEach(function (tracking, experimentName) {
356
+ tracking.allPossibleSelectors.forEach(function (selector) {
357
+ if (element.matches(selector)) {
358
+ _this.trackElement(element, experimentName);
359
+ }
360
+ // Also check children
361
+ element.querySelectorAll(selector).forEach(function (child) {
362
+ _this.trackElement(child, experimentName);
363
+ });
364
+ });
365
+ });
366
+ };
367
+ /**
368
+ * Handle when an element becomes visible
369
+ */
370
+ ExposureTracker.prototype.handleElementVisible = function (element) {
371
+ var _this = this;
372
+ var tracked = this.trackedElements.get(element);
373
+ if (!tracked)
374
+ return;
375
+ tracked.experiments.forEach(function (experimentName) {
376
+ var experiment = _this.experiments.get(experimentName);
377
+ if (experiment && !experiment.triggered) {
378
+ // Don't await here to avoid blocking the visibility handler
379
+ _this.triggerExposure(experimentName).catch(function (error) {
380
+ (0, debug_1.logDebug)("[ABsmartly] Failed to trigger exposure for ".concat(experimentName, ":"), error);
381
+ });
382
+ if (_this.debug) {
383
+ var selector = tracked.isPlaceholder
384
+ ? element.getAttribute('data-absmartly-original-selector')
385
+ : _this.getElementSelector(element);
386
+ (0, debug_1.logDebug)("[ABsmartly] Triggering exposure for ".concat(experimentName, " via ").concat(selector));
387
+ }
388
+ }
389
+ });
390
+ };
391
+ /**
392
+ * Trigger exposure for an experiment
393
+ */
394
+ ExposureTracker.prototype.triggerExposure = function (experimentName) {
395
+ return __awaiter(this, void 0, void 0, function () {
396
+ var experiment;
397
+ return __generator(this, function (_a) {
398
+ switch (_a.label) {
399
+ case 0:
400
+ experiment = this.experiments.get(experimentName);
401
+ if (!experiment || experiment.triggered)
402
+ return [2 /*return*/];
403
+ // Ensure context is ready before calling treatment
404
+ return [4 /*yield*/, this.context.ready()];
405
+ case 1:
406
+ // Ensure context is ready before calling treatment
407
+ _a.sent();
408
+ // Call treatment to trigger exposure
409
+ this.context.treatment(experimentName);
410
+ experiment.triggered = true;
411
+ if (this.debug) {
412
+ (0, debug_1.logDebug)("[ABsmartly] Exposure triggered for experiment: ".concat(experimentName));
413
+ }
414
+ // Clean up tracking for this experiment
415
+ this.cleanupExperiment(experimentName);
416
+ return [2 /*return*/];
417
+ }
418
+ });
419
+ });
420
+ };
421
+ /**
422
+ * Clean up tracking for an experiment that has been triggered
423
+ */
424
+ ExposureTracker.prototype.cleanupExperiment = function (experimentName) {
425
+ var _this = this;
426
+ // Remove from tracked elements
427
+ this.trackedElements.forEach(function (tracked, element) {
428
+ tracked.experiments.delete(experimentName);
429
+ if (tracked.experiments.size === 0) {
430
+ _this.observer.unobserve(element);
431
+ _this.trackedElements.delete(element);
432
+ }
433
+ });
434
+ // Remove placeholders
435
+ this.placeholders.forEach(function (placeholder, key) {
436
+ if (key.startsWith("".concat(experimentName, "-"))) {
437
+ placeholder.remove();
438
+ _this.placeholders.delete(key);
439
+ }
440
+ });
441
+ // Don't delete the experiment - keep it in the map so isTriggered() can still return true
442
+ // Just clear the selectors since we don't need to track them anymore
443
+ var experiment = this.experiments.get(experimentName);
444
+ if (experiment) {
445
+ experiment.allPossibleSelectors.clear();
446
+ }
447
+ // Clean up mutation observer if no experiments left
448
+ if (this.experiments.size === 0 && this.mutationObserver) {
449
+ this.mutationObserver.disconnect();
450
+ this.mutationObserver = null;
451
+ }
452
+ };
453
+ /**
454
+ * Get a selector string for an element (for debugging)
455
+ */
456
+ ExposureTracker.prototype.getElementSelector = function (element) {
457
+ if (element.id)
458
+ return "#".concat(element.id);
459
+ if (element.className) {
460
+ var classes = element.className.split(' ').filter(function (c) { return c && !c.startsWith('absmartly'); });
461
+ if (classes.length > 0)
462
+ return ".".concat(classes.join('.'));
463
+ }
464
+ return element.tagName.toLowerCase();
465
+ };
466
+ /**
467
+ * Check if an experiment needs viewport tracking
468
+ */
469
+ ExposureTracker.prototype.needsViewportTracking = function (experimentName) {
470
+ var _a;
471
+ var experiment = this.experiments.get(experimentName);
472
+ return (_a = experiment === null || experiment === void 0 ? void 0 : experiment.hasViewportTrigger) !== null && _a !== void 0 ? _a : false;
473
+ };
474
+ /**
475
+ * Check if an experiment has been triggered
476
+ */
477
+ ExposureTracker.prototype.isTriggered = function (experimentName) {
478
+ var _a;
479
+ var experiment = this.experiments.get(experimentName);
480
+ return (_a = experiment === null || experiment === void 0 ? void 0 : experiment.triggered) !== null && _a !== void 0 ? _a : false;
481
+ };
482
+ /**
483
+ * Clean up all resources
484
+ */
485
+ ExposureTracker.prototype.destroy = function () {
486
+ // Disconnect observers
487
+ this.observer.disconnect();
488
+ if (this.mutationObserver) {
489
+ this.mutationObserver.disconnect();
490
+ }
491
+ // Remove all placeholders
492
+ this.placeholders.forEach(function (placeholder) { return placeholder.remove(); });
493
+ // Clear all tracking
494
+ this.experiments.clear();
495
+ this.trackedElements.clear();
496
+ this.placeholders.clear();
497
+ if (this.debug) {
498
+ (0, debug_1.logDebug)('[ABsmartly] ExposureTracker destroyed');
499
+ }
500
+ };
501
+ return ExposureTracker;
502
+ }());
503
+ exports.ExposureTracker = ExposureTracker;
504
+ //# sourceMappingURL=ExposureTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExposureTracker.js","sourceRoot":"","sources":["../../src/core/ExposureTracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { InjectionItem, InjectionLocation, InjectionDataWithFilter } from '../types';
2
+ export declare class HTMLInjector {
3
+ private debug;
4
+ private injectedIds;
5
+ constructor(debug?: boolean);
6
+ parseInjectionKey(key: string): {
7
+ location: InjectionLocation;
8
+ priority: number;
9
+ } | null;
10
+ collectInjections(allInjectHTML: Map<string, Map<number, InjectionDataWithFilter>>, currentUrl?: string): Map<InjectionLocation, InjectionItem[]>;
11
+ inject(injectionsByLocation: Map<InjectionLocation, InjectionItem[]>): void;
12
+ private injectAtLocation;
13
+ private injectHeadStart;
14
+ private injectHeadEnd;
15
+ private injectBodyStart;
16
+ private injectBodyEnd;
17
+ private createContainer;
18
+ destroy(): void;
19
+ }