/** * @file Unified Validation Utilities * @description Standardized validation patterns for common data types, * schema validation, and input sanitization. * * @module shared/validation-utils */ /** * Validation result. */ export interface ValidationResult { valid: boolean; errors: string[]; } /** * Field validation result. */ export interface FieldValidationResult { valid: boolean; field: string; errors: string[]; } /** * Schema validation result with all field errors. */ export interface SchemaValidationResult { valid: boolean; errors: Record; } /** * Validator function type. */ export type Validator = (value: T) => ValidationResult; /** * Async validator function type. */ export type AsyncValidator = (value: T) => Promise; /** * Create a successful validation result. */ export declare function validResult(): ValidationResult; /** * Create a failed validation result. */ export declare function invalidResult(...errors: string[]): ValidationResult; /** * Combine multiple validation results. */ export declare function combineResults(...results: ValidationResult[]): ValidationResult; /** * Validate string is not empty. */ export declare function validateRequired(value: unknown, fieldName?: string): ValidationResult; /** * Validate string minimum length. */ export declare function validateMinLength(value: string, minLength: number, fieldName?: string): ValidationResult; /** * Validate string maximum length. */ export declare function validateMaxLength(value: string, maxLength: number, fieldName?: string): ValidationResult; /** * Validate string length range. */ export declare function validateLength(value: string, min: number, max: number, fieldName?: string): ValidationResult; /** * Validate string matches pattern. */ export declare function validatePattern(value: string, pattern: RegExp, message: string): ValidationResult; /** * Validate email format. */ export declare function validateEmail(value: string, fieldName?: string): ValidationResult; /** * Validate URL format. */ export declare function validateUrl(value: string, fieldName?: string): ValidationResult; /** * Validate phone number format (basic). */ export declare function validatePhone(value: string, fieldName?: string): ValidationResult; /** * Validate UUID format. */ export declare function validateUuid(value: string, fieldName?: string): ValidationResult; /** * Validate slug format (lowercase letters, numbers, hyphens). */ export declare function validateSlug(value: string, fieldName?: string): ValidationResult; /** * Validate alphanumeric string. */ export declare function validateAlphanumeric(value: string, fieldName?: string): ValidationResult; /** * Validate number is in range. */ export declare function validateNumberRange(value: number, min: number, max: number, fieldName?: string): ValidationResult; /** * Validate minimum value. */ export declare function validateMin(value: number, min: number, fieldName?: string): ValidationResult; /** * Validate maximum value. */ export declare function validateMax(value: number, max: number, fieldName?: string): ValidationResult; /** * Validate positive number. */ export declare function validatePositive(value: number, fieldName?: string): ValidationResult; /** * Validate non-negative number. */ export declare function validateNonNegative(value: number, fieldName?: string): ValidationResult; /** * Validate integer. */ export declare function validateInteger(value: number, fieldName?: string): ValidationResult; /** * Validate array is not empty. */ export declare function validateArrayNotEmpty(value: unknown[], fieldName?: string): ValidationResult; /** * Validate array length. */ export declare function validateArrayLength(value: unknown[], min: number, max: number, fieldName?: string): ValidationResult; /** * Validate all array items. */ export declare function validateArrayItems(value: T[], itemValidator: (item: T, index: number) => ValidationResult, fieldName?: string): ValidationResult; /** * Validate array contains unique items. */ export declare function validateUnique(value: T[], keyFn?: (item: T) => string | number, fieldName?: string): ValidationResult; /** * Validate date is not in the past. */ export declare function validateFutureDate(value: Date, fieldName?: string): ValidationResult; /** * Validate date is not in the future. */ export declare function validatePastDate(value: Date, fieldName?: string): ValidationResult; /** * Validate date is within range. */ export declare function validateDateRange(value: Date, min: Date, max: Date, fieldName?: string): ValidationResult; /** * Validate age (from birth date). */ export declare function validateAge(birthDate: Date, minAge: number, maxAge?: number, fieldName?: string): ValidationResult; /** * Chain multiple validators together. * * @example * ```ts * const validateUsername = createValidator() * .add((v) => validateRequired(v, 'Username')) * .add((v) => validateMinLength(v, 3, 'Username')) * .add((v) => validateMaxLength(v, 20, 'Username')) * .add((v) => validateAlphanumeric(v, 'Username')) * .build(); * * const result = validateUsername('john123'); * ``` */ export declare function createValidator(): ValidatorBuilder; declare class ValidatorBuilder { private validators; /** * Add a validator to the chain. */ add(validator: Validator): ValidatorBuilder; /** * Add a conditional validator. */ when(condition: (value: T) => boolean, validator: Validator): ValidatorBuilder; /** * Build the final validator function. */ build(): Validator; } /** * Field schema definition. */ export interface FieldSchema { /** Field is required */ required?: boolean; /** Field type */ type?: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'date'; /** Custom validators */ validators?: Validator[]; /** Nested schema for objects */ schema?: Record; /** Item schema for arrays */ items?: FieldSchema; } /** * Validate an object against a schema. * * @example * ```ts * const schema: Record = { * name: { required: true, type: 'string' }, * email: { required: true, type: 'string', validators: [(v) => validateEmail(v as string)] }, * age: { type: 'number', validators: [(v) => validateMin(v as number, 0)] }, * }; * * const result = validateSchema({ name: 'John', email: 'invalid' }, schema); * ``` */ export declare function validateSchema(data: Record, schema: Record): SchemaValidationResult; /** * Trim and normalize whitespace in string. */ export declare function sanitizeString(value: string): string; /** * Remove HTML tags from string. */ export declare function stripHtml(value: string): string; /** * Escape HTML entities. */ export declare function escapeHtml(value: string): string; /** * Normalize email to lowercase. */ export declare function normalizeEmail(email: string): string; /** * Normalize phone number to digits only. */ export declare function normalizePhone(phone: string): string; /** * Create a URL-safe slug from string. */ export declare function createSlug(value: string): string; export {};