UNPKG

nhb-toolbox

Version:

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

69 lines (68 loc) 2.56 kB
import { isFunction, isObject } from '../guards/non-primitives.js'; import { isBoolean, isNonEmptyString, isString } from '../guards/primitives.js'; import { isNumericString } from '../guards/specials.js'; import { normalizeNumber } from '../number/utilities.js'; import { IANA_TZ_IDS, NATIVE_TZ_IDS } from './timezone.js'; export function isValidTime(value) { if (!isNonEmptyString(value)) return false; const [hourStr, minuteStr] = value.split(':'); if (!isNumericString(hourStr) || !isNumericString(minuteStr)) return false; const hour = Number(hourStr); const minute = Number(minuteStr); return hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59; } export function isValidUTCOffset(value) { return isString(value) ? /^UTC[+-]?(?:0[0-9]|1[0-4]):(?:00|15|30|45)$/.test(value) : false; } export function isValidTimeZoneId(value) { return isNonEmptyString(value) ? new Set([...IANA_TZ_IDS]).has(value) : false; } export function isNativeTimeZoneId(value) { return isNonEmptyString(value) ? new Set(NATIVE_TZ_IDS).has(value) : false; } export function isLeapYear(year) { const $year = normalizeNumber(year); return $year ? ($year % 4 === 0 && $year % 100 !== 0) || $year % 400 === 0 : false; } export function isDateLike(value) { if (value instanceof Date) return true; if (isObject(value)) { if (isFunction(value.format) && isFunction(value.toJSON) && isFunction(value.toISOString)) { return true; } if (isFunction(value.toISO) && isFunction(value.toFormat) && isBoolean(value.isValid)) { return true; } if (isFunction(value.plus) && isFunction(value.minus) && isFunction(value.equals) && isFunction(value.getClass)) { return true; } const temporals = [ 'Instant', 'Duration', 'PlainDate', 'PlainTime', 'PlainDateTime', 'PlainMonthDay', 'PlainYearMonth', 'ZonedDateTime', ]; if (isFunction(value.toJSON) && isFunction(value.toString) && temporals.includes(value.constructor?.name ?? '')) { return true; } } return false; } export function isTimeWithUnit(value) { return (isNonEmptyString(value) && /^-?\d*\.?\d+ *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|months?|mo|years?|yrs?|y)?$/i.test(value)); }