@splitsoftware/splitio-commons 1.13.2-rc.1 → 1.13.2-rc.11

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 (116) 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/gte.js +3 -3
  7. package/cjs/evaluator/matchers/index.js +11 -1
  8. package/cjs/evaluator/matchers/lte.js +3 -3
  9. package/cjs/evaluator/matchers/matcherTypes.js +6 -1
  10. package/cjs/evaluator/matchers/semver_between.js +14 -0
  11. package/cjs/evaluator/matchers/semver_eq.js +13 -0
  12. package/cjs/evaluator/matchers/semver_gte.js +13 -0
  13. package/cjs/evaluator/matchers/semver_inlist.js +17 -0
  14. package/cjs/evaluator/matchers/semver_lte.js +13 -0
  15. package/cjs/evaluator/matchers/string.js +2 -9
  16. package/cjs/evaluator/matchers/whitelist.js +3 -2
  17. package/cjs/evaluator/matchersTransform/index.js +21 -16
  18. package/cjs/evaluator/matchersTransform/whitelist.js +2 -3
  19. package/cjs/evaluator/parser/index.js +19 -6
  20. package/cjs/logger/constants.js +4 -4
  21. package/cjs/logger/index.js +8 -1
  22. package/cjs/logger/messages/debug.js +0 -1
  23. package/cjs/logger/messages/error.js +2 -1
  24. package/cjs/services/splitApi.js +5 -5
  25. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  26. package/cjs/storages/pluggable/index.js +1 -1
  27. package/cjs/utils/Semver.js +103 -0
  28. package/cjs/utils/labels/index.js +1 -1
  29. package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  30. package/esm/evaluator/Engine.js +5 -5
  31. package/esm/evaluator/combiners/ifelseif.js +2 -2
  32. package/esm/evaluator/condition/index.js +2 -2
  33. package/esm/evaluator/index.js +4 -4
  34. package/esm/evaluator/matchers/gte.js +3 -3
  35. package/esm/evaluator/matchers/index.js +11 -1
  36. package/esm/evaluator/matchers/lte.js +3 -3
  37. package/esm/evaluator/matchers/matcherTypes.js +6 -1
  38. package/esm/evaluator/matchers/semver_between.js +10 -0
  39. package/esm/evaluator/matchers/semver_eq.js +9 -0
  40. package/esm/evaluator/matchers/semver_gte.js +9 -0
  41. package/esm/evaluator/matchers/semver_inlist.js +13 -0
  42. package/esm/evaluator/matchers/semver_lte.js +9 -0
  43. package/esm/evaluator/matchers/string.js +3 -10
  44. package/esm/evaluator/matchers/whitelist.js +4 -3
  45. package/esm/evaluator/matchersTransform/index.js +21 -16
  46. package/esm/evaluator/matchersTransform/whitelist.js +2 -3
  47. package/esm/evaluator/parser/index.js +19 -6
  48. package/esm/logger/constants.js +1 -1
  49. package/esm/logger/index.js +9 -2
  50. package/esm/logger/messages/debug.js +0 -1
  51. package/esm/logger/messages/error.js +2 -1
  52. package/esm/services/splitApi.js +5 -5
  53. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  54. package/esm/storages/pluggable/index.js +1 -1
  55. package/esm/utils/Semver.js +100 -0
  56. package/esm/utils/labels/index.js +1 -1
  57. package/esm/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  58. package/package.json +1 -2
  59. package/src/dtos/types.ts +34 -1
  60. package/src/evaluator/Engine.ts +5 -6
  61. package/src/evaluator/combiners/ifelseif.ts +2 -2
  62. package/src/evaluator/condition/index.ts +2 -2
  63. package/src/evaluator/index.ts +4 -4
  64. package/src/evaluator/matchers/between.ts +1 -1
  65. package/src/evaluator/matchers/boolean.ts +1 -1
  66. package/src/evaluator/matchers/cont_all.ts +1 -1
  67. package/src/evaluator/matchers/cont_any.ts +1 -1
  68. package/src/evaluator/matchers/cont_str.ts +1 -1
  69. package/src/evaluator/matchers/eq.ts +1 -1
  70. package/src/evaluator/matchers/eq_set.ts +1 -1
  71. package/src/evaluator/matchers/ew.ts +1 -1
  72. package/src/evaluator/matchers/gte.ts +4 -4
  73. package/src/evaluator/matchers/index.ts +28 -18
  74. package/src/evaluator/matchers/lte.ts +4 -4
  75. package/src/evaluator/matchers/matcherTypes.ts +6 -1
  76. package/src/evaluator/matchers/part_of.ts +1 -1
  77. package/src/evaluator/matchers/semver_between.ts +16 -0
  78. package/src/evaluator/matchers/semver_eq.ts +14 -0
  79. package/src/evaluator/matchers/semver_gte.ts +14 -0
  80. package/src/evaluator/matchers/semver_inlist.ts +17 -0
  81. package/src/evaluator/matchers/semver_lte.ts +14 -0
  82. package/src/evaluator/matchers/string.ts +5 -13
  83. package/src/evaluator/matchers/sw.ts +1 -1
  84. package/src/evaluator/matchers/whitelist.ts +6 -4
  85. package/src/evaluator/matchersTransform/index.ts +31 -23
  86. package/src/evaluator/matchersTransform/whitelist.ts +4 -5
  87. package/src/evaluator/parser/index.ts +19 -7
  88. package/src/evaluator/types.ts +3 -3
  89. package/src/logger/constants.ts +1 -1
  90. package/src/logger/index.ts +8 -2
  91. package/src/logger/messages/debug.ts +0 -1
  92. package/src/logger/messages/error.ts +2 -1
  93. package/src/services/splitApi.ts +4 -5
  94. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +1 -1
  95. package/src/storages/pluggable/index.ts +1 -1
  96. package/src/utils/Semver.ts +111 -0
  97. package/src/utils/labels/index.ts +1 -1
  98. package/src/utils/settingsValidation/logger/pluggableLogger.ts +1 -1
  99. package/types/dtos/types.d.ts +26 -1
  100. package/types/evaluator/matchers/sember_inlist.d.ts +3 -0
  101. package/types/evaluator/matchers/semver_between.d.ts +3 -0
  102. package/types/evaluator/matchers/semver_eq.d.ts +2 -0
  103. package/types/evaluator/matchers/semver_gte.d.ts +2 -0
  104. package/types/evaluator/matchers/semver_inlist.d.ts +2 -0
  105. package/types/evaluator/matchers/semver_lte.d.ts +2 -0
  106. package/types/evaluator/matchers/whitelist.d.ts +1 -2
  107. package/types/evaluator/matchersTransform/set.d.ts +2 -2
  108. package/types/evaluator/matchersTransform/string.d.ts +7 -0
  109. package/types/evaluator/matchersTransform/whitelist.d.ts +3 -3
  110. package/types/evaluator/types.d.ts +3 -3
  111. package/types/logger/constants.d.ts +1 -1
  112. package/types/utils/labels/index.d.ts +1 -1
  113. package/types/utils/semVer.d.ts +15 -0
  114. package/cjs/evaluator/matchersTransform/set.js +0 -10
  115. package/esm/evaluator/matchersTransform/set.js +0 -6
  116. package/src/evaluator/matchersTransform/set.ts +0 -8
package/CHANGES.txt CHANGED
@@ -1,6 +1,7 @@
1
- 1.14.0 (April XX, 2024)
2
- - Updated impression label to 'unsupported matcher type' when the matcher type is not supported by the SDK.
3
- - Updated Split API client to include the flags spec version query parameter for the `splitChanges` endpoint.
1
+ 1.14.0 (May 3, 2024)
2
+ - Added support for targeting rules based on semantic versions (https://semver.org/).
3
+ - Added special impression label "targeting rule type unsupported by sdk" when the matcher type is not supported by the SDK, which returns 'control' treatment.
4
+ - Updated Split API client to include the flags spec version query parameter for the `splitChanges` and `auth` endpoints.
4
5
 
5
6
  1.13.1 (January 10, 2024)
6
7
  - Updated client `destroy` method to release SDK key immediately and avoid unexpected warning logs when a factory is created with the same SDK key after the previous one was destroyed.
@@ -1,17 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Engine = void 0;
4
- var tslib_1 = require("tslib");
5
4
  var lang_1 = require("../utils/lang");
6
5
  var parser_1 = require("./parser");
7
6
  var key_1 = require("../utils/key");
8
7
  var thenable_1 = require("../utils/promise/thenable");
9
- var LabelsConstants = (0, tslib_1.__importStar)(require("../utils/labels"));
8
+ var labels_1 = require("../utils/labels");
10
9
  var constants_1 = require("../utils/constants");
11
10
  function evaluationResult(result, defaultTreatment) {
12
11
  return {
13
12
  treatment: (0, lang_1.get)(result, 'treatment', defaultTreatment),
14
- label: (0, lang_1.get)(result, 'label', LabelsConstants.NO_CONDITION_MATCH)
13
+ label: (0, lang_1.get)(result, 'label', labels_1.NO_CONDITION_MATCH)
15
14
  };
16
15
  }
17
16
  var Engine = /** @class */ (function () {
@@ -42,16 +41,16 @@ var Engine = /** @class */ (function () {
42
41
  catch (err) {
43
42
  return {
44
43
  treatment: constants_1.CONTROL,
45
- label: LabelsConstants.EXCEPTION
44
+ label: labels_1.EXCEPTION
46
45
  };
47
46
  }
48
47
  if (this.isGarbage()) {
49
48
  treatment = constants_1.CONTROL;
50
- label = LabelsConstants.SPLIT_ARCHIVED;
49
+ label = labels_1.SPLIT_ARCHIVED;
51
50
  }
52
51
  else if (killed) {
53
52
  treatment = defaultTreatment;
54
- label = LabelsConstants.SPLIT_KILLED;
53
+ label = labels_1.SPLIT_KILLED;
55
54
  }
56
55
  else {
57
56
  var evaluation = this.evaluator(parsedKey, seed, trafficAllocation, trafficAllocationSeed, attributes, splitEvaluator);
@@ -1,10 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ifElseIfCombinerContext = void 0;
4
- var tslib_1 = require("tslib");
5
4
  var lang_1 = require("../../utils/lang");
6
5
  var thenable_1 = require("../../utils/promise/thenable");
7
- var LabelsConstants = (0, tslib_1.__importStar)(require("../../utils/labels"));
6
+ var labels_1 = require("../../utils/labels");
8
7
  var constants_1 = require("../../utils/constants");
9
8
  var constants_2 = require("../../logger/constants");
10
9
  function ifElseIfCombinerContext(log, predicates) {
@@ -12,7 +11,7 @@ function ifElseIfCombinerContext(log, predicates) {
12
11
  log.error(constants_2.ERROR_ENGINE_COMBINER_IFELSEIF);
13
12
  return {
14
13
  treatment: constants_1.CONTROL,
15
- label: LabelsConstants.UNSUPPORTED_MATCHER_TYPE
14
+ label: labels_1.UNSUPPORTED_MATCHER_TYPE
16
15
  };
17
16
  }
18
17
  function computeTreatment(predicateResults) {
@@ -1,10 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.conditionContext = void 0;
4
- var tslib_1 = require("tslib");
5
4
  var engineUtils_1 = require("./engineUtils");
6
5
  var thenable_1 = require("../../utils/promise/thenable");
7
- var LabelsConstants = (0, tslib_1.__importStar)(require("../../utils/labels"));
6
+ var labels_1 = require("../../utils/labels");
8
7
  // Build Evaluation object if and only if matchingResult is true
9
8
  function match(log, matchingResult, bucketingKey, seed, treatments, label) {
10
9
  if (matchingResult) {
@@ -24,7 +23,7 @@ function conditionContext(log, matcherEvaluator, treatments, label, conditionTyp
24
23
  if (conditionType === 'ROLLOUT' && !(0, engineUtils_1.shouldApplyRollout)(trafficAllocation, key.bucketingKey, trafficAllocationSeed)) {
25
24
  return {
26
25
  treatment: undefined,
27
- label: LabelsConstants.NOT_IN_SPLIT
26
+ label: labels_1.NOT_IN_SPLIT
28
27
  };
29
28
  }
30
29
  // matcherEvaluator could be Async, this relays on matchers return value, so we need
@@ -1,16 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.evaluateFeaturesByFlagSets = exports.evaluateFeatures = exports.evaluateFeature = void 0;
4
- var tslib_1 = require("tslib");
5
4
  var Engine_1 = require("./Engine");
6
5
  var thenable_1 = require("../utils/promise/thenable");
7
- var LabelsConstants = (0, tslib_1.__importStar)(require("../utils/labels"));
6
+ var labels_1 = require("../utils/labels");
8
7
  var constants_1 = require("../utils/constants");
9
8
  var sets_1 = require("../utils/lang/sets");
10
9
  var constants_2 = require("../logger/constants");
11
10
  var treatmentException = {
12
11
  treatment: constants_1.CONTROL,
13
- label: LabelsConstants.EXCEPTION,
12
+ label: labels_1.EXCEPTION,
14
13
  config: null
15
14
  };
16
15
  function treatmentsException(splitNames) {
@@ -94,13 +93,13 @@ exports.evaluateFeaturesByFlagSets = evaluateFeaturesByFlagSets;
94
93
  function getEvaluation(log, splitJSON, key, attributes, storage) {
95
94
  var evaluation = {
96
95
  treatment: constants_1.CONTROL,
97
- label: LabelsConstants.SPLIT_NOT_FOUND,
96
+ label: labels_1.SPLIT_NOT_FOUND,
98
97
  config: null
99
98
  };
100
99
  if (splitJSON) {
101
100
  var split_1 = Engine_1.Engine.parse(log, splitJSON, storage);
102
101
  evaluation = split_1.getTreatment(key, attributes, evaluateFeature);
103
- // If the storage is async and the evaluated split uses segment, evaluation is thenable
102
+ // If the storage is async and the evaluated flag uses segments or dependencies, evaluation is thenable
104
103
  if ((0, thenable_1.thenable)(evaluation)) {
105
104
  return evaluation.then(function (result) {
106
105
  result.changeNumber = split_1.getChangeNumber();
@@ -4,9 +4,9 @@ exports.greaterThanEqualMatcherContext = void 0;
4
4
  var constants_1 = require("../../logger/constants");
5
5
  function greaterThanEqualMatcherContext(log, ruleAttr) {
6
6
  return function greaterThanEqualMatcher(runtimeAttr) {
7
- var isGreaterEqualThan = runtimeAttr >= ruleAttr;
8
- log.debug(constants_1.ENGINE_MATCHER_GREATER, [runtimeAttr, ruleAttr, isGreaterEqualThan]);
9
- return isGreaterEqualThan;
7
+ var isGreaterThanEqual = runtimeAttr >= ruleAttr;
8
+ log.debug(constants_1.ENGINE_MATCHER_GREATER, [runtimeAttr, ruleAttr, isGreaterThanEqual]);
9
+ return isGreaterThanEqual;
10
10
  };
11
11
  }
12
12
  exports.greaterThanEqualMatcherContext = greaterThanEqualMatcherContext;
@@ -18,6 +18,11 @@ var cont_str_1 = require("./cont_str");
18
18
  var dependency_1 = require("./dependency");
19
19
  var boolean_1 = require("./boolean");
20
20
  var string_1 = require("./string");
21
+ var semver_eq_1 = require("./semver_eq");
22
+ var semver_gte_1 = require("./semver_gte");
23
+ var semver_lte_1 = require("./semver_lte");
24
+ var semver_between_1 = require("./semver_between");
25
+ var semver_inlist_1 = require("./semver_inlist");
21
26
  var matchers = [
22
27
  undefined,
23
28
  all_1.allMatcherContext,
@@ -36,7 +41,12 @@ var matchers = [
36
41
  cont_str_1.containsStringMatcherContext,
37
42
  dependency_1.dependencyMatcherContext,
38
43
  boolean_1.booleanMatcherContext,
39
- string_1.stringMatcherContext // MATCHES_STRING: 17
44
+ string_1.stringMatcherContext,
45
+ semver_eq_1.equalToSemverMatcherContext,
46
+ semver_gte_1.greaterThanEqualToSemverMatcherContext,
47
+ semver_lte_1.lessThanEqualToSemverMatcherContext,
48
+ semver_between_1.betweenSemverMatcherContext,
49
+ semver_inlist_1.inListSemverMatcherContext, // IN_LIST_SEMVER: 22
40
50
  ];
41
51
  /**
42
52
  * Matcher factory.
@@ -4,9 +4,9 @@ exports.lessThanEqualMatcherContext = void 0;
4
4
  var constants_1 = require("../../logger/constants");
5
5
  function lessThanEqualMatcherContext(log, ruleAttr) {
6
6
  return function lessThanEqualMatcher(runtimeAttr) {
7
- var isLessEqualThan = runtimeAttr <= ruleAttr;
8
- log.debug(constants_1.ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessEqualThan]);
9
- return isLessEqualThan;
7
+ var isLessThanEqual = runtimeAttr <= ruleAttr;
8
+ log.debug(constants_1.ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessThanEqual]);
9
+ return isLessThanEqual;
10
10
  };
11
11
  }
12
12
  exports.lessThanEqualMatcherContext = lessThanEqualMatcherContext;
@@ -19,7 +19,12 @@ exports.matcherTypes = {
19
19
  CONTAINS_STRING: 14,
20
20
  IN_SPLIT_TREATMENT: 15,
21
21
  EQUAL_TO_BOOLEAN: 16,
22
- MATCHES_STRING: 17
22
+ MATCHES_STRING: 17,
23
+ EQUAL_TO_SEMVER: 18,
24
+ GREATER_THAN_OR_EQUAL_TO_SEMVER: 19,
25
+ LESS_THAN_OR_EQUAL_TO_SEMVER: 20,
26
+ BETWEEN_SEMVER: 21,
27
+ IN_LIST_SEMVER: 22,
23
28
  };
24
29
  exports.matcherDataTypes = {
25
30
  BOOLEAN: 'BOOLEAN',
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.betweenSemverMatcherContext = void 0;
4
+ var Semver_1 = require("../../utils/Semver");
5
+ function betweenSemverMatcherContext(log, ruleAttr) {
6
+ var startSemver = new Semver_1.Semver(ruleAttr.start);
7
+ var endSemver = new Semver_1.Semver(ruleAttr.end);
8
+ return function betweenSemverMatcher(runtimeAttr) {
9
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
10
+ var isBetween = startSemver.compare(runtimeSemver) <= 0 && endSemver.compare(runtimeSemver) >= 0;
11
+ return isBetween;
12
+ };
13
+ }
14
+ exports.betweenSemverMatcherContext = betweenSemverMatcherContext;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.equalToSemverMatcherContext = void 0;
4
+ var Semver_1 = require("../../utils/Semver");
5
+ function equalToSemverMatcherContext(log, ruleAttr) {
6
+ var ruleSemver = new Semver_1.Semver(ruleAttr);
7
+ return function equalToSemverMatcher(runtimeAttr) {
8
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
9
+ var isEqual = ruleSemver.version === runtimeSemver.version;
10
+ return isEqual;
11
+ };
12
+ }
13
+ exports.equalToSemverMatcherContext = equalToSemverMatcherContext;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.greaterThanEqualToSemverMatcherContext = void 0;
4
+ var Semver_1 = require("../../utils/Semver");
5
+ function greaterThanEqualToSemverMatcherContext(log, ruleAttr) {
6
+ var ruleSemver = new Semver_1.Semver(ruleAttr);
7
+ return function greaterThanEqualToSemverMatcher(runtimeAttr) {
8
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
9
+ var isGreaterThanEqual = runtimeSemver.compare(ruleSemver) >= 0;
10
+ return isGreaterThanEqual;
11
+ };
12
+ }
13
+ exports.greaterThanEqualToSemverMatcherContext = greaterThanEqualToSemverMatcherContext;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inListSemverMatcherContext = void 0;
4
+ var sets_1 = require("../../utils/lang/sets");
5
+ var Semver_1 = require("../../utils/Semver");
6
+ function inListSemverMatcherContext(log, ruleAttr) {
7
+ // @TODO ruleAttr validation should be done at the `parser` or `matchersTransform` level to reuse for all matchers
8
+ if (!ruleAttr || ruleAttr.length === 0)
9
+ throw new Error('whitelistMatcherData is required for IN_LIST_SEMVER matcher type');
10
+ var listOfSemvers = new sets_1._Set(ruleAttr.map(function (version) { return new Semver_1.Semver(version).version; }));
11
+ return function inListSemverMatcher(runtimeAttr) {
12
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr).version;
13
+ var isInList = listOfSemvers.has(runtimeSemver);
14
+ return isInList;
15
+ };
16
+ }
17
+ exports.inListSemverMatcherContext = inListSemverMatcherContext;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lessThanEqualToSemverMatcherContext = void 0;
4
+ var Semver_1 = require("../../utils/Semver");
5
+ function lessThanEqualToSemverMatcherContext(log, ruleAttr) {
6
+ var ruleSemver = new Semver_1.Semver(ruleAttr);
7
+ return function lessThanEqualToSemverMatcher(runtimeAttr) {
8
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
9
+ var isLessThanEqual = runtimeSemver.compare(ruleSemver) <= 0;
10
+ return isLessThanEqual;
11
+ };
12
+ }
13
+ exports.lessThanEqualToSemverMatcherContext = lessThanEqualToSemverMatcherContext;
@@ -3,16 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.stringMatcherContext = void 0;
4
4
  var constants_1 = require("../../logger/constants");
5
5
  function stringMatcherContext(log, ruleAttr) {
6
+ var regex = new RegExp(ruleAttr);
6
7
  return function stringMatcher(runtimeAttr) {
7
- var re;
8
- try {
9
- re = new RegExp(ruleAttr);
10
- }
11
- catch (e) {
12
- log.debug(constants_1.ENGINE_MATCHER_STRING_INVALID, [ruleAttr]);
13
- return false;
14
- }
15
- var regexMatches = re.test(runtimeAttr);
8
+ var regexMatches = regex.test(runtimeAttr);
16
9
  log.debug(constants_1.ENGINE_MATCHER_STRING, [runtimeAttr, ruleAttr, regexMatches ? 'yes' : 'no']);
17
10
  return regexMatches;
18
11
  };
@@ -4,9 +4,10 @@ exports.whitelistMatcherContext = void 0;
4
4
  var sets_1 = require("../../utils/lang/sets");
5
5
  var constants_1 = require("../../logger/constants");
6
6
  function whitelistMatcherContext(log, ruleAttr) {
7
+ var whitelistSet = new sets_1._Set(ruleAttr);
7
8
  return function whitelistMatcher(runtimeAttr) {
8
- var isInWhitelist = ruleAttr.has(runtimeAttr);
9
- log.debug(constants_1.ENGINE_MATCHER_WHITELIST, [runtimeAttr, (0, sets_1.setToArray)(ruleAttr).join(','), isInWhitelist]);
9
+ var isInWhitelist = whitelistSet.has(runtimeAttr);
10
+ log.debug(constants_1.ENGINE_MATCHER_WHITELIST, [runtimeAttr, ruleAttr.join(','), isInWhitelist]);
10
11
  return isInWhitelist;
11
12
  };
12
13
  }
@@ -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,16 +18,28 @@ 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
40
+ if ((0, thenable_1.thenable)(result)) { // @ts-ignore
41
+ return result.then(function (res) { return Boolean(res ^ matcherDto.negate); });
42
+ } // @ts-ignore
30
43
  return Boolean(result ^ matcherDto.negate);
31
44
  };
32
45
  });
@@ -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.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.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 = 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_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 = 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 = 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 = 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 = 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.
@@ -30,7 +30,6 @@ exports.ENGINE_MATCHER_LESS = 16;
30
30
  exports.ENGINE_MATCHER_PART_OF = 17;
31
31
  exports.ENGINE_MATCHER_SEGMENT = 18;
32
32
  exports.ENGINE_MATCHER_STRING = 19;
33
- exports.ENGINE_MATCHER_STRING_INVALID = 20;
34
33
  exports.ENGINE_MATCHER_STARTS_WITH = 21;
35
34
  exports.ENGINE_MATCHER_WHITELIST = 22;
36
35
  exports.ENGINE_VALUE = 23;
@@ -133,6 +132,7 @@ exports.ERROR_NOT_BOOLEAN = 325;
133
132
  exports.ERROR_MIN_CONFIG_PARAM = 326;
134
133
  exports.ERROR_TOO_MANY_SETS = 327;
135
134
  exports.ERROR_SETS_FILTER_EXCLUSIVE = 328;
135
+ exports.ENGINE_MATCHER_ERROR = 329;
136
136
  // Log prefixes (a.k.a. tags or categories)
137
137
  exports.LOG_PREFIX_SETTINGS = 'settings';
138
138
  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;
@@ -26,7 +26,6 @@ exports.codesDebug = info_1.codesInfo.concat([
26
26
  [c.ENGINE_MATCHER_PART_OF, c.LOG_PREFIX_ENGINE_MATCHER + '[partOfMatcher] %s is part of %s? %s'],
27
27
  [c.ENGINE_MATCHER_SEGMENT, c.LOG_PREFIX_ENGINE_MATCHER + '[segmentMatcher] evaluated %s / %s => %s'],
28
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
29
  [c.ENGINE_MATCHER_STARTS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[startsWithMatcher] %s starts with %s? %s'],
31
30
  [c.ENGINE_MATCHER_WHITELIST, c.LOG_PREFIX_ENGINE_MATCHER + '[whitelistMatcher] evaluated %s in [%s] => %s'],
32
31
  [c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute [%s], [%s] will be used for matching.'],
@@ -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'],
@@ -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); });