unischema 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/validators.ts","../../../src/core/engine.ts","../../../src/adapters/frontend/form.ts","../../../src/adapters/frontend/utils.ts"],"names":["validate"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Built-in validators for common validation rules\r\n */\r\n\r\nimport type { ValidatorFn, ValidationError, ValidatorContext } from '../types';\r\n\r\n/**\r\n * Create a validation error\r\n */\r\nfunction createError(\r\n context: ValidatorContext,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationError {\r\n return {\r\n field: context.path,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Type Validators\r\n// ============================================================================\r\n\r\nexport const typeValidators: Record<string, ValidatorFn> = {\r\n string: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'string') {\r\n return createError(context, 'INVALID_TYPE', `Expected string, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n number: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'number') {\r\n return createError(context, 'INVALID_TYPE', `Expected number, got ${typeof value}`);\r\n }\r\n if (typeof value === 'number' && isNaN(value)) {\r\n return createError(context, 'INVALID_NUMBER', 'Value is not a valid number');\r\n }\r\n return null;\r\n },\r\n\r\n boolean: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'boolean') {\r\n return createError(context, 'INVALID_TYPE', `Expected boolean, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n date: (value, _params, context) => {\r\n if (value === undefined || value === null) return null;\r\n if (value instanceof Date) {\r\n if (isNaN(value.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date value');\r\n }\r\n return null;\r\n }\r\n // Try parsing string dates\r\n if (typeof value === 'string') {\r\n const parsed = new Date(value);\r\n if (isNaN(parsed.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date format');\r\n }\r\n return null;\r\n }\r\n return createError(context, 'INVALID_TYPE', `Expected date, got ${typeof value}`);\r\n },\r\n\r\n array: (value, _params, context) => {\r\n if (value !== undefined && value !== null && !Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected array, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n object: (value, _params, context) => {\r\n if (value !== undefined && value !== null) {\r\n if (typeof value !== 'object' || Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected object, got ${typeof value}`);\r\n }\r\n }\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Rule Validators\r\n// ============================================================================\r\n\r\nexport const ruleValidators: Record<string, ValidatorFn> = {\r\n required: (value, _params, context) => {\r\n const isEmpty =\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0);\r\n\r\n if (isEmpty) {\r\n return createError(context, 'REQUIRED', 'This field is required');\r\n }\r\n return null;\r\n },\r\n\r\n min: (value, params, context) => {\r\n const min = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value < min) {\r\n return createError(\r\n context,\r\n 'MIN_VALUE',\r\n message || `Value must be at least ${min}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_LENGTH',\r\n message || `Must be at least ${min} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_ITEMS',\r\n message || `Must have at least ${min} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n max: (value, params, context) => {\r\n const max = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value > max) {\r\n return createError(\r\n context,\r\n 'MAX_VALUE',\r\n message || `Value must be at most ${max}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_LENGTH',\r\n message || `Must be at most ${max} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_ITEMS',\r\n message || `Must have at most ${max} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n email: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_EMAIL', 'Email must be a string', soft);\r\n }\r\n\r\n // RFC 5322 simplified email regex\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_EMAIL',\r\n message || 'Invalid email address',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n pattern: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const pattern = params?.pattern as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') return null;\r\n\r\n const regex = new RegExp(pattern);\r\n if (!regex.test(value)) {\r\n return createError(\r\n context,\r\n 'PATTERN_MISMATCH',\r\n message || `Value does not match required pattern`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n url: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_URL', 'URL must be a string', soft);\r\n }\r\n\r\n try {\r\n new URL(value);\r\n return null;\r\n } catch {\r\n return createError(\r\n context,\r\n 'INVALID_URL',\r\n message || 'Invalid URL format',\r\n soft\r\n );\r\n }\r\n },\r\n\r\n enum: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const values = params?.values as unknown[];\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!values.includes(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_ENUM',\r\n message || `Value must be one of: ${values.join(', ')}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n custom: (value, params, context) => {\r\n const validate = params?.validate as (\r\n value: unknown,\r\n context: ValidatorContext\r\n ) => { valid: boolean; message?: string } | boolean;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!validate) return null;\r\n\r\n const result = validate(value, context);\r\n\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n if (!result.valid) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n result.message || message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Enterprise patterns - matches field against another field\r\n matches: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const otherField = params?.field as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n const root = context.root as Record<string, unknown>;\r\n\r\n const otherValue = root[otherField];\r\n\r\n if (value !== otherValue) {\r\n return createError(\r\n context,\r\n 'FIELD_MISMATCH',\r\n message || `Must match ${otherField}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Integer validation\r\n integer: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'number' || !Number.isInteger(value)) {\r\n return createError(\r\n context,\r\n 'NOT_INTEGER',\r\n message || 'Value must be an integer',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Positive number validation\r\n positive: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value <= 0) {\r\n return createError(\r\n context,\r\n 'NOT_POSITIVE',\r\n message || 'Value must be positive',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Negative number validation\r\n negative: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value >= 0) {\r\n return createError(\r\n context,\r\n 'NOT_NEGATIVE',\r\n message || 'Value must be negative',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Validator Registry\r\n// ============================================================================\r\n\r\nconst customValidators: Map<string, ValidatorFn> = new Map();\r\n\r\n/**\r\n * Register a custom validator\r\n */\r\nexport function registerValidator(name: string, validator: ValidatorFn): void {\r\n customValidators.set(name, validator);\r\n}\r\n\r\n/**\r\n * Get a validator by name\r\n */\r\nexport function getValidator(name: string): ValidatorFn | undefined {\r\n return ruleValidators[name] ?? customValidators.get(name);\r\n}\r\n\r\n/**\r\n * Get a type validator\r\n */\r\nexport function getTypeValidator(type: string): ValidatorFn | undefined {\r\n return typeValidators[type];\r\n}\r\n","/**\r\n * Core validation engine - runs unchanged in browser and Node.js\r\n */\r\n\r\nimport type {\r\n ValidationResult,\r\n ValidationError,\r\n FieldDefinition,\r\n SchemaDefinition,\r\n ValidatorContext,\r\n} from '../types';\r\n\r\nimport { getValidator, getTypeValidator } from './validators';\r\n\r\n/**\r\n * Validate a single field\r\n */\r\nfunction validateField(\r\n fieldDef: FieldDefinition,\r\n value: unknown,\r\n context: ValidatorContext\r\n): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Type validation first\r\n const typeValidator = getTypeValidator(fieldDef.type);\r\n if (typeValidator) {\r\n const typeError = typeValidator(value, undefined, context);\r\n if (typeError) {\r\n errors.push(typeError);\r\n // If type is wrong, skip other validations\r\n return errors;\r\n }\r\n }\r\n\r\n // Required validation\r\n if (fieldDef.required) {\r\n const requiredValidator = getValidator('required');\r\n if (requiredValidator) {\r\n const error = requiredValidator(value, undefined, context);\r\n if (error) {\r\n errors.push(error);\r\n // If required and missing, skip other validations\r\n return errors;\r\n }\r\n }\r\n } else if (value === undefined || value === null || value === '') {\r\n // Skip other validations for optional empty fields\r\n return errors;\r\n }\r\n\r\n // Rule validations\r\n for (const rule of fieldDef.rules) {\r\n const validator = getValidator(rule.type);\r\n if (!validator) {\r\n console.warn(`Unknown validator: ${rule.type}`);\r\n continue;\r\n }\r\n\r\n const params = {\r\n ...rule.params,\r\n soft: rule.soft,\r\n message: rule.message,\r\n };\r\n\r\n const error = validator(value, params, context);\r\n if (error) {\r\n errors.push(error);\r\n }\r\n }\r\n\r\n // Nested schema validation (for object fields)\r\n if (fieldDef.type === 'object' && fieldDef.schema && value !== null && value !== undefined) {\r\n const nestedResult = validateSchema(fieldDef.schema, value as Record<string, unknown>, context.path, context.root);\r\n errors.push(...nestedResult.hardErrors, ...nestedResult.softErrors);\r\n }\r\n\r\n // Array item validation\r\n if (fieldDef.type === 'array' && fieldDef.items && Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const itemContext: ValidatorContext = {\r\n path: `${context.path}[${i}]`,\r\n root: context.root,\r\n parent: value,\r\n };\r\n const itemErrors = validateField(fieldDef.items, value[i], itemContext);\r\n errors.push(...itemErrors);\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate data against a schema\r\n */\r\nexport function validateSchema(\r\n schema: SchemaDefinition,\r\n data: Record<string, unknown>,\r\n basePath: string = '',\r\n root?: unknown\r\n): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n const rootData = root ?? data;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\r\n const value = data[fieldName];\r\n const path = basePath ? `${basePath}.${fieldName}` : fieldName;\r\n\r\n const context: ValidatorContext = {\r\n path,\r\n root: rootData,\r\n parent: data,\r\n };\r\n\r\n const errors = validateField(fieldDef, value, context);\r\n\r\n for (const error of errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Main validation function\r\n */\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): ValidationResult {\r\n return validateSchema(schema, data);\r\n}\r\n\r\n/**\r\n * Check if data is valid (no hard errors)\r\n */\r\nexport function isValid(schema: SchemaDefinition, data: Record<string, unknown>): boolean {\r\n return validate(schema, data).valid;\r\n}\r\n\r\n/**\r\n * Validate and throw if invalid\r\n */\r\nexport function assertValid<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): T {\r\n const result = validate(schema, data);\r\n if (!result.valid) {\r\n const error = new Error('Validation failed');\r\n (error as Error & { errors: ValidationError[] }).errors = result.hardErrors;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Merge multiple validation results\r\n */\r\nexport function mergeResults(...results: ValidationResult[]): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n for (const result of results) {\r\n hardErrors.push(...result.hardErrors);\r\n softErrors.push(...result.softErrors);\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Create an empty valid result\r\n */\r\nexport function validResult(): ValidationResult {\r\n return {\r\n valid: true,\r\n hardErrors: [],\r\n softErrors: [],\r\n };\r\n}\r\n\r\n/**\r\n * Create a result with a single error\r\n */\r\nexport function errorResult(\r\n field: string,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationResult {\r\n const error: ValidationError = {\r\n field,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n\r\n return {\r\n valid: soft,\r\n hardErrors: soft ? [] : [error],\r\n softErrors: soft ? [error] : [],\r\n };\r\n}\r\n","/**\r\n * Headless form utilities for frontend frameworks\r\n * Framework-agnostic - no React, Vue, or Svelte dependencies\r\n */\r\n\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\nimport { validate } from '../../core';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface FormState<T> {\r\n /** Current form values */\r\n values: T;\r\n /** Current validation errors by field */\r\n errors: Record<string, ValidationError[]>;\r\n /** Fields that have been touched (blurred) */\r\n touched: Set<string>;\r\n /** Fields that have been modified */\r\n dirty: Set<string>;\r\n /** Whether form is currently submitting */\r\n isSubmitting: boolean;\r\n /** Whether form has been submitted at least once */\r\n isSubmitted: boolean;\r\n /** Whether form is valid (no hard errors) */\r\n isValid: boolean;\r\n /** Soft warnings by field */\r\n warnings: Record<string, ValidationError[]>;\r\n}\r\n\r\nexport interface FormOptions<T> {\r\n /** Initial form values */\r\n initialValues?: Partial<T>;\r\n /** Validate on change */\r\n validateOnChange?: boolean;\r\n /** Validate on blur */\r\n validateOnBlur?: boolean;\r\n /** Custom submit handler */\r\n onSubmit?: (values: T, helpers: FormHelpers<T>) => void | Promise<void>;\r\n /** Called when validation fails */\r\n onValidationError?: (result: ValidationResult) => void;\r\n}\r\n\r\nexport interface FormHelpers<T> {\r\n /** Reset form to initial values */\r\n reset: () => void;\r\n /** Set form submitting state */\r\n setSubmitting: (isSubmitting: boolean) => void;\r\n /** Set field value */\r\n setFieldValue: (field: keyof T, value: unknown) => void;\r\n /** Set field error manually */\r\n setFieldError: (field: keyof T, error: string) => void;\r\n /** Clear all errors */\r\n clearErrors: () => void;\r\n /** Set server errors from API response */\r\n setServerErrors: (errors: ValidationError[]) => void;\r\n}\r\n\r\nexport interface FieldProps {\r\n /** Field name */\r\n name: string;\r\n /** Current value */\r\n value: unknown;\r\n /** Change handler */\r\n onChange: (value: unknown) => void;\r\n /** Blur handler */\r\n onBlur: () => void;\r\n /** Whether field has error */\r\n hasError: boolean;\r\n /** Error message (first error) */\r\n error: string | undefined;\r\n /** All error messages */\r\n errors: string[];\r\n /** Whether field has warning */\r\n hasWarning: boolean;\r\n /** Warning message (first warning) */\r\n warning: string | undefined;\r\n /** All warning messages */\r\n warnings: string[];\r\n /** Whether field has been touched */\r\n touched: boolean;\r\n /** Whether field has been modified */\r\n dirty: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Form Controller (Framework-Agnostic)\r\n// ============================================================================\r\n\r\n/**\r\n * Create a form controller for managing form state and validation\r\n *\r\n * @example\r\n * ```ts\r\n * const form = createForm(UserSchema, {\r\n * initialValues: { email: '', name: '' },\r\n * onSubmit: async (values) => {\r\n * await api.createUser(values);\r\n * },\r\n * });\r\n *\r\n * // In your UI:\r\n * const emailProps = form.getFieldProps('email');\r\n * // { name, value, onChange, onBlur, error, ... }\r\n * ```\r\n */\r\nexport function createForm<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options: FormOptions<InferInput<S>> = {}\r\n): FormController<InferInput<S>> {\r\n return new FormController(\r\n schema as unknown as SchemaBuilder<InferInput<S>>,\r\n options\r\n );\r\n}\r\n\r\nexport class FormController<T extends Record<string, unknown>> {\r\n private schema: SchemaBuilder<T>;\r\n private options: FormOptions<T>;\r\n private state: FormState<T>;\r\n private listeners: Set<() => void> = new Set();\r\n private initialValues: T;\r\n\r\n constructor(schema: SchemaBuilder<T>, options: FormOptions<T> = {}) {\r\n this.schema = schema;\r\n this.options = {\r\n validateOnChange: true,\r\n validateOnBlur: true,\r\n ...options,\r\n };\r\n\r\n // Build initial values from schema defaults and provided values\r\n this.initialValues = this.buildInitialValues();\r\n\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n }\r\n\r\n private buildInitialValues(): T {\r\n const values: Record<string, unknown> = {};\r\n const schemaFields = this.schema.definition.fields;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schemaFields)) {\r\n if (this.options.initialValues?.[fieldName as keyof T] !== undefined) {\r\n values[fieldName] = this.options.initialValues[fieldName as keyof T];\r\n } else if (fieldDef.defaultValue !== undefined) {\r\n values[fieldName] = fieldDef.defaultValue;\r\n } else {\r\n // Set appropriate empty value based on type\r\n switch (fieldDef.type) {\r\n case 'string':\r\n values[fieldName] = '';\r\n break;\r\n case 'number':\r\n values[fieldName] = undefined;\r\n break;\r\n case 'boolean':\r\n values[fieldName] = false;\r\n break;\r\n case 'array':\r\n values[fieldName] = [];\r\n break;\r\n case 'object':\r\n values[fieldName] = {};\r\n break;\r\n default:\r\n values[fieldName] = undefined;\r\n }\r\n }\r\n }\r\n\r\n return values as T;\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private notify(): void {\r\n for (const listener of this.listeners) {\r\n listener();\r\n }\r\n }\r\n\r\n /**\r\n * Get current form state\r\n */\r\n getState(): FormState<T> {\r\n return { ...this.state };\r\n }\r\n\r\n /**\r\n * Get current form values\r\n */\r\n getValues(): T {\r\n return { ...this.state.values };\r\n }\r\n\r\n /**\r\n * Set a field value\r\n */\r\n setFieldValue(field: keyof T, value: unknown): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n [field]: value,\r\n };\r\n this.state.dirty.add(field as string);\r\n\r\n if (this.options.validateOnChange) {\r\n this.validateField(field as string);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple values at once\r\n */\r\n setValues(values: Partial<T>): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n ...values,\r\n };\r\n\r\n for (const key of Object.keys(values)) {\r\n this.state.dirty.add(key);\r\n }\r\n\r\n if (this.options.validateOnChange) {\r\n this.validate();\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Mark a field as touched (blurred)\r\n */\r\n touchField(field: string): void {\r\n this.state.touched.add(field);\r\n\r\n if (this.options.validateOnBlur) {\r\n this.validateField(field);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Validate a single field\r\n */\r\n validateField(field: string): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Extract errors for this field\r\n const fieldHardErrors = result.hardErrors.filter((e) => e.field === field);\r\n const fieldSoftErrors = result.softErrors.filter((e) => e.field === field);\r\n\r\n this.state.errors[field] = fieldHardErrors;\r\n this.state.warnings[field] = fieldSoftErrors;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return {\r\n valid: fieldHardErrors.length === 0,\r\n hardErrors: fieldHardErrors,\r\n softErrors: fieldSoftErrors,\r\n };\r\n }\r\n\r\n /**\r\n * Validate entire form\r\n */\r\n validate(): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Group errors by field\r\n const errors: Record<string, ValidationError[]> = {};\r\n const warnings: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!errors[error.field]) {\r\n errors[error.field] = [];\r\n }\r\n errors[error.field]!.push(error);\r\n }\r\n\r\n for (const warning of result.softErrors) {\r\n if (!warnings[warning.field]) {\r\n warnings[warning.field] = [];\r\n }\r\n warnings[warning.field]!.push(warning);\r\n }\r\n\r\n this.state.errors = errors;\r\n this.state.warnings = warnings;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get field props for binding to UI\r\n */\r\n getFieldProps(field: keyof T): FieldProps {\r\n const fieldErrors = this.state.errors[field as string] || [];\r\n const fieldWarnings = this.state.warnings[field as string] || [];\r\n\r\n return {\r\n name: field as string,\r\n value: this.state.values[field],\r\n onChange: (value: unknown) => this.setFieldValue(field, value),\r\n onBlur: () => this.touchField(field as string),\r\n hasError: fieldErrors.length > 0,\r\n error: fieldErrors[0]?.message,\r\n errors: fieldErrors.map((e) => e.message),\r\n hasWarning: fieldWarnings.length > 0,\r\n warning: fieldWarnings[0]?.message,\r\n warnings: fieldWarnings.map((w) => w.message),\r\n touched: this.state.touched.has(field as string),\r\n dirty: this.state.dirty.has(field as string),\r\n };\r\n }\r\n\r\n /**\r\n * Get all field props\r\n */\r\n getAllFieldProps(): Record<keyof T, FieldProps> {\r\n const props: Record<string, FieldProps> = {};\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n props[field] = this.getFieldProps(field as keyof T);\r\n }\r\n return props as Record<keyof T, FieldProps>;\r\n }\r\n\r\n /**\r\n * Set field error manually (e.g., from server)\r\n */\r\n setFieldError(field: keyof T, message: string): void {\r\n const error: ValidationError = {\r\n field: field as string,\r\n code: 'SERVER_ERROR',\r\n message,\r\n severity: 'hard',\r\n };\r\n\r\n if (!this.state.errors[field as string]) {\r\n this.state.errors[field as string] = [];\r\n }\r\n this.state.errors[field as string]!.push(error);\r\n this.state.isValid = false;\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple errors from server response\r\n */\r\n setServerErrors(errors: ValidationError[]): void {\r\n for (const error of errors) {\r\n if (!this.state.errors[error.field]) {\r\n this.state.errors[error.field] = [];\r\n }\r\n\r\n if (error.severity === 'soft') {\r\n if (!this.state.warnings[error.field]) {\r\n this.state.warnings[error.field] = [];\r\n }\r\n this.state.warnings[error.field]!.push(error);\r\n } else {\r\n this.state.errors[error.field]!.push(error);\r\n }\r\n }\r\n\r\n this.state.isValid = errors.filter((e) => e.severity === 'hard').length === 0;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Clear all errors\r\n */\r\n clearErrors(): void {\r\n this.state.errors = {};\r\n this.state.warnings = {};\r\n this.state.isValid = true;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Reset form to initial values\r\n */\r\n reset(): void {\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n */\r\n async handleSubmit(): Promise<ValidationResult> {\r\n // Mark all fields as touched\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n this.state.touched.add(field);\r\n }\r\n\r\n // Validate\r\n const result = this.validate();\r\n\r\n if (!result.valid) {\r\n this.options.onValidationError?.(result);\r\n return result;\r\n }\r\n\r\n // Submit\r\n if (this.options.onSubmit) {\r\n this.state.isSubmitting = true;\r\n this.notify();\r\n\r\n try {\r\n const helpers: FormHelpers<T> = {\r\n reset: () => this.reset(),\r\n setSubmitting: (isSubmitting) => {\r\n this.state.isSubmitting = isSubmitting;\r\n this.notify();\r\n },\r\n setFieldValue: (field, value) => this.setFieldValue(field, value),\r\n setFieldError: (field, error) => this.setFieldError(field, error),\r\n clearErrors: () => this.clearErrors(),\r\n setServerErrors: (errors) => this.setServerErrors(errors),\r\n };\r\n\r\n await this.options.onSubmit(this.state.values, helpers);\r\n } finally {\r\n this.state.isSubmitting = false;\r\n this.state.isSubmitted = true;\r\n this.notify();\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a submit handler (for form onSubmit)\r\n */\r\n createSubmitHandler(): (e?: { preventDefault?: () => void }) => Promise<ValidationResult> {\r\n return async (e) => {\r\n e?.preventDefault?.();\r\n return this.handleSubmit();\r\n };\r\n }\r\n}\r\n","/**\r\n * Frontend utility functions for validation and error handling\r\n */\r\n\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\n\r\n// ============================================================================\r\n// Error Formatting\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first error message for a field\r\n */\r\nexport function getFieldError(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const error = result.hardErrors.find((e) => e.field === field);\r\n return error?.message;\r\n}\r\n\r\n/**\r\n * Get all error messages for a field\r\n */\r\nexport function getFieldErrors(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.hardErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Get the first warning message for a field\r\n */\r\nexport function getFieldWarning(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const warning = result.softErrors.find((e) => e.field === field);\r\n return warning?.message;\r\n}\r\n\r\n/**\r\n * Get all warning messages for a field\r\n */\r\nexport function getFieldWarnings(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.softErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Check if a field has errors\r\n */\r\nexport function hasFieldError(result: ValidationResult, field: string): boolean {\r\n return result.hardErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Check if a field has warnings\r\n */\r\nexport function hasFieldWarning(result: ValidationResult, field: string): boolean {\r\n return result.softErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Group errors by field\r\n */\r\nexport function groupErrorsByField(\r\n errors: ValidationError[]\r\n): Record<string, ValidationError[]> {\r\n const grouped: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of errors) {\r\n if (!grouped[error.field]) {\r\n grouped[error.field] = [];\r\n }\r\n grouped[error.field]!.push(error);\r\n }\r\n\r\n return grouped;\r\n}\r\n\r\n/**\r\n * Convert validation result to a simple error map\r\n */\r\nexport function toErrorMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!map[error.field]) {\r\n map[error.field] = error.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n/**\r\n * Convert validation result to a warnings map\r\n */\r\nexport function toWarningsMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const warning of result.softErrors) {\r\n if (!map[warning.field]) {\r\n map[warning.field] = warning.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n// ============================================================================\r\n// API Response Handling\r\n// ============================================================================\r\n\r\n/**\r\n * Parse errors from an API response\r\n */\r\nexport function parseApiErrors(response: {\r\n errors?: ValidationError[];\r\n validation?: {\r\n hard_validations?: ValidationError[];\r\n soft_validations?: ValidationError[];\r\n };\r\n}): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n // Handle flat errors array\r\n if (response.errors) {\r\n for (const error of response.errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n // Handle structured validation object\r\n if (response.validation) {\r\n if (response.validation.hard_validations) {\r\n hardErrors.push(...response.validation.hard_validations);\r\n }\r\n if (response.validation.soft_validations) {\r\n softErrors.push(...response.validation.soft_validations);\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Debouncing\r\n// ============================================================================\r\n\r\n/**\r\n * Create a debounced validation function\r\n */\r\nexport function debounceValidation<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number = 300\r\n): T & { cancel: () => void } {\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const debounced = ((...args: unknown[]) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n timeoutId = setTimeout(() => {\r\n resolve(fn(...args));\r\n }, delay);\r\n });\r\n }) as T & { cancel: () => void };\r\n\r\n debounced.cancel = () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n };\r\n\r\n return debounced;\r\n}\r\n\r\n// ============================================================================\r\n// Focus Management\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first field with an error\r\n */\r\nexport function getFirstErrorField(result: ValidationResult): string | undefined {\r\n return result.hardErrors[0]?.field;\r\n}\r\n\r\n/**\r\n * Focus the first field with an error (browser only)\r\n */\r\nexport function focusFirstError(\r\n result: ValidationResult,\r\n options: { scrollIntoView?: boolean } = {}\r\n): void {\r\n const field = getFirstErrorField(result);\r\n if (!field) return;\r\n\r\n // Try to find element by name or id\r\n const element =\r\n document.querySelector<HTMLElement>(`[name=\"${field}\"]`) ||\r\n document.getElementById(field);\r\n\r\n if (element) {\r\n element.focus();\r\n if (options.scrollIntoView) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Value Coercion\r\n// ============================================================================\r\n\r\n/**\r\n * Coerce form values to appropriate types based on schema\r\n */\r\nexport function coerceValue(value: unknown, type: string): unknown {\r\n if (value === '' || value === undefined || value === null) {\r\n return type === 'string' ? '' : undefined;\r\n }\r\n\r\n switch (type) {\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? undefined : num;\r\n\r\n case 'boolean':\r\n if (typeof value === 'boolean') return value;\r\n if (value === 'true' || value === '1') return true;\r\n if (value === 'false' || value === '0') return false;\r\n return Boolean(value);\r\n\r\n case 'date':\r\n if (value instanceof Date) return value;\r\n const date = new Date(value as string);\r\n return isNaN(date.getTime()) ? undefined : date;\r\n\r\n case 'array':\r\n if (Array.isArray(value)) return value;\r\n if (typeof value === 'string') {\r\n try {\r\n const parsed = JSON.parse(value);\r\n return Array.isArray(parsed) ? parsed : [value];\r\n } catch {\r\n return [value];\r\n }\r\n }\r\n return [value];\r\n\r\n default:\r\n return value;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../src/core/validators.ts","../../../src/core/engine.ts","../../../src/adapters/frontend/form.ts","../../../src/adapters/frontend/utils.ts"],"names":["validate"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Built-in validators for common validation rules\r\n */\r\n\r\nimport type { ValidatorFn, ValidationError, ValidatorContext } from '../types';\r\n\r\n/**\r\n * Create a validation error\r\n */\r\nfunction createError(\r\n context: ValidatorContext,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationError {\r\n return {\r\n field: context.path,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Type Validators\r\n// ============================================================================\r\n\r\nexport const typeValidators: Record<string, ValidatorFn> = {\r\n string: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'string') {\r\n return createError(context, 'INVALID_TYPE', `Expected string, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n number: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'number') {\r\n return createError(context, 'INVALID_TYPE', `Expected number, got ${typeof value}`);\r\n }\r\n if (typeof value === 'number' && isNaN(value)) {\r\n return createError(context, 'INVALID_NUMBER', 'Value is not a valid number');\r\n }\r\n return null;\r\n },\r\n\r\n boolean: (value, _params, context) => {\r\n if (value !== undefined && value !== null && typeof value !== 'boolean') {\r\n return createError(context, 'INVALID_TYPE', `Expected boolean, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n date: (value, _params, context) => {\r\n if (value === undefined || value === null) return null;\r\n if (value instanceof Date) {\r\n if (isNaN(value.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date value');\r\n }\r\n return null;\r\n }\r\n // Try parsing string dates\r\n if (typeof value === 'string') {\r\n const parsed = new Date(value);\r\n if (isNaN(parsed.getTime())) {\r\n return createError(context, 'INVALID_DATE', 'Invalid date format');\r\n }\r\n return null;\r\n }\r\n return createError(context, 'INVALID_TYPE', `Expected date, got ${typeof value}`);\r\n },\r\n\r\n array: (value, _params, context) => {\r\n if (value !== undefined && value !== null && !Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected array, got ${typeof value}`);\r\n }\r\n return null;\r\n },\r\n\r\n object: (value, _params, context) => {\r\n if (value !== undefined && value !== null) {\r\n if (typeof value !== 'object' || Array.isArray(value)) {\r\n return createError(context, 'INVALID_TYPE', `Expected object, got ${typeof value}`);\r\n }\r\n }\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Rule Validators\r\n// ============================================================================\r\n\r\nexport const ruleValidators: Record<string, ValidatorFn> = {\r\n required: (value, _params, context) => {\r\n const isEmpty =\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0);\r\n\r\n if (isEmpty) {\r\n return createError(context, 'REQUIRED', 'This field is required');\r\n }\r\n return null;\r\n },\r\n\r\n min: (value, params, context) => {\r\n const min = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value < min) {\r\n return createError(\r\n context,\r\n 'MIN_VALUE',\r\n message || `Value must be at least ${min}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_LENGTH',\r\n message || `Must be at least ${min} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length < min) {\r\n return createError(\r\n context,\r\n 'MIN_ITEMS',\r\n message || `Must have at least ${min} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n max: (value, params, context) => {\r\n const max = params?.value as number;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (value === undefined || value === null) return null;\r\n\r\n if (typeof value === 'number') {\r\n if (value > max) {\r\n return createError(\r\n context,\r\n 'MAX_VALUE',\r\n message || `Value must be at most ${max}`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_LENGTH',\r\n message || `Must be at most ${max} characters`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length > max) {\r\n return createError(\r\n context,\r\n 'MAX_ITEMS',\r\n message || `Must have at most ${max} items`,\r\n soft\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n email: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_EMAIL', 'Email must be a string', soft);\r\n }\r\n\r\n // RFC 5322 simplified email regex\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_EMAIL',\r\n message || 'Invalid email address',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n pattern: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const pattern = params?.pattern as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') return null;\r\n\r\n const regex = new RegExp(pattern);\r\n if (!regex.test(value)) {\r\n return createError(\r\n context,\r\n 'PATTERN_MISMATCH',\r\n message || `Value does not match required pattern`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n url: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_URL', 'URL must be a string', soft);\r\n }\r\n\r\n try {\r\n new URL(value);\r\n return null;\r\n } catch {\r\n return createError(\r\n context,\r\n 'INVALID_URL',\r\n message || 'Invalid URL format',\r\n soft\r\n );\r\n }\r\n },\r\n\r\n ipAddress: (value, params, context) => {\r\n if (value === undefined || value === null || value === '') return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'string') {\r\n return createError(context, 'INVALID_IP', 'IP address must be a string', soft);\r\n }\r\n\r\n // Validate IPv4 address with proper octet range (0-255)\r\n const ipv4Pattern = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\r\n\r\n if (!ipv4Pattern.test(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_IP',\r\n message || 'Invalid IP address format',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n enum: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const values = params?.values as unknown[];\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!values.includes(value)) {\r\n return createError(\r\n context,\r\n 'INVALID_ENUM',\r\n message || `Value must be one of: ${values.join(', ')}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n custom: (value, params, context) => {\r\n const validate = params?.validate as (\r\n value: unknown,\r\n context: ValidatorContext\r\n ) => { valid: boolean; message?: string } | boolean;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (!validate) return null;\r\n\r\n const result = validate(value, context);\r\n\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n if (!result.valid) {\r\n return createError(\r\n context,\r\n 'CUSTOM_VALIDATION',\r\n result.message || message || 'Validation failed',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Enterprise patterns - matches field against another field\r\n matches: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const otherField = params?.field as string;\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n const root = context.root as Record<string, unknown>;\r\n\r\n const otherValue = root[otherField];\r\n\r\n if (value !== otherValue) {\r\n return createError(\r\n context,\r\n 'FIELD_MISMATCH',\r\n message || `Must match ${otherField}`,\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Integer validation\r\n integer: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value !== 'number' || !Number.isInteger(value)) {\r\n return createError(\r\n context,\r\n 'NOT_INTEGER',\r\n message || 'Value must be an integer',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Positive number validation\r\n positive: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value <= 0) {\r\n return createError(\r\n context,\r\n 'NOT_POSITIVE',\r\n message || 'Value must be positive',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // Negative number validation\r\n negative: (value, params, context) => {\r\n if (value === undefined || value === null) return null;\r\n\r\n const soft = params?.soft as boolean;\r\n const message = params?.message as string | undefined;\r\n\r\n if (typeof value === 'number' && value >= 0) {\r\n return createError(\r\n context,\r\n 'NOT_NEGATIVE',\r\n message || 'Value must be negative',\r\n soft\r\n );\r\n }\r\n\r\n return null;\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Validator Registry\r\n// ============================================================================\r\n\r\nconst customValidators: Map<string, ValidatorFn> = new Map();\r\n\r\n/**\r\n * Register a custom validator\r\n */\r\nexport function registerValidator(name: string, validator: ValidatorFn): void {\r\n customValidators.set(name, validator);\r\n}\r\n\r\n/**\r\n * Get a validator by name\r\n */\r\nexport function getValidator(name: string): ValidatorFn | undefined {\r\n return ruleValidators[name] ?? customValidators.get(name);\r\n}\r\n\r\n/**\r\n * Get a type validator\r\n */\r\nexport function getTypeValidator(type: string): ValidatorFn | undefined {\r\n return typeValidators[type];\r\n}\r\n","/**\r\n * Core validation engine - runs unchanged in browser and Node.js\r\n */\r\n\r\nimport type {\r\n ValidationResult,\r\n ValidationError,\r\n FieldDefinition,\r\n SchemaDefinition,\r\n ValidatorContext,\r\n} from '../types';\r\n\r\nimport { getValidator, getTypeValidator } from './validators';\r\n\r\n/**\r\n * Validate a single field\r\n */\r\nfunction validateField(\r\n fieldDef: FieldDefinition,\r\n value: unknown,\r\n context: ValidatorContext\r\n): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Type validation first\r\n const typeValidator = getTypeValidator(fieldDef.type);\r\n if (typeValidator) {\r\n const typeError = typeValidator(value, undefined, context);\r\n if (typeError) {\r\n errors.push(typeError);\r\n // If type is wrong, skip other validations\r\n return errors;\r\n }\r\n }\r\n\r\n // Required validation\r\n if (fieldDef.required) {\r\n const requiredValidator = getValidator('required');\r\n if (requiredValidator) {\r\n const error = requiredValidator(value, undefined, context);\r\n if (error) {\r\n errors.push(error);\r\n // If required and missing, skip other validations\r\n return errors;\r\n }\r\n }\r\n } else if (value === undefined || value === null || value === '') {\r\n // Skip other validations for optional empty fields\r\n return errors;\r\n }\r\n\r\n // Rule validations\r\n for (const rule of fieldDef.rules) {\r\n const validator = getValidator(rule.type);\r\n if (!validator) {\r\n console.warn(`Unknown validator: ${rule.type}`);\r\n continue;\r\n }\r\n\r\n const params = {\r\n ...rule.params,\r\n soft: rule.soft,\r\n message: rule.message,\r\n };\r\n\r\n const error = validator(value, params, context);\r\n if (error) {\r\n errors.push(error);\r\n }\r\n }\r\n\r\n // Nested schema validation (for object fields)\r\n if (fieldDef.type === 'object' && fieldDef.schema && value !== null && value !== undefined) {\r\n const nestedResult = validateSchema(fieldDef.schema, value as Record<string, unknown>, context.path, context.root);\r\n errors.push(...nestedResult.hardErrors, ...nestedResult.softErrors);\r\n }\r\n\r\n // Array item validation\r\n if (fieldDef.type === 'array' && fieldDef.items && Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const itemContext: ValidatorContext = {\r\n path: `${context.path}[${i}]`,\r\n root: context.root,\r\n parent: value,\r\n };\r\n const itemErrors = validateField(fieldDef.items, value[i], itemContext);\r\n errors.push(...itemErrors);\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate data against a schema\r\n */\r\nexport function validateSchema(\r\n schema: SchemaDefinition,\r\n data: Record<string, unknown>,\r\n basePath: string = '',\r\n root?: unknown\r\n): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n const rootData = root ?? data;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\r\n const value = data[fieldName];\r\n const path = basePath ? `${basePath}.${fieldName}` : fieldName;\r\n\r\n const context: ValidatorContext = {\r\n path,\r\n root: rootData,\r\n parent: data,\r\n };\r\n\r\n const errors = validateField(fieldDef, value, context);\r\n\r\n for (const error of errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Main validation function\r\n */\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): ValidationResult {\r\n return validateSchema(schema, data);\r\n}\r\n\r\n/**\r\n * Check if data is valid (no hard errors)\r\n */\r\nexport function isValid(schema: SchemaDefinition, data: Record<string, unknown>): boolean {\r\n return validate(schema, data).valid;\r\n}\r\n\r\n/**\r\n * Validate and throw if invalid\r\n */\r\nexport function assertValid<T extends Record<string, unknown>>(\r\n schema: SchemaDefinition,\r\n data: T\r\n): T {\r\n const result = validate(schema, data);\r\n if (!result.valid) {\r\n const error = new Error('Validation failed');\r\n (error as Error & { errors: ValidationError[] }).errors = result.hardErrors;\r\n throw error;\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Merge multiple validation results\r\n */\r\nexport function mergeResults(...results: ValidationResult[]): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n for (const result of results) {\r\n hardErrors.push(...result.hardErrors);\r\n softErrors.push(...result.softErrors);\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Create an empty valid result\r\n */\r\nexport function validResult(): ValidationResult {\r\n return {\r\n valid: true,\r\n hardErrors: [],\r\n softErrors: [],\r\n };\r\n}\r\n\r\n/**\r\n * Create a result with a single error\r\n */\r\nexport function errorResult(\r\n field: string,\r\n code: string,\r\n message: string,\r\n soft: boolean = false\r\n): ValidationResult {\r\n const error: ValidationError = {\r\n field,\r\n code,\r\n message,\r\n severity: soft ? 'soft' : 'hard',\r\n };\r\n\r\n return {\r\n valid: soft,\r\n hardErrors: soft ? [] : [error],\r\n softErrors: soft ? [error] : [],\r\n };\r\n}\r\n","/**\r\n * Headless form utilities for frontend frameworks\r\n * Framework-agnostic - no React, Vue, or Svelte dependencies\r\n */\r\n\r\nimport type { SchemaBuilder, InferInput } from '../../schema';\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\nimport { validate } from '../../core';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface FormState<T> {\r\n /** Current form values */\r\n values: T;\r\n /** Current validation errors by field */\r\n errors: Record<string, ValidationError[]>;\r\n /** Fields that have been touched (blurred) */\r\n touched: Set<string>;\r\n /** Fields that have been modified */\r\n dirty: Set<string>;\r\n /** Whether form is currently submitting */\r\n isSubmitting: boolean;\r\n /** Whether form has been submitted at least once */\r\n isSubmitted: boolean;\r\n /** Whether form is valid (no hard errors) */\r\n isValid: boolean;\r\n /** Soft warnings by field */\r\n warnings: Record<string, ValidationError[]>;\r\n}\r\n\r\nexport interface FormOptions<T> {\r\n /** Initial form values */\r\n initialValues?: Partial<T>;\r\n /** Validate on change */\r\n validateOnChange?: boolean;\r\n /** Validate on blur */\r\n validateOnBlur?: boolean;\r\n /** Custom submit handler */\r\n onSubmit?: (values: T, helpers: FormHelpers<T>) => void | Promise<void>;\r\n /** Called when validation fails */\r\n onValidationError?: (result: ValidationResult) => void;\r\n}\r\n\r\nexport interface FormHelpers<T> {\r\n /** Reset form to initial values */\r\n reset: () => void;\r\n /** Set form submitting state */\r\n setSubmitting: (isSubmitting: boolean) => void;\r\n /** Set field value */\r\n setFieldValue: (field: keyof T, value: unknown) => void;\r\n /** Set field error manually */\r\n setFieldError: (field: keyof T, error: string) => void;\r\n /** Clear all errors */\r\n clearErrors: () => void;\r\n /** Set server errors from API response */\r\n setServerErrors: (errors: ValidationError[]) => void;\r\n}\r\n\r\nexport interface FieldProps {\r\n /** Field name */\r\n name: string;\r\n /** Current value */\r\n value: unknown;\r\n /** Change handler */\r\n onChange: (value: unknown) => void;\r\n /** Blur handler */\r\n onBlur: () => void;\r\n /** Whether field has error */\r\n hasError: boolean;\r\n /** Error message (first error) */\r\n error: string | undefined;\r\n /** All error messages */\r\n errors: string[];\r\n /** Whether field has warning */\r\n hasWarning: boolean;\r\n /** Warning message (first warning) */\r\n warning: string | undefined;\r\n /** All warning messages */\r\n warnings: string[];\r\n /** Whether field has been touched */\r\n touched: boolean;\r\n /** Whether field has been modified */\r\n dirty: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Form Controller (Framework-Agnostic)\r\n// ============================================================================\r\n\r\n/**\r\n * Create a form controller for managing form state and validation\r\n *\r\n * @example\r\n * ```ts\r\n * const form = createForm(UserSchema, {\r\n * initialValues: { email: '', name: '' },\r\n * onSubmit: async (values) => {\r\n * await api.createUser(values);\r\n * },\r\n * });\r\n *\r\n * // In your UI:\r\n * const emailProps = form.getFieldProps('email');\r\n * // { name, value, onChange, onBlur, error, ... }\r\n * ```\r\n */\r\nexport function createForm<S extends SchemaBuilder<Record<string, unknown>>>(\r\n schema: S,\r\n options: FormOptions<InferInput<S>> = {}\r\n): FormController<InferInput<S>> {\r\n return new FormController(\r\n schema as unknown as SchemaBuilder<InferInput<S>>,\r\n options\r\n );\r\n}\r\n\r\nexport class FormController<T extends Record<string, unknown>> {\r\n private schema: SchemaBuilder<T>;\r\n private options: FormOptions<T>;\r\n private state: FormState<T>;\r\n private listeners: Set<() => void> = new Set();\r\n private initialValues: T;\r\n\r\n constructor(schema: SchemaBuilder<T>, options: FormOptions<T> = {}) {\r\n this.schema = schema;\r\n this.options = {\r\n validateOnChange: true,\r\n validateOnBlur: true,\r\n ...options,\r\n };\r\n\r\n // Build initial values from schema defaults and provided values\r\n this.initialValues = this.buildInitialValues();\r\n\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n }\r\n\r\n private buildInitialValues(): T {\r\n const values: Record<string, unknown> = {};\r\n const schemaFields = this.schema.definition.fields;\r\n\r\n for (const [fieldName, fieldDef] of Object.entries(schemaFields)) {\r\n if (this.options.initialValues?.[fieldName as keyof T] !== undefined) {\r\n values[fieldName] = this.options.initialValues[fieldName as keyof T];\r\n } else if (fieldDef.defaultValue !== undefined) {\r\n values[fieldName] = fieldDef.defaultValue;\r\n } else {\r\n // Set appropriate empty value based on type\r\n switch (fieldDef.type) {\r\n case 'string':\r\n values[fieldName] = '';\r\n break;\r\n case 'number':\r\n values[fieldName] = undefined;\r\n break;\r\n case 'boolean':\r\n values[fieldName] = false;\r\n break;\r\n case 'array':\r\n values[fieldName] = [];\r\n break;\r\n case 'object':\r\n values[fieldName] = {};\r\n break;\r\n default:\r\n values[fieldName] = undefined;\r\n }\r\n }\r\n }\r\n\r\n return values as T;\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private notify(): void {\r\n for (const listener of this.listeners) {\r\n listener();\r\n }\r\n }\r\n\r\n /**\r\n * Get current form state\r\n */\r\n getState(): FormState<T> {\r\n return { ...this.state };\r\n }\r\n\r\n /**\r\n * Get current form values\r\n */\r\n getValues(): T {\r\n return { ...this.state.values };\r\n }\r\n\r\n /**\r\n * Set a field value\r\n */\r\n setFieldValue(field: keyof T, value: unknown): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n [field]: value,\r\n };\r\n this.state.dirty.add(field as string);\r\n\r\n if (this.options.validateOnChange) {\r\n this.validateField(field as string);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple values at once\r\n */\r\n setValues(values: Partial<T>): void {\r\n this.state.values = {\r\n ...this.state.values,\r\n ...values,\r\n };\r\n\r\n for (const key of Object.keys(values)) {\r\n this.state.dirty.add(key);\r\n }\r\n\r\n if (this.options.validateOnChange) {\r\n this.validate();\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Mark a field as touched (blurred)\r\n */\r\n touchField(field: string): void {\r\n this.state.touched.add(field);\r\n\r\n if (this.options.validateOnBlur) {\r\n this.validateField(field);\r\n }\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Validate a single field\r\n */\r\n validateField(field: string): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Extract errors for this field\r\n const fieldHardErrors = result.hardErrors.filter((e) => e.field === field);\r\n const fieldSoftErrors = result.softErrors.filter((e) => e.field === field);\r\n\r\n this.state.errors[field] = fieldHardErrors;\r\n this.state.warnings[field] = fieldSoftErrors;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return {\r\n valid: fieldHardErrors.length === 0,\r\n hardErrors: fieldHardErrors,\r\n softErrors: fieldSoftErrors,\r\n };\r\n }\r\n\r\n /**\r\n * Validate entire form\r\n */\r\n validate(): ValidationResult {\r\n const result = validate(this.schema.definition, this.state.values as Record<string, unknown>);\r\n\r\n // Group errors by field\r\n const errors: Record<string, ValidationError[]> = {};\r\n const warnings: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!errors[error.field]) {\r\n errors[error.field] = [];\r\n }\r\n errors[error.field]!.push(error);\r\n }\r\n\r\n for (const warning of result.softErrors) {\r\n if (!warnings[warning.field]) {\r\n warnings[warning.field] = [];\r\n }\r\n warnings[warning.field]!.push(warning);\r\n }\r\n\r\n this.state.errors = errors;\r\n this.state.warnings = warnings;\r\n this.state.isValid = result.valid;\r\n\r\n this.notify();\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get field props for binding to UI\r\n */\r\n getFieldProps(field: keyof T): FieldProps {\r\n const fieldErrors = this.state.errors[field as string] || [];\r\n const fieldWarnings = this.state.warnings[field as string] || [];\r\n\r\n return {\r\n name: field as string,\r\n value: this.state.values[field],\r\n onChange: (value: unknown) => this.setFieldValue(field, value),\r\n onBlur: () => this.touchField(field as string),\r\n hasError: fieldErrors.length > 0,\r\n error: fieldErrors[0]?.message,\r\n errors: fieldErrors.map((e) => e.message),\r\n hasWarning: fieldWarnings.length > 0,\r\n warning: fieldWarnings[0]?.message,\r\n warnings: fieldWarnings.map((w) => w.message),\r\n touched: this.state.touched.has(field as string),\r\n dirty: this.state.dirty.has(field as string),\r\n };\r\n }\r\n\r\n /**\r\n * Get all field props\r\n */\r\n getAllFieldProps(): Record<keyof T, FieldProps> {\r\n const props: Record<string, FieldProps> = {};\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n props[field] = this.getFieldProps(field as keyof T);\r\n }\r\n return props as Record<keyof T, FieldProps>;\r\n }\r\n\r\n /**\r\n * Set field error manually (e.g., from server)\r\n */\r\n setFieldError(field: keyof T, message: string): void {\r\n const error: ValidationError = {\r\n field: field as string,\r\n code: 'SERVER_ERROR',\r\n message,\r\n severity: 'hard',\r\n };\r\n\r\n if (!this.state.errors[field as string]) {\r\n this.state.errors[field as string] = [];\r\n }\r\n this.state.errors[field as string]!.push(error);\r\n this.state.isValid = false;\r\n\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Set multiple errors from server response\r\n */\r\n setServerErrors(errors: ValidationError[]): void {\r\n for (const error of errors) {\r\n if (!this.state.errors[error.field]) {\r\n this.state.errors[error.field] = [];\r\n }\r\n\r\n if (error.severity === 'soft') {\r\n if (!this.state.warnings[error.field]) {\r\n this.state.warnings[error.field] = [];\r\n }\r\n this.state.warnings[error.field]!.push(error);\r\n } else {\r\n this.state.errors[error.field]!.push(error);\r\n }\r\n }\r\n\r\n this.state.isValid = errors.filter((e) => e.severity === 'hard').length === 0;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Clear all errors\r\n */\r\n clearErrors(): void {\r\n this.state.errors = {};\r\n this.state.warnings = {};\r\n this.state.isValid = true;\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Reset form to initial values\r\n */\r\n reset(): void {\r\n this.state = {\r\n values: { ...this.initialValues },\r\n errors: {},\r\n warnings: {},\r\n touched: new Set(),\r\n dirty: new Set(),\r\n isSubmitting: false,\r\n isSubmitted: false,\r\n isValid: true,\r\n };\r\n this.notify();\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n */\r\n async handleSubmit(): Promise<ValidationResult> {\r\n // Mark all fields as touched\r\n for (const field of Object.keys(this.schema.definition.fields)) {\r\n this.state.touched.add(field);\r\n }\r\n\r\n // Validate\r\n const result = this.validate();\r\n\r\n if (!result.valid) {\r\n this.options.onValidationError?.(result);\r\n return result;\r\n }\r\n\r\n // Submit\r\n if (this.options.onSubmit) {\r\n this.state.isSubmitting = true;\r\n this.notify();\r\n\r\n try {\r\n const helpers: FormHelpers<T> = {\r\n reset: () => this.reset(),\r\n setSubmitting: (isSubmitting) => {\r\n this.state.isSubmitting = isSubmitting;\r\n this.notify();\r\n },\r\n setFieldValue: (field, value) => this.setFieldValue(field, value),\r\n setFieldError: (field, error) => this.setFieldError(field, error),\r\n clearErrors: () => this.clearErrors(),\r\n setServerErrors: (errors) => this.setServerErrors(errors),\r\n };\r\n\r\n await this.options.onSubmit(this.state.values, helpers);\r\n } finally {\r\n this.state.isSubmitting = false;\r\n this.state.isSubmitted = true;\r\n this.notify();\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a submit handler (for form onSubmit)\r\n */\r\n createSubmitHandler(): (e?: { preventDefault?: () => void }) => Promise<ValidationResult> {\r\n return async (e) => {\r\n e?.preventDefault?.();\r\n return this.handleSubmit();\r\n };\r\n }\r\n}\r\n","/**\r\n * Frontend utility functions for validation and error handling\r\n */\r\n\r\nimport type { ValidationResult, ValidationError } from '../../types';\r\n\r\n// ============================================================================\r\n// Error Formatting\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first error message for a field\r\n */\r\nexport function getFieldError(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const error = result.hardErrors.find((e) => e.field === field);\r\n return error?.message;\r\n}\r\n\r\n/**\r\n * Get all error messages for a field\r\n */\r\nexport function getFieldErrors(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.hardErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Get the first warning message for a field\r\n */\r\nexport function getFieldWarning(\r\n result: ValidationResult,\r\n field: string\r\n): string | undefined {\r\n const warning = result.softErrors.find((e) => e.field === field);\r\n return warning?.message;\r\n}\r\n\r\n/**\r\n * Get all warning messages for a field\r\n */\r\nexport function getFieldWarnings(\r\n result: ValidationResult,\r\n field: string\r\n): string[] {\r\n return result.softErrors\r\n .filter((e) => e.field === field)\r\n .map((e) => e.message);\r\n}\r\n\r\n/**\r\n * Check if a field has errors\r\n */\r\nexport function hasFieldError(result: ValidationResult, field: string): boolean {\r\n return result.hardErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Check if a field has warnings\r\n */\r\nexport function hasFieldWarning(result: ValidationResult, field: string): boolean {\r\n return result.softErrors.some((e) => e.field === field);\r\n}\r\n\r\n/**\r\n * Group errors by field\r\n */\r\nexport function groupErrorsByField(\r\n errors: ValidationError[]\r\n): Record<string, ValidationError[]> {\r\n const grouped: Record<string, ValidationError[]> = {};\r\n\r\n for (const error of errors) {\r\n if (!grouped[error.field]) {\r\n grouped[error.field] = [];\r\n }\r\n grouped[error.field]!.push(error);\r\n }\r\n\r\n return grouped;\r\n}\r\n\r\n/**\r\n * Convert validation result to a simple error map\r\n */\r\nexport function toErrorMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const error of result.hardErrors) {\r\n if (!map[error.field]) {\r\n map[error.field] = error.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n/**\r\n * Convert validation result to a warnings map\r\n */\r\nexport function toWarningsMap(result: ValidationResult): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n for (const warning of result.softErrors) {\r\n if (!map[warning.field]) {\r\n map[warning.field] = warning.message;\r\n }\r\n }\r\n\r\n return map;\r\n}\r\n\r\n// ============================================================================\r\n// API Response Handling\r\n// ============================================================================\r\n\r\n/**\r\n * Parse errors from an API response\r\n */\r\nexport function parseApiErrors(response: {\r\n errors?: ValidationError[];\r\n validation?: {\r\n hard_validations?: ValidationError[];\r\n soft_validations?: ValidationError[];\r\n };\r\n}): ValidationResult {\r\n const hardErrors: ValidationError[] = [];\r\n const softErrors: ValidationError[] = [];\r\n\r\n // Handle flat errors array\r\n if (response.errors) {\r\n for (const error of response.errors) {\r\n if (error.severity === 'soft') {\r\n softErrors.push(error);\r\n } else {\r\n hardErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n // Handle structured validation object\r\n if (response.validation) {\r\n if (response.validation.hard_validations) {\r\n hardErrors.push(...response.validation.hard_validations);\r\n }\r\n if (response.validation.soft_validations) {\r\n softErrors.push(...response.validation.soft_validations);\r\n }\r\n }\r\n\r\n return {\r\n valid: hardErrors.length === 0,\r\n hardErrors,\r\n softErrors,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Debouncing\r\n// ============================================================================\r\n\r\n/**\r\n * Create a debounced validation function\r\n */\r\nexport function debounceValidation<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number = 300\r\n): T & { cancel: () => void } {\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const debounced = ((...args: unknown[]) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n timeoutId = setTimeout(() => {\r\n resolve(fn(...args));\r\n }, delay);\r\n });\r\n }) as T & { cancel: () => void };\r\n\r\n debounced.cancel = () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n };\r\n\r\n return debounced;\r\n}\r\n\r\n// ============================================================================\r\n// Focus Management\r\n// ============================================================================\r\n\r\n/**\r\n * Get the first field with an error\r\n */\r\nexport function getFirstErrorField(result: ValidationResult): string | undefined {\r\n return result.hardErrors[0]?.field;\r\n}\r\n\r\n/**\r\n * Focus the first field with an error (browser only)\r\n */\r\nexport function focusFirstError(\r\n result: ValidationResult,\r\n options: { scrollIntoView?: boolean } = {}\r\n): void {\r\n const field = getFirstErrorField(result);\r\n if (!field) return;\r\n\r\n // Try to find element by name or id\r\n const element =\r\n document.querySelector<HTMLElement>(`[name=\"${field}\"]`) ||\r\n document.getElementById(field);\r\n\r\n if (element) {\r\n element.focus();\r\n if (options.scrollIntoView) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Value Coercion\r\n// ============================================================================\r\n\r\n/**\r\n * Coerce form values to appropriate types based on schema\r\n */\r\nexport function coerceValue(value: unknown, type: string): unknown {\r\n if (value === '' || value === undefined || value === null) {\r\n return type === 'string' ? '' : undefined;\r\n }\r\n\r\n switch (type) {\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? undefined : num;\r\n\r\n case 'boolean':\r\n if (typeof value === 'boolean') return value;\r\n if (value === 'true' || value === '1') return true;\r\n if (value === 'false' || value === '0') return false;\r\n return Boolean(value);\r\n\r\n case 'date':\r\n if (value instanceof Date) return value;\r\n const date = new Date(value as string);\r\n return isNaN(date.getTime()) ? undefined : date;\r\n\r\n case 'array':\r\n if (Array.isArray(value)) return value;\r\n if (typeof value === 'string') {\r\n try {\r\n const parsed = JSON.parse(value);\r\n return Array.isArray(parsed) ? parsed : [value];\r\n } catch {\r\n return [value];\r\n }\r\n }\r\n return [value];\r\n\r\n default:\r\n return value;\r\n }\r\n}\r\n"]}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as SchemaDefinition, V as ValidationResult, a as ValidatorFn } from './schema-BwQtngae.mjs';
2
- export { A as ArrayFieldBuilder, B as BaseFieldBuilder, h as BooleanFieldBuilder, D as DateFieldBuilder, q as EnterpriseValidationResponse, E as EnumFieldBuilder, l as FieldDefinition, F as FieldType, I as InferInput, c as InferOutput, N as NumberFieldBuilder, O as ObjectFieldBuilder, d as SchemaBuilder, g as StringFieldBuilder, j as ValidationError, k as ValidationRule, i as ValidationSeverity, n as ValidatorContext, e as extend, f as field, m as merge, o as omit, b as partial, p as pick, s as schema, t as toEnterpriseResponse } from './schema-BwQtngae.mjs';
1
+ import { S as SchemaDefinition, V as ValidationResult, a as ValidatorFn } from './schema-D9DGC9E_.mjs';
2
+ export { A as ArrayFieldBuilder, B as BaseFieldBuilder, h as BooleanFieldBuilder, D as DateFieldBuilder, q as EnterpriseValidationResponse, E as EnumFieldBuilder, l as FieldDefinition, F as FieldType, I as InferInput, c as InferOutput, N as NumberFieldBuilder, O as ObjectFieldBuilder, d as SchemaBuilder, g as StringFieldBuilder, j as ValidationError, k as ValidationRule, i as ValidationSeverity, n as ValidatorContext, e as extend, f as field, m as merge, o as omit, b as partial, p as pick, s as schema, t as toEnterpriseResponse } from './schema-D9DGC9E_.mjs';
3
3
 
4
4
  /**
5
5
  * Core validation engine - runs unchanged in browser and Node.js
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as SchemaDefinition, V as ValidationResult, a as ValidatorFn } from './schema-BwQtngae.js';
2
- export { A as ArrayFieldBuilder, B as BaseFieldBuilder, h as BooleanFieldBuilder, D as DateFieldBuilder, q as EnterpriseValidationResponse, E as EnumFieldBuilder, l as FieldDefinition, F as FieldType, I as InferInput, c as InferOutput, N as NumberFieldBuilder, O as ObjectFieldBuilder, d as SchemaBuilder, g as StringFieldBuilder, j as ValidationError, k as ValidationRule, i as ValidationSeverity, n as ValidatorContext, e as extend, f as field, m as merge, o as omit, b as partial, p as pick, s as schema, t as toEnterpriseResponse } from './schema-BwQtngae.js';
1
+ import { S as SchemaDefinition, V as ValidationResult, a as ValidatorFn } from './schema-D9DGC9E_.js';
2
+ export { A as ArrayFieldBuilder, B as BaseFieldBuilder, h as BooleanFieldBuilder, D as DateFieldBuilder, q as EnterpriseValidationResponse, E as EnumFieldBuilder, l as FieldDefinition, F as FieldType, I as InferInput, c as InferOutput, N as NumberFieldBuilder, O as ObjectFieldBuilder, d as SchemaBuilder, g as StringFieldBuilder, j as ValidationError, k as ValidationRule, i as ValidationSeverity, n as ValidatorContext, e as extend, f as field, m as merge, o as omit, b as partial, p as pick, s as schema, t as toEnterpriseResponse } from './schema-D9DGC9E_.js';
3
3
 
4
4
  /**
5
5
  * Core validation engine - runs unchanged in browser and Node.js
package/dist/index.js CHANGED
@@ -199,6 +199,24 @@ var ruleValidators = {
199
199
  );
200
200
  }
201
201
  },
202
+ ipAddress: (value, params, context) => {
203
+ if (value === void 0 || value === null || value === "") return null;
204
+ const soft = params?.soft;
205
+ const message = params?.message;
206
+ if (typeof value !== "string") {
207
+ return createError(context, "INVALID_IP", "IP address must be a string", soft);
208
+ }
209
+ const ipv4Pattern = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
210
+ if (!ipv4Pattern.test(value)) {
211
+ return createError(
212
+ context,
213
+ "INVALID_IP",
214
+ message || "Invalid IP address format",
215
+ soft
216
+ );
217
+ }
218
+ return null;
219
+ },
202
220
  enum: (value, params, context) => {
203
221
  if (value === void 0 || value === null) return null;
204
222
  const values = params?.values;
@@ -593,6 +611,16 @@ var StringFieldBuilder = class extends BaseFieldBuilder {
593
611
  });
594
612
  return this;
595
613
  }
614
+ /**
615
+ * Validate as IP address (IPv4)
616
+ */
617
+ ipAddress(message) {
618
+ this._rules.push({
619
+ type: "ipAddress",
620
+ message
621
+ });
622
+ return this;
623
+ }
596
624
  /**
597
625
  * Match a regex pattern
598
626
  */