@everwhen/temporal
Version:
_description_
185 lines (184 loc) • 7.53 kB
JavaScript
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);
}