UNPKG

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
"use strict"; 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(); }