@splitsoftware/splitio-commons 1.13.2-rc.1 → 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 (164) hide show
  1. package/CHANGES.txt +4 -3
  2. package/cjs/evaluator/Engine.js +5 -6
  3. package/cjs/evaluator/combiners/ifelseif.js +2 -3
  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 +23 -7
  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/services/splitApi.js +5 -5
  39. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  40. package/cjs/storages/pluggable/index.js +1 -1
  41. package/cjs/utils/Semver.js +103 -0
  42. package/cjs/utils/labels/index.js +1 -1
  43. package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  44. package/esm/evaluator/Engine.js +5 -5
  45. package/esm/evaluator/combiners/ifelseif.js +2 -2
  46. package/esm/evaluator/condition/index.js +2 -2
  47. package/esm/evaluator/index.js +4 -4
  48. package/esm/evaluator/matchers/all.js +1 -3
  49. package/esm/evaluator/matchers/between.js +1 -3
  50. package/esm/evaluator/matchers/boolean.js +1 -3
  51. package/esm/evaluator/matchers/cont_all.js +1 -3
  52. package/esm/evaluator/matchers/cont_any.js +1 -3
  53. package/esm/evaluator/matchers/cont_str.js +1 -3
  54. package/esm/evaluator/matchers/dependency.js +1 -1
  55. package/esm/evaluator/matchers/eq.js +1 -3
  56. package/esm/evaluator/matchers/eq_set.js +1 -3
  57. package/esm/evaluator/matchers/ew.js +1 -3
  58. package/esm/evaluator/matchers/gte.js +3 -5
  59. package/esm/evaluator/matchers/index.js +12 -2
  60. package/esm/evaluator/matchers/lte.js +3 -5
  61. package/esm/evaluator/matchers/matcherTypes.js +6 -1
  62. package/esm/evaluator/matchers/part_of.js +1 -3
  63. package/esm/evaluator/matchers/segment.js +1 -6
  64. package/esm/evaluator/matchers/semver_between.js +10 -0
  65. package/esm/evaluator/matchers/semver_eq.js +9 -0
  66. package/esm/evaluator/matchers/semver_gte.js +9 -0
  67. package/esm/evaluator/matchers/semver_inlist.js +13 -0
  68. package/esm/evaluator/matchers/semver_lte.js +9 -0
  69. package/esm/evaluator/matchers/string.js +3 -12
  70. package/esm/evaluator/matchers/sw.js +1 -3
  71. package/esm/evaluator/matchers/whitelist.js +4 -5
  72. package/esm/evaluator/matchersTransform/index.js +21 -16
  73. package/esm/evaluator/matchersTransform/whitelist.js +2 -3
  74. package/esm/evaluator/parser/index.js +23 -7
  75. package/esm/logger/constants.js +2 -17
  76. package/esm/logger/index.js +9 -2
  77. package/esm/logger/messages/debug.js +5 -21
  78. package/esm/logger/messages/error.js +2 -1
  79. package/esm/logger/messages/warn.js +1 -1
  80. package/esm/services/splitApi.js +5 -5
  81. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  82. package/esm/storages/pluggable/index.js +1 -1
  83. package/esm/utils/Semver.js +100 -0
  84. package/esm/utils/labels/index.js +1 -1
  85. package/esm/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  86. package/package.json +1 -2
  87. package/src/dtos/types.ts +34 -1
  88. package/src/evaluator/Engine.ts +5 -6
  89. package/src/evaluator/combiners/ifelseif.ts +2 -2
  90. package/src/evaluator/condition/index.ts +2 -2
  91. package/src/evaluator/index.ts +4 -4
  92. package/src/evaluator/matchers/all.ts +1 -5
  93. package/src/evaluator/matchers/between.ts +3 -7
  94. package/src/evaluator/matchers/boolean.ts +2 -6
  95. package/src/evaluator/matchers/cont_all.ts +1 -5
  96. package/src/evaluator/matchers/cont_any.ts +1 -5
  97. package/src/evaluator/matchers/cont_str.ts +2 -6
  98. package/src/evaluator/matchers/dependency.ts +1 -1
  99. package/src/evaluator/matchers/eq.ts +2 -6
  100. package/src/evaluator/matchers/eq_set.ts +1 -5
  101. package/src/evaluator/matchers/ew.ts +2 -6
  102. package/src/evaluator/matchers/gte.ts +3 -7
  103. package/src/evaluator/matchers/index.ts +29 -19
  104. package/src/evaluator/matchers/lte.ts +3 -7
  105. package/src/evaluator/matchers/matcherTypes.ts +6 -1
  106. package/src/evaluator/matchers/part_of.ts +1 -5
  107. package/src/evaluator/matchers/segment.ts +1 -8
  108. package/src/evaluator/matchers/semver_between.ts +15 -0
  109. package/src/evaluator/matchers/semver_eq.ts +13 -0
  110. package/src/evaluator/matchers/semver_gte.ts +13 -0
  111. package/src/evaluator/matchers/semver_inlist.ts +17 -0
  112. package/src/evaluator/matchers/semver_lte.ts +13 -0
  113. package/src/evaluator/matchers/string.ts +3 -16
  114. package/src/evaluator/matchers/sw.ts +2 -6
  115. package/src/evaluator/matchers/whitelist.ts +5 -7
  116. package/src/evaluator/matchersTransform/index.ts +31 -23
  117. package/src/evaluator/matchersTransform/whitelist.ts +4 -5
  118. package/src/evaluator/parser/index.ts +24 -8
  119. package/src/evaluator/types.ts +3 -3
  120. package/src/logger/constants.ts +2 -17
  121. package/src/logger/index.ts +8 -2
  122. package/src/logger/messages/debug.ts +5 -21
  123. package/src/logger/messages/error.ts +2 -1
  124. package/src/logger/messages/warn.ts +1 -1
  125. package/src/services/splitApi.ts +4 -5
  126. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +1 -1
  127. package/src/storages/pluggable/index.ts +1 -1
  128. package/src/utils/Semver.ts +111 -0
  129. package/src/utils/labels/index.ts +1 -1
  130. package/src/utils/settingsValidation/logger/pluggableLogger.ts +1 -1
  131. package/types/dtos/types.d.ts +26 -1
  132. package/types/evaluator/matchers/all.d.ts +1 -2
  133. package/types/evaluator/matchers/between.d.ts +1 -2
  134. package/types/evaluator/matchers/boolean.d.ts +1 -2
  135. package/types/evaluator/matchers/cont_all.d.ts +1 -2
  136. package/types/evaluator/matchers/cont_any.d.ts +1 -2
  137. package/types/evaluator/matchers/cont_str.d.ts +1 -2
  138. package/types/evaluator/matchers/dependency.d.ts +1 -1
  139. package/types/evaluator/matchers/eq.d.ts +1 -2
  140. package/types/evaluator/matchers/eq_set.d.ts +1 -2
  141. package/types/evaluator/matchers/ew.d.ts +1 -2
  142. package/types/evaluator/matchers/gte.d.ts +1 -2
  143. package/types/evaluator/matchers/lte.d.ts +1 -2
  144. package/types/evaluator/matchers/part_of.d.ts +1 -2
  145. package/types/evaluator/matchers/segment.d.ts +1 -2
  146. package/types/evaluator/matchers/sember_inlist.d.ts +3 -0
  147. package/types/evaluator/matchers/semver_between.d.ts +2 -0
  148. package/types/evaluator/matchers/semver_eq.d.ts +1 -0
  149. package/types/evaluator/matchers/semver_gte.d.ts +1 -0
  150. package/types/evaluator/matchers/semver_inlist.d.ts +1 -0
  151. package/types/evaluator/matchers/semver_lte.d.ts +1 -0
  152. package/types/evaluator/matchers/string.d.ts +1 -2
  153. package/types/evaluator/matchers/sw.d.ts +1 -2
  154. package/types/evaluator/matchers/whitelist.d.ts +1 -3
  155. package/types/evaluator/matchersTransform/set.d.ts +2 -2
  156. package/types/evaluator/matchersTransform/string.d.ts +7 -0
  157. package/types/evaluator/matchersTransform/whitelist.d.ts +3 -3
  158. package/types/evaluator/types.d.ts +3 -3
  159. package/types/logger/constants.d.ts +2 -17
  160. package/types/utils/labels/index.d.ts +1 -1
  161. package/types/utils/semVer.d.ts +15 -0
  162. package/cjs/evaluator/matchersTransform/set.js +0 -10
  163. package/esm/evaluator/matchersTransform/set.js +0 -6
  164. package/src/evaluator/matchersTransform/set.ts +0 -8
@@ -5,7 +5,6 @@ var lang_1 = require("../../utils/lang");
5
5
  var matcherTypes_1 = require("../matchers/matcherTypes");
6
6
  var segment_1 = require("./segment");
7
7
  var whitelist_1 = require("./whitelist");
8
- var set_1 = require("./set");
9
8
  var unaryNumeric_1 = require("./unaryNumeric");
10
9
  var convertions_1 = require("../convertions");
11
10
  /**
@@ -13,37 +12,34 @@ var convertions_1 = require("../convertions");
13
12
  */
14
13
  function matchersTransform(matchers) {
15
14
  var parsedMatchers = matchers.map(function (matcher) {
16
- 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;
15
+ 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;
17
16
  var attribute = keySelector && keySelector.attribute;
18
17
  var type = (0, matcherTypes_1.matcherTypesMapper)(matcherType);
19
18
  // As default input data type we use string (even for ALL_KEYS)
20
19
  var dataType = matcherTypes_1.matcherDataTypes.STRING;
21
20
  var value = undefined;
22
21
  if (type === matcherTypes_1.matcherTypes.IN_SEGMENT) {
23
- value = (0, segment_1.segmentTransform)(segmentObject);
24
- }
25
- else if (type === matcherTypes_1.matcherTypes.WHITELIST) {
26
- value = (0, whitelist_1.whitelistTransform)(whitelistObject);
22
+ value = (0, segment_1.segmentTransform)(userDefinedSegmentMatcherData);
27
23
  }
28
24
  else if (type === matcherTypes_1.matcherTypes.EQUAL_TO) {
29
- value = (0, unaryNumeric_1.numericTransform)(unaryNumericObject);
25
+ value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
30
26
  dataType = matcherTypes_1.matcherDataTypes.NUMBER;
31
- if (unaryNumericObject.dataType === 'DATETIME') {
27
+ if (unaryNumericMatcherData.dataType === 'DATETIME') {
32
28
  value = (0, convertions_1.zeroSinceHH)(value);
33
29
  dataType = matcherTypes_1.matcherDataTypes.DATETIME;
34
30
  }
35
31
  }
36
32
  else if (type === matcherTypes_1.matcherTypes.GREATER_THAN_OR_EQUAL_TO ||
37
33
  type === matcherTypes_1.matcherTypes.LESS_THAN_OR_EQUAL_TO) {
38
- value = (0, unaryNumeric_1.numericTransform)(unaryNumericObject);
34
+ value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
39
35
  dataType = matcherTypes_1.matcherDataTypes.NUMBER;
40
- if (unaryNumericObject.dataType === 'DATETIME') {
36
+ if (unaryNumericMatcherData.dataType === 'DATETIME') {
41
37
  value = (0, convertions_1.zeroSinceSS)(value);
42
38
  dataType = matcherTypes_1.matcherDataTypes.DATETIME;
43
39
  }
44
40
  }
45
41
  else if (type === matcherTypes_1.matcherTypes.BETWEEN) {
46
- value = betweenObject;
42
+ value = betweenMatcherData;
47
43
  dataType = matcherTypes_1.matcherDataTypes.NUMBER;
48
44
  if (value.dataType === 'DATETIME') {
49
45
  value.start = (0, convertions_1.zeroSinceSS)(value.start);
@@ -51,33 +47,42 @@ function matchersTransform(matchers) {
51
47
  dataType = matcherTypes_1.matcherDataTypes.DATETIME;
52
48
  }
53
49
  }
50
+ else if (type === matcherTypes_1.matcherTypes.BETWEEN_SEMVER) {
51
+ value = betweenStringMatcherData;
52
+ }
54
53
  else if (type === matcherTypes_1.matcherTypes.EQUAL_TO_SET ||
55
54
  type === matcherTypes_1.matcherTypes.CONTAINS_ANY_OF_SET ||
56
55
  type === matcherTypes_1.matcherTypes.CONTAINS_ALL_OF_SET ||
57
56
  type === matcherTypes_1.matcherTypes.PART_OF_SET) {
58
- value = (0, set_1.setTransform)(whitelistObject);
57
+ value = (0, whitelist_1.whitelistTransform)(whitelistMatcherData);
59
58
  dataType = matcherTypes_1.matcherDataTypes.SET;
60
59
  }
61
- else if (type === matcherTypes_1.matcherTypes.STARTS_WITH ||
60
+ else if (type === matcherTypes_1.matcherTypes.WHITELIST ||
61
+ type === matcherTypes_1.matcherTypes.IN_LIST_SEMVER ||
62
+ type === matcherTypes_1.matcherTypes.STARTS_WITH ||
62
63
  type === matcherTypes_1.matcherTypes.ENDS_WITH ||
63
64
  type === matcherTypes_1.matcherTypes.CONTAINS_STRING) {
64
- value = (0, set_1.setTransform)(whitelistObject);
65
+ value = (0, whitelist_1.whitelistTransform)(whitelistMatcherData);
65
66
  }
66
67
  else if (type === matcherTypes_1.matcherTypes.IN_SPLIT_TREATMENT) {
67
- value = dependencyObject;
68
+ value = dependencyMatcherData;
68
69
  dataType = matcherTypes_1.matcherDataTypes.NOT_SPECIFIED;
69
70
  }
70
71
  else if (type === matcherTypes_1.matcherTypes.EQUAL_TO_BOOLEAN) {
71
72
  dataType = matcherTypes_1.matcherDataTypes.BOOLEAN;
72
73
  value = booleanMatcherData;
73
74
  }
74
- else if (type === matcherTypes_1.matcherTypes.MATCHES_STRING) {
75
+ else if (type === matcherTypes_1.matcherTypes.MATCHES_STRING ||
76
+ type === matcherTypes_1.matcherTypes.EQUAL_TO_SEMVER ||
77
+ type === matcherTypes_1.matcherTypes.GREATER_THAN_OR_EQUAL_TO_SEMVER ||
78
+ type === matcherTypes_1.matcherTypes.LESS_THAN_OR_EQUAL_TO_SEMVER) {
75
79
  value = stringMatcherData;
76
80
  }
77
81
  return {
78
82
  attribute: attribute,
79
83
  negate: negate,
80
84
  type: type,
85
+ name: matcherType,
81
86
  value: value,
82
87
  dataType: dataType // runtime input data type
83
88
  };
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.whitelistTransform = void 0;
4
- var sets_1 = require("../../utils/lang/sets");
5
4
  /**
6
- * Extract whitelist as a set. Used by 'WHITELIST' matcher.
5
+ * Extract whitelist array.
7
6
  */
8
7
  function whitelistTransform(whitelistObject) {
9
- return new sets_1._Set(whitelistObject.whitelist);
8
+ return whitelistObject && whitelistObject.whitelist;
10
9
  }
11
10
  exports.whitelistTransform = whitelistTransform;
@@ -9,6 +9,7 @@ var condition_1 = require("../condition");
9
9
  var ifelseif_1 = require("../combiners/ifelseif");
10
10
  var and_1 = require("../combiners/and");
11
11
  var thenable_1 = require("../../utils/promise/thenable");
12
+ var constants_1 = require("../../logger/constants");
12
13
  function parser(log, conditions, storage) {
13
14
  var predicates = [];
14
15
  for (var i = 0; i < conditions.length; i++) {
@@ -17,17 +18,32 @@ function parser(log, conditions, storage) {
17
18
  var matchers = (0, matchersTransform_1.matchersTransform)(matcherGroup.matchers);
18
19
  // create a set of pure functions from the matcher's dto
19
20
  var expressions = matchers.map(function (matcherDto) {
20
- var matcher = (0, matchers_1.matcherFactory)(log, matcherDto, storage);
21
+ var matcher;
22
+ try {
23
+ matcher = (0, matchers_1.matcherFactory)(log, matcherDto, storage);
24
+ }
25
+ catch (error) {
26
+ log.error(constants_1.ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
27
+ }
21
28
  // Evaluator function.
22
29
  return function (key, attributes, splitEvaluator) {
23
30
  var value = (0, value_1.sanitizeValue)(log, key, matcherDto, attributes);
24
- var result = value !== undefined && matcher ? matcher(value, splitEvaluator) : false;
25
- if ((0, thenable_1.thenable)(result)) {
26
- // @ts-ignore
27
- return result.then(function (res) { return Boolean(res ^ matcherDto.negate); });
31
+ var result = false;
32
+ if (value !== undefined && matcher) {
33
+ try {
34
+ result = matcher(value, splitEvaluator);
35
+ }
36
+ catch (error) {
37
+ log.error(constants_1.ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
38
+ }
28
39
  }
29
- // @ts-ignore
30
- return Boolean(result ^ matcherDto.negate);
40
+ function handleResult(result) {
41
+ log.debug(constants_1.ENGINE_MATCHER_RESULT, [matcherDto.name, result, matcherDto.value, value]); // @ts-ignore
42
+ return Boolean(result ^ matcherDto.negate);
43
+ }
44
+ return (0, thenable_1.thenable)(result) ?
45
+ result.then(handleResult) :
46
+ handleResult(result);
31
47
  };
32
48
  });
33
49
  // if matcher's factory can't instantiate the matchers, the expressions array will be empty
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.POLLING_SMART_PAUSING = exports.NEW_FACTORY = exports.NEW_SHARED_CLIENT = exports.IMPRESSION_QUEUEING = exports.IMPRESSION = exports.CLIENT_READY = exports.CLIENT_READY_FROM_CACHE = exports.SETTINGS_SPLITS_FILTER = exports.SYNC_TASK_STOP = exports.SYNC_TASK_EXECUTE = exports.SYNC_TASK_START = exports.STREAMING_NEW_MESSAGE = exports.SYNC_SPLITS_SEGMENTS = exports.SYNC_SPLITS_REMOVED = exports.SYNC_SPLITS_NEW = exports.SYNC_SPLITS_FETCH = exports.SYNC_OFFLINE_DATA = exports.RETRIEVE_MANAGER = exports.RETRIEVE_CLIENT_EXISTING = exports.RETRIEVE_CLIENT_DEFAULT = exports.CLEANUP_DEREGISTERING = exports.CLEANUP_REGISTERING = exports.ENGINE_SANITIZE = exports.ENGINE_VALUE = exports.ENGINE_MATCHER_WHITELIST = exports.ENGINE_MATCHER_STARTS_WITH = exports.ENGINE_MATCHER_STRING_INVALID = exports.ENGINE_MATCHER_STRING = exports.ENGINE_MATCHER_SEGMENT = exports.ENGINE_MATCHER_PART_OF = exports.ENGINE_MATCHER_LESS = exports.ENGINE_MATCHER_GREATER = exports.ENGINE_MATCHER_ENDS_WITH = exports.ENGINE_MATCHER_EQUAL_TO_SET = exports.ENGINE_MATCHER_EQUAL = exports.ENGINE_MATCHER_DEPENDENCY_PRE = exports.ENGINE_MATCHER_DEPENDENCY = exports.ENGINE_MATCHER_CONTAINS_STRING = exports.ENGINE_MATCHER_CONTAINS_ANY = exports.ENGINE_MATCHER_CONTAINS_ALL = exports.ENGINE_MATCHER_BOOLEAN = exports.ENGINE_MATCHER_BETWEEN = exports.ENGINE_MATCHER_ALL = exports.ENGINE_BUCKET = exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = exports.ENGINE_COMBINER_IFELSEIF = exports.ENGINE_COMBINER_AND = void 0;
4
- exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.WARN_FLAGSET_WITHOUT_FLAGS = exports.WARN_FLAGSET_NOT_CONFIGURED = exports.WARN_LOWERCASE_FLAGSET = exports.WARN_INVALID_FLAGSET = exports.STREAMING_PARSING_SPLIT_UPDATE = exports.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = exports.WARN_SDK_KEY = exports.WARN_SPLITS_FILTER_EMPTY = exports.WARN_SPLITS_FILTER_INVALID = exports.WARN_SPLITS_FILTER_IGNORED = exports.WARN_INTEGRATION_INVALID = exports.WARN_NOT_EXISTENT_TT = exports.WARN_LOWERCASE_TRAFFIC_TYPE = exports.WARN_NOT_EXISTENT_SPLIT = exports.WARN_TRIMMING = exports.WARN_CONVERTING = exports.WARN_TRIMMING_PROPERTIES = exports.WARN_SETTING_NULL = exports.SUBMITTERS_PUSH_RETRY = exports.SUBMITTERS_PUSH_FAILS = exports.STREAMING_FALLBACK = exports.STREAMING_PARSING_MESSAGE_FAILS = exports.STREAMING_PARSING_ERROR_FAILS = exports.SYNC_SPLITS_FETCH_FAILS = exports.SYNC_MYSEGMENTS_FETCH_RETRY = exports.CLIENT_NOT_READY = exports.CLIENT_NO_LISTENER = exports.ENGINE_VALUE_NO_ATTRIBUTES = exports.ENGINE_VALUE_INVALID = exports.USER_CONSENT_INITIAL = exports.USER_CONSENT_NOT_UPDATED = exports.USER_CONSENT_UPDATED = exports.IMPRESSIONS_TRACKER_SUCCESS = exports.EVENTS_TRACKER_SUCCESS = exports.SYNC_STOP_POLLING = exports.SYNC_CONTINUE_POLLING = exports.SYNC_START_POLLING = exports.SUBMITTERS_PUSH = exports.SUBMITTERS_PUSH_FULL_QUEUE = exports.STREAMING_DISCONNECTING = exports.STREAMING_DISABLED = exports.STREAMING_CONNECTING = exports.STREAMING_RECONNECT = exports.STREAMING_REFRESH_TOKEN = void 0;
5
- exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_UNIQUE_KEYS_TRACKER = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ERROR_SETS_FILTER_EXCLUSIVE = exports.ERROR_TOO_MANY_SETS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = exports.ERROR_HTTP = exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = void 0;
3
+ exports.ENGINE_VALUE_INVALID = exports.USER_CONSENT_INITIAL = exports.USER_CONSENT_NOT_UPDATED = exports.USER_CONSENT_UPDATED = exports.IMPRESSIONS_TRACKER_SUCCESS = exports.EVENTS_TRACKER_SUCCESS = exports.SYNC_STOP_POLLING = exports.SYNC_CONTINUE_POLLING = exports.SYNC_START_POLLING = exports.SUBMITTERS_PUSH = exports.SUBMITTERS_PUSH_FULL_QUEUE = exports.STREAMING_DISCONNECTING = exports.STREAMING_DISABLED = exports.STREAMING_CONNECTING = exports.STREAMING_RECONNECT = exports.STREAMING_REFRESH_TOKEN = exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.POLLING_SMART_PAUSING = exports.NEW_FACTORY = exports.NEW_SHARED_CLIENT = exports.IMPRESSION_QUEUEING = exports.IMPRESSION = exports.CLIENT_READY = exports.CLIENT_READY_FROM_CACHE = exports.ENGINE_MATCHER_RESULT = exports.SETTINGS_SPLITS_FILTER = exports.SYNC_TASK_STOP = exports.SYNC_TASK_EXECUTE = exports.SYNC_TASK_START = exports.STREAMING_NEW_MESSAGE = exports.SYNC_SPLITS_SEGMENTS = exports.SYNC_SPLITS_REMOVED = exports.SYNC_SPLITS_NEW = exports.SYNC_SPLITS_FETCH = exports.SYNC_OFFLINE_DATA = exports.RETRIEVE_MANAGER = exports.RETRIEVE_CLIENT_EXISTING = exports.RETRIEVE_CLIENT_DEFAULT = exports.CLEANUP_DEREGISTERING = exports.CLEANUP_REGISTERING = exports.ENGINE_SANITIZE = exports.ENGINE_VALUE = exports.ENGINE_MATCHER_DEPENDENCY_PRE = exports.ENGINE_MATCHER_DEPENDENCY = exports.ENGINE_BUCKET = exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = exports.ENGINE_COMBINER_IFELSEIF = exports.ENGINE_COMBINER_AND = void 0;
4
+ exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.WARN_FLAGSET_WITHOUT_FLAGS = exports.WARN_FLAGSET_NOT_CONFIGURED = exports.WARN_LOWERCASE_FLAGSET = exports.WARN_INVALID_FLAGSET = exports.STREAMING_PARSING_SPLIT_UPDATE = exports.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = exports.WARN_SDK_KEY = exports.WARN_SPLITS_FILTER_EMPTY = exports.WARN_SPLITS_FILTER_INVALID = exports.WARN_SPLITS_FILTER_IGNORED = exports.WARN_INTEGRATION_INVALID = exports.WARN_NOT_EXISTENT_TT = exports.WARN_LOWERCASE_TRAFFIC_TYPE = exports.WARN_NOT_EXISTENT_SPLIT = exports.WARN_TRIMMING = exports.WARN_CONVERTING = exports.WARN_TRIMMING_PROPERTIES = exports.WARN_SETTING_NULL = exports.SUBMITTERS_PUSH_RETRY = exports.SUBMITTERS_PUSH_FAILS = exports.STREAMING_FALLBACK = exports.STREAMING_PARSING_MESSAGE_FAILS = exports.STREAMING_PARSING_ERROR_FAILS = exports.SYNC_SPLITS_FETCH_FAILS = exports.SYNC_MYSEGMENTS_FETCH_RETRY = exports.CLIENT_NOT_READY = exports.CLIENT_NO_LISTENER = exports.ENGINE_VALUE_NO_ATTRIBUTES = void 0;
5
+ exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_UNIQUE_KEYS_TRACKER = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ENGINE_MATCHER_ERROR = exports.ERROR_SETS_FILTER_EXCLUSIVE = exports.ERROR_TOO_MANY_SETS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = exports.ERROR_HTTP = void 0;
6
6
  /**
7
7
  * Message codes used to trim string log messages from commons and client-side API modules,
8
8
  * in order to reduce the minimal SDK size for Browser and eventually other client-side environments.
@@ -14,25 +14,8 @@ exports.ENGINE_COMBINER_AND = 0;
14
14
  exports.ENGINE_COMBINER_IFELSEIF = 1;
15
15
  exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = 2;
16
16
  exports.ENGINE_BUCKET = 3;
17
- exports.ENGINE_MATCHER_ALL = 4;
18
- exports.ENGINE_MATCHER_BETWEEN = 5;
19
- exports.ENGINE_MATCHER_BOOLEAN = 6;
20
- exports.ENGINE_MATCHER_CONTAINS_ALL = 7;
21
- exports.ENGINE_MATCHER_CONTAINS_ANY = 8;
22
- exports.ENGINE_MATCHER_CONTAINS_STRING = 9;
23
17
  exports.ENGINE_MATCHER_DEPENDENCY = 10;
24
18
  exports.ENGINE_MATCHER_DEPENDENCY_PRE = 11;
25
- exports.ENGINE_MATCHER_EQUAL = 12;
26
- exports.ENGINE_MATCHER_EQUAL_TO_SET = 13;
27
- exports.ENGINE_MATCHER_ENDS_WITH = 14;
28
- exports.ENGINE_MATCHER_GREATER = 15;
29
- exports.ENGINE_MATCHER_LESS = 16;
30
- exports.ENGINE_MATCHER_PART_OF = 17;
31
- exports.ENGINE_MATCHER_SEGMENT = 18;
32
- exports.ENGINE_MATCHER_STRING = 19;
33
- exports.ENGINE_MATCHER_STRING_INVALID = 20;
34
- exports.ENGINE_MATCHER_STARTS_WITH = 21;
35
- exports.ENGINE_MATCHER_WHITELIST = 22;
36
19
  exports.ENGINE_VALUE = 23;
37
20
  exports.ENGINE_SANITIZE = 24;
38
21
  exports.CLEANUP_REGISTERING = 25;
@@ -50,6 +33,7 @@ exports.SYNC_TASK_START = 36;
50
33
  exports.SYNC_TASK_EXECUTE = 37;
51
34
  exports.SYNC_TASK_STOP = 38;
52
35
  exports.SETTINGS_SPLITS_FILTER = 39;
36
+ exports.ENGINE_MATCHER_RESULT = 40;
53
37
  exports.CLIENT_READY_FROM_CACHE = 100;
54
38
  exports.CLIENT_READY = 101;
55
39
  exports.IMPRESSION = 102;
@@ -133,6 +117,7 @@ exports.ERROR_NOT_BOOLEAN = 325;
133
117
  exports.ERROR_MIN_CONFIG_PARAM = 326;
134
118
  exports.ERROR_TOO_MANY_SETS = 327;
135
119
  exports.ERROR_SETS_FILTER_EXCLUSIVE = 328;
120
+ exports.ENGINE_MATCHER_ERROR = 329;
136
121
  // Log prefixes (a.k.a. tags or categories)
137
122
  exports.LOG_PREFIX_SETTINGS = 'settings';
138
123
  exports.LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
@@ -28,7 +28,14 @@ function _sprintf(format, args) {
28
28
  if (args === void 0) { args = []; }
29
29
  var i = 0;
30
30
  return format.replace(/%s/g, function () {
31
- return args[i++];
31
+ var arg = args[i++];
32
+ if ((0, lang_1.isObject)(arg) || Array.isArray(arg)) {
33
+ try {
34
+ arg = JSON.stringify(arg);
35
+ }
36
+ catch (e) { /* empty */ }
37
+ }
38
+ return arg;
32
39
  });
33
40
  }
34
41
  exports._sprintf = _sprintf;
@@ -10,27 +10,11 @@ exports.codesDebug = info_1.codesInfo.concat([
10
10
  [c.ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Treatment found: %s'],
11
11
  [c.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT, c.LOG_PREFIX_ENGINE_COMBINER + 'All predicates evaluated, no treatment found.'],
12
12
  [c.ENGINE_BUCKET, c.LOG_PREFIX_ENGINE + ': using algo "murmur" bucket %s for key %s using seed %s - treatment %s'],
13
- [c.ENGINE_MATCHER_ALL, c.LOG_PREFIX_ENGINE_MATCHER + '[allMatcher] is always true'],
14
- [c.ENGINE_MATCHER_BETWEEN, c.LOG_PREFIX_ENGINE_MATCHER + '[betweenMatcher] is %s between %s and %s? %s'],
15
- [c.ENGINE_MATCHER_BOOLEAN, c.LOG_PREFIX_ENGINE_MATCHER + '[booleanMatcher] %s === %s'],
16
- [c.ENGINE_MATCHER_CONTAINS_ALL, c.LOG_PREFIX_ENGINE_MATCHER + '[containsAllMatcher] %s contains all elements of %s? %s'],
17
- [c.ENGINE_MATCHER_CONTAINS_ANY, c.LOG_PREFIX_ENGINE_MATCHER + '[containsAnyMatcher] %s contains at least an element of %s? %s'],
18
- [c.ENGINE_MATCHER_CONTAINS_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[containsStringMatcher] %s contains %s? %s'],
19
- [c.ENGINE_MATCHER_DEPENDENCY, c.LOG_PREFIX_ENGINE_MATCHER + '[dependencyMatcher] parent feature flag "%s" evaluated to "%s" with label "%s". %s evaluated treatment is part of [%s] ? %s.'],
20
- [c.ENGINE_MATCHER_DEPENDENCY_PRE, c.LOG_PREFIX_ENGINE_MATCHER + '[dependencyMatcher] will evaluate parent feature flag: "%s" with key: %s %s'],
21
- [c.ENGINE_MATCHER_EQUAL, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToMatcher] is %s equal to %s? %s'],
22
- [c.ENGINE_MATCHER_EQUAL_TO_SET, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToSetMatcher] is %s equal to set %s? %s'],
23
- [c.ENGINE_MATCHER_ENDS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[endsWithMatcher] %s ends with %s? %s'],
24
- [c.ENGINE_MATCHER_GREATER, c.LOG_PREFIX_ENGINE_MATCHER + '[greaterThanEqualMatcher] is %s greater than %s? %s'],
25
- [c.ENGINE_MATCHER_LESS, c.LOG_PREFIX_ENGINE_MATCHER + '[lessThanEqualMatcher] is %s less than %s? %s'],
26
- [c.ENGINE_MATCHER_PART_OF, c.LOG_PREFIX_ENGINE_MATCHER + '[partOfMatcher] %s is part of %s? %s'],
27
- [c.ENGINE_MATCHER_SEGMENT, c.LOG_PREFIX_ENGINE_MATCHER + '[segmentMatcher] evaluated %s / %s => %s'],
28
- [c.ENGINE_MATCHER_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] does %s matches with %s? %s'],
29
- [c.ENGINE_MATCHER_STRING_INVALID, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] %s is an invalid regex'],
30
- [c.ENGINE_MATCHER_STARTS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[startsWithMatcher] %s starts with %s? %s'],
31
- [c.ENGINE_MATCHER_WHITELIST, c.LOG_PREFIX_ENGINE_MATCHER + '[whitelistMatcher] evaluated %s in [%s] => %s'],
32
- [c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute [%s], [%s] will be used for matching.'],
33
- [c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize [%s] which should be of type [%s]. Sanitized and processed value => [%s]'],
13
+ [c.ENGINE_MATCHER_DEPENDENCY, c.LOG_PREFIX_ENGINE_MATCHER + '[IN_SPLIT_TREATMENT] parent feature flag "%s" evaluated to "%s" with label "%s". %s evaluated treatment is part of %s ? %s.'],
14
+ [c.ENGINE_MATCHER_DEPENDENCY_PRE, c.LOG_PREFIX_ENGINE_MATCHER + '[IN_SPLIT_TREATMENT] will evaluate parent feature flag: "%s" with key: %s %s'],
15
+ [c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute `%s`. %s will be used for matching.'],
16
+ [c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize %s which should be of type %s. Sanitized and processed value => %s'],
17
+ [c.ENGINE_MATCHER_RESULT, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] Result: %s. Rule value: %s. Evaluation value: %s'],
34
18
  // SDK
35
19
  [c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'],
36
20
  [c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'],
@@ -5,7 +5,8 @@ var tslib_1 = require("tslib");
5
5
  var c = (0, tslib_1.__importStar)(require("../constants"));
6
6
  exports.codesError = [
7
7
  // evaluator
8
- [c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported matcher type found'],
8
+ [c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported targeting rule type found'],
9
+ [c.ENGINE_MATCHER_ERROR, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] %s'],
9
10
  // SDK
10
11
  [c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'],
11
12
  [c.ERROR_CLIENT_CANNOT_GET_READY, 'The SDK will not get ready. Reason: %s'],
@@ -7,7 +7,7 @@ var error_1 = require("./error");
7
7
  exports.codesWarn = error_1.codesError.concat([
8
8
  // evaluator
9
9
  [c.ENGINE_VALUE_INVALID, c.LOG_PREFIX_ENGINE_VALUE + 'Value %s doesn\'t match with expected type.'],
10
- [c.ENGINE_VALUE_NO_ATTRIBUTES, c.LOG_PREFIX_ENGINE_VALUE + 'Defined attribute [%s], no attributes received.'],
10
+ [c.ENGINE_VALUE_NO_ATTRIBUTES, c.LOG_PREFIX_ENGINE_VALUE + 'Defined attribute `%s`. No attributes received.'],
11
11
  // synchronizer
12
12
  [c.SYNC_MYSEGMENTS_FETCH_RETRY, c.LOG_PREFIX_SYNC_MYSEGMENTS + 'Retrying download of segments #%s. Reason: %s'],
13
13
  [c.SYNC_SPLITS_FETCH_FAILS, c.LOG_PREFIX_SYNC_SPLITS + 'Error while doing fetch of feature flags. %s'],
@@ -32,16 +32,16 @@ function splitApiFactory(settings, platform, telemetryTracker) {
32
32
  return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
33
33
  },
34
34
  fetchAuth: function (userMatchingKeys) {
35
- var url = urls.auth + "/v2/auth";
36
- if (userMatchingKeys) { // accounting the possibility that `userMatchingKeys` is undefined (server-side API)
35
+ var url = urls.auth + "/v2/auth?s=" + constants_1.FLAGS_SPEC;
36
+ if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
37
37
  var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
38
- if (queryParams) // accounting the possibility that `userKeys` and thus `queryParams` are empty
39
- url += '?' + queryParams;
38
+ if (queryParams)
39
+ url += '&' + queryParams;
40
40
  }
41
41
  return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN));
42
42
  },
43
43
  fetchSplitChanges: function (since, noCache, till) {
44
- var url = urls.sdk + "/splitChanges?s=" + constants_1.FLAGS_SPEC + "&since=" + since + (till ? '&till=' + till : '') + (filterQueryString || '');
44
+ var url = urls.sdk + "/splitChanges?s=" + constants_1.FLAGS_SPEC + "&since=" + since + (filterQueryString || '') + (till ? '&till=' + till : '');
45
45
  return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS))
46
46
  .catch(function (err) {
47
47
  if (err.statusCode === 414)
@@ -126,7 +126,7 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
126
126
  SplitsCacheInLocal.prototype.setChangeNumber = function (changeNumber) {
127
127
  // when using a new split query, we must update it at the store
128
128
  if (this.updateNewFilter) {
129
- this.log.info(constants_1.LOG_PREFIX + 'SDK key or feature flag filter criteria was modified. Updating cache');
129
+ this.log.info(constants_1.LOG_PREFIX + 'SDK key, flags filter criteria or flags spec version was modified. Updating cache');
130
130
  var storageHashKey = this.keys.buildHashKey();
131
131
  try {
132
132
  localStorage.setItem(storageHashKey, this.storageHash);
@@ -82,7 +82,7 @@ function PluggableStorage(options) {
82
82
  return wrapper.get(keys.buildHashKey()).then(function (hash) {
83
83
  var currentHash = (0, KeyBuilder_1.getStorageHash)(settings);
84
84
  if (hash !== currentHash) {
85
- log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key or feature flag filter criteria was modified). Clearing cache');
85
+ log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key, flags filter criteria or flags spec version was modified). Clearing cache');
86
86
  return wrapper.getKeysByPrefix(keys.prefix + ".").then(function (storageKeys) {
87
87
  return Promise.all(storageKeys.map(function (storageKey) { return wrapper.del(storageKey); }));
88
88
  }).then(function () { return wrapper.set(keys.buildHashKey(), currentHash); });
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Semver = void 0;
4
+ var lang_1 = require("../utils/lang");
5
+ var NUMERIC_IDENTIFIER_REGEX = /^[0-9]+$/;
6
+ var METADATA_DELIMITER = '+';
7
+ var PRERELEASE_DELIMITER = '-';
8
+ var VALUE_DELIMITER = '.';
9
+ /**
10
+ * Compares two strings. If both strings are numeric identifiers, they are compared numerically. Otherwise, they are compared lexicographically.
11
+ * This could be implemented using `a.localeCompare(b, undefined, { numeric: true })` but locale options are not broadly supported.
12
+ */
13
+ function compareStrings(a, b) {
14
+ if (NUMERIC_IDENTIFIER_REGEX.test(a) && NUMERIC_IDENTIFIER_REGEX.test(b)) {
15
+ var result = a.length - b.length;
16
+ if (result !== 0) {
17
+ return result;
18
+ }
19
+ }
20
+ return a < b ? -1 : a > b ? 1 : 0;
21
+ }
22
+ // Sanitizes a numeric identifier by removing leading zeros
23
+ function sanitizeNumericIdentifier(value) {
24
+ return value.replace(/^0+(?=\d)/, '');
25
+ }
26
+ function throwError(version) {
27
+ throw new Error('Unable to convert to Semver, incorrect format: ' + version);
28
+ }
29
+ var Semver = /** @class */ (function () {
30
+ function Semver(version) {
31
+ if (!(0, lang_1.isString)(version))
32
+ throwError(version);
33
+ // Separate metadata if exists
34
+ var index = version.indexOf(METADATA_DELIMITER);
35
+ var _a = index === -1 ? [version] : [version.slice(0, index), version.slice(index + 1)], vWithoutMetadata = _a[0], metadata = _a[1];
36
+ if (metadata === '')
37
+ throwError(version);
38
+ // Set pre-release versions if exists
39
+ index = vWithoutMetadata.indexOf(PRERELEASE_DELIMITER);
40
+ if (index === -1) {
41
+ this._isStable = true;
42
+ this._preRelease = [];
43
+ }
44
+ else {
45
+ this._isStable = false;
46
+ this._preRelease = vWithoutMetadata.slice(index + 1).split(VALUE_DELIMITER).map(function (value) {
47
+ if (!value)
48
+ throwError(version);
49
+ return NUMERIC_IDENTIFIER_REGEX.test(value) ?
50
+ sanitizeNumericIdentifier(value) :
51
+ value;
52
+ });
53
+ vWithoutMetadata = vWithoutMetadata.slice(0, index);
54
+ }
55
+ // Set major, minor, and patch versions
56
+ var vParts = vWithoutMetadata.split(VALUE_DELIMITER).map(function (value) {
57
+ if (!value || !NUMERIC_IDENTIFIER_REGEX.test(value))
58
+ throwError(version);
59
+ return sanitizeNumericIdentifier(value);
60
+ });
61
+ if (vParts.length !== 3)
62
+ throwError(version);
63
+ this._major = vParts[0];
64
+ this._minor = vParts[1];
65
+ this._patch = vParts[2];
66
+ // Set version string
67
+ this.version = vParts.join(VALUE_DELIMITER);
68
+ if (this._preRelease.length)
69
+ this.version += PRERELEASE_DELIMITER + this._preRelease.join(VALUE_DELIMITER);
70
+ if (metadata)
71
+ this.version += METADATA_DELIMITER + metadata;
72
+ }
73
+ /**
74
+ * Precedence comparision between 2 Semver objects.
75
+ *
76
+ * @return `0` if `this === toCompare`, `-1` if `this < toCompare`, and `1` if `this > toCompare`
77
+ */
78
+ Semver.prototype.compare = function (toCompare) {
79
+ if (this.version === toCompare.version)
80
+ return 0;
81
+ var result = compareStrings(this._major, toCompare._major);
82
+ if (result !== 0)
83
+ return result;
84
+ result = compareStrings(this._minor, toCompare._minor);
85
+ if (result !== 0)
86
+ return result;
87
+ result = compareStrings(this._patch, toCompare._patch);
88
+ if (result !== 0)
89
+ return result;
90
+ if (!this._isStable && toCompare._isStable)
91
+ return -1;
92
+ if (this._isStable && !toCompare._isStable)
93
+ return 1;
94
+ for (var i = 0, length_1 = Math.min(this._preRelease.length, toCompare._preRelease.length); i < length_1; i++) {
95
+ var result_1 = compareStrings(this._preRelease[i], toCompare._preRelease[i]);
96
+ if (result_1 !== 0)
97
+ return result_1;
98
+ }
99
+ return this._preRelease.length - toCompare._preRelease.length;
100
+ };
101
+ return Semver;
102
+ }());
103
+ exports.Semver = Semver;
@@ -8,4 +8,4 @@ exports.SDK_NOT_READY = 'not ready';
8
8
  exports.EXCEPTION = 'exception';
9
9
  exports.SPLIT_ARCHIVED = 'archived';
10
10
  exports.NOT_IN_SPLIT = 'not in split';
11
- exports.UNSUPPORTED_MATCHER_TYPE = 'unsupported matcher type';
11
+ exports.UNSUPPORTED_MATCHER_TYPE = 'targeting rule type unsupported by sdk';
@@ -4,7 +4,7 @@ exports.validateLogger = void 0;
4
4
  var logger_1 = require("../../../logger");
5
5
  var commons_1 = require("./commons");
6
6
  function isLogger(log) {
7
- return log && typeof log.debug === 'function' && typeof log.info === 'function' && typeof log.warn === 'function' && typeof log.error === 'function' && typeof log.setLogLevel === 'function';
7
+ return log !== null && typeof log === 'object' && typeof log.debug === 'function' && typeof log.info === 'function' && typeof log.warn === 'function' && typeof log.error === 'function' && typeof log.setLogLevel === 'function';
8
8
  }
9
9
  // By default it starts disabled.
10
10
  var initialLogLevel = logger_1.LogLevels.NONE;
@@ -2,12 +2,12 @@ import { get } from '../utils/lang';
2
2
  import { parser } from './parser';
3
3
  import { keyParser } from '../utils/key';
4
4
  import { thenable } from '../utils/promise/thenable';
5
- import * as LabelsConstants from '../utils/labels';
5
+ import { EXCEPTION, NO_CONDITION_MATCH, SPLIT_ARCHIVED, SPLIT_KILLED } from '../utils/labels';
6
6
  import { CONTROL } from '../utils/constants';
7
7
  function evaluationResult(result, defaultTreatment) {
8
8
  return {
9
9
  treatment: get(result, 'treatment', defaultTreatment),
10
- label: get(result, 'label', LabelsConstants.NO_CONDITION_MATCH)
10
+ label: get(result, 'label', NO_CONDITION_MATCH)
11
11
  };
12
12
  }
13
13
  var Engine = /** @class */ (function () {
@@ -38,16 +38,16 @@ var Engine = /** @class */ (function () {
38
38
  catch (err) {
39
39
  return {
40
40
  treatment: CONTROL,
41
- label: LabelsConstants.EXCEPTION
41
+ label: EXCEPTION
42
42
  };
43
43
  }
44
44
  if (this.isGarbage()) {
45
45
  treatment = CONTROL;
46
- label = LabelsConstants.SPLIT_ARCHIVED;
46
+ label = SPLIT_ARCHIVED;
47
47
  }
48
48
  else if (killed) {
49
49
  treatment = defaultTreatment;
50
- label = LabelsConstants.SPLIT_KILLED;
50
+ label = SPLIT_KILLED;
51
51
  }
52
52
  else {
53
53
  var evaluation = this.evaluator(parsedKey, seed, trafficAllocation, trafficAllocationSeed, attributes, splitEvaluator);
@@ -1,6 +1,6 @@
1
1
  import { findIndex } from '../../utils/lang';
2
2
  import { thenable } from '../../utils/promise/thenable';
3
- import * as LabelsConstants from '../../utils/labels';
3
+ import { UNSUPPORTED_MATCHER_TYPE } from '../../utils/labels';
4
4
  import { CONTROL } from '../../utils/constants';
5
5
  import { ENGINE_COMBINER_IFELSEIF, ENGINE_COMBINER_IFELSEIF_NO_TREATMENT, ERROR_ENGINE_COMBINER_IFELSEIF } from '../../logger/constants';
6
6
  export function ifElseIfCombinerContext(log, predicates) {
@@ -8,7 +8,7 @@ export function ifElseIfCombinerContext(log, predicates) {
8
8
  log.error(ERROR_ENGINE_COMBINER_IFELSEIF);
9
9
  return {
10
10
  treatment: CONTROL,
11
- label: LabelsConstants.UNSUPPORTED_MATCHER_TYPE
11
+ label: UNSUPPORTED_MATCHER_TYPE
12
12
  };
13
13
  }
14
14
  function computeTreatment(predicateResults) {
@@ -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
  }