1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-31 00:16:47 +01:00
unleash.unleash/src/lib/features/feature-naming-pattern/feature-naming-validation.ts
Thomas Heartman 94b65542e8
refactor: remove check for feature naming data object (#4745)
We already check for its presence before doing anything. We don't need
to
check it twice (we're not Santa Claus, after all).
2023-09-15 12:51:47 +02:00

73 lines
2.4 KiB
TypeScript

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,
):
| { state: 'valid' }
| { state: 'invalid'; reasons: [string, ...string[]] } => {
const { pattern, example, description } = featureNaming;
const errors: string[] = [];
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 (!pattern && example) {
errors.push(invalidValueError('example'));
}
if (!pattern && description) {
errors.push(invalidValueError('description'));
}
const [first, ...rest] = errors;
if (first) {
return { state: 'invalid', reasons: [first, ...rest] };
}
return { state: 'valid' };
};
export type FeatureNameCheckResult =
| { state: 'valid' }
| {
state: 'invalid';
invalidNames: Set<string>;
};
export const checkFeatureFlagNamesAgainstPattern = (
featureNames: string[],
pattern: string | null | undefined,
): FeatureNameCheckResult => {
if (pattern) {
const regex = compileRegex(pattern);
const mismatchedNames = featureNames.filter(
(name) => !regex.test(name),
);
if (mismatchedNames.length > 0) {
return {
state: 'invalid',
invalidNames: new Set(mismatchedNames),
};
}
}
return { state: 'valid' };
};