{"version":3,"sources":["../../src/express/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import {\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\n\r\nexport type DocumentType =\r\n    'aadhaar' | 'pan' | 'gstin' | 'ifsc' | 'pincode' |\r\n    'tan' | 'uan' | 'voter-id' | 'dl' | 'passport' |\r\n    'upi' | 'phone' | 'msme';\r\n\r\nexport type FieldLocation = 'body' | 'query' | 'params';\r\n\r\nexport interface FieldRule {\r\n    field: string;\r\n    type: DocumentType;\r\n    location?: FieldLocation;\r\n    optional?: boolean;\r\n    message?: string;\r\n}\r\n\r\nexport interface ValidationError {\r\n    field: string;\r\n    value: unknown;\r\n    message: string;\r\n    type: DocumentType;\r\n}\r\n\r\nexport interface Request {\r\n    body?: Record<string, unknown>;\r\n    query?: Record<string, unknown>;\r\n    params?: Record<string, unknown>;\r\n}\r\n\r\nexport interface Response {\r\n    status: (code: number) => Response;\r\n    json: (body: unknown) => unknown;\r\n}\r\n\r\nexport type NextFunction = (err?: unknown) => void;\r\n\r\nconst validatorByType: Record<DocumentType, (value: 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\nconst defaultErrorMessageByType: Record<DocumentType, string> = {\r\n    aadhaar: 'Invalid Aadhaar number',\r\n    pan: 'Invalid PAN number',\r\n    gstin: 'Invalid GSTIN',\r\n    ifsc: 'Invalid IFSC code',\r\n    pincode: 'Invalid pincode',\r\n    tan: 'Invalid TAN',\r\n    uan: 'Invalid UAN',\r\n    'voter-id': 'Invalid voter ID',\r\n    dl: 'Invalid driving license',\r\n    passport: 'Invalid passport number',\r\n    upi: 'Invalid UPI ID',\r\n    phone: 'Invalid Indian phone number',\r\n    msme: 'Invalid MSME number',\r\n};\r\n\r\nconst getValueFromLocation = (\r\n    req: Request,\r\n    location: FieldLocation,\r\n    field: string,\r\n): unknown => {\r\n    const source = req[location];\r\n    if (!source || typeof source !== 'object') {\r\n        return undefined;\r\n    }\r\n\r\n    return source[field];\r\n};\r\n\r\n/**\r\n * @example\r\n * import express from 'express'\r\n * import { pramanaMiddleware, validateAadhaar } from '@prashanttiw/pramana/express'\r\n *\r\n * const app = express()\r\n * app.use(express.json())\r\n *\r\n * // Validate multiple fields\r\n * app.post('/api/kyc',\r\n *   pramanaMiddleware([\r\n *     { field: 'aadhaar', type: 'aadhaar' },\r\n *     { field: 'pan', type: 'pan' },\r\n *     { field: 'gstin', type: 'gstin', optional: true },\r\n *   ]),\r\n *   (req, res) => res.json({ success: true })\r\n * )\r\n *\r\n * // Single field shorthand\r\n * app.post('/api/verify', validateAadhaar(), (req, res) => ...)\r\n */\r\nexport function pramanaMiddleware(\r\n    rules: FieldRule[],\r\n): (req: Request, res: Response, next: NextFunction) => void {\r\n    return (req: Request, res: Response, next: NextFunction): void => {\r\n        const errors: ValidationError[] = [];\r\n\r\n        for (const rule of rules) {\r\n            const location: FieldLocation = rule.location ?? 'body';\r\n            const value = getValueFromLocation(req, location, rule.field);\r\n\r\n            if (value === undefined || value === null) {\r\n                if (rule.optional === true) {\r\n                    continue;\r\n                }\r\n\r\n                errors.push({\r\n                    field: rule.field,\r\n                    value,\r\n                    message: rule.message ?? `${rule.field} is required`,\r\n                    type: rule.type,\r\n                });\r\n                continue;\r\n            }\r\n\r\n            const validator = validatorByType[rule.type];\r\n            if (!validator(value)) {\r\n                errors.push({\r\n                    field: rule.field,\r\n                    value,\r\n                    message: rule.message ?? defaultErrorMessageByType[rule.type],\r\n                    type: rule.type,\r\n                });\r\n            }\r\n        }\r\n\r\n        if (errors.length > 0) {\r\n            res.status(422).json({\r\n                status: 'error',\r\n                message: 'Document validation failed',\r\n                errors,\r\n            });\r\n            return;\r\n        }\r\n\r\n        next();\r\n    };\r\n}\r\n\r\nexport const validateAadhaar = (field = 'aadhaar') =>\r\n    pramanaMiddleware([{ field, type: 'aadhaar' }]);\r\n\r\nexport const validatePAN = (field = 'pan') =>\r\n    pramanaMiddleware([{ field, type: 'pan' }]);\r\n\r\nexport const validateGSTIN = (field = 'gstin') =>\r\n    pramanaMiddleware([{ field, type: 'gstin' }]);\r\n\r\nexport const validateIFSC = (field = 'ifsc') =>\r\n    pramanaMiddleware([{ field, type: 'ifsc' }]);\r\n\r\nexport const validatePincode = (field = 'pincode') =>\r\n    pramanaMiddleware([{ field, type: 'pincode' }]);\r\n\r\nexport const validateTAN = (field = 'tan') =>\r\n    pramanaMiddleware([{ field, type: 'tan' }]);\r\n\r\nexport const validateUAN = (field = 'uan') =>\r\n    pramanaMiddleware([{ field, type: 'uan' }]);\r\n\r\nexport const validateVoterID = (field = 'voterId') =>\r\n    pramanaMiddleware([{ field, type: 'voter-id' }]);\r\n\r\nexport const validateDL = (field = 'dl') =>\r\n    pramanaMiddleware([{ field, type: 'dl' }]);\r\n\r\nexport const validatePassport = (field = 'passport') =>\r\n    pramanaMiddleware([{ field, type: 'passport' }]);\r\n\r\nexport const validateUPI = (field = 'upi') =>\r\n    pramanaMiddleware([{ field, type: 'upi' }]);\r\n\r\nexport const validatePhone = (field = 'phone') =>\r\n    pramanaMiddleware([{ field, type: 'phone' }]);\r\n\r\nexport const validateMSME = (field = 'msme') =>\r\n    pramanaMiddleware([{ field, type: 'msme' }]);\r\n"]}