UNPKG

@formatjs/intl-relativetimeformat

Version:

Formats JavaScript dates to relative time strings.

44 lines (43 loc) 1.54 kB
import { invariant, SameValue, ToString, Type } from "@formatjs/ecma402-abstract"; import { SingularRelativeTimeUnit } from "./SingularRelativeTimeUnit.js"; import { MakePartsList } from "./MakePartsList.js"; export function PartitionRelativeTimePattern(rtf, value, unit, { getInternalSlots }) { invariant(Type(value) === "Number", `value must be number, instead got ${typeof value}`, TypeError); invariant(Type(unit) === "String", `unit must be number, instead got ${typeof value}`, TypeError); if (isNaN(value) || !isFinite(value)) { throw new RangeError(`Invalid value ${value}`); } const resolvedUnit = SingularRelativeTimeUnit(unit); const { fields, style, numeric, pluralRules, numberFormat } = getInternalSlots(rtf); let entry = resolvedUnit; if (style === "short") { entry = `${resolvedUnit}-short`; } else if (style === "narrow") { entry = `${resolvedUnit}-narrow`; } if (!(entry in fields)) { entry = resolvedUnit; } const patterns = fields[entry]; if (numeric === "auto") { if (ToString(value) in patterns) { return [{ type: "literal", value: patterns[ToString(value)] }]; } } let tl = "future"; if (SameValue(value, -0) || value < 0) { tl = "past"; } const po = patterns[tl]; const fv = typeof numberFormat.formatToParts === "function" ? numberFormat.formatToParts(Math.abs(value)) : [{ type: "literal", value: numberFormat.format(Math.abs(value)), unit }]; const pr = pluralRules.select(value); const pattern = po[pr]; return MakePartsList(pattern, resolvedUnit, fv); }