UNPKG

validation-box

Version:

The only validation library - with flexible regex - you need.

1 lines 6.94 kB
{"version":3,"sources":["../src/schemas/index.ts"],"sourcesContent":["import type {\r\n UsernameValidationOptions,\r\n UserValidationOptions,\r\n EmailValidationOptions,\r\n PasswordValidationOptions,\r\n AgeValidationOptions,\r\n ValidationResult,\r\n BaseValidationOptions,\r\n} from \"../types\";\r\n\r\nimport {\r\n validateUsername,\r\n validateUser,\r\n validateEmail,\r\n validatePassword,\r\n validateAge,\r\n} from \"../validators/generics\";\r\n\r\n// Enhanced types for better type safety\r\ntype ValidatorFunction<T = any, O = {}> = (\r\n value: T,\r\n options?: O\r\n) => ValidationResult;\r\ntype TransformFunction = (value: any) => any;\r\n\r\ninterface SchemaField {\r\n fn: ValidatorFunction;\r\n options?: BaseValidationOptions;\r\n transform?: TransformFunction[];\r\n}\r\n\r\ntype SchemaRules = Record<string, SchemaField>;\r\n\r\nexport class vboxSchema<T extends SchemaRules> {\r\n private rules: T;\r\n private validateAll: boolean;\r\n private showErrors: boolean;\r\n\r\n constructor(\r\n rules: T,\r\n options?: {\r\n validateAll?: boolean;\r\n showErrors?: boolean;\r\n }\r\n ) {\r\n this.rules = rules;\r\n this.validateAll = options?.validateAll ?? false;\r\n this.showErrors = options?.showErrors ?? true;\r\n }\r\n\r\n private transformValue(value: any, transforms?: TransformFunction[]): any {\r\n if (!transforms) return value;\r\n return transforms.reduce((acc, transform) => transform(acc), value);\r\n }\r\n\r\n validate(data: Record<string, any>): { success: boolean; data?: Record<string, any>; errors?: Record<string, string[]> } {\r\n const validatedData: Record<string, any> = {};\r\n const errors: Record<string, string[]> = {};\r\n let isValid = true;\r\n\r\n for (const field in this.rules) {\r\n const rule = this.rules[field];\r\n const value = data[field];\r\n const options = rule.options || {};\r\n\r\n // Required field validation\r\n if (options.required && (value === undefined || value === null || value === '')) {\r\n isValid = false;\r\n const message = options.messages?.required || `${field} is required`;\r\n errors[field] = [message];\r\n if (!this.validateAll) break;\r\n continue;\r\n }\r\n\r\n // Skip empty optional fields\r\n if (!options.required && (value === undefined || value === null || value === '')) {\r\n continue;\r\n }\r\n\r\n // Transform value\r\n const transformedValue = this.transformValue(value, rule.transform);\r\n\r\n // Validate\r\n const validation = rule.fn(transformedValue, options);\r\n\r\n if (validation.valid) {\r\n validatedData[field] = transformedValue;\r\n } else {\r\n isValid = false;\r\n const errorMessages = validation.errors || [];\r\n errors[field] = errorMessages;\r\n if (!this.validateAll) break;\r\n }\r\n }\r\n\r\n return {\r\n success: isValid,\r\n data: isValid ? validatedData : undefined,\r\n errors: !isValid && this.showErrors ? errors : undefined\r\n };\r\n }\r\n\r\n // Method to add custom validation rule\r\n addRule(field: string, rule: SchemaField) {\r\n this.rules[field as keyof T] = rule as T[keyof T];\r\n return this;\r\n }\r\n\r\n // Method to extend schema with another schema\r\n extend(schema: vboxSchema<any>) {\r\n return new vboxSchema({ ...this.rules, ...schema[\"rules\"] });\r\n }\r\n\r\n // Method to resolve validation for form data\r\n resolve(data: Record<string, any>, returnAllErrors: boolean = false) {\r\n const result = this.validate(data);\r\n\r\n return {\r\n values: result.success ? data : {},\r\n errors: result.errors\r\n ? Object.keys(result.errors).reduce((acc: Record<string, any>, key) => {\r\n const errorMessages = result.errors?.[key] || [];\r\n acc[key] = {\r\n type: \"manual\",\r\n messages: returnAllErrors ? errorMessages : [errorMessages[0]],\r\n };\r\n return acc;\r\n }, {})\r\n : {},\r\n };\r\n }\r\n}\r\n\r\n// Enhanced validator with more options\r\nexport const validator = {\r\n username: (options?: UsernameValidationOptions) => ({\r\n fn: validateUsername as ValidatorFunction<string>,\r\n options,\r\n }),\r\n user: (options?: UserValidationOptions) => ({\r\n fn: validateUser as ValidatorFunction<string>,\r\n options,\r\n }),\r\n email: (options?: EmailValidationOptions) => ({\r\n fn: validateEmail as ValidatorFunction<string>,\r\n options,\r\n }),\r\n password: (options?: PasswordValidationOptions) => ({\r\n fn: validatePassword as ValidatorFunction<string>,\r\n options,\r\n }),\r\n age: (options?: AgeValidationOptions) => ({\r\n fn: validateAge as ValidatorFunction<number>,\r\n options,\r\n }),\r\n};\r\n"],"mappings":"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","names":[]}