configcat-common
Version:
ConfigCat is a configuration as a service that lets you manage your features and configurations without actually deploying new code.
228 lines (227 loc) • 13.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.valueToString = exports.formatSegmentComparator = exports.formatPrerequisiteFlagComparator = exports.formatUserCondition = exports.formatUserComparator = exports.EvaluateLogBuilder = void 0;
var ConfigJson_1 = require("./ConfigJson");
var RolloutEvaluator_1 = require("./RolloutEvaluator");
var Utils_1 = require("./Utils");
var invalidValuePlaceholder = "<invalid value>";
var invalidNamePlaceholder = "<invalid name>";
var invalidOperatorPlaceholder = "<invalid operator>";
var invalidReferencePlaceholder = "<invalid reference>";
var stringListMaxLength = 10;
var EvaluateLogBuilder = /** @class */ (function () {
function EvaluateLogBuilder(eol) {
this.eol = eol;
this.log = "";
this.indent = "";
}
EvaluateLogBuilder.prototype.resetIndent = function () {
this.indent = "";
return this;
};
EvaluateLogBuilder.prototype.increaseIndent = function () {
this.indent += " ";
return this;
};
EvaluateLogBuilder.prototype.decreaseIndent = function () {
this.indent = this.indent.slice(0, -2);
return this;
};
EvaluateLogBuilder.prototype.newLine = function (text) {
this.log += this.eol + this.indent + (text !== null && text !== void 0 ? text : "");
return this;
};
EvaluateLogBuilder.prototype.append = function (text) {
this.log += text;
return this;
};
EvaluateLogBuilder.prototype.toString = function () {
return this.log;
};
EvaluateLogBuilder.prototype.appendUserConditionCore = function (comparisonAttribute, comparator, comparisonValue) {
return this.append("User." + comparisonAttribute + " " + formatUserComparator(comparator) + " '" + (comparisonValue !== null && comparisonValue !== void 0 ? comparisonValue : invalidValuePlaceholder) + "'");
};
EvaluateLogBuilder.prototype.appendUserConditionString = function (comparisonAttribute, comparator, comparisonValue, isSensitive) {
if (typeof comparisonValue !== "string") {
return this.appendUserConditionCore(comparisonAttribute, comparator);
}
return this.appendUserConditionCore(comparisonAttribute, comparator, !isSensitive ? comparisonValue : "<hashed value>");
};
EvaluateLogBuilder.prototype.appendUserConditionStringList = function (comparisonAttribute, comparator, comparisonValue, isSensitive) {
if (!Utils_1.isStringArray(comparisonValue)) {
return this.appendUserConditionCore(comparisonAttribute, comparator);
}
var valueText = "value", valuesText = "values";
var comparatorFormatted = formatUserComparator(comparator);
if (isSensitive) {
return this.append("User." + comparisonAttribute + " " + comparatorFormatted + " [<" + comparisonValue.length + " hashed " + (comparisonValue.length === 1 ? valueText : valuesText) + ">]");
}
else {
var comparisonValueFormatted = Utils_1.formatStringList(comparisonValue, stringListMaxLength, function (count) { return ", ... <" + count + " more " + (count === 1 ? valueText : valuesText) + ">"; });
return this.append("User." + comparisonAttribute + " " + comparatorFormatted + " [" + comparisonValueFormatted + "]");
}
};
EvaluateLogBuilder.prototype.appendUserConditionNumber = function (comparisonAttribute, comparator, comparisonValue, isDateTime) {
if (typeof comparisonValue !== "number") {
return this.appendUserConditionCore(comparisonAttribute, comparator);
}
var comparatorFormatted = formatUserComparator(comparator);
var date;
return isDateTime && !isNaN((date = new Date(comparisonValue * 1000))) // see https://stackoverflow.com/a/1353711/8656352
? this.append("User." + comparisonAttribute + " " + comparatorFormatted + " '" + comparisonValue + "' (" + date.toISOString() + " UTC)")
: this.append("User." + comparisonAttribute + " " + comparatorFormatted + " '" + comparisonValue + "'");
};
EvaluateLogBuilder.prototype.appendUserCondition = function (condition) {
var comparisonAttribute = typeof condition.comparisonAttribute === "string" ? condition.comparisonAttribute : invalidNamePlaceholder;
var comparator = condition.comparator;
switch (condition.comparator) {
case ConfigJson_1.UserComparator.TextIsOneOf:
case ConfigJson_1.UserComparator.TextIsNotOneOf:
case ConfigJson_1.UserComparator.TextContainsAnyOf:
case ConfigJson_1.UserComparator.TextNotContainsAnyOf:
case ConfigJson_1.UserComparator.SemVerIsOneOf:
case ConfigJson_1.UserComparator.SemVerIsNotOneOf:
case ConfigJson_1.UserComparator.TextStartsWithAnyOf:
case ConfigJson_1.UserComparator.TextNotStartsWithAnyOf:
case ConfigJson_1.UserComparator.TextEndsWithAnyOf:
case ConfigJson_1.UserComparator.TextNotEndsWithAnyOf:
case ConfigJson_1.UserComparator.ArrayContainsAnyOf:
case ConfigJson_1.UserComparator.ArrayNotContainsAnyOf:
return this.appendUserConditionStringList(comparisonAttribute, comparator, condition.comparisonValue, false);
case ConfigJson_1.UserComparator.SemVerLess:
case ConfigJson_1.UserComparator.SemVerLessOrEquals:
case ConfigJson_1.UserComparator.SemVerGreater:
case ConfigJson_1.UserComparator.SemVerGreaterOrEquals:
case ConfigJson_1.UserComparator.TextEquals:
case ConfigJson_1.UserComparator.TextNotEquals:
return this.appendUserConditionString(comparisonAttribute, comparator, condition.comparisonValue, false);
case ConfigJson_1.UserComparator.NumberEquals:
case ConfigJson_1.UserComparator.NumberNotEquals:
case ConfigJson_1.UserComparator.NumberLess:
case ConfigJson_1.UserComparator.NumberLessOrEquals:
case ConfigJson_1.UserComparator.NumberGreater:
case ConfigJson_1.UserComparator.NumberGreaterOrEquals:
return this.appendUserConditionNumber(comparisonAttribute, comparator, condition.comparisonValue);
case ConfigJson_1.UserComparator.SensitiveTextIsOneOf:
case ConfigJson_1.UserComparator.SensitiveTextIsNotOneOf:
case ConfigJson_1.UserComparator.SensitiveTextStartsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveTextNotStartsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveTextEndsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveTextNotEndsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveArrayContainsAnyOf:
case ConfigJson_1.UserComparator.SensitiveArrayNotContainsAnyOf:
return this.appendUserConditionStringList(comparisonAttribute, comparator, condition.comparisonValue, true);
case ConfigJson_1.UserComparator.DateTimeBefore:
case ConfigJson_1.UserComparator.DateTimeAfter:
return this.appendUserConditionNumber(comparisonAttribute, comparator, condition.comparisonValue, true);
case ConfigJson_1.UserComparator.SensitiveTextEquals:
case ConfigJson_1.UserComparator.SensitiveTextNotEquals:
return this.appendUserConditionString(comparisonAttribute, comparator, condition.comparisonValue, true);
default:
return this.appendUserConditionCore(comparisonAttribute, comparator, condition.comparisonValue);
}
};
EvaluateLogBuilder.prototype.appendPrerequisiteFlagCondition = function (condition, settings) {
var prerequisiteFlagKey = typeof condition.prerequisiteFlagKey !== "string" ? invalidNamePlaceholder :
!(condition.prerequisiteFlagKey in settings) ? invalidReferencePlaceholder :
condition.prerequisiteFlagKey;
var comparator = condition.comparator;
var comparisonValue = condition.comparisonValue;
return this.append("Flag '" + prerequisiteFlagKey + "' " + formatPrerequisiteFlagComparator(comparator) + " '" + valueToString(comparisonValue) + "'");
};
EvaluateLogBuilder.prototype.appendSegmentCondition = function (condition) {
var segment = condition.segment;
var comparator = condition.comparator;
var segmentName = segment == null ? invalidReferencePlaceholder :
typeof segment.name !== "string" || !segment.name ? invalidNamePlaceholder :
segment.name;
return this.append("User " + formatSegmentComparator(comparator) + " '" + segmentName + "'");
};
EvaluateLogBuilder.prototype.appendConditionResult = function (result) {
return this.append("" + result);
};
EvaluateLogBuilder.prototype.appendConditionConsequence = function (result) {
this.append(" => ").appendConditionResult(result);
return result ? this : this.append(", skipping the remaining AND conditions");
};
EvaluateLogBuilder.prototype.appendTargetingRuleThenPart = function (targetingRule, newLine) {
(newLine ? this.newLine() : this.append(" "))
.append("THEN");
var then = targetingRule.then;
return this.append(!Utils_1.isArray(then) ? " '" + valueToString(then.value) + "'" : " % options");
};
EvaluateLogBuilder.prototype.appendTargetingRuleConsequence = function (targetingRule, isMatchOrError, newLine) {
this.increaseIndent();
this.appendTargetingRuleThenPart(targetingRule, newLine)
.append(" => ").append(isMatchOrError === true ? "MATCH, applying rule" : isMatchOrError === false ? "no match" : isMatchOrError);
return this.decreaseIndent();
};
return EvaluateLogBuilder;
}());
exports.EvaluateLogBuilder = EvaluateLogBuilder;
function formatUserComparator(comparator) {
switch (comparator) {
case ConfigJson_1.UserComparator.TextIsOneOf:
case ConfigJson_1.UserComparator.SensitiveTextIsOneOf:
case ConfigJson_1.UserComparator.SemVerIsOneOf: return "IS ONE OF";
case ConfigJson_1.UserComparator.TextIsNotOneOf:
case ConfigJson_1.UserComparator.SensitiveTextIsNotOneOf:
case ConfigJson_1.UserComparator.SemVerIsNotOneOf: return "IS NOT ONE OF";
case ConfigJson_1.UserComparator.TextContainsAnyOf: return "CONTAINS ANY OF";
case ConfigJson_1.UserComparator.TextNotContainsAnyOf: return "NOT CONTAINS ANY OF";
case ConfigJson_1.UserComparator.SemVerLess:
case ConfigJson_1.UserComparator.NumberLess: return "<";
case ConfigJson_1.UserComparator.SemVerLessOrEquals:
case ConfigJson_1.UserComparator.NumberLessOrEquals: return "<=";
case ConfigJson_1.UserComparator.SemVerGreater:
case ConfigJson_1.UserComparator.NumberGreater: return ">";
case ConfigJson_1.UserComparator.SemVerGreaterOrEquals:
case ConfigJson_1.UserComparator.NumberGreaterOrEquals: return ">=";
case ConfigJson_1.UserComparator.NumberEquals: return "=";
case ConfigJson_1.UserComparator.NumberNotEquals: return "!=";
case ConfigJson_1.UserComparator.DateTimeBefore: return "BEFORE";
case ConfigJson_1.UserComparator.DateTimeAfter: return "AFTER";
case ConfigJson_1.UserComparator.TextEquals:
case ConfigJson_1.UserComparator.SensitiveTextEquals: return "EQUALS";
case ConfigJson_1.UserComparator.TextNotEquals:
case ConfigJson_1.UserComparator.SensitiveTextNotEquals: return "NOT EQUALS";
case ConfigJson_1.UserComparator.TextStartsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveTextStartsWithAnyOf: return "STARTS WITH ANY OF";
case ConfigJson_1.UserComparator.TextNotStartsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveTextNotStartsWithAnyOf: return "NOT STARTS WITH ANY OF";
case ConfigJson_1.UserComparator.TextEndsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveTextEndsWithAnyOf: return "ENDS WITH ANY OF";
case ConfigJson_1.UserComparator.TextNotEndsWithAnyOf:
case ConfigJson_1.UserComparator.SensitiveTextNotEndsWithAnyOf: return "NOT ENDS WITH ANY OF";
case ConfigJson_1.UserComparator.ArrayContainsAnyOf:
case ConfigJson_1.UserComparator.SensitiveArrayContainsAnyOf: return "ARRAY CONTAINS ANY OF";
case ConfigJson_1.UserComparator.ArrayNotContainsAnyOf:
case ConfigJson_1.UserComparator.SensitiveArrayNotContainsAnyOf: return "ARRAY NOT CONTAINS ANY OF";
default: return invalidOperatorPlaceholder;
}
}
exports.formatUserComparator = formatUserComparator;
function formatUserCondition(condition) {
return new EvaluateLogBuilder("").appendUserCondition(condition).toString();
}
exports.formatUserCondition = formatUserCondition;
function formatPrerequisiteFlagComparator(comparator) {
switch (comparator) {
case ConfigJson_1.PrerequisiteFlagComparator.Equals: return "EQUALS";
case ConfigJson_1.PrerequisiteFlagComparator.NotEquals: return "NOT EQUALS";
default: return invalidOperatorPlaceholder;
}
}
exports.formatPrerequisiteFlagComparator = formatPrerequisiteFlagComparator;
function formatSegmentComparator(comparator) {
switch (comparator) {
case ConfigJson_1.SegmentComparator.IsIn: return "IS IN SEGMENT";
case ConfigJson_1.SegmentComparator.IsNotIn: return "IS NOT IN SEGMENT";
default: return invalidOperatorPlaceholder;
}
}
exports.formatSegmentComparator = formatSegmentComparator;
function valueToString(value) {
return RolloutEvaluator_1.isAllowedValue(value) ? value.toString() : invalidValuePlaceholder;
}
exports.valueToString = valueToString;