{"version":3,"file":"validation-utils.mjs","sources":["../../../src/lib/shared/validation-utils.ts"],"sourcesContent":["/**\n * @file Unified Validation Utilities\n * @description Standardized validation patterns for common data types,\n * schema validation, and input sanitization.\n *\n * @module shared/validation-utils\n */\n\nimport { isString, isArray, isObject, isNonEmptyString, isFiniteNumber } from './type-utils';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Validation result.\n */\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\n/**\n * Field validation result.\n */\nexport interface FieldValidationResult {\n  valid: boolean;\n  field: string;\n  errors: string[];\n}\n\n/**\n * Schema validation result with all field errors.\n */\nexport interface SchemaValidationResult {\n  valid: boolean;\n  errors: Record<string, string[]>;\n}\n\n/**\n * Validator function type.\n */\nexport type Validator<T> = (value: T) => ValidationResult;\n\n/**\n * Async validator function type.\n */\nexport type AsyncValidator<T> = (value: T) => Promise<ValidationResult>;\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\n/**\n * Create a successful validation result.\n */\nexport function validResult(): ValidationResult {\n  return { valid: true, errors: [] };\n}\n\n/**\n * Create a failed validation result.\n */\nexport function invalidResult(...errors: string[]): ValidationResult {\n  return { valid: false, errors };\n}\n\n/**\n * Combine multiple validation results.\n */\nexport function combineResults(...results: ValidationResult[]): ValidationResult {\n  const errors = results.flatMap((r) => r.errors);\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n// =============================================================================\n// String Validators\n// =============================================================================\n\n/**\n * Validate string is not empty.\n */\nexport function validateRequired(value: unknown, fieldName = 'Field'): ValidationResult {\n  if (!isNonEmptyString(value)) {\n    return invalidResult(`${fieldName} is required`);\n  }\n  return validResult();\n}\n\n/**\n * Validate string minimum length.\n */\nexport function validateMinLength(\n  value: string,\n  minLength: number,\n  fieldName = 'Field'\n): ValidationResult {\n  if (value.length < minLength) {\n    return invalidResult(`${fieldName} must be at least ${minLength} characters`);\n  }\n  return validResult();\n}\n\n/**\n * Validate string maximum length.\n */\nexport function validateMaxLength(\n  value: string,\n  maxLength: number,\n  fieldName = 'Field'\n): ValidationResult {\n  if (value.length > maxLength) {\n    return invalidResult(`${fieldName} must be at most ${maxLength} characters`);\n  }\n  return validResult();\n}\n\n/**\n * Validate string length range.\n */\nexport function validateLength(\n  value: string,\n  min: number,\n  max: number,\n  fieldName = 'Field'\n): ValidationResult {\n  return combineResults(\n    validateMinLength(value, min, fieldName),\n    validateMaxLength(value, max, fieldName)\n  );\n}\n\n/**\n * Validate string matches pattern.\n */\nexport function validatePattern(value: string, pattern: RegExp, message: string): ValidationResult {\n  if (!pattern.test(value)) {\n    return invalidResult(message);\n  }\n  return validResult();\n}\n\n/**\n * Validate email format.\n */\nexport function validateEmail(value: string, fieldName = 'Email'): ValidationResult {\n  const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  if (!emailPattern.test(value)) {\n    return invalidResult(`${fieldName} must be a valid email address`);\n  }\n  return validResult();\n}\n\n/**\n * Validate URL format.\n */\nexport function validateUrl(value: string, fieldName = 'URL'): ValidationResult {\n  try {\n    new URL(value);\n    return validResult();\n  } catch {\n    return invalidResult(`${fieldName} must be a valid URL`);\n  }\n}\n\n/**\n * Validate phone number format (basic).\n */\nexport function validatePhone(value: string, fieldName = 'Phone'): ValidationResult {\n  const phonePattern = /^[+]?[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/;\n  if (!phonePattern.test(value) || value.replace(/\\D/g, '').length < 7) {\n    return invalidResult(`${fieldName} must be a valid phone number`);\n  }\n  return validResult();\n}\n\n/**\n * Validate UUID format.\n */\nexport function validateUuid(value: string, fieldName = 'ID'): ValidationResult {\n  const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n  if (!uuidPattern.test(value)) {\n    return invalidResult(`${fieldName} must be a valid UUID`);\n  }\n  return validResult();\n}\n\n/**\n * Validate slug format (lowercase letters, numbers, hyphens).\n */\nexport function validateSlug(value: string, fieldName = 'Slug'): ValidationResult {\n  const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n  if (!slugPattern.test(value)) {\n    return invalidResult(`${fieldName} must contain only lowercase letters, numbers, and hyphens`);\n  }\n  return validResult();\n}\n\n/**\n * Validate alphanumeric string.\n */\nexport function validateAlphanumeric(value: string, fieldName = 'Field'): ValidationResult {\n  const pattern = /^[a-zA-Z0-9]+$/;\n  if (!pattern.test(value)) {\n    return invalidResult(`${fieldName} must contain only letters and numbers`);\n  }\n  return validResult();\n}\n\n// =============================================================================\n// Number Validators\n// =============================================================================\n\n/**\n * Validate number is in range.\n */\nexport function validateNumberRange(\n  value: number,\n  min: number,\n  max: number,\n  fieldName = 'Value'\n): ValidationResult {\n  if (value < min || value > max) {\n    return invalidResult(`${fieldName} must be between ${min} and ${max}`);\n  }\n  return validResult();\n}\n\n/**\n * Validate minimum value.\n */\nexport function validateMin(value: number, min: number, fieldName = 'Value'): ValidationResult {\n  if (value < min) {\n    return invalidResult(`${fieldName} must be at least ${min}`);\n  }\n  return validResult();\n}\n\n/**\n * Validate maximum value.\n */\nexport function validateMax(value: number, max: number, fieldName = 'Value'): ValidationResult {\n  if (value > max) {\n    return invalidResult(`${fieldName} must be at most ${max}`);\n  }\n  return validResult();\n}\n\n/**\n * Validate positive number.\n */\nexport function validatePositive(value: number, fieldName = 'Value'): ValidationResult {\n  if (value <= 0) {\n    return invalidResult(`${fieldName} must be positive`);\n  }\n  return validResult();\n}\n\n/**\n * Validate non-negative number.\n */\nexport function validateNonNegative(value: number, fieldName = 'Value'): ValidationResult {\n  if (value < 0) {\n    return invalidResult(`${fieldName} must not be negative`);\n  }\n  return validResult();\n}\n\n/**\n * Validate integer.\n */\nexport function validateInteger(value: number, fieldName = 'Value'): ValidationResult {\n  if (!Number.isInteger(value)) {\n    return invalidResult(`${fieldName} must be a whole number`);\n  }\n  return validResult();\n}\n\n// =============================================================================\n// Array Validators\n// =============================================================================\n\n/**\n * Validate array is not empty.\n */\nexport function validateArrayNotEmpty(value: unknown[], fieldName = 'List'): ValidationResult {\n  if (value.length === 0) {\n    return invalidResult(`${fieldName} must not be empty`);\n  }\n  return validResult();\n}\n\n/**\n * Validate array length.\n */\nexport function validateArrayLength(\n  value: unknown[],\n  min: number,\n  max: number,\n  fieldName = 'List'\n): ValidationResult {\n  if (value.length < min) {\n    return invalidResult(`${fieldName} must have at least ${min} items`);\n  }\n  if (value.length > max) {\n    return invalidResult(`${fieldName} must have at most ${max} items`);\n  }\n  return validResult();\n}\n\n/**\n * Validate all array items.\n */\nexport function validateArrayItems<T>(\n  value: T[],\n  itemValidator: (item: T, index: number) => ValidationResult,\n  fieldName = 'List'\n): ValidationResult {\n  const errors: string[] = [];\n\n  value.forEach((item, index) => {\n    const result = itemValidator(item, index);\n    if (!result.valid) {\n      result.errors.forEach((error) => {\n        errors.push(`${fieldName}[${index}]: ${error}`);\n      });\n    }\n  });\n\n  return errors.length === 0 ? validResult() : { valid: false, errors };\n}\n\n/**\n * Validate array contains unique items.\n */\nexport function validateUnique<T>(\n  value: T[],\n  keyFn: (item: T) => string | number = String,\n  fieldName = 'List'\n): ValidationResult {\n  const seen = new Set<string | number>();\n  const duplicates: (string | number)[] = [];\n\n  for (const item of value) {\n    const key = keyFn(item);\n    if (seen.has(key)) {\n      duplicates.push(key);\n    }\n    seen.add(key);\n  }\n\n  if (duplicates.length > 0) {\n    return invalidResult(`${fieldName} contains duplicate values`);\n  }\n  return validResult();\n}\n\n// =============================================================================\n// Date Validators\n// =============================================================================\n\n/**\n * Validate date is not in the past.\n */\nexport function validateFutureDate(value: Date, fieldName = 'Date'): ValidationResult {\n  if (value.getTime() <= Date.now()) {\n    return invalidResult(`${fieldName} must be in the future`);\n  }\n  return validResult();\n}\n\n/**\n * Validate date is not in the future.\n */\nexport function validatePastDate(value: Date, fieldName = 'Date'): ValidationResult {\n  if (value.getTime() >= Date.now()) {\n    return invalidResult(`${fieldName} must be in the past`);\n  }\n  return validResult();\n}\n\n/**\n * Validate date is within range.\n */\nexport function validateDateRange(\n  value: Date,\n  min: Date,\n  max: Date,\n  fieldName = 'Date'\n): ValidationResult {\n  if (value < min || value > max) {\n    return invalidResult(\n      `${fieldName} must be between ${min.toISOString()} and ${max.toISOString()}`\n    );\n  }\n  return validResult();\n}\n\n/**\n * Validate age (from birth date).\n */\nexport function validateAge(\n  birthDate: Date,\n  minAge: number,\n  maxAge?: number,\n  fieldName = 'Age'\n): ValidationResult {\n  const today = new Date();\n  let age = today.getFullYear() - birthDate.getFullYear();\n  const monthDiff = today.getMonth() - birthDate.getMonth();\n\n  if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n    age--;\n  }\n\n  if (age < minAge) {\n    return invalidResult(`${fieldName} must be at least ${minAge}`);\n  }\n  if (maxAge !== undefined && age > maxAge) {\n    return invalidResult(`${fieldName} must be at most ${maxAge}`);\n  }\n  return validResult();\n}\n\n// =============================================================================\n// Validator Builder\n// =============================================================================\n\n/**\n * Chain multiple validators together.\n *\n * @example\n * ```ts\n * const validateUsername = createValidator<string>()\n *   .add((v) => validateRequired(v, 'Username'))\n *   .add((v) => validateMinLength(v, 3, 'Username'))\n *   .add((v) => validateMaxLength(v, 20, 'Username'))\n *   .add((v) => validateAlphanumeric(v, 'Username'))\n *   .build();\n *\n * const result = validateUsername('john123');\n * ```\n */\nexport function createValidator<T>(): ValidatorBuilder<T> {\n  return new ValidatorBuilder<T>();\n}\n\nclass ValidatorBuilder<T> {\n  private validators: Validator<T>[] = [];\n\n  /**\n   * Add a validator to the chain.\n   */\n  add(validator: Validator<T>): ValidatorBuilder<T> {\n    this.validators.push(validator);\n    return this;\n  }\n\n  /**\n   * Add a conditional validator.\n   */\n  when(condition: (value: T) => boolean, validator: Validator<T>): ValidatorBuilder<T> {\n    this.validators.push((value) => {\n      if (condition(value)) {\n        return validator(value);\n      }\n      return validResult();\n    });\n    return this;\n  }\n\n  /**\n   * Build the final validator function.\n   */\n  build(): Validator<T> {\n    return (value: T) => {\n      const results = this.validators.map((v) => v(value));\n      return combineResults(...results);\n    };\n  }\n}\n\n// =============================================================================\n// Schema Validation\n// =============================================================================\n\n/**\n * Field schema definition.\n */\nexport interface FieldSchema<T = unknown> {\n  /** Field is required */\n  required?: boolean;\n  /** Field type */\n  type?: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'date';\n  /** Custom validators */\n  validators?: Validator<T>[];\n  /** Nested schema for objects */\n  schema?: Record<string, FieldSchema>;\n  /** Item schema for arrays */\n  items?: FieldSchema;\n}\n\n/**\n * Validate an object against a schema.\n *\n * @example\n * ```ts\n * const schema: Record<string, FieldSchema> = {\n *   name: { required: true, type: 'string' },\n *   email: { required: true, type: 'string', validators: [(v) => validateEmail(v as string)] },\n *   age: { type: 'number', validators: [(v) => validateMin(v as number, 0)] },\n * };\n *\n * const result = validateSchema({ name: 'John', email: 'invalid' }, schema);\n * ```\n */\nexport function validateSchema(\n  data: Record<string, unknown>,\n  schema: Record<string, FieldSchema>\n): SchemaValidationResult {\n  const errors: Record<string, string[]> = {};\n\n  for (const [field, fieldSchema] of Object.entries(schema)) {\n    const value = data[field];\n    const fieldErrors: string[] = [];\n\n    // Required check\n    if (fieldSchema.required === true && (value === undefined || value === null || value === '')) {\n      fieldErrors.push(`${field} is required`);\n      errors[field] = fieldErrors;\n      continue;\n    }\n\n    // Skip further validation if not required and not provided\n    if (value === undefined || value === null) {\n      continue;\n    }\n\n    // Type check\n    if (fieldSchema.type) {\n      const typeValid = checkType(value, fieldSchema.type);\n      if (!typeValid) {\n        fieldErrors.push(`${field} must be of type ${fieldSchema.type}`);\n      }\n    }\n\n    // Custom validators\n    if (fieldSchema.validators) {\n      for (const validator of fieldSchema.validators) {\n        const result = validator(value);\n        if (!result.valid) {\n          fieldErrors.push(...result.errors);\n        }\n      }\n    }\n\n    // Nested object schema\n    if (fieldSchema.schema && isObject(value)) {\n      const nestedResult = validateSchema(value, fieldSchema.schema);\n      if (!nestedResult.valid) {\n        for (const [nestedField, nestedErrors] of Object.entries(nestedResult.errors)) {\n          errors[`${field}.${nestedField}`] = nestedErrors;\n        }\n      }\n    }\n\n    // Array item schema\n    if (fieldSchema.items !== undefined && isArray(value)) {\n      value.forEach((item, index) => {\n        if (fieldSchema.items?.type !== undefined && !checkType(item, fieldSchema.items.type)) {\n          const key = `${field}[${index}]`;\n          errors[key] = errors[key] ?? [];\n          errors[key].push(`Item must be of type ${fieldSchema.items.type}`);\n        }\n      });\n    }\n\n    if (fieldErrors.length > 0) {\n      errors[field] = fieldErrors;\n    }\n  }\n\n  return {\n    valid: Object.keys(errors).length === 0,\n    errors,\n  };\n}\n\n/**\n * Check if value matches expected type.\n */\nfunction checkType(value: unknown, type: string): boolean {\n  switch (type) {\n    case 'string':\n      return isString(value);\n    case 'number':\n      return isFiniteNumber(value);\n    case 'boolean':\n      return typeof value === 'boolean';\n    case 'array':\n      return isArray(value);\n    case 'object':\n      return isObject(value);\n    case 'date':\n      return value instanceof Date && !isNaN(value.getTime());\n    default:\n      return true;\n  }\n}\n\n// =============================================================================\n// Input Sanitization\n// =============================================================================\n\n/**\n * Trim and normalize whitespace in string.\n */\nexport function sanitizeString(value: string): string {\n  return value.trim().replace(/\\s+/g, ' ');\n}\n\n/**\n * Remove HTML tags from string.\n */\nexport function stripHtml(value: string): string {\n  return value.replace(/<[^>]*>/g, '');\n}\n\n/**\n * Escape HTML entities.\n */\nexport function escapeHtml(value: string): string {\n  const entities: Record<string, string> = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n  };\n  return value.replace(/[&<>\"']/g, (char) => entities[char] ?? char);\n}\n\n/**\n * Normalize email to lowercase.\n */\nexport function normalizeEmail(email: string): string {\n  return email.toLowerCase().trim();\n}\n\n/**\n * Normalize phone number to digits only.\n */\nexport function normalizePhone(phone: string): string {\n  return phone.replace(/\\D/g, '');\n}\n\n/**\n * Create a URL-safe slug from string.\n */\nexport function createSlug(value: string): string {\n  return value\n    .toLowerCase()\n    .trim()\n    .replace(/[^\\w\\s-]/g, '')\n    .replace(/[\\s_-]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n}\n"],"names":["validResult","invalidResult","errors","combineResults","results","validateRequired","value","fieldName","isNonEmptyString","validateMinLength","minLength","validateMaxLength","maxLength","validateLength","min","max","validatePattern","pattern","message","validateEmail","validateUrl","validatePhone","validateUuid","validateSlug","validateAlphanumeric","validateNumberRange","validateMin","validateMax","validatePositive","validateNonNegative","validateInteger","validateArrayNotEmpty","validateArrayLength","validateArrayItems","itemValidator","item","index","result","error","validateUnique","keyFn","seen","duplicates","key","validateFutureDate","validatePastDate","validateDateRange","validateAge","birthDate","minAge","maxAge","today","age","monthDiff","createValidator","ValidatorBuilder","validator","condition","v","validateSchema","data","schema","field","fieldSchema","fieldErrors","checkType","isObject","nestedResult","nestedField","nestedErrors","isArray","type","isString","isFiniteNumber","sanitizeString","stripHtml","escapeHtml","entities","char","normalizeEmail","email","normalizePhone","phone","createSlug"],"mappings":"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"}