@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,906 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ /**
4
+ * Full-featured version of OverridesPlugin
5
+ * Extends OverridesPluginLite with API fetching for non-running experiments
6
+ * Supports server-side rendering, cookie adapters, and dev environments
7
+ */
8
+ var __extends = (this && this.__extends) || (function () {
9
+ var extendStatics = function (d, b) {
10
+ extendStatics = Object.setPrototypeOf ||
11
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
12
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
13
+ return extendStatics(d, b);
14
+ };
15
+ return function (d, b) {
16
+ if (typeof b !== "function" && b !== null)
17
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
18
+ extendStatics(d, b);
19
+ function __() { this.constructor = d; }
20
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
21
+ };
22
+ })();
23
+ var __assign = (this && this.__assign) || function () {
24
+ __assign = Object.assign || function(t) {
25
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
26
+ s = arguments[i];
27
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
28
+ t[p] = s[p];
29
+ }
30
+ return t;
31
+ };
32
+ return __assign.apply(this, arguments);
33
+ };
34
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
35
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
36
+ return new (P || (P = Promise))(function (resolve, reject) {
37
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
38
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
39
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
40
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
41
+ });
42
+ };
43
+ var __generator = (this && this.__generator) || function (thisArg, body) {
44
+ 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);
45
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
46
+ function verb(n) { return function (v) { return step([n, v]); }; }
47
+ function step(op) {
48
+ if (f) throw new TypeError("Generator is already executing.");
49
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
50
+ 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;
51
+ if (y = 0, t) op = [op[0] & 2, t.value];
52
+ switch (op[0]) {
53
+ case 0: case 1: t = op; break;
54
+ case 4: _.label++; return { value: op[1], done: false };
55
+ case 5: _.label++; y = op[1]; op = [0]; continue;
56
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
57
+ default:
58
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
59
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
60
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
61
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
62
+ if (t[2]) _.ops.pop();
63
+ _.trys.pop(); continue;
64
+ }
65
+ op = body.call(thisArg, _);
66
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
67
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
68
+ }
69
+ };
70
+ var __values = (this && this.__values) || function(o) {
71
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
72
+ if (m) return m.call(o);
73
+ if (o && typeof o.length === "number") return {
74
+ next: function () {
75
+ if (o && i >= o.length) o = void 0;
76
+ return { value: o && o[i++], done: !o };
77
+ }
78
+ };
79
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
80
+ };
81
+ var __read = (this && this.__read) || function (o, n) {
82
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
83
+ if (!m) return o;
84
+ var i = m.call(o), r, ar = [], e;
85
+ try {
86
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
87
+ }
88
+ catch (error) { e = { error: error }; }
89
+ finally {
90
+ try {
91
+ if (r && !r.done && (m = i["return"])) m.call(i);
92
+ }
93
+ finally { if (e) throw e.error; }
94
+ }
95
+ return ar;
96
+ };
97
+ Object.defineProperty(exports, "__esModule", { value: true });
98
+ exports.OverridesPlugin = void 0;
99
+ var OverridesPluginLite_1 = require("./OverridesPluginLite");
100
+ var debug_1 = require("../utils/debug");
101
+ var OverridesPlugin = /** @class */ (function (_super) {
102
+ __extends(OverridesPlugin, _super);
103
+ function OverridesPlugin(config) {
104
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
105
+ // Pass a simplified config to the base class
106
+ var _this = _super.call(this, {
107
+ context: config.context,
108
+ cookieName: config.cookieName,
109
+ useQueryString: (_a = config.useQueryString) !== null && _a !== void 0 ? _a : typeof window !== 'undefined',
110
+ queryPrefix: (_b = config.queryPrefix) !== null && _b !== void 0 ? _b : '_exp_',
111
+ persistQueryToCookie: (_c = config.persistQueryToCookie) !== null && _c !== void 0 ? _c : false,
112
+ debug: (_d = config.debug) !== null && _d !== void 0 ? _d : false,
113
+ }) || this;
114
+ _this.onExperimentsAddedCallbacks = [];
115
+ if (!config.context) {
116
+ throw new Error('[OverridesPlugin] Context is required');
117
+ }
118
+ // Detect environment
119
+ _this.isServerSide = typeof window === 'undefined';
120
+ // Get SDK endpoint from context if not provided
121
+ var sdkEndpoint = config.sdkEndpoint;
122
+ if (!sdkEndpoint) {
123
+ var contextInternal = config.context;
124
+ if (contextInternal._endpoint) {
125
+ sdkEndpoint = contextInternal._endpoint;
126
+ }
127
+ else if ((_e = contextInternal._config) === null || _e === void 0 ? void 0 : _e.endpoint) {
128
+ sdkEndpoint = contextInternal._config.endpoint;
129
+ }
130
+ else if ((_f = contextInternal._dataProvider) === null || _f === void 0 ? void 0 : _f._endpoint) {
131
+ sdkEndpoint = contextInternal._dataProvider._endpoint;
132
+ }
133
+ else if ((_g = contextInternal._options) === null || _g === void 0 ? void 0 : _g.endpoint) {
134
+ sdkEndpoint = contextInternal._options.endpoint.replace('/v1', '');
135
+ }
136
+ }
137
+ // For the full plugin, we should have an endpoint available
138
+ if (!sdkEndpoint && !config.absmartlyEndpoint) {
139
+ // Try one more time to get from context
140
+ var contextInternal = config.context;
141
+ if (!contextInternal._endpoint &&
142
+ !((_h = contextInternal._config) === null || _h === void 0 ? void 0 : _h.endpoint) &&
143
+ !((_j = contextInternal._dataProvider) === null || _j === void 0 ? void 0 : _j._endpoint) &&
144
+ !((_k = contextInternal._options) === null || _k === void 0 ? void 0 : _k.endpoint)) {
145
+ throw new Error('[OverridesPlugin] SDK endpoint must be provided if not available from context');
146
+ }
147
+ }
148
+ // Setup full configuration
149
+ _this.fullConfig = {
150
+ context: config.context,
151
+ cookieName: config.cookieName,
152
+ cookieAdapter: config.cookieAdapter,
153
+ cookieOptions: (_l = config.cookieOptions) !== null && _l !== void 0 ? _l : { path: '/' },
154
+ useQueryString: (_m = config.useQueryString) !== null && _m !== void 0 ? _m : !_this.isServerSide,
155
+ queryPrefix: (_o = config.queryPrefix) !== null && _o !== void 0 ? _o : '_exp_',
156
+ envParam: (_p = config.envParam) !== null && _p !== void 0 ? _p : 'env',
157
+ persistQueryToCookie: (_q = config.persistQueryToCookie) !== null && _q !== void 0 ? _q : false,
158
+ url: config.url,
159
+ absmartlyEndpoint: (_r = config.absmartlyEndpoint) !== null && _r !== void 0 ? _r : '',
160
+ sdkEndpoint: sdkEndpoint || '',
161
+ domChangesFieldName: (_s = config.domChangesFieldName) !== null && _s !== void 0 ? _s : '__dom_changes',
162
+ sdkApiKey: (_t = config.sdkApiKey) !== null && _t !== void 0 ? _t : '',
163
+ application: (_u = config.application) !== null && _u !== void 0 ? _u : '',
164
+ environment: (_v = config.environment) !== null && _v !== void 0 ? _v : '',
165
+ debug: (_w = config.debug) !== null && _w !== void 0 ? _w : false,
166
+ };
167
+ if (_this.fullConfig.debug) {
168
+ (0, debug_1.logDebug)('[OverridesPlugin] Initialized with config:', {
169
+ isServerSide: _this.isServerSide,
170
+ cookieName: _this.fullConfig.cookieName,
171
+ useQueryString: _this.fullConfig.useQueryString,
172
+ queryPrefix: _this.fullConfig.queryPrefix,
173
+ envParam: _this.fullConfig.envParam,
174
+ persistQueryToCookie: _this.fullConfig.persistQueryToCookie,
175
+ sdkEndpoint: _this.fullConfig.sdkEndpoint,
176
+ absmartlyEndpoint: _this.fullConfig.absmartlyEndpoint,
177
+ });
178
+ }
179
+ return _this;
180
+ }
181
+ OverridesPlugin.prototype.ready = function () {
182
+ return __awaiter(this, void 0, void 0, function () {
183
+ var overridesData;
184
+ return __generator(this, function (_a) {
185
+ switch (_a.label) {
186
+ case 0:
187
+ // Check if already initialized (use base class property)
188
+ if (this.initialized) {
189
+ if (this.fullConfig.debug) {
190
+ (0, debug_1.logDebug)('[OverridesPlugin] Already initialized, skipping re-initialization');
191
+ }
192
+ return [2 /*return*/];
193
+ }
194
+ // Mark as initialized immediately to prevent concurrent calls
195
+ this.initialized = true;
196
+ // Register with context
197
+ this.registerWithContext();
198
+ overridesData = this.getOverrides();
199
+ if (Object.keys(overridesData.overrides).length === 0) {
200
+ if (this.fullConfig.debug) {
201
+ (0, debug_1.logDebug)('[OverridesPlugin] No overrides found');
202
+ }
203
+ return [2 /*return*/];
204
+ }
205
+ // Apply overrides with API fetching
206
+ return [4 /*yield*/, this.applyOverridesWithFetching(overridesData.overrides, overridesData.devEnv)];
207
+ case 1:
208
+ // Apply overrides with API fetching
209
+ _a.sent();
210
+ return [2 /*return*/];
211
+ }
212
+ });
213
+ });
214
+ };
215
+ // Alias for backwards compatibility
216
+ OverridesPlugin.prototype.initialize = function () {
217
+ return __awaiter(this, void 0, void 0, function () {
218
+ return __generator(this, function (_a) {
219
+ return [2 /*return*/, this.ready()];
220
+ });
221
+ });
222
+ };
223
+ OverridesPlugin.prototype.getOverrides = function () {
224
+ var overridesData = { overrides: {}, devEnv: null };
225
+ // First get cookie overrides if enabled
226
+ if (this.fullConfig.cookieName) {
227
+ var cookieData = this.getEnhancedCookieOverrides();
228
+ overridesData.overrides = __assign({}, cookieData.overrides);
229
+ overridesData.devEnv = cookieData.devEnv;
230
+ }
231
+ // Then check query string and merge/override if enabled
232
+ if (this.fullConfig.useQueryString) {
233
+ var queryData = this.getEnhancedQueryStringOverrides();
234
+ // Query string overrides take precedence over cookies
235
+ if (Object.keys(queryData.overrides).length > 0) {
236
+ // Merge overrides, with query string taking precedence
237
+ overridesData.overrides = __assign(__assign({}, overridesData.overrides), queryData.overrides);
238
+ // Query string env takes precedence if specified
239
+ if (queryData.devEnv !== null) {
240
+ overridesData.devEnv = queryData.devEnv;
241
+ }
242
+ // Persist merged overrides to cookie if requested
243
+ if (this.fullConfig.persistQueryToCookie && this.fullConfig.cookieName) {
244
+ this.persistEnhancedOverridesToCookie(overridesData);
245
+ }
246
+ }
247
+ }
248
+ return overridesData;
249
+ };
250
+ OverridesPlugin.prototype.getEnhancedQueryStringOverrides = function () {
251
+ var e_1, _a;
252
+ try {
253
+ var urlParams = void 0;
254
+ if (this.isServerSide) {
255
+ // Server-side: use provided URL
256
+ if (!this.fullConfig.url) {
257
+ return { overrides: {}, devEnv: null };
258
+ }
259
+ var url = typeof this.fullConfig.url === 'string'
260
+ ? new URL(this.fullConfig.url)
261
+ : this.fullConfig.url;
262
+ urlParams = new URLSearchParams(url.search);
263
+ }
264
+ else {
265
+ // Client-side: use window.location
266
+ urlParams = new URLSearchParams(window.location.search);
267
+ }
268
+ var overrides = {};
269
+ var devEnv = null;
270
+ // Get environment from query param
271
+ if (this.fullConfig.envParam) {
272
+ var env = urlParams.get(this.fullConfig.envParam);
273
+ if (env) {
274
+ devEnv = env;
275
+ }
276
+ }
277
+ // Check for experiment parameters with prefix
278
+ var prefix = this.fullConfig.queryPrefix;
279
+ try {
280
+ for (var _b = __values(urlParams.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
281
+ var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
282
+ if (key.startsWith(prefix)) {
283
+ var experimentName = key.substring(prefix.length);
284
+ if (experimentName) {
285
+ var parts = value.split(',');
286
+ var variant = parseInt(parts[0], 10);
287
+ if (!isNaN(variant)) {
288
+ if (parts.length === 1) {
289
+ overrides[experimentName] = variant;
290
+ }
291
+ else {
292
+ overrides[experimentName] = {
293
+ variant: variant,
294
+ env: parts[1] ? parseInt(parts[1], 10) : undefined,
295
+ id: parts[2] ? parseInt(parts[2], 10) : undefined,
296
+ };
297
+ }
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
304
+ finally {
305
+ try {
306
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
307
+ }
308
+ finally { if (e_1) throw e_1.error; }
309
+ }
310
+ if (this.fullConfig.debug && Object.keys(overrides).length > 0) {
311
+ (0, debug_1.logDebug)('[OverridesPlugin] Query string overrides:', overrides, 'env:', devEnv);
312
+ }
313
+ return { overrides: overrides, devEnv: devEnv };
314
+ }
315
+ catch (error) {
316
+ (0, debug_1.logDebug)('[OverridesPlugin] Error parsing query string:', error);
317
+ return { overrides: {}, devEnv: null };
318
+ }
319
+ };
320
+ OverridesPlugin.prototype.getEnhancedCookieOverrides = function () {
321
+ var e_2, _a;
322
+ if (!this.fullConfig.cookieName) {
323
+ return { overrides: {}, devEnv: null };
324
+ }
325
+ var cookieValue = null;
326
+ if (this.fullConfig.cookieAdapter) {
327
+ // Server-side or custom adapter
328
+ cookieValue = this.fullConfig.cookieAdapter.get(this.fullConfig.cookieName);
329
+ }
330
+ else if (typeof document !== 'undefined') {
331
+ // Client-side: read directly from document.cookie
332
+ var nameEQ = this.fullConfig.cookieName + '=';
333
+ var cookies = document.cookie.split(';');
334
+ try {
335
+ for (var cookies_1 = __values(cookies), cookies_1_1 = cookies_1.next(); !cookies_1_1.done; cookies_1_1 = cookies_1.next()) {
336
+ var cookie = cookies_1_1.value;
337
+ cookie = cookie.trim();
338
+ if (cookie.indexOf(nameEQ) === 0) {
339
+ cookieValue = decodeURIComponent(cookie.substring(nameEQ.length));
340
+ break;
341
+ }
342
+ }
343
+ }
344
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
345
+ finally {
346
+ try {
347
+ if (cookies_1_1 && !cookies_1_1.done && (_a = cookies_1.return)) _a.call(cookies_1);
348
+ }
349
+ finally { if (e_2) throw e_2.error; }
350
+ }
351
+ }
352
+ if (this.fullConfig.debug && cookieValue) {
353
+ (0, debug_1.logDebug)('[OverridesPlugin] Raw cookie value:', cookieValue);
354
+ }
355
+ var parsed = this.parseEnhancedCookieValue(cookieValue);
356
+ if (this.fullConfig.debug && Object.keys(parsed.overrides).length > 0) {
357
+ (0, debug_1.logDebug)('[OverridesPlugin] Parsed cookie overrides:', parsed);
358
+ }
359
+ return parsed;
360
+ };
361
+ OverridesPlugin.prototype.parseEnhancedCookieValue = function (value) {
362
+ var e_3, _a;
363
+ if (!value)
364
+ return { overrides: {}, devEnv: null };
365
+ try {
366
+ var devEnv = null;
367
+ var experimentsStr = value;
368
+ // Check if dev environment is included
369
+ if (value.startsWith('devEnv=')) {
370
+ var parts = value.split('|');
371
+ devEnv = decodeURIComponent(parts[0].substring(7));
372
+ experimentsStr = parts[1] || '';
373
+ }
374
+ var overrides = {};
375
+ if (experimentsStr) {
376
+ var experiments = experimentsStr.split(',');
377
+ try {
378
+ for (var experiments_1 = __values(experiments), experiments_1_1 = experiments_1.next(); !experiments_1_1.done; experiments_1_1 = experiments_1.next()) {
379
+ var exp = experiments_1_1.value;
380
+ var _b = __read(exp.split(':'), 2), name_1 = _b[0], values = _b[1];
381
+ if (!name_1 || !values)
382
+ continue;
383
+ var decodedName = decodeURIComponent(name_1);
384
+ var parts = values.split('.');
385
+ var variant = parseInt(parts[0], 10);
386
+ // Skip if variant is not a valid number
387
+ if (isNaN(variant))
388
+ continue;
389
+ if (parts.length === 1) {
390
+ overrides[decodedName] = variant;
391
+ }
392
+ else {
393
+ overrides[decodedName] = {
394
+ variant: variant,
395
+ env: parts[1] ? parseInt(parts[1], 10) : undefined,
396
+ id: parts[2] ? parseInt(parts[2], 10) : undefined,
397
+ };
398
+ }
399
+ }
400
+ }
401
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
402
+ finally {
403
+ try {
404
+ if (experiments_1_1 && !experiments_1_1.done && (_a = experiments_1.return)) _a.call(experiments_1);
405
+ }
406
+ finally { if (e_3) throw e_3.error; }
407
+ }
408
+ }
409
+ return { overrides: overrides, devEnv: devEnv };
410
+ }
411
+ catch (error) {
412
+ (0, debug_1.logDebug)('[OverridesPlugin] Error parsing overrides:', error);
413
+ return { overrides: {}, devEnv: null };
414
+ }
415
+ };
416
+ OverridesPlugin.prototype.persistEnhancedOverridesToCookie = function (data) {
417
+ var e_4, _a;
418
+ if (!this.fullConfig.cookieName)
419
+ return;
420
+ var parts = [];
421
+ // Add dev environment if present
422
+ if (data.devEnv) {
423
+ parts.push("devEnv=".concat(encodeURIComponent(data.devEnv)));
424
+ }
425
+ // Add experiments
426
+ var expParts = [];
427
+ try {
428
+ for (var _b = __values(Object.entries(data.overrides)), _c = _b.next(); !_c.done; _c = _b.next()) {
429
+ var _d = __read(_c.value, 2), name_2 = _d[0], value = _d[1];
430
+ var encodedName = encodeURIComponent(name_2);
431
+ if (typeof value === 'number') {
432
+ expParts.push("".concat(encodedName, ":").concat(value));
433
+ }
434
+ else {
435
+ var v = value;
436
+ var str = "".concat(encodedName, ":").concat(v.variant);
437
+ if (v.env !== undefined)
438
+ str += ".".concat(v.env);
439
+ if (v.id !== undefined)
440
+ str += ".".concat(v.id);
441
+ expParts.push(str);
442
+ }
443
+ }
444
+ }
445
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
446
+ finally {
447
+ try {
448
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
449
+ }
450
+ finally { if (e_4) throw e_4.error; }
451
+ }
452
+ var cookieValue = parts.length > 0 ? "".concat(parts.join('|'), "|").concat(expParts.join(',')) : expParts.join(',');
453
+ if (this.fullConfig.cookieAdapter) {
454
+ // Server-side or custom adapter
455
+ var options = __assign({}, this.fullConfig.cookieOptions);
456
+ // Server-side defaults
457
+ if (this.isServerSide) {
458
+ if (options.httpOnly === undefined) {
459
+ options.httpOnly = true;
460
+ }
461
+ if (options.secure === undefined) {
462
+ options.secure = true;
463
+ }
464
+ if (options.sameSite === undefined) {
465
+ options.sameSite = 'lax';
466
+ }
467
+ }
468
+ this.fullConfig.cookieAdapter.set(this.fullConfig.cookieName, cookieValue, options);
469
+ }
470
+ else if (typeof document !== 'undefined') {
471
+ // Client-side: write directly to document.cookie
472
+ var options = this.fullConfig.cookieOptions || {};
473
+ var cookieString = "".concat(this.fullConfig.cookieName, "=").concat(encodeURIComponent(cookieValue));
474
+ if (options.path)
475
+ cookieString += ";path=".concat(options.path);
476
+ if (options.maxAge)
477
+ cookieString += ";max-age=".concat(options.maxAge);
478
+ var optionsWithExpires = options;
479
+ if (optionsWithExpires.expires) {
480
+ var expiresDate = optionsWithExpires.expires instanceof Date
481
+ ? optionsWithExpires.expires.toUTCString()
482
+ : optionsWithExpires.expires;
483
+ cookieString += ";expires=".concat(expiresDate);
484
+ }
485
+ if (options.domain)
486
+ cookieString += ";domain=".concat(options.domain);
487
+ if (options.secure)
488
+ cookieString += ';secure';
489
+ if (options.sameSite)
490
+ cookieString += ";samesite=".concat(options.sameSite);
491
+ document.cookie = cookieString;
492
+ }
493
+ if (this.fullConfig.debug) {
494
+ (0, debug_1.logDebug)('[OverridesPlugin] Persisted to cookie:', cookieValue);
495
+ }
496
+ };
497
+ OverridesPlugin.prototype.applyOverridesWithFetching = function (overrides, devEnv) {
498
+ return __awaiter(this, void 0, void 0, function () {
499
+ var devExperiments, apiExperimentIds, _a, _b, _c, name_3, value, override, effectiveDevEnv, _d, _e, _f, experimentName, value, variant;
500
+ var e_5, _g, e_6, _h;
501
+ return __generator(this, function (_j) {
502
+ switch (_j.label) {
503
+ case 0:
504
+ // Log all overrides at initialization
505
+ (0, debug_1.logDebug)('[OverridesPlugin] Initializing with overrides:', overrides);
506
+ (0, debug_1.logDebug)('[OverridesPlugin] Dev environment:', devEnv);
507
+ devExperiments = [];
508
+ apiExperimentIds = new Set();
509
+ try {
510
+ // Categorize experiments
511
+ for (_a = __values(Object.entries(overrides)), _b = _a.next(); !_b.done; _b = _a.next()) {
512
+ _c = __read(_b.value, 2), name_3 = _c[0], value = _c[1];
513
+ override = typeof value === 'number' ? { variant: value } : value;
514
+ if (override.env === 1) {
515
+ // Development environment experiment
516
+ (0, debug_1.logDebug)("[OverridesPlugin] ".concat(name_3, " categorized as DEV experiment (env=1)"));
517
+ devExperiments.push([name_3, override]);
518
+ }
519
+ else if (override.env === 2 && override.id) {
520
+ // Draft experiment with ID
521
+ (0, debug_1.logDebug)("[OverridesPlugin] ".concat(name_3, " categorized as DRAFT experiment (env=2, id=").concat(override.id, ")"));
522
+ apiExperimentIds.add(override.id);
523
+ }
524
+ else {
525
+ // Running experiment (env=0 or undefined)
526
+ (0, debug_1.logDebug)("[OverridesPlugin] ".concat(name_3, " categorized as RUNNING experiment (env=").concat(override.env || 0, ")"));
527
+ }
528
+ }
529
+ }
530
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
531
+ finally {
532
+ try {
533
+ if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
534
+ }
535
+ finally { if (e_5) throw e_5.error; }
536
+ }
537
+ // Log summary
538
+ (0, debug_1.logDebug)('[OverridesPlugin] Categorization summary:', {
539
+ total_overrides: Object.keys(overrides).length,
540
+ dev_experiments: devExperiments.length,
541
+ draft_experiments: apiExperimentIds.size,
542
+ running_experiments: Object.keys(overrides).length - devExperiments.length - apiExperimentIds.size,
543
+ dev_environment: devEnv,
544
+ });
545
+ if (!(apiExperimentIds.size > 0)) return [3 /*break*/, 2];
546
+ (0, debug_1.logDebug)("[OverridesPlugin] Will fetch ".concat(apiExperimentIds.size, " DRAFT experiments from API"));
547
+ return [4 /*yield*/, this.fetchFromAPI(Array.from(apiExperimentIds))];
548
+ case 1:
549
+ _j.sent();
550
+ _j.label = 2;
551
+ case 2:
552
+ effectiveDevEnv = devEnv || this.fullConfig.environment || null;
553
+ if (!(devExperiments.length > 0 && effectiveDevEnv)) return [3 /*break*/, 4];
554
+ (0, debug_1.logDebug)("[OverridesPlugin] Will fetch ".concat(devExperiments.length, " DEV experiments for environment: ").concat(effectiveDevEnv));
555
+ return [4 /*yield*/, this.fetchFromDevSDK(devExperiments, effectiveDevEnv)];
556
+ case 3:
557
+ _j.sent();
558
+ return [3 /*break*/, 5];
559
+ case 4:
560
+ if (devExperiments.length > 0) {
561
+ (0, debug_1.logDebug)("[OverridesPlugin] Have ".concat(devExperiments.length, " DEV experiments but NO devEnv specified - NOT fetching"));
562
+ }
563
+ _j.label = 5;
564
+ case 5:
565
+ try {
566
+ // Apply all overrides to context
567
+ for (_d = __values(Object.entries(overrides)), _e = _d.next(); !_e.done; _e = _d.next()) {
568
+ _f = __read(_e.value, 2), experimentName = _f[0], value = _f[1];
569
+ variant = typeof value === 'number' ? value : value.variant;
570
+ this.fullConfig.context.override(experimentName, variant);
571
+ if (this.fullConfig.debug) {
572
+ (0, debug_1.logDebug)("[OverridesPlugin] Override: ".concat(experimentName, " -> variant ").concat(variant));
573
+ }
574
+ }
575
+ }
576
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
577
+ finally {
578
+ try {
579
+ if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
580
+ }
581
+ finally { if (e_6) throw e_6.error; }
582
+ }
583
+ return [2 /*return*/];
584
+ }
585
+ });
586
+ });
587
+ };
588
+ OverridesPlugin.prototype.fetchFromAPI = function (experimentIds) {
589
+ return __awaiter(this, void 0, void 0, function () {
590
+ var apiEndpoint, apiUrl, headers, response, data, error_1;
591
+ return __generator(this, function (_a) {
592
+ switch (_a.label) {
593
+ case 0:
594
+ if (experimentIds.length === 0) {
595
+ if (this.fullConfig.debug) {
596
+ (0, debug_1.logDebug)('[OverridesPlugin] No experiment IDs to fetch from API');
597
+ }
598
+ return [2 /*return*/];
599
+ }
600
+ apiEndpoint = this.fullConfig.absmartlyEndpoint;
601
+ if (!apiEndpoint) {
602
+ // Default: convert SDK endpoint to API endpoint
603
+ apiEndpoint = this.fullConfig.sdkEndpoint.replace('.absmartly.io', '.absmartly.com');
604
+ }
605
+ // Remove trailing /v1 if it exists to avoid double /v1/v1
606
+ if (apiEndpoint.endsWith('/v1')) {
607
+ apiEndpoint = apiEndpoint.slice(0, -3);
608
+ }
609
+ // Ensure https protocol
610
+ if (!apiEndpoint.startsWith('http')) {
611
+ apiEndpoint = "https://".concat(apiEndpoint);
612
+ }
613
+ apiUrl = "".concat(apiEndpoint, "/v1/experiments?ids=").concat(experimentIds.join(','));
614
+ if (this.fullConfig.debug) {
615
+ (0, debug_1.logDebug)('[OverridesPlugin] Fetching non-running experiments from API:', apiUrl);
616
+ }
617
+ _a.label = 1;
618
+ case 1:
619
+ _a.trys.push([1, 4, , 5]);
620
+ headers = {
621
+ 'Content-Type': 'application/json',
622
+ };
623
+ if (this.fullConfig.sdkApiKey) {
624
+ headers['Authorization'] = "ApiKey ".concat(this.fullConfig.sdkApiKey);
625
+ }
626
+ return [4 /*yield*/, fetch(apiUrl, {
627
+ method: 'GET',
628
+ credentials: 'include',
629
+ headers: headers,
630
+ mode: 'cors',
631
+ })];
632
+ case 2:
633
+ response = _a.sent();
634
+ (0, debug_1.logDebug)('[OverridesPlugin] API Response status:', response.status, response.statusText);
635
+ if (!response.ok) {
636
+ (0, debug_1.logDebug)("[OverridesPlugin] API request failed with status ".concat(response.status));
637
+ if (response.status === 401) {
638
+ (0, debug_1.logDebug)('[OverridesPlugin] Check if you need to log in to the ABsmartly console first');
639
+ }
640
+ return [2 /*return*/];
641
+ }
642
+ return [4 /*yield*/, response.json()];
643
+ case 3:
644
+ data = _a.sent();
645
+ if (data.experiments) {
646
+ // Inject experiments into context data
647
+ this.injectExperimentsIntoContext(data.experiments);
648
+ // Notify listeners
649
+ this.notifyExperimentsAdded();
650
+ }
651
+ return [3 /*break*/, 5];
652
+ case 4:
653
+ error_1 = _a.sent();
654
+ (0, debug_1.logDebug)('[OverridesPlugin] Failed to fetch experiments from API:', error_1);
655
+ return [3 /*break*/, 5];
656
+ case 5: return [2 /*return*/];
657
+ }
658
+ });
659
+ });
660
+ };
661
+ OverridesPlugin.prototype.fetchFromDevSDK = function (_experiments, devEnv) {
662
+ return __awaiter(this, void 0, void 0, function () {
663
+ var sdkEndpoint, devSdkUrl, headers, response, data, experimentsArray, error_2;
664
+ return __generator(this, function (_a) {
665
+ switch (_a.label) {
666
+ case 0:
667
+ sdkEndpoint = this.fullConfig.sdkEndpoint;
668
+ // Ensure https protocol
669
+ if (!sdkEndpoint.startsWith('http')) {
670
+ sdkEndpoint = "https://".concat(sdkEndpoint);
671
+ }
672
+ // Normalize: strip trailing /v1 if present to avoid /v1/v1
673
+ if (sdkEndpoint.endsWith('/v1')) {
674
+ sdkEndpoint = sdkEndpoint.slice(0, -3);
675
+ }
676
+ devSdkUrl = "".concat(sdkEndpoint, "/v1/context?environment=").concat(encodeURIComponent(devEnv));
677
+ if (this.fullConfig.application) {
678
+ devSdkUrl += "&application=".concat(encodeURIComponent(this.fullConfig.application));
679
+ }
680
+ if (this.fullConfig.debug) {
681
+ (0, debug_1.logDebug)('[OverridesPlugin] Fetching development experiments from SDK:', devSdkUrl);
682
+ }
683
+ _a.label = 1;
684
+ case 1:
685
+ _a.trys.push([1, 4, , 5]);
686
+ headers = {};
687
+ if (this.fullConfig.sdkApiKey) {
688
+ headers['Authorization'] = "ApiKey ".concat(this.fullConfig.sdkApiKey);
689
+ }
690
+ return [4 /*yield*/, fetch(devSdkUrl, {
691
+ method: 'GET',
692
+ headers: headers,
693
+ })];
694
+ case 2:
695
+ response = _a.sent();
696
+ (0, debug_1.logDebug)('[OverridesPlugin] DEV Response status:', response.status, response.statusText);
697
+ if (!response.ok) {
698
+ (0, debug_1.logDebug)("[OverridesPlugin] DEV SDK request failed with status ".concat(response.status));
699
+ return [2 /*return*/];
700
+ }
701
+ return [4 /*yield*/, response.json()];
702
+ case 3:
703
+ data = _a.sent();
704
+ if (data.experiments) {
705
+ experimentsArray = Object.entries(data.experiments).map(function (_a) {
706
+ var _b = __read(_a, 2), name = _b[0], exp = _b[1];
707
+ return (__assign(__assign({}, exp), { name: name }));
708
+ });
709
+ this.injectExperimentsIntoContext(experimentsArray);
710
+ // Notify listeners
711
+ this.notifyExperimentsAdded();
712
+ }
713
+ return [3 /*break*/, 5];
714
+ case 4:
715
+ error_2 = _a.sent();
716
+ (0, debug_1.logDebug)('[OverridesPlugin] Failed to fetch experiments from dev SDK:', error_2);
717
+ return [3 /*break*/, 5];
718
+ case 5: return [2 /*return*/];
719
+ }
720
+ });
721
+ });
722
+ };
723
+ OverridesPlugin.prototype.injectExperimentsIntoContext = function (experiments) {
724
+ var e_7, _a, _b;
725
+ var _c, _d;
726
+ // Get original context data
727
+ var originalData = this.fullConfig.context.data.bind(this.fullConfig.context);
728
+ // Create a map of experiment names to new experiment data
729
+ var newExperimentsMap = new Map();
730
+ try {
731
+ for (var experiments_2 = __values(experiments), experiments_2_1 = experiments_2.next(); !experiments_2_1.done; experiments_2_1 = experiments_2.next()) {
732
+ var experiment = experiments_2_1.value;
733
+ // Transform API experiment format to context format
734
+ var contextExperiment = {
735
+ id: experiment.id,
736
+ name: experiment.name,
737
+ unitType: ((_c = experiment.unit_type) === null || _c === void 0 ? void 0 : _c.name) || 'user_id',
738
+ iteration: experiment.iteration || 1,
739
+ seedHi: 0,
740
+ seedLo: 0,
741
+ split: experiment.split || [],
742
+ trafficSeedHi: 0,
743
+ trafficSeedLo: 0,
744
+ trafficSplit: [0, 1],
745
+ fullOnVariant: 0,
746
+ applications: ((_d = experiment.applications) === null || _d === void 0 ? void 0 : _d.map(function (app) {
747
+ var _a;
748
+ return ({
749
+ name: ((_a = app.application) === null || _a === void 0 ? void 0 : _a.name) || app.name,
750
+ });
751
+ })) || [],
752
+ variants: [],
753
+ audience: experiment.audience || '',
754
+ audienceStrict: experiment.audience_strict || false,
755
+ };
756
+ // Process variants
757
+ if (experiment.variants && Array.isArray(experiment.variants)) {
758
+ for (var i = 0; i < experiment.variants.length; i++) {
759
+ var variant = experiment.variants[i];
760
+ var variantData = {
761
+ name: variant.name || "Variant ".concat(i),
762
+ config: typeof variant.config === 'string'
763
+ ? variant.config
764
+ : JSON.stringify(variant.config || {}),
765
+ };
766
+ // Check if variant already has variables (from dev SDK)
767
+ if (variant.variables) {
768
+ variantData.variables = variant.variables;
769
+ }
770
+ // Otherwise try to parse from config (from API)
771
+ else if (variant.config) {
772
+ try {
773
+ var config = typeof variant.config === 'string' ? JSON.parse(variant.config) : variant.config;
774
+ var domChangesField = this.fullConfig.domChangesFieldName;
775
+ if (config[domChangesField]) {
776
+ // Store in variables format that VariantExtractor expects
777
+ variantData.variables = (_b = {},
778
+ _b[domChangesField] = config[domChangesField],
779
+ _b);
780
+ (0, debug_1.logDebug)("[OverridesPlugin] Variant ".concat(i, " has DOM changes field '").concat(domChangesField, "'"));
781
+ }
782
+ }
783
+ catch (e) {
784
+ (0, debug_1.logDebug)("[OverridesPlugin] Failed to parse variant config:", e);
785
+ }
786
+ }
787
+ contextExperiment.variants[i] = variantData;
788
+ }
789
+ }
790
+ newExperimentsMap.set(experiment.name, contextExperiment);
791
+ }
792
+ }
793
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
794
+ finally {
795
+ try {
796
+ if (experiments_2_1 && !experiments_2_1.done && (_a = experiments_2.return)) _a.call(experiments_2);
797
+ }
798
+ finally { if (e_7) throw e_7.error; }
799
+ }
800
+ // Override the context.data() method to include our experiments
801
+ this.fullConfig.context.data = function () {
802
+ var e_8, _a;
803
+ var data = originalData();
804
+ if (!data)
805
+ return data;
806
+ // Merge experiments
807
+ var existingExperiments = data.experiments || [];
808
+ var existingNames = new Set(existingExperiments.map(function (exp) { return exp.name; }));
809
+ var _loop_1 = function (name_4, experiment) {
810
+ if (!existingNames.has(name_4)) {
811
+ existingExperiments.push(experiment);
812
+ }
813
+ else {
814
+ // Replace existing experiment with fetched one
815
+ var index = existingExperiments.findIndex(function (exp) { return exp.name === name_4; });
816
+ if (index >= 0) {
817
+ existingExperiments[index] = experiment;
818
+ }
819
+ }
820
+ };
821
+ try {
822
+ // Add new experiments that don't exist
823
+ for (var newExperimentsMap_1 = __values(newExperimentsMap), newExperimentsMap_1_1 = newExperimentsMap_1.next(); !newExperimentsMap_1_1.done; newExperimentsMap_1_1 = newExperimentsMap_1.next()) {
824
+ var _b = __read(newExperimentsMap_1_1.value, 2), name_4 = _b[0], experiment = _b[1];
825
+ _loop_1(name_4, experiment);
826
+ }
827
+ }
828
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
829
+ finally {
830
+ try {
831
+ if (newExperimentsMap_1_1 && !newExperimentsMap_1_1.done && (_a = newExperimentsMap_1.return)) _a.call(newExperimentsMap_1);
832
+ }
833
+ finally { if (e_8) throw e_8.error; }
834
+ }
835
+ return __assign(__assign({}, data), { experiments: existingExperiments });
836
+ };
837
+ if (this.fullConfig.debug) {
838
+ (0, debug_1.logDebug)("[OverridesPlugin] Injected ".concat(experiments.length, " experiments into context"));
839
+ }
840
+ };
841
+ // Register a callback to be called when experiments are added
842
+ OverridesPlugin.prototype.onExperimentsAdded = function (callback) {
843
+ this.onExperimentsAddedCallbacks.push(callback);
844
+ };
845
+ OverridesPlugin.prototype.notifyExperimentsAdded = function () {
846
+ var e_9, _a;
847
+ if (this.fullConfig.debug) {
848
+ (0, debug_1.logDebug)("[OverridesPlugin] Notifying ".concat(this.onExperimentsAddedCallbacks.length, " listeners about new experiments"));
849
+ }
850
+ try {
851
+ for (var _b = __values(this.onExperimentsAddedCallbacks), _c = _b.next(); !_c.done; _c = _b.next()) {
852
+ var callback = _c.value;
853
+ try {
854
+ callback();
855
+ }
856
+ catch (error) {
857
+ (0, debug_1.logDebug)('[OverridesPlugin] Error in experiments added callback:', error);
858
+ }
859
+ }
860
+ }
861
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
862
+ finally {
863
+ try {
864
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
865
+ }
866
+ finally { if (e_9) throw e_9.error; }
867
+ }
868
+ };
869
+ OverridesPlugin.prototype.registerWithContext = function () {
870
+ if (this.fullConfig.context) {
871
+ // Ensure __plugins object exists
872
+ if (!this.fullConfig.context.__plugins) {
873
+ this.fullConfig.context.__plugins = {};
874
+ }
875
+ // Register under standardized __plugins structure
876
+ this.fullConfig.context.__plugins.overridesPlugin = {
877
+ name: 'OverridesPlugin',
878
+ version: '1.0.0',
879
+ initialized: true,
880
+ capabilities: ['cookie-overrides', 'query-overrides', 'api-fetch', 'dev-environments'],
881
+ instance: this,
882
+ timestamp: Date.now(),
883
+ };
884
+ if (this.fullConfig.debug) {
885
+ (0, debug_1.logDebug)('[OverridesPlugin] Registered with context at __plugins.overridesPlugin');
886
+ }
887
+ }
888
+ };
889
+ OverridesPlugin.prototype.unregisterFromContext = function () {
890
+ var _a, _b;
891
+ if ((_b = (_a = this.fullConfig.context) === null || _a === void 0 ? void 0 : _a.__plugins) === null || _b === void 0 ? void 0 : _b.overridesPlugin) {
892
+ delete this.fullConfig.context.__plugins.overridesPlugin;
893
+ if (this.fullConfig.debug) {
894
+ (0, debug_1.logDebug)('[OverridesPlugin] Unregistered from context');
895
+ }
896
+ }
897
+ };
898
+ OverridesPlugin.prototype.destroy = function () {
899
+ _super.prototype.destroy.call(this);
900
+ this.unregisterFromContext();
901
+ this.onExperimentsAddedCallbacks = [];
902
+ };
903
+ return OverridesPlugin;
904
+ }(OverridesPluginLite_1.OverridesPluginLite));
905
+ exports.OverridesPlugin = OverridesPlugin;
906
+ //# sourceMappingURL=OverridesPlugin.js.map