11import { PrerequisiteFlagComparator , SegmentComparator , UserComparator } from "./ConfigJson" ;
2- import type { PrerequisiteFlagCondition , SegmentCondition , SettingValue , TargetingRule , UserCondition , UserConditionUnion } from "./ProjectConfig" ;
2+ import type { PrerequisiteFlagCondition , SegmentCondition , Setting , SettingValue , TargetingRule , UserCondition , UserConditionUnion } from "./ProjectConfig" ;
33import { isAllowedValue } from "./RolloutEvaluator" ;
4- import { formatStringList , isArray } from "./Utils" ;
4+ import { formatStringList , isArray , isStringArray } from "./Utils" ;
55
66const invalidValuePlaceholder = "<invalid value>" ;
77const invalidNamePlaceholder = "<invalid name>" ;
@@ -14,6 +14,9 @@ export class EvaluateLogBuilder {
1414 private log = "" ;
1515 private indent = "" ;
1616
17+ constructor ( private readonly eol : string ) {
18+ }
19+
1720 resetIndent ( ) : this {
1821 this . indent = "" ;
1922 return this ;
@@ -30,7 +33,7 @@ export class EvaluateLogBuilder {
3033 }
3134
3235 newLine ( text ?: string ) : this {
33- this . log += "\n" + this . indent + ( text ?? "" ) ;
36+ this . log += this . eol + this . indent + ( text ?? "" ) ;
3437 return this ;
3538 }
3639
@@ -43,20 +46,20 @@ export class EvaluateLogBuilder {
4346 return this . log ;
4447 }
4548
46- appendEvaluationResult ( isMatch : boolean ) : this {
47- return this . append ( `${ isMatch } ` ) ;
48- }
49-
5049 private appendUserConditionCore ( comparisonAttribute : string , comparator : UserComparator , comparisonValue ?: unknown ) {
5150 return this . append ( `User.${ comparisonAttribute } ${ formatUserComparator ( comparator ) } '${ comparisonValue ?? invalidValuePlaceholder } '` ) ;
5251 }
5352
5453 private appendUserConditionString ( comparisonAttribute : string , comparator : UserComparator , comparisonValue : string , isSensitive : boolean ) {
54+ if ( typeof comparisonValue !== "string" ) {
55+ return this . appendUserConditionCore ( comparisonAttribute , comparator ) ;
56+ }
57+
5558 return this . appendUserConditionCore ( comparisonAttribute , comparator , ! isSensitive ? comparisonValue : "<hashed value>" ) ;
5659 }
5760
5861 private appendUserConditionStringList ( comparisonAttribute : string , comparator : UserComparator , comparisonValue : ReadonlyArray < string > , isSensitive : boolean ) : this {
59- if ( comparisonValue == null ) {
62+ if ( ! isStringArray ( comparisonValue ) ) {
6063 return this . appendUserConditionCore ( comparisonAttribute , comparator ) ;
6164 }
6265
@@ -74,7 +77,7 @@ export class EvaluateLogBuilder {
7477 }
7578
7679 private appendUserConditionNumber ( comparisonAttribute : string , comparator : UserComparator , comparisonValue : number , isDateTime ?: boolean ) {
77- if ( comparisonValue == null ) {
80+ if ( typeof comparisonValue ! == "number" ) {
7881 return this . appendUserConditionCore ( comparisonAttribute , comparator ) ;
7982 }
8083
@@ -86,12 +89,14 @@ export class EvaluateLogBuilder {
8689 }
8790
8891 appendUserCondition ( condition : UserConditionUnion ) : this {
89- const { comparisonAttribute, comparator } = condition ;
92+ const comparisonAttribute = typeof condition . comparisonAttribute === "string" ? condition . comparisonAttribute : invalidNamePlaceholder ;
93+ const comparator = condition . comparator ;
94+
9095 switch ( condition . comparator ) {
91- case UserComparator . IsOneOf :
92- case UserComparator . IsNotOneOf :
93- case UserComparator . ContainsAnyOf :
94- case UserComparator . NotContainsAnyOf :
96+ case UserComparator . TextIsOneOf :
97+ case UserComparator . TextIsNotOneOf :
98+ case UserComparator . TextContainsAnyOf :
99+ case UserComparator . TextNotContainsAnyOf :
95100 case UserComparator . SemVerIsOneOf :
96101 case UserComparator . SemVerIsNotOneOf :
97102 case UserComparator . TextStartsWithAnyOf :
@@ -118,8 +123,8 @@ export class EvaluateLogBuilder {
118123 case UserComparator . NumberGreaterOrEquals :
119124 return this . appendUserConditionNumber ( comparisonAttribute , comparator , condition . comparisonValue ) ;
120125
121- case UserComparator . SensitiveIsOneOf :
122- case UserComparator . SensitiveIsNotOneOf :
126+ case UserComparator . SensitiveTextIsOneOf :
127+ case UserComparator . SensitiveTextIsNotOneOf :
123128 case UserComparator . SensitiveTextStartsWithAnyOf :
124129 case UserComparator . SensitiveTextNotStartsWithAnyOf :
125130 case UserComparator . SensitiveTextEndsWithAnyOf :
@@ -141,8 +146,12 @@ export class EvaluateLogBuilder {
141146 }
142147 }
143148
144- appendPrerequisiteFlagCondition ( condition : PrerequisiteFlagCondition ) : this {
145- const prerequisiteFlagKey = condition . prerequisiteFlagKey ;
149+ appendPrerequisiteFlagCondition ( condition : PrerequisiteFlagCondition , settings : Readonly < { [ name : string ] : Setting } > ) : this {
150+ const prerequisiteFlagKey =
151+ typeof condition . prerequisiteFlagKey !== "string" ? invalidNamePlaceholder :
152+ ! ( condition . prerequisiteFlagKey in settings ) ? invalidReferencePlaceholder :
153+ condition . prerequisiteFlagKey ;
154+
146155 const comparator = condition . comparator ;
147156 const comparisonValue = condition . comparisonValue ;
148157
@@ -153,18 +162,24 @@ export class EvaluateLogBuilder {
153162 const segment = condition . segment ;
154163 const comparator = condition . comparator ;
155164
156- const segmentName = segment ?. name ??
157- ( segment == null ? invalidReferencePlaceholder : invalidNamePlaceholder ) ;
165+ const segmentName =
166+ segment == null ? invalidReferencePlaceholder :
167+ typeof segment . name !== "string" || ! segment . name ? invalidNamePlaceholder :
168+ segment . name ;
158169
159170 return this . append ( `User ${ formatSegmentComparator ( comparator ) } '${ segmentName } '` ) ;
160171 }
161172
162- appendConditionConsequence ( isMatch : boolean ) : this {
163- this . append ( " => " ) . appendEvaluationResult ( isMatch ) ;
164- return isMatch ? this : this . append ( ", skipping the remaining AND conditions" ) ;
173+ appendConditionResult ( result : boolean ) : this {
174+ return this . append ( `${ result } ` ) ;
175+ }
176+
177+ appendConditionConsequence ( result : boolean ) : this {
178+ this . append ( " => " ) . appendConditionResult ( result ) ;
179+ return result ? this : this . append ( ", skipping the remaining AND conditions" ) ;
165180 }
166181
167- appendTargetingRuleThenPart ( targetingRule : TargetingRule , newLine : boolean ) : this {
182+ private appendTargetingRuleThenPart ( targetingRule : TargetingRule , newLine : boolean ) : this {
168183 ( newLine ? this . newLine ( ) : this . append ( " " ) )
169184 . append ( "THEN" ) ;
170185
@@ -184,14 +199,14 @@ export class EvaluateLogBuilder {
184199
185200export function formatUserComparator ( comparator : UserComparator ) : string {
186201 switch ( comparator ) {
187- case UserComparator . IsOneOf :
188- case UserComparator . SensitiveIsOneOf :
202+ case UserComparator . TextIsOneOf :
203+ case UserComparator . SensitiveTextIsOneOf :
189204 case UserComparator . SemVerIsOneOf : return "IS ONE OF" ;
190- case UserComparator . IsNotOneOf :
191- case UserComparator . SensitiveIsNotOneOf :
205+ case UserComparator . TextIsNotOneOf :
206+ case UserComparator . SensitiveTextIsNotOneOf :
192207 case UserComparator . SemVerIsNotOneOf : return "IS NOT ONE OF" ;
193- case UserComparator . ContainsAnyOf : return "CONTAINS ANY OF" ;
194- case UserComparator . NotContainsAnyOf : return "NOT CONTAINS ANY OF" ;
208+ case UserComparator . TextContainsAnyOf : return "CONTAINS ANY OF" ;
209+ case UserComparator . TextNotContainsAnyOf : return "NOT CONTAINS ANY OF" ;
195210 case UserComparator . SemVerLess :
196211 case UserComparator . NumberLess : return "<" ;
197212 case UserComparator . SemVerLessOrEquals :
@@ -225,7 +240,7 @@ export function formatUserComparator(comparator: UserComparator): string {
225240}
226241
227242export function formatUserCondition ( condition : UserConditionUnion ) : string {
228- return new EvaluateLogBuilder ( ) . appendUserCondition ( condition ) . toString ( ) ;
243+ return new EvaluateLogBuilder ( "" ) . appendUserCondition ( condition ) . toString ( ) ;
229244}
230245
231246export function formatPrerequisiteFlagComparator ( comparator : PrerequisiteFlagComparator ) : string {
0 commit comments