@kameleoon/javascript-sdk-core 1.1.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/cacheManager/cacheManager.d.ts +38 -0
  2. package/dist/cacheManager/cacheManager.js +74 -0
  3. package/dist/cacheManager/cacheManager.js.map +1 -0
  4. package/dist/cacheManager/index.d.ts +2 -0
  5. package/dist/cacheManager/index.js +20 -0
  6. package/dist/cacheManager/index.js.map +1 -0
  7. package/dist/cacheManager/types.d.ts +14 -0
  8. package/dist/cacheManager/types.js +6 -0
  9. package/dist/cacheManager/types.js.map +1 -0
  10. package/dist/campaignConfiguration/campaignConfiguration.d.ts +2 -1
  11. package/dist/campaignConfiguration/campaignConfiguration.js +243 -196
  12. package/dist/campaignConfiguration/campaignConfiguration.js.map +1 -1
  13. package/dist/campaignConfiguration/constants.d.ts +3 -3
  14. package/dist/campaignConfiguration/constants.js +22 -16
  15. package/dist/campaignConfiguration/constants.js.map +1 -1
  16. package/dist/campaignConfiguration/index.d.ts +1 -0
  17. package/dist/campaignConfiguration/index.js +85 -6
  18. package/dist/campaignConfiguration/index.js.map +1 -1
  19. package/dist/campaignConfiguration/types.d.ts +7 -3
  20. package/dist/campaignConfiguration/types.js +53 -45
  21. package/dist/campaignConfiguration/types.js.map +1 -1
  22. package/dist/clientSettings/clientSettings.d.ts +1 -1
  23. package/dist/clientSettings/clientSettings.js +28 -21
  24. package/dist/clientSettings/clientSettings.js.map +1 -1
  25. package/dist/clientSettings/index.js +18 -4
  26. package/dist/clientSettings/index.js.map +1 -1
  27. package/dist/clientSettings/types.d.ts +1 -1
  28. package/dist/clientSettings/types.js +4 -1
  29. package/dist/clientSettings/types.js.map +1 -1
  30. package/dist/constants.d.ts +11 -0
  31. package/dist/constants.js +37 -14
  32. package/dist/constants.js.map +1 -1
  33. package/dist/eventSource/constants.js +6 -2
  34. package/dist/eventSource/constants.js.map +1 -1
  35. package/dist/eventSource/externalEventSource.js +28 -20
  36. package/dist/eventSource/externalEventSource.js.map +1 -1
  37. package/dist/eventSource/index.js +49 -6
  38. package/dist/eventSource/index.js.map +1 -1
  39. package/dist/eventSource/types.d.ts +1 -1
  40. package/dist/eventSource/types.js +4 -1
  41. package/dist/eventSource/types.js.map +1 -1
  42. package/dist/hasher/hasher.d.ts +1 -1
  43. package/dist/hasher/hasher.js +37 -26
  44. package/dist/hasher/hasher.js.map +1 -1
  45. package/dist/hasher/index.js +11 -4
  46. package/dist/hasher/index.js.map +1 -1
  47. package/dist/hasher/types.d.ts +1 -1
  48. package/dist/hasher/types.js +4 -1
  49. package/dist/hasher/types.js.map +1 -1
  50. package/dist/index.d.ts +4 -2
  51. package/dist/index.js +309 -28
  52. package/dist/index.js.map +1 -1
  53. package/dist/kameleoonClient.d.ts +32 -19
  54. package/dist/kameleoonClient.js +353 -235
  55. package/dist/kameleoonClient.js.map +1 -1
  56. package/dist/kameleoonData/browser.js +37 -32
  57. package/dist/kameleoonData/browser.js.map +1 -1
  58. package/dist/kameleoonData/constants.js +6 -2
  59. package/dist/kameleoonData/constants.js.map +1 -1
  60. package/dist/kameleoonData/conversion.js +47 -40
  61. package/dist/kameleoonData/conversion.js.map +1 -1
  62. package/dist/kameleoonData/customData.js +62 -58
  63. package/dist/kameleoonData/customData.js.map +1 -1
  64. package/dist/kameleoonData/device.js +37 -32
  65. package/dist/kameleoonData/device.js.map +1 -1
  66. package/dist/kameleoonData/index.js +101 -18
  67. package/dist/kameleoonData/index.js.map +1 -1
  68. package/dist/kameleoonData/nonce.js +25 -13
  69. package/dist/kameleoonData/nonce.js.map +1 -1
  70. package/dist/kameleoonData/pageView.js +52 -44
  71. package/dist/kameleoonData/pageView.js.map +1 -1
  72. package/dist/kameleoonData/types.js +41 -26
  73. package/dist/kameleoonData/types.js.map +1 -1
  74. package/dist/kameleoonData/userAgent.js +33 -24
  75. package/dist/kameleoonData/userAgent.js.map +1 -1
  76. package/dist/kameleoonError/constants.d.ts +1 -1
  77. package/dist/kameleoonError/constants.js +25 -21
  78. package/dist/kameleoonError/constants.js.map +1 -1
  79. package/dist/kameleoonError/helpers.js +6 -4
  80. package/dist/kameleoonError/helpers.js.map +1 -1
  81. package/dist/kameleoonError/index.js +25 -8
  82. package/dist/kameleoonError/index.js.map +1 -1
  83. package/dist/kameleoonError/kameleoonError.d.ts +1 -1
  84. package/dist/kameleoonError/kameleoonError.js +64 -53
  85. package/dist/kameleoonError/kameleoonError.js.map +1 -1
  86. package/dist/kameleoonError/types.d.ts +1 -1
  87. package/dist/kameleoonError/types.js +26 -22
  88. package/dist/kameleoonError/types.js.map +1 -1
  89. package/dist/kameleoonUtils.js +34 -33
  90. package/dist/kameleoonUtils.js.map +1 -1
  91. package/dist/requester/constants.d.ts +6 -7
  92. package/dist/requester/constants.js +58 -45
  93. package/dist/requester/constants.js.map +1 -1
  94. package/dist/requester/index.d.ts +2 -2
  95. package/dist/requester/index.js +67 -8
  96. package/dist/requester/index.js.map +1 -1
  97. package/dist/requester/requester.d.ts +7 -7
  98. package/dist/requester/requester.js +90 -113
  99. package/dist/requester/requester.js.map +1 -1
  100. package/dist/requester/types.d.ts +38 -10
  101. package/dist/requester/types.js +14 -36
  102. package/dist/requester/types.js.map +1 -1
  103. package/dist/storage/constants.js +11 -7
  104. package/dist/storage/constants.js.map +1 -1
  105. package/dist/storage/externalStorage.js +33 -26
  106. package/dist/storage/externalStorage.js.map +1 -1
  107. package/dist/storage/index.js +55 -6
  108. package/dist/storage/index.js.map +1 -1
  109. package/dist/storage/types.js +4 -1
  110. package/dist/storage/types.js.map +1 -1
  111. package/dist/targeting/conditions/conditionFactory.js +24 -19
  112. package/dist/targeting/conditions/conditionFactory.js.map +1 -1
  113. package/dist/targeting/conditions/customDataCondition.js +99 -88
  114. package/dist/targeting/conditions/customDataCondition.js.map +1 -1
  115. package/dist/targeting/conditions/exclusiveExperimentCondition.js +27 -15
  116. package/dist/targeting/conditions/exclusiveExperimentCondition.js.map +1 -1
  117. package/dist/targeting/conditions/index.js +45 -10
  118. package/dist/targeting/conditions/index.js.map +1 -1
  119. package/dist/targeting/conditions/targetExperimentCondition.js +54 -32
  120. package/dist/targeting/conditions/targetExperimentCondition.js.map +1 -1
  121. package/dist/targeting/conditions/types.js +4 -1
  122. package/dist/targeting/conditions/types.js.map +1 -1
  123. package/dist/targeting/index.js +79 -13
  124. package/dist/targeting/index.js.map +1 -1
  125. package/dist/targeting/targetingNode.js +41 -33
  126. package/dist/targeting/targetingNode.js.map +1 -1
  127. package/dist/targeting/targetingTree.js +125 -104
  128. package/dist/targeting/targetingTree.js.map +1 -1
  129. package/dist/targeting/types.js +99 -91
  130. package/dist/targeting/types.js.map +1 -1
  131. package/dist/types.d.ts +34 -2
  132. package/dist/types.js +58 -21
  133. package/dist/types.js.map +1 -1
  134. package/dist/utilities/constants.js +6 -2
  135. package/dist/utilities/constants.js.map +1 -1
  136. package/dist/utilities/index.js +11 -4
  137. package/dist/utilities/index.js.map +1 -1
  138. package/dist/utilities/types.d.ts +9 -1
  139. package/dist/utilities/types.js +4 -1
  140. package/dist/utilities/types.js.map +1 -1
  141. package/dist/utilities/utilities.d.ts +6 -3
  142. package/dist/utilities/utilities.js +171 -105
  143. package/dist/utilities/utilities.js.map +1 -1
  144. package/dist/variationConfiguration/index.js +24 -4
  145. package/dist/variationConfiguration/index.js.map +1 -1
  146. package/dist/variationConfiguration/types.d.ts +1 -1
  147. package/dist/variationConfiguration/types.js +4 -1
  148. package/dist/variationConfiguration/types.js.map +1 -1
  149. package/dist/variationConfiguration/variation.js +35 -28
  150. package/dist/variationConfiguration/variation.js.map +1 -1
  151. package/dist/variationConfiguration/variationConfiguration.d.ts +5 -6
  152. package/dist/variationConfiguration/variationConfiguration.js +263 -230
  153. package/dist/variationConfiguration/variationConfiguration.js.map +1 -1
  154. package/package.json +6 -4
  155. package/dist/hasher/constants.d.ts +0 -1
  156. package/dist/hasher/constants.js +0 -5
  157. package/dist/hasher/constants.js.map +0 -1
@@ -1,119 +1,185 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
3
6
  exports.Utilities = void 0;
4
- const ts_res_1 = require("ts-res");
5
- const kameleoonError_1 = require("../kameleoonError");
6
- const types_1 = require("../types");
7
- const targeting_1 = require("../targeting");
8
- const constants_1 = require("./constants");
9
- const campaignConfiguration_1 = require("../campaignConfiguration");
10
- const kameleoonData_1 = require("../kameleoonData");
7
+ var _tsRes = require("ts-res");
8
+ var _kameleoonError = require("../kameleoonError");
9
+ var _types = require("../types");
10
+ var _targeting = require("../targeting");
11
+ var _constants = require("./constants");
12
+ var _kameleoonData = require("../kameleoonData");
13
+ var _constants2 = require("../constants");
14
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
16
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
18
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
11
19
  class Utilities {
12
- static checkTargeting({ segment, visitorCode, targetingData, experimentId, variationConfiguration, }) {
13
- if (!segment || !segment.conditionsData.firstLevel.length) {
14
- return (0, ts_res_1.Ok)(true);
15
- }
16
- if (!variationConfiguration) {
17
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.Initialization));
18
- }
19
- let variations = {};
20
- const assignedVariationsResult = variationConfiguration.getAssignedVariations(visitorCode);
21
- if (assignedVariationsResult.ok) {
22
- variations = assignedVariationsResult.data;
23
- }
24
- const targetingTree = new targeting_1.TargetingTree(segment);
25
- const result = targetingTree.evaluate({
26
- targetingData: targetingData || [],
27
- variationData: variations,
28
- experimentId,
29
- });
30
- return result;
20
+ static checkTargeting({
21
+ segment,
22
+ visitorCode,
23
+ targetingData,
24
+ experimentId,
25
+ variationConfiguration
26
+ }) {
27
+ if (!segment || !segment.conditionsData.firstLevel.length) {
28
+ return (0, _tsRes.Ok)(true);
31
29
  }
32
- static validateVisitorCode(visitorCode) {
33
- if (visitorCode.length > constants_1.VISITOR_CODE_MAX_LENGTH) {
34
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.VisitorCodeMaxLength));
35
- }
36
- return (0, ts_res_1.Ok)();
30
+ if (!variationConfiguration) {
31
+ return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));
32
+ }
33
+ let variations = {};
34
+ const assignedVariationsResult = variationConfiguration.getAssignedVariations(visitorCode);
35
+ if (assignedVariationsResult.ok) {
36
+ variations = assignedVariationsResult.data;
37
37
  }
38
- static getDataUrl(visitorCode, campaignConfiguration) {
39
- const unsentData = campaignConfiguration.getUnsentData(visitorCode);
40
- const concatenatedUrl = unsentData.reduce((previousItem, currentItem) => {
41
- return previousItem + currentItem.url;
42
- }, '');
43
- return concatenatedUrl;
38
+ const targetingTree = new _targeting.TargetingTree(segment);
39
+ const result = targetingTree.evaluate({
40
+ targetingData: targetingData || [],
41
+ variationData: variations,
42
+ experimentId
43
+ });
44
+ return result;
45
+ }
46
+ static validateVisitorCode(visitorCode) {
47
+ if (visitorCode.length > _constants.VISITOR_CODE_MAX_LENGTH) {
48
+ return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitorCodeMaxLength));
44
49
  }
45
- static trackExperimentationRule({ featureFlagVariation, campaignConfiguration, visitorCode, requester, userAgent, }) {
46
- const { variationId, rule } = featureFlagVariation;
47
- if (!rule || rule.type !== campaignConfiguration_1.RuleType.EXPERIMENTATION) {
48
- throw new Error('Internal usage error, make sure to use `trackExperimentationRule` for existing rule with type `RuleType.EXPERIMENTATION`');
50
+ return (0, _tsRes.Ok)();
51
+ }
52
+ static getDataUrl(visitorCode, campaignConfiguration) {
53
+ const unsentData = campaignConfiguration.getUnsentData(visitorCode);
54
+ return unsentData.map(item => item.url).join('\n');
55
+ }
56
+ static trackRule({
57
+ featureFlagVariation,
58
+ campaignConfiguration,
59
+ visitorCode,
60
+ requester,
61
+ userAgent
62
+ }) {
63
+ const {
64
+ variationId,
65
+ rule
66
+ } = featureFlagVariation;
67
+ if (!rule) {
68
+ throw new Error('Internal usage error, make sure to use `trackRule` for existing rule');
69
+ }
70
+ const dataUrl = this.getDataUrl(visitorCode, campaignConfiguration);
71
+ const resultVariationId = variationId || 0;
72
+ const isUnallocated = !variationId;
73
+ const callback = () => campaignConfiguration.clearUnsentData;
74
+ requester.trackExperiment({
75
+ visitorCode,
76
+ isUnallocated,
77
+ body: dataUrl,
78
+ callback,
79
+ experimentId: rule.experimentId,
80
+ variationId: resultVariationId,
81
+ userAgent
82
+ });
83
+ }
84
+ static parseFeatureVariable(variable) {
85
+ const {
86
+ type,
87
+ value
88
+ } = variable;
89
+ switch (type) {
90
+ case _types.VariableType.BOOLEAN:
91
+ return (0, _tsRes.Ok)({
92
+ type,
93
+ value: Boolean(value)
94
+ });
95
+ case _types.VariableType.STRING:
96
+ return (0, _tsRes.Ok)({
97
+ type,
98
+ value: String(value)
99
+ });
100
+ case _types.VariableType.NUMBER:
101
+ const numberValue = Number(value);
102
+ if (Number.isNaN(numberValue)) {
103
+ return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.NumberParse, String(value)));
49
104
  }
50
- const dataUrl = this.getDataUrl(visitorCode, campaignConfiguration);
51
- const resultVariationId = variationId || 0;
52
- const isUnallocated = !variationId;
53
- const callback = () => campaignConfiguration.clearUnsentData;
54
- requester.trackExperiment({
55
- visitorCode,
56
- isUnallocated,
57
- body: dataUrl,
58
- callback,
59
- // --- Note ---
60
- // For `RuleType.EXPERIMENTATION` `experimentId` can not be null
61
- experimentId: rule.experimentId,
62
- variationId: resultVariationId,
63
- userAgent,
105
+ return (0, _tsRes.Ok)({
106
+ type,
107
+ value: numberValue
64
108
  });
65
- }
66
- static parseFeatureVariable(variable) {
67
- const { type, value } = variable;
68
- switch (type) {
69
- case types_1.VariableType.BOOLEAN:
70
- return (0, ts_res_1.Ok)({
71
- type,
72
- value: Boolean(value),
73
- });
74
- case types_1.VariableType.STRING:
75
- return (0, ts_res_1.Ok)({
76
- type,
77
- value: String(value),
78
- });
79
- case types_1.VariableType.NUMBER:
80
- const numberValue = Number(value);
81
- if (Number.isNaN(numberValue)) {
82
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.NumberParse, String(value)));
83
- }
84
- return (0, ts_res_1.Ok)({
85
- type,
86
- value: numberValue,
87
- });
88
- case types_1.VariableType.JSON:
89
- try {
90
- const jsonValue = JSON.parse(String(variable.value));
91
- return (0, ts_res_1.Ok)({
92
- type,
93
- value: jsonValue,
94
- });
95
- }
96
- catch (err) {
97
- return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.JSONParse, err));
98
- }
99
- default:
100
- (0, kameleoonError_1.exhaustCheck)(type);
109
+ case _types.VariableType.JSON:
110
+ try {
111
+ const jsonValue = JSON.parse(String(variable.value));
112
+ return (0, _tsRes.Ok)({
113
+ type,
114
+ value: jsonValue
115
+ });
116
+ } catch (err) {
117
+ return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.JSONParse, err));
101
118
  }
119
+ default:
120
+ (0, _kameleoonError.exhaustCheck)(type);
102
121
  }
103
- static getUserAgent(visitorCode, campaignConfiguration) {
104
- const isUserAgent = (data) => data.type === kameleoonData_1.KameleoonData.UserAgent;
105
- const targetingData = campaignConfiguration.storedTargetingData[visitorCode];
106
- if (targetingData) {
107
- const filteredData = targetingData
108
- .map((item) => item.data)
109
- .filter(isUserAgent);
110
- if (filteredData.length) {
111
- const [userAgentData] = filteredData;
112
- return userAgentData.value;
113
- }
114
- }
115
- return undefined;
122
+ }
123
+ static getUserAgent(visitorCode, campaignConfiguration) {
124
+ const isUserAgent = data => data.type === _kameleoonData.KameleoonData.UserAgent;
125
+ const targetingData = campaignConfiguration.storedTargetingData[visitorCode];
126
+ if (targetingData) {
127
+ const filteredData = targetingData.map(item => item.data).filter(isUserAgent);
128
+ if (filteredData.length) {
129
+ const [userAgentData] = filteredData;
130
+ return userAgentData.value;
131
+ }
132
+ }
133
+ return undefined;
134
+ }
135
+ static updateCache({
136
+ cacheManager,
137
+ visitorCode,
138
+ experimentId,
139
+ variationId
140
+ }) {
141
+ const cacheData = cacheManager.getAliveItem(visitorCode);
142
+ const newCacheData = cacheData ? _objectSpread({}, cacheData) : {};
143
+ newCacheData[experimentId] = {
144
+ variationId,
145
+ expirationTime: Date.now() + _constants2.CACHE_ITEM_LIFETIME * _types.Milliseconds.Second
146
+ };
147
+ cacheManager.add({
148
+ key: visitorCode,
149
+ data: newCacheData,
150
+ lifetime: _constants2.CACHE_ITEM_LIFETIME
151
+ });
152
+ }
153
+ static getTrackingCode(trackingCache, visitorCode) {
154
+ let resultString = 'window.kameleoonQueue=window.kameleoonQueue||[];';
155
+ const cacheData = trackingCache.getAliveItem(visitorCode);
156
+ if (!cacheData) {
157
+ return resultString;
116
158
  }
159
+ const updatedCacheData = {};
160
+ Object.entries(cacheData).forEach(([experimentId, {
161
+ variationId,
162
+ expirationTime
163
+ }]) => {
164
+ if (expirationTime > Date.now()) {
165
+ resultString += `window.kameleoonQueue.push(['Experiments.assignVariation',${experimentId},${variationId}]);`;
166
+ resultString += `window.kameleoonQueue.push(['Experiments.trigger',${experimentId},true]);`;
167
+ updatedCacheData[Number(experimentId)] = {
168
+ variationId,
169
+ expirationTime
170
+ };
171
+ }
172
+ });
173
+
174
+ // --- Note ---
175
+ // Cache is updated with only alive experiments
176
+ trackingCache.add({
177
+ key: visitorCode,
178
+ data: updatedCacheData,
179
+ lifetime: _constants2.CACHE_ITEM_LIFETIME
180
+ });
181
+ return resultString;
182
+ }
117
183
  }
118
184
  exports.Utilities = Utilities;
119
185
  //# sourceMappingURL=utilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/utilities/utilities.ts"],"names":[],"mappings":";;;AAAA,mCAAyC;AACzC,sDAI2B;AAM3B,oCAAmE;AACnE,4CAA6C;AAC7C,2CAAsD;AACtD,oEAKkC;AAClC,oDAI0B;AAE1B,MAAa,SAAS;IACpB,MAAM,CAAC,cAAc,CAAC,EACpB,OAAO,EACP,WAAW,EACX,aAAa,EACb,YAAY,EACZ,sBAAsB,GACG;QACzB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE;YACzD,OAAO,IAAA,WAAE,EAAC,IAAI,CAAC,CAAC;SACjB;QAED,IAAI,CAAC,sBAAsB,EAAE;YAC3B,OAAO,IAAA,YAAG,EAAC,IAAI,+BAAc,CAAC,mCAAkB,CAAC,cAAc,CAAC,CAAC,CAAC;SACnE;QAED,IAAI,UAAU,GAA6B,EAAE,CAAC;QAE9C,MAAM,wBAAwB,GAC5B,sBAAsB,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAE5D,IAAI,wBAAwB,CAAC,EAAE,EAAE;YAC/B,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC;SAC5C;QAED,MAAM,aAAa,GAAG,IAAI,yBAAa,CAAC,OAAO,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;YACpC,aAAa,EAAE,aAAa,IAAI,EAAE;YAClC,aAAa,EAAE,UAAU;YACzB,YAAY;SACb,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,mBAAmB,CACxB,WAAmB;QAEnB,IAAI,WAAW,CAAC,MAAM,GAAG,mCAAuB,EAAE;YAChD,OAAO,IAAA,YAAG,EAAC,IAAI,+BAAc,CAAC,mCAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC;SACzE;QAED,OAAO,IAAA,WAAE,GAAE,CAAC;IACd,CAAC;IAED,MAAM,CAAC,UAAU,CACf,WAAmB,EACnB,qBAA4C;QAE5C,MAAM,UAAU,GAAG,qBAAqB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE;YACtE,OAAO,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC;QACxC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,EAC9B,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,SAAS,EACT,SAAS,GAC0B;QACnC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC;QAEnD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,gCAAQ,CAAC,eAAe,EAAE;YACnD,MAAM,IAAI,KAAK,CACb,0HAA0H,CAC3H,CAAC;SACH;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAEpE,MAAM,iBAAiB,GAAG,WAAW,IAAI,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,CAAC,WAAW,CAAC;QACnC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC,eAAe,CAAC;QAE7D,SAAS,CAAC,eAAe,CAAC;YACxB,WAAW;YACX,aAAa;YACb,IAAI,EAAE,OAAO;YACb,QAAQ;YACR,eAAe;YACf,gEAAgE;YAChE,YAAY,EAAE,IAAI,CAAC,YAAsB;YACzC,WAAW,EAAE,iBAAiB;YAC9B,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,oBAAoB,CACzB,QAA6B;QAE7B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;QAEjC,QAAQ,IAAI,EAAE;YACZ,KAAK,oBAAY,CAAC,OAAO;gBACvB,OAAO,IAAA,WAAE,EAAC;oBACR,IAAI;oBACJ,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;iBACtB,CAAC,CAAC;YACL,KAAK,oBAAY,CAAC,MAAM;gBACtB,OAAO,IAAA,WAAE,EAAC;oBACR,IAAI;oBACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAC;YACL,KAAK,oBAAY,CAAC,MAAM;gBACtB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAElC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;oBAC7B,OAAO,IAAA,YAAG,EACR,IAAI,+BAAc,CAAC,mCAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;iBACH;gBAED,OAAO,IAAA,WAAE,EAAC;oBACR,IAAI;oBACJ,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;YACL,KAAK,oBAAY,CAAC,IAAI;gBACpB,IAAI;oBACF,MAAM,SAAS,GAAa,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBAE/D,OAAO,IAAA,WAAE,EAAC;wBACR,IAAI;wBACJ,KAAK,EAAE,SAAS;qBACjB,CAAC,CAAC;iBACJ;gBAAC,OAAO,GAAG,EAAE;oBACZ,OAAO,IAAA,YAAG,EAAC,IAAI,+BAAc,CAAC,mCAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;iBACnE;YACH;gBACE,IAAA,6BAAY,EAAC,IAAI,CAAC,CAAC;SACtB;IACH,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,WAAmB,EACnB,qBAA4C;QAE5C,MAAM,WAAW,GAAG,CAClB,IAA2B,EACA,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,6BAAa,CAAC,SAAS,CAAC;QACtE,MAAM,aAAa,GACjB,qBAAqB,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAEzD,IAAI,aAAa,EAAE;YACjB,MAAM,YAAY,GAAG,aAAa;iBAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;iBACxB,MAAM,CAAC,WAAW,CAAC,CAAC;YAEvB,IAAI,YAAY,CAAC,MAAM,EAAE;gBACvB,MAAM,CAAC,aAAa,CAAC,GAAG,YAAY,CAAC;gBAErC,OAAO,aAAa,CAAC,KAAK,CAAC;aAC5B;SACF;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAlKD,8BAkKC"}
1
+ {"version":3,"file":"utilities.js","names":["_tsRes","require","_kameleoonError","_types","_targeting","_constants","_kameleoonData","_constants2","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","Utilities","checkTargeting","segment","visitorCode","targetingData","experimentId","variationConfiguration","conditionsData","firstLevel","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getAssignedVariations","ok","data","targetingTree","TargetingTree","result","evaluate","variationData","validateVisitorCode","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","getDataUrl","campaignConfiguration","unsentData","getUnsentData","map","item","url","join","trackRule","featureFlagVariation","requester","userAgent","variationId","rule","Error","dataUrl","resultVariationId","isUnallocated","callback","clearUnsentData","trackExperiment","body","parseFeatureVariable","variable","type","VariableType","BOOLEAN","Boolean","STRING","NUMBER","numberValue","isNaN","NumberParse","JSON","jsonValue","parse","err","JSONParse","exhaustCheck","getUserAgent","isUserAgent","KameleoonData","UserAgent","storedTargetingData","filteredData","userAgentData","updateCache","cacheManager","cacheData","getAliveItem","newCacheData","expirationTime","Date","now","CACHE_ITEM_LIFETIME","Milliseconds","Second","add","lifetime","getTrackingCode","trackingCache","resultString","updatedCacheData","entries","exports"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from '../kameleoonError';\nimport { ExperimentVariationsType } from '../storage';\nimport {\n CheckTargetingParamsType,\n ManageCacheParametersType,\n TrackRuleParamsType,\n} from './types';\nimport {\n FeatureVariableResultType,\n Milliseconds,\n TrackingCacheItemType,\n VariableType,\n} from '../types';\nimport { TargetingTree } from '../targeting';\nimport { VISITOR_CODE_MAX_LENGTH } from './constants';\nimport {\n CampaignConfiguration,\n FeatureVariableType,\n JSONType,\n} from '../campaignConfiguration';\nimport {\n KameleoonData,\n KameleoonDataItemType,\n UserAgentDataType,\n} from '../kameleoonData';\nimport { CACHE_ITEM_LIFETIME } from '../constants';\nimport { CacheManager } from '../cacheManager';\n\nexport class Utilities {\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n }: CheckTargetingParamsType): Result<boolean, KameleoonError> {\n if (!segment || !segment.conditionsData.firstLevel.length) {\n return Ok(true);\n }\n\n if (!variationConfiguration) {\n return Err(new KameleoonError(KameleoonException.Initialization));\n }\n\n let variations: ExperimentVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getAssignedVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = new TargetingTree(segment);\n\n const result = targetingTree.evaluate({\n targetingData: targetingData || [],\n variationData: variations,\n experimentId,\n });\n\n return result;\n }\n\n static validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\n if (visitorCode.length > VISITOR_CODE_MAX_LENGTH) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeMaxLength));\n }\n\n return Ok();\n }\n\n static getDataUrl(\n visitorCode: string,\n campaignConfiguration: CampaignConfiguration,\n ): string {\n const unsentData = campaignConfiguration.getUnsentData(visitorCode);\n\n return unsentData.map((item) => item.url).join('\\n');\n }\n\n static trackRule({\n featureFlagVariation,\n campaignConfiguration,\n visitorCode,\n requester,\n userAgent,\n }: TrackRuleParamsType): void {\n const { variationId, rule } = featureFlagVariation;\n\n if (!rule) {\n throw new Error(\n 'Internal usage error, make sure to use `trackRule` for existing rule',\n );\n }\n\n const dataUrl = this.getDataUrl(visitorCode, campaignConfiguration);\n\n const resultVariationId = variationId || 0;\n const isUnallocated = !variationId;\n const callback = () => campaignConfiguration.clearUnsentData;\n\n requester.trackExperiment({\n visitorCode,\n isUnallocated,\n body: dataUrl,\n callback,\n experimentId: rule.experimentId,\n variationId: resultVariationId,\n userAgent,\n });\n }\n\n static parseFeatureVariable(\n variable: FeatureVariableType,\n ): Result<FeatureVariableResultType, KameleoonError> {\n const { type, value } = variable;\n\n switch (type) {\n case VariableType.BOOLEAN:\n return Ok({\n type,\n value: Boolean(value),\n });\n case VariableType.STRING:\n return Ok({\n type,\n value: String(value),\n });\n case VariableType.NUMBER:\n const numberValue = Number(value);\n\n if (Number.isNaN(numberValue)) {\n return Err(\n new KameleoonError(KameleoonException.NumberParse, String(value)),\n );\n }\n\n return Ok({\n type,\n value: numberValue,\n });\n case VariableType.JSON:\n try {\n const jsonValue: JSONType = JSON.parse(String(variable.value));\n\n return Ok({\n type,\n value: jsonValue,\n });\n } catch (err) {\n return Err(new KameleoonError(KameleoonException.JSONParse, err));\n }\n default:\n exhaustCheck(type);\n }\n }\n\n static getUserAgent(\n visitorCode: string,\n campaignConfiguration: CampaignConfiguration,\n ): string | undefined {\n const isUserAgent = (\n data: KameleoonDataItemType,\n ): data is UserAgentDataType => data.type === KameleoonData.UserAgent;\n const targetingData =\n campaignConfiguration.storedTargetingData[visitorCode];\n\n if (targetingData) {\n const filteredData = targetingData\n .map((item) => item.data)\n .filter(isUserAgent);\n\n if (filteredData.length) {\n const [userAgentData] = filteredData;\n\n return userAgentData.value;\n }\n }\n\n return undefined;\n }\n\n static updateCache({\n cacheManager,\n visitorCode,\n experimentId,\n variationId,\n }: ManageCacheParametersType): void {\n const cacheData = cacheManager.getAliveItem(visitorCode);\n\n const newCacheData = cacheData ? { ...cacheData } : {};\n\n newCacheData[experimentId] = {\n variationId,\n expirationTime: Date.now() + CACHE_ITEM_LIFETIME * Milliseconds.Second,\n };\n\n cacheManager.add({\n key: visitorCode,\n data: newCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n }\n\n static getTrackingCode(\n trackingCache: CacheManager<TrackingCacheItemType>,\n visitorCode: string,\n ): string {\n let resultString = 'window.kameleoonQueue=window.kameleoonQueue||[];';\n\n const cacheData = trackingCache.getAliveItem(visitorCode);\n\n if (!cacheData) {\n return resultString;\n }\n\n const updatedCacheData: TrackingCacheItemType = {};\n\n Object.entries(cacheData).forEach(\n ([experimentId, { variationId, expirationTime }]) => {\n if (expirationTime > Date.now()) {\n resultString += `window.kameleoonQueue.push(['Experiments.assignVariation',${experimentId},${variationId}]);`;\n resultString += `window.kameleoonQueue.push(['Experiments.trigger',${experimentId},true]);`;\n\n updatedCacheData[Number(experimentId)] = {\n variationId,\n expirationTime,\n };\n }\n },\n );\n\n // --- Note ---\n // Cache is updated with only alive experiments\n trackingCache.add({\n key: visitorCode,\n data: updatedCacheData,\n lifetime: CACHE_ITEM_LIFETIME,\n });\n\n return resultString;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,26 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VariationConfiguration = void 0;
4
- var variationConfiguration_1 = require("./variationConfiguration");
5
- Object.defineProperty(exports, "VariationConfiguration", { enumerable: true, get: function () { return variationConfiguration_1.VariationConfiguration; } });
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "FeatureFlagVariationType", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _types.FeatureFlagVariationType;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "VariationConfiguration", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _variationConfiguration.VariationConfiguration;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "VariationType", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _types.VariationType;
22
+ }
23
+ });
24
+ var _variationConfiguration = require("./variationConfiguration");
25
+ var _types = require("./types");
6
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/variationConfiguration/index.ts"],"names":[],"mappings":";;;AAAA,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA"}
1
+ {"version":3,"file":"index.js","names":["_variationConfiguration","require","_types"],"sources":["../../src/variationConfiguration/index.ts"],"sourcesContent":["export { VariationConfiguration } from './variationConfiguration';\nexport { VariationType, FeatureFlagVariationType } from './types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,uBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA"}
@@ -12,6 +12,7 @@ export type UpdateStorageParamsType = {
12
12
  export type FeatureFlagVariationType = {
13
13
  variationKey: string;
14
14
  variationId: number | null;
15
+ experimentId: number | null;
15
16
  featureFlagId: number;
16
17
  featureKey: string;
17
18
  rule: RuleItemType | null;
@@ -22,4 +23,3 @@ export type GetFeatureFlagVariationParametersType = {
22
23
  targetingData?: TargetingDataItemType[];
23
24
  withAssignment?: boolean;
24
25
  };
25
- export type GetAssignedRuleVariationResultType = Pick<FeatureFlagVariationType, 'variationId' | 'variationKey'>;
@@ -1,3 +1,6 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
3
6
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/variationConfiguration/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/variationConfiguration/types.ts"],"sourcesContent":["import { FeatureFlagType, RuleItemType } from '../campaignConfiguration';\nimport { TargetingDataItemType } from '../targeting';\n\nexport type VariationType = {\n variationId: number;\n assignmentDate: string;\n};\n\nexport type UpdateStorageParamsType = {\n visitorCode: string;\n experimentId: string;\n variationId: number;\n};\n\nexport type FeatureFlagVariationType = {\n variationKey: string;\n variationId: number | null;\n experimentId: number | null;\n featureFlagId: number;\n featureKey: string;\n rule: RuleItemType | null;\n};\n\nexport type GetFeatureFlagVariationParametersType = {\n visitorCode: string;\n featureFlag: FeatureFlagType;\n targetingData?: TargetingDataItemType[];\n withAssignment?: boolean;\n};\n"],"mappings":""}
@@ -1,38 +1,45 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
3
6
  exports.Variation = void 0;
4
- const types_1 = require("../types");
7
+ var _types = require("../types");
8
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
10
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
5
11
  class Variation {
6
- constructor(variationData) {
7
- this.variationData = variationData;
12
+ constructor(variationData) {
13
+ _defineProperty(this, "variationData", void 0);
14
+ this.variationData = variationData;
15
+ }
16
+ get id() {
17
+ if (!this.variationData) {
18
+ throw new Error("Internal usage error: Check if the variation `isValid`, before getting it's `id`");
8
19
  }
9
- get id() {
10
- if (!this.variationData) {
11
- throw new Error("Internal usage error: Check if the variation `isValid`, before getting it's `id`");
12
- }
13
- return this.variationData.variationId;
20
+ return this.variationData.variationId;
21
+ }
22
+ isValid(respoolTime) {
23
+ const variation = this.variationData;
24
+ if (!variation) {
25
+ return false;
14
26
  }
15
- isValid(respoolTime) {
16
- const variation = this.variationData;
17
- if (!variation) {
18
- return false;
19
- }
20
- // --- Note ---
21
- // - Respool is a kind of shuffle parameter
22
- // it's presence indicates that variations assigned to
23
- // user has changed at certain time (time is the value of `respoolTime` in seconds)
24
- // - So the variation is valid unless it has been shuffled after it's assignment
25
- if (respoolTime === null || respoolTime === void 0 ? void 0 : respoolTime.length) {
26
- const assignmentTime = new Date(Date.parse(variation.assignmentDate)).getTime() /
27
- types_1.Milliseconds.Second;
28
- const variationRespoolTime = respoolTime.find((respool) => respool.variationId === String(variation.variationId));
29
- if (!variationRespoolTime) {
30
- return true;
31
- }
32
- return assignmentTime > variationRespoolTime.value;
33
- }
27
+
28
+ // --- Note ---
29
+ // - Respool is a kind of shuffle parameter
30
+ // it's presence indicates that variations assigned to
31
+ // user has changed at certain time (time is the value of `respoolTime` in seconds)
32
+ // - So the variation is valid unless it has been shuffled after it's assignment
33
+ if (respoolTime?.length) {
34
+ const assignmentTime = new Date(Date.parse(variation.assignmentDate)).getTime() / _types.Milliseconds.Second;
35
+ const variationRespoolTime = respoolTime.find(respool => respool.variationId === String(variation.variationId));
36
+ if (!variationRespoolTime) {
34
37
  return true;
38
+ }
39
+ return assignmentTime > variationRespoolTime.value;
35
40
  }
41
+ return true;
42
+ }
36
43
  }
37
44
  exports.Variation = Variation;
38
45
  //# sourceMappingURL=variation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"variation.js","sourceRoot":"","sources":["../../src/variationConfiguration/variation.ts"],"names":[],"mappings":";;;AACA,oCAAwC;AAQxC,MAAa,SAAS;IAGpB,YAAY,aAA6B;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,IAAI,EAAE;QACJ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;SACH;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IACxC,CAAC;IAEM,OAAO,CAAC,WAA+B;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QAErC,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,KAAK,CAAC;SACd;QAED,eAAe;QACf,2CAA2C;QAC3C,sDAAsD;QACtD,mFAAmF;QACnF,gFAAgF;QAChF,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,EAAE;YACvB,MAAM,cAAc,GAClB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE;gBACxD,oBAAY,CAAC,MAAM,CAAC;YACtB,MAAM,oBAAoB,GAAG,WAAW,CAAC,IAAI,CAC3C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CACnE,CAAC;YAEF,IAAI,CAAC,oBAAoB,EAAE;gBACzB,OAAO,IAAI,CAAC;aACb;YAED,OAAO,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC;SACpD;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA9CD,8BA8CC"}
1
+ {"version":3,"file":"variation.js","names":["_types","require","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","Variation","constructor","variationData","id","Error","variationId","isValid","respoolTime","variation","length","assignmentTime","Date","parse","assignmentDate","getTime","Milliseconds","Second","variationRespoolTime","find","respool","exports"],"sources":["../../src/variationConfiguration/variation.ts"],"sourcesContent":["import { RespoolTimeType } from '../campaignConfiguration/types';\nimport { Milliseconds } from '../types';\nimport { VariationType } from './types';\n\ninterface IVariation {\n readonly id: number;\n isValid: (respoolTime?: RespoolTimeType[]) => boolean;\n}\n\nexport class Variation implements IVariation {\n variationData?: VariationType;\n\n constructor(variationData?: VariationType) {\n this.variationData = variationData;\n }\n\n get id(): number {\n if (!this.variationData) {\n throw new Error(\n \"Internal usage error: Check if the variation `isValid`, before getting it's `id`\",\n );\n }\n\n return this.variationData.variationId;\n }\n\n public isValid(respoolTime?: RespoolTimeType[]): boolean {\n const variation = this.variationData;\n\n if (!variation) {\n return false;\n }\n\n // --- Note ---\n // - Respool is a kind of shuffle parameter\n // it's presence indicates that variations assigned to\n // user has changed at certain time (time is the value of `respoolTime` in seconds)\n // - So the variation is valid unless it has been shuffled after it's assignment\n if (respoolTime?.length) {\n const assignmentTime =\n new Date(Date.parse(variation.assignmentDate)).getTime() /\n Milliseconds.Second;\n const variationRespoolTime = respoolTime.find(\n (respool) => respool.variationId === String(variation.variationId),\n );\n\n if (!variationRespoolTime) {\n return true;\n }\n\n return assignmentTime > variationRespoolTime.value;\n }\n\n return true;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAAwC,SAAAC,gBAAAC,GAAA,EAAAC,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAD,GAAA,IAAAI,MAAA,CAAAC,cAAA,CAAAL,GAAA,EAAAC,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAR,GAAA,CAAAC,GAAA,IAAAC,KAAA,WAAAF,GAAA;AAAA,SAAAG,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AAQjC,MAAMU,SAAS,CAAuB;EAG3CC,WAAWA,CAACC,aAA6B,EAAE;IAAAzB,eAAA;IACzC,IAAI,CAACyB,aAAa,GAAGA,aAAa;EACpC;EAEA,IAAIC,EAAEA,CAAA,EAAW;IACf,IAAI,CAAC,IAAI,CAACD,aAAa,EAAE;MACvB,MAAM,IAAIE,KAAK,CACb,kFAAkF,CACnF;IACH;IAEA,OAAO,IAAI,CAACF,aAAa,CAACG,WAAW;EACvC;EAEOC,OAAOA,CAACC,WAA+B,EAAW;IACvD,MAAMC,SAAS,GAAG,IAAI,CAACN,aAAa;IAEpC,IAAI,CAACM,SAAS,EAAE;MACd,OAAO,KAAK;IACd;;IAEA;IACA;IACA;IACA;IACA;IACA,IAAID,WAAW,EAAEE,MAAM,EAAE;MACvB,MAAMC,cAAc,GAClB,IAAIC,IAAI,CAACA,IAAI,CAACC,KAAK,CAACJ,SAAS,CAACK,cAAc,CAAC,CAAC,CAACC,OAAO,EAAE,GACxDC,mBAAY,CAACC,MAAM;MACrB,MAAMC,oBAAoB,GAAGV,WAAW,CAACW,IAAI,CAC1CC,OAAO,IAAKA,OAAO,CAACd,WAAW,KAAKhB,MAAM,CAACmB,SAAS,CAACH,WAAW,CAAC,CACnE;MAED,IAAI,CAACY,oBAAoB,EAAE;QACzB,OAAO,IAAI;MACb;MAEA,OAAOP,cAAc,GAAGO,oBAAoB,CAACrC,KAAK;IACpD;IAEA,OAAO,IAAI;EACb;AACF;AAACwC,OAAA,CAAApB,SAAA,GAAAA,SAAA"}
@@ -6,19 +6,19 @@ import { FeatureFlagVariationType, GetFeatureFlagVariationParametersType } from
6
6
  interface IVariationConfiguration {
7
7
  /**
8
8
  * @method getAssociatedVariationId - gets the id of a variation assigned to a visitor with `visitorCode` from the storage. If the visitor doesn't have associated variation yet, assigns a new one, stores it and returns it's id.
9
- * */
9
+ */
10
10
  getAssociatedVariationId: (visitorCode: string, experimentId: number) => Result<number, KameleoonError>;
11
11
  /**
12
- * @method getAssignedVariations - obtains experiments with according variations that are *already assigned* and *stored* in the `variationStorage`. If `getAssociatedVariationId` hadn't been called before, there will be no variations to get.
13
- * */
12
+ * @method getAssignedVariations - obtains experiments with according variations that are *already assigned* and *stored* in the `variationStorage`. If `getAssociatedVariationId` had not been called before, there will be no variations to get.
13
+ */
14
14
  getAssignedVariations(visitorCode: string): Result<ExperimentVariationsType, KameleoonError>;
15
15
  /**
16
16
  * @method getFeatureFlagVariation - obtains variation for the rule of the feature flag which is both targeted and has a variation, if no such rule was found, returns empty rule with default `variationKey`, given an option `withAssignment` of `true` will also assign a new variation and save it in the storage
17
- * */
17
+ */
18
18
  getFeatureFlagVariation: (params: GetFeatureFlagVariationParametersType) => Result<FeatureFlagVariationType, KameleoonError>;
19
19
  /**
20
20
  * @method getExperimentVariation - obtains variation for the experiment by calculating the variation for the visitor *without assigning* it to a visitor
21
- * */
21
+ */
22
22
  getExperimentVariation: (visitorCode: string, experiment: ExperimentItemType) => Result<number, KameleoonError>;
23
23
  }
24
24
  export declare class VariationConfiguration implements IVariationConfiguration {
@@ -31,6 +31,5 @@ export declare class VariationConfiguration implements IVariationConfiguration {
31
31
  getExperimentVariation(visitorCode: string, experiment: ExperimentItemType): Result<number, KameleoonError>;
32
32
  private assignVariation;
33
33
  private updateStorageData;
34
- private getAssignedRuleVariation;
35
34
  }
36
35
  export {};