diff --git a/src/lib/features/feature-naming-pattern/feature-naming-validation.ts b/src/lib/features/feature-naming-pattern/feature-naming-validation.ts index fb162d773f..a32be5925e 100644 --- a/src/lib/features/feature-naming-pattern/feature-naming-validation.ts +++ b/src/lib/features/feature-naming-pattern/feature-naming-validation.ts @@ -2,52 +2,43 @@ import { IFeatureNaming } from '../../types/model'; const compileRegex = (pattern: string) => new RegExp(`^${pattern}$`); +const disallowedStrings = [' ', '\\t', '\\s', '\\n', '\\r', '\\f', '\\v']; + +// Helper functions for error messages +const whitespaceError = (pattern: string) => + `Feature flag names cannot contain whitespace. You've provided a feature flag naming pattern that contains a whitespace character: "${pattern}". Remove any whitespace characters from your pattern.`; + +const exampleMismatchError = (example: string, pattern: string) => + `You've provided a feature flag naming example ("${example}") that doesn't match your feature flag naming pattern ("${pattern}").`; + +const invalidValueError = (valueName: string) => + `You've provided a feature flag naming ${valueName}, but no feature flag naming pattern. You must specify a pattern to use a ${valueName}.`; + export const checkFeatureNamingData = ( - featureNaming?: IFeatureNaming, + featureNaming: IFeatureNaming, ): | { state: 'valid' } | { state: 'invalid'; reasons: [string, ...string[]] } => { - if (featureNaming) { - const { pattern, example, description } = featureNaming; - const errors: string[] = []; - const disallowedStrings = [ - ' ', - '\\t', - '\\s', - '\\n', - '\\r', - '\\f', - '\\v', - ]; + const { pattern, example, description } = featureNaming; + const errors: string[] = []; - if (pattern) { - if (disallowedStrings.some((str) => pattern.includes(str))) { - errors.push( - `Feature flag names can not contain whitespace. You've provided a feature flag naming pattern that contains a whitespace character: "${pattern}". Remove any whitespace characters from your pattern.`, - ); - } else if (example && !example.match(compileRegex(pattern))) { - errors.push( - `You've provided a feature flag naming example ("${example}") that doesn't match your feature flag naming pattern ("${pattern}"). Please provide an example that matches your supplied pattern. Bear in mind that the pattern must match the whole example, as if it were surrounded by '^' and "$".`, - ); - } - } else { - if (example) { - errors.push( - "You've provided a feature flag naming example, but no feature flag naming pattern. You must specify a pattern to use an example.", - ); - } + if (disallowedStrings.some((str) => pattern?.includes(str))) { + errors.push(whitespaceError(pattern as string)); + } else if (pattern && example && !compileRegex(pattern).test(example)) { + errors.push(exampleMismatchError(example, pattern)); + } - if (description) { - errors.push( - "You've provided a feature flag naming pattern description, but no feature flag naming pattern. You must have a pattern to use a description.", - ); - } - } + if (!pattern && example) { + errors.push(invalidValueError('example')); + } - const [first, ...rest] = errors; - if (first) { - return { state: 'invalid', reasons: [first, ...rest] }; - } + if (!pattern && description) { + errors.push(invalidValueError('description')); + } + + const [first, ...rest] = errors; + if (first) { + return { state: 'invalid', reasons: [first, ...rest] }; } return { state: 'valid' };