UNPKG

bongabdo

Version:

Modern TypeScript library for converting Gregorian dates to Bengali calendar (বঙ্গাব্দ)

1 lines 14.1 kB
{"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/converter.ts","../src/formatter.ts","../src/index.ts"],"names":["BANGLA_MONTHS","WEEK_DAYS","BANGLA_SEASONS","TOTAL_MONTH_DAYS","BANGLA_DIGITS","DEFAULT_FORMAT","BANGLA_YEAR_OFFSET","BANGLA_NEW_YEAR_MONTH","BANGLA_NEW_YEAR_DATE","EPOCH_DATE","isLeapYear","year","dateDiffInDays","a","b","utc1","utc2","convertToBanglaDigits","text","match","parseDateInput","dateInput","parsed","adjustDateForBangla","date","adjusted","convertToBanglaDate","givenDate","adjustedDate","gregDate","gregMonth","gregYear","gregDay","monthDays","banglaYearStart","banglaYear","epoch","dayRemaining","banglaMonthIndex","i","banglaDate","banglaMonth","banglaDay","banglaSeason","formatBanglaDate","options","format","showSeason","showWeekDays","useBanglaDigits","tokens","formattedString","bongabdo","getBanglaDate","formatBanglaDateOnly"],"mappings":"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","file":"index.mjs","sourcesContent":["export const BANGLA_MONTHS = [\n 'বৈশাখ',\n 'জ্যৈষ্ঠ',\n 'আষাঢ়',\n 'শ্রাবণ',\n 'ভাদ্র',\n 'আশ্বিন',\n 'কার্তিক',\n 'অগ্রহায়ণ',\n 'পৌষ',\n 'মাঘ',\n 'ফাল্গুন',\n 'চৈত্র'\n] as const;\n\nexport const WEEK_DAYS = [\n 'রবিবার',\n 'সোমবার',\n 'মঙ্গলবার',\n 'বুধবার',\n 'বৃহস্পতিবার',\n 'শুক্রবার',\n 'শনিবার'\n] as const;\n\nexport const BANGLA_SEASONS = [\n 'গ্রীষ্ম',\n 'বর্ষা',\n 'শরৎ',\n 'হেমন্ত',\n 'শীত',\n 'বসন্ত'\n] as const;\n\nexport const TOTAL_MONTH_DAYS = [31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 30] as const;\n\nexport const BANGLA_DIGITS: Record<string, string> = {\n '0': '০',\n '1': '১',\n '2': '২',\n '3': '৩',\n '4': '৪',\n '5': '৫',\n '6': '৬',\n '7': '৭',\n '8': '৮',\n '9': '৯'\n};\n\nexport const DEFAULT_FORMAT = 'DD MM, YY';\nexport const BANGLA_YEAR_OFFSET = 593;\nexport const BANGLA_NEW_YEAR_MONTH = 3; // April (0-indexed)\nexport const BANGLA_NEW_YEAR_DATE = 14;\nexport const EPOCH_DATE = 13; // 13th April ","import { BANGLA_DIGITS } from './constants';\n\n/**\n * Check if a year is a leap year\n */\nexport function isLeapYear(year: number): boolean {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\n/**\n * Calculate the difference in days between two dates\n */\nexport function dateDiffInDays(a: Date, b: Date): number {\n const MILLISECONDS_PER_DAY = 1000 * 60 * 60 * 24;\n const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());\n const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());\n \n return Math.floor((utc2 - utc1) / MILLISECONDS_PER_DAY);\n}\n\n/**\n * Convert English digits to Bengali digits\n */\nexport function convertToBanglaDigits(text: string): string {\n return text.replace(/\\d/g, (match) => BANGLA_DIGITS[match] || match);\n}\n\n/**\n * Parse date input to Date object\n */\nexport function parseDateInput(dateInput?: Date | string): Date {\n if (dateInput instanceof Date) {\n return new Date(dateInput);\n }\n \n if (typeof dateInput === 'string') {\n const parsed = new Date(dateInput);\n if (isNaN(parsed.getTime())) {\n throw new Error(`Invalid date string: ${dateInput}`);\n }\n return parsed;\n }\n \n return new Date();\n}\n\n/**\n * Adjust date for Bengali calendar (subtract 6 hours for sunrise)\n */\nexport function adjustDateForBangla(date: Date): Date {\n const adjusted = new Date(date);\n adjusted.setHours(adjusted.getHours() - 6);\n return adjusted;\n} ","import { BanglaDate } from './types';\nimport {\n BANGLA_MONTHS,\n WEEK_DAYS,\n BANGLA_SEASONS,\n TOTAL_MONTH_DAYS,\n BANGLA_YEAR_OFFSET,\n BANGLA_NEW_YEAR_MONTH,\n BANGLA_NEW_YEAR_DATE,\n EPOCH_DATE\n} from './constants';\nimport { isLeapYear, dateDiffInDays, adjustDateForBangla } from './utils';\n\n/**\n * Convert a Gregorian date to Bengali calendar date\n */\nexport function convertToBanglaDate(givenDate: Date): BanglaDate {\n const adjustedDate = adjustDateForBangla(givenDate);\n \n // Extract Gregorian date components\n const gregDate = adjustedDate.getDate();\n const gregMonth = adjustedDate.getMonth();\n const gregYear = adjustedDate.getFullYear();\n const gregDay = adjustedDate.getDay();\n \n // Create a copy of month days array to handle leap year adjustments\n const monthDays = [...TOTAL_MONTH_DAYS];\n \n // If the given Gregorian Year is a Leap Year, then the Falgun month will be 31 days\n if (isLeapYear(gregYear)) {\n monthDays[10] = 31; // Falgun (index 10)\n }\n \n // If the given date is before 14th April of current Gregorian Year\n let banglaYearStart = gregYear;\n if (gregMonth < BANGLA_NEW_YEAR_MONTH || \n (gregMonth === BANGLA_NEW_YEAR_MONTH && gregDate < BANGLA_NEW_YEAR_DATE)) {\n banglaYearStart = gregYear - 1;\n }\n \n // Calculate Bengali year\n const banglaYear = banglaYearStart - BANGLA_YEAR_OFFSET;\n \n // Create epoch date (13th April of the Bengali year start)\n const epoch = new Date(banglaYearStart, BANGLA_NEW_YEAR_MONTH, EPOCH_DATE);\n \n // Calculate days remaining from epoch\n let dayRemaining = dateDiffInDays(epoch, adjustedDate);\n \n // Find Bengali month and date\n let banglaMonthIndex = 0;\n \n for (let i = 0; i < BANGLA_MONTHS.length; i++) {\n if (dayRemaining <= monthDays[i]) {\n banglaMonthIndex = i;\n break;\n }\n dayRemaining -= monthDays[i];\n }\n \n const banglaDate = dayRemaining;\n const banglaMonth = BANGLA_MONTHS[banglaMonthIndex];\n const banglaDay = WEEK_DAYS[gregDay];\n \n // Calculate season (every two consecutive months indicate one season)\n const banglaSeason = BANGLA_SEASONS[Math.floor(banglaMonthIndex / 2)];\n \n return {\n year: banglaYear,\n date: banglaDate,\n month: banglaMonth,\n day: banglaDay,\n season: banglaSeason\n };\n} ","import { BanglaDate, BongabdoOptions, FormatTokens } from './types';\nimport { DEFAULT_FORMAT } from './constants';\nimport { convertToBanglaDigits } from './utils';\n\n/**\n * Format a Bengali date according to the specified format\n */\nexport function formatBanglaDate(banglaDate: BanglaDate, options: BongabdoOptions = {}): string {\n const {\n format = DEFAULT_FORMAT,\n showSeason = false,\n showWeekDays = false,\n convertToBanglaDigits: useBanglaDigits = true\n } = options;\n \n // Create format tokens\n const tokens: FormatTokens = {\n DD: banglaDate.date.toString(),\n MM: banglaDate.month,\n YY: banglaDate.year.toString(),\n WW: banglaDate.day,\n SS: banglaDate.season\n };\n \n let formattedString = format;\n \n // Replace format tokens\n formattedString = formattedString.replace(/DD/g, tokens.DD);\n formattedString = formattedString.replace(/MM/g, tokens.MM);\n formattedString = formattedString.replace(/YY/g, tokens.YY);\n \n // Handle optional tokens\n if (showWeekDays) {\n formattedString = formattedString.replace(/WW/g, tokens.WW);\n } else {\n formattedString = formattedString.replace(/WW/g, '');\n }\n \n if (showSeason) {\n formattedString = formattedString.replace(/SS/g, tokens.SS);\n } else {\n formattedString = formattedString.replace(/SS/g, '');\n }\n \n // Clean up any empty brackets or extra spaces\n formattedString = formattedString\n .replace(/\\[\\s*\\]/g, '') // Remove empty brackets\n .replace(/\\(\\s*\\)/g, '') // Remove empty parentheses\n .replace(/\\s+/g, ' ') // Replace multiple spaces with single space\n .trim();\n \n // Convert to Bengali digits if requested\n if (useBanglaDigits) {\n formattedString = convertToBanglaDigits(formattedString);\n }\n \n return formattedString;\n} ","import { BanglaDate, BongabdoOptions } from './types';\nimport { convertToBanglaDate } from './converter';\nimport { formatBanglaDate } from './formatter';\nimport { parseDateInput } from './utils';\n\n/**\n * Main function to convert a Gregorian date to Bengali calendar format\n */\nexport function bongabdo(dateInput?: Date | string, options: BongabdoOptions = {}): string {\n const date = parseDateInput(dateInput);\n const banglaDate = convertToBanglaDate(date);\n return formatBanglaDate(banglaDate, options);\n}\n\n/**\n * Get raw Bengali date object without formatting\n */\nexport function getBanglaDate(dateInput?: Date | string): BanglaDate {\n const date = parseDateInput(dateInput);\n return convertToBanglaDate(date);\n}\n\n/**\n * Format an existing Bengali date object\n */\nexport function formatBanglaDateOnly(banglaDate: BanglaDate, options: BongabdoOptions = {}): string {\n return formatBanglaDate(banglaDate, options);\n}\n\n// Export types\nexport type { BanglaDate, BongabdoOptions };\n\n// Export individual functions for advanced usage\nexport { convertToBanglaDate } from './converter';\nexport { formatBanglaDate } from './formatter';\nexport { parseDateInput, convertToBanglaDigits, isLeapYear } from './utils';\n\n// Export constants\nexport {\n BANGLA_MONTHS,\n WEEK_DAYS,\n BANGLA_SEASONS,\n TOTAL_MONTH_DAYS,\n BANGLA_DIGITS,\n DEFAULT_FORMAT\n} from './constants'; "]}