@formatjs/intl-relativetimeformat
Version:
Formats JavaScript dates to relative time strings.
44 lines (43 loc) • 1.54 kB
JavaScript
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);
}