import { isFunction, makeBrand } from 'vest-utils'; import { SuiteResult, TFieldName, TGroupName, TSchema, } from '../suiteResult/SuiteResultTypes'; import { ParsedVestObject, parse } from './parser'; /** * Creates a function that returns class names that match the validation result */ export default function classnames< F extends TFieldName, G extends TGroupName, S extends TSchema, >( res: SuiteResult, classes: SupportedClasses = {}, ): (fieldName: string) => string { const selectors = parse(res); // eslint-disable-next-line complexity return function cn(fieldName: string): string { const safeFieldName = makeBrand(fieldName); const classesArray: string[] = []; for (const selector of Object.keys(classes) as Array< keyof ParsedVestObject >) { const sel = selector as keyof ParsedVestObject; const selectorFn = selectors[sel]; const className = classes[sel]; if (isFunction(selectorFn) && className && selectorFn?.(safeFieldName)) { classesArray.push(className); } } return classesArray.join(' '); }; } type SupportedClasses = Partial< Record, string> >;