UNPKG

svelte-ux

Version:

- Increment version in `package.json` and commit as `Version bump to x.y.z` - `npm run publish`

114 lines (113 loc) 4.66 kB
import { parseISO } from 'date-fns'; export var DurationUnits; (function (DurationUnits) { DurationUnits[DurationUnits["Year"] = 0] = "Year"; DurationUnits[DurationUnits["Day"] = 1] = "Day"; DurationUnits[DurationUnits["Hour"] = 2] = "Hour"; DurationUnits[DurationUnits["Minute"] = 3] = "Minute"; DurationUnits[DurationUnits["Second"] = 4] = "Second"; DurationUnits[DurationUnits["Millisecond"] = 5] = "Millisecond"; })(DurationUnits || (DurationUnits = {})); // export enum DurationUnits { // Millisecond = 1, // Second = 1000 * Millisecond, // Minute = 60 * Second, // Hour = 60 * Minute, // Day = 24 * Hour, // Year = 365 * Day, // } export function getDuration(start, end, duration) { var _a, _b, _c, _d, _e, _f, _g; const startDate = typeof start === 'string' ? parseISO(start) : start; const endDate = typeof end === 'string' ? parseISO(end) : end; const differenceInMs = startDate ? Math.abs(Number(endDate || new Date()) - Number(startDate)) : undefined; if (!Number.isFinite(differenceInMs) && duration == null) { return null; } var milliseconds = (_b = (_a = duration === null || duration === void 0 ? void 0 : duration.milliseconds) !== null && _a !== void 0 ? _a : differenceInMs) !== null && _b !== void 0 ? _b : 0; var seconds = (_c = duration === null || duration === void 0 ? void 0 : duration.seconds) !== null && _c !== void 0 ? _c : 0; var minutes = (_d = duration === null || duration === void 0 ? void 0 : duration.minutes) !== null && _d !== void 0 ? _d : 0; var hours = (_e = duration === null || duration === void 0 ? void 0 : duration.hours) !== null && _e !== void 0 ? _e : 0; var days = (_f = duration === null || duration === void 0 ? void 0 : duration.days) !== null && _f !== void 0 ? _f : 0; var years = (_g = duration === null || duration === void 0 ? void 0 : duration.years) !== null && _g !== void 0 ? _g : 0; if (milliseconds >= 1000) { const carrySeconds = (milliseconds - (milliseconds % 1000)) / 1000; seconds += carrySeconds; milliseconds = milliseconds - carrySeconds * 1000; } if (seconds >= 60) { const carryMinutes = (seconds - (seconds % 60)) / 60; minutes += carryMinutes; seconds = seconds - carryMinutes * 60; } if (minutes >= 60) { const carryHours = (minutes - (minutes % 60)) / 60; hours += carryHours; minutes = minutes - carryHours * 60; } if (hours >= 24) { const carryDays = (hours - (hours % 24)) / 24; days += carryDays; hours = hours - carryDays * 24; } if (days >= 365) { const carryYears = (days - (days % 365)) / 365; years += carryYears; days = days - carryYears * 365; } return { milliseconds, seconds, minutes, hours, days, years, }; } // See also: https://stackoverflow.com/questions/19700283/how-to-convert-time-milliseconds-to-hours-min-sec-format-in-javascript/33909506 export function humanizeDuration(config) { const { start, end, minUnits, totalUnits = 99, variant = 'short' } = config; const duration = getDuration(start, end, config.duration); if (duration === null) { return 'unknown'; } var sentenceArr = []; var unitNames = variant === 'short' ? ['y', 'd', 'h', 'm', 's', 'ms'] : ['years', 'days', 'hours', 'minutes', 'seconds', 'milliseconds']; var unitNums = [ duration.years, duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds, ].filter((x, i) => i <= (minUnits || 99)); // Combine unit numbers and names for (var i in unitNums) { if (sentenceArr.length >= totalUnits) { break; } const unitNum = unitNums[i]; let unitName = unitNames[i]; // Hide `0` values unless last unit (and none shown before) if (unitNum !== 0 || (sentenceArr.length === 0 && Number(i) === unitNums.length - 1)) { switch (variant) { case 'short': sentenceArr.push(unitNum + unitName); break; case 'long': if (unitNum === 1) { // Trim off plural `s` unitName = unitName.slice(0, -1); } sentenceArr.push(unitNum + ' ' + unitName); break; } } } const sentence = sentenceArr.join(variant === 'long' ? ' and ' : ' '); return sentence; }