@splitsoftware/splitio-commons 1.13.2-rc.2 → 1.13.2-rc.4
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.
- package/CHANGES.txt +0 -1
- package/cjs/evaluator/matchers/gte.js +3 -3
- package/cjs/evaluator/matchers/index.js +11 -1
- package/cjs/evaluator/matchers/matcherTypes.js +6 -1
- package/cjs/evaluator/matchers/semver_between.js +14 -0
- package/cjs/evaluator/matchers/semver_eq.js +13 -0
- package/cjs/evaluator/matchers/semver_gte.js +13 -0
- package/cjs/evaluator/matchers/semver_inlist.js +14 -0
- package/cjs/evaluator/matchers/semver_lte.js +13 -0
- package/cjs/evaluator/matchers/string.js +2 -9
- package/cjs/evaluator/matchersTransform/index.js +20 -13
- package/cjs/evaluator/parser/index.js +27 -10
- package/cjs/logger/constants.js +4 -4
- package/cjs/logger/messages/debug.js +0 -1
- package/cjs/logger/messages/error.js +1 -0
- package/cjs/services/splitApi.js +5 -5
- package/cjs/storages/KeyBuilder.js +2 -3
- package/cjs/utils/Semver.js +103 -0
- package/cjs/utils/constants/index.js +1 -2
- package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
- package/esm/evaluator/matchers/gte.js +3 -3
- package/esm/evaluator/matchers/index.js +11 -1
- package/esm/evaluator/matchers/matcherTypes.js +6 -1
- package/esm/evaluator/matchers/semver_between.js +10 -0
- package/esm/evaluator/matchers/semver_eq.js +9 -0
- package/esm/evaluator/matchers/semver_gte.js +9 -0
- package/esm/evaluator/matchers/semver_inlist.js +10 -0
- package/esm/evaluator/matchers/semver_lte.js +9 -0
- package/esm/evaluator/matchers/string.js +3 -10
- package/esm/evaluator/matchersTransform/index.js +20 -13
- package/esm/evaluator/parser/index.js +27 -10
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/debug.js +0 -1
- package/esm/logger/messages/error.js +1 -0
- package/esm/services/splitApi.js +6 -6
- package/esm/storages/KeyBuilder.js +2 -3
- package/esm/utils/Semver.js +100 -0
- package/esm/utils/constants/index.js +0 -1
- package/esm/utils/settingsValidation/logger/pluggableLogger.js +1 -1
- package/package.json +1 -2
- package/src/dtos/types.ts +34 -1
- package/src/evaluator/matchers/between.ts +1 -1
- package/src/evaluator/matchers/boolean.ts +1 -1
- package/src/evaluator/matchers/cont_all.ts +1 -1
- package/src/evaluator/matchers/cont_any.ts +1 -1
- package/src/evaluator/matchers/cont_str.ts +1 -1
- package/src/evaluator/matchers/eq.ts +1 -1
- package/src/evaluator/matchers/eq_set.ts +1 -1
- package/src/evaluator/matchers/ew.ts +1 -1
- package/src/evaluator/matchers/gte.ts +4 -4
- package/src/evaluator/matchers/index.ts +28 -18
- package/src/evaluator/matchers/lte.ts +1 -1
- package/src/evaluator/matchers/matcherTypes.ts +6 -1
- package/src/evaluator/matchers/part_of.ts +1 -1
- package/src/evaluator/matchers/semver_between.ts +16 -0
- package/src/evaluator/matchers/semver_eq.ts +14 -0
- package/src/evaluator/matchers/semver_gte.ts +14 -0
- package/src/evaluator/matchers/semver_inlist.ts +15 -0
- package/src/evaluator/matchers/semver_lte.ts +14 -0
- package/src/evaluator/matchers/string.ts +5 -13
- package/src/evaluator/matchers/sw.ts +1 -1
- package/src/evaluator/matchers/whitelist.ts +1 -1
- package/src/evaluator/matchersTransform/index.ts +32 -21
- package/src/evaluator/parser/index.ts +20 -8
- package/src/evaluator/types.ts +2 -2
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/debug.ts +0 -1
- package/src/logger/messages/error.ts +1 -0
- package/src/services/splitApi.ts +6 -5
- package/src/storages/KeyBuilder.ts +2 -3
- package/src/utils/Semver.ts +111 -0
- package/src/utils/constants/index.ts +0 -2
- package/src/utils/settingsValidation/logger/pluggableLogger.ts +1 -1
- package/types/dtos/types.d.ts +26 -1
- package/types/evaluator/matchers/semver_between.d.ts +2 -2
- package/types/evaluator/matchers/semver_inlist.d.ts +3 -0
- package/types/evaluator/matchersTransform/string.d.ts +7 -0
- package/types/evaluator/types.d.ts +2 -2
- package/types/logger/constants.d.ts +1 -1
- package/types/storages/KeyBuilder.d.ts +1 -1
- package/types/utils/constants/index.d.ts +0 -1
- package/types/utils/semVer.d.ts +8 -15
package/CHANGES.txt
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
1.14.0 (April XX, 2024)
|
|
2
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.
|
|
4
3
|
|
|
5
4
|
1.13.1 (January 10, 2024)
|
|
6
5
|
- 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.
|
|
@@ -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
|
|
8
|
-
log.debug(constants_1.ENGINE_MATCHER_GREATER, [runtimeAttr, ruleAttr,
|
|
9
|
-
return
|
|
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
|
|
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.
|
|
@@ -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(key) {
|
|
9
|
+
var runtimeSemver = new Semver_1.Semver(key);
|
|
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,14 @@
|
|
|
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
|
+
var listOfSemvers = new sets_1._Set((0, sets_1.setToArray)(ruleAttr).map(function (version) { return new Semver_1.Semver(version).version; }));
|
|
8
|
+
return function inListSemverMatcher(runtimeAttr) {
|
|
9
|
+
var runtimeSemver = new Semver_1.Semver(runtimeAttr).version;
|
|
10
|
+
var isInList = listOfSemvers.has(runtimeSemver);
|
|
11
|
+
return isInList;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
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 isLessThenEqual = runtimeSemver.compare(ruleSemver) <= 0;
|
|
10
|
+
return isLessThenEqual;
|
|
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
|
|
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
|
};
|
|
@@ -13,37 +13,38 @@ var convertions_1 = require("../convertions");
|
|
|
13
13
|
*/
|
|
14
14
|
function matchersTransform(matchers) {
|
|
15
15
|
var parsedMatchers = matchers.map(function (matcher) {
|
|
16
|
-
var matcherType = matcher.matcherType
|
|
16
|
+
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
17
|
var attribute = keySelector && keySelector.attribute;
|
|
18
18
|
var type = (0, matcherTypes_1.matcherTypesMapper)(matcherType);
|
|
19
19
|
// As default input data type we use string (even for ALL_KEYS)
|
|
20
20
|
var dataType = matcherTypes_1.matcherDataTypes.STRING;
|
|
21
21
|
var value = undefined;
|
|
22
22
|
if (type === matcherTypes_1.matcherTypes.IN_SEGMENT) {
|
|
23
|
-
value = (0, segment_1.segmentTransform)(
|
|
23
|
+
value = (0, segment_1.segmentTransform)(userDefinedSegmentMatcherData);
|
|
24
24
|
}
|
|
25
|
-
else if (type === matcherTypes_1.matcherTypes.WHITELIST
|
|
26
|
-
|
|
25
|
+
else if (type === matcherTypes_1.matcherTypes.WHITELIST ||
|
|
26
|
+
type === matcherTypes_1.matcherTypes.IN_LIST_SEMVER) {
|
|
27
|
+
value = (0, whitelist_1.whitelistTransform)(whitelistMatcherData);
|
|
27
28
|
}
|
|
28
29
|
else if (type === matcherTypes_1.matcherTypes.EQUAL_TO) {
|
|
29
|
-
value = (0, unaryNumeric_1.numericTransform)(
|
|
30
|
+
value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
|
|
30
31
|
dataType = matcherTypes_1.matcherDataTypes.NUMBER;
|
|
31
|
-
if (
|
|
32
|
+
if (unaryNumericMatcherData.dataType === 'DATETIME') {
|
|
32
33
|
value = (0, convertions_1.zeroSinceHH)(value);
|
|
33
34
|
dataType = matcherTypes_1.matcherDataTypes.DATETIME;
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
else if (type === matcherTypes_1.matcherTypes.GREATER_THAN_OR_EQUAL_TO ||
|
|
37
38
|
type === matcherTypes_1.matcherTypes.LESS_THAN_OR_EQUAL_TO) {
|
|
38
|
-
value = (0, unaryNumeric_1.numericTransform)(
|
|
39
|
+
value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
|
|
39
40
|
dataType = matcherTypes_1.matcherDataTypes.NUMBER;
|
|
40
|
-
if (
|
|
41
|
+
if (unaryNumericMatcherData.dataType === 'DATETIME') {
|
|
41
42
|
value = (0, convertions_1.zeroSinceSS)(value);
|
|
42
43
|
dataType = matcherTypes_1.matcherDataTypes.DATETIME;
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
else if (type === matcherTypes_1.matcherTypes.BETWEEN) {
|
|
46
|
-
value =
|
|
47
|
+
value = betweenMatcherData;
|
|
47
48
|
dataType = matcherTypes_1.matcherDataTypes.NUMBER;
|
|
48
49
|
if (value.dataType === 'DATETIME') {
|
|
49
50
|
value.start = (0, convertions_1.zeroSinceSS)(value.start);
|
|
@@ -51,27 +52,33 @@ function matchersTransform(matchers) {
|
|
|
51
52
|
dataType = matcherTypes_1.matcherDataTypes.DATETIME;
|
|
52
53
|
}
|
|
53
54
|
}
|
|
55
|
+
else if (type === matcherTypes_1.matcherTypes.BETWEEN_SEMVER) {
|
|
56
|
+
value = betweenStringMatcherData;
|
|
57
|
+
}
|
|
54
58
|
else if (type === matcherTypes_1.matcherTypes.EQUAL_TO_SET ||
|
|
55
59
|
type === matcherTypes_1.matcherTypes.CONTAINS_ANY_OF_SET ||
|
|
56
60
|
type === matcherTypes_1.matcherTypes.CONTAINS_ALL_OF_SET ||
|
|
57
61
|
type === matcherTypes_1.matcherTypes.PART_OF_SET) {
|
|
58
|
-
value = (0, set_1.setTransform)(
|
|
62
|
+
value = (0, set_1.setTransform)(whitelistMatcherData);
|
|
59
63
|
dataType = matcherTypes_1.matcherDataTypes.SET;
|
|
60
64
|
}
|
|
61
65
|
else if (type === matcherTypes_1.matcherTypes.STARTS_WITH ||
|
|
62
66
|
type === matcherTypes_1.matcherTypes.ENDS_WITH ||
|
|
63
67
|
type === matcherTypes_1.matcherTypes.CONTAINS_STRING) {
|
|
64
|
-
value = (0, set_1.setTransform)(
|
|
68
|
+
value = (0, set_1.setTransform)(whitelistMatcherData);
|
|
65
69
|
}
|
|
66
70
|
else if (type === matcherTypes_1.matcherTypes.IN_SPLIT_TREATMENT) {
|
|
67
|
-
value =
|
|
71
|
+
value = dependencyMatcherData;
|
|
68
72
|
dataType = matcherTypes_1.matcherDataTypes.NOT_SPECIFIED;
|
|
69
73
|
}
|
|
70
74
|
else if (type === matcherTypes_1.matcherTypes.EQUAL_TO_BOOLEAN) {
|
|
71
75
|
dataType = matcherTypes_1.matcherDataTypes.BOOLEAN;
|
|
72
76
|
value = booleanMatcherData;
|
|
73
77
|
}
|
|
74
|
-
else if (type === matcherTypes_1.matcherTypes.MATCHES_STRING
|
|
78
|
+
else if (type === matcherTypes_1.matcherTypes.MATCHES_STRING ||
|
|
79
|
+
type === matcherTypes_1.matcherTypes.EQUAL_TO_SEMVER ||
|
|
80
|
+
type === matcherTypes_1.matcherTypes.GREATER_THAN_OR_EQUAL_TO_SEMVER ||
|
|
81
|
+
type === matcherTypes_1.matcherTypes.LESS_THAN_OR_EQUAL_TO_SEMVER) {
|
|
75
82
|
value = stringMatcherData;
|
|
76
83
|
}
|
|
77
84
|
return {
|
|
@@ -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
|
-
|
|
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
|
|
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 =
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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);
|
package/cjs/logger/constants.js
CHANGED
|
@@ -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.
|
|
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 =
|
|
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 =
|
|
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';
|
|
@@ -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.'],
|
|
@@ -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'],
|
package/cjs/services/splitApi.js
CHANGED
|
@@ -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) { // `userMatchingKeys` is undefined
|
|
35
|
+
var url = urls.auth + "/v2/auth";
|
|
36
|
+
if (userMatchingKeys) { // accounting the possibility that `userMatchingKeys` is undefined (server-side API)
|
|
37
37
|
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
38
|
-
if (queryParams)
|
|
39
|
-
url += '
|
|
38
|
+
if (queryParams) // accounting the possibility that `userKeys` and thus `queryParams` are empty
|
|
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?
|
|
44
|
+
var url = urls.sdk + "/splitChanges?since=" + since + (till ? '&till=' + till : '') + (filterQueryString || '');
|
|
45
45
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS))
|
|
46
46
|
.catch(function (err) {
|
|
47
47
|
if (err.statusCode === 414)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getStorageHash = exports.KeyBuilder = exports.validatePrefix = void 0;
|
|
4
|
-
var constants_1 = require("../utils/constants");
|
|
5
4
|
var lang_1 = require("../utils/lang");
|
|
6
5
|
var murmur3_1 = require("../utils/murmur3/murmur3");
|
|
7
6
|
var everythingAtTheEnd = /[^.]+$/;
|
|
@@ -67,10 +66,10 @@ var KeyBuilder = /** @class */ (function () {
|
|
|
67
66
|
}());
|
|
68
67
|
exports.KeyBuilder = KeyBuilder;
|
|
69
68
|
/**
|
|
70
|
-
* Generates a murmur32 hash based on the authorization key
|
|
69
|
+
* Generates a murmur32 hash based on the authorization key and the feature flags filter query.
|
|
71
70
|
* The hash is in hexadecimal format (8 characters max, 32 bits).
|
|
72
71
|
*/
|
|
73
72
|
function getStorageHash(settings) {
|
|
74
|
-
return (0, murmur3_1.hash)(settings.core.authorizationKey + "::" + settings.sync.__splitFiltersValidation.queryString
|
|
73
|
+
return (0, murmur3_1.hash)(settings.core.authorizationKey + "::" + settings.sync.__splitFiltersValidation.queryString).toString(16);
|
|
75
74
|
}
|
|
76
75
|
exports.getStorageHash = getStorageHash;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Semver = void 0;
|
|
4
|
+
var lang_1 = require("../utils/lang");
|
|
5
|
+
var NUMERIC_IDENTIFIER_REGEX = /^[0-9]+$/;
|
|
6
|
+
var METADATA_DELIMITER = '+';
|
|
7
|
+
var PRERELEASE_DELIMITER = '-';
|
|
8
|
+
var VALUE_DELIMITER = '.';
|
|
9
|
+
/**
|
|
10
|
+
* Compares two strings. If both strings are numeric identifiers, they are compared numerically. Otherwise, they are compared lexicographically.
|
|
11
|
+
* This could be implemented using `a.localeCompare(b, undefined, { numeric: true })` but locale options are not broadly supported.
|
|
12
|
+
*/
|
|
13
|
+
function compareStrings(a, b) {
|
|
14
|
+
if (NUMERIC_IDENTIFIER_REGEX.test(a) && NUMERIC_IDENTIFIER_REGEX.test(b)) {
|
|
15
|
+
var result = a.length - b.length;
|
|
16
|
+
if (result !== 0) {
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
21
|
+
}
|
|
22
|
+
// Sanitizes a numeric identifier by removing leading zeros
|
|
23
|
+
function sanitizeNumericIdentifier(value) {
|
|
24
|
+
return value.replace(/^0+(?=\d)/, '');
|
|
25
|
+
}
|
|
26
|
+
function throwError(version) {
|
|
27
|
+
throw new Error('Unable to convert to Semver, incorrect format: ' + version);
|
|
28
|
+
}
|
|
29
|
+
var Semver = /** @class */ (function () {
|
|
30
|
+
function Semver(version) {
|
|
31
|
+
if (!(0, lang_1.isString)(version))
|
|
32
|
+
throwError(version);
|
|
33
|
+
// Separate metadata if exists
|
|
34
|
+
var index = version.indexOf(METADATA_DELIMITER);
|
|
35
|
+
var _a = index === -1 ? [version] : [version.slice(0, index), version.slice(index + 1)], vWithoutMetadata = _a[0], metadata = _a[1];
|
|
36
|
+
if (metadata === '')
|
|
37
|
+
throwError(version);
|
|
38
|
+
// Set pre-release versions if exists
|
|
39
|
+
index = vWithoutMetadata.indexOf(PRERELEASE_DELIMITER);
|
|
40
|
+
if (index === -1) {
|
|
41
|
+
this._isStable = true;
|
|
42
|
+
this._preRelease = [];
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this._isStable = false;
|
|
46
|
+
this._preRelease = vWithoutMetadata.slice(index + 1).split(VALUE_DELIMITER).map(function (value) {
|
|
47
|
+
if (!value)
|
|
48
|
+
throwError(version);
|
|
49
|
+
return NUMERIC_IDENTIFIER_REGEX.test(value) ?
|
|
50
|
+
sanitizeNumericIdentifier(value) :
|
|
51
|
+
value;
|
|
52
|
+
});
|
|
53
|
+
vWithoutMetadata = vWithoutMetadata.slice(0, index);
|
|
54
|
+
}
|
|
55
|
+
// Set major, minor, and patch versions
|
|
56
|
+
var vParts = vWithoutMetadata.split(VALUE_DELIMITER).map(function (value) {
|
|
57
|
+
if (!value || !NUMERIC_IDENTIFIER_REGEX.test(value))
|
|
58
|
+
throwError(version);
|
|
59
|
+
return sanitizeNumericIdentifier(value);
|
|
60
|
+
});
|
|
61
|
+
if (vParts.length !== 3)
|
|
62
|
+
throwError(version);
|
|
63
|
+
this._major = vParts[0];
|
|
64
|
+
this._minor = vParts[1];
|
|
65
|
+
this._patch = vParts[2];
|
|
66
|
+
// Set version string
|
|
67
|
+
this.version = vParts.join(VALUE_DELIMITER);
|
|
68
|
+
if (this._preRelease.length)
|
|
69
|
+
this.version += PRERELEASE_DELIMITER + this._preRelease.join(VALUE_DELIMITER);
|
|
70
|
+
if (metadata)
|
|
71
|
+
this.version += METADATA_DELIMITER + metadata;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Precedence comparision between 2 Semver objects.
|
|
75
|
+
*
|
|
76
|
+
* @return `0` if `this === toCompare`, `-1` if `this < toCompare`, and `1` if `this > toCompare`
|
|
77
|
+
*/
|
|
78
|
+
Semver.prototype.compare = function (toCompare) {
|
|
79
|
+
if (this.version === toCompare.version)
|
|
80
|
+
return 0;
|
|
81
|
+
var result = compareStrings(this._major, toCompare._major);
|
|
82
|
+
if (result !== 0)
|
|
83
|
+
return result;
|
|
84
|
+
result = compareStrings(this._minor, toCompare._minor);
|
|
85
|
+
if (result !== 0)
|
|
86
|
+
return result;
|
|
87
|
+
result = compareStrings(this._patch, toCompare._patch);
|
|
88
|
+
if (result !== 0)
|
|
89
|
+
return result;
|
|
90
|
+
if (!this._isStable && toCompare._isStable)
|
|
91
|
+
return -1;
|
|
92
|
+
if (this._isStable && !toCompare._isStable)
|
|
93
|
+
return 1;
|
|
94
|
+
for (var i = 0, length_1 = Math.min(this._preRelease.length, toCompare._preRelease.length); i < length_1; i++) {
|
|
95
|
+
var result_1 = compareStrings(this._preRelease[i], toCompare._preRelease[i]);
|
|
96
|
+
if (result_1 !== 0)
|
|
97
|
+
return result_1;
|
|
98
|
+
}
|
|
99
|
+
return this._preRelease.length - toCompare._preRelease.length;
|
|
100
|
+
};
|
|
101
|
+
return Semver;
|
|
102
|
+
}());
|
|
103
|
+
exports.Semver = Semver;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MY_SEGMENT = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
|
|
5
5
|
// Special treatments
|
|
6
6
|
exports.CONTROL = 'control';
|
|
7
7
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -90,4 +90,3 @@ exports.NON_REQUESTED = 1;
|
|
|
90
90
|
exports.DISABLED = 0;
|
|
91
91
|
exports.ENABLED = 1;
|
|
92
92
|
exports.PAUSED = 2;
|
|
93
|
-
exports.FLAGS_SPEC = '1.1';
|
|
@@ -4,7 +4,7 @@ exports.validateLogger = void 0;
|
|
|
4
4
|
var logger_1 = require("../../../logger");
|
|
5
5
|
var commons_1 = require("./commons");
|
|
6
6
|
function isLogger(log) {
|
|
7
|
-
return log && typeof log.debug === 'function' && typeof log.info === 'function' && typeof log.warn === 'function' && typeof log.error === 'function' && typeof log.setLogLevel === 'function';
|
|
7
|
+
return log !== null && typeof log === 'object' && typeof log.debug === 'function' && typeof log.info === 'function' && typeof log.warn === 'function' && typeof log.error === 'function' && typeof log.setLogLevel === 'function';
|
|
8
8
|
}
|
|
9
9
|
// By default it starts disabled.
|
|
10
10
|
var initialLogLevel = logger_1.LogLevels.NONE;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ENGINE_MATCHER_GREATER } from '../../logger/constants';
|
|
2
2
|
export function greaterThanEqualMatcherContext(log, ruleAttr) {
|
|
3
3
|
return function greaterThanEqualMatcher(runtimeAttr) {
|
|
4
|
-
var
|
|
5
|
-
log.debug(ENGINE_MATCHER_GREATER, [runtimeAttr, ruleAttr,
|
|
6
|
-
return
|
|
4
|
+
var isGreaterThanEqual = runtimeAttr >= ruleAttr;
|
|
5
|
+
log.debug(ENGINE_MATCHER_GREATER, [runtimeAttr, ruleAttr, isGreaterThanEqual]);
|
|
6
|
+
return isGreaterThanEqual;
|
|
7
7
|
};
|
|
8
8
|
}
|
|
@@ -15,6 +15,11 @@ import { containsStringMatcherContext } from './cont_str';
|
|
|
15
15
|
import { dependencyMatcherContext } from './dependency';
|
|
16
16
|
import { booleanMatcherContext } from './boolean';
|
|
17
17
|
import { stringMatcherContext } from './string';
|
|
18
|
+
import { equalToSemverMatcherContext } from './semver_eq';
|
|
19
|
+
import { greaterThanEqualToSemverMatcherContext } from './semver_gte';
|
|
20
|
+
import { lessThanEqualToSemverMatcherContext } from './semver_lte';
|
|
21
|
+
import { betweenSemverMatcherContext } from './semver_between';
|
|
22
|
+
import { inListSemverMatcherContext } from './semver_inlist';
|
|
18
23
|
var matchers = [
|
|
19
24
|
undefined,
|
|
20
25
|
allMatcherContext,
|
|
@@ -33,7 +38,12 @@ var matchers = [
|
|
|
33
38
|
containsStringMatcherContext,
|
|
34
39
|
dependencyMatcherContext,
|
|
35
40
|
booleanMatcherContext,
|
|
36
|
-
stringMatcherContext
|
|
41
|
+
stringMatcherContext,
|
|
42
|
+
equalToSemverMatcherContext,
|
|
43
|
+
greaterThanEqualToSemverMatcherContext,
|
|
44
|
+
lessThanEqualToSemverMatcherContext,
|
|
45
|
+
betweenSemverMatcherContext,
|
|
46
|
+
inListSemverMatcherContext, // IN_LIST_SEMVER: 22
|
|
37
47
|
];
|
|
38
48
|
/**
|
|
39
49
|
* Matcher factory.
|
|
@@ -16,7 +16,12 @@ export var matcherTypes = {
|
|
|
16
16
|
CONTAINS_STRING: 14,
|
|
17
17
|
IN_SPLIT_TREATMENT: 15,
|
|
18
18
|
EQUAL_TO_BOOLEAN: 16,
|
|
19
|
-
MATCHES_STRING: 17
|
|
19
|
+
MATCHES_STRING: 17,
|
|
20
|
+
EQUAL_TO_SEMVER: 18,
|
|
21
|
+
GREATER_THAN_OR_EQUAL_TO_SEMVER: 19,
|
|
22
|
+
LESS_THAN_OR_EQUAL_TO_SEMVER: 20,
|
|
23
|
+
BETWEEN_SEMVER: 21,
|
|
24
|
+
IN_LIST_SEMVER: 22,
|
|
20
25
|
};
|
|
21
26
|
export var matcherDataTypes = {
|
|
22
27
|
BOOLEAN: 'BOOLEAN',
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Semver } from '../../utils/Semver';
|
|
2
|
+
export function betweenSemverMatcherContext(log, ruleAttr) {
|
|
3
|
+
var startSemver = new Semver(ruleAttr.start);
|
|
4
|
+
var endSemver = new Semver(ruleAttr.end);
|
|
5
|
+
return function betweenSemverMatcher(key) {
|
|
6
|
+
var runtimeSemver = new Semver(key);
|
|
7
|
+
var isBetween = startSemver.compare(runtimeSemver) <= 0 && endSemver.compare(runtimeSemver) >= 0;
|
|
8
|
+
return isBetween;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Semver } from '../../utils/Semver';
|
|
2
|
+
export function equalToSemverMatcherContext(log, ruleAttr) {
|
|
3
|
+
var ruleSemver = new Semver(ruleAttr);
|
|
4
|
+
return function equalToSemverMatcher(runtimeAttr) {
|
|
5
|
+
var runtimeSemver = new Semver(runtimeAttr);
|
|
6
|
+
var isEqual = ruleSemver.version === runtimeSemver.version;
|
|
7
|
+
return isEqual;
|
|
8
|
+
};
|
|
9
|
+
}
|