@splitsoftware/splitio-commons 1.13.2-rc.3 → 1.13.2-rc.5

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 (49) hide show
  1. package/cjs/evaluator/matchers/lte.js +3 -3
  2. package/cjs/evaluator/matchers/semver_between.js +4 -2
  3. package/cjs/evaluator/matchers/semver_eq.js +4 -1
  4. package/cjs/evaluator/matchers/semver_gte.js +4 -1
  5. package/cjs/evaluator/matchers/semver_inlist.js +5 -0
  6. package/cjs/evaluator/matchers/semver_lte.js +5 -2
  7. package/cjs/evaluator/matchers/string.js +2 -9
  8. package/cjs/evaluator/matchersTransform/set.js +1 -1
  9. package/cjs/evaluator/matchersTransform/whitelist.js +1 -1
  10. package/cjs/evaluator/parser/index.js +27 -10
  11. package/cjs/logger/constants.js +9 -4
  12. package/cjs/logger/messages/debug.js +5 -1
  13. package/cjs/logger/messages/error.js +1 -0
  14. package/cjs/utils/Semver.js +3 -0
  15. package/esm/evaluator/matchers/lte.js +3 -3
  16. package/esm/evaluator/matchers/semver_between.js +4 -2
  17. package/esm/evaluator/matchers/semver_eq.js +4 -1
  18. package/esm/evaluator/matchers/semver_gte.js +4 -1
  19. package/esm/evaluator/matchers/semver_inlist.js +5 -0
  20. package/esm/evaluator/matchers/semver_lte.js +5 -2
  21. package/esm/evaluator/matchers/string.js +3 -10
  22. package/esm/evaluator/matchersTransform/set.js +1 -1
  23. package/esm/evaluator/matchersTransform/whitelist.js +1 -1
  24. package/esm/evaluator/parser/index.js +27 -10
  25. package/esm/logger/constants.js +6 -1
  26. package/esm/logger/messages/debug.js +5 -1
  27. package/esm/logger/messages/error.js +1 -0
  28. package/esm/utils/Semver.js +3 -0
  29. package/package.json +1 -1
  30. package/src/evaluator/matchers/lte.ts +3 -3
  31. package/src/evaluator/matchers/semver_between.ts +5 -4
  32. package/src/evaluator/matchers/semver_eq.ts +6 -2
  33. package/src/evaluator/matchers/semver_gte.ts +6 -2
  34. package/src/evaluator/matchers/semver_inlist.ts +6 -0
  35. package/src/evaluator/matchers/semver_lte.ts +7 -3
  36. package/src/evaluator/matchers/string.ts +4 -12
  37. package/src/evaluator/matchersTransform/index.ts +4 -4
  38. package/src/evaluator/matchersTransform/set.ts +3 -3
  39. package/src/evaluator/matchersTransform/whitelist.ts +3 -3
  40. package/src/evaluator/parser/index.ts +20 -8
  41. package/src/logger/constants.ts +6 -1
  42. package/src/logger/messages/debug.ts +5 -1
  43. package/src/logger/messages/error.ts +1 -0
  44. package/src/utils/Semver.ts +4 -0
  45. package/types/evaluator/matchers/semver_between.d.ts +1 -1
  46. package/types/evaluator/matchersTransform/set.d.ts +2 -2
  47. package/types/evaluator/matchersTransform/string.d.ts +7 -0
  48. package/types/evaluator/matchersTransform/whitelist.d.ts +2 -2
  49. package/types/logger/constants.d.ts +6 -1
@@ -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;
@@ -1,13 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.betweenSemverMatcherContext = void 0;
4
+ var constants_1 = require("../../logger/constants");
4
5
  var Semver_1 = require("../../utils/Semver");
5
6
  function betweenSemverMatcherContext(log, ruleAttr) {
6
7
  var startSemver = new Semver_1.Semver(ruleAttr.start);
7
8
  var endSemver = new Semver_1.Semver(ruleAttr.end);
8
- return function betweenSemverMatcher(key) {
9
- var runtimeSemver = new Semver_1.Semver(key);
9
+ return function betweenSemverMatcher(runtimeAttr) {
10
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
10
11
  var isBetween = startSemver.compare(runtimeSemver) <= 0 && endSemver.compare(runtimeSemver) >= 0;
12
+ log.debug(constants_1.ENGINE_MATCHER_BETWEEN_SEMVER, [runtimeAttr, ruleAttr.start, ruleAttr.end, isBetween]);
11
13
  return isBetween;
12
14
  };
13
15
  }
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.equalToSemverMatcherContext = void 0;
4
+ var constants_1 = require("../../logger/constants");
4
5
  var Semver_1 = require("../../utils/Semver");
5
6
  function equalToSemverMatcherContext(log, ruleAttr) {
6
7
  var ruleSemver = new Semver_1.Semver(ruleAttr);
7
8
  return function equalToSemverMatcher(runtimeAttr) {
8
- var isEqual = ruleSemver.version === new Semver_1.Semver(runtimeAttr).version;
9
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
10
+ var isEqual = ruleSemver.version === runtimeSemver.version;
11
+ log.debug(constants_1.ENGINE_MATCHER_EQUAL_SEMVER, [runtimeAttr, ruleAttr, isEqual]);
9
12
  return isEqual;
10
13
  };
11
14
  }
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.greaterThanEqualToSemverMatcherContext = void 0;
4
+ var constants_1 = require("../../logger/constants");
4
5
  var Semver_1 = require("../../utils/Semver");
5
6
  function greaterThanEqualToSemverMatcherContext(log, ruleAttr) {
6
7
  var ruleSemver = new Semver_1.Semver(ruleAttr);
7
8
  return function greaterThanEqualToSemverMatcher(runtimeAttr) {
8
- var isGreaterThanEqual = new Semver_1.Semver(runtimeAttr).compare(ruleSemver) >= 0;
9
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
10
+ var isGreaterThanEqual = runtimeSemver.compare(ruleSemver) >= 0;
11
+ log.debug(constants_1.ENGINE_MATCHER_GREATER_SEMVER, [runtimeAttr, ruleAttr, isGreaterThanEqual]);
9
12
  return isGreaterThanEqual;
10
13
  };
11
14
  }
@@ -3,11 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.inListSemverMatcherContext = void 0;
4
4
  var sets_1 = require("../../utils/lang/sets");
5
5
  var Semver_1 = require("../../utils/Semver");
6
+ var constants_1 = require("../../logger/constants");
6
7
  function inListSemverMatcherContext(log, ruleAttr) {
8
+ // @TODO move eventually to `matchersTransform` and validate for all matchers
9
+ if (!ruleAttr || ruleAttr.size === 0)
10
+ throw new Error('whitelistMatcherData is required for IN_LIST_SEMVER matcher type');
7
11
  var listOfSemvers = new sets_1._Set((0, sets_1.setToArray)(ruleAttr).map(function (version) { return new Semver_1.Semver(version).version; }));
8
12
  return function inListSemverMatcher(runtimeAttr) {
9
13
  var runtimeSemver = new Semver_1.Semver(runtimeAttr).version;
10
14
  var isInList = listOfSemvers.has(runtimeSemver);
15
+ log.debug(constants_1.ENGINE_MATCHER_IN_LIST_SEMVER, [runtimeAttr, (0, sets_1.setToArray)(ruleAttr).join(','), isInList]);
11
16
  return isInList;
12
17
  };
13
18
  }
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.lessThanEqualToSemverMatcherContext = void 0;
4
+ var constants_1 = require("../../logger/constants");
4
5
  var Semver_1 = require("../../utils/Semver");
5
6
  function lessThanEqualToSemverMatcherContext(log, ruleAttr) {
6
7
  var ruleSemver = new Semver_1.Semver(ruleAttr);
7
8
  return function lessThanEqualToSemverMatcher(runtimeAttr) {
8
- var isLessThenEqual = new Semver_1.Semver(runtimeAttr).compare(ruleSemver) <= 0;
9
- return isLessThenEqual;
9
+ var runtimeSemver = new Semver_1.Semver(runtimeAttr);
10
+ var isLessThanEqual = runtimeSemver.compare(ruleSemver) <= 0;
11
+ log.debug(constants_1.ENGINE_MATCHER_LESS_SEMVER, [runtimeAttr, ruleAttr, isLessThanEqual]);
12
+ return isLessThanEqual;
10
13
  };
11
14
  }
12
15
  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
  };
@@ -5,6 +5,6 @@ exports.setTransform = void 0;
5
5
  * Extract whitelist array. Used by set and string matchers
6
6
  */
7
7
  function setTransform(whitelistObject) {
8
- return whitelistObject.whitelist;
8
+ return whitelistObject && whitelistObject.whitelist;
9
9
  }
10
10
  exports.setTransform = setTransform;
@@ -6,6 +6,6 @@ var sets_1 = require("../../utils/lang/sets");
6
6
  * Extract whitelist as a set. Used by 'WHITELIST' matcher.
7
7
  */
8
8
  function whitelistTransform(whitelistObject) {
9
- return new sets_1._Set(whitelistObject.whitelist);
9
+ return new sets_1._Set(whitelistObject && whitelistObject.whitelist);
10
10
  }
11
11
  exports.whitelistTransform = whitelistTransform;
@@ -9,24 +9,37 @@ 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
- for (var i = 0; i < conditions.length; i++) {
15
+ var _loop_1 = function (i) {
15
16
  var _a = conditions[i], matcherGroup = _a.matcherGroup, partitions = _a.partitions, label = _a.label, conditionType = _a.conditionType;
16
17
  // transform data structure
17
18
  var matchers = (0, matchersTransform_1.matchersTransform)(matcherGroup.matchers);
18
19
  // create a set of pure functions from the matcher's dto
19
- var expressions = matchers.map(function (matcherDto) {
20
- var matcher = (0, matchers_1.matcherFactory)(log, matcherDto, storage);
20
+ var expressions = matchers.map(function (matcherDto, index) {
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, [matcherGroup.matchers[index].matcherType, 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, [matcherGroup.matchers[index].matcherType, 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
  });
@@ -34,10 +47,14 @@ function parser(log, conditions, storage) {
34
47
  if (expressions.length === 0) {
35
48
  // reset any data collected during parsing
36
49
  predicates = [];
37
- // and break the loop
38
- break;
50
+ return "break";
39
51
  }
40
52
  predicates.push((0, condition_1.conditionContext)(log, (0, and_1.andCombinerContext)(log, expressions), treatments_1.Treatments.parse(partitions), label, conditionType));
53
+ };
54
+ for (var i = 0; i < conditions.length; i++) {
55
+ var state_1 = _loop_1(i);
56
+ if (state_1 === "break")
57
+ break;
41
58
  }
42
59
  // Instanciate evaluator given the set of conditions using if else if logic
43
60
  return (0, ifelseif_1.ifElseIfCombinerContext)(log, predicates);
@@ -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.NEW_FACTORY = exports.NEW_SHARED_CLIENT = exports.IMPRESSION_QUEUEING = exports.IMPRESSION = exports.CLIENT_READY = exports.CLIENT_READY_FROM_CACHE = exports.ENGINE_MATCHER_IN_LIST_SEMVER = exports.ENGINE_MATCHER_BETWEEN_SEMVER = exports.ENGINE_MATCHER_LESS_SEMVER = exports.ENGINE_MATCHER_GREATER_SEMVER = exports.ENGINE_MATCHER_EQUAL_SEMVER = 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_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 = exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.POLLING_SMART_PAUSING = 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 = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = 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;
@@ -50,6 +49,11 @@ exports.SYNC_TASK_START = 36;
50
49
  exports.SYNC_TASK_EXECUTE = 37;
51
50
  exports.SYNC_TASK_STOP = 38;
52
51
  exports.SETTINGS_SPLITS_FILTER = 39;
52
+ exports.ENGINE_MATCHER_EQUAL_SEMVER = 40;
53
+ exports.ENGINE_MATCHER_GREATER_SEMVER = 41;
54
+ exports.ENGINE_MATCHER_LESS_SEMVER = 42;
55
+ exports.ENGINE_MATCHER_BETWEEN_SEMVER = 43;
56
+ exports.ENGINE_MATCHER_IN_LIST_SEMVER = 44;
53
57
  exports.CLIENT_READY_FROM_CACHE = 100;
54
58
  exports.CLIENT_READY = 101;
55
59
  exports.IMPRESSION = 102;
@@ -133,6 +137,7 @@ exports.ERROR_NOT_BOOLEAN = 325;
133
137
  exports.ERROR_MIN_CONFIG_PARAM = 326;
134
138
  exports.ERROR_TOO_MANY_SETS = 327;
135
139
  exports.ERROR_SETS_FILTER_EXCLUSIVE = 328;
140
+ exports.ENGINE_MATCHER_ERROR = 329;
136
141
  // Log prefixes (a.k.a. tags or categories)
137
142
  exports.LOG_PREFIX_SETTINGS = 'settings';
138
143
  exports.LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
@@ -26,11 +26,15 @@ 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.'],
33
32
  [c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize [%s] which should be of type [%s]. Sanitized and processed value => [%s]'],
33
+ [c.ENGINE_MATCHER_EQUAL_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToSemverMatcher] is %s equal to %s? %s'],
34
+ [c.ENGINE_MATCHER_GREATER_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[greaterThanEqualSemverMatcher] is %s greater than %s? %s'],
35
+ [c.ENGINE_MATCHER_LESS_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[lessThanEqualSemverMatcher] is %s less than %s? %s'],
36
+ [c.ENGINE_MATCHER_BETWEEN_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[betweenSemverMatcher] is %s between %s and %s? %s'],
37
+ [c.ENGINE_MATCHER_IN_LIST_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[inListSemverMatcher] is %s in list [%s]? %s'],
34
38
  // SDK
35
39
  [c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'],
36
40
  [c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'],
@@ -6,6 +6,7 @@ var c = (0, tslib_1.__importStar)(require("../constants"));
6
6
  exports.codesError = [
7
7
  // evaluator
8
8
  [c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported matcher 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'],
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Semver = void 0;
4
+ var lang_1 = require("../utils/lang");
4
5
  var NUMERIC_IDENTIFIER_REGEX = /^[0-9]+$/;
5
6
  var METADATA_DELIMITER = '+';
6
7
  var PRERELEASE_DELIMITER = '-';
@@ -27,6 +28,8 @@ function throwError(version) {
27
28
  }
28
29
  var Semver = /** @class */ (function () {
29
30
  function Semver(version) {
31
+ if (!(0, lang_1.isString)(version))
32
+ throwError(version);
30
33
  // Separate metadata if exists
31
34
  var index = version.indexOf(METADATA_DELIMITER);
32
35
  var _a = index === -1 ? [version] : [version.slice(0, index), version.slice(index + 1)], vWithoutMetadata = _a[0], metadata = _a[1];
@@ -1,8 +1,8 @@
1
1
  import { ENGINE_MATCHER_LESS } from '../../logger/constants';
2
2
  export function lessThanEqualMatcherContext(log, ruleAttr) {
3
3
  return function lessThanEqualMatcher(runtimeAttr) {
4
- var isLessEqualThan = runtimeAttr <= ruleAttr;
5
- log.debug(ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessEqualThan]);
6
- return isLessEqualThan;
4
+ var isLessThanEqual = runtimeAttr <= ruleAttr;
5
+ log.debug(ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessThanEqual]);
6
+ return isLessThanEqual;
7
7
  };
8
8
  }
@@ -1,10 +1,12 @@
1
+ import { ENGINE_MATCHER_BETWEEN_SEMVER } from '../../logger/constants';
1
2
  import { Semver } from '../../utils/Semver';
2
3
  export function betweenSemverMatcherContext(log, ruleAttr) {
3
4
  var startSemver = new Semver(ruleAttr.start);
4
5
  var endSemver = new Semver(ruleAttr.end);
5
- return function betweenSemverMatcher(key) {
6
- var runtimeSemver = new Semver(key);
6
+ return function betweenSemverMatcher(runtimeAttr) {
7
+ var runtimeSemver = new Semver(runtimeAttr);
7
8
  var isBetween = startSemver.compare(runtimeSemver) <= 0 && endSemver.compare(runtimeSemver) >= 0;
9
+ log.debug(ENGINE_MATCHER_BETWEEN_SEMVER, [runtimeAttr, ruleAttr.start, ruleAttr.end, isBetween]);
8
10
  return isBetween;
9
11
  };
10
12
  }
@@ -1,8 +1,11 @@
1
+ import { ENGINE_MATCHER_EQUAL_SEMVER } from '../../logger/constants';
1
2
  import { Semver } from '../../utils/Semver';
2
3
  export function equalToSemverMatcherContext(log, ruleAttr) {
3
4
  var ruleSemver = new Semver(ruleAttr);
4
5
  return function equalToSemverMatcher(runtimeAttr) {
5
- var isEqual = ruleSemver.version === new Semver(runtimeAttr).version;
6
+ var runtimeSemver = new Semver(runtimeAttr);
7
+ var isEqual = ruleSemver.version === runtimeSemver.version;
8
+ log.debug(ENGINE_MATCHER_EQUAL_SEMVER, [runtimeAttr, ruleAttr, isEqual]);
6
9
  return isEqual;
7
10
  };
8
11
  }
@@ -1,8 +1,11 @@
1
+ import { ENGINE_MATCHER_GREATER_SEMVER } from '../../logger/constants';
1
2
  import { Semver } from '../../utils/Semver';
2
3
  export function greaterThanEqualToSemverMatcherContext(log, ruleAttr) {
3
4
  var ruleSemver = new Semver(ruleAttr);
4
5
  return function greaterThanEqualToSemverMatcher(runtimeAttr) {
5
- var isGreaterThanEqual = new Semver(runtimeAttr).compare(ruleSemver) >= 0;
6
+ var runtimeSemver = new Semver(runtimeAttr);
7
+ var isGreaterThanEqual = runtimeSemver.compare(ruleSemver) >= 0;
8
+ log.debug(ENGINE_MATCHER_GREATER_SEMVER, [runtimeAttr, ruleAttr, isGreaterThanEqual]);
6
9
  return isGreaterThanEqual;
7
10
  };
8
11
  }
@@ -1,10 +1,15 @@
1
1
  import { setToArray, _Set } from '../../utils/lang/sets';
2
2
  import { Semver } from '../../utils/Semver';
3
+ import { ENGINE_MATCHER_IN_LIST_SEMVER } from '../../logger/constants';
3
4
  export function inListSemverMatcherContext(log, ruleAttr) {
5
+ // @TODO move eventually to `matchersTransform` and validate for all matchers
6
+ if (!ruleAttr || ruleAttr.size === 0)
7
+ throw new Error('whitelistMatcherData is required for IN_LIST_SEMVER matcher type');
4
8
  var listOfSemvers = new _Set(setToArray(ruleAttr).map(function (version) { return new Semver(version).version; }));
5
9
  return function inListSemverMatcher(runtimeAttr) {
6
10
  var runtimeSemver = new Semver(runtimeAttr).version;
7
11
  var isInList = listOfSemvers.has(runtimeSemver);
12
+ log.debug(ENGINE_MATCHER_IN_LIST_SEMVER, [runtimeAttr, setToArray(ruleAttr).join(','), isInList]);
8
13
  return isInList;
9
14
  };
10
15
  }
@@ -1,8 +1,11 @@
1
+ import { ENGINE_MATCHER_LESS_SEMVER } from '../../logger/constants';
1
2
  import { Semver } from '../../utils/Semver';
2
3
  export function lessThanEqualToSemverMatcherContext(log, ruleAttr) {
3
4
  var ruleSemver = new Semver(ruleAttr);
4
5
  return function lessThanEqualToSemverMatcher(runtimeAttr) {
5
- var isLessThenEqual = new Semver(runtimeAttr).compare(ruleSemver) <= 0;
6
- return isLessThenEqual;
6
+ var runtimeSemver = new Semver(runtimeAttr);
7
+ var isLessThanEqual = runtimeSemver.compare(ruleSemver) <= 0;
8
+ log.debug(ENGINE_MATCHER_LESS_SEMVER, [runtimeAttr, ruleAttr, isLessThanEqual]);
9
+ return isLessThanEqual;
7
10
  };
8
11
  }
@@ -1,15 +1,8 @@
1
- import { ENGINE_MATCHER_STRING_INVALID, ENGINE_MATCHER_STRING } from '../../logger/constants';
1
+ import { ENGINE_MATCHER_STRING } from '../../logger/constants';
2
2
  export function stringMatcherContext(log, ruleAttr) {
3
+ var regex = new RegExp(ruleAttr);
3
4
  return function stringMatcher(runtimeAttr) {
4
- var re;
5
- try {
6
- re = new RegExp(ruleAttr);
7
- }
8
- catch (e) {
9
- log.debug(ENGINE_MATCHER_STRING_INVALID, [ruleAttr]);
10
- return false;
11
- }
12
- var regexMatches = re.test(runtimeAttr);
5
+ var regexMatches = regex.test(runtimeAttr);
13
6
  log.debug(ENGINE_MATCHER_STRING, [runtimeAttr, ruleAttr, regexMatches ? 'yes' : 'no']);
14
7
  return regexMatches;
15
8
  };
@@ -2,5 +2,5 @@
2
2
  * Extract whitelist array. Used by set and string matchers
3
3
  */
4
4
  export function setTransform(whitelistObject) {
5
- return whitelistObject.whitelist;
5
+ return whitelistObject && whitelistObject.whitelist;
6
6
  }
@@ -3,5 +3,5 @@ import { _Set } from '../../utils/lang/sets';
3
3
  * Extract whitelist as a set. Used by 'WHITELIST' matcher.
4
4
  */
5
5
  export function whitelistTransform(whitelistObject) {
6
- return new _Set(whitelistObject.whitelist);
6
+ return new _Set(whitelistObject && whitelistObject.whitelist);
7
7
  }
@@ -6,24 +6,37 @@ import { conditionContext } from '../condition';
6
6
  import { ifElseIfCombinerContext } from '../combiners/ifelseif';
7
7
  import { andCombinerContext } from '../combiners/and';
8
8
  import { thenable } from '../../utils/promise/thenable';
9
+ import { ENGINE_MATCHER_ERROR } from '../../logger/constants';
9
10
  export function parser(log, conditions, storage) {
10
11
  var predicates = [];
11
- for (var i = 0; i < conditions.length; i++) {
12
+ var _loop_1 = function (i) {
12
13
  var _a = conditions[i], matcherGroup = _a.matcherGroup, partitions = _a.partitions, label = _a.label, conditionType = _a.conditionType;
13
14
  // transform data structure
14
15
  var matchers = matchersTransform(matcherGroup.matchers);
15
16
  // create a set of pure functions from the matcher's dto
16
- var expressions = matchers.map(function (matcherDto) {
17
- var matcher = matcherFactory(log, matcherDto, storage);
17
+ var expressions = matchers.map(function (matcherDto, index) {
18
+ var matcher;
19
+ try {
20
+ matcher = matcherFactory(log, matcherDto, storage);
21
+ }
22
+ catch (error) {
23
+ log.error(ENGINE_MATCHER_ERROR, [matcherGroup.matchers[index].matcherType, error]);
24
+ }
18
25
  // Evaluator function.
19
26
  return function (key, attributes, splitEvaluator) {
20
27
  var value = sanitizeValue(log, key, matcherDto, attributes);
21
- var result = value !== undefined && matcher ? matcher(value, splitEvaluator) : false;
22
- if (thenable(result)) {
23
- // @ts-ignore
24
- return result.then(function (res) { return Boolean(res ^ matcherDto.negate); });
28
+ var result = false;
29
+ if (value !== undefined && matcher) {
30
+ try {
31
+ result = matcher(value, splitEvaluator);
32
+ }
33
+ catch (error) {
34
+ log.error(ENGINE_MATCHER_ERROR, [matcherGroup.matchers[index].matcherType, error]);
35
+ }
25
36
  }
26
- // @ts-ignore
37
+ if (thenable(result)) { // @ts-ignore
38
+ return result.then(function (res) { return Boolean(res ^ matcherDto.negate); });
39
+ } // @ts-ignore
27
40
  return Boolean(result ^ matcherDto.negate);
28
41
  };
29
42
  });
@@ -31,10 +44,14 @@ export function parser(log, conditions, storage) {
31
44
  if (expressions.length === 0) {
32
45
  // reset any data collected during parsing
33
46
  predicates = [];
34
- // and break the loop
35
- break;
47
+ return "break";
36
48
  }
37
49
  predicates.push(conditionContext(log, andCombinerContext(log, expressions), Treatments.parse(partitions), label, conditionType));
50
+ };
51
+ for (var i = 0; i < conditions.length; i++) {
52
+ var state_1 = _loop_1(i);
53
+ if (state_1 === "break")
54
+ break;
38
55
  }
39
56
  // Instanciate evaluator given the set of conditions using if else if logic
40
57
  return ifElseIfCombinerContext(log, predicates);
@@ -25,7 +25,6 @@ export var ENGINE_MATCHER_LESS = 16;
25
25
  export var ENGINE_MATCHER_PART_OF = 17;
26
26
  export var ENGINE_MATCHER_SEGMENT = 18;
27
27
  export var ENGINE_MATCHER_STRING = 19;
28
- export var ENGINE_MATCHER_STRING_INVALID = 20;
29
28
  export var ENGINE_MATCHER_STARTS_WITH = 21;
30
29
  export var ENGINE_MATCHER_WHITELIST = 22;
31
30
  export var ENGINE_VALUE = 23;
@@ -45,6 +44,11 @@ export var SYNC_TASK_START = 36;
45
44
  export var SYNC_TASK_EXECUTE = 37;
46
45
  export var SYNC_TASK_STOP = 38;
47
46
  export var SETTINGS_SPLITS_FILTER = 39;
47
+ export var ENGINE_MATCHER_EQUAL_SEMVER = 40;
48
+ export var ENGINE_MATCHER_GREATER_SEMVER = 41;
49
+ export var ENGINE_MATCHER_LESS_SEMVER = 42;
50
+ export var ENGINE_MATCHER_BETWEEN_SEMVER = 43;
51
+ export var ENGINE_MATCHER_IN_LIST_SEMVER = 44;
48
52
  export var CLIENT_READY_FROM_CACHE = 100;
49
53
  export var CLIENT_READY = 101;
50
54
  export var IMPRESSION = 102;
@@ -128,6 +132,7 @@ export var ERROR_NOT_BOOLEAN = 325;
128
132
  export var ERROR_MIN_CONFIG_PARAM = 326;
129
133
  export var ERROR_TOO_MANY_SETS = 327;
130
134
  export var ERROR_SETS_FILTER_EXCLUSIVE = 328;
135
+ export var ENGINE_MATCHER_ERROR = 329;
131
136
  // Log prefixes (a.k.a. tags or categories)
132
137
  export var LOG_PREFIX_SETTINGS = 'settings';
133
138
  export var LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
@@ -22,11 +22,15 @@ export var codesDebug = codesInfo.concat([
22
22
  [c.ENGINE_MATCHER_PART_OF, c.LOG_PREFIX_ENGINE_MATCHER + '[partOfMatcher] %s is part of %s? %s'],
23
23
  [c.ENGINE_MATCHER_SEGMENT, c.LOG_PREFIX_ENGINE_MATCHER + '[segmentMatcher] evaluated %s / %s => %s'],
24
24
  [c.ENGINE_MATCHER_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] does %s matches with %s? %s'],
25
- [c.ENGINE_MATCHER_STRING_INVALID, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] %s is an invalid regex'],
26
25
  [c.ENGINE_MATCHER_STARTS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[startsWithMatcher] %s starts with %s? %s'],
27
26
  [c.ENGINE_MATCHER_WHITELIST, c.LOG_PREFIX_ENGINE_MATCHER + '[whitelistMatcher] evaluated %s in [%s] => %s'],
28
27
  [c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute [%s], [%s] will be used for matching.'],
29
28
  [c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize [%s] which should be of type [%s]. Sanitized and processed value => [%s]'],
29
+ [c.ENGINE_MATCHER_EQUAL_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToSemverMatcher] is %s equal to %s? %s'],
30
+ [c.ENGINE_MATCHER_GREATER_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[greaterThanEqualSemverMatcher] is %s greater than %s? %s'],
31
+ [c.ENGINE_MATCHER_LESS_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[lessThanEqualSemverMatcher] is %s less than %s? %s'],
32
+ [c.ENGINE_MATCHER_BETWEEN_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[betweenSemverMatcher] is %s between %s and %s? %s'],
33
+ [c.ENGINE_MATCHER_IN_LIST_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[inListSemverMatcher] is %s in list [%s]? %s'],
30
34
  // SDK
31
35
  [c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'],
32
36
  [c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'],
@@ -2,6 +2,7 @@ import * as c from '../constants';
2
2
  export var codesError = [
3
3
  // evaluator
4
4
  [c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported matcher type found'],
5
+ [c.ENGINE_MATCHER_ERROR, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] %s'],
5
6
  // SDK
6
7
  [c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'],
7
8
  [c.ERROR_CLIENT_CANNOT_GET_READY, 'The SDK will not get ready. Reason: %s'],
@@ -1,3 +1,4 @@
1
+ import { isString } from '../utils/lang';
1
2
  var NUMERIC_IDENTIFIER_REGEX = /^[0-9]+$/;
2
3
  var METADATA_DELIMITER = '+';
3
4
  var PRERELEASE_DELIMITER = '-';
@@ -24,6 +25,8 @@ function throwError(version) {
24
25
  }
25
26
  var Semver = /** @class */ (function () {
26
27
  function Semver(version) {
28
+ if (!isString(version))
29
+ throwError(version);
27
30
  // Separate metadata if exists
28
31
  var index = version.indexOf(METADATA_DELIMITER);
29
32
  var _a = index === -1 ? [version] : [version.slice(0, index), version.slice(index + 1)], vWithoutMetadata = _a[0], metadata = _a[1];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "1.13.2-rc.3",
3
+ "version": "1.13.2-rc.5",
4
4
  "description": "Split JavaScript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -3,10 +3,10 @@ import { ILogger } from '../../logger/types';
3
3
 
4
4
  export function lessThanEqualMatcherContext(log: ILogger, ruleAttr: number) {
5
5
  return function lessThanEqualMatcher(runtimeAttr: number): boolean {
6
- let isLessEqualThan = runtimeAttr <= ruleAttr;
6
+ let isLessThanEqual = runtimeAttr <= ruleAttr;
7
7
 
8
- log.debug(ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessEqualThan]);
8
+ log.debug(ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessThanEqual]);
9
9
 
10
- return isLessEqualThan;
10
+ return isLessThanEqual;
11
11
  };
12
12
  }
@@ -1,17 +1,18 @@
1
1
  import { IBetweenStringMatcherData } from '../../dtos/types';
2
+ import { ENGINE_MATCHER_BETWEEN_SEMVER } from '../../logger/constants';
2
3
  import { ILogger } from '../../logger/types';
3
4
  import { Semver } from '../../utils/Semver';
4
5
 
5
6
  export function betweenSemverMatcherContext(log: ILogger, ruleAttr: IBetweenStringMatcherData) {
6
-
7
7
  const startSemver = new Semver(ruleAttr.start);
8
8
  const endSemver = new Semver(ruleAttr.end);
9
9
 
10
- return function betweenSemverMatcher(key: string): boolean {
10
+ return function betweenSemverMatcher(runtimeAttr: string): boolean {
11
+ const runtimeSemver = new Semver(runtimeAttr);
11
12
 
12
- const runtimeSemver = new Semver(key);
13
+ const isBetween = startSemver.compare(runtimeSemver) <= 0 && endSemver.compare(runtimeSemver) >= 0;
13
14
 
14
- let isBetween = startSemver.compare(runtimeSemver) <= 0 && endSemver.compare(runtimeSemver) >= 0;
15
+ log.debug(ENGINE_MATCHER_BETWEEN_SEMVER, [runtimeAttr, ruleAttr.start, ruleAttr.end, isBetween]);
15
16
 
16
17
  return isBetween;
17
18
  };
@@ -1,12 +1,16 @@
1
+ import { ENGINE_MATCHER_EQUAL_SEMVER } from '../../logger/constants';
1
2
  import { ILogger } from '../../logger/types';
2
3
  import { Semver } from '../../utils/Semver';
3
4
 
4
5
  export function equalToSemverMatcherContext(log: ILogger, ruleAttr: string) {
5
-
6
6
  const ruleSemver = new Semver(ruleAttr);
7
7
 
8
8
  return function equalToSemverMatcher(runtimeAttr: string): boolean {
9
- const isEqual = ruleSemver.version === new Semver(runtimeAttr).version;
9
+ const runtimeSemver = new Semver(runtimeAttr);
10
+
11
+ const isEqual = ruleSemver.version === runtimeSemver.version;
12
+
13
+ log.debug(ENGINE_MATCHER_EQUAL_SEMVER, [runtimeAttr, ruleAttr, isEqual]);
10
14
 
11
15
  return isEqual;
12
16
  };
@@ -1,12 +1,16 @@
1
+ import { ENGINE_MATCHER_GREATER_SEMVER } from '../../logger/constants';
1
2
  import { ILogger } from '../../logger/types';
2
3
  import { Semver } from '../../utils/Semver';
3
4
 
4
5
  export function greaterThanEqualToSemverMatcherContext(log: ILogger, ruleAttr: string) {
5
-
6
6
  const ruleSemver = new Semver(ruleAttr);
7
7
 
8
8
  return function greaterThanEqualToSemverMatcher(runtimeAttr: string): boolean {
9
- let isGreaterThanEqual = new Semver(runtimeAttr).compare(ruleSemver) >= 0;
9
+ const runtimeSemver = new Semver(runtimeAttr);
10
+
11
+ const isGreaterThanEqual = runtimeSemver.compare(ruleSemver) >= 0;
12
+
13
+ log.debug(ENGINE_MATCHER_GREATER_SEMVER, [runtimeAttr, ruleAttr, isGreaterThanEqual]);
10
14
 
11
15
  return isGreaterThanEqual;
12
16
  };
@@ -1,15 +1,21 @@
1
1
  import { setToArray, ISet, _Set } from '../../utils/lang/sets';
2
2
  import { ILogger } from '../../logger/types';
3
3
  import { Semver } from '../../utils/Semver';
4
+ import { ENGINE_MATCHER_IN_LIST_SEMVER } from '../../logger/constants';
4
5
 
5
6
  export function inListSemverMatcherContext(log: ILogger, ruleAttr: ISet<string>) {
7
+ // @TODO move eventually to `matchersTransform` and validate for all matchers
8
+ if (!ruleAttr || ruleAttr.size === 0) throw new Error('whitelistMatcherData is required for IN_LIST_SEMVER matcher type');
6
9
 
7
10
  const listOfSemvers = new _Set(setToArray(ruleAttr).map((version) => new Semver(version).version));
8
11
 
9
12
  return function inListSemverMatcher(runtimeAttr: string): boolean {
10
13
  const runtimeSemver = new Semver(runtimeAttr).version;
14
+
11
15
  const isInList = listOfSemvers.has(runtimeSemver);
12
16
 
17
+ log.debug(ENGINE_MATCHER_IN_LIST_SEMVER, [runtimeAttr, setToArray(ruleAttr).join(','), isInList]);
18
+
13
19
  return isInList;
14
20
  };
15
21
  }
@@ -1,13 +1,17 @@
1
+ import { ENGINE_MATCHER_LESS_SEMVER } from '../../logger/constants';
1
2
  import { ILogger } from '../../logger/types';
2
3
  import { Semver } from '../../utils/Semver';
3
4
 
4
5
  export function lessThanEqualToSemverMatcherContext(log: ILogger, ruleAttr: string) {
5
-
6
6
  const ruleSemver = new Semver(ruleAttr);
7
7
 
8
8
  return function lessThanEqualToSemverMatcher(runtimeAttr: string): boolean {
9
- let isLessThenEqual = new Semver(runtimeAttr).compare(ruleSemver) <= 0;
9
+ const runtimeSemver = new Semver(runtimeAttr);
10
+
11
+ const isLessThanEqual = runtimeSemver.compare(ruleSemver) <= 0;
12
+
13
+ log.debug(ENGINE_MATCHER_LESS_SEMVER, [runtimeAttr, ruleAttr, isLessThanEqual]);
10
14
 
11
- return isLessThenEqual;
15
+ return isLessThanEqual;
12
16
  };
13
17
  }
@@ -1,19 +1,11 @@
1
- import { ENGINE_MATCHER_STRING_INVALID, ENGINE_MATCHER_STRING } from '../../logger/constants';
1
+ import { ENGINE_MATCHER_STRING } from '../../logger/constants';
2
2
  import { ILogger } from '../../logger/types';
3
3
 
4
4
  export function stringMatcherContext(log: ILogger, ruleAttr: string) {
5
- return function stringMatcher(runtimeAttr: string): boolean {
6
- let re;
7
-
8
- try {
9
- re = new RegExp(ruleAttr);
10
- } catch (e) {
11
- log.debug(ENGINE_MATCHER_STRING_INVALID, [ruleAttr]);
5
+ const regex = new RegExp(ruleAttr);
12
6
 
13
- return false;
14
- }
15
-
16
- let regexMatches = re.test(runtimeAttr);
7
+ return function stringMatcher(runtimeAttr: string): boolean {
8
+ const regexMatches = regex.test(runtimeAttr);
17
9
 
18
10
  log.debug(ENGINE_MATCHER_STRING, [runtimeAttr, ruleAttr, regexMatches ? 'yes' : 'no']);
19
11
 
@@ -5,7 +5,7 @@ import { whitelistTransform } from './whitelist';
5
5
  import { setTransform } from './set';
6
6
  import { numericTransform } from './unaryNumeric';
7
7
  import { zeroSinceHH, zeroSinceSS } from '../convertions';
8
- import { IBetweenMatcherData, IInSegmentMatcherData, ISplitMatcher, IUnaryNumericMatcherData, IWhitelistMatcherData } from '../../dtos/types';
8
+ import { IBetweenMatcherData, IInSegmentMatcherData, ISplitMatcher, IUnaryNumericMatcherData } from '../../dtos/types';
9
9
  import { IMatcherDto } from '../types';
10
10
 
11
11
  /**
@@ -40,7 +40,7 @@ export function matchersTransform(matchers: ISplitMatcher[]): IMatcherDto[] {
40
40
  type === matcherTypes.WHITELIST ||
41
41
  type === matcherTypes.IN_LIST_SEMVER
42
42
  ) {
43
- value = whitelistTransform(whitelistMatcherData as IWhitelistMatcherData);
43
+ value = whitelistTransform(whitelistMatcherData);
44
44
  } else if (type === matcherTypes.EQUAL_TO) {
45
45
  value = numericTransform(unaryNumericMatcherData as IUnaryNumericMatcherData);
46
46
  dataType = matcherDataTypes.NUMBER;
@@ -75,14 +75,14 @@ export function matchersTransform(matchers: ISplitMatcher[]): IMatcherDto[] {
75
75
  type === matcherTypes.CONTAINS_ALL_OF_SET ||
76
76
  type === matcherTypes.PART_OF_SET
77
77
  ) {
78
- value = setTransform(whitelistMatcherData as IWhitelistMatcherData);
78
+ value = setTransform(whitelistMatcherData);
79
79
  dataType = matcherDataTypes.SET;
80
80
  } else if (
81
81
  type === matcherTypes.STARTS_WITH ||
82
82
  type === matcherTypes.ENDS_WITH ||
83
83
  type === matcherTypes.CONTAINS_STRING
84
84
  ) {
85
- value = setTransform(whitelistMatcherData as IWhitelistMatcherData);
85
+ value = setTransform(whitelistMatcherData);
86
86
  } else if (type === matcherTypes.IN_SPLIT_TREATMENT) {
87
87
  value = dependencyMatcherData;
88
88
  dataType = matcherDataTypes.NOT_SPECIFIED;
@@ -1,8 +1,8 @@
1
- import { IWhitelistMatcherData } from '../../dtos/types';
1
+ import { ISplitMatcher } from '../../dtos/types';
2
2
 
3
3
  /**
4
4
  * Extract whitelist array. Used by set and string matchers
5
5
  */
6
- export function setTransform(whitelistObject: IWhitelistMatcherData) {
7
- return whitelistObject.whitelist;
6
+ export function setTransform(whitelistObject: ISplitMatcher['whitelistMatcherData']) {
7
+ return whitelistObject && whitelistObject.whitelist;
8
8
  }
@@ -1,9 +1,9 @@
1
- import { IWhitelistMatcherData } from '../../dtos/types';
1
+ import { ISplitMatcher } from '../../dtos/types';
2
2
  import { _Set } from '../../utils/lang/sets';
3
3
 
4
4
  /**
5
5
  * Extract whitelist as a set. Used by 'WHITELIST' matcher.
6
6
  */
7
- export function whitelistTransform(whitelistObject: IWhitelistMatcherData) {
8
- return new _Set(whitelistObject.whitelist);
7
+ export function whitelistTransform(whitelistObject: ISplitMatcher['whitelistMatcherData']) {
8
+ return new _Set(whitelistObject && whitelistObject.whitelist);
9
9
  }
@@ -7,10 +7,11 @@ import { ifElseIfCombinerContext } from '../combiners/ifelseif';
7
7
  import { andCombinerContext } from '../combiners/and';
8
8
  import { thenable } from '../../utils/promise/thenable';
9
9
  import { IEvaluator, IMatcherDto, ISplitEvaluator } from '../types';
10
- import { ISplitCondition } from '../../dtos/types';
10
+ import { ISplitCondition, MaybeThenable } from '../../dtos/types';
11
11
  import { IStorageAsync, IStorageSync } from '../../storages/types';
12
12
  import { SplitIO } from '../../types';
13
13
  import { ILogger } from '../../logger/types';
14
+ import { ENGINE_MATCHER_ERROR } from '../../logger/constants';
14
15
 
15
16
  export function parser(log: ILogger, conditions: ISplitCondition[], storage: IStorageSync | IStorageAsync): IEvaluator {
16
17
  let predicates = [];
@@ -27,19 +28,30 @@ export function parser(log: ILogger, conditions: ISplitCondition[], storage: ISt
27
28
  const matchers = matchersTransform(matcherGroup.matchers);
28
29
 
29
30
  // create a set of pure functions from the matcher's dto
30
- const expressions = matchers.map((matcherDto: IMatcherDto) => {
31
- const matcher = matcherFactory(log, matcherDto, storage);
31
+ const expressions = matchers.map((matcherDto: IMatcherDto, index: number) => {
32
+ let matcher: ReturnType<typeof matcherFactory>;
33
+ try {
34
+ matcher = matcherFactory(log, matcherDto, storage);
35
+ } catch (error) {
36
+ log.error(ENGINE_MATCHER_ERROR, [matcherGroup.matchers[index].matcherType, error]);
37
+ }
32
38
 
33
39
  // Evaluator function.
34
40
  return (key: string, attributes: SplitIO.Attributes | undefined, splitEvaluator: ISplitEvaluator) => {
35
41
  const value = sanitizeValue(log, key, matcherDto, attributes);
36
- const result = value !== undefined && matcher ? matcher(value, splitEvaluator) : false;
42
+ let result: MaybeThenable<boolean> = false;
37
43
 
38
- if (thenable(result)) {
39
- // @ts-ignore
40
- return result.then(res => Boolean(res ^ matcherDto.negate));
44
+ if (value !== undefined && matcher) {
45
+ try {
46
+ result = matcher(value, splitEvaluator);
47
+ } catch (error) {
48
+ log.error(ENGINE_MATCHER_ERROR, [matcherGroup.matchers[index].matcherType, error]);
49
+ }
41
50
  }
42
- // @ts-ignore
51
+
52
+ if (thenable(result)) { // @ts-ignore
53
+ return result.then(res => Boolean(res ^ matcherDto.negate));
54
+ } // @ts-ignore
43
55
  return Boolean(result ^ matcherDto.negate);
44
56
  };
45
57
  });
@@ -25,7 +25,6 @@ export const ENGINE_MATCHER_LESS = 16;
25
25
  export const ENGINE_MATCHER_PART_OF = 17;
26
26
  export const ENGINE_MATCHER_SEGMENT = 18;
27
27
  export const ENGINE_MATCHER_STRING = 19;
28
- export const ENGINE_MATCHER_STRING_INVALID = 20;
29
28
  export const ENGINE_MATCHER_STARTS_WITH = 21;
30
29
  export const ENGINE_MATCHER_WHITELIST = 22;
31
30
  export const ENGINE_VALUE = 23;
@@ -45,6 +44,11 @@ export const SYNC_TASK_START = 36;
45
44
  export const SYNC_TASK_EXECUTE = 37;
46
45
  export const SYNC_TASK_STOP = 38;
47
46
  export const SETTINGS_SPLITS_FILTER = 39;
47
+ export const ENGINE_MATCHER_EQUAL_SEMVER = 40;
48
+ export const ENGINE_MATCHER_GREATER_SEMVER = 41;
49
+ export const ENGINE_MATCHER_LESS_SEMVER = 42;
50
+ export const ENGINE_MATCHER_BETWEEN_SEMVER = 43;
51
+ export const ENGINE_MATCHER_IN_LIST_SEMVER = 44;
48
52
 
49
53
  export const CLIENT_READY_FROM_CACHE = 100;
50
54
  export const CLIENT_READY = 101;
@@ -131,6 +135,7 @@ export const ERROR_NOT_BOOLEAN = 325;
131
135
  export const ERROR_MIN_CONFIG_PARAM = 326;
132
136
  export const ERROR_TOO_MANY_SETS = 327;
133
137
  export const ERROR_SETS_FILTER_EXCLUSIVE = 328;
138
+ export const ENGINE_MATCHER_ERROR = 329;
134
139
 
135
140
  // Log prefixes (a.k.a. tags or categories)
136
141
  export const LOG_PREFIX_SETTINGS = 'settings';
@@ -23,11 +23,15 @@ export const codesDebug: [number, string][] = codesInfo.concat([
23
23
  [c.ENGINE_MATCHER_PART_OF, c.LOG_PREFIX_ENGINE_MATCHER + '[partOfMatcher] %s is part of %s? %s'],
24
24
  [c.ENGINE_MATCHER_SEGMENT, c.LOG_PREFIX_ENGINE_MATCHER + '[segmentMatcher] evaluated %s / %s => %s'],
25
25
  [c.ENGINE_MATCHER_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] does %s matches with %s? %s'],
26
- [c.ENGINE_MATCHER_STRING_INVALID, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] %s is an invalid regex'],
27
26
  [c.ENGINE_MATCHER_STARTS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[startsWithMatcher] %s starts with %s? %s'],
28
27
  [c.ENGINE_MATCHER_WHITELIST, c.LOG_PREFIX_ENGINE_MATCHER + '[whitelistMatcher] evaluated %s in [%s] => %s'],
29
28
  [c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute [%s], [%s] will be used for matching.'],
30
29
  [c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize [%s] which should be of type [%s]. Sanitized and processed value => [%s]'],
30
+ [c.ENGINE_MATCHER_EQUAL_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToSemverMatcher] is %s equal to %s? %s'],
31
+ [c.ENGINE_MATCHER_GREATER_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[greaterThanEqualSemverMatcher] is %s greater than %s? %s'],
32
+ [c.ENGINE_MATCHER_LESS_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[lessThanEqualSemverMatcher] is %s less than %s? %s'],
33
+ [c.ENGINE_MATCHER_BETWEEN_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[betweenSemverMatcher] is %s between %s and %s? %s'],
34
+ [c.ENGINE_MATCHER_IN_LIST_SEMVER, c.LOG_PREFIX_ENGINE_MATCHER + '[inListSemverMatcher] is %s in list [%s]? %s'],
31
35
  // SDK
32
36
  [c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'],
33
37
  [c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'],
@@ -3,6 +3,7 @@ import * as c from '../constants';
3
3
  export const codesError: [number, string][] = [
4
4
  // evaluator
5
5
  [c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported matcher type found'],
6
+ [c.ENGINE_MATCHER_ERROR, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] %s'],
6
7
  // SDK
7
8
  [c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'],
8
9
  [c.ERROR_CLIENT_CANNOT_GET_READY, 'The SDK will not get ready. Reason: %s'],
@@ -1,3 +1,5 @@
1
+ import { isString } from '../utils/lang';
2
+
1
3
  const NUMERIC_IDENTIFIER_REGEX = /^[0-9]+$/;
2
4
 
3
5
  const METADATA_DELIMITER = '+';
@@ -39,6 +41,8 @@ export class Semver {
39
41
  public readonly version: string;
40
42
 
41
43
  public constructor(version: string) {
44
+ if (!isString(version)) throwError(version);
45
+
42
46
  // Separate metadata if exists
43
47
  let index = version.indexOf(METADATA_DELIMITER);
44
48
  let [vWithoutMetadata, metadata] = index === -1 ? [version] : [version.slice(0, index), version.slice(index + 1)];
@@ -1,3 +1,3 @@
1
1
  import { IBetweenStringMatcherData } from '../../dtos/types';
2
2
  import { ILogger } from '../../logger/types';
3
- export declare function betweenSemverMatcherContext(log: ILogger, ruleAttr: IBetweenStringMatcherData): (key: string) => boolean;
3
+ export declare function betweenSemverMatcherContext(log: ILogger, ruleAttr: IBetweenStringMatcherData): (runtimeAttr: string) => boolean;
@@ -1,5 +1,5 @@
1
- import { IWhitelistMatcherData } from '../../dtos/types';
1
+ import { ISplitMatcher } from '../../dtos/types';
2
2
  /**
3
3
  * Extract whitelist array. Used by set and string matchers
4
4
  */
5
- export declare function setTransform(whitelistObject: IWhitelistMatcherData): string[];
5
+ export declare function setTransform(whitelistObject: ISplitMatcher['whitelistMatcherData']): string[] | null | undefined;
@@ -0,0 +1,7 @@
1
+ import { ISplitMatcher } from '../../dtos/types';
2
+ /**
3
+ * Extract value from string matcher data.
4
+ */
5
+ export declare function stringTransform({ stringMatcherData }: ISplitMatcher): {
6
+ value: string | null | undefined;
7
+ };
@@ -1,5 +1,5 @@
1
- import { IWhitelistMatcherData } from '../../dtos/types';
1
+ import { ISplitMatcher } from '../../dtos/types';
2
2
  /**
3
3
  * Extract whitelist as a set. Used by 'WHITELIST' matcher.
4
4
  */
5
- export declare function whitelistTransform(whitelistObject: IWhitelistMatcherData): import("../../utils/lang/sets").ISet<string>;
5
+ export declare function whitelistTransform(whitelistObject: ISplitMatcher['whitelistMatcherData']): import("../../utils/lang/sets").ISet<string>;
@@ -25,7 +25,6 @@ export declare const ENGINE_MATCHER_LESS = 16;
25
25
  export declare const ENGINE_MATCHER_PART_OF = 17;
26
26
  export declare const ENGINE_MATCHER_SEGMENT = 18;
27
27
  export declare const ENGINE_MATCHER_STRING = 19;
28
- export declare const ENGINE_MATCHER_STRING_INVALID = 20;
29
28
  export declare const ENGINE_MATCHER_STARTS_WITH = 21;
30
29
  export declare const ENGINE_MATCHER_WHITELIST = 22;
31
30
  export declare const ENGINE_VALUE = 23;
@@ -45,6 +44,11 @@ export declare const SYNC_TASK_START = 36;
45
44
  export declare const SYNC_TASK_EXECUTE = 37;
46
45
  export declare const SYNC_TASK_STOP = 38;
47
46
  export declare const SETTINGS_SPLITS_FILTER = 39;
47
+ export declare const ENGINE_MATCHER_EQUAL_SEMVER = 40;
48
+ export declare const ENGINE_MATCHER_GREATER_SEMVER = 41;
49
+ export declare const ENGINE_MATCHER_LESS_SEMVER = 42;
50
+ export declare const ENGINE_MATCHER_BETWEEN_SEMVER = 43;
51
+ export declare const ENGINE_MATCHER_IN_LIST_SEMVER = 44;
48
52
  export declare const CLIENT_READY_FROM_CACHE = 100;
49
53
  export declare const CLIENT_READY = 101;
50
54
  export declare const IMPRESSION = 102;
@@ -128,6 +132,7 @@ export declare const ERROR_NOT_BOOLEAN = 325;
128
132
  export declare const ERROR_MIN_CONFIG_PARAM = 326;
129
133
  export declare const ERROR_TOO_MANY_SETS = 327;
130
134
  export declare const ERROR_SETS_FILTER_EXCLUSIVE = 328;
135
+ export declare const ENGINE_MATCHER_ERROR = 329;
131
136
  export declare const LOG_PREFIX_SETTINGS = "settings";
132
137
  export declare const LOG_PREFIX_INSTANTIATION = "Factory instantiation";
133
138
  export declare const LOG_PREFIX_ENGINE = "engine";