@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.
Maintainers
Readme
🌙 @sanphandinh/vn-lunar
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 2023Can 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 buildRunning 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
- 📂 GitHub: https://github.com/sanphandinh/vn-lunar
- 🐛 Bug Reports: GitHub Issues
- 💬 Discussions: GitHub Discussions
- 📦 NPM Package: https://www.npmjs.com/package/@sanphandinh-vn-lunar
- 📧 Email: [email protected]
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
lunar-javascript- Chinese lunar calendarhijri-date- Islamic calendarsolar-lunar-calendar- Multi-calendar system
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
