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