v3.0.0 is released! Automatic Transaction Splitting, Zod 4 & Precision Math.
What's New
Core APIZod 4 Built-In

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:

typescript
import {
  upiIdSchema,
  qrParamsSchema,
  splitQRParamsSchema,
  splitQRItemSchema
} from "@omkarbhosale/upiqr";
upiIdSchema

Validates handle formatting, regex, and min/max length.

qrParamsSchema

Validates params for generateQR() (limit: ₹1,00,000).

splitQRParamsSchema

Validates params for splitTransactionQR() (limit: ₹10,00,000).

splitQRItemSchema

Validates each split chunk item in the output array.

Validation Rules

FieldConstraintFailure Message
UPI_IDRegex /^[\w.-]+@[\w.-]+$/"Invalid UPI ID format. Expected format: username@bank"
UPI_ID3 to 50 characters"UPI ID must be between 3 and 50 characters"
AMOUNTPositive & 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:

utils/validate.ts
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:

app/actions/checkout.ts
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:

Validation error: <field>: <message>; <field2>: <message2>