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
JavaScript
;
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)));
}