UNPKG

nhb-toolbox

Version:

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

179 lines (178 loc) 6.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._secToDate = exports._toSeconds = void 0; exports._formatDateCore = _formatDateCore; exports._formatDate = _formatDate; exports._normalizeOffset = _normalizeOffset; exports._resolveNativeTzName = _resolveNativeTzName; exports._gmtToUtcOffset = _gmtToUtcOffset; exports._getBnSeason = _getBnSeason; exports._isBnLeapYear = _isBnLeapYear; exports._extractDateUnits = _extractDateUnits; exports._getGregBaseYear = _getGregBaseYear; exports._getBnYear = _getBnYear; exports._getUtcTs = _getUtcTs; exports._getElapsedDays = _getElapsedDays; exports._bnDaysMonthIdx = _bnDaysMonthIdx; exports._padZero = _padZero; exports._padShunno = _padShunno; exports._dateArgsToDate = _dateArgsToDate; exports._hasChronosProperties = _hasChronosProperties; const non_primitives_1 = require("../guards/non-primitives"); const primitives_1 = require("../guards/primitives"); const specials_1 = require("../guards/specials"); const utilities_1 = require("../number/utilities"); const constants_1 = require("./constants"); const guards_1 = require("./guards"); function _formatDateCore(format, dateComponents) { const tokenRegex = new RegExp(`^(${constants_1.SORTED_TIME_FORMATS.join('|')})`); let result = ''; let i = 0; while (i < format.length) { if (format[i] === '[') { const end = format.indexOf(']', i); if (end !== -1) { result += format.slice(i + 1, end); i = end + 1; continue; } } const match = tokenRegex.exec(format.slice(i)); if (match) { result += dateComponents[match[0]] ?? match[0]; i += match[0].length; } else { result += format[i]; i++; } } return result; } function _formatDate(format, year, month, day, date, hours, minutes, seconds, milliseconds, offset) { const paddedYear = _padZero(year, 4); const dateComponents = { YYYY: paddedYear, YY: paddedYear.slice(-2), yyyy: paddedYear, yy: paddedYear.slice(-2), M: String(month + 1), MM: _padZero(month + 1), mmm: constants_1.MONTHS[month].slice(0, 3), mmmm: constants_1.MONTHS[month], d: constants_1.DAYS[day].slice(0, 2), dd: constants_1.DAYS[day].slice(0, 3), ddd: constants_1.DAYS[day], D: String(date), DD: _padZero(date), Do: (0, utilities_1.getOrdinal)(date), H: String(hours), HH: _padZero(hours), h: String(hours % 12 || 12), hh: _padZero(hours % 12 || 12), m: String(minutes), mm: _padZero(minutes), s: String(seconds), ss: _padZero(seconds), ms: String(milliseconds), mss: _padZero(milliseconds, 3), a: hours < 12 ? 'am' : 'pm', A: hours < 12 ? 'AM' : 'PM', Z: offset, ZZ: offset, }; return _formatDateCore(format, dateComponents); } function _normalizeOffset(timeStr) { return timeStr.replace(/([+-]\d{2})(?!:)/, '$1:00'); } const _toSeconds = (ms) => Math.floor(ms / 1000); exports._toSeconds = _toSeconds; const _secToDate = (sec) => new Date(sec * 1000); exports._secToDate = _secToDate; function _resolveNativeTzName(tzId, type, date) { try { const parts = new Intl.DateTimeFormat('en', { timeZone: tzId, timeZoneName: type, }).formatToParts(date); return parts.find((p) => p.type === 'timeZoneName')?.value; } catch { return undefined; } } function _gmtToUtcOffset(gmt) { return gmt === 'GMT' ? 'UTC+00:00' : gmt?.replace(/^GMT/, 'UTC'); } function _getBnSeason(month, locale) { const season = constants_1.BN_SEASONS[Math.floor(month / 2)]; return (locale === 'en' ? season.en : season.bn); } function _isBnLeapYear(by, gy, v) { return v === 'revised-1966' ? by % 4 === 2 : (0, guards_1.isLeapYear)(gy); } function _extractDateUnits(date) { const month = date.getMonth(); return { gy: date.getFullYear(), $gm: month, gm: (month + 1), gd: date.getDate(), wd: date.getDay(), }; } function _getGregBaseYear(date) { const { gy, gm, gd } = _extractDateUnits(date); return gm < 4 || (gm === 4 && gd < 14) ? gy - 1 : gy; } function _getBnYear(date) { return _getGregBaseYear(date) - constants_1.BN_YEAR_OFFSET; } function _getUtcTs(date) { const { gy, $gm, gd } = _extractDateUnits(date); return Date.UTC(gy, $gm, gd); } function _getElapsedDays(date) { return Math.floor((_getUtcTs(date) - Date.UTC(_getGregBaseYear(date), 3, 14)) / constants_1.MS_PER_DAY); } function _bnDaysMonthIdx(date, variant) { const v = variant ?? 'revised-2019'; const table = _isBnLeapYear(_getBnYear(date), date.getFullYear(), v) ? constants_1.BN_MONTH_TABLES?.[v].leap : constants_1.BN_MONTH_TABLES?.[v].normal; let days = _getElapsedDays(date); let monthIdx = 0; while (days >= table[monthIdx]) { days -= table[monthIdx]; monthIdx++; } return { days, monthIdx }; } function _padZero(value, length = 2) { return String(value).padStart(length, '0'); } function _padShunno(str, length = 2) { return str.padStart(length, '০'); } function _dateArgsToDate(value) { return new Date((0, non_primitives_1.isDate)(value) ? value : (0, primitives_1.isString)(value) ? value.replace(/['"]/g, '') : (value ?? Date.now())); } function _hasChronosProperties(value) { return ((0, non_primitives_1.isObjectWithKeys)(value, [ 'origin', 'native', 'utcOffset', 'timeZoneName', 'timeZoneId', ]) && (0, primitives_1.isNonEmptyString)(value.origin) && ((0, non_primitives_1.isDate)(value.native) || (0, specials_1.isDateString)(value.native)) && (0, guards_1.isValidUTCOffset)(value.utcOffset) && (0, primitives_1.isNonEmptyString)(value.timeZoneName) && ((0, primitives_1.isNonEmptyString)(value.timeZoneId) || (0, non_primitives_1.isValidArray)(value.timeZoneId))); }