nhb-toolbox
Version:
A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.
157 lines (156 loc) • 6.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractHourMinute = extractHourMinute;
exports.getTotalMinutes = getTotalMinutes;
exports.getCurrentDateTime = getCurrentDateTime;
exports.extractTimeFromUTC = extractTimeFromUTC;
exports.extractMinutesFromUTC = extractMinutesFromUTC;
exports.convertMinutesToTime = convertMinutesToTime;
exports.formatUTCOffset = formatUTCOffset;
exports.getNativeTimeZoneId = getNativeTimeZoneId;
exports.getTimeZoneDetails = getTimeZoneDetails;
exports.getTimeZoneIds = getTimeZoneIds;
exports.formatDate = formatDate;
exports.formatTimePart = formatTimePart;
exports.formatDateRelative = formatDateRelative;
exports.getTimestamp = getTimestamp;
const non_primitives_1 = require("../guards/non-primitives");
const primitives_1 = require("../guards/primitives");
const utilities_1 = require("../number/utilities");
const guards_1 = require("./guards");
const helpers_1 = require("./helpers");
const timezone_1 = require("./timezone");
function extractHourMinute(time) {
const [hour, minute] = time.split(':').map(Number);
return [hour, minute];
}
function getTotalMinutes(time) {
const isNegative = time.startsWith('-');
const [h, m] = extractHourMinute(isNegative ? time.slice(1) : time);
const total = h * 60 + m;
return isNegative ? -total : total;
}
function getCurrentDateTime() {
return new Date();
}
function extractTimeFromUTC(utc) {
return utc.replace(/^UTC[+]?/g, '');
}
function extractMinutesFromUTC(utc) {
return getTotalMinutes(extractTimeFromUTC(utc));
}
function convertMinutesToTime(minutes) {
const parsed = (0, utilities_1.normalizeNumber)(minutes);
if ((0, primitives_1.isUndefined)(parsed)) {
throw new TypeError(`Invalid numeric input!`, {
cause: `${minutes} cannot be converted to a number.`,
});
}
const numMIn = Math.abs(parsed);
return `${String(Math.floor(numMIn / 60))}:${String(numMIn % 60).padStart(2, '0')}`;
}
function formatUTCOffset(minutes) {
const parsed = (0, utilities_1.normalizeNumber)(minutes);
if ((0, primitives_1.isUndefined)(parsed)) {
throw new TypeError(`Invalid numeric input!`, {
cause: `${minutes} cannot be converted to a number.`,
});
}
const sign = parsed < 0 ? '-' : '+';
const abs = Math.abs(parsed);
const hours = String(Math.floor(abs / 60)).padStart(2, '0');
const mins = String(abs % 60).padStart(2, '0');
return `UTC${sign}${hours}:${mins}`;
}
function getNativeTimeZoneId() {
return Intl.DateTimeFormat().resolvedOptions().timeZone;
}
function getTimeZoneDetails(tzId, date) {
const TZ_NAME_TYPES = ['long', 'longGeneric', 'longOffset'];
const $tzId = tzId || getNativeTimeZoneId();
const obj = { tzIdentifier: $tzId };
for (const type of TZ_NAME_TYPES) {
const key = `tzName${type[0].toUpperCase()}${type.slice(1)}`;
obj[key] = (0, helpers_1._resolveNativeTzName)($tzId, type, date);
}
return obj;
}
const TZ_MAP = new Map();
function getTimeZoneIds(offset) {
if (!(0, guards_1.isValidUTCOffset)(offset))
return [];
if (TZ_MAP.has(offset))
return TZ_MAP.get(offset) ?? [];
for (const zone of timezone_1.NATIVE_TZ_IDS) {
const partValue = (0, helpers_1._resolveNativeTzName)(zone, 'longOffset');
const off = (0, helpers_1._gmtToUtcOffset)(partValue);
if (off)
TZ_MAP.set(off, [...(TZ_MAP.get(off) ?? []), zone]);
}
return TZ_MAP.get(offset) ?? [];
}
function formatDate(options) {
const { date = new Date(), format = 'dd, mmm DD, YYYY HH:mm:ss', useUTC = false, } = options ?? {};
const $date = (0, helpers_1._dateArgsToDate)(date);
if (Number.isNaN($date.getTime())) {
return 'Invalid Date!';
}
const _getUnitValue = (suffix) => {
return useUTC ? $date[`getUTC${suffix}`]() : $date[`get${suffix}`]();
};
const y = _getUnitValue('FullYear'), mo = _getUnitValue('Month'), d = _getUnitValue('Day'), dt = _getUnitValue('Date'), h = _getUnitValue('Hours'), m = _getUnitValue('Minutes'), s = _getUnitValue('Seconds'), ms = _getUnitValue('Milliseconds');
const offset = useUTC ? 'Z' : formatUTCOffset(-$date.getTimezoneOffset()).slice(3);
return (0, helpers_1._formatDate)(format, y, mo, d, dt, h, m, s, ms, offset);
}
function formatTimePart(time, format) {
const timeWithDate = `${formatDate({ format: 'YYYY-MM-DD' })}T${(0, helpers_1._normalizeOffset)(time)}`;
return formatDate({ date: timeWithDate, format: format || 'hh:mm:ss a' });
}
function formatDateRelative(date, format) {
const $date = (0, helpers_1._dateArgsToDate)(date);
if (Number.isNaN($date.getTime())) {
return 'Invalid Date!';
}
const now = Date.now();
const then = $date.getTime();
const diff = Math.abs(now - then);
const minutes = Math.floor(diff / 60000);
const hours = Math.floor(diff / 3600000);
const days = Math.floor(diff / 86400000);
const suffix = then < now ? 'ago' : 'from now';
if (minutes < 1)
return 'Just now';
if (minutes < 60)
return `${minutes}m ${suffix}`;
if (hours < 24)
return `${hours}h ${suffix}`;
if (days < 7)
return `${days}d ${suffix}`;
return formatDate({ date, format: format || 'mmm D, yyyy hh:mm a' });
}
function getTimestamp(args, format) {
let $value;
let $format;
const _isTsOptions = (opt) => {
return (0, non_primitives_1.isObject)(opt) && ('value' in opt || 'format' in opt);
};
if (_isTsOptions(args)) {
$value = args.value || new Date();
$format = args.format || 'utc';
}
else {
$value = args || new Date();
$format = format || 'utc';
}
let date = (0, helpers_1._dateArgsToDate)($value);
if (Number.isNaN(date.getTime())) {
date = new Date();
}
if ($format === 'local') {
const offsetMins = date.getTimezoneOffset();
const localDate = new Date(date.getTime() - offsetMins * 60000);
const offset = formatUTCOffset(-offsetMins).slice(3);
return localDate.toISOString().replace('Z', offset);
}
return date.toISOString();
}