@tachui/forms 0.7.0-alpha1
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.
- package/LICENSE +363 -0
- package/dist/Form-ueYEcSg1.cjs +2 -0
- package/dist/Form-ueYEcSg1.cjs.map +1 -0
- package/dist/Form-ylAr3o_e.js +376 -0
- package/dist/Form-ylAr3o_e.js.map +1 -0
- package/dist/components/Form.d.ts +76 -0
- package/dist/components/Form.d.ts.map +1 -0
- package/dist/components/index.cjs +2 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +31 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/input/Checkbox.d.ts +42 -0
- package/dist/components/input/Checkbox.d.ts.map +1 -0
- package/dist/components/input/Radio.d.ts +36 -0
- package/dist/components/input/Radio.d.ts.map +1 -0
- package/dist/components/input/Select.d.ts +21 -0
- package/dist/components/input/Select.d.ts.map +1 -0
- package/dist/components/input/TextField.d.ts +58 -0
- package/dist/components/input/TextField.d.ts.map +1 -0
- package/dist/components/input/index.d.ts +11 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/forms-complex-BiQsZZlT.js +361 -0
- package/dist/forms-complex-BiQsZZlT.js.map +1 -0
- package/dist/forms-complex-DLEnXXJ5.cjs +2 -0
- package/dist/forms-complex-DLEnXXJ5.cjs.map +1 -0
- package/dist/forms-core-B1bx1drO.js +839 -0
- package/dist/forms-core-B1bx1drO.js.map +1 -0
- package/dist/forms-core-W_JGVLAI.cjs +9 -0
- package/dist/forms-core-W_JGVLAI.cjs.map +1 -0
- package/dist/forms-inputs-6QdeMWFk.js +1075 -0
- package/dist/forms-inputs-6QdeMWFk.js.map +1 -0
- package/dist/forms-inputs-DQ5QI_SU.cjs +2 -0
- package/dist/forms-inputs-DQ5QI_SU.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +383 -0
- package/dist/index.js.map +1 -0
- package/dist/state/index.cjs +2 -0
- package/dist/state/index.cjs.map +1 -0
- package/dist/state/index.d.ts +46 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +9 -0
- package/dist/state/index.js.map +1 -0
- package/dist/types/index.d.ts +452 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/formatters.d.ts +98 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/validators.d.ts +101 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/validation/component-validation.d.ts +52 -0
- package/dist/validation/component-validation.d.ts.map +1 -0
- package/dist/validation/index.cjs +2 -0
- package/dist/validation/index.cjs.map +1 -0
- package/dist/validation/index.d.ts +141 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +21 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms-core-B1bx1drO.js","sources":["../src/validation/component-validation.ts","../src/validation/index.ts","../src/state/index.ts"],"sourcesContent":["/**\n * Forms Package Component Validation\n *\n * Validation for @tachui/forms components that registers with the Core\n * validation system, following proper plugin architecture.\n */\n\n// Import from core to register with the validation system\nimport type { ComponentValidator } from '@tachui/core/validation'\n\n/**\n * TachUI Forms validation error class\n */\nexport class FormsValidationError extends Error {\n constructor(\n message: string,\n public context: {\n component: string\n property?: string\n suggestion?: string\n documentation?: string\n example?: {\n wrong: string\n correct: string\n }\n }\n ) {\n super(message)\n this.name = 'FormsValidationError'\n }\n\n getFormattedMessage(): string {\n const { component, suggestion, example, documentation } = this.context\n \n let formatted = `ā [@tachui/forms] ${component} Component Error: ${this.message}\\n`\n\n if (suggestion) {\n formatted += `\\nš” Suggestion: ${suggestion}\\n`\n }\n\n if (example) {\n formatted += `\\nā Wrong: ${example.wrong}`\n formatted += `\\nā
Correct: ${example.correct}\\n`\n }\n\n if (documentation) {\n formatted += `\\nš Documentation: ${documentation}`\n }\n\n return formatted\n }\n}\n\n/**\n * Forms Components Validation\n */\nexport const FormsComponentValidation = {\n \n // EmailField Component\n validateEmailField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('EmailField component requires a props object with value', {\n component: 'EmailField',\n suggestion: 'Add value: EmailField({ value: emailSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/emailfield',\n example: {\n wrong: 'EmailField()',\n correct: 'EmailField({ value: emailSignal, onChange: handleChange })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('EmailField requires a props object', {\n component: 'EmailField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'EmailField(\"email@example.com\")',\n correct: 'EmailField({ value: \"email@example.com\" })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('EmailField value property is required', {\n component: 'EmailField',\n suggestion: 'Provide a value for the email field',\n example: {\n wrong: 'EmailField({ placeholder: \"Email\" })',\n correct: 'EmailField({ value: emailSignal, placeholder: \"Email\" })'\n }\n })\n }\n },\n\n // PasswordField Component\n validatePasswordField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('PasswordField component requires a props object with value', {\n component: 'PasswordField',\n suggestion: 'Add value: PasswordField({ value: passwordSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/passwordfield',\n example: {\n wrong: 'PasswordField()',\n correct: 'PasswordField({ value: passwordSignal, onChange: handleChange })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('PasswordField requires a props object', {\n component: 'PasswordField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'PasswordField(\"password\")',\n correct: 'PasswordField({ value: passwordSignal })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('PasswordField value property is required', {\n component: 'PasswordField',\n suggestion: 'Provide a value for the password field',\n example: {\n wrong: 'PasswordField({ placeholder: \"Password\" })',\n correct: 'PasswordField({ value: passwordSignal, placeholder: \"Password\" })'\n }\n })\n }\n },\n\n // PhoneField Component \n validatePhoneField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('PhoneField component requires a props object with value', {\n component: 'PhoneField',\n suggestion: 'Add value: PhoneField({ value: phoneSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/phonefield',\n example: {\n wrong: 'PhoneField()',\n correct: 'PhoneField({ value: phoneSignal, format: \"US\" })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('PhoneField requires a props object', {\n component: 'PhoneField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'PhoneField(\"(555) 123-4567\")',\n correct: 'PhoneField({ value: phoneSignal })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('PhoneField value property is required', {\n component: 'PhoneField',\n suggestion: 'Provide a value for the phone field',\n example: {\n wrong: 'PhoneField({ format: \"US\" })',\n correct: 'PhoneField({ value: phoneSignal, format: \"US\" })'\n }\n })\n }\n },\n\n // NumberField Component\n validateNumberField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('NumberField component requires a props object with value', {\n component: 'NumberField',\n suggestion: 'Add value: NumberField({ value: numberSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/numberfield',\n example: {\n wrong: 'NumberField()',\n correct: 'NumberField({ value: numberSignal, min: 0, max: 100 })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('NumberField requires a props object', {\n component: 'NumberField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'NumberField(42)',\n correct: 'NumberField({ value: 42 })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('NumberField value property is required', {\n component: 'NumberField',\n suggestion: 'Provide a numeric value for the field',\n example: {\n wrong: 'NumberField({ min: 0, max: 100 })',\n correct: 'NumberField({ value: 42, min: 0, max: 100 })'\n }\n })\n }\n },\n\n // CreditCardField Component\n validateCreditCardField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('CreditCardField component requires a props object with value', {\n component: 'CreditCardField',\n suggestion: 'Add value: CreditCardField({ value: cardSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/creditcardfield',\n example: {\n wrong: 'CreditCardField()',\n correct: 'CreditCardField({ value: cardSignal, onChange: handleChange })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('CreditCardField requires a props object', {\n component: 'CreditCardField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'CreditCardField(\"4111111111111111\")',\n correct: 'CreditCardField({ value: cardSignal })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('CreditCardField value property is required', {\n component: 'CreditCardField',\n suggestion: 'Provide a value for the credit card field',\n example: {\n wrong: 'CreditCardField({ placeholder: \"Card Number\" })',\n correct: 'CreditCardField({ value: cardSignal, placeholder: \"Card Number\" })'\n }\n })\n }\n },\n\n // Additional Forms components would go here...\n // (SearchField, URLField, TextArea, ColorField, Select, MultiSelect, Checkbox, Radio, etc.)\n}\n\n/**\n * Create Forms component validators for registration\n */\nexport function createFormsValidators(): ComponentValidator[] {\n return [\n {\n packageName: 'forms',\n componentName: 'EmailField',\n validate: FormsComponentValidation.validateEmailField\n },\n {\n packageName: 'forms',\n componentName: 'PasswordField',\n validate: FormsComponentValidation.validatePasswordField\n },\n {\n packageName: 'forms',\n componentName: 'PhoneField',\n validate: FormsComponentValidation.validatePhoneField\n },\n {\n packageName: 'forms',\n componentName: 'NumberField',\n validate: FormsComponentValidation.validateNumberField\n },\n {\n packageName: 'forms',\n componentName: 'CreditCardField',\n validate: FormsComponentValidation.validateCreditCardField\n }\n // Additional validators would be added here for remaining 9+ Forms components\n ]\n}\n\n/**\n * Register Forms validators with Core validation system\n */\nexport async function registerFormsValidators(): Promise<void> {\n try {\n // Dynamic import to avoid circular dependency\n const { registerComponentValidator } = await import('@tachui/core/validation')\n \n const validators = createFormsValidators()\n \n for (const validator of validators) {\n registerComponentValidator(validator)\n }\n \n if (process.env.NODE_ENV !== 'production') {\n console.info(`š [@tachui/forms] Registered ${validators.length} component validators`)\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('ā ļø [@tachui/forms] Could not register validators with Core:', error)\n }\n }\n}\n\n// Auto-register when Forms package loads\nif (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {\n setTimeout(registerFormsValidators, 10)\n}","/**\n * TachUI Forms Validation System\n *\n * Comprehensive validation engine with built-in rules, custom validators,\n * async validation support, and i18n-ready error messages.\n */\n\nimport type {\n CustomValidationRule,\n FieldState,\n FieldValidation,\n ValidationResult,\n ValidationRule,\n} from '../types'\n\n/**\n * Built-in validation rules\n */\nconst VALIDATION_RULES: Record<string, (value: any, options?: any) => ValidationResult> = {\n required: (value: any): ValidationResult => ({\n valid: value !== null && value !== undefined && value !== '',\n message: 'This field is required',\n code: 'REQUIRED',\n }),\n\n email: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return {\n valid: emailRegex.test(value),\n message: 'Please enter a valid email address',\n code: 'INVALID_EMAIL',\n }\n },\n\n url: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n try {\n new URL(value)\n return { valid: true }\n } catch {\n return {\n valid: false,\n message: 'Please enter a valid URL',\n code: 'INVALID_URL',\n }\n }\n },\n\n number: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num),\n message: 'Please enter a valid number',\n code: 'INVALID_NUMBER',\n }\n },\n\n integer: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num) && Number.isInteger(num),\n message: 'Please enter a valid integer',\n code: 'INVALID_INTEGER',\n }\n },\n\n min: (value: any, options: { min: number }): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n if (Number.isNaN(num)) return { valid: true } // Let number validation handle this\n\n return {\n valid: num >= options.min,\n message: `Value must be at least ${options.min}`,\n code: 'MIN_VALUE',\n }\n },\n\n max: (value: any, options: { max: number }): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n if (Number.isNaN(num)) return { valid: true } // Let number validation handle this\n\n return {\n valid: num <= options.max,\n message: `Value must be at most ${options.max}`,\n code: 'MAX_VALUE',\n }\n },\n\n minLength: (value: string, options: { minLength: number }): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: value.length >= options.minLength,\n message: `Must be at least ${options.minLength} characters`,\n code: 'MIN_LENGTH',\n }\n },\n\n maxLength: (value: string, options: { maxLength: number }): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: value.length <= options.maxLength,\n message: `Must be at most ${options.maxLength} characters`,\n code: 'MAX_LENGTH',\n }\n },\n\n pattern: (\n value: string,\n options: { pattern: string | RegExp; message?: string }\n ): ValidationResult => {\n if (!value) return { valid: true }\n const regex =\n typeof options.pattern === 'string' ? new RegExp(options.pattern) : options.pattern\n return {\n valid: regex.test(value),\n message: options.message || 'Value does not match required pattern',\n code: 'PATTERN_MISMATCH',\n }\n },\n\n // Additional validation rules expected by tests\n numeric: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num),\n message: 'Please enter a valid number',\n code: 'INVALID_NUMERIC',\n }\n },\n\n phone: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const phoneRegex = /^\\+?[\\d\\s\\-().]+$/\n const digits = value.replace(/[\\s\\-().]/g, '')\n return {\n valid: phoneRegex.test(value) && digits.length >= 10,\n message: 'Please enter a valid phone number',\n code: 'INVALID_PHONE',\n }\n },\n\n creditCard: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const digits = value.replace(/\\s/g, '')\n // Basic Luhn algorithm check\n let sum = 0\n let alternate = false\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = parseInt(digits.charAt(i))\n if (alternate) {\n n *= 2\n if (n > 9) n = (n % 10) + 1\n }\n sum += n\n alternate = !alternate\n }\n return {\n valid: /^\\d{13,19}$/.test(digits) && sum % 10 === 0,\n message: 'Please enter a valid credit card number',\n code: 'INVALID_CREDIT_CARD',\n }\n },\n\n ssn: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const digits = value.replace(/[-\\s]/g, '')\n return {\n valid: /^\\d{9}$/.test(digits),\n message: 'Please enter a valid Social Security Number',\n code: 'INVALID_SSN',\n }\n },\n\n postalCode: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n // US ZIP code (5 or 9 digits) or international postal codes\n const usZip = /^\\d{5}(-\\d{4})?$/\n const intlPostal = /^[A-Z0-9]{3,10}$/i\n return {\n valid: usZip.test(value) || intlPostal.test(value),\n message: 'Please enter a valid postal code',\n code: 'INVALID_POSTAL_CODE',\n }\n },\n\n zipCode: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n // US ZIP code (5 or 9 digits)\n const usZip = /^\\d{5}(-\\d{4})?$/\n return {\n valid: usZip.test(value),\n message: 'Please enter a valid ZIP code',\n code: 'INVALID_ZIP_CODE',\n }\n },\n\n date: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const date = new Date(value)\n return {\n valid: !Number.isNaN(date.getTime()) && !!value.match(/^\\d{4}-\\d{2}-\\d{2}$/),\n message: 'Please enter a valid date (YYYY-MM-DD)',\n code: 'INVALID_DATE',\n }\n },\n\n time: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(value),\n message: 'Please enter a valid time (HH:MM)',\n code: 'INVALID_TIME',\n }\n },\n\n strongPassword: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const hasUpperCase = /[A-Z]/.test(value)\n const hasLowerCase = /[a-z]/.test(value)\n const hasNumbers = /\\d/.test(value)\n const hasNonalphas = /\\W/.test(value)\n const isLongEnough = value.length >= 8\n\n const valid = hasUpperCase && hasLowerCase && hasNumbers && hasNonalphas && isLongEnough\n return {\n valid,\n message: valid\n ? undefined\n : 'Password must be at least 8 characters with uppercase, lowercase, number and special character',\n code: 'WEAK_PASSWORD',\n }\n },\n}\n\n/**\n * Custom validation rule registry\n */\nconst customRules = new Map<string, CustomValidationRule>()\n\n/**\n * Register a custom validation rule\n */\nexport function registerValidationRule(rule: CustomValidationRule): void {\n customRules.set(rule.name, rule)\n}\n\n/**\n * Unregister a custom validation rule\n */\nexport function unregisterValidationRule(name: string): void {\n customRules.delete(name)\n}\n\n/**\n * Get all registered validation rules\n */\nexport function getValidationRules(): string[] {\n return [...Object.keys(VALIDATION_RULES), ...customRules.keys()]\n}\n\n/**\n * Validate a single value against validation rules\n */\nexport function validateValue(\n value: any,\n rules: ValidationRule[],\n options?: Record<string, any>\n): ValidationResult {\n for (const rule of rules) {\n let result: ValidationResult\n\n if (typeof rule === 'string') {\n // Built-in rule\n const validator = VALIDATION_RULES[rule]\n if (validator) {\n result = validator(value, options?.[rule])\n } else {\n // Check custom rules\n const customRule = customRules.get(rule)\n if (customRule) {\n result = customRule.validate(value, customRule.options)\n } else {\n console.warn(`Unknown validation rule: ${rule}`)\n continue\n }\n }\n } else if ('validate' in rule) {\n // Custom validation rule object\n result = rule.validate(value, rule.options)\n } else {\n // Built-in validation rule object (BuiltInValidationRule)\n const validator = VALIDATION_RULES[rule.name]\n if (validator) {\n result = validator(value, rule.options)\n } else {\n console.warn(`Unknown built-in validation rule: ${rule.name}`)\n continue\n }\n }\n\n if (!result.valid) {\n return result\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Validate a field state\n */\nexport function validateField(field: FieldState, validation?: FieldValidation): ValidationResult {\n if (!validation?.rules || validation.rules.length === 0) {\n return { valid: true }\n }\n\n return validateValue(field.value, validation.rules)\n}\n\n/**\n * Async validation function\n */\nexport async function validateValueAsync(\n value: any,\n rules: ValidationRule[],\n options?: Record<string, any>\n): Promise<ValidationResult> {\n for (const rule of rules) {\n let result: ValidationResult | Promise<ValidationResult>\n\n if (typeof rule === 'string') {\n const validator = VALIDATION_RULES[rule]\n if (validator) {\n result = validator(value, options?.[rule])\n } else {\n const customRule = customRules.get(rule)\n if (customRule) {\n result = customRule.validate(value, customRule.options)\n } else {\n continue\n }\n }\n } else if ('validate' in rule) {\n // Custom validation rule object\n result = rule.validate(value, rule.options)\n } else {\n // Built-in validation rule object (BuiltInValidationRule)\n const validator = VALIDATION_RULES[rule.name]\n if (validator) {\n result = validator(value, rule.options)\n } else {\n continue\n }\n }\n\n // Handle async validation\n const validationResult = await Promise.resolve(result)\n\n if (!validationResult.valid) {\n return validationResult\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Debounced validation\n */\nexport function createDebouncedValidator(\n validator: (value: any) => ValidationResult | Promise<ValidationResult>,\n delayMs: number = 300\n) {\n let timeoutId: ReturnType<typeof setTimeout>\n let lastValue: any\n let lastResult: ValidationResult | Promise<ValidationResult>\n\n return (value: any): Promise<ValidationResult> => {\n return new Promise((resolve) => {\n // If value hasn't changed, return cached result\n if (value === lastValue && lastResult) {\n Promise.resolve(lastResult).then(resolve)\n return\n }\n\n lastValue = value\n\n // Clear previous timeout\n clearTimeout(timeoutId)\n\n // Set new timeout\n timeoutId = setTimeout(async () => {\n try {\n lastResult = validator(value)\n const result = await Promise.resolve(lastResult)\n resolve(result)\n } catch (_error) {\n resolve({\n valid: false,\n message: 'Validation error occurred',\n code: 'VALIDATION_ERROR',\n })\n }\n }, delayMs)\n })\n }\n}\n\n/**\n * Cross-field validation utilities\n */\nexport const CrossFieldValidators = {\n /**\n * Validate that two fields match (e.g., password confirmation)\n */\n fieldMatch:\n (field1: string, field2: string, message = 'Fields must match') =>\n (values: Record<string, any>): ValidationResult => {\n const isValid = values[field1] === values[field2]\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'FIELD_MISMATCH',\n }\n },\n\n /**\n * Validate that at least one field in a group is filled\n */\n requireOneOf:\n (fields: string[], message = 'At least one field is required') =>\n (values: Record<string, any>): ValidationResult => {\n const hasValue = fields.some((field) => {\n const value = values[field]\n return value !== null && value !== undefined && value !== ''\n })\n\n if (hasValue) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'REQUIRE_ONE_OF',\n }\n },\n\n /**\n * Validate that a field is required when another field has a specific value\n */\n requiredWhen:\n (\n targetField: string,\n conditionalField: string,\n conditionalValue: any,\n message = `${targetField} is required`\n ) =>\n (values: Record<string, any>): ValidationResult => {\n if (values[conditionalField] === conditionalValue) {\n const targetValue = values[targetField]\n const isValid = targetValue !== null && targetValue !== undefined && targetValue !== ''\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'REQUIRED_WHEN',\n }\n }\n return { valid: true }\n },\n\n /**\n * Validate date range (start date before end date)\n */\n dateRange:\n (startField: string, endField: string, message = 'End date must be after start date') =>\n (values: Record<string, any>): ValidationResult => {\n const startDate = values[startField]\n const endDate = values[endField]\n\n if (!startDate || !endDate) return { valid: true }\n\n const start = new Date(startDate)\n const end = new Date(endDate)\n const isValid = end >= start\n\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'INVALID_DATE_RANGE',\n }\n },\n}\n\n/**\n * Built-in validation rule presets\n */\nexport const ValidationPresets = {\n email: ['required', 'email'],\n password: ['required', { name: 'minLength', options: { minLength: 8 } }],\n phone: [\n 'required',\n { name: 'pattern', options: { pattern: /^\\+?[\\d\\s-()]+$/, message: 'Invalid phone number' } },\n ],\n url: ['required', 'url'],\n positiveNumber: ['required', 'number', { name: 'min', options: { min: 0 } }],\n percentage: [\n 'required',\n 'number',\n { name: 'min', options: { min: 0 } },\n { name: 'max', options: { max: 100 } },\n ],\n}\n\n/**\n * Validation message formatter\n */\nexport class ValidationMessageFormatter {\n private messages: Record<string, string> = {}\n\n constructor(messages: Record<string, string> = {}) {\n this.messages = messages\n }\n\n setMessage(code: string, message: string): void {\n this.messages[code] = message\n }\n\n setMessages(messages: Record<string, string>): void {\n this.messages = { ...this.messages, ...messages }\n }\n\n format(result: ValidationResult, fieldName?: string): string {\n if (result.code && this.messages[result.code]) {\n return this.messages[result.code].replace(`\\${field}`, fieldName || 'field')\n }\n return result.message || 'Validation failed'\n }\n}\n\n/**\n * Default validation message formatter instance\n */\nexport const defaultMessageFormatter = new ValidationMessageFormatter()\n\n/**\n * Validation utilities\n */\nexport const ValidationUtils = {\n /**\n * Check if a validation result represents an error\n */\n isError: (result: ValidationResult): boolean => !result.valid,\n\n /**\n * Check if a validation result is valid\n */\n isValid: (result: ValidationResult): boolean => result.valid,\n\n /**\n * Combine multiple validation results\n */\n combineResults: (results: ValidationResult[]): ValidationResult => {\n const errors = results.filter((r) => !r.valid)\n if (errors.length === 0) {\n return { valid: true }\n }\n\n return {\n valid: false,\n message: errors.map((e) => e.message).join(', '),\n code: 'MULTIPLE_ERRORS',\n }\n },\n\n /**\n * Create a validation function from a rule configuration\n */\n createValidator:\n (rules: ValidationRule[], options?: Record<string, any>) =>\n (value: any): ValidationResult =>\n validateValue(value, rules, options),\n\n /**\n * Create an async validation function\n */\n createAsyncValidator:\n (rules: ValidationRule[], options?: Record<string, any>) =>\n (value: any): Promise<ValidationResult> =>\n validateValueAsync(value, rules, options),\n}\n\n// Export all validation functionality\nexport { VALIDATION_RULES }\n\n// Export component validation for plugin registration\nexport * from './component-validation'\n","/**\n * TachUI Forms State Management\n *\n * Reactive form state management with validation, field tracking,\n * and form lifecycle management using TachUI's signal system.\n */\n\nimport { createComputed, createEffect, createSignal } from '@tachui/core'\nimport type {\n FieldState,\n FieldValidation,\n FormState,\n FormSubmitHandler,\n UseFormReturn,\n ValidationResult,\n} from '../types'\nimport { validateValueAsync } from '../validation'\n\n/**\n * Create a reactive field state\n */\nfunction createFieldState<T = any>(\n initialValue?: T\n): {\n state: () => FieldState<T>\n setValue: (value: T) => void\n setError: (error: string | undefined) => void\n setTouched: (touched: boolean) => void\n setFocused: (focused: boolean) => void\n setValidating: (validating: boolean) => void\n} {\n const [value, setValue] = createSignal<T>(initialValue as T)\n const [error, setError] = createSignal<string | undefined>(undefined)\n const [touched, setTouched] = createSignal(false)\n const [dirty, setDirty] = createSignal(false)\n const [focused, setFocused] = createSignal(false)\n const [validating, setValidating] = createSignal(false)\n\n // Mark dirty when value changes from initial\n createEffect(() => {\n const currentValue = value()\n if (currentValue !== initialValue) {\n setDirty(true)\n }\n })\n\n const valid = createComputed(() => !error())\n\n const state = createComputed(\n (): FieldState<T> => ({\n value: value(),\n error: error(),\n touched: touched(),\n dirty: dirty(),\n valid: valid(),\n validating: validating(),\n focused: focused(),\n })\n )\n\n return {\n state,\n setValue: (newValue: T) => {\n setValue(newValue)\n // Mark dirty if value changed from initial\n if (newValue !== initialValue) {\n setDirty(true)\n } else {\n setDirty(false)\n }\n if (touched()) {\n // Trigger validation if field is touched\n // This will be handled by the form's validation system\n }\n },\n setError,\n setTouched,\n setFocused,\n setValidating,\n }\n}\n\n/**\n * Create a form state manager\n */\nexport function createFormState(initialValues: Record<string, any> = {}): UseFormReturn {\n const fields = new Map<string, ReturnType<typeof createFieldState>>()\n const validations = new Map<string, FieldValidation>()\n\n const [submitting, setSubmitting] = createSignal(false)\n const [submitted, setSubmitted] = createSignal(false)\n\n // Auto-register fields from initial values\n Object.keys(initialValues).forEach((name) => {\n const fieldManager = createFieldState(initialValues[name])\n fields.set(name, fieldManager)\n })\n\n // Reactive form state\n const formState = createComputed((): FormState => {\n const fieldStates: Record<string, FieldState> = {}\n const errors: Record<string, string> = {}\n const touched: Record<string, boolean> = {}\n let valid = true\n let dirty = false\n\n for (const [name, fieldManager] of fields) {\n const fieldState = fieldManager.state()\n fieldStates[name] = fieldState\n\n if (fieldState.error) {\n errors[name] = fieldState.error\n valid = false\n }\n\n if (fieldState.touched) {\n touched[name] = true\n }\n\n if (fieldState.dirty) {\n dirty = true\n }\n }\n\n return {\n fields: fieldStates,\n valid,\n dirty,\n submitting: submitting(),\n submitted: submitted(),\n errors,\n touched,\n }\n })\n\n // Register a field\n const register = (name: string, validation?: FieldValidation) => {\n if (fields.has(name)) {\n // Field already exists, just update validation if provided\n if (validation) {\n validations.set(name, validation)\n }\n return\n }\n\n const fieldManager = createFieldState(initialValues[name])\n fields.set(name, fieldManager)\n\n if (validation) {\n validations.set(name, validation)\n }\n\n // Set up validation effects\n if (validation) {\n const fieldState = fieldManager.state\n\n createEffect(async () => {\n const state = fieldState()\n const shouldValidate =\n validation.validateOn === 'change' ||\n (validation.validateOn === 'blur' && state.touched) ||\n (validation.validateOn === 'submit' && submitted())\n\n if (shouldValidate && (state.dirty || state.touched)) {\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(state, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n } finally {\n fieldManager.setValidating(false)\n }\n }\n })\n }\n }\n\n // Unregister a field\n const unregister = (name: string) => {\n fields.delete(name)\n validations.delete(name)\n }\n\n // Set field value\n const setValue = (name: string, value: any) => {\n const fieldManager = fields.get(name)\n if (fieldManager) {\n fieldManager.setValue(value)\n }\n }\n\n // Get field value\n const getValue = (name: string) => {\n const fieldManager = fields.get(name)\n return fieldManager?.state().value\n }\n\n // Get field error\n const getError = (name: string) => {\n const fieldManager = fields.get(name)\n return fieldManager?.state().error\n }\n\n // Validate a specific field\n const validateField = async (name: string): Promise<boolean> => {\n const fieldManager = fields.get(name)\n const validation = validations.get(name)\n\n if (!fieldManager || !validation) {\n return true\n }\n\n const fieldState = fieldManager.state()\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(fieldState, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n return result.valid\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n return false\n } finally {\n fieldManager.setValidating(false)\n }\n }\n\n // Validate entire form\n const validateForm = async (): Promise<boolean> => {\n const validationPromises = Array.from(fields.keys()).map(validateField)\n const results = await Promise.all(validationPromises)\n return results.every((result) => result)\n }\n\n // Reset form to initial state\n const resetForm = () => {\n for (const [name, fieldManager] of fields) {\n fieldManager.setValue(initialValues[name])\n fieldManager.setError(undefined)\n fieldManager.setTouched(false)\n fieldManager.setFocused(false)\n fieldManager.setValidating(false)\n }\n setSubmitting(false)\n setSubmitted(false)\n }\n\n // Submit form\n const submitForm = async (handler?: FormSubmitHandler) => {\n setSubmitting(true)\n setSubmitted(true)\n\n try {\n // Validate all fields\n const isValid = await validateForm()\n\n if (isValid && handler) {\n // Collect form values\n const values: Record<string, any> = {}\n for (const [name, fieldManager] of fields) {\n values[name] = fieldManager.state().value\n }\n\n await handler(values, formState())\n }\n } finally {\n setSubmitting(false)\n }\n }\n\n // Watch for changes in specific fields\n const watch = (fieldNames?: string[]): Record<string, any> => {\n const values: Record<string, any> = {}\n const fieldsToWatch = fieldNames || Array.from(fields.keys())\n\n for (const name of fieldsToWatch) {\n if (fields.has(name)) {\n values[name] = getValue(name)\n }\n }\n\n return values\n }\n\n // Trigger validation for specific fields\n const trigger = async (fieldNames?: string[]): Promise<boolean> => {\n const fieldsToValidate = fieldNames || Array.from(fields.keys())\n const validationPromises = fieldsToValidate.map(validateField)\n const results = await Promise.all(validationPromises)\n return results.every((result) => result)\n }\n\n return {\n fields: formState().fields,\n state: formState(),\n register,\n unregister,\n setValue,\n getValue,\n getError,\n validateField,\n validateForm,\n resetForm,\n submitForm,\n watch,\n trigger,\n }\n}\n\n/**\n * Async field validation helper\n */\nasync function validateFieldAsync(\n fieldState: FieldState,\n validation: FieldValidation\n): Promise<ValidationResult> {\n if (!validation.rules || validation.rules.length === 0) {\n return { valid: true }\n }\n\n // Use debounced validation if specified\n if (validation.debounceMs) {\n return new Promise((resolve) => {\n setTimeout(async () => {\n const result = await validateValueAsync(fieldState.value, validation.rules!)\n resolve(result)\n }, validation.debounceMs)\n\n // Store timeout ID for potential cleanup\n // In a real implementation, you'd want to manage this better\n })\n }\n\n return validateValueAsync(fieldState.value, validation.rules)\n}\n\n/**\n * Form field hook for individual field management\n */\nexport function createField<T = any>(\n _name: string,\n initialValue?: T,\n validation?: FieldValidation\n): {\n value: () => T\n setValue: (value: T) => void\n error: () => string | undefined\n touched: () => boolean\n dirty: () => boolean\n valid: () => boolean\n validating: () => boolean\n focused: () => boolean\n onFocus: () => void\n onBlur: () => void\n validate: () => Promise<boolean>\n reset: () => void\n} {\n const fieldManager = createFieldState(initialValue)\n const fieldState = fieldManager.state\n\n // Validation effect\n if (validation) {\n createEffect(async () => {\n const state = fieldState()\n const shouldValidate =\n validation.validateOn === 'change' || (validation.validateOn === 'blur' && state.touched)\n\n if (shouldValidate && (state.dirty || state.touched)) {\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(state, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n } finally {\n fieldManager.setValidating(false)\n }\n }\n })\n }\n\n const validate = async (): Promise<boolean> => {\n if (!validation) return true\n\n fieldManager.setValidating(true)\n try {\n const result = await validateFieldAsync(fieldState(), validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n return result.valid\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n return false\n } finally {\n fieldManager.setValidating(false)\n }\n }\n\n const reset = () => {\n fieldManager.setValue(initialValue as T)\n fieldManager.setError(undefined)\n fieldManager.setTouched(false)\n fieldManager.setFocused(false)\n fieldManager.setValidating(false)\n }\n\n return {\n value: () => fieldState().value,\n setValue: fieldManager.setValue,\n error: () => fieldState().error,\n touched: () => fieldState().touched,\n dirty: () => fieldState().dirty,\n valid: () => fieldState().valid,\n validating: () => fieldState().validating,\n focused: () => fieldState().focused,\n onFocus: () => {\n fieldManager.setFocused(true)\n },\n onBlur: () => {\n fieldManager.setFocused(false)\n fieldManager.setTouched(true)\n },\n validate,\n reset,\n }\n}\n\n/**\n * Multi-step form state manager\n */\nexport function createMultiStepFormState(steps: string[], initialValues: Record<string, any> = {}) {\n const [currentStep, setCurrentStep] = createSignal(0)\n const [completedSteps, setCompletedSteps] = createSignal<Set<number>>(new Set())\n const stepForms = new Map<number, UseFormReturn>()\n\n // Create form state for each step\n steps.forEach((_, index) => {\n const stepValues = Object.keys(initialValues)\n .filter((key) => key.startsWith(`step_${index}_`))\n .reduce(\n (acc, key) => {\n const fieldName = key.replace(`step_${index}_`, '')\n acc[fieldName] = initialValues[key]\n return acc\n },\n {} as Record<string, any>\n )\n\n stepForms.set(index, createFormState(stepValues))\n })\n\n const nextStep = async (validateCurrent = true): Promise<boolean> => {\n const current = currentStep()\n const currentForm = stepForms.get(current)\n\n if (validateCurrent && currentForm) {\n const isValid = await currentForm.validateForm()\n if (!isValid) {\n return false\n }\n }\n\n if (current < steps.length - 1) {\n setCompletedSteps((prev) => new Set([...prev, current]))\n setCurrentStep(current + 1)\n return true\n }\n\n return false\n }\n\n const previousStep = (): boolean => {\n const current = currentStep()\n if (current > 0) {\n setCurrentStep(current - 1)\n return true\n }\n return false\n }\n\n const goToStep = (stepIndex: number): boolean => {\n if (stepIndex >= 0 && stepIndex < steps.length) {\n setCurrentStep(stepIndex)\n return true\n }\n return false\n }\n\n const getCurrentForm = (): UseFormReturn | undefined => {\n return stepForms.get(currentStep())\n }\n\n const getAllValues = (): Record<string, any> => {\n const allValues: Record<string, any> = {}\n\n stepForms.forEach((form, stepIndex) => {\n const stepValues = form.watch()\n Object.keys(stepValues).forEach((fieldName) => {\n allValues[`step_${stepIndex}_${fieldName}`] = stepValues[fieldName]\n })\n })\n\n return allValues\n }\n\n const validateAllSteps = async (): Promise<boolean> => {\n const validationPromises = Array.from(stepForms.values()).map((form) => form.validateForm())\n const results = await Promise.all(validationPromises)\n return results.every((result) => result)\n }\n\n return {\n currentStep,\n completedSteps,\n nextStep,\n previousStep,\n goToStep,\n getCurrentForm,\n getAllValues,\n validateAllSteps,\n getStepForm: (stepIndex: number) => stepForms.get(stepIndex),\n isStepCompleted: (stepIndex: number) => completedSteps().has(stepIndex),\n canGoToStep: (stepIndex: number) =>\n stepIndex <= currentStep() || completedSteps().has(stepIndex),\n }\n}\n\n// Export validation function for internal use\nexport { validateValueAsync } from '../validation'\n"],"names":["FormsValidationError","message","context","component","suggestion","example","documentation","formatted","FormsComponentValidation","args","props","createFormsValidators","registerFormsValidators","registerComponentValidator","validators","validator","error","VALIDATION_RULES","value","num","options","phoneRegex","digits","sum","alternate","i","n","usZip","intlPostal","date","hasUpperCase","hasLowerCase","hasNumbers","hasNonalphas","isLongEnough","valid","customRules","registerValidationRule","rule","unregisterValidationRule","name","getValidationRules","validateValue","rules","result","customRule","validateField","field","validation","validateValueAsync","validationResult","createDebouncedValidator","delayMs","timeoutId","lastValue","lastResult","resolve","CrossFieldValidators","field1","field2","values","fields","targetField","conditionalField","conditionalValue","targetValue","startField","endField","startDate","endDate","start","ValidationPresets","ValidationMessageFormatter","messages","__publicField","code","fieldName","defaultMessageFormatter","ValidationUtils","results","errors","e","createFieldState","initialValue","setValue","createSignal","setError","touched","setTouched","dirty","setDirty","focused","setFocused","validating","setValidating","createEffect","createComputed","newValue","createFormState","initialValues","validations","submitting","setSubmitting","submitted","setSubmitted","fieldManager","formState","fieldStates","fieldState","register","state","validateFieldAsync","unregister","getValue","getError","validateForm","validationPromises","resetForm","submitForm","handler","watch","fieldNames","fieldsToWatch","trigger","createField","_name","validate","reset","createMultiStepFormState","steps","currentStep","setCurrentStep","completedSteps","setCompletedSteps","stepForms","_","index","stepValues","key","acc","validateCurrent","current","currentForm","prev","stepIndex","allValues","form"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";var k=Object.create;var L=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var Z=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var Y=(e,t,r)=>t in e?L(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var Q=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of W(t))!G.call(e,s)&&s!==r&&L(e,s,{get:()=>t[s],enumerable:!(a=H(t,s))||a.enumerable});return e};var z=(e,t,r)=>(r=e!=null?k(Z(e)):{},Q(t||!e||!e.__esModule?L(r,"default",{value:e,enumerable:!0}):r,e));var x=(e,t,r)=>Y(e,typeof t!="symbol"?t+"":t,r);const g=require("@tachui/core");class p extends Error{constructor(t,r){super(t),this.context=r,this.name="FormsValidationError"}getFormattedMessage(){const{component:t,suggestion:r,example:a,documentation:s}=this.context;let o=`ā [@tachui/forms] ${t} Component Error: ${this.message}
|
|
2
|
+
`;return r&&(o+=`
|
|
3
|
+
š” Suggestion: ${r}
|
|
4
|
+
`),a&&(o+=`
|
|
5
|
+
ā Wrong: ${a.wrong}`,o+=`
|
|
6
|
+
ā
Correct: ${a.correct}
|
|
7
|
+
`),s&&(o+=`
|
|
8
|
+
š Documentation: ${s}`),o}}const N={validateEmailField(e){if(e.length===0)throw new p("EmailField component requires a props object with value",{component:"EmailField",suggestion:"Add value: EmailField({ value: emailSignal })",documentation:"https://docs.tachui.dev/forms/components/emailfield",example:{wrong:"EmailField()",correct:"EmailField({ value: emailSignal, onChange: handleChange })"}});const[t]=e;if(!t||typeof t!="object")throw new p("EmailField requires a props object",{component:"EmailField",suggestion:"Pass a props object with value property",example:{wrong:'EmailField("email@example.com")',correct:'EmailField({ value: "email@example.com" })'}});if(t.value===void 0)throw new p("EmailField value property is required",{component:"EmailField",suggestion:"Provide a value for the email field",example:{wrong:'EmailField({ placeholder: "Email" })',correct:'EmailField({ value: emailSignal, placeholder: "Email" })'}})},validatePasswordField(e){if(e.length===0)throw new p("PasswordField component requires a props object with value",{component:"PasswordField",suggestion:"Add value: PasswordField({ value: passwordSignal })",documentation:"https://docs.tachui.dev/forms/components/passwordfield",example:{wrong:"PasswordField()",correct:"PasswordField({ value: passwordSignal, onChange: handleChange })"}});const[t]=e;if(!t||typeof t!="object")throw new p("PasswordField requires a props object",{component:"PasswordField",suggestion:"Pass a props object with value property",example:{wrong:'PasswordField("password")',correct:"PasswordField({ value: passwordSignal })"}});if(t.value===void 0)throw new p("PasswordField value property is required",{component:"PasswordField",suggestion:"Provide a value for the password field",example:{wrong:'PasswordField({ placeholder: "Password" })',correct:'PasswordField({ value: passwordSignal, placeholder: "Password" })'}})},validatePhoneField(e){if(e.length===0)throw new p("PhoneField component requires a props object with value",{component:"PhoneField",suggestion:"Add value: PhoneField({ value: phoneSignal })",documentation:"https://docs.tachui.dev/forms/components/phonefield",example:{wrong:"PhoneField()",correct:'PhoneField({ value: phoneSignal, format: "US" })'}});const[t]=e;if(!t||typeof t!="object")throw new p("PhoneField requires a props object",{component:"PhoneField",suggestion:"Pass a props object with value property",example:{wrong:'PhoneField("(555) 123-4567")',correct:"PhoneField({ value: phoneSignal })"}});if(t.value===void 0)throw new p("PhoneField value property is required",{component:"PhoneField",suggestion:"Provide a value for the phone field",example:{wrong:'PhoneField({ format: "US" })',correct:'PhoneField({ value: phoneSignal, format: "US" })'}})},validateNumberField(e){if(e.length===0)throw new p("NumberField component requires a props object with value",{component:"NumberField",suggestion:"Add value: NumberField({ value: numberSignal })",documentation:"https://docs.tachui.dev/forms/components/numberfield",example:{wrong:"NumberField()",correct:"NumberField({ value: numberSignal, min: 0, max: 100 })"}});const[t]=e;if(!t||typeof t!="object")throw new p("NumberField requires a props object",{component:"NumberField",suggestion:"Pass a props object with value property",example:{wrong:"NumberField(42)",correct:"NumberField({ value: 42 })"}});if(t.value===void 0)throw new p("NumberField value property is required",{component:"NumberField",suggestion:"Provide a numeric value for the field",example:{wrong:"NumberField({ min: 0, max: 100 })",correct:"NumberField({ value: 42, min: 0, max: 100 })"}})},validateCreditCardField(e){if(e.length===0)throw new p("CreditCardField component requires a props object with value",{component:"CreditCardField",suggestion:"Add value: CreditCardField({ value: cardSignal })",documentation:"https://docs.tachui.dev/forms/components/creditcardfield",example:{wrong:"CreditCardField()",correct:"CreditCardField({ value: cardSignal, onChange: handleChange })"}});const[t]=e;if(!t||typeof t!="object")throw new p("CreditCardField requires a props object",{component:"CreditCardField",suggestion:"Pass a props object with value property",example:{wrong:'CreditCardField("4111111111111111")',correct:"CreditCardField({ value: cardSignal })"}});if(t.value===void 0)throw new p("CreditCardField value property is required",{component:"CreditCardField",suggestion:"Provide a value for the credit card field",example:{wrong:'CreditCardField({ placeholder: "Card Number" })',correct:'CreditCardField({ value: cardSignal, placeholder: "Card Number" })'}})}};function T(){return[{packageName:"forms",componentName:"EmailField",validate:N.validateEmailField},{packageName:"forms",componentName:"PasswordField",validate:N.validatePasswordField},{packageName:"forms",componentName:"PhoneField",validate:N.validatePhoneField},{packageName:"forms",componentName:"NumberField",validate:N.validateNumberField},{packageName:"forms",componentName:"CreditCardField",validate:N.validateCreditCardField}]}async function q(){try{const{registerComponentValidator:e}=await import("@tachui/core/validation"),t=T();for(const r of t)e(r);process.env.NODE_ENV!=="production"&&console.info(`š [@tachui/forms] Registered ${t.length} component validators`)}catch(e){process.env.NODE_ENV!=="production"&&console.warn("ā ļø [@tachui/forms] Could not register validators with Core:",e)}}typeof window<"u"&&process.env.NODE_ENV!=="production"&&setTimeout(q,10);const E={required:e=>({valid:e!=null&&e!=="",message:"This field is required",code:"REQUIRED"}),email:e=>e?{valid:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e),message:"Please enter a valid email address",code:"INVALID_EMAIL"}:{valid:!0},url:e=>{if(!e)return{valid:!0};try{return new URL(e),{valid:!0}}catch{return{valid:!1,message:"Please enter a valid URL",code:"INVALID_URL"}}},number:e=>{if(!e)return{valid:!0};const t=Number(e);return{valid:!Number.isNaN(t)&&Number.isFinite(t),message:"Please enter a valid number",code:"INVALID_NUMBER"}},integer:e=>{if(!e)return{valid:!0};const t=Number(e);return{valid:!Number.isNaN(t)&&Number.isFinite(t)&&Number.isInteger(t),message:"Please enter a valid integer",code:"INVALID_INTEGER"}},min:(e,t)=>{if(!e)return{valid:!0};const r=Number(e);return Number.isNaN(r)?{valid:!0}:{valid:r>=t.min,message:`Value must be at least ${t.min}`,code:"MIN_VALUE"}},max:(e,t)=>{if(!e)return{valid:!0};const r=Number(e);return Number.isNaN(r)?{valid:!0}:{valid:r<=t.max,message:`Value must be at most ${t.max}`,code:"MAX_VALUE"}},minLength:(e,t)=>e?{valid:e.length>=t.minLength,message:`Must be at least ${t.minLength} characters`,code:"MIN_LENGTH"}:{valid:!0},maxLength:(e,t)=>e?{valid:e.length<=t.maxLength,message:`Must be at most ${t.maxLength} characters`,code:"MAX_LENGTH"}:{valid:!0},pattern:(e,t)=>e?{valid:(typeof t.pattern=="string"?new RegExp(t.pattern):t.pattern).test(e),message:t.message||"Value does not match required pattern",code:"PATTERN_MISMATCH"}:{valid:!0},numeric:e=>{if(!e)return{valid:!0};const t=Number(e);return{valid:!Number.isNaN(t)&&Number.isFinite(t),message:"Please enter a valid number",code:"INVALID_NUMERIC"}},phone:e=>{if(!e)return{valid:!0};const t=/^\+?[\d\s\-().]+$/,r=e.replace(/[\s\-().]/g,"");return{valid:t.test(e)&&r.length>=10,message:"Please enter a valid phone number",code:"INVALID_PHONE"}},creditCard:e=>{if(!e)return{valid:!0};const t=e.replace(/\s/g,"");let r=0,a=!1;for(let s=t.length-1;s>=0;s--){let o=parseInt(t.charAt(s));a&&(o*=2,o>9&&(o=o%10+1)),r+=o,a=!a}return{valid:/^\d{13,19}$/.test(t)&&r%10===0,message:"Please enter a valid credit card number",code:"INVALID_CREDIT_CARD"}},ssn:e=>{if(!e)return{valid:!0};const t=e.replace(/[-\s]/g,"");return{valid:/^\d{9}$/.test(t),message:"Please enter a valid Social Security Number",code:"INVALID_SSN"}},postalCode:e=>{if(!e)return{valid:!0};const t=/^\d{5}(-\d{4})?$/,r=/^[A-Z0-9]{3,10}$/i;return{valid:t.test(e)||r.test(e),message:"Please enter a valid postal code",code:"INVALID_POSTAL_CODE"}},zipCode:e=>e?{valid:/^\d{5}(-\d{4})?$/.test(e),message:"Please enter a valid ZIP code",code:"INVALID_ZIP_CODE"}:{valid:!0},date:e=>{if(!e)return{valid:!0};const t=new Date(e);return{valid:!Number.isNaN(t.getTime())&&!!e.match(/^\d{4}-\d{2}-\d{2}$/),message:"Please enter a valid date (YYYY-MM-DD)",code:"INVALID_DATE"}},time:e=>e?{valid:/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(e),message:"Please enter a valid time (HH:MM)",code:"INVALID_TIME"}:{valid:!0},strongPassword:e=>{if(!e)return{valid:!0};const t=/[A-Z]/.test(e),r=/[a-z]/.test(e),a=/\d/.test(e),s=/\W/.test(e),o=e.length>=8,l=t&&r&&a&&s&&o;return{valid:l,message:l?void 0:"Password must be at least 8 characters with uppercase, lowercase, number and special character",code:"WEAK_PASSWORD"}}},C=new Map;function B(e){C.set(e.name,e)}function X(e){C.delete(e)}function K(){return[...Object.keys(E),...C.keys()]}function j(e,t,r){for(const a of t){let s;if(typeof a=="string"){const o=E[a];if(o)s=o(e,r?.[a]);else{const l=C.get(a);if(l)s=l.validate(e,l.options);else{console.warn(`Unknown validation rule: ${a}`);continue}}}else if("validate"in a)s=a.validate(e,a.options);else{const o=E[a.name];if(o)s=o(e,a.options);else{console.warn(`Unknown built-in validation rule: ${a.name}`);continue}}if(!s.valid)return s}return{valid:!0}}function J(e,t){return!t?.rules||t.rules.length===0?{valid:!0}:j(e.value,t.rules)}async function _(e,t,r){for(const a of t){let s;if(typeof a=="string"){const l=E[a];if(l)s=l(e,r?.[a]);else{const c=C.get(a);if(c)s=c.validate(e,c.options);else continue}}else if("validate"in a)s=a.validate(e,a.options);else{const l=E[a.name];if(l)s=l(e,a.options);else continue}const o=await Promise.resolve(s);if(!o.valid)return o}return{valid:!0}}function ee(e,t=300){let r,a,s;return o=>new Promise(l=>{if(o===a&&s){Promise.resolve(s).then(l);return}a=o,clearTimeout(r),r=setTimeout(async()=>{try{s=e(o);const c=await Promise.resolve(s);l(c)}catch{l({valid:!1,message:"Validation error occurred",code:"VALIDATION_ERROR"})}},t)})}const te={fieldMatch:(e,t,r="Fields must match")=>a=>a[e]===a[t]?{valid:!0}:{valid:!1,message:r,code:"FIELD_MISMATCH"},requireOneOf:(e,t="At least one field is required")=>r=>e.some(s=>{const o=r[s];return o!=null&&o!==""})?{valid:!0}:{valid:!1,message:t,code:"REQUIRE_ONE_OF"},requiredWhen:(e,t,r,a=`${e} is required`)=>s=>{if(s[t]===r){const o=s[e];return o!=null&&o!==""?{valid:!0}:{valid:!1,message:a,code:"REQUIRED_WHEN"}}return{valid:!0}},dateRange:(e,t,r="End date must be after start date")=>a=>{const s=a[e],o=a[t];if(!s||!o)return{valid:!0};const l=new Date(s);return new Date(o)>=l?{valid:!0}:{valid:!1,message:r,code:"INVALID_DATE_RANGE"}}},re={email:["required","email"],password:["required",{name:"minLength",options:{minLength:8}}],phone:["required",{name:"pattern",options:{pattern:/^\+?[\d\s-()]+$/,message:"Invalid phone number"}}],url:["required","url"],positiveNumber:["required","number",{name:"min",options:{min:0}}],percentage:["required","number",{name:"min",options:{min:0}},{name:"max",options:{max:100}}]};class ${constructor(t={}){x(this,"messages",{});this.messages=t}setMessage(t,r){this.messages[t]=r}setMessages(t){this.messages={...this.messages,...t}}format(t,r){return t.code&&this.messages[t.code]?this.messages[t.code].replace("${field}",r||"field"):t.message||"Validation failed"}}const ae=new $,se={isError:e=>!e.valid,isValid:e=>e.valid,combineResults:e=>{const t=e.filter(r=>!r.valid);return t.length===0?{valid:!0}:{valid:!1,message:t.map(r=>r.message).join(", "),code:"MULTIPLE_ERRORS"}},createValidator:(e,t)=>r=>j(r,e,t),createAsyncValidator:(e,t)=>r=>_(r,e,t)};function O(e){const[t,r]=g.createSignal(e),[a,s]=g.createSignal(void 0),[o,l]=g.createSignal(!1),[c,w]=g.createSignal(!1),[b,A]=g.createSignal(!1),[P,I]=g.createSignal(!1);g.createEffect(()=>{t()!==e&&w(!0)});const d=g.createComputed(()=>!a());return{state:g.createComputed(()=>({value:t(),error:a(),touched:o(),dirty:c(),valid:d(),validating:P(),focused:b()})),setValue:m=>{r(m),w(m!==e),o()},setError:s,setTouched:l,setFocused:A,setValidating:I}}function U(e={}){const t=new Map,r=new Map,[a,s]=g.createSignal(!1),[o,l]=g.createSignal(!1);Object.keys(e).forEach(n=>{const i=O(e[n]);t.set(n,i)});const c=g.createComputed(()=>{const n={},i={},u={};let h=!0,f=!1;for(const[M,y]of t){const S=y.state();n[M]=S,S.error&&(i[M]=S.error,h=!1),S.touched&&(u[M]=!0),S.dirty&&(f=!0)}return{fields:n,valid:h,dirty:f,submitting:a(),submitted:o(),errors:i,touched:u}}),w=(n,i)=>{if(t.has(n)){i&&r.set(n,i);return}const u=O(e[n]);if(t.set(n,u),i&&r.set(n,i),i){const h=u.state;g.createEffect(async()=>{const f=h();if((i.validateOn==="change"||i.validateOn==="blur"&&f.touched||i.validateOn==="submit"&&o())&&(f.dirty||f.touched)){u.setValidating(!0);try{const y=await R(f,i);u.setError(y.valid?void 0:y.message)}catch{u.setError("Validation error occurred")}finally{u.setValidating(!1)}}})}},b=n=>{t.delete(n),r.delete(n)},A=(n,i)=>{const u=t.get(n);u&&u.setValue(i)},P=n=>t.get(n)?.state().value,I=n=>t.get(n)?.state().error,d=async n=>{const i=t.get(n),u=r.get(n);if(!i||!u)return!0;const h=i.state();i.setValidating(!0);try{const f=await R(h,u);return i.setError(f.valid?void 0:f.message),f.valid}catch{return i.setError("Validation error occurred"),!1}finally{i.setValidating(!1)}},v=async()=>{const n=Array.from(t.keys()).map(d);return(await Promise.all(n)).every(u=>u)},m=()=>{for(const[n,i]of t)i.setValue(e[n]),i.setError(void 0),i.setTouched(!1),i.setFocused(!1),i.setValidating(!1);s(!1),l(!1)},F=async n=>{s(!0),l(!0);try{if(await v()&&n){const u={};for(const[h,f]of t)u[h]=f.state().value;await n(u,c())}}finally{s(!1)}},V=n=>{const i={},u=n||Array.from(t.keys());for(const h of u)t.has(h)&&(i[h]=P(h));return i},D=async n=>{const u=(n||Array.from(t.keys())).map(d);return(await Promise.all(u)).every(f=>f)};return{fields:c().fields,state:c(),register:w,unregister:b,setValue:A,getValue:P,getError:I,validateField:d,validateForm:v,resetForm:m,submitForm:F,watch:V,trigger:D}}async function R(e,t){return!t.rules||t.rules.length===0?{valid:!0}:t.debounceMs?new Promise(r=>{setTimeout(async()=>{const a=await _(e.value,t.rules);r(a)},t.debounceMs)}):_(e.value,t.rules)}function oe(e,t,r){const a=O(t),s=a.state;r&&g.createEffect(async()=>{const c=s();if((r.validateOn==="change"||r.validateOn==="blur"&&c.touched)&&(c.dirty||c.touched)){a.setValidating(!0);try{const b=await R(c,r);a.setError(b.valid?void 0:b.message)}catch{a.setError("Validation error occurred")}finally{a.setValidating(!1)}}});const o=async()=>{if(!r)return!0;a.setValidating(!0);try{const c=await R(s(),r);return a.setError(c.valid?void 0:c.message),c.valid}catch{return a.setError("Validation error occurred"),!1}finally{a.setValidating(!1)}},l=()=>{a.setValue(t),a.setError(void 0),a.setTouched(!1),a.setFocused(!1),a.setValidating(!1)};return{value:()=>s().value,setValue:a.setValue,error:()=>s().error,touched:()=>s().touched,dirty:()=>s().dirty,valid:()=>s().valid,validating:()=>s().validating,focused:()=>s().focused,onFocus:()=>{a.setFocused(!0)},onBlur:()=>{a.setFocused(!1),a.setTouched(!0)},validate:o,reset:l}}function ie(e,t={}){const[r,a]=g.createSignal(0),[s,o]=g.createSignal(new Set),l=new Map;return e.forEach((d,v)=>{const m=Object.keys(t).filter(F=>F.startsWith(`step_${v}_`)).reduce((F,V)=>{const D=V.replace(`step_${v}_`,"");return F[D]=t[V],F},{});l.set(v,U(m))}),{currentStep:r,completedSteps:s,nextStep:async(d=!0)=>{const v=r(),m=l.get(v);return d&&m&&!await m.validateForm()?!1:v<e.length-1?(o(F=>new Set([...F,v])),a(v+1),!0):!1},previousStep:()=>{const d=r();return d>0?(a(d-1),!0):!1},goToStep:d=>d>=0&&d<e.length?(a(d),!0):!1,getCurrentForm:()=>l.get(r()),getAllValues:()=>{const d={};return l.forEach((v,m)=>{const F=v.watch();Object.keys(F).forEach(V=>{d[`step_${m}_${V}`]=F[V]})}),d},validateAllSteps:async()=>{const d=Array.from(l.values()).map(m=>m.validateForm());return(await Promise.all(d)).every(m=>m)},getStepForm:d=>l.get(d),isStepCompleted:d=>s().has(d),canGoToStep:d=>d<=r()||s().has(d)}}exports.CrossFieldValidators=te;exports.FormsComponentValidation=N;exports.FormsValidationError=p;exports.VALIDATION_RULES=E;exports.ValidationMessageFormatter=$;exports.ValidationPresets=re;exports.ValidationUtils=se;exports.createDebouncedValidator=ee;exports.createField=oe;exports.createFormState=U;exports.createFormsValidators=T;exports.createMultiStepFormState=ie;exports.defaultMessageFormatter=ae;exports.getValidationRules=K;exports.registerFormsValidators=q;exports.registerValidationRule=B;exports.unregisterValidationRule=X;exports.validateField=J;exports.validateValue=j;exports.validateValueAsync=_;
|
|
9
|
+
//# sourceMappingURL=forms-core-W_JGVLAI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms-core-W_JGVLAI.cjs","sources":["../src/validation/component-validation.ts","../src/validation/index.ts","../src/state/index.ts"],"sourcesContent":["/**\n * Forms Package Component Validation\n *\n * Validation for @tachui/forms components that registers with the Core\n * validation system, following proper plugin architecture.\n */\n\n// Import from core to register with the validation system\nimport type { ComponentValidator } from '@tachui/core/validation'\n\n/**\n * TachUI Forms validation error class\n */\nexport class FormsValidationError extends Error {\n constructor(\n message: string,\n public context: {\n component: string\n property?: string\n suggestion?: string\n documentation?: string\n example?: {\n wrong: string\n correct: string\n }\n }\n ) {\n super(message)\n this.name = 'FormsValidationError'\n }\n\n getFormattedMessage(): string {\n const { component, suggestion, example, documentation } = this.context\n \n let formatted = `ā [@tachui/forms] ${component} Component Error: ${this.message}\\n`\n\n if (suggestion) {\n formatted += `\\nš” Suggestion: ${suggestion}\\n`\n }\n\n if (example) {\n formatted += `\\nā Wrong: ${example.wrong}`\n formatted += `\\nā
Correct: ${example.correct}\\n`\n }\n\n if (documentation) {\n formatted += `\\nš Documentation: ${documentation}`\n }\n\n return formatted\n }\n}\n\n/**\n * Forms Components Validation\n */\nexport const FormsComponentValidation = {\n \n // EmailField Component\n validateEmailField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('EmailField component requires a props object with value', {\n component: 'EmailField',\n suggestion: 'Add value: EmailField({ value: emailSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/emailfield',\n example: {\n wrong: 'EmailField()',\n correct: 'EmailField({ value: emailSignal, onChange: handleChange })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('EmailField requires a props object', {\n component: 'EmailField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'EmailField(\"email@example.com\")',\n correct: 'EmailField({ value: \"email@example.com\" })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('EmailField value property is required', {\n component: 'EmailField',\n suggestion: 'Provide a value for the email field',\n example: {\n wrong: 'EmailField({ placeholder: \"Email\" })',\n correct: 'EmailField({ value: emailSignal, placeholder: \"Email\" })'\n }\n })\n }\n },\n\n // PasswordField Component\n validatePasswordField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('PasswordField component requires a props object with value', {\n component: 'PasswordField',\n suggestion: 'Add value: PasswordField({ value: passwordSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/passwordfield',\n example: {\n wrong: 'PasswordField()',\n correct: 'PasswordField({ value: passwordSignal, onChange: handleChange })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('PasswordField requires a props object', {\n component: 'PasswordField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'PasswordField(\"password\")',\n correct: 'PasswordField({ value: passwordSignal })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('PasswordField value property is required', {\n component: 'PasswordField',\n suggestion: 'Provide a value for the password field',\n example: {\n wrong: 'PasswordField({ placeholder: \"Password\" })',\n correct: 'PasswordField({ value: passwordSignal, placeholder: \"Password\" })'\n }\n })\n }\n },\n\n // PhoneField Component \n validatePhoneField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('PhoneField component requires a props object with value', {\n component: 'PhoneField',\n suggestion: 'Add value: PhoneField({ value: phoneSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/phonefield',\n example: {\n wrong: 'PhoneField()',\n correct: 'PhoneField({ value: phoneSignal, format: \"US\" })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('PhoneField requires a props object', {\n component: 'PhoneField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'PhoneField(\"(555) 123-4567\")',\n correct: 'PhoneField({ value: phoneSignal })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('PhoneField value property is required', {\n component: 'PhoneField',\n suggestion: 'Provide a value for the phone field',\n example: {\n wrong: 'PhoneField({ format: \"US\" })',\n correct: 'PhoneField({ value: phoneSignal, format: \"US\" })'\n }\n })\n }\n },\n\n // NumberField Component\n validateNumberField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('NumberField component requires a props object with value', {\n component: 'NumberField',\n suggestion: 'Add value: NumberField({ value: numberSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/numberfield',\n example: {\n wrong: 'NumberField()',\n correct: 'NumberField({ value: numberSignal, min: 0, max: 100 })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('NumberField requires a props object', {\n component: 'NumberField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'NumberField(42)',\n correct: 'NumberField({ value: 42 })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('NumberField value property is required', {\n component: 'NumberField',\n suggestion: 'Provide a numeric value for the field',\n example: {\n wrong: 'NumberField({ min: 0, max: 100 })',\n correct: 'NumberField({ value: 42, min: 0, max: 100 })'\n }\n })\n }\n },\n\n // CreditCardField Component\n validateCreditCardField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError('CreditCardField component requires a props object with value', {\n component: 'CreditCardField',\n suggestion: 'Add value: CreditCardField({ value: cardSignal })',\n documentation: 'https://docs.tachui.dev/forms/components/creditcardfield',\n example: {\n wrong: 'CreditCardField()',\n correct: 'CreditCardField({ value: cardSignal, onChange: handleChange })'\n }\n })\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('CreditCardField requires a props object', {\n component: 'CreditCardField',\n suggestion: 'Pass a props object with value property',\n example: {\n wrong: 'CreditCardField(\"4111111111111111\")',\n correct: 'CreditCardField({ value: cardSignal })'\n }\n })\n }\n\n const propsObj = props as any\n if (propsObj.value === undefined) {\n throw new FormsValidationError('CreditCardField value property is required', {\n component: 'CreditCardField',\n suggestion: 'Provide a value for the credit card field',\n example: {\n wrong: 'CreditCardField({ placeholder: \"Card Number\" })',\n correct: 'CreditCardField({ value: cardSignal, placeholder: \"Card Number\" })'\n }\n })\n }\n },\n\n // Additional Forms components would go here...\n // (SearchField, URLField, TextArea, ColorField, Select, MultiSelect, Checkbox, Radio, etc.)\n}\n\n/**\n * Create Forms component validators for registration\n */\nexport function createFormsValidators(): ComponentValidator[] {\n return [\n {\n packageName: 'forms',\n componentName: 'EmailField',\n validate: FormsComponentValidation.validateEmailField\n },\n {\n packageName: 'forms',\n componentName: 'PasswordField',\n validate: FormsComponentValidation.validatePasswordField\n },\n {\n packageName: 'forms',\n componentName: 'PhoneField',\n validate: FormsComponentValidation.validatePhoneField\n },\n {\n packageName: 'forms',\n componentName: 'NumberField',\n validate: FormsComponentValidation.validateNumberField\n },\n {\n packageName: 'forms',\n componentName: 'CreditCardField',\n validate: FormsComponentValidation.validateCreditCardField\n }\n // Additional validators would be added here for remaining 9+ Forms components\n ]\n}\n\n/**\n * Register Forms validators with Core validation system\n */\nexport async function registerFormsValidators(): Promise<void> {\n try {\n // Dynamic import to avoid circular dependency\n const { registerComponentValidator } = await import('@tachui/core/validation')\n \n const validators = createFormsValidators()\n \n for (const validator of validators) {\n registerComponentValidator(validator)\n }\n \n if (process.env.NODE_ENV !== 'production') {\n console.info(`š [@tachui/forms] Registered ${validators.length} component validators`)\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('ā ļø [@tachui/forms] Could not register validators with Core:', error)\n }\n }\n}\n\n// Auto-register when Forms package loads\nif (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {\n setTimeout(registerFormsValidators, 10)\n}","/**\n * TachUI Forms Validation System\n *\n * Comprehensive validation engine with built-in rules, custom validators,\n * async validation support, and i18n-ready error messages.\n */\n\nimport type {\n CustomValidationRule,\n FieldState,\n FieldValidation,\n ValidationResult,\n ValidationRule,\n} from '../types'\n\n/**\n * Built-in validation rules\n */\nconst VALIDATION_RULES: Record<string, (value: any, options?: any) => ValidationResult> = {\n required: (value: any): ValidationResult => ({\n valid: value !== null && value !== undefined && value !== '',\n message: 'This field is required',\n code: 'REQUIRED',\n }),\n\n email: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return {\n valid: emailRegex.test(value),\n message: 'Please enter a valid email address',\n code: 'INVALID_EMAIL',\n }\n },\n\n url: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n try {\n new URL(value)\n return { valid: true }\n } catch {\n return {\n valid: false,\n message: 'Please enter a valid URL',\n code: 'INVALID_URL',\n }\n }\n },\n\n number: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num),\n message: 'Please enter a valid number',\n code: 'INVALID_NUMBER',\n }\n },\n\n integer: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num) && Number.isInteger(num),\n message: 'Please enter a valid integer',\n code: 'INVALID_INTEGER',\n }\n },\n\n min: (value: any, options: { min: number }): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n if (Number.isNaN(num)) return { valid: true } // Let number validation handle this\n\n return {\n valid: num >= options.min,\n message: `Value must be at least ${options.min}`,\n code: 'MIN_VALUE',\n }\n },\n\n max: (value: any, options: { max: number }): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n if (Number.isNaN(num)) return { valid: true } // Let number validation handle this\n\n return {\n valid: num <= options.max,\n message: `Value must be at most ${options.max}`,\n code: 'MAX_VALUE',\n }\n },\n\n minLength: (value: string, options: { minLength: number }): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: value.length >= options.minLength,\n message: `Must be at least ${options.minLength} characters`,\n code: 'MIN_LENGTH',\n }\n },\n\n maxLength: (value: string, options: { maxLength: number }): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: value.length <= options.maxLength,\n message: `Must be at most ${options.maxLength} characters`,\n code: 'MAX_LENGTH',\n }\n },\n\n pattern: (\n value: string,\n options: { pattern: string | RegExp; message?: string }\n ): ValidationResult => {\n if (!value) return { valid: true }\n const regex =\n typeof options.pattern === 'string' ? new RegExp(options.pattern) : options.pattern\n return {\n valid: regex.test(value),\n message: options.message || 'Value does not match required pattern',\n code: 'PATTERN_MISMATCH',\n }\n },\n\n // Additional validation rules expected by tests\n numeric: (value: any): ValidationResult => {\n if (!value) return { valid: true }\n const num = Number(value)\n return {\n valid: !Number.isNaN(num) && Number.isFinite(num),\n message: 'Please enter a valid number',\n code: 'INVALID_NUMERIC',\n }\n },\n\n phone: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const phoneRegex = /^\\+?[\\d\\s\\-().]+$/\n const digits = value.replace(/[\\s\\-().]/g, '')\n return {\n valid: phoneRegex.test(value) && digits.length >= 10,\n message: 'Please enter a valid phone number',\n code: 'INVALID_PHONE',\n }\n },\n\n creditCard: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const digits = value.replace(/\\s/g, '')\n // Basic Luhn algorithm check\n let sum = 0\n let alternate = false\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = parseInt(digits.charAt(i))\n if (alternate) {\n n *= 2\n if (n > 9) n = (n % 10) + 1\n }\n sum += n\n alternate = !alternate\n }\n return {\n valid: /^\\d{13,19}$/.test(digits) && sum % 10 === 0,\n message: 'Please enter a valid credit card number',\n code: 'INVALID_CREDIT_CARD',\n }\n },\n\n ssn: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const digits = value.replace(/[-\\s]/g, '')\n return {\n valid: /^\\d{9}$/.test(digits),\n message: 'Please enter a valid Social Security Number',\n code: 'INVALID_SSN',\n }\n },\n\n postalCode: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n // US ZIP code (5 or 9 digits) or international postal codes\n const usZip = /^\\d{5}(-\\d{4})?$/\n const intlPostal = /^[A-Z0-9]{3,10}$/i\n return {\n valid: usZip.test(value) || intlPostal.test(value),\n message: 'Please enter a valid postal code',\n code: 'INVALID_POSTAL_CODE',\n }\n },\n\n zipCode: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n // US ZIP code (5 or 9 digits)\n const usZip = /^\\d{5}(-\\d{4})?$/\n return {\n valid: usZip.test(value),\n message: 'Please enter a valid ZIP code',\n code: 'INVALID_ZIP_CODE',\n }\n },\n\n date: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const date = new Date(value)\n return {\n valid: !Number.isNaN(date.getTime()) && !!value.match(/^\\d{4}-\\d{2}-\\d{2}$/),\n message: 'Please enter a valid date (YYYY-MM-DD)',\n code: 'INVALID_DATE',\n }\n },\n\n time: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n return {\n valid: /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(value),\n message: 'Please enter a valid time (HH:MM)',\n code: 'INVALID_TIME',\n }\n },\n\n strongPassword: (value: string): ValidationResult => {\n if (!value) return { valid: true }\n const hasUpperCase = /[A-Z]/.test(value)\n const hasLowerCase = /[a-z]/.test(value)\n const hasNumbers = /\\d/.test(value)\n const hasNonalphas = /\\W/.test(value)\n const isLongEnough = value.length >= 8\n\n const valid = hasUpperCase && hasLowerCase && hasNumbers && hasNonalphas && isLongEnough\n return {\n valid,\n message: valid\n ? undefined\n : 'Password must be at least 8 characters with uppercase, lowercase, number and special character',\n code: 'WEAK_PASSWORD',\n }\n },\n}\n\n/**\n * Custom validation rule registry\n */\nconst customRules = new Map<string, CustomValidationRule>()\n\n/**\n * Register a custom validation rule\n */\nexport function registerValidationRule(rule: CustomValidationRule): void {\n customRules.set(rule.name, rule)\n}\n\n/**\n * Unregister a custom validation rule\n */\nexport function unregisterValidationRule(name: string): void {\n customRules.delete(name)\n}\n\n/**\n * Get all registered validation rules\n */\nexport function getValidationRules(): string[] {\n return [...Object.keys(VALIDATION_RULES), ...customRules.keys()]\n}\n\n/**\n * Validate a single value against validation rules\n */\nexport function validateValue(\n value: any,\n rules: ValidationRule[],\n options?: Record<string, any>\n): ValidationResult {\n for (const rule of rules) {\n let result: ValidationResult\n\n if (typeof rule === 'string') {\n // Built-in rule\n const validator = VALIDATION_RULES[rule]\n if (validator) {\n result = validator(value, options?.[rule])\n } else {\n // Check custom rules\n const customRule = customRules.get(rule)\n if (customRule) {\n result = customRule.validate(value, customRule.options)\n } else {\n console.warn(`Unknown validation rule: ${rule}`)\n continue\n }\n }\n } else if ('validate' in rule) {\n // Custom validation rule object\n result = rule.validate(value, rule.options)\n } else {\n // Built-in validation rule object (BuiltInValidationRule)\n const validator = VALIDATION_RULES[rule.name]\n if (validator) {\n result = validator(value, rule.options)\n } else {\n console.warn(`Unknown built-in validation rule: ${rule.name}`)\n continue\n }\n }\n\n if (!result.valid) {\n return result\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Validate a field state\n */\nexport function validateField(field: FieldState, validation?: FieldValidation): ValidationResult {\n if (!validation?.rules || validation.rules.length === 0) {\n return { valid: true }\n }\n\n return validateValue(field.value, validation.rules)\n}\n\n/**\n * Async validation function\n */\nexport async function validateValueAsync(\n value: any,\n rules: ValidationRule[],\n options?: Record<string, any>\n): Promise<ValidationResult> {\n for (const rule of rules) {\n let result: ValidationResult | Promise<ValidationResult>\n\n if (typeof rule === 'string') {\n const validator = VALIDATION_RULES[rule]\n if (validator) {\n result = validator(value, options?.[rule])\n } else {\n const customRule = customRules.get(rule)\n if (customRule) {\n result = customRule.validate(value, customRule.options)\n } else {\n continue\n }\n }\n } else if ('validate' in rule) {\n // Custom validation rule object\n result = rule.validate(value, rule.options)\n } else {\n // Built-in validation rule object (BuiltInValidationRule)\n const validator = VALIDATION_RULES[rule.name]\n if (validator) {\n result = validator(value, rule.options)\n } else {\n continue\n }\n }\n\n // Handle async validation\n const validationResult = await Promise.resolve(result)\n\n if (!validationResult.valid) {\n return validationResult\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Debounced validation\n */\nexport function createDebouncedValidator(\n validator: (value: any) => ValidationResult | Promise<ValidationResult>,\n delayMs: number = 300\n) {\n let timeoutId: ReturnType<typeof setTimeout>\n let lastValue: any\n let lastResult: ValidationResult | Promise<ValidationResult>\n\n return (value: any): Promise<ValidationResult> => {\n return new Promise((resolve) => {\n // If value hasn't changed, return cached result\n if (value === lastValue && lastResult) {\n Promise.resolve(lastResult).then(resolve)\n return\n }\n\n lastValue = value\n\n // Clear previous timeout\n clearTimeout(timeoutId)\n\n // Set new timeout\n timeoutId = setTimeout(async () => {\n try {\n lastResult = validator(value)\n const result = await Promise.resolve(lastResult)\n resolve(result)\n } catch (_error) {\n resolve({\n valid: false,\n message: 'Validation error occurred',\n code: 'VALIDATION_ERROR',\n })\n }\n }, delayMs)\n })\n }\n}\n\n/**\n * Cross-field validation utilities\n */\nexport const CrossFieldValidators = {\n /**\n * Validate that two fields match (e.g., password confirmation)\n */\n fieldMatch:\n (field1: string, field2: string, message = 'Fields must match') =>\n (values: Record<string, any>): ValidationResult => {\n const isValid = values[field1] === values[field2]\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'FIELD_MISMATCH',\n }\n },\n\n /**\n * Validate that at least one field in a group is filled\n */\n requireOneOf:\n (fields: string[], message = 'At least one field is required') =>\n (values: Record<string, any>): ValidationResult => {\n const hasValue = fields.some((field) => {\n const value = values[field]\n return value !== null && value !== undefined && value !== ''\n })\n\n if (hasValue) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'REQUIRE_ONE_OF',\n }\n },\n\n /**\n * Validate that a field is required when another field has a specific value\n */\n requiredWhen:\n (\n targetField: string,\n conditionalField: string,\n conditionalValue: any,\n message = `${targetField} is required`\n ) =>\n (values: Record<string, any>): ValidationResult => {\n if (values[conditionalField] === conditionalValue) {\n const targetValue = values[targetField]\n const isValid = targetValue !== null && targetValue !== undefined && targetValue !== ''\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'REQUIRED_WHEN',\n }\n }\n return { valid: true }\n },\n\n /**\n * Validate date range (start date before end date)\n */\n dateRange:\n (startField: string, endField: string, message = 'End date must be after start date') =>\n (values: Record<string, any>): ValidationResult => {\n const startDate = values[startField]\n const endDate = values[endField]\n\n if (!startDate || !endDate) return { valid: true }\n\n const start = new Date(startDate)\n const end = new Date(endDate)\n const isValid = end >= start\n\n if (isValid) {\n return { valid: true }\n }\n return {\n valid: false,\n message,\n code: 'INVALID_DATE_RANGE',\n }\n },\n}\n\n/**\n * Built-in validation rule presets\n */\nexport const ValidationPresets = {\n email: ['required', 'email'],\n password: ['required', { name: 'minLength', options: { minLength: 8 } }],\n phone: [\n 'required',\n { name: 'pattern', options: { pattern: /^\\+?[\\d\\s-()]+$/, message: 'Invalid phone number' } },\n ],\n url: ['required', 'url'],\n positiveNumber: ['required', 'number', { name: 'min', options: { min: 0 } }],\n percentage: [\n 'required',\n 'number',\n { name: 'min', options: { min: 0 } },\n { name: 'max', options: { max: 100 } },\n ],\n}\n\n/**\n * Validation message formatter\n */\nexport class ValidationMessageFormatter {\n private messages: Record<string, string> = {}\n\n constructor(messages: Record<string, string> = {}) {\n this.messages = messages\n }\n\n setMessage(code: string, message: string): void {\n this.messages[code] = message\n }\n\n setMessages(messages: Record<string, string>): void {\n this.messages = { ...this.messages, ...messages }\n }\n\n format(result: ValidationResult, fieldName?: string): string {\n if (result.code && this.messages[result.code]) {\n return this.messages[result.code].replace(`\\${field}`, fieldName || 'field')\n }\n return result.message || 'Validation failed'\n }\n}\n\n/**\n * Default validation message formatter instance\n */\nexport const defaultMessageFormatter = new ValidationMessageFormatter()\n\n/**\n * Validation utilities\n */\nexport const ValidationUtils = {\n /**\n * Check if a validation result represents an error\n */\n isError: (result: ValidationResult): boolean => !result.valid,\n\n /**\n * Check if a validation result is valid\n */\n isValid: (result: ValidationResult): boolean => result.valid,\n\n /**\n * Combine multiple validation results\n */\n combineResults: (results: ValidationResult[]): ValidationResult => {\n const errors = results.filter((r) => !r.valid)\n if (errors.length === 0) {\n return { valid: true }\n }\n\n return {\n valid: false,\n message: errors.map((e) => e.message).join(', '),\n code: 'MULTIPLE_ERRORS',\n }\n },\n\n /**\n * Create a validation function from a rule configuration\n */\n createValidator:\n (rules: ValidationRule[], options?: Record<string, any>) =>\n (value: any): ValidationResult =>\n validateValue(value, rules, options),\n\n /**\n * Create an async validation function\n */\n createAsyncValidator:\n (rules: ValidationRule[], options?: Record<string, any>) =>\n (value: any): Promise<ValidationResult> =>\n validateValueAsync(value, rules, options),\n}\n\n// Export all validation functionality\nexport { VALIDATION_RULES }\n\n// Export component validation for plugin registration\nexport * from './component-validation'\n","/**\n * TachUI Forms State Management\n *\n * Reactive form state management with validation, field tracking,\n * and form lifecycle management using TachUI's signal system.\n */\n\nimport { createComputed, createEffect, createSignal } from '@tachui/core'\nimport type {\n FieldState,\n FieldValidation,\n FormState,\n FormSubmitHandler,\n UseFormReturn,\n ValidationResult,\n} from '../types'\nimport { validateValueAsync } from '../validation'\n\n/**\n * Create a reactive field state\n */\nfunction createFieldState<T = any>(\n initialValue?: T\n): {\n state: () => FieldState<T>\n setValue: (value: T) => void\n setError: (error: string | undefined) => void\n setTouched: (touched: boolean) => void\n setFocused: (focused: boolean) => void\n setValidating: (validating: boolean) => void\n} {\n const [value, setValue] = createSignal<T>(initialValue as T)\n const [error, setError] = createSignal<string | undefined>(undefined)\n const [touched, setTouched] = createSignal(false)\n const [dirty, setDirty] = createSignal(false)\n const [focused, setFocused] = createSignal(false)\n const [validating, setValidating] = createSignal(false)\n\n // Mark dirty when value changes from initial\n createEffect(() => {\n const currentValue = value()\n if (currentValue !== initialValue) {\n setDirty(true)\n }\n })\n\n const valid = createComputed(() => !error())\n\n const state = createComputed(\n (): FieldState<T> => ({\n value: value(),\n error: error(),\n touched: touched(),\n dirty: dirty(),\n valid: valid(),\n validating: validating(),\n focused: focused(),\n })\n )\n\n return {\n state,\n setValue: (newValue: T) => {\n setValue(newValue)\n // Mark dirty if value changed from initial\n if (newValue !== initialValue) {\n setDirty(true)\n } else {\n setDirty(false)\n }\n if (touched()) {\n // Trigger validation if field is touched\n // This will be handled by the form's validation system\n }\n },\n setError,\n setTouched,\n setFocused,\n setValidating,\n }\n}\n\n/**\n * Create a form state manager\n */\nexport function createFormState(initialValues: Record<string, any> = {}): UseFormReturn {\n const fields = new Map<string, ReturnType<typeof createFieldState>>()\n const validations = new Map<string, FieldValidation>()\n\n const [submitting, setSubmitting] = createSignal(false)\n const [submitted, setSubmitted] = createSignal(false)\n\n // Auto-register fields from initial values\n Object.keys(initialValues).forEach((name) => {\n const fieldManager = createFieldState(initialValues[name])\n fields.set(name, fieldManager)\n })\n\n // Reactive form state\n const formState = createComputed((): FormState => {\n const fieldStates: Record<string, FieldState> = {}\n const errors: Record<string, string> = {}\n const touched: Record<string, boolean> = {}\n let valid = true\n let dirty = false\n\n for (const [name, fieldManager] of fields) {\n const fieldState = fieldManager.state()\n fieldStates[name] = fieldState\n\n if (fieldState.error) {\n errors[name] = fieldState.error\n valid = false\n }\n\n if (fieldState.touched) {\n touched[name] = true\n }\n\n if (fieldState.dirty) {\n dirty = true\n }\n }\n\n return {\n fields: fieldStates,\n valid,\n dirty,\n submitting: submitting(),\n submitted: submitted(),\n errors,\n touched,\n }\n })\n\n // Register a field\n const register = (name: string, validation?: FieldValidation) => {\n if (fields.has(name)) {\n // Field already exists, just update validation if provided\n if (validation) {\n validations.set(name, validation)\n }\n return\n }\n\n const fieldManager = createFieldState(initialValues[name])\n fields.set(name, fieldManager)\n\n if (validation) {\n validations.set(name, validation)\n }\n\n // Set up validation effects\n if (validation) {\n const fieldState = fieldManager.state\n\n createEffect(async () => {\n const state = fieldState()\n const shouldValidate =\n validation.validateOn === 'change' ||\n (validation.validateOn === 'blur' && state.touched) ||\n (validation.validateOn === 'submit' && submitted())\n\n if (shouldValidate && (state.dirty || state.touched)) {\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(state, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n } finally {\n fieldManager.setValidating(false)\n }\n }\n })\n }\n }\n\n // Unregister a field\n const unregister = (name: string) => {\n fields.delete(name)\n validations.delete(name)\n }\n\n // Set field value\n const setValue = (name: string, value: any) => {\n const fieldManager = fields.get(name)\n if (fieldManager) {\n fieldManager.setValue(value)\n }\n }\n\n // Get field value\n const getValue = (name: string) => {\n const fieldManager = fields.get(name)\n return fieldManager?.state().value\n }\n\n // Get field error\n const getError = (name: string) => {\n const fieldManager = fields.get(name)\n return fieldManager?.state().error\n }\n\n // Validate a specific field\n const validateField = async (name: string): Promise<boolean> => {\n const fieldManager = fields.get(name)\n const validation = validations.get(name)\n\n if (!fieldManager || !validation) {\n return true\n }\n\n const fieldState = fieldManager.state()\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(fieldState, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n return result.valid\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n return false\n } finally {\n fieldManager.setValidating(false)\n }\n }\n\n // Validate entire form\n const validateForm = async (): Promise<boolean> => {\n const validationPromises = Array.from(fields.keys()).map(validateField)\n const results = await Promise.all(validationPromises)\n return results.every((result) => result)\n }\n\n // Reset form to initial state\n const resetForm = () => {\n for (const [name, fieldManager] of fields) {\n fieldManager.setValue(initialValues[name])\n fieldManager.setError(undefined)\n fieldManager.setTouched(false)\n fieldManager.setFocused(false)\n fieldManager.setValidating(false)\n }\n setSubmitting(false)\n setSubmitted(false)\n }\n\n // Submit form\n const submitForm = async (handler?: FormSubmitHandler) => {\n setSubmitting(true)\n setSubmitted(true)\n\n try {\n // Validate all fields\n const isValid = await validateForm()\n\n if (isValid && handler) {\n // Collect form values\n const values: Record<string, any> = {}\n for (const [name, fieldManager] of fields) {\n values[name] = fieldManager.state().value\n }\n\n await handler(values, formState())\n }\n } finally {\n setSubmitting(false)\n }\n }\n\n // Watch for changes in specific fields\n const watch = (fieldNames?: string[]): Record<string, any> => {\n const values: Record<string, any> = {}\n const fieldsToWatch = fieldNames || Array.from(fields.keys())\n\n for (const name of fieldsToWatch) {\n if (fields.has(name)) {\n values[name] = getValue(name)\n }\n }\n\n return values\n }\n\n // Trigger validation for specific fields\n const trigger = async (fieldNames?: string[]): Promise<boolean> => {\n const fieldsToValidate = fieldNames || Array.from(fields.keys())\n const validationPromises = fieldsToValidate.map(validateField)\n const results = await Promise.all(validationPromises)\n return results.every((result) => result)\n }\n\n return {\n fields: formState().fields,\n state: formState(),\n register,\n unregister,\n setValue,\n getValue,\n getError,\n validateField,\n validateForm,\n resetForm,\n submitForm,\n watch,\n trigger,\n }\n}\n\n/**\n * Async field validation helper\n */\nasync function validateFieldAsync(\n fieldState: FieldState,\n validation: FieldValidation\n): Promise<ValidationResult> {\n if (!validation.rules || validation.rules.length === 0) {\n return { valid: true }\n }\n\n // Use debounced validation if specified\n if (validation.debounceMs) {\n return new Promise((resolve) => {\n setTimeout(async () => {\n const result = await validateValueAsync(fieldState.value, validation.rules!)\n resolve(result)\n }, validation.debounceMs)\n\n // Store timeout ID for potential cleanup\n // In a real implementation, you'd want to manage this better\n })\n }\n\n return validateValueAsync(fieldState.value, validation.rules)\n}\n\n/**\n * Form field hook for individual field management\n */\nexport function createField<T = any>(\n _name: string,\n initialValue?: T,\n validation?: FieldValidation\n): {\n value: () => T\n setValue: (value: T) => void\n error: () => string | undefined\n touched: () => boolean\n dirty: () => boolean\n valid: () => boolean\n validating: () => boolean\n focused: () => boolean\n onFocus: () => void\n onBlur: () => void\n validate: () => Promise<boolean>\n reset: () => void\n} {\n const fieldManager = createFieldState(initialValue)\n const fieldState = fieldManager.state\n\n // Validation effect\n if (validation) {\n createEffect(async () => {\n const state = fieldState()\n const shouldValidate =\n validation.validateOn === 'change' || (validation.validateOn === 'blur' && state.touched)\n\n if (shouldValidate && (state.dirty || state.touched)) {\n fieldManager.setValidating(true)\n\n try {\n const result = await validateFieldAsync(state, validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n } finally {\n fieldManager.setValidating(false)\n }\n }\n })\n }\n\n const validate = async (): Promise<boolean> => {\n if (!validation) return true\n\n fieldManager.setValidating(true)\n try {\n const result = await validateFieldAsync(fieldState(), validation)\n fieldManager.setError(result.valid ? undefined : result.message)\n return result.valid\n } catch (_error) {\n fieldManager.setError('Validation error occurred')\n return false\n } finally {\n fieldManager.setValidating(false)\n }\n }\n\n const reset = () => {\n fieldManager.setValue(initialValue as T)\n fieldManager.setError(undefined)\n fieldManager.setTouched(false)\n fieldManager.setFocused(false)\n fieldManager.setValidating(false)\n }\n\n return {\n value: () => fieldState().value,\n setValue: fieldManager.setValue,\n error: () => fieldState().error,\n touched: () => fieldState().touched,\n dirty: () => fieldState().dirty,\n valid: () => fieldState().valid,\n validating: () => fieldState().validating,\n focused: () => fieldState().focused,\n onFocus: () => {\n fieldManager.setFocused(true)\n },\n onBlur: () => {\n fieldManager.setFocused(false)\n fieldManager.setTouched(true)\n },\n validate,\n reset,\n }\n}\n\n/**\n * Multi-step form state manager\n */\nexport function createMultiStepFormState(steps: string[], initialValues: Record<string, any> = {}) {\n const [currentStep, setCurrentStep] = createSignal(0)\n const [completedSteps, setCompletedSteps] = createSignal<Set<number>>(new Set())\n const stepForms = new Map<number, UseFormReturn>()\n\n // Create form state for each step\n steps.forEach((_, index) => {\n const stepValues = Object.keys(initialValues)\n .filter((key) => key.startsWith(`step_${index}_`))\n .reduce(\n (acc, key) => {\n const fieldName = key.replace(`step_${index}_`, '')\n acc[fieldName] = initialValues[key]\n return acc\n },\n {} as Record<string, any>\n )\n\n stepForms.set(index, createFormState(stepValues))\n })\n\n const nextStep = async (validateCurrent = true): Promise<boolean> => {\n const current = currentStep()\n const currentForm = stepForms.get(current)\n\n if (validateCurrent && currentForm) {\n const isValid = await currentForm.validateForm()\n if (!isValid) {\n return false\n }\n }\n\n if (current < steps.length - 1) {\n setCompletedSteps((prev) => new Set([...prev, current]))\n setCurrentStep(current + 1)\n return true\n }\n\n return false\n }\n\n const previousStep = (): boolean => {\n const current = currentStep()\n if (current > 0) {\n setCurrentStep(current - 1)\n return true\n }\n return false\n }\n\n const goToStep = (stepIndex: number): boolean => {\n if (stepIndex >= 0 && stepIndex < steps.length) {\n setCurrentStep(stepIndex)\n return true\n }\n return false\n }\n\n const getCurrentForm = (): UseFormReturn | undefined => {\n return stepForms.get(currentStep())\n }\n\n const getAllValues = (): Record<string, any> => {\n const allValues: Record<string, any> = {}\n\n stepForms.forEach((form, stepIndex) => {\n const stepValues = form.watch()\n Object.keys(stepValues).forEach((fieldName) => {\n allValues[`step_${stepIndex}_${fieldName}`] = stepValues[fieldName]\n })\n })\n\n return allValues\n }\n\n const validateAllSteps = async (): Promise<boolean> => {\n const validationPromises = Array.from(stepForms.values()).map((form) => form.validateForm())\n const results = await Promise.all(validationPromises)\n return results.every((result) => result)\n }\n\n return {\n currentStep,\n completedSteps,\n nextStep,\n previousStep,\n goToStep,\n getCurrentForm,\n getAllValues,\n validateAllSteps,\n getStepForm: (stepIndex: number) => stepForms.get(stepIndex),\n isStepCompleted: (stepIndex: number) => completedSteps().has(stepIndex),\n canGoToStep: (stepIndex: number) =>\n stepIndex <= currentStep() || completedSteps().has(stepIndex),\n }\n}\n\n// Export validation function for internal use\nexport { validateValueAsync } from '../validation'\n"],"names":["FormsValidationError","message","context","component","suggestion","example","documentation","formatted","FormsComponentValidation","args","props","createFormsValidators","registerFormsValidators","registerComponentValidator","validators","validator","error","VALIDATION_RULES","value","num","options","phoneRegex","digits","sum","alternate","i","n","usZip","intlPostal","date","hasUpperCase","hasLowerCase","hasNumbers","hasNonalphas","isLongEnough","valid","customRules","registerValidationRule","rule","unregisterValidationRule","name","getValidationRules","validateValue","rules","result","customRule","validateField","field","validation","validateValueAsync","validationResult","createDebouncedValidator","delayMs","timeoutId","lastValue","lastResult","resolve","CrossFieldValidators","field1","field2","values","fields","targetField","conditionalField","conditionalValue","targetValue","startField","endField","startDate","endDate","start","ValidationPresets","ValidationMessageFormatter","messages","__publicField","code","fieldName","defaultMessageFormatter","ValidationUtils","results","errors","e","createFieldState","initialValue","setValue","createSignal","setError","touched","setTouched","dirty","setDirty","focused","setFocused","validating","setValidating","createEffect","createComputed","newValue","createFormState","initialValues","validations","submitting","setSubmitting","submitted","setSubmitted","fieldManager","formState","fieldStates","fieldState","register","state","validateFieldAsync","unregister","getValue","getError","validateForm","validationPromises","resetForm","submitForm","handler","watch","fieldNames","fieldsToWatch","trigger","createField","_name","validate","reset","createMultiStepFormState","steps","currentStep","setCurrentStep","completedSteps","setCompletedSteps","stepForms","_","index","stepValues","key","acc","validateCurrent","current","currentForm","prev","stepIndex","allValues","form"],"mappings":"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"}
|