@formatjs/ecma402-abstract
Version:
A collection of implementation for ECMAScript abstract operations
145 lines (144 loc) • 4.58 kB
TypeScript
export type Formats = Pick<Intl.DateTimeFormatOptions, "weekday" | "era" | "year" | "month" | "day" | "dayPeriod" | "hour" | "minute" | "second" | "timeZoneName"> & {
fractionalSecondDigits?: 1 | 2 | 3;
hour12?: boolean;
pattern: string;
pattern12: string;
skeleton: string;
rawPattern: string;
rangePatterns: Record<TABLE_2 | "default", RangePatterns>;
rangePatterns12: Record<TABLE_2 | "default", RangePatterns>;
};
export interface IntlDateTimeFormatInternal {
locale: string;
dataLocale: string;
calendar?: string;
dateStyle?: "full" | "long" | "medium" | "short";
timeStyle?: "full" | "long" | "medium" | "short";
weekday: "narrow" | "short" | "long";
era: "narrow" | "short" | "long";
year: "2-digit" | "numeric";
month: "2-digit" | "numeric" | "narrow" | "short" | "long";
day: "2-digit" | "numeric";
dayPeriod: "narrow" | "short" | "long";
hour: "2-digit" | "numeric";
minute: "2-digit" | "numeric";
second: "2-digit" | "numeric";
timeZoneName: "short" | "long" | "shortOffset" | "longOffset" | "shortGeneric" | "longGeneric";
fractionalSecondDigits?: 1 | 2 | 3;
hourCycle: string;
numberingSystem: string;
timeZone: string;
pattern: string;
format: Formats;
rangePatterns: Record<TABLE_2 | "default", RangePatterns>;
boundFormat?: Intl.DateTimeFormat["format"];
}
export interface RangePatternPart<T extends RangePatternType = RangePatternType> {
source: T;
pattern: string;
}
export type RangePatterns = Pick<Intl.DateTimeFormatOptions, "weekday" | "era" | "year" | "month" | "day" | "hour" | "minute" | "second" | "timeZoneName"> & {
hour12?: boolean;
patternParts: Array<RangePatternPart>;
};
export declare enum RangePatternType {
startRange = "startRange",
shared = "shared",
endRange = "endRange"
}
export type TABLE_6 = "weekday" | "era" | "year" | "month" | "day" | "dayPeriod" | "hour" | "minute" | "second" | "fractionalSecondDigits" | "timeZoneName";
export type TABLE_2 = "era" | "year" | "month" | "day" | "dayPeriod" | "ampm" | "hour" | "minute" | "second" | "fractionalSecondDigits";
export type TimeZoneNameData = Record<string, {
long?: [string, string];
short?: [string, string];
}>;
export interface EraData {
BC: string;
AD: string;
}
export interface DateTimeFormatLocaleInternalData {
am: string;
pm: string;
weekday: {
narrow: string[];
long: string[];
short: string[];
};
era: {
narrow: EraData;
long: EraData;
short: EraData;
};
month: {
narrow: string[];
long: string[];
short: string[];
};
/**
* Stand-alone month names (used when month appears without other date fields)
* Falls back to format month if not provided
*/
monthStandalone?: {
narrow: string[];
long: string[];
short: string[];
};
timeZoneName: TimeZoneNameData;
/**
* So we can construct GMT+08:00
*/
gmtFormat: string;
/**
* So we can construct GMT+08:00
*/
hourFormat: string;
hourCycle: string;
dateFormat: {
full: Formats;
long: Formats;
medium: Formats;
short: Formats;
};
timeFormat: {
full: Formats;
long: Formats;
medium: Formats;
short: Formats;
};
dateTimeFormat: {
full: string;
long: string;
medium: string;
short: string;
};
/**
* Interval format fallback pattern from CLDR (e.g., "{0} – {1}" for English, "{0}~{1}" for Japanese)
* Used when no specific interval format is available for a given skeleton
*/
intervalFormatFallback: string;
formats: Record<string, Formats[]>;
nu: string[];
hc: string[];
ca: string[];
}
export type IntervalFormatsData = {
intervalFormatFallback: string;
} & Record<string, Record<string, string>>;
export interface DateTimeFormat extends Omit<Intl.DateTimeFormat, "resolvedOptions" | "formatRange" | "formatRangeToParts" | "formatToParts"> {
resolvedOptions(): ResolvedDateTimeFormatOptions;
formatToParts(date?: Date | number): IntlDateTimeFormatPart[];
formatRange(startDate: number | Date, endDate: number | Date): string;
formatRangeToParts(startDate: number | Date, endDate: number | Date): IntlDateTimeFormatPart[];
}
export interface ResolvedDateTimeFormatOptions extends Intl.ResolvedDateTimeFormatOptions {
dateStyle?: "full" | "long" | "medium" | "short";
timeStyle?: "full" | "long" | "medium" | "short";
numberingSystem: string;
}
export type UnpackedZoneData = [number, string, number, boolean];
export type IntlDateTimeFormatPartType = Intl.DateTimeFormatPartTypes | "ampm" | "relatedYear" | "yearName" | "unknown" | "fractionalSecondDigits";
export interface IntlDateTimeFormatPart {
type: IntlDateTimeFormatPartType;
value: string | undefined;
source?: RangePatternType;
}