@splitsoftware/splitio-commons 1.13.2-rc.0 → 1.13.2-rc.10

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 (180) hide show
  1. package/CHANGES.txt +4 -3
  2. package/cjs/evaluator/Engine.js +5 -6
  3. package/cjs/evaluator/combiners/ifelseif.js +3 -4
  4. package/cjs/evaluator/condition/index.js +2 -3
  5. package/cjs/evaluator/index.js +4 -5
  6. package/cjs/evaluator/matchers/all.js +1 -3
  7. package/cjs/evaluator/matchers/between.js +1 -3
  8. package/cjs/evaluator/matchers/boolean.js +1 -3
  9. package/cjs/evaluator/matchers/cont_all.js +1 -3
  10. package/cjs/evaluator/matchers/cont_any.js +1 -3
  11. package/cjs/evaluator/matchers/cont_str.js +1 -3
  12. package/cjs/evaluator/matchers/dependency.js +1 -1
  13. package/cjs/evaluator/matchers/eq.js +1 -3
  14. package/cjs/evaluator/matchers/eq_set.js +1 -3
  15. package/cjs/evaluator/matchers/ew.js +1 -3
  16. package/cjs/evaluator/matchers/gte.js +3 -5
  17. package/cjs/evaluator/matchers/index.js +12 -2
  18. package/cjs/evaluator/matchers/lte.js +3 -5
  19. package/cjs/evaluator/matchers/matcherTypes.js +6 -1
  20. package/cjs/evaluator/matchers/part_of.js +1 -3
  21. package/cjs/evaluator/matchers/segment.js +1 -6
  22. package/cjs/evaluator/matchers/semver_between.js +14 -0
  23. package/cjs/evaluator/matchers/semver_eq.js +13 -0
  24. package/cjs/evaluator/matchers/semver_gte.js +13 -0
  25. package/cjs/evaluator/matchers/semver_inlist.js +17 -0
  26. package/cjs/evaluator/matchers/semver_lte.js +13 -0
  27. package/cjs/evaluator/matchers/string.js +3 -12
  28. package/cjs/evaluator/matchers/sw.js +1 -3
  29. package/cjs/evaluator/matchers/whitelist.js +3 -4
  30. package/cjs/evaluator/matchersTransform/index.js +21 -16
  31. package/cjs/evaluator/matchersTransform/whitelist.js +2 -3
  32. package/cjs/evaluator/parser/index.js +24 -9
  33. package/cjs/logger/constants.js +5 -20
  34. package/cjs/logger/index.js +8 -1
  35. package/cjs/logger/messages/debug.js +5 -21
  36. package/cjs/logger/messages/error.js +2 -1
  37. package/cjs/logger/messages/warn.js +1 -1
  38. package/cjs/sdkClient/sdkClient.js +1 -6
  39. package/cjs/services/splitApi.js +5 -5
  40. package/cjs/storages/KeyBuilder.js +2 -1
  41. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  42. package/cjs/storages/pluggable/index.js +1 -1
  43. package/cjs/utils/Semver.js +103 -0
  44. package/cjs/utils/constants/index.js +2 -1
  45. package/cjs/utils/labels/index.js +1 -1
  46. package/cjs/utils/settingsValidation/index.js +1 -1
  47. package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  48. package/esm/evaluator/Engine.js +5 -5
  49. package/esm/evaluator/combiners/ifelseif.js +3 -3
  50. package/esm/evaluator/condition/index.js +2 -2
  51. package/esm/evaluator/index.js +4 -4
  52. package/esm/evaluator/matchers/all.js +1 -3
  53. package/esm/evaluator/matchers/between.js +1 -3
  54. package/esm/evaluator/matchers/boolean.js +1 -3
  55. package/esm/evaluator/matchers/cont_all.js +1 -3
  56. package/esm/evaluator/matchers/cont_any.js +1 -3
  57. package/esm/evaluator/matchers/cont_str.js +1 -3
  58. package/esm/evaluator/matchers/dependency.js +1 -1
  59. package/esm/evaluator/matchers/eq.js +1 -3
  60. package/esm/evaluator/matchers/eq_set.js +1 -3
  61. package/esm/evaluator/matchers/ew.js +1 -3
  62. package/esm/evaluator/matchers/gte.js +3 -5
  63. package/esm/evaluator/matchers/index.js +12 -2
  64. package/esm/evaluator/matchers/lte.js +3 -5
  65. package/esm/evaluator/matchers/matcherTypes.js +6 -1
  66. package/esm/evaluator/matchers/part_of.js +1 -3
  67. package/esm/evaluator/matchers/segment.js +1 -6
  68. package/esm/evaluator/matchers/semver_between.js +10 -0
  69. package/esm/evaluator/matchers/semver_eq.js +9 -0
  70. package/esm/evaluator/matchers/semver_gte.js +9 -0
  71. package/esm/evaluator/matchers/semver_inlist.js +13 -0
  72. package/esm/evaluator/matchers/semver_lte.js +9 -0
  73. package/esm/evaluator/matchers/string.js +3 -12
  74. package/esm/evaluator/matchers/sw.js +1 -3
  75. package/esm/evaluator/matchers/whitelist.js +4 -5
  76. package/esm/evaluator/matchersTransform/index.js +21 -16
  77. package/esm/evaluator/matchersTransform/whitelist.js +2 -3
  78. package/esm/evaluator/parser/index.js +24 -9
  79. package/esm/logger/constants.js +2 -17
  80. package/esm/logger/index.js +9 -2
  81. package/esm/logger/messages/debug.js +5 -21
  82. package/esm/logger/messages/error.js +2 -1
  83. package/esm/logger/messages/warn.js +1 -1
  84. package/esm/sdkClient/sdkClient.js +1 -6
  85. package/esm/services/splitApi.js +6 -6
  86. package/esm/storages/KeyBuilder.js +2 -1
  87. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  88. package/esm/storages/pluggable/index.js +1 -1
  89. package/esm/utils/Semver.js +100 -0
  90. package/esm/utils/constants/index.js +1 -0
  91. package/esm/utils/labels/index.js +1 -1
  92. package/esm/utils/settingsValidation/index.js +1 -1
  93. package/esm/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  94. package/package.json +1 -2
  95. package/src/dtos/types.ts +34 -1
  96. package/src/evaluator/Engine.ts +5 -6
  97. package/src/evaluator/combiners/ifelseif.ts +3 -3
  98. package/src/evaluator/condition/index.ts +2 -2
  99. package/src/evaluator/index.ts +4 -4
  100. package/src/evaluator/matchers/all.ts +1 -5
  101. package/src/evaluator/matchers/between.ts +3 -7
  102. package/src/evaluator/matchers/boolean.ts +2 -6
  103. package/src/evaluator/matchers/cont_all.ts +1 -5
  104. package/src/evaluator/matchers/cont_any.ts +1 -5
  105. package/src/evaluator/matchers/cont_str.ts +2 -6
  106. package/src/evaluator/matchers/dependency.ts +1 -1
  107. package/src/evaluator/matchers/eq.ts +2 -6
  108. package/src/evaluator/matchers/eq_set.ts +1 -5
  109. package/src/evaluator/matchers/ew.ts +2 -6
  110. package/src/evaluator/matchers/gte.ts +3 -7
  111. package/src/evaluator/matchers/index.ts +29 -19
  112. package/src/evaluator/matchers/lte.ts +3 -7
  113. package/src/evaluator/matchers/matcherTypes.ts +6 -1
  114. package/src/evaluator/matchers/part_of.ts +1 -5
  115. package/src/evaluator/matchers/segment.ts +1 -8
  116. package/src/evaluator/matchers/semver_between.ts +15 -0
  117. package/src/evaluator/matchers/semver_eq.ts +13 -0
  118. package/src/evaluator/matchers/semver_gte.ts +13 -0
  119. package/src/evaluator/matchers/semver_inlist.ts +17 -0
  120. package/src/evaluator/matchers/semver_lte.ts +13 -0
  121. package/src/evaluator/matchers/string.ts +3 -16
  122. package/src/evaluator/matchers/sw.ts +2 -6
  123. package/src/evaluator/matchers/whitelist.ts +5 -7
  124. package/src/evaluator/matchersTransform/index.ts +31 -23
  125. package/src/evaluator/matchersTransform/whitelist.ts +4 -5
  126. package/src/evaluator/parser/index.ts +25 -10
  127. package/src/evaluator/types.ts +3 -3
  128. package/src/logger/constants.ts +2 -17
  129. package/src/logger/index.ts +8 -2
  130. package/src/logger/messages/debug.ts +5 -21
  131. package/src/logger/messages/error.ts +2 -1
  132. package/src/logger/messages/warn.ts +1 -1
  133. package/src/sdkClient/sdkClient.ts +1 -8
  134. package/src/services/splitApi.ts +5 -6
  135. package/src/storages/KeyBuilder.ts +2 -1
  136. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +1 -1
  137. package/src/storages/pluggable/index.ts +1 -1
  138. package/src/types.ts +3 -3
  139. package/src/utils/Semver.ts +111 -0
  140. package/src/utils/constants/index.ts +2 -0
  141. package/src/utils/labels/index.ts +1 -1
  142. package/src/utils/settingsValidation/index.ts +1 -1
  143. package/src/utils/settingsValidation/logger/pluggableLogger.ts +1 -1
  144. package/types/dtos/types.d.ts +26 -1
  145. package/types/evaluator/matchers/all.d.ts +1 -2
  146. package/types/evaluator/matchers/between.d.ts +1 -2
  147. package/types/evaluator/matchers/boolean.d.ts +1 -2
  148. package/types/evaluator/matchers/cont_all.d.ts +1 -2
  149. package/types/evaluator/matchers/cont_any.d.ts +1 -2
  150. package/types/evaluator/matchers/cont_str.d.ts +1 -2
  151. package/types/evaluator/matchers/dependency.d.ts +1 -1
  152. package/types/evaluator/matchers/eq.d.ts +1 -2
  153. package/types/evaluator/matchers/eq_set.d.ts +1 -2
  154. package/types/evaluator/matchers/ew.d.ts +1 -2
  155. package/types/evaluator/matchers/gte.d.ts +1 -2
  156. package/types/evaluator/matchers/lte.d.ts +1 -2
  157. package/types/evaluator/matchers/part_of.d.ts +1 -2
  158. package/types/evaluator/matchers/segment.d.ts +1 -2
  159. package/types/evaluator/matchers/sember_inlist.d.ts +3 -0
  160. package/types/evaluator/matchers/semver_between.d.ts +2 -0
  161. package/types/evaluator/matchers/semver_eq.d.ts +1 -0
  162. package/types/evaluator/matchers/semver_gte.d.ts +1 -0
  163. package/types/evaluator/matchers/semver_inlist.d.ts +1 -0
  164. package/types/evaluator/matchers/semver_lte.d.ts +1 -0
  165. package/types/evaluator/matchers/string.d.ts +1 -2
  166. package/types/evaluator/matchers/sw.d.ts +1 -2
  167. package/types/evaluator/matchers/whitelist.d.ts +1 -3
  168. package/types/evaluator/matchersTransform/set.d.ts +2 -2
  169. package/types/evaluator/matchersTransform/string.d.ts +7 -0
  170. package/types/evaluator/matchersTransform/whitelist.d.ts +3 -3
  171. package/types/evaluator/types.d.ts +3 -3
  172. package/types/logger/constants.d.ts +2 -17
  173. package/types/types.d.ts +3 -3
  174. package/types/utils/constants/index.d.ts +1 -0
  175. package/types/utils/labels/index.d.ts +1 -1
  176. package/types/utils/semVer.d.ts +15 -0
  177. package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +8 -0
  178. package/cjs/evaluator/matchersTransform/set.js +0 -10
  179. package/esm/evaluator/matchersTransform/set.js +0 -6
  180. package/src/evaluator/matchersTransform/set.ts +0 -8
@@ -1,6 +1,6 @@
1
1
  import { getTreatment, shouldApplyRollout } from './engineUtils';
2
2
  import { thenable } from '../../utils/promise/thenable';
3
- import * as LabelsConstants from '../../utils/labels';
3
+ import { NOT_IN_SPLIT } from '../../utils/labels';
4
4
  // Build Evaluation object if and only if matchingResult is true
5
5
  function match(log, matchingResult, bucketingKey, seed, treatments, label) {
6
6
  if (matchingResult) {
@@ -20,7 +20,7 @@ export function conditionContext(log, matcherEvaluator, treatments, label, condi
20
20
  if (conditionType === 'ROLLOUT' && !shouldApplyRollout(trafficAllocation, key.bucketingKey, trafficAllocationSeed)) {
21
21
  return {
22
22
  treatment: undefined,
23
- label: LabelsConstants.NOT_IN_SPLIT
23
+ label: NOT_IN_SPLIT
24
24
  };
25
25
  }
26
26
  // matcherEvaluator could be Async, this relays on matchers return value, so we need
@@ -1,12 +1,12 @@
1
1
  import { Engine } from './Engine';
2
2
  import { thenable } from '../utils/promise/thenable';
3
- import * as LabelsConstants from '../utils/labels';
3
+ import { EXCEPTION, SPLIT_NOT_FOUND } from '../utils/labels';
4
4
  import { CONTROL } from '../utils/constants';
5
5
  import { setToArray, returnSetsUnion, _Set } from '../utils/lang/sets';
6
6
  import { WARN_FLAGSET_WITHOUT_FLAGS } from '../logger/constants';
7
7
  var treatmentException = {
8
8
  treatment: CONTROL,
9
- label: LabelsConstants.EXCEPTION,
9
+ label: EXCEPTION,
10
10
  config: null
11
11
  };
12
12
  function treatmentsException(splitNames) {
@@ -87,13 +87,13 @@ export function evaluateFeaturesByFlagSets(log, key, flagSets, attributes, stora
87
87
  function getEvaluation(log, splitJSON, key, attributes, storage) {
88
88
  var evaluation = {
89
89
  treatment: CONTROL,
90
- label: LabelsConstants.SPLIT_NOT_FOUND,
90
+ label: SPLIT_NOT_FOUND,
91
91
  config: null
92
92
  };
93
93
  if (splitJSON) {
94
94
  var split_1 = Engine.parse(log, splitJSON, storage);
95
95
  evaluation = split_1.getTreatment(key, attributes, evaluateFeature);
96
- // If the storage is async and the evaluated split uses segment, evaluation is thenable
96
+ // If the storage is async and the evaluated flag uses segments or dependencies, evaluation is thenable
97
97
  if (thenable(evaluation)) {
98
98
  return evaluation.then(function (result) {
99
99
  result.changeNumber = split_1.getChangeNumber();
@@ -1,7 +1,5 @@
1
- import { ENGINE_MATCHER_ALL } from '../../logger/constants';
2
- export function allMatcherContext(log) {
1
+ export function allMatcherContext() {
3
2
  return function allMatcher(runtimeAttr) {
4
- log.debug(ENGINE_MATCHER_ALL);
5
3
  return runtimeAttr != null;
6
4
  };
7
5
  }
@@ -1,8 +1,6 @@
1
- import { ENGINE_MATCHER_BETWEEN } from '../../logger/constants';
2
- export function betweenMatcherContext(log, ruleVO) {
1
+ export function betweenMatcherContext(ruleVO) {
3
2
  return function betweenMatcher(runtimeAttr) {
4
3
  var isBetween = runtimeAttr >= ruleVO.start && runtimeAttr <= ruleVO.end;
5
- log.debug(ENGINE_MATCHER_BETWEEN, [runtimeAttr, ruleVO.start, ruleVO.end, isBetween]);
6
4
  return isBetween;
7
5
  };
8
6
  }
@@ -1,8 +1,6 @@
1
- import { ENGINE_MATCHER_BOOLEAN } from '../../logger/constants';
2
- export function booleanMatcherContext(log, ruleAttr) {
1
+ export function booleanMatcherContext(ruleAttr) {
3
2
  return function booleanMatcher(runtimeAttr) {
4
3
  var booleanMatches = ruleAttr === runtimeAttr;
5
- log.debug(ENGINE_MATCHER_BOOLEAN, [ruleAttr, runtimeAttr]);
6
4
  return booleanMatches;
7
5
  };
8
6
  }
@@ -1,6 +1,5 @@
1
- import { ENGINE_MATCHER_CONTAINS_ALL } from '../../logger/constants';
2
1
  import { findIndex } from '../../utils/lang';
3
- export function containsAllSetMatcherContext(log, ruleAttr) {
2
+ export function containsAllSetMatcherContext(ruleAttr) {
4
3
  return function containsAllMatcher(runtimeAttr) {
5
4
  var containsAll = true;
6
5
  if (runtimeAttr.length < ruleAttr.length) {
@@ -15,7 +14,6 @@ export function containsAllSetMatcherContext(log, ruleAttr) {
15
14
  _loop_1(i);
16
15
  }
17
16
  }
18
- log.debug(ENGINE_MATCHER_CONTAINS_ALL, [runtimeAttr, ruleAttr, containsAll]);
19
17
  return containsAll;
20
18
  };
21
19
  }
@@ -1,6 +1,5 @@
1
- import { ENGINE_MATCHER_CONTAINS_ANY } from '../../logger/constants';
2
1
  import { findIndex } from '../../utils/lang';
3
- export function containsAnySetMatcherContext(log, ruleAttr) {
2
+ export function containsAnySetMatcherContext(ruleAttr) {
4
3
  return function containsAnyMatcher(runtimeAttr) {
5
4
  var containsAny = false;
6
5
  var _loop_1 = function (i) {
@@ -10,7 +9,6 @@ export function containsAnySetMatcherContext(log, ruleAttr) {
10
9
  for (var i = 0; i < ruleAttr.length && !containsAny; i++) {
11
10
  _loop_1(i);
12
11
  }
13
- log.debug(ENGINE_MATCHER_CONTAINS_ANY, [runtimeAttr, ruleAttr, containsAny]);
14
12
  return containsAny;
15
13
  };
16
14
  }
@@ -1,9 +1,7 @@
1
1
  import { isString } from '../../utils/lang';
2
- import { ENGINE_MATCHER_CONTAINS_STRING } from '../../logger/constants';
3
- export function containsStringMatcherContext(log, ruleAttr) {
2
+ export function containsStringMatcherContext(ruleAttr) {
4
3
  return function containsStringMatcher(runtimeAttr) {
5
4
  var contains = ruleAttr.some(function (e) { return isString(runtimeAttr) && runtimeAttr.indexOf(e) > -1; });
6
- log.debug(ENGINE_MATCHER_CONTAINS_STRING, [runtimeAttr, ruleAttr, contains]);
7
5
  return contains;
8
6
  };
9
7
  }
@@ -1,6 +1,6 @@
1
1
  import { thenable } from '../../utils/promise/thenable';
2
2
  import { ENGINE_MATCHER_DEPENDENCY, ENGINE_MATCHER_DEPENDENCY_PRE } from '../../logger/constants';
3
- export function dependencyMatcherContext(log, _a, storage) {
3
+ export function dependencyMatcherContext(_a, storage, log) {
4
4
  var split = _a.split, treatments = _a.treatments;
5
5
  function checkTreatment(evaluation, acceptableTreatments, parentName) {
6
6
  var matches = false;
@@ -1,8 +1,6 @@
1
- import { ENGINE_MATCHER_EQUAL } from '../../logger/constants';
2
- export function equalToMatcherContext(log, ruleAttr) {
1
+ export function equalToMatcherContext(ruleAttr) {
3
2
  return function equalToMatcher(runtimeAttr) {
4
3
  var isEqual = runtimeAttr === ruleAttr;
5
- log.debug(ENGINE_MATCHER_EQUAL, [runtimeAttr, ruleAttr, isEqual]);
6
4
  return isEqual;
7
5
  };
8
6
  }
@@ -1,6 +1,5 @@
1
- import { ENGINE_MATCHER_EQUAL_TO_SET } from '../../logger/constants';
2
1
  import { findIndex } from '../../utils/lang';
3
- export function equalToSetMatcherContext(log, ruleAttr) {
2
+ export function equalToSetMatcherContext(ruleAttr) {
4
3
  return function equalToSetMatcher(runtimeAttr) {
5
4
  // Length being the same is the first condition.
6
5
  var isEqual = runtimeAttr.length === ruleAttr.length;
@@ -12,7 +11,6 @@ export function equalToSetMatcherContext(log, ruleAttr) {
12
11
  for (var i = 0; i < runtimeAttr.length && isEqual; i++) {
13
12
  _loop_1(i);
14
13
  }
15
- log.debug(ENGINE_MATCHER_EQUAL_TO_SET, [runtimeAttr, ruleAttr, isEqual]);
16
14
  return isEqual;
17
15
  };
18
16
  }
@@ -1,9 +1,7 @@
1
- import { ENGINE_MATCHER_ENDS_WITH } from '../../logger/constants';
2
1
  import { endsWith } from '../../utils/lang';
3
- export function endsWithMatcherContext(log, ruleAttr) {
2
+ export function endsWithMatcherContext(ruleAttr) {
4
3
  return function endsWithMatcher(runtimeAttr) {
5
4
  var strEndsWith = ruleAttr.some(function (e) { return endsWith(runtimeAttr, e); });
6
- log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, strEndsWith]);
7
5
  return strEndsWith;
8
6
  };
9
7
  }
@@ -1,8 +1,6 @@
1
- import { ENGINE_MATCHER_GREATER } from '../../logger/constants';
2
- export function greaterThanEqualMatcherContext(log, ruleAttr) {
1
+ export function greaterThanEqualMatcherContext(ruleAttr) {
3
2
  return function greaterThanEqualMatcher(runtimeAttr) {
4
- var isGreaterEqualThan = runtimeAttr >= ruleAttr;
5
- log.debug(ENGINE_MATCHER_GREATER, [runtimeAttr, ruleAttr, isGreaterEqualThan]);
6
- return isGreaterEqualThan;
3
+ var isGreaterThanEqual = runtimeAttr >= ruleAttr;
4
+ return isGreaterThanEqual;
7
5
  };
8
6
  }
@@ -15,6 +15,11 @@ import { containsStringMatcherContext } from './cont_str';
15
15
  import { dependencyMatcherContext } from './dependency';
16
16
  import { booleanMatcherContext } from './boolean';
17
17
  import { stringMatcherContext } from './string';
18
+ import { equalToSemverMatcherContext } from './semver_eq';
19
+ import { greaterThanEqualToSemverMatcherContext } from './semver_gte';
20
+ import { lessThanEqualToSemverMatcherContext } from './semver_lte';
21
+ import { betweenSemverMatcherContext } from './semver_between';
22
+ import { inListSemverMatcherContext } from './semver_inlist';
18
23
  var matchers = [
19
24
  undefined,
20
25
  allMatcherContext,
@@ -33,7 +38,12 @@ var matchers = [
33
38
  containsStringMatcherContext,
34
39
  dependencyMatcherContext,
35
40
  booleanMatcherContext,
36
- stringMatcherContext // MATCHES_STRING: 17
41
+ stringMatcherContext,
42
+ equalToSemverMatcherContext,
43
+ greaterThanEqualToSemverMatcherContext,
44
+ lessThanEqualToSemverMatcherContext,
45
+ betweenSemverMatcherContext,
46
+ inListSemverMatcherContext, // IN_LIST_SEMVER: 22
37
47
  ];
38
48
  /**
39
49
  * Matcher factory.
@@ -43,6 +53,6 @@ export function matcherFactory(log, matcherDto, storage) {
43
53
  var matcherFn;
44
54
  // @ts-ignore
45
55
  if (matchers[type])
46
- matcherFn = matchers[type](log, value, storage); // There is no index-out-of-bound exception in JavaScript
56
+ matcherFn = matchers[type](value, storage, log); // There is no index-out-of-bound exception in JavaScript
47
57
  return matcherFn;
48
58
  }
@@ -1,8 +1,6 @@
1
- import { ENGINE_MATCHER_LESS } from '../../logger/constants';
2
- export function lessThanEqualMatcherContext(log, ruleAttr) {
1
+ export function lessThanEqualMatcherContext(ruleAttr) {
3
2
  return function lessThanEqualMatcher(runtimeAttr) {
4
- var isLessEqualThan = runtimeAttr <= ruleAttr;
5
- log.debug(ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessEqualThan]);
6
- return isLessEqualThan;
3
+ var isLessThanEqual = runtimeAttr <= ruleAttr;
4
+ return isLessThanEqual;
7
5
  };
8
6
  }
@@ -16,7 +16,12 @@ export var matcherTypes = {
16
16
  CONTAINS_STRING: 14,
17
17
  IN_SPLIT_TREATMENT: 15,
18
18
  EQUAL_TO_BOOLEAN: 16,
19
- MATCHES_STRING: 17
19
+ MATCHES_STRING: 17,
20
+ EQUAL_TO_SEMVER: 18,
21
+ GREATER_THAN_OR_EQUAL_TO_SEMVER: 19,
22
+ LESS_THAN_OR_EQUAL_TO_SEMVER: 20,
23
+ BETWEEN_SEMVER: 21,
24
+ IN_LIST_SEMVER: 22,
20
25
  };
21
26
  export var matcherDataTypes = {
22
27
  BOOLEAN: 'BOOLEAN',
@@ -1,6 +1,5 @@
1
1
  import { findIndex } from '../../utils/lang';
2
- import { ENGINE_MATCHER_PART_OF } from '../../logger/constants';
3
- export function partOfSetMatcherContext(log, ruleAttr) {
2
+ export function partOfSetMatcherContext(ruleAttr) {
4
3
  return function partOfMatcher(runtimeAttr) {
5
4
  // To be part of the length should be minor or equal.
6
5
  var isPartOf = runtimeAttr.length <= ruleAttr.length;
@@ -12,7 +11,6 @@ export function partOfSetMatcherContext(log, ruleAttr) {
12
11
  for (var i = 0; i < runtimeAttr.length && isPartOf; i++) {
13
12
  _loop_1(i);
14
13
  }
15
- log.debug(ENGINE_MATCHER_PART_OF, [runtimeAttr, ruleAttr, isPartOf]);
16
14
  return isPartOf;
17
15
  };
18
16
  }
@@ -1,17 +1,12 @@
1
1
  import { thenable } from '../../utils/promise/thenable';
2
- import { ENGINE_MATCHER_SEGMENT } from '../../logger/constants';
3
- export function segmentMatcherContext(log, segmentName, storage) {
2
+ export function segmentMatcherContext(segmentName, storage) {
4
3
  return function segmentMatcher(key) {
5
4
  var isInSegment = storage.segments.isInSegment(segmentName, key);
6
5
  if (thenable(isInSegment)) {
7
6
  isInSegment.then(function (result) {
8
- log.debug(ENGINE_MATCHER_SEGMENT, [segmentName, key, isInSegment]);
9
7
  return result;
10
8
  });
11
9
  }
12
- else {
13
- log.debug(ENGINE_MATCHER_SEGMENT, [segmentName, key, isInSegment]);
14
- }
15
10
  return isInSegment;
16
11
  };
17
12
  }
@@ -0,0 +1,10 @@
1
+ import { Semver } from '../../utils/Semver';
2
+ export function betweenSemverMatcherContext(ruleAttr) {
3
+ var startSemver = new Semver(ruleAttr.start);
4
+ var endSemver = new Semver(ruleAttr.end);
5
+ return function betweenSemverMatcher(runtimeAttr) {
6
+ var runtimeSemver = new Semver(runtimeAttr);
7
+ var isBetween = startSemver.compare(runtimeSemver) <= 0 && endSemver.compare(runtimeSemver) >= 0;
8
+ return isBetween;
9
+ };
10
+ }
@@ -0,0 +1,9 @@
1
+ import { Semver } from '../../utils/Semver';
2
+ export function equalToSemverMatcherContext(ruleAttr) {
3
+ var ruleSemver = new Semver(ruleAttr);
4
+ return function equalToSemverMatcher(runtimeAttr) {
5
+ var runtimeSemver = new Semver(runtimeAttr);
6
+ var isEqual = ruleSemver.version === runtimeSemver.version;
7
+ return isEqual;
8
+ };
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Semver } from '../../utils/Semver';
2
+ export function greaterThanEqualToSemverMatcherContext(ruleAttr) {
3
+ var ruleSemver = new Semver(ruleAttr);
4
+ return function greaterThanEqualToSemverMatcher(runtimeAttr) {
5
+ var runtimeSemver = new Semver(runtimeAttr);
6
+ var isGreaterThanEqual = runtimeSemver.compare(ruleSemver) >= 0;
7
+ return isGreaterThanEqual;
8
+ };
9
+ }
@@ -0,0 +1,13 @@
1
+ import { _Set } from '../../utils/lang/sets';
2
+ import { Semver } from '../../utils/Semver';
3
+ export function inListSemverMatcherContext(ruleAttr) {
4
+ // @TODO ruleAttr validation should be done at the `parser` or `matchersTransform` level to reuse for all matchers
5
+ if (!ruleAttr || ruleAttr.length === 0)
6
+ throw new Error('whitelistMatcherData is required for IN_LIST_SEMVER matcher type');
7
+ var listOfSemvers = new _Set(ruleAttr.map(function (version) { return new Semver(version).version; }));
8
+ return function inListSemverMatcher(runtimeAttr) {
9
+ var runtimeSemver = new Semver(runtimeAttr).version;
10
+ var isInList = listOfSemvers.has(runtimeSemver);
11
+ return isInList;
12
+ };
13
+ }
@@ -0,0 +1,9 @@
1
+ import { Semver } from '../../utils/Semver';
2
+ export function lessThanEqualToSemverMatcherContext(ruleAttr) {
3
+ var ruleSemver = new Semver(ruleAttr);
4
+ return function lessThanEqualToSemverMatcher(runtimeAttr) {
5
+ var runtimeSemver = new Semver(runtimeAttr);
6
+ var isLessThanEqual = runtimeSemver.compare(ruleSemver) <= 0;
7
+ return isLessThanEqual;
8
+ };
9
+ }
@@ -1,16 +1,7 @@
1
- import { ENGINE_MATCHER_STRING_INVALID, ENGINE_MATCHER_STRING } from '../../logger/constants';
2
- export function stringMatcherContext(log, ruleAttr) {
1
+ export function stringMatcherContext(ruleAttr) {
2
+ var regex = new RegExp(ruleAttr);
3
3
  return function stringMatcher(runtimeAttr) {
4
- var re;
5
- try {
6
- re = new RegExp(ruleAttr);
7
- }
8
- catch (e) {
9
- log.debug(ENGINE_MATCHER_STRING_INVALID, [ruleAttr]);
10
- return false;
11
- }
12
- var regexMatches = re.test(runtimeAttr);
13
- log.debug(ENGINE_MATCHER_STRING, [runtimeAttr, ruleAttr, regexMatches ? 'yes' : 'no']);
4
+ var regexMatches = regex.test(runtimeAttr);
14
5
  return regexMatches;
15
6
  };
16
7
  }
@@ -1,9 +1,7 @@
1
- import { ENGINE_MATCHER_STARTS_WITH } from '../../logger/constants';
2
1
  import { startsWith } from '../../utils/lang';
3
- export function startsWithMatcherContext(log, ruleAttr) {
2
+ export function startsWithMatcherContext(ruleAttr) {
4
3
  return function startsWithMatcher(runtimeAttr) {
5
4
  var matches = ruleAttr.some(function (e) { return startsWith(runtimeAttr, e); });
6
- log.debug(ENGINE_MATCHER_STARTS_WITH, [runtimeAttr, ruleAttr, matches]);
7
5
  return matches;
8
6
  };
9
7
  }
@@ -1,9 +1,8 @@
1
- import { setToArray } from '../../utils/lang/sets';
2
- import { ENGINE_MATCHER_WHITELIST } from '../../logger/constants';
3
- export function whitelistMatcherContext(log, ruleAttr) {
1
+ import { _Set } from '../../utils/lang/sets';
2
+ export function whitelistMatcherContext(ruleAttr) {
3
+ var whitelistSet = new _Set(ruleAttr);
4
4
  return function whitelistMatcher(runtimeAttr) {
5
- var isInWhitelist = ruleAttr.has(runtimeAttr);
6
- log.debug(ENGINE_MATCHER_WHITELIST, [runtimeAttr, setToArray(ruleAttr).join(','), isInWhitelist]);
5
+ var isInWhitelist = whitelistSet.has(runtimeAttr);
7
6
  return isInWhitelist;
8
7
  };
9
8
  }
@@ -2,7 +2,6 @@ import { findIndex } from '../../utils/lang';
2
2
  import { matcherTypes, matcherTypesMapper, matcherDataTypes } from '../matchers/matcherTypes';
3
3
  import { segmentTransform } from './segment';
4
4
  import { whitelistTransform } from './whitelist';
5
- import { setTransform } from './set';
6
5
  import { numericTransform } from './unaryNumeric';
7
6
  import { zeroSinceHH, zeroSinceSS } from '../convertions';
8
7
  /**
@@ -10,37 +9,34 @@ import { zeroSinceHH, zeroSinceSS } from '../convertions';
10
9
  */
11
10
  export function matchersTransform(matchers) {
12
11
  var parsedMatchers = matchers.map(function (matcher) {
13
- var matcherType = matcher.matcherType /* string */, negate = matcher.negate /* boolean */, keySelector = matcher.keySelector /* keySelectorObject */, segmentObject = matcher.userDefinedSegmentMatcherData /* segmentObject */, whitelistObject = matcher.whitelistMatcherData /* whiteListObject, provided by 'WHITELIST', set and string matchers */, unaryNumericObject = matcher.unaryNumericMatcherData /* unaryNumericObject */, betweenObject = matcher.betweenMatcherData /* betweenObject */, dependencyObject = matcher.dependencyMatcherData /* dependencyObject */, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData;
12
+ var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, whitelistMatcherData = matcher.whitelistMatcherData, /* whitelistObject, provided by 'WHITELIST', 'IN_LIST_SEMVER', set and string matchers */ unaryNumericMatcherData = matcher.unaryNumericMatcherData, betweenMatcherData = matcher.betweenMatcherData, dependencyMatcherData = matcher.dependencyMatcherData, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData, betweenStringMatcherData = matcher.betweenStringMatcherData;
14
13
  var attribute = keySelector && keySelector.attribute;
15
14
  var type = matcherTypesMapper(matcherType);
16
15
  // As default input data type we use string (even for ALL_KEYS)
17
16
  var dataType = matcherDataTypes.STRING;
18
17
  var value = undefined;
19
18
  if (type === matcherTypes.IN_SEGMENT) {
20
- value = segmentTransform(segmentObject);
21
- }
22
- else if (type === matcherTypes.WHITELIST) {
23
- value = whitelistTransform(whitelistObject);
19
+ value = segmentTransform(userDefinedSegmentMatcherData);
24
20
  }
25
21
  else if (type === matcherTypes.EQUAL_TO) {
26
- value = numericTransform(unaryNumericObject);
22
+ value = numericTransform(unaryNumericMatcherData);
27
23
  dataType = matcherDataTypes.NUMBER;
28
- if (unaryNumericObject.dataType === 'DATETIME') {
24
+ if (unaryNumericMatcherData.dataType === 'DATETIME') {
29
25
  value = zeroSinceHH(value);
30
26
  dataType = matcherDataTypes.DATETIME;
31
27
  }
32
28
  }
33
29
  else if (type === matcherTypes.GREATER_THAN_OR_EQUAL_TO ||
34
30
  type === matcherTypes.LESS_THAN_OR_EQUAL_TO) {
35
- value = numericTransform(unaryNumericObject);
31
+ value = numericTransform(unaryNumericMatcherData);
36
32
  dataType = matcherDataTypes.NUMBER;
37
- if (unaryNumericObject.dataType === 'DATETIME') {
33
+ if (unaryNumericMatcherData.dataType === 'DATETIME') {
38
34
  value = zeroSinceSS(value);
39
35
  dataType = matcherDataTypes.DATETIME;
40
36
  }
41
37
  }
42
38
  else if (type === matcherTypes.BETWEEN) {
43
- value = betweenObject;
39
+ value = betweenMatcherData;
44
40
  dataType = matcherDataTypes.NUMBER;
45
41
  if (value.dataType === 'DATETIME') {
46
42
  value.start = zeroSinceSS(value.start);
@@ -48,33 +44,42 @@ export function matchersTransform(matchers) {
48
44
  dataType = matcherDataTypes.DATETIME;
49
45
  }
50
46
  }
47
+ else if (type === matcherTypes.BETWEEN_SEMVER) {
48
+ value = betweenStringMatcherData;
49
+ }
51
50
  else if (type === matcherTypes.EQUAL_TO_SET ||
52
51
  type === matcherTypes.CONTAINS_ANY_OF_SET ||
53
52
  type === matcherTypes.CONTAINS_ALL_OF_SET ||
54
53
  type === matcherTypes.PART_OF_SET) {
55
- value = setTransform(whitelistObject);
54
+ value = whitelistTransform(whitelistMatcherData);
56
55
  dataType = matcherDataTypes.SET;
57
56
  }
58
- else if (type === matcherTypes.STARTS_WITH ||
57
+ else if (type === matcherTypes.WHITELIST ||
58
+ type === matcherTypes.IN_LIST_SEMVER ||
59
+ type === matcherTypes.STARTS_WITH ||
59
60
  type === matcherTypes.ENDS_WITH ||
60
61
  type === matcherTypes.CONTAINS_STRING) {
61
- value = setTransform(whitelistObject);
62
+ value = whitelistTransform(whitelistMatcherData);
62
63
  }
63
64
  else if (type === matcherTypes.IN_SPLIT_TREATMENT) {
64
- value = dependencyObject;
65
+ value = dependencyMatcherData;
65
66
  dataType = matcherDataTypes.NOT_SPECIFIED;
66
67
  }
67
68
  else if (type === matcherTypes.EQUAL_TO_BOOLEAN) {
68
69
  dataType = matcherDataTypes.BOOLEAN;
69
70
  value = booleanMatcherData;
70
71
  }
71
- else if (type === matcherTypes.MATCHES_STRING) {
72
+ else if (type === matcherTypes.MATCHES_STRING ||
73
+ type === matcherTypes.EQUAL_TO_SEMVER ||
74
+ type === matcherTypes.GREATER_THAN_OR_EQUAL_TO_SEMVER ||
75
+ type === matcherTypes.LESS_THAN_OR_EQUAL_TO_SEMVER) {
72
76
  value = stringMatcherData;
73
77
  }
74
78
  return {
75
79
  attribute: attribute,
76
80
  negate: negate,
77
81
  type: type,
82
+ name: matcherType,
78
83
  value: value,
79
84
  dataType: dataType // runtime input data type
80
85
  };
@@ -1,7 +1,6 @@
1
- import { _Set } from '../../utils/lang/sets';
2
1
  /**
3
- * Extract whitelist as a set. Used by 'WHITELIST' matcher.
2
+ * Extract whitelist array.
4
3
  */
5
4
  export function whitelistTransform(whitelistObject) {
6
- return new _Set(whitelistObject.whitelist);
5
+ return whitelistObject && whitelistObject.whitelist;
7
6
  }
@@ -6,6 +6,7 @@ import { conditionContext } from '../condition';
6
6
  import { ifElseIfCombinerContext } from '../combiners/ifelseif';
7
7
  import { andCombinerContext } from '../combiners/and';
8
8
  import { thenable } from '../../utils/promise/thenable';
9
+ import { ENGINE_MATCHER_ERROR, ENGINE_MATCHER_RESULT } from '../../logger/constants';
9
10
  export function parser(log, conditions, storage) {
10
11
  var predicates = [];
11
12
  for (var i = 0; i < conditions.length; i++) {
@@ -14,21 +15,35 @@ export function parser(log, conditions, storage) {
14
15
  var matchers = matchersTransform(matcherGroup.matchers);
15
16
  // create a set of pure functions from the matcher's dto
16
17
  var expressions = matchers.map(function (matcherDto) {
17
- var matcher = matcherFactory(log, matcherDto, storage);
18
+ var matcher;
19
+ try {
20
+ matcher = matcherFactory(log, matcherDto, storage);
21
+ }
22
+ catch (error) {
23
+ log.error(ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
24
+ }
18
25
  // Evaluator function.
19
26
  return function (key, attributes, splitEvaluator) {
20
27
  var value = sanitizeValue(log, key, matcherDto, attributes);
21
- var result = value !== undefined && matcher ? matcher(value, splitEvaluator) : false;
22
- if (thenable(result)) {
23
- // @ts-ignore
24
- return result.then(function (res) { return Boolean(res ^ matcherDto.negate); });
28
+ var result = false;
29
+ if (value !== undefined && matcher) {
30
+ try {
31
+ result = matcher(value, splitEvaluator);
32
+ }
33
+ catch (error) {
34
+ log.error(ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
35
+ }
25
36
  }
26
- // @ts-ignore
27
- return Boolean(result ^ matcherDto.negate);
37
+ function handleResult(result) {
38
+ log.debug(ENGINE_MATCHER_RESULT, [matcherDto.name, result, matcherDto.value, value]); // @ts-ignore
39
+ return Boolean(result ^ matcherDto.negate);
40
+ }
41
+ return thenable(result) ?
42
+ result.then(handleResult) :
43
+ handleResult(result);
28
44
  };
29
45
  });
30
- // if matcher's factory can't instanciate the matchers, the expressions array
31
- // will be empty
46
+ // if matcher's factory can't instantiate the matchers, the expressions array will be empty
32
47
  if (expressions.length === 0) {
33
48
  // reset any data collected during parsing
34
49
  predicates = [];
@@ -9,25 +9,8 @@ export var ENGINE_COMBINER_AND = 0;
9
9
  export var ENGINE_COMBINER_IFELSEIF = 1;
10
10
  export var ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = 2;
11
11
  export var ENGINE_BUCKET = 3;
12
- export var ENGINE_MATCHER_ALL = 4;
13
- export var ENGINE_MATCHER_BETWEEN = 5;
14
- export var ENGINE_MATCHER_BOOLEAN = 6;
15
- export var ENGINE_MATCHER_CONTAINS_ALL = 7;
16
- export var ENGINE_MATCHER_CONTAINS_ANY = 8;
17
- export var ENGINE_MATCHER_CONTAINS_STRING = 9;
18
12
  export var ENGINE_MATCHER_DEPENDENCY = 10;
19
13
  export var ENGINE_MATCHER_DEPENDENCY_PRE = 11;
20
- export var ENGINE_MATCHER_EQUAL = 12;
21
- export var ENGINE_MATCHER_EQUAL_TO_SET = 13;
22
- export var ENGINE_MATCHER_ENDS_WITH = 14;
23
- export var ENGINE_MATCHER_GREATER = 15;
24
- export var ENGINE_MATCHER_LESS = 16;
25
- export var ENGINE_MATCHER_PART_OF = 17;
26
- export var ENGINE_MATCHER_SEGMENT = 18;
27
- export var ENGINE_MATCHER_STRING = 19;
28
- export var ENGINE_MATCHER_STRING_INVALID = 20;
29
- export var ENGINE_MATCHER_STARTS_WITH = 21;
30
- export var ENGINE_MATCHER_WHITELIST = 22;
31
14
  export var ENGINE_VALUE = 23;
32
15
  export var ENGINE_SANITIZE = 24;
33
16
  export var CLEANUP_REGISTERING = 25;
@@ -45,6 +28,7 @@ export var SYNC_TASK_START = 36;
45
28
  export var SYNC_TASK_EXECUTE = 37;
46
29
  export var SYNC_TASK_STOP = 38;
47
30
  export var SETTINGS_SPLITS_FILTER = 39;
31
+ export var ENGINE_MATCHER_RESULT = 40;
48
32
  export var CLIENT_READY_FROM_CACHE = 100;
49
33
  export var CLIENT_READY = 101;
50
34
  export var IMPRESSION = 102;
@@ -128,6 +112,7 @@ export var ERROR_NOT_BOOLEAN = 325;
128
112
  export var ERROR_MIN_CONFIG_PARAM = 326;
129
113
  export var ERROR_TOO_MANY_SETS = 327;
130
114
  export var ERROR_SETS_FILTER_EXCLUSIVE = 328;
115
+ export var ENGINE_MATCHER_ERROR = 329;
131
116
  // Log prefixes (a.k.a. tags or categories)
132
117
  export var LOG_PREFIX_SETTINGS = 'settings';
133
118
  export var LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
@@ -1,5 +1,5 @@
1
1
  import { objectAssign } from '../utils/lang/objectAssign';
2
- import { find } from '../utils/lang';
2
+ import { find, isObject } from '../utils/lang';
3
3
  import { _Map } from '../utils/lang/maps';
4
4
  export var LogLevels = {
5
5
  DEBUG: 'DEBUG',
@@ -24,7 +24,14 @@ export function _sprintf(format, args) {
24
24
  if (args === void 0) { args = []; }
25
25
  var i = 0;
26
26
  return format.replace(/%s/g, function () {
27
- return args[i++];
27
+ var arg = args[i++];
28
+ if (isObject(arg) || Array.isArray(arg)) {
29
+ try {
30
+ arg = JSON.stringify(arg);
31
+ }
32
+ catch (e) { /* empty */ }
33
+ }
34
+ return arg;
28
35
  });
29
36
  }
30
37
  var defaultOptions = {