@prefecthq/prefect-ui-library
Version:
This library is the Vue and Typescript component library for [Prefect 2](https://github.com/PrefectHQ/prefect) and [Prefect Cloud 2](https://www.prefect.io/cloud/). _The components and utilities in this project are not meant to be used independently_.
140 lines (110 loc) • 4.33 kB
text/typescript
import { parse, isValid, isDate as dateFnsIsDate } from 'date-fns'
import { secondsToApproximateString } from '@/utilities/seconds'
import { dateFunctions, toDate, formatDateInTimezone } from '@/utilities/timezone'
// formats defined by the style guide
// https://www.notion.so/prefect/Formatting-Basics-1d4d83bcb2ba471ead90910aeb5913b2?pvs=4#b79673ff9e9b47f58236c449e5fe764a
export const dateFormat = 'MMM do, yyyy'
export const timeFormat = 'hh:mm a'
export const dateTimeFormat = `${dateFormat} 'at' ${timeFormat}`
export const timeNumericFormat = 'hh:mm:ss a'
export const timeNumericShortFormat = 'hh:mm a'
export const dateNumericFormat = 'yyyy/MM/dd'
export const dateTimeNumericFormat = `${dateNumericFormat} ${timeNumericFormat}`
export const dateTimeNumericShortFormat = `${dateNumericFormat} ${timeNumericShortFormat}`
export {
daysInWeek,
daysInYear,
maxTime,
millisecondsInMinute,
millisecondsInHour,
millisecondsInSecond,
minTime,
minutesInHour,
monthsInQuarter,
monthsInYear,
quartersInYear,
secondsInHour,
secondsInMinute,
secondsInDay,
secondsInWeek,
secondsInYear,
secondsInMonth,
secondsInQuarter
} from 'date-fns/constants'
export const hoursInDay = 24
export function isDate(value: unknown): value is Date {
return dateFnsIsDate(value)
}
export function isInvalidDate(value: unknown): boolean {
return isDate(value) && !isValid(value)
}
export function sortDates(itemA: Date, itemB: Date): number {
return itemA.getTime() - itemB.getTime()
}
export function formatDate(value: Date | string, format = dateFormat): string {
const date = toDate(value)
return formatDateInTimezone(date, format)
}
export function parseDate(value: string, reference: Date = new Date()): Date {
return parse(value, dateFormat, reference)
}
export function formatTime(value: Date): string {
return formatDate(value, timeFormat)
}
export function parseTime(value: string, reference: Date = new Date()): Date {
return parse(value, timeFormat, reference)
}
export function formatDateTime(value: Date): string {
return formatDate(value, dateTimeFormat)
}
export function parseDateTime(value: string, reference: Date = new Date()): Date {
return parse(value, dateTimeFormat, reference)
}
export function formatTimeNumeric(value: Date | string): string {
return formatDate(value, timeNumericFormat)
}
export function parseTimeNumeric(value: string, reference: Date = new Date()): Date {
return parse(value, timeNumericFormat, reference)
}
export function formatTimeShortNumeric(value: Date | string): string {
return formatDate(value, timeNumericShortFormat)
}
export function parseTimeShortNumeric(value: string, reference: Date = new Date()): Date {
return parse(value, timeNumericShortFormat, reference)
}
export function formatDateNumeric(value: Date): string {
return formatDate(value, dateNumericFormat)
}
export function parseDateNumeric(value: string, reference: Date = new Date()): Date {
return parse(value, dateNumericFormat, reference)
}
export function formatDateTimeNumeric(value: Date | string): string {
return formatDate(value, dateTimeNumericFormat)
}
export function parseDateTimeNumeric(value: string, reference: Date = new Date()): Date {
return parse(value, dateTimeNumericFormat, reference)
}
export function formatDateTimeShortNumeric(value: Date | string): string {
return formatDate(value, dateTimeNumericShortFormat)
}
export function parseDateTimeShortNumeric(value: string, reference: Date = new Date()): Date {
return parse(value, dateTimeNumericShortFormat, reference)
}
export function formatDateTimeRelative(value: Date | string, comparedTo: Date | string = new Date()): string {
const valueDate = toDate(value)
const compareDate = toDate(comparedTo)
const seconds = dateFunctions.differenceInSeconds(compareDate, valueDate)
const past = dateFunctions.isBefore(valueDate, compareDate)
const formatted = secondsToApproximateString(Math.abs(seconds))
if (past) {
return `${formatted} ago`
}
return `in ${formatted}`
}
const routeDateFormat = 'yyyy-MM-dd'
export function formatRouteDate(date: Date): string {
return dateFunctions.format(date, routeDateFormat)
}
export function parseRouteDate(value: string): Date {
return dateFunctions.parse(value, routeDateFormat, new Date())
}