Validation & Zod Schemas
All parameters in @omkarbhosale/upiqr are strictly validated at runtime using Zod 4. You can also import the schemas directly to pre-validate inputs in your UI forms or API routes.
Exported Schemas
Import schemas directly from the package:
import {
upiIdSchema,
qrParamsSchema,
splitQRParamsSchema,
splitQRItemSchema
} from "@omkarbhosale/upiqr";Validates handle formatting, regex, and min/max length.
Validates params for generateQR() (limit: ₹1,00,000).
Validates params for splitTransactionQR() (limit: ₹10,00,000).
Validates each split chunk item in the output array.
Validation Rules
| Field | Constraint | Failure Message |
|---|---|---|
| UPI_ID | Regex /^[\w.-]+@[\w.-]+$/ | "Invalid UPI ID format. Expected format: username@bank" |
| UPI_ID | 3 to 50 characters | "UPI ID must be between 3 and 50 characters" |
| AMOUNT | Positive & Finite | "Amount must be greater than 0" |
| AMOUNT (Single) | Max ₹1,00,000 | "Single QR amount cannot exceed ₹1,00,000" |
| AMOUNT (Split) | Max ₹10,00,000 | "Split QR amount cannot exceed ₹10,00,000" |
Pre-Validating UI Forms
Use upiIdSchema.safeParse() in your input blur or change handlers to give users instant visual feedback:
import { upiIdSchema } from "@omkarbhosale/upiqr";
function validateUserInput(inputUPI) {
const result = upiIdSchema.safeParse(inputUPI);
if (!result.success) {
// Access detailed Zod error message
const errorMessage = result.error.issues[0].message;
console.error("Invalid UPI:", errorMessage);
return { valid: false, error: errorMessage };
}
return { valid: true, data: result.data };
}
// Example calls:
validateUserInput("test@upi"); // { valid: true, data: "test@upi" }
validateUserInput("invalid_format"); // { valid: false, error: "Invalid UPI ID format..." }Validating API Payloads
If generating QR codes inside Next.js Server Actions or Node.js API handlers, use qrParamsSchema to sanitize the incoming request:
import { qrParamsSchema } from "@omkarbhosale/upiqr";
export async function handleCheckout(formData) {
const parsed = qrParamsSchema.safeParse({
UPI_ID: formData.get("upi_id"),
AMOUNT: Number(formData.get("amount")),
name: formData.get("name"),
note: formData.get("note"),
});
if (!parsed.success) {
// Map issues into a clean dictionary
const fieldErrors = {};
parsed.error.issues.forEach(issue => {
const field = issue.path[0] || "form";
fieldErrors[field] = issue.message;
});
return { success: false, errors: fieldErrors };
}
// Safe and ready to generate QR
return { success: true, validatedData: parsed.data };
}Error Structure
When generateQR() or splitTransactionQR() encounters validation issues, it throws a consolidated standard Error formatted as: