UNPKG

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
"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;