UNPKG

typed-duration

Version:

Zero-dependency typed duration library for JavaScript

172 lines (171 loc) 6.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.daysFrom = exports.hoursFrom = exports.minutesFrom = exports.secondsFrom = exports.millisecondsFrom = exports.numberFrom = exports.daysOf = exports.hoursOf = exports.minutesOf = exports.millisecondsOf = exports.secondsOf = exports.valueOf = exports.valueFrom = exports.isTypedDuration = void 0; /** * Returns true if the argument is a typed duration object. * Also, acts as a type guard. * */ const isTypedDuration = (maybeTypedDuration) => typeof maybeTypedDuration === "object" && (maybeTypedDuration === null || maybeTypedDuration === void 0 ? void 0 : maybeTypedDuration.valueType) === "TYPED_DURATION"; exports.isTypedDuration = isTypedDuration; /** * Return the unwrapped number from any typed duration, regardless of its type */ const valueFrom = (time) => (0, exports.isTypedDuration)(time) ? time.value : time; exports.valueFrom = valueFrom; /** * * Return a string representation, with units. For example: `60000ms` */ const valueOf = (time, defaultUnit = "") => `${(0, exports.valueFrom)(time)}${(0, exports.isTypedDuration)(time) ? time.unit : defaultUnit}`; exports.valueOf = valueOf; const isSeconds = (maybeSeconds) => (0, exports.isTypedDuration)(maybeSeconds) && maybeSeconds.type === "SECONDS"; const isMilliseconds = (maybeMilliseconds) => (0, exports.isTypedDuration)(maybeMilliseconds) && maybeMilliseconds.type === "MILLISECONDS"; const isMinutes = (maybeMinutes) => (0, exports.isTypedDuration)(maybeMinutes) && maybeMinutes.type === "MINUTES"; const isHours = (maybeHours) => (0, exports.isTypedDuration)(maybeHours) && maybeHours.type === "HOURS"; const isDays = (maybeDays) => (0, exports.isTypedDuration)(maybeDays) && maybeDays.type === "DAYS"; const isNumber = (maybeNumber) => typeof maybeNumber === "number"; const newSeconds = (time) => ({ type: "SECONDS", value: time, valueType: "TYPED_DURATION", unit: "s", }); function secondsOf(time) { return isSeconds(time) ? time : isNumber(time) ? newSeconds(time) : isMilliseconds(time) ? secondsOf(time.value / 1000) : isMinutes(time) ? secondsOf(time.value * 60) : isHours(time) ? secondsOf(minutesOf(time)) : isDays(time) ? secondsOf(minutesOf(hoursOf(time))) : time; } exports.secondsOf = secondsOf; const newMilliseconds = (time) => ({ type: "MILLISECONDS", value: time, valueType: "TYPED_DURATION", unit: "ms", }); function millisecondsOf(time) { return isMilliseconds(time) ? time : isNumber(time) ? newMilliseconds(time) : isSeconds(time) ? millisecondsOf(time.value * 1000) : isMinutes(time) ? millisecondsOf(secondsOf(time)) : isHours(time) ? millisecondsOf(secondsOf(minutesOf(time))) : isDays(time) ? millisecondsOf(secondsOf(minutesOf(hoursOf(time)))) : time; } exports.millisecondsOf = millisecondsOf; const newMinutes = (time) => ({ type: "MINUTES", value: time, valueType: "TYPED_DURATION", unit: "m", }); function minutesOf(time) { return isMinutes(time) ? time : isNumber(time) ? newMinutes(time) : isMilliseconds(time) ? minutesOf(secondsOf(time)) : isSeconds(time) ? newMinutes(time.value / 60) : isHours(time) ? newMinutes(time.value * 60) : isDays(time) ? minutesOf(hoursOf(time)) : time; } exports.minutesOf = minutesOf; const newHours = (time) => ({ type: "HOURS", value: time, valueType: "TYPED_DURATION", unit: "h", }); function hoursOf(time) { return isHours(time) ? time : isNumber(time) ? newHours(time) : isMilliseconds(time) ? hoursOf(minutesOf(secondsOf(time))) : isSeconds(time) ? hoursOf(minutesOf(time)) : isMinutes(time) ? hoursOf(time.value / 60) : isDays(time) ? hoursOf(time.value * 24) : time; } exports.hoursOf = hoursOf; const newDays = (time) => ({ type: "DAYS", value: time, valueType: "TYPED_DURATION", unit: "d", }); function daysOf(time) { return isDays(time) ? time : isNumber(time) ? newDays(time) : isMilliseconds(time) ? daysOf(hoursOf(minutesOf(secondsOf(time)))) : isSeconds(time) ? daysOf(hoursOf(minutesOf(time))) : isMinutes(time) ? daysOf(hoursOf(time)) : isHours(time) ? daysOf(time.value / 24) : time; } exports.daysOf = daysOf; const numberFrom = (time) => (0, exports.isTypedDuration)(time) ? time.value : time; exports.numberFrom = numberFrom; const millisecondsFrom = (time) => isNumber(time) ? time : isMilliseconds(time) ? (0, exports.numberFrom)(time) : (0, exports.millisecondsFrom)(millisecondsOf(time)); exports.millisecondsFrom = millisecondsFrom; const secondsFrom = (time) => isNumber(time) ? time : isSeconds(time) ? (0, exports.numberFrom)(time) : (0, exports.secondsFrom)(secondsOf(time)); exports.secondsFrom = secondsFrom; const minutesFrom = (time) => isNumber(time) ? time : isMinutes(time) ? (0, exports.numberFrom)(time) : (0, exports.minutesFrom)(minutesOf(time)); exports.minutesFrom = minutesFrom; const hoursFrom = (time) => isNumber(time) ? time : isHours(time) ? (0, exports.numberFrom)(time) : (0, exports.hoursFrom)(hoursOf(time)); exports.hoursFrom = hoursFrom; const daysFrom = (time) => isNumber(time) ? time : isDays(time) ? (0, exports.numberFrom)(time) : (0, exports.daysFrom)(daysOf(time)); exports.daysFrom = daysFrom;