UNPKG

@everwhen/temporal

Version:
185 lines (184 loc) 7.53 kB
import { Temporal } from 'temporal-polyfill'; import { Duration } from "./duration.js"; import { invariant } from "./fn/misc.js"; import { Instant } from "./instant.js"; import { Interval } from "./interval.js"; import { PlainDateTime } from "./plain-date-time.js"; import { PlainDate } from "./plain-date.js"; import { PlainTime } from "./plain-time.js"; import { PlainYearMonth } from "./plain-year-month.js"; import { ZonedDateTime } from "./zoned-date-time.js"; export const isString = (value) => typeof value === 'string'; const isNumber = (value) => typeof value === 'number'; export const isObject = (value) => typeof value === 'object'; export function isInstanceOf(instance, class_) { if (instance === undefined || instance === null) { return false; } const tag = Object.prototype.toString.call(instance); const className = class_.name; return (Object.getPrototypeOf(instance) === class_.prototype || tag === `[object Temporal.${className}]` || tag === `[object ${className}]`); } export function isDuration(value) { return isInstanceOf(value, Duration); } export function isInstant(value) { return isInstanceOf(value, Instant); } export function isPlainDate(value) { return isInstanceOf(value, PlainDate); } export function isPlainDateTime(value) { return isInstanceOf(value, PlainDateTime); } export function isPlainTime(value) { return isInstanceOf(value, PlainTime); } export function isPlainTimeLike(value) { return (!!value && isObject(value) && (('hour' in value && isNumber(value.hour)) || ('minute' in value && isNumber(value.minute)) || ('second' in value && isNumber(value.second)) || ('millisecond' in value && isNumber(value.millisecond)) || ('microsecond' in value && isNumber(value.microsecond)) || ('nanosecond' in value && isNumber(value.nanosecond)))); } export function isTimeZoneLike(value) { return isString(value) || isZonedDateTime(value); } export function isPlainDateTimeLike(value) { return (!!value && isObject(value) && (('era' in value && isString(value.era)) || ('eraYear' in value && isNumber(value.eraYear)) || ('year' in value && isNumber(value.year)) || ('month' in value && isNumber(value.month)) || ('monthCode' in value && isString(value.monthCode)) || ('day' in value && isNumber(value.day)) || ('hour' in value && isNumber(value.hour)) || ('minute' in value && isNumber(value.minute)) || ('second' in value && isNumber(value.second)) || ('millisecond' in value && isNumber(value.millisecond)) || ('microsecond' in value && isNumber(value.microsecond)) || ('nanosecond' in value && isNumber(value.nanosecond)) || ('calendar' in value && isCalendarLike(value.calendar)))); } export function isPlainDateLike(value) { return (!!value && isObject(value) && (('era' in value && isString(value.era)) || ('eraYear' in value && isNumber(value.eraYear)) || ('year' in value && isNumber(value.year)) || ('month' in value && isNumber(value.month)) || ('monthCode' in value && isString(value.monthCode)) || ('day' in value && isNumber(value.day)) || ('calendar' in value && isCalendarLike(value.calendar)))); } export function isPlainYearMonthLike(value) { return (!!value && isObject(value) && (('era' in value && isString(value.era)) || ('eraYear' in value && isNumber(value.eraYear)) || ('year' in value && isNumber(value.year)) || ('month' in value && isNumber(value.month)) || ('monthCode' in value && isString(value.monthCode)) || ('calendar' in value && isCalendarLike(value.calendar)))); } export function isZonedDateTimeLike(value) { return (!!value && isObject(value) && (('era' in value && isString(value.era)) || ('eraYear' in value && isNumber(value.eraYear)) || ('year' in value && isNumber(value.year)) || ('month' in value && isNumber(value.month)) || ('monthCode' in value && isString(value.monthCode)) || ('day' in value && isNumber(value.day)) || ('hour' in value && isNumber(value.hour)) || ('minute' in value && isNumber(value.minute)) || ('second' in value && isNumber(value.second)) || ('millisecond' in value && isNumber(value.millisecond)) || ('microsecond' in value && isNumber(value.microsecond)) || ('nanosecond' in value && isNumber(value.nanosecond)) || ('offset' in value && isString(value.offset)) || ('timeZone' in value && isTimeZoneLike(value.timeZone)) || ('calendar' in value && isCalendarLike(value.calendar)))); } export function isPlainYearMonth(value) { return isInstanceOf(value, PlainYearMonth); } export function isZonedDateTime(value) { return isInstanceOf(value, ZonedDateTime); } export function isPoint(value, typeGuard) { return typeGuard ? typeGuard(value) : isPlainTime(value) || isPlainDateTime(value) || isPlainDate(value) || isPlainYearMonth(value) || isZonedDateTime(value); } export function isPointAny(value, typeGuards) { return typeGuards.some((guard) => guard(value)); } export function isInterval(value, typeGuard) { if (typeGuard) { return (isInstanceOf(value, Interval) && typeGuard(value.start) && typeGuard(value.end)); } return isInstanceOf(value, Interval); } export function isIntervalLike(value, typeGuard) { return (!!value && isObject(value) && 'start' in value && 'end' in value && (typeGuard ? typeGuard(value.start) : isPoint(value.start)) && (typeGuard ? typeGuard(value.end) : isPoint(value.end))); } export function isIntervalLikeOneOf(value, typeGuards) { return (isIntervalLike(value) && typeGuards.some((guard) => guard(value.start) && guard(value.end))); } // TODO: add Temporal.PlainMonthDay export function isCalendarLike(value) { return (isPlainDateTime(value) || isPlainDate(value) || isPlainYearMonth(value) || isZonedDateTime(value) || isString(value)); } export function assertPoint(value, typeGuard, message) { invariant(isPoint(value, typeGuard), message); } export function assertPointAny(value, typeGuards) { invariant(typeGuards.some((guard) => guard(value))); } export function assertPlainDateTime(value, message) { invariant(isPlainDateTime(value), message); } export function assertPlainTime(value, message) { invariant(isPlainTime(value), message); } export function assertPlainYearMonth(value, message) { invariant(isPlainYearMonth(value), message); } export function assertPlainDate(value, message) { invariant(isPlainDate(value), message); } export function assertInstant(value, message) { invariant(isInstant(value), message); } export function assertZonedDateTime(value, message) { invariant(isZonedDateTime(value), message); } export function assertInterval(value, typeGuard, message) { invariant(isInterval(value, typeGuard), message); } export function assertIntervalLike(value, typeGuard, message) { invariant(isIntervalLike(value, typeGuard), message); }