UNPKG

nhb-toolbox

Version:

A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.

301 lines (300 loc) 11.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Bongabdo = exports.BnCalendar = exports.BanglaCalendar = void 0; const non_primitives_1 = require("../guards/non-primitives"); const primitives_1 = require("../guards/primitives"); const specials_1 = require("../guards/specials"); const convert_1 = require("../number/convert"); const constants_1 = require("./constants"); const helpers_1 = require("./helpers"); class BanglaCalendar { variant; year; month; date; gregorian; weekDay; isoWeekDay; constructor(dateBnYrOrCfg, bnMonthOrCfg, bnDateOrCfg, config) { this.variant = this.#processVariants(dateBnYrOrCfg, bnMonthOrCfg, bnDateOrCfg, config); let date = dateBnYrOrCfg instanceof Date ? dateBnYrOrCfg : new Date((0, specials_1.isDateString)(dateBnYrOrCfg) && !_a.isBanglaDateString(dateBnYrOrCfg) ? dateBnYrOrCfg : (0, primitives_1.isNumber)(dateBnYrOrCfg) && !_a.isBanglaYearEn(dateBnYrOrCfg) ? dateBnYrOrCfg : Date.now()); if (Number.isNaN(date.getTime())) { date = new Date(); } const { year, month, monthDate } = this.#processDate(date); let bnYear = _a.isBanglaYear(dateBnYrOrCfg) ? (0, convert_1.banglaToDigit)(dateBnYrOrCfg) : (0, primitives_1.isNumber)(dateBnYrOrCfg) && _a.isBanglaYearEn(dateBnYrOrCfg) ? dateBnYrOrCfg : year; let bnMonth = _a.isBanglaMonth(bnMonthOrCfg) ? (0, convert_1.banglaToDigit)(bnMonthOrCfg) : _a.isBanglaMonthEn(bnMonthOrCfg) ? bnMonthOrCfg : month; let bnDate = _a.isBanglaDate(bnDateOrCfg) ? (0, convert_1.banglaToDigit)(bnDateOrCfg) : _a.isBanglaDateEn(bnDateOrCfg) ? bnDateOrCfg : monthDate; if (_a.isBanglaDateString(dateBnYrOrCfg)) { const parts = dateBnYrOrCfg.replace(/['"]/g, '').split('-'); bnYear = (0, convert_1.banglaToDigit)(parts[0]); bnMonth = (0, convert_1.banglaToDigit)(parts[1]); bnDate = (0, convert_1.banglaToDigit)(parts[2]); } const { gregYear } = this.#processGregYear(bnYear, bnMonth); const { bnMonthTable } = this.#getBnMonthTableLeap(gregYear, bnYear); const monthRange = bnMonthTable[bnMonth - 1]; if (bnDate > monthRange) { bnDate -= monthRange; if (bnMonth === 12) { bnMonth = 1; bnYear += 1; } else { bnMonth += 1; } } this.year = { bn: (0, convert_1.digitToBangla)(bnYear), en: bnYear, }; this.month = { bn: (0, convert_1.digitToBangla)(bnMonth), en: bnMonth, }; this.date = { bn: (0, convert_1.digitToBangla)(bnDate), en: bnDate, }; const { gy, gm, gd, wd } = (0, helpers_1._extractDateUnits)(this.toDate()); this.gregorian = { year: gy, month: gm, date: gd }; this.weekDay = wd; this.isoWeekDay = wd === 0 ? 7 : wd; } [Symbol.toPrimitive](hint) { if (hint === 'number') return this.valueOf(); return this.toJSON(); } get [Symbol.toStringTag]() { return this.toJSON(); } valueOf() { return this.toDate().getTime(); } toJSON() { const { year, month, date } = this; return `${(0, helpers_1._padShunno)(year.bn, 4)}-${(0, helpers_1._padShunno)(month.bn)}-${(0, helpers_1._padShunno)(date.bn)}`; } isLeapYear() { const { gregYear } = this.#processGregYear(); return this.#getBnMonthTableLeap(gregYear).isBnLeapYear; } toDate() { const { baseGregYear, gregYear } = this.#processGregYear(); const { bnMonthTable } = this.#getBnMonthTableLeap(gregYear); const epoch = Date.UTC(baseGregYear, 3, 13); let days = this.date.en; for (let i = 0; i < this.month.en - 1; i++) { days += bnMonthTable[i]; } return new Date(days * constants_1.MS_PER_DAY + epoch); } getSeasonName(locale) { return (0, helpers_1._getBnSeason)(this.month.en - 1, locale); } getMonthName(locale) { const MONTH = constants_1.BN_MONTHS[this.month.en - 1]; return (locale === 'en' ? MONTH.en : MONTH.bn); } getDayName(locale) { const DAY = constants_1.BN_DAYS[this.weekDay]; return (locale === 'en' ? DAY.en : DAY.bn); } addDays(days) { const date = this.toDate(); return new _a(date.setDate(date.getDate() + days), { variant: this.variant, }); } addWeeks(weeks) { const date = this.toDate(); return new _a(date.setDate(date.getDate() + weeks * 7), { variant: this.variant, }); } addMonths(months, overflow = true) { if (overflow) { const current = this.toDate(); return new _a(current.setMonth(current.getMonth() + months), { variant: this.variant, }); } else { const { variant, year, month, date } = this; let targetMonth = month.en + months; let targetYear = year.en; while (targetMonth > 12) { targetMonth -= 12; targetYear += 1; } while (targetMonth < 1) { targetMonth += 12; targetYear -= 1; } return this.#getClampedBnCal(targetYear, targetMonth, date.en, variant); } } addYears(years, overflow = true) { const { variant, year, month, date } = this; const targetYear = year.en + years; if (overflow) { return new _a(targetYear, month.en, date.en, { variant }); } else { return this.#getClampedBnCal(targetYear, month.en, date.en, variant); } } startOfMonth() { const { year, month, variant } = this; return new _a(year.en, month.en, 1, { variant }); } endOfMonth() { const { year, month, variant } = this; return new _a(year.en, month.en, this.daysInMonth(), { variant }); } startOfYear() { const { year, variant } = this; return new _a(year.en, 1, 1, { variant }); } endOfYear() { const { year, variant } = this; return new _a(year.en, 12, 30, { variant }); } daysInMonth(month) { const { gregYear } = this.#processGregYear(); const { bnMonthTable } = this.#getBnMonthTableLeap(gregYear); return bnMonthTable[(month ?? this.month.en) - 1]; } toString() { return this.#toString('bn'); } toStringEn() { return this.#toString('en'); } format(format) { const { year, month, date, weekDay } = this; const seasonName = this.getSeasonName(); const M_NAME = constants_1.BN_MONTHS[month.en - 1]; const D_NAME = constants_1.BN_DAYS[weekDay]; const paddedYear = (0, helpers_1._padShunno)(year.bn, 4); const dateComponents = { YYYY: paddedYear, YY: paddedYear.slice(-2), yyyy: paddedYear, yy: paddedYear.slice(-2), M: month.bn, MM: (0, helpers_1._padShunno)(month.bn), mmm: M_NAME.short, mmmm: M_NAME.bn, d: D_NAME.short, dd: D_NAME.bn.replace('বার', ''), ddd: D_NAME.bn, D: date.bn, DD: (0, helpers_1._padShunno)(date.bn), Do: date.bn, S: seasonName, SS: seasonName + 'কাল', }; return (0, helpers_1._formatDateCore)(format || 'ddd, DD mmmm (SS), YYYY বঙ্গাব্দ', dateComponents); } #processGregYear(bnYear, bnMonth) { const baseGregYear = (bnYear ?? this.year.en) + constants_1.BN_YEAR_OFFSET; const gregYear = (bnMonth ?? this.month.en) > 10 ? baseGregYear + 1 : baseGregYear; return { baseGregYear, gregYear }; } #getBnMonthTableLeap(gregYear, bnYear) { const isBnLeapYear = (0, helpers_1._isBnLeapYear)(bnYear ?? this.year.en, gregYear, this.variant); const bnMonthTable = isBnLeapYear ? constants_1.BN_MONTH_TABLES?.[this.variant].leap : constants_1.BN_MONTH_TABLES?.[this.variant].normal; return { bnMonthTable, isBnLeapYear }; } #getClampedBnCal(tyBn, tmBn, cdBn, variant) { const { gregYear } = this.#processGregYear(tyBn, tmBn); const { bnMonthTable } = this.#getBnMonthTableLeap(gregYear, tyBn); const tdBn = Math.min(cdBn, bnMonthTable[tmBn - 1]); return new _a(tyBn, tmBn, tdBn, { variant }); } #processVariants(v1, v2, v3, v4) { return this.$hasVariantConfig(v1) ? v1.variant : this.$hasVariantConfig(v2) ? v2.variant : this.$hasVariantConfig(v3) ? v3.variant : this.$hasVariantConfig(v4) ? v4.variant : 'revised-2019'; } #processDate(date) { const bnYear = (0, helpers_1._getBnYear)(date); const { days, monthIdx } = (0, helpers_1._bnDaysMonthIdx)(date, this.variant); return { year: bnYear, month: (monthIdx + 1), monthDate: (days + 1), }; } #toString(lcl = 'bn') { const { year, date } = this; return `${this.getDayName(lcl)}, ${date[lcl]} ${this.getMonthName(lcl)}, ${year[lcl]} [${this.getSeasonName(lcl)}]`; } $hasVariantConfig(value) { return ((0, non_primitives_1.isObjectWithKeys)(value, ['variant']) && (0, primitives_1.isNonEmptyString)(value.variant) && (value.variant === 'revised-1966' || value.variant === 'revised-2019')); } static isBanglaYear(value) { return (0, primitives_1.isNonEmptyString)(value) && /^(?:০{0,3}[১-৯][০-৯]{0,3}|০)$/.test(value.trim()); } static isBanglaYearEn(value) { return (0, primitives_1.isInteger)(value) && value >= 0 && value <= 9999; } static isBanglaMonth(value) { return (0, primitives_1.isNonEmptyString)(value) && /^(?:০?[১-৯]|১০|১১|১২)$/.test(value.trim()); } static isBanglaMonthEn(value) { return (0, primitives_1.isInteger)(value) && value >= 1 && value <= 12; } static isBanglaDate(value) { return (0, primitives_1.isNonEmptyString)(value) && /^(?:০?[১-৯]|[১২][০-৯]|৩০|৩১)$/.test(value.trim()); } static isBanglaDateEn(value) { return (0, primitives_1.isInteger)(value) && value >= 1 && value <= 31; } static isBanglaDateString(value) { if ((0, primitives_1.isNonEmptyString)(value) && value.includes('-')) { const [year, month, date] = value.replace(/['"]/g, '').split('-'); return (_a.isBanglaYear(year) && _a.isBanglaMonth(month) && _a.isBanglaDate(date)); } return false; } } exports.BanglaCalendar = BanglaCalendar; exports.BnCalendar = BanglaCalendar; exports.Bongabdo = BanglaCalendar; _a = BanglaCalendar;