All files / src/validation validateForm.ts

91.66% Statements 11/12
87.5% Branches 7/8
100% Functions 2/2
91.66% Lines 11/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48                                        13x 13x     13x 46x 9x     37x   37x       37x   37x 11x       13x          
import type {
  CustomValidatorMap,
  FieldErrors,
  FormValues,
  NormalizedFormSchema
} from "../schema/types";
import { validateField } from "./validateField";
 
/** Internal validation result used by the runtime before rendering errors. */
export interface FormValidationResult {
  valid: boolean;
  errors: FieldErrors;
}
 
export function validateForm(
  schema: NormalizedFormSchema,
  values: FormValues,
  validators: CustomValidatorMap = {},
  visibleFields: string[] = schema.fieldOrder
): FormValidationResult {
  const visibleFieldSet = new Set(visibleFields);
  const errors: FieldErrors = {};
 
  // Hidden conditional fields are skipped so stale required errors do not block submission.
  schema.fieldOrder.forEach((fieldName) => {
    if (!visibleFieldSet.has(fieldName)) {
      return;
    }
 
    const field = schema.fieldMap.get(fieldName);
 
    Iif (!field) {
      return;
    }
 
    const fieldErrors = validateField(field, values[fieldName], values, schema, validators);
 
    if (fieldErrors.length > 0) {
      errors[fieldName] = fieldErrors;
    }
  });
 
  return {
    valid: Object.keys(errors).length === 0,
    errors
  };
}