@tachui/forms 0.7.1-alpha → 0.8.0-alpha
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/README.md +87 -272
- package/dist/DatePicker-D5nRFTUm.js +475 -0
- package/dist/DatePicker-D5nRFTUm.js.map +1 -0
- package/dist/Select-yZyKooXk.js +945 -0
- package/dist/Select-yZyKooXk.js.map +1 -0
- package/dist/Slider-0-oal5YR.js +644 -0
- package/dist/Slider-0-oal5YR.js.map +1 -0
- package/dist/TextField-hX15dY3U.js +509 -0
- package/dist/TextField-hX15dY3U.js.map +1 -0
- package/dist/components/advanced/Slider.d.ts +190 -0
- package/dist/components/advanced/Slider.d.ts.map +1 -0
- package/dist/components/advanced/Stepper.d.ts +161 -0
- package/dist/components/advanced/Stepper.d.ts.map +1 -0
- package/dist/components/advanced/index.d.ts +15 -0
- package/dist/components/advanced/index.d.ts.map +1 -0
- package/dist/components/advanced/index.js +6 -0
- package/dist/components/advanced/index.js.map +1 -0
- package/dist/components/date-picker/DatePicker.d.ts +126 -0
- package/dist/components/date-picker/DatePicker.d.ts.map +1 -0
- package/dist/components/date-picker/index.d.ts +14 -0
- package/dist/components/date-picker/index.d.ts.map +1 -0
- package/dist/components/date-picker/index.js +5 -0
- package/dist/components/date-picker/index.js.map +1 -0
- package/dist/components/form-container/index.d.ts +58 -0
- package/dist/components/form-container/index.d.ts.map +1 -0
- package/dist/components/selection/Checkbox.d.ts.map +1 -0
- package/dist/components/selection/Radio.d.ts.map +1 -0
- package/dist/components/selection/Select.d.ts.map +1 -0
- package/dist/components/selection/index.d.ts +68 -0
- package/dist/components/selection/index.d.ts.map +1 -0
- package/dist/components/selection/index.js +12 -0
- package/dist/components/selection/index.js.map +1 -0
- package/dist/components/text-input/TextField.d.ts.map +1 -0
- package/dist/components/text-input/index.d.ts +8 -0
- package/dist/components/text-input/index.d.ts.map +1 -0
- package/dist/components/text-input/index.js +18 -0
- package/dist/components/text-input/index.js.map +1 -0
- package/dist/{state/index.js → index-D3WfkqVv.js} +15 -8
- package/dist/index-D3WfkqVv.js.map +1 -0
- package/dist/index.d.ts +10 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +198 -376
- package/dist/index.js.map +1 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/validation/component-validation.d.ts +11 -2
- package/dist/validation/component-validation.d.ts.map +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +282 -191
- package/dist/validation/index.js.map +1 -0
- package/package.json +53 -39
- package/src/components/advanced/Slider.ts +722 -0
- package/src/components/advanced/Stepper.ts +715 -0
- package/src/components/advanced/index.ts +20 -0
- package/src/components/date-picker/DatePicker.ts +925 -0
- package/src/components/date-picker/index.ts +20 -0
- package/src/components/form-container/index.ts +266 -0
- package/src/components/selection/Checkbox.ts +478 -0
- package/src/components/selection/Radio.ts +470 -0
- package/src/components/selection/Select.ts +620 -0
- package/src/components/selection/index.ts +81 -0
- package/src/components/text-input/TextField.ts +728 -0
- package/src/components/text-input/index.ts +35 -0
- package/src/index.ts +48 -0
- package/src/state/index.ts +544 -0
- package/src/types/index.ts +579 -0
- package/src/utils/formatters.ts +184 -0
- package/src/utils/index.ts +57 -0
- package/src/validation/component-validation.ts +429 -0
- package/src/validation/index.ts +641 -0
- package/dist/TextField-CGBM3x7K.js +0 -1799
- package/dist/components/Form.d.ts +0 -76
- package/dist/components/Form.d.ts.map +0 -1
- package/dist/components/index.d.ts +0 -9
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -28
- package/dist/components/input/Checkbox.d.ts.map +0 -1
- package/dist/components/input/Radio.d.ts.map +0 -1
- package/dist/components/input/Select.d.ts.map +0 -1
- package/dist/components/input/TextField.d.ts.map +0 -1
- package/dist/components/input/index.d.ts +0 -11
- package/dist/components/input/index.d.ts.map +0 -1
- package/dist/utils/validators.d.ts +0 -101
- package/dist/utils/validators.d.ts.map +0 -1
- /package/dist/components/{input → selection}/Checkbox.d.ts +0 -0
- /package/dist/components/{input → selection}/Radio.d.ts +0 -0
- /package/dist/components/{input → selection}/Select.d.ts +0 -0
- /package/dist/components/{input → text-input}/TextField.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/validation/component-validation.ts","../../src/validation/index.ts"],"sourcesContent":["/**\n * Forms Package Component Validation\n *\n * Validation for @tachui/advanced-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\n// ComponentValidator type is defined locally since it's not exported from core\n\n/**\n * Component validator interface (matches core's internal interface)\n */\ninterface ComponentValidator {\n packageName: string\n componentName: string\n validate: (args: unknown[]) => void\n}\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/advanced-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 // TextField Component\n validateTextField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'TextField component requires a props object with name',\n {\n component: 'TextField',\n suggestion: 'Add name property: TextField({ name: \"fieldName\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/textfield',\n example: {\n wrong: 'TextField()',\n correct: 'TextField({ name: \"email\", value: emailSignal })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError('TextField requires a props object', {\n component: 'TextField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'TextField(\"email\")',\n correct: 'TextField({ name: \"email\" })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'TextField name property is required and must be a string',\n {\n component: 'TextField',\n suggestion: 'Provide a unique name for the field',\n example: {\n wrong: 'TextField({ placeholder: \"Email\" })',\n correct: 'TextField({ name: \"email\", placeholder: \"Email\" })',\n },\n }\n )\n }\n },\n\n // EmailField Component\n validateEmailField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'EmailField component requires a props object with name',\n {\n component: 'EmailField',\n suggestion: 'Add name property: EmailField({ name: \"email\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/emailfield',\n example: {\n wrong: 'EmailField()',\n correct: 'EmailField({ name: \"email\", value: emailSignal })',\n },\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 name property',\n example: {\n wrong: 'EmailField(\"email@example.com\")',\n correct: 'EmailField({ name: \"email\", value: \"email@example.com\" })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'EmailField name property is required and must be a string',\n {\n component: 'EmailField',\n suggestion: 'Provide a unique name for the email field',\n example: {\n wrong: 'EmailField({ placeholder: \"Email\" })',\n correct: 'EmailField({ name: \"email\", placeholder: \"Email\" })',\n },\n }\n )\n }\n },\n\n // PasswordField Component\n validatePasswordField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'PasswordField component requires a props object with name',\n {\n component: 'PasswordField',\n suggestion: 'Add name property: PasswordField({ name: \"password\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/passwordfield',\n example: {\n wrong: 'PasswordField()',\n correct:\n 'PasswordField({ name: \"password\", value: passwordSignal })',\n },\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 name property',\n example: {\n wrong: 'PasswordField(\"password\")',\n correct: 'PasswordField({ name: \"password\", value: passwordSignal })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'PasswordField name property is required and must be a string',\n {\n component: 'PasswordField',\n suggestion: 'Provide a unique name for the password field',\n example: {\n wrong: 'PasswordField({ placeholder: \"Password\" })',\n correct:\n 'PasswordField({ name: \"password\", placeholder: \"Password\" })',\n },\n }\n )\n }\n },\n\n // PhoneField Component\n validatePhoneField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'PhoneField component requires a props object with name',\n {\n component: 'PhoneField',\n suggestion: 'Add name property: PhoneField({ name: \"phone\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/phonefield',\n example: {\n wrong: 'PhoneField()',\n correct: 'PhoneField({ name: \"phone\", format: \"US\" })',\n },\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 name property',\n example: {\n wrong: 'PhoneField(\"(555) 123-4567\")',\n correct: 'PhoneField({ name: \"phone\", value: phoneSignal })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'PhoneField name property is required and must be a string',\n {\n component: 'PhoneField',\n suggestion: 'Provide a unique name for the phone field',\n example: {\n wrong: 'PhoneField({ format: \"US\" })',\n correct: 'PhoneField({ name: \"phone\", format: \"US\" })',\n },\n }\n )\n }\n },\n\n // NumberField Component\n validateNumberField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'NumberField component requires a props object with name',\n {\n component: 'NumberField',\n suggestion: 'Add name property: NumberField({ name: \"amount\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/numberfield',\n example: {\n wrong: 'NumberField()',\n correct: 'NumberField({ name: \"amount\", min: 0, max: 100 })',\n },\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 name property',\n example: {\n wrong: 'NumberField(42)',\n correct: 'NumberField({ name: \"amount\", value: 42 })',\n },\n })\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'NumberField name property is required and must be a string',\n {\n component: 'NumberField',\n suggestion: 'Provide a unique name for the number field',\n example: {\n wrong: 'NumberField({ min: 0, max: 100 })',\n correct: 'NumberField({ name: \"amount\", min: 0, max: 100 })',\n },\n }\n )\n }\n },\n\n // CreditCardField Component\n validateCreditCardField(args: unknown[]): void {\n if (args.length === 0) {\n throw new FormsValidationError(\n 'CreditCardField component requires a props object with name',\n {\n component: 'CreditCardField',\n suggestion:\n 'Add name property: CreditCardField({ name: \"cardNumber\" })',\n documentation:\n 'https://docs.tachui.dev/advanced-forms/components/creditcardfield',\n example: {\n wrong: 'CreditCardField()',\n correct:\n 'CreditCardField({ name: \"cardNumber\", onChange: handleChange })',\n },\n }\n )\n }\n\n const [props] = args\n if (!props || typeof props !== 'object') {\n throw new FormsValidationError(\n 'CreditCardField requires a props object',\n {\n component: 'CreditCardField',\n suggestion: 'Pass a props object with name property',\n example: {\n wrong: 'CreditCardField(\"4111111111111111\")',\n correct:\n 'CreditCardField({ name: \"cardNumber\", value: cardSignal })',\n },\n }\n )\n }\n\n const propsObj = props as any\n if (!propsObj.name || typeof propsObj.name !== 'string') {\n throw new FormsValidationError(\n 'CreditCardField name property is required and must be a string',\n {\n component: 'CreditCardField',\n suggestion: 'Provide a unique name for the credit card field',\n example: {\n wrong: 'CreditCardField({ placeholder: \"Card Number\" })',\n correct:\n 'CreditCardField({ name: \"cardNumber\", placeholder: \"Card Number\" })',\n },\n }\n )\n }\n },\n\n // Additional Forms components would go here...\n // (SearchField, URLField, TextArea, ColorField, etc.)\n}\n\n/**\n * Create Forms component validators for registration\n */\nexport function createFormsValidators(): ComponentValidator[] {\n return [\n {\n packageName: 'advanced-forms',\n componentName: 'TextField',\n validate: FormsComponentValidation.validateTextField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'EmailField',\n validate: FormsComponentValidation.validateEmailField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'PasswordField',\n validate: FormsComponentValidation.validatePasswordField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'PhoneField',\n validate: FormsComponentValidation.validatePhoneField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'NumberField',\n validate: FormsComponentValidation.validateNumberField,\n },\n {\n packageName: 'advanced-forms',\n componentName: 'CreditCardField',\n validate: FormsComponentValidation.validateCreditCardField,\n },\n // Additional validators would be added here for remaining 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(\n '@tachui/core/validation'\n )\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(\n `🔍 [@tachui/advanced-forms] Registered ${validators.length} component validators`\n )\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n '⚠️ [@tachui/advanced-forms] Could not register validators with Core:',\n error\n )\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","/**\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<\n string,\n (value: any, options?: any) => ValidationResult\n> = {\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:\n !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: (\n value: string,\n options: { minLength: number }\n ): 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: (\n value: string,\n options: { maxLength: number }\n ): 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'\n ? new RegExp(options.pattern)\n : 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:\n !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 =\n 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(\n field: FieldState,\n validation?: FieldValidation\n): 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 =\n targetValue !== null &&\n targetValue !== undefined &&\n 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 (\n startField: string,\n endField: string,\n message = 'End date must be after start date'\n ) =>\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 {\n name: 'pattern',\n options: { pattern: /^\\+?[\\d\\s-()]+$/, message: 'Invalid phone number' },\n },\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(\n `\\${field}`,\n fieldName || 'field'\n )\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"],"names":["FormsValidationError","message","context","component","suggestion","example","documentation","formatted","FormsComponentValidation","args","props","propsObj","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","code","fieldName","defaultMessageFormatter","ValidationUtils","results","errors","e"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,58 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tachui/forms",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.8.0-alpha",
|
|
4
|
+
"description": "Unified form components and validation system for tachUI (formerly @tachui/forms + @tachui/advanced-forms)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
8
9
|
"files": [
|
|
9
|
-
"dist"
|
|
10
|
+
"dist",
|
|
11
|
+
"src"
|
|
10
12
|
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"require": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./text-input": {
|
|
20
|
+
"types": "./dist/components/text-input/index.d.ts",
|
|
21
|
+
"import": "./dist/components/text-input/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./selection": {
|
|
24
|
+
"types": "./dist/components/selection/index.d.ts",
|
|
25
|
+
"import": "./dist/components/selection/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./date-picker": {
|
|
28
|
+
"types": "./dist/components/date-picker/index.d.ts",
|
|
29
|
+
"import": "./dist/components/date-picker/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./advanced": {
|
|
32
|
+
"types": "./dist/components/advanced/index.d.ts",
|
|
33
|
+
"import": "./dist/components/advanced/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./validation": {
|
|
36
|
+
"types": "./dist/validation/index.d.ts",
|
|
37
|
+
"import": "./dist/validation/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"@tachui/core": "0.8.0-alpha"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^20.10.0",
|
|
45
|
+
"typescript": "^5.8.0",
|
|
46
|
+
"vite": "^7.1.1",
|
|
47
|
+
"vitest": "^3.2.4"
|
|
48
|
+
},
|
|
11
49
|
"keywords": [
|
|
12
|
-
"tachui",
|
|
13
50
|
"forms",
|
|
14
51
|
"validation",
|
|
15
|
-
"ui",
|
|
16
52
|
"components",
|
|
17
|
-
"
|
|
53
|
+
"ui",
|
|
54
|
+
"tachui",
|
|
55
|
+
"swiftui"
|
|
18
56
|
],
|
|
19
57
|
"author": "tachUI Team",
|
|
20
58
|
"license": "MPL-2.0",
|
|
@@ -23,41 +61,17 @@
|
|
|
23
61
|
"url": "https://github.com/tach-UI/tachUI",
|
|
24
62
|
"directory": "packages/forms"
|
|
25
63
|
},
|
|
26
|
-
"
|
|
27
|
-
"@tachui/
|
|
28
|
-
},
|
|
29
|
-
"devDependencies": {
|
|
30
|
-
"@types/node": "^20.0.0",
|
|
31
|
-
"typescript": "^5.2.0",
|
|
32
|
-
"vite": "^5.0.0",
|
|
33
|
-
"vitest": "^1.6.0",
|
|
34
|
-
"@tachui/core": "0.7.1-alpha"
|
|
35
|
-
},
|
|
36
|
-
"exports": {
|
|
37
|
-
".": {
|
|
38
|
-
"types": "./dist/index.d.ts",
|
|
39
|
-
"import": "./dist/index.js"
|
|
40
|
-
},
|
|
41
|
-
"./components": {
|
|
42
|
-
"types": "./dist/components/index.d.ts",
|
|
43
|
-
"import": "./dist/components/index.js"
|
|
44
|
-
},
|
|
45
|
-
"./validation": {
|
|
46
|
-
"types": "./dist/validation/index.d.ts",
|
|
47
|
-
"import": "./dist/validation/index.js"
|
|
48
|
-
},
|
|
49
|
-
"./state": {
|
|
50
|
-
"types": "./dist/state/index.d.ts",
|
|
51
|
-
"import": "./dist/state/index.js"
|
|
52
|
-
}
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@tachui/primitives": "0.8.0-alpha"
|
|
53
66
|
},
|
|
54
|
-
"sideEffects": false,
|
|
55
67
|
"scripts": {
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
68
|
+
"dev": "vite build --watch --mode development",
|
|
69
|
+
"build": "vite build && pnpm build:types",
|
|
70
|
+
"build:types": "tsc --project tsconfig.build.json",
|
|
71
|
+
"valid": "clear && vitest run && pnpm type-check && pnpm lint && pnpm build",
|
|
72
|
+
"test": "vitest --run",
|
|
73
|
+
"test:watch": "vitest",
|
|
74
|
+
"type-check": "tsc --project tsconfig.type-check.json",
|
|
61
75
|
"lint": "oxlint src",
|
|
62
76
|
"clean": "rm -rf dist"
|
|
63
77
|
}
|