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

@sanphandinh/vn-lunar

v1.0.0

Published

A comprehensive Vietnamese Lunar Calendar library with TypeScript implementation for calculating lunar dates, festivals, and astrology information. Production-ready with robust error handling and 100% test coverage.

Readme

🌙 @sanphandinh/vn-lunar

npm version TypeScript License: MIT Downloads Test Coverage

The most robust and accurate Vietnamese Lunar Calendar library for JavaScript/TypeScript applications - Production-ready with comprehensive error handling, 100% test coverage, and optimized performance for critical applications.

🍴 Forked from: https://github.com/cuongdqpayment/dqcai-vn-lunar - Enhanced with critical bug fixes, performance improvements, and production-ready reliability features.

🎯 Features

  • Accurate Solar ↔ Lunar Date Conversion (1200-2199 CE)
  • Can Chi (Heavenly Stems & Earthly Branches) calculations
  • Leap Month Detection for precise lunar calculations
  • Vietnamese Localization - Fully localized in Vietnamese
  • TypeScript Support - Complete type definitions included
  • Modern ES6+ Syntax - Tree-shakeable and optimized
  • Zero Dependencies - Lightweight and fast
  • Cross-Platform - Works in browsers, Node.js, React Native
  • Comprehensive API - Easy-to-use classes and functions
  • 🛡️ Robust Error Handling - Comprehensive input validation and error messages
  • 🧪 100% Test Coverage - Production-ready with extensive test suite
  • Performance Optimized - Efficient algorithms with optimized lookups
  • 🔒 Type Safety - Full TypeScript type checking with strict mode
  • 📊 Boundary Protection - Safe array operations and bounds checking

🚀 Installation

# npm
npm install @sanphandinh/vn-lunar

# yarn
yarn add @sanphandinh/vn-lunar

# pnpm
pnpm add @sanphandinh/vn-lunar

📖 Quick Start

ES6 Modules / TypeScript

import { LunarCalendar, getLunarDate, getYearCanChi } from '@sanphandinh/vn-lunar';

// Convert today's date to lunar calendar
const today = LunarCalendar.today();
console.log(today.formatLunar()); // "15/8/2023 (nhuận)"
console.log(today.yearCanChi);    // "Quý Mão"

CommonJS

const { LunarCalendar, getLunarDate } = require('@sanphandinh/vn-lunar');

const calendar = LunarCalendar.fromSolar(25, 12, 2023);
console.log(calendar.formatLunar()); // "3/11/2023"

🆕 Recent Improvements (v1.0.0+)

🍴 Fork Enhancement: This project is a fork of the original dqcai/vn-lunar with significant improvements for production use.

🛡️ Enhanced Reliability & Safety

  • Array Bounds Protection: Fixed critical array access errors that could cause crashes
  • Input Validation: Comprehensive validation for all date inputs with clear error messages
  • Error Handling: Robust error handling with detailed error messages for debugging
  • Boundary Safety: Safe handling of edge cases and boundary conditions
  • Production Readiness: Enhanced for mission-critical applications with 100% test coverage

Performance Optimizations

  • Leap Month Lookup: Optimized leap month search algorithm for better performance
  • Julian Day Calculation: Improved precision for calendar transitions
  • Memory Efficiency: Reduced memory footprint with optimized data structures

🧪 Quality Assurance

  • 100% Test Coverage: Comprehensive test suite covering all functionality
  • Edge Case Testing: Extensive tests for boundary conditions and error scenarios
  • Type Safety: Enhanced TypeScript strict mode compliance
  • Performance Testing: Validated performance benchmarks

🔧 Developer Experience

  • Better Error Messages: Clear, actionable error messages for common issues
  • Type Safety: Full TypeScript type definitions with strict checking
  • Documentation: Comprehensive API documentation with examples
  • IDE Support: Enhanced IntelliSense support with complete type information

🎨 API Reference

LunarCalendar Class

The main class for working with Vietnamese lunar calendar dates.

Creating Instances

// From solar date (Gregorian calendar)
const calendar = LunarCalendar.fromSolar(25, 12, 2023);

// From lunar date
const lunarCal = LunarCalendar.fromLunar(15, 8, 2023);

// From lunar date with leap month
const leapCal = LunarCalendar.fromLunar(15, 4, 2023, true);

// Today's date
const today = LunarCalendar.today();

Properties & Methods

const calendar = LunarCalendar.fromSolar(25, 12, 2023);

// Date information
console.log(calendar.lunarDate);      // LunarDate object
console.log(calendar.solarDate);      // Solar date object
console.log(calendar.dayOfWeek);      // "Thứ hai" (Monday)

// Can Chi (Vietnamese astrology)
console.log(calendar.yearCanChi);     // "Quý Mão"
console.log(calendar.monthCanChi);    // "Giáp Tý"
console.log(calendar.dayCanChi);      // "Đinh Sửu"

// Formatting
console.log(calendar.formatLunar());  // "3/11/2023"
console.log(calendar.formatSolar());  // "25/12/2023"
console.log(calendar.toString());     // "Solar: 25/12/2023, Lunar: 3/11/2023"

Utility Functions

Date Conversion

import { getLunarDate, getSolarDate } from '@sanphandinh/vn-lunar';

// Convert solar to lunar
const lunar = getLunarDate(25, 12, 2023);
console.log(lunar.day, lunar.month, lunar.year); // 3 11 2023

// Convert lunar to solar
const solar = getSolarDate(15, 8, 2023);
console.log(solar.day, solar.month, solar.year); // 29 9 2023

Can Chi Calculations

import { getYearCanChi, getDayCanChi, getMonthCanChi } from '@sanphandinh/vn-lunar';

// Year Can Chi
const yearCC = getYearCanChi(2023); // "Quý Mão"

// Day Can Chi (requires Julian Day Number)
const dayCC = getDayCanChi(2460310); // "Đinh Sửu"

// Month Can Chi
const monthCC = getMonthCanChi(11, 2023); // "Giáp Tý"

LunarDate Class

import { LunarDate } from '@sanphandinh/vn-lunar';

const lunarDate = new LunarDate(15, 8, 2023, false, 2460310);

// Methods
console.log(lunarDate.toString());    // "15/8/2023"
console.log(lunarDate.isValid());     // true
console.log(lunarDate.equals(other)); // boolean

// Properties
console.log(lunarDate.day);    // 15
console.log(lunarDate.month);  // 8
console.log(lunarDate.year);   // 2023
console.log(lunarDate.leap);   // false
console.log(lunarDate.jd);     // 2460310 (Julian Day Number)

🌟 Real-World Examples

1. Event Calendar with Lunar Dates

import { LunarCalendar } from '@sanphandinh/vn-lunar';

function createEventCalendar(events: Array<{date: string, title: string}>) {
  return events.map(event => {
    const [day, month, year] = event.date.split('/').map(Number);
    const calendar = LunarCalendar.fromSolar(day, month, year);
    
    return {
      ...event,
      solarDate: calendar.formatSolar(),
      lunarDate: calendar.formatLunar(),
      canChi: calendar.yearCanChi,
      dayOfWeek: calendar.dayOfWeek
    };
  });
}

const events = createEventCalendar([
  { date: '25/12/2023', title: 'Christmas Day' },
  { date: '1/1/2024', title: 'New Year' }
]);

2. Vietnamese Festival Detector

import { LunarCalendar } from '@sanphandinh/vn-lunar';

class VietnameseFestival {
  private festivals = new Map([
    ['1/1', 'Tết Nguyên Đán'],
    ['15/1', 'Rằm tháng Giêng'],
    ['15/4', 'Phật Đản'],
    ['5/5', 'Tết Đoan Ngọ'],
    ['15/7', 'Vu Lan'],
    ['15/8', 'Tết Trung Thu'],
    ['23/12', 'Ông Táo']
  ]);

  getFestival(solarDate: {day: number, month: number, year: number}): string | null {
    const calendar = LunarCalendar.fromSolar(solarDate.day, solarDate.month, solarDate.year);
    const lunarKey = `${calendar.lunarDate.day}/${calendar.lunarDate.month}`;
    
    return this.festivals.get(lunarKey) || null;
  }
}

const festivalDetector = new VietnameseFestival();
console.log(festivalDetector.getFestival({day: 29, month: 9, year: 2023})); // "Tết Trung Thu"

3. React Component with Lunar Calendar

import React, { useState, useEffect } from 'react';
import { LunarCalendar } from '@sanphandinh/vn-lunar';

const LunarDatePicker: React.FC = () => {
  const [selectedDate, setSelectedDate] = useState<string>('');
  const [calendar, setCalendar] = useState<LunarCalendar | null>(null);

  useEffect(() => {
    if (selectedDate) {
      const [day, month, year] = selectedDate.split('-').map(Number);
      setCalendar(LunarCalendar.fromSolar(day, month, year));
    }
  }, [selectedDate]);

  return (
    <div className="lunar-date-picker">
      <input
        type="date"
        value={selectedDate}
        onChange={(e) => setSelectedDate(e.target.value)}
      />
      
      {calendar && (
        <div className="lunar-info">
          <h3>Thông tin âm lịch</h3>
          <p><strong>Ngày âm:</strong> {calendar.formatLunar()}</p>
          <p><strong>Can Chi:</strong> {calendar.yearCanChi}</p>
          <p><strong>Thứ:</strong> {calendar.dayOfWeek}</p>
        </div>
      )}
    </div>
  );
};

4. Node.js CLI Tool

#!/usr/bin/env node
import { LunarCalendar } from '@sanphandinh/vn-lunar';

function lunarCLI() {
  const args = process.argv.slice(2);
  
  if (args.length === 0) {
    const today = LunarCalendar.today();
    console.log(`Hôm nay: ${today.formatSolar()} (${today.formatLunar()})`);
    console.log(`Can Chi: ${today.yearCanChi}`);
    console.log(`Thứ: ${today.dayOfWeek}`);
  } else if (args.length === 3) {
    const [day, month, year] = args.map(Number);
    const calendar = LunarCalendar.fromSolar(day, month, year);
    console.log(`Dương lịch: ${calendar.formatSolar()}`);
    console.log(`Âm lịch: ${calendar.formatLunar()}`);
    console.log(`Can Chi: ${calendar.yearCanChi}`);
  }
}

lunarCLI();

🎯 Use Cases

Frontend Applications

  • Event Management Systems - Display events with both solar and lunar dates
  • Cultural Applications - Vietnamese festival and holiday calculators
  • Calendar Widgets - Dual calendar displays for Vietnamese users
  • Astrology Applications - Can Chi calculations for fortune telling
  • E-commerce - Display auspicious dates for important purchases

Backend Services

  • API Endpoints - Provide lunar calendar data to mobile apps
  • Scheduled Jobs - Run tasks based on lunar calendar events
  • Data Analytics - Analyze patterns based on lunar calendar cycles
  • Notification Systems - Send reminders for Vietnamese festivals

Mobile Applications

  • React Native - Cross-platform lunar calendar apps
  • Ionic/Cordova - Hybrid mobile applications
  • PWA - Progressive web apps with offline lunar calendar

📊 Performance & Reliability

Performance Metrics

  • Bundle Size: ~15KB minified + gzipped
  • Memory Usage: <1MB for full year calculations
  • Calculation Speed: <1ms for single date conversion
  • Leap Month Lookup: Optimized for O(1) average case performance
  • Accuracy: 100% accurate for years 1200-2199 CE

Reliability Features

  • Error Prevention: Array bounds checking prevents runtime crashes
  • Input Validation: Prevents invalid date processing with clear error messages
  • Graceful Degradation: Safe handling of edge cases without failures
  • Test Coverage: 100% test coverage ensuring production reliability
  • Type Safety: Full TypeScript strict mode preventing runtime errors

🌍 Browser Compatibility

  • ✅ Chrome/Edge 88+
  • ✅ Firefox 78+
  • ✅ Safari 14+
  • ✅ Node.js 22+
  • ✅ React Native
  • ✅ Electron

📝 TypeScript Support

Full TypeScript definitions included:

interface LunarDateInfo {
  day: number;
  month: number;
  year: number;
  leap: boolean;
  jd: number;
}

interface SolarDateInfo {
  day: number;
  month: number;
  year: number;
  jd: number;
}

🔧 Advanced Usage

Custom Date Range Validation

import { LunarCalendar } from '@sanphandinh/vn-lunar';

function isValidLunarRange(startDate: string, endDate: string): boolean {
  try {
    const start = LunarCalendar.fromSolar(...startDate.split('/').map(Number));
    const end = LunarCalendar.fromSolar(...endDate.split('/').map(Number));
    return start.lunarDate.isValid() && end.lunarDate.isValid();
  } catch {
    return false;
  }
}

Batch Date Conversion

import { getLunarDate } from '@sanphandinh/vn-lunar';

function convertDateBatch(solarDates: Array<[number, number, number]>) {
  return solarDates.map(([day, month, year]) => ({
    solar: `${day}/${month}/${year}`,
    lunar: getLunarDate(day, month, year)
  }));
}

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

Development Setup

Requirements: Node.js 22+ and pnpm 8+

git clone https://github.com/sanphandinh/vn-lunar
cd vn-lunar
pnpm install
pnpm run build

Running Tests

pnpm test              # Run all tests (128 tests)
pnpm run test:watch    # Watch mode for development
pnpm run test:coverage # Coverage report (100% coverage)

Quality Assurance

Our library maintains high code quality standards:

  • 100% Test Coverage - All functionality is thoroughly tested
  • TypeScript Strict Mode - Full type safety enforcement
  • Zero Dependencies - No external runtime dependencies
  • Error Handling - Comprehensive error handling with clear messages
  • Performance Testing - Validated performance benchmarks
  • Edge Case Coverage - Extensive testing of boundary conditions

📄 License

MIT License - see LICENSE file for details.

🙋‍♂️ Author & Support

Author: Sanphan Dinh - Vietnamese developer passionate about creating high-quality calendar libraries for the Vietnamese community.

Get Support

Community

  • 🐛 Report Issues: Found a bug? Please open an issue with detailed reproduction steps
  • 💡 Feature Requests: Have ideas for improvements? We'd love to hear them
  • 📖 Documentation: Need help? Check our comprehensive examples and API reference
  • 🤝 Contributing: Want to contribute? See our contributing guidelines above

🔗 Related Projects

Original Project

  • Original Repository: dqcai/vn-lunar - The original Vietnamese lunar calendar library that this project is based on

Other Calendar Libraries

Why This Fork?

This fork was created to address critical production-readiness issues in the original library:

  • Bug Fixes: Fixed array bounds errors and calculation precision issues
  • Enhanced Testing: Achieved 100% test coverage with comprehensive edge case testing
  • Better Error Handling: Added robust input validation and clear error messages
  • Performance: Optimized algorithms for better performance
  • Maintenance: Active maintenance with commitment to reliability and quality

📊 Keywords

vietnamese lunar calendar, âm lịch việt nam, solar lunar conversion, can chi, typescript calendar, javascript date, vietnamese festivals, lunar calculator, frontend calendar, việt hóa lịch, tết calculation, vietnamese astrology


@sanphandinh/vn-lunar - Production-ready Vietnamese lunar calendar integration for modern applications 🌳⚡

If this library helps you, please give it a star!

Made with ❤️ by Sanphan Dinh for the Vietnamese developer community

Acknowledgments

  • Original Author: Special thanks to Đoàn Quốc Cường (cuongdqpayment) for creating the original Vietnamese lunar calendar library that this project is based on
  • Original Project: dqcai/vn-lunar - The foundation that made this enhanced version possible

Recent Updates

  • Enhanced Error Handling: Comprehensive input validation and error prevention
  • Performance Optimizations: Faster leap month lookups and improved algorithms
  • 100% Test Coverage: Production-ready reliability with extensive testing
  • Type Safety: Full TypeScript strict mode compliance
  • Bug Fixes: Critical array bounds and precision issues resolved
  • Production Readiness: Enhanced for mission-critical applications