javascript-time-ago
Version:
Localized relative date/time formatting
140 lines (117 loc) • 4.25 kB
TypeScript
export type DateInput = Date | number;
export type Locale = string;
// Users can add custom styles via `TimeAgo.addLabels(locale, styleName, labels)`.
export type CustomLabelStyleName = string;
// There're also "legacy" label styles like "time" or "long-time" that have been deprecated.
// Users can still use those by adding them manually via `TimeAgo.addLabels()`.
export type LabelStyleName = 'long' | 'short' | 'narrow' | 'mini' | 'now' | CustomLabelStyleName;
export type Rounding = 'round' | 'floor';
// https://github.com/eemeli/make-plural/blob/master/packages/compiler/src/compile-range.js#L1
export type Count = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';
export type CommonUnit = 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second';
export type Unit = CommonUnit | 'quarter' | 'now';
export type CountLabels = {
[count in Count]?: string;
}
export interface PastAndFutureLabels {
past: string | CountLabels;
future: string | CountLabels;
previous?: string;
current?: string;
next?: string;
}
export interface PastAndFutureNowLabels {
past: string;
future: string;
current: string;
}
export type UnitLabels = string | CountLabels | PastAndFutureLabels
export type Labels = {
year: UnitLabels;
quarter?: UnitLabels;
month: UnitLabels;
week: UnitLabels;
day: UnitLabels;
hour: UnitLabels;
minute: UnitLabels;
second: UnitLabels;
}
export type UnitLabelsMini = string | CountLabels;
export type MiniLabels = {
year: UnitLabelsMini;
quarter?: UnitLabelsMini;
month: UnitLabelsMini;
week: UnitLabelsMini;
day: UnitLabelsMini;
hour: UnitLabelsMini;
minute: UnitLabelsMini;
second: UnitLabelsMini;
}
export type NowLabels = {
now: string | PastAndFutureNowLabels;
}
export type LocaleData = {
locale: Locale;
short: Labels;
narrow: Labels;
long: Labels;
mini?: MiniLabels;
now?: NowLabels;
}
export type FormatStyleName =
'round' |
'round-minute' |
'mini' |
'mini-now' |
'mini-minute' |
'mini-minute-now' |
'twitter' |
'twitter-now' |
'twitter-minute' |
'twitter-minute-now' |
'twitter-first-minute';
export type MinTimeFunction = (date: number, options: {
future: boolean,
getMinTimeForUnit: (unit: Unit, prevUnit?: Unit) => number | void
}) => number;
export interface Step {
formatAs?: Unit;
minTime?: number | MinTimeFunction;
format?(date: DateInput, locale: Locale, options: {
formatAs: (unit: Unit, value: number) => string,
now: number,
future: boolean
}): string | void;
getTimeToNextUpdate?(date: DateInput, options: {
getTimeToNextUpdateForUnit: (unit: Unit) => number | void,
now: number,
future: boolean
}): number | void;
}
export interface Style {
steps: Step[];
labels: LabelStyleName | LabelStyleName[];
round?: Rounding;
}
interface FormatOptions {
now?: number;
future?: boolean;
getTimeToNextUpdate?: boolean;
round?: Rounding;
}
export default class TimeAgo {
constructor(locale: Locale | Locale[], options?: { polyfill?: boolean });
// When `getTimeToNextUpdate: true` option is passed to `.format()`,
// it returns an array containing the formatted time and the "time to next update" interval.
// https://gitlab.com/catamphetamine/javascript-time-ago#update-interval
// Perhaps it's not the best solution, and it would be better to introduce a new function called
// `.formatAndGetTimeToNextUpdate()`. But at this stage that would require a "major" version number update,
// and I wouldn't prefer doing that for such an insignificant change.
format(date: DateInput, style?: FormatStyleName | Style, options?: FormatOptions): FormatOptions['getTimeToNextUpdate'] extends true ? [string, number?] : string;
format<Options extends FormatOptions>(date: DateInput, options: Options): Options['getTimeToNextUpdate'] extends true ? [string, number?] : string;
getLabels(labelsType: LabelStyleName | LabelStyleName[]): Labels;
static addLocale(localeData: LocaleData): void;
static addDefaultLocale(localeData: LocaleData): void;
static setDefaultLocale(locale: Locale): void;
static addLabels(locale: Locale, name: LabelStyleName, labels: Labels): void;
}