{"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":[]}