npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

modify-qris

v0.0.3

Published

Modify QRIS Generator is a javascript based libraries that enabling flexible payments with customizable amounts for improved efficiency and user experience

Downloads

10

Readme

QRIS Dynamic JS

A robust JavaScript/TypeScript library for generating dynamic QRIS (QR Code Indonesian Standard) codes. This library enables easy creation, modification, and validation of QRIS QR codes with comprehensive error handling.

Features

  • ✅ Dynamic QRIS QR code generation
  • ✅ Static QRIS QR code support
  • ✅ Multiple output formats (string, terminal, base64, PNG file)
  • ✅ Comprehensive error handling
  • ✅ QRIS validation according to ASPI standards
  • ✅ Fee calculations (fixed and percentage)
  • ✅ TypeScript support with complete type definitions
  • ✅ CRC validation and generation

Installation

npm install modify-qris

Quick Start

Basic Usage

import { QRIS, SourceType, PaymentFeeCategory } from 'modify-qris';
import path from 'path';

// Initialize QRIS with configuration
const qris = new QRIS({
    sourceType: SourceType.CODE,  // Directly use a QRIS code string
    sourceValue: '00020101021226...', // Your QRIS string
    merchantAddress: 'Jakarta',
    merchantPostalCode: '12345',
    amount: 25000,  // In the smallest currency unit (e.g., IDR)
    feeCategory: PaymentFeeCategory.FIXED,
    fee: 1000,
    terminalLabel: 'A01',
});

// Generate QR code and save to file
qris.generateQRFile('output.png')
    .then(filePath => {
        console.log(`QR code saved to: ${filePath}`);
    })
    .catch(error => {
        console.error('Error generating QR code:', error.message);
    });

Reading from an Existing QR Image

import { QRIS, SourceType } from 'modify-qris';
import path from 'path';

// Initialize QRIS from an image
const qris = new QRIS({
    sourceType: SourceType.IMAGE_PATH,
    sourceValue: path.join(__dirname, 'existing-qr.png'),
    merchantAddress: 'New Merchant Address',  // Override merchant address
    amount: 50000,  // Set a fixed amount
});

// Generate different outputs
async function generateOutputs() {
    try {
        // Get QRIS as a string
        const qrString = await qris.generateQR();
        console.log('QRIS string:', qrString);

        // Get QRIS as base64 for web display
        const qrBase64 = await qris.generateQRBase64();
        console.log('QRIS base64:', qrBase64.substring(0, 50) + '...');

        // Get QRIS as terminal-friendly ASCII art
        const qrTerminal = await qris.generateQRTerminal();
        console.log('QRIS terminal output:', qrTerminal);

        // Save QRIS to a file
        const filePath = await qris.generateQRFile('modified-qr.png');
        console.log('QRIS saved to:', filePath);
    } catch (error) {
        console.error('Error processing QRIS:', error);
    }
}

generateOutputs();

Error Handling

The library provides robust error handling with detailed error codes and messages:

import { QRIS, SourceType, PaymentFeeCategory } from 'modify-qris';

// Example with proper error handling
try {
    const qris = new QRIS({
        sourceType: SourceType.IMAGE_PATH,
        sourceValue: 'non-existent-file.png',
        merchantAddress: 'BANDUNG',
        feeCategory: PaymentFeeCategory.PERCENT,
        fee: 200, // Will cause an error (over 100%)
    });

    await qris.generateQRFile('output.png');
} catch (error) {
    // Check for specific error types
    if (error.message.includes('fee may not exceed 100')) {
        console.error('Fee percentage must be 100 or lower');
    } else if (error.message.includes('no such file')) {
        console.error('Source file not found');
    } else {
        console.error('Error generating QR code:', error.message);
    }
}

Custom Error Handling

For more advanced error handling, you can create a custom error handler function:

// Custom error handler function
function handleQRISError(error) {
  // Extract error details
  const code = error.code || 'UNKNOWN_ERROR';
  const message = error.message || 'An unknown error occurred';
  
  // Handle specific error types
  switch (code) {
    case 'FEE_EXCEEDED':
      console.error('Fee Error: The percentage fee cannot exceed 100%');
      // Take corrective action
      break;
    case 'SOURCE_NOT_FOUND':
      console.error('File Error: The source QR file could not be found');
      // Suggest alternative file paths
      break;
    case 'VALIDATION_FAILED':
      console.error('Validation Error:', message);
      // Log detailed validation errors
      if (error.details) {
        console.error('Validation details:', error.details);
      }
      break;
    default:
      console.error(`QRIS Error (${code}):`, message);
  }
  
  // Log error for diagnostic purposes
  console.debug('Error details:', error);
}

// Use the custom handler
try {
  const qris = new QRIS({/*...*/});
  await qris.generateQRFile('output.png');
} catch (error) {
  handleQRISError(error);
}

Configuration Options

| sourceType | string | Source type (CODE or IMAGE_PATH) | CODE | | sourceValue | string | QRIS code string or image path | - | | merchantAddress | string | Merchant address/city | - | | merchantPostalCode | string | Merchant postal code | - | | amount | number | Transaction amount (0 for dynamic amount) | 0 | | feeCategory | string | Fee category (FIXED or PERCENT) | - | | fee | number | Fee amount (max 100 if PERCENT) | 0 | | terminalLabel | string | Custom terminal label | - |

API Reference

The library provides a simple API for working with QRIS codes:

Methods

Generation Methods

  • generateQR(): Generates QRIS code as a string
  • generateQRBase64(): Generates QRIS code as base64 image
  • generateQRTerminal(): Generates QRIS code as ASCII art for terminal display
  • generateQRFile(output: string): Generates and saves QRIS code to a file

Configuration Setters

  • setMerchantAddress(address: string)
  • setMerchantPostalCode(postalCode: string)
  • setAmount(amount: number)
  • setFeeCategory(feeCategory: string)
  • setFee(fee: number)
  • setTerminalLabelCategory(label: string)

For detailed API documentation, please refer to API.md.

Important Note

⚠️ Use Responsibly

QRIS (QR Code Indonesian Standard) is governed by standards and regulations set by Bank Indonesia and ASPI (Asosiasi Sistem Pembayaran Indonesia). This library is provided for legitimate business and development purposes only.

Please use this library responsibly and ensure that any QRIS codes you generate comply with relevant regulations and standards. The library creators are not responsible for any misuse or for QR codes that do not conform to the official QRIS specifications.

When implementing this in production environments, always:

  • Test thoroughly with small transaction amounts
  • Validate your QRIS implementations with your payment service provider
  • Follow security best practices when handling payment information
  • Ensure your implementation complies with the latest QRIS standards
  • Do not use this library for fraudulent or misleading purposes

Known Limitations

  • The library currently supports QRIS specification version 1.0
  • Some advanced QRIS features like loyalty programs may not be fully implemented
  • Not all QRIS acquirer-specific extensions are supported
  • QR code reading capabilities depend on the quality of the source image

Contributing

Contributions are welcome! Please feel free to submit a Pull Request or open an issue for discussion.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

MIT License

Copyright (c) 2025 Ferdhika Yudira