{"version":3,"sources":["../../src/rhf/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FieldErrors, Resolver } from 'react-hook-form';\r\nimport {\r\n    isValidAadhaar,\r\n    isValidPAN,\r\n    isValidGSTIN,\r\n    isValidIFSC,\r\n    isValidPincode,\r\n    isValidTAN,\r\n    isValidUAN,\r\n    isValidVoterID,\r\n    isValidDrivingLicense,\r\n    isValidPassport,\r\n    isValidUPI,\r\n    isValidIndianPhone,\r\n    isValidMSME,\r\n} from '../validators';\r\nimport { suggestCorrection } from '../intelligence/correction';\r\n\r\nexport type DocumentType =\r\n    | 'aadhaar'\r\n    | 'pan'\r\n    | 'gstin'\r\n    | 'ifsc'\r\n    | 'pincode'\r\n    | 'tan'\r\n    | 'uan'\r\n    | 'voter-id'\r\n    | 'dl'\r\n    | 'passport'\r\n    | 'upi'\r\n    | 'phone'\r\n    | 'msme';\r\n\r\nexport type PramanaResolverSchema = Record<string, DocumentType>;\r\n\r\ntype PramanaResolverError = {\r\n    type: string;\r\n    message: string;\r\n};\r\n\r\nconst DOCUMENT_LABELS: Record<DocumentType, string> = {\r\n    aadhaar: 'Aadhaar',\r\n    pan: 'PAN',\r\n    gstin: 'GSTIN',\r\n    ifsc: 'IFSC',\r\n    pincode: 'Pincode',\r\n    tan: 'TAN',\r\n    uan: 'UAN',\r\n    'voter-id': 'Voter ID',\r\n    dl: 'Driving License',\r\n    passport: 'Passport',\r\n    upi: 'UPI',\r\n    phone: 'Phone',\r\n    msme: 'MSME',\r\n};\r\n\r\nconst CORRECTION_DOC_TYPE: Partial<Record<DocumentType, string>> = {\r\n    aadhaar: 'aadhaar',\r\n    pan: 'pan',\r\n    gstin: 'gstin',\r\n    ifsc: 'ifsc',\r\n    pincode: 'pincode',\r\n    tan: 'tan',\r\n    uan: 'uan',\r\n    'voter-id': 'voterid',\r\n    passport: 'passport',\r\n    upi: 'upi',\r\n    phone: 'phone',\r\n    msme: 'msme',\r\n};\r\n\r\n/**\r\n * @example\r\n * import { useForm } from 'react-hook-form'\r\n * import { pramanaResolver } from '@prashanttiw/pramana/rhf'\r\n *\r\n * function KYCForm() {\r\n *   const { register, handleSubmit, formState: { errors } } = useForm({\r\n *     resolver: pramanaResolver({\r\n *       aadhaarNumber: 'aadhaar',\r\n *       panNumber: 'pan',\r\n *       gstinNumber: 'gstin',\r\n *     })\r\n *   })\r\n *\r\n *   return (\r\n *     <form onSubmit={handleSubmit(data => console.log(data))}>\r\n *       <input {...register('aadhaarNumber')} />\r\n *       {errors.aadhaarNumber && <p>{errors.aadhaarNumber.message}</p>}\r\n *\r\n *       <input {...register('panNumber')} />\r\n *       {errors.panNumber && <p>{errors.panNumber.message}</p>}\r\n *\r\n *       <button type=\"submit\">Validate KYC</button>\r\n *     </form>\r\n *   )\r\n * }\r\n */\r\nexport function pramanaResolver(schema: PramanaResolverSchema): Resolver<Record<string, unknown>> {\r\n    return (values) => {\r\n        const errors: Record<string, PramanaResolverError> = {};\r\n\r\n        for (const [fieldName, documentType] of Object.entries(schema)) {\r\n            const rawValue = values[fieldName];\r\n            if (rawValue == null || rawValue === '') continue;\r\n\r\n            const value = typeof rawValue === 'string' ? rawValue : String(rawValue);\r\n            const isValid = runValidator(documentType, value);\r\n\r\n            if (!isValid) {\r\n                errors[fieldName] = {\r\n                    type: 'pramana',\r\n                    message: getErrorMessage(documentType, value),\r\n                };\r\n            }\r\n        }\r\n\r\n        if (Object.keys(errors).length > 0) {\r\n            return {\r\n                values: {},\r\n                errors: errors as unknown as FieldErrors<Record<string, unknown>>,\r\n            };\r\n        }\r\n\r\n        return {\r\n            values,\r\n            errors: {},\r\n        };\r\n    };\r\n}\r\n\r\nfunction runValidator(type: DocumentType, value: string): boolean {\r\n    const validators: Record<DocumentType, (v: unknown) => boolean> = {\r\n        aadhaar: isValidAadhaar,\r\n        pan: isValidPAN,\r\n        gstin: isValidGSTIN,\r\n        ifsc: isValidIFSC,\r\n        pincode: isValidPincode,\r\n        tan: isValidTAN,\r\n        uan: isValidUAN,\r\n        'voter-id': isValidVoterID,\r\n        dl: isValidDrivingLicense,\r\n        passport: isValidPassport,\r\n        upi: isValidUPI,\r\n        phone: isValidIndianPhone,\r\n        msme: isValidMSME,\r\n    };\r\n\r\n    return validators[type]?.(value) ?? false;\r\n}\r\n\r\nfunction getErrorMessage(type: DocumentType, value: string): string {\r\n    const correctionDocType = CORRECTION_DOC_TYPE[type];\r\n    if (correctionDocType) {\r\n        const correction = suggestCorrection(correctionDocType, value);\r\n        if (correction.primarySuggestion) {\r\n            return `Invalid ${DOCUMENT_LABELS[type]}. Did you mean ${correction.primarySuggestion}?`;\r\n        }\r\n    }\r\n\r\n    return `Invalid ${DOCUMENT_LABELS[type]} number`;\r\n}\r\n"]}