@haiilo/ngx-intl
Version:
Standalone Angular pipes using the ECMAScript Internationalization API, which provides language sensitive string comparison, number formatting, and date and time formatting.
88 lines • 14.7 kB
JavaScript
import { Inject, InjectionToken, LOCALE_ID, Optional, Pipe } from '@angular/core';
import * as i0 from "@angular/core";
export const INTL_DATE_OPTIONS = new InjectionToken('IntlDateOptions');
export const INTL_DATE_TIMEZONE = new InjectionToken('IntlDateTimezone');
export const INTL_DATE_PRESET_SHORT = { dateStyle: 'short', timeStyle: 'short' };
export const INTL_DATE_PRESET_MEDIUM = { dateStyle: 'medium', timeStyle: 'medium' };
export const INTL_DATE_PRESET_LONG = { dateStyle: 'long', timeStyle: 'long' };
export const INTL_DATE_PRESET_FULL = { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'long' };
export const INTL_DATE_PRESET_SHORT_DATE = { dateStyle: 'short' };
export const INTL_DATE_PRESET_MEDIUM_DATE = { dateStyle: 'medium' };
export const INTL_DATE_PRESET_LONG_DATE = { dateStyle: 'long' };
export const INTL_DATE_PRESET_FULL_DATE = { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' };
export const INTL_DATE_PRESET_SHORT_TIME = { timeStyle: 'short' };
export const INTL_DATE_PRESET_MEDIUM_TIME = { timeStyle: 'medium' };
export const INTL_DATE_PRESET_LONG_TIME = { timeStyle: 'long' };
export const INTL_DATE_PRESET_FULL_TIME = { hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'long' };
/**
* A pipe that formats a date using the Intl.DateTimeFormat API.
*/
export class IntlDatePipe {
constructor(locale, options, timezone) {
this.locale = locale;
this.options = options;
this.timezone = timezone;
}
transform(value, options, ...locales) {
if (value === null) {
return null;
}
const _locales = this.getLocales(locales);
const _options = this.getOptions(options);
const formatValue = typeof value === 'string' ? new Date(value) : value;
return new Intl.DateTimeFormat(_locales, _options).format(formatValue);
}
getLocales(locales) {
return [...locales, this.locale];
}
getOptions(options) {
const presetStr = typeof options === 'string';
const presetKey = !presetStr
? options?.preset || this.options?.defaultPreset || IntlDatePipe.DEFAULT_OPTIONS.defaultPreset
: options;
const preset = presetKey
? (this.options?.presets?.[presetKey] || IntlDatePipe.DEFAULT_OPTIONS.presets?.[presetKey])
: undefined;
const timezone = this.timezone ? { timeZone: this.timezone } : {};
return { ...timezone, ...preset, ...(!presetStr ? options : undefined) };
}
}
IntlDatePipe.DEFAULT_OPTIONS = {
presets: {
short: INTL_DATE_PRESET_SHORT,
medium: INTL_DATE_PRESET_MEDIUM,
long: INTL_DATE_PRESET_LONG,
full: INTL_DATE_PRESET_FULL,
shortDate: INTL_DATE_PRESET_SHORT_DATE,
mediumDate: INTL_DATE_PRESET_MEDIUM_DATE,
longDate: INTL_DATE_PRESET_LONG_DATE,
fullDate: INTL_DATE_PRESET_FULL_DATE,
shortTime: INTL_DATE_PRESET_SHORT_TIME,
mediumTime: INTL_DATE_PRESET_MEDIUM_TIME,
longTime: INTL_DATE_PRESET_LONG_TIME,
fullTime: INTL_DATE_PRESET_FULL_TIME
}
};
IntlDatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IntlDatePipe, deps: [{ token: LOCALE_ID }, { token: INTL_DATE_OPTIONS, optional: true }, { token: INTL_DATE_TIMEZONE, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
IntlDatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: IntlDatePipe, isStandalone: true, name: "intlDate" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IntlDatePipe, decorators: [{
type: Pipe,
args: [{
name: 'intlDate',
standalone: true
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [LOCALE_ID]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [INTL_DATE_OPTIONS]
}, {
type: Optional
}] }, { type: undefined, decorators: [{
type: Inject,
args: [INTL_DATE_TIMEZONE]
}, {
type: Optional
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50bC1kYXRlLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW50bC9zcmMvbGliL2ludGwtZGF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFnQmpHLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUM1QixJQUFJLGNBQWMsQ0FBd0IsaUJBQWlCLENBQUMsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FDN0IsSUFBSSxjQUFjLENBQVMsa0JBQWtCLENBQUMsQ0FBQztBQUVqRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FDakMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM3QyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FDbEMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FDaEMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FDaEMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuSixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FDdEMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDekIsTUFBTSxDQUFD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T0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBQyxDQUFDO0lBQ3pFLENBQUM7O0FBaER1Qiw0QkFBZSxHQUEwQjtJQUMvRCxPQUFPLEVBQUU7UUFDUCxLQUFLLEVBQUUsc0JBQXNCO1FBQzdCLE1BQU0sRUFBRSx1QkFBdUI7UUFDL0IsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLFNBQVMsRUFBRSwyQkFBMkI7UUFDdEMsVUFBVSxFQUFFLDRCQUE0QjtRQUN4QyxRQUFRLEVBQUUsMEJBQTBCO1FBQ3BDLFFBQVEsRUFBRSwwQkFBMEI7UUFDcEMsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxVQUFVLEVBQUUsNEJBQTRCO1FBQ3hDLFFBQVEsRUFBRSwwQkFBMEI7UUFDcEMsUUFBUSxFQUFFLDBCQUEwQjtLQUNyQztDQUNELENBQUE7eUdBaEJTLFlBQVksa0JBbUJiLFNBQVMsYUFDVCxpQkFBaUIsNkJBQ2pCLGtCQUFrQjt1R0FyQmpCLFlBQVk7MkZBQVosWUFBWTtrQkFKeEIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsVUFBVTtvQkFDaEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFvQkksTUFBTTsyQkFBQyxTQUFTOzswQkFDaEIsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUFHLFFBQVE7OzBCQUNuQyxNQUFNOzJCQUFDLGtCQUFrQjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0aW9uVG9rZW4sIExPQ0FMRV9JRCwgT3B0aW9uYWwsIFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqIEEgcHJlY29uZmlndXJlZCBvcHRpb24gcHJlc2V0IGZvciB0aGUgSW50bERhdGVQaXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRsRGF0ZU9wdGlvbnMgZXh0ZW5kcyBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyB7fVxuXG4vKiogR2xvYmFsIG9wdGlvbnMgYW5kIHByZXNldHMgZm9yIHRoZSBJbnRsRGF0ZVBpcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGxEYXRlR2xvYmFsT3B0aW9ucyB7XG4gIHByZXNldHM/OiB7IFtrZXk6IHN0cmluZ106IEludGxEYXRlT3B0aW9ucyB9O1xuICBkZWZhdWx0UHJlc2V0Pzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgYSB0cmFuc2Zvcm0gY2FsbCBvZiB0aGUgSW50bERhdGVQaXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRsRGF0ZUxvY2FsT3B0aW9ucyBleHRlbmRzIEludGxEYXRlT3B0aW9ucyB7XG4gIHByZXNldD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IElOVExfREFURV9PUFRJT05TID1cbiAgbmV3IEluamVjdGlvblRva2VuPEludGxEYXRlR2xvYmFsT3B0aW9ucz4oJ0ludGxEYXRlT3B0aW9ucycpO1xuXG5leHBvcnQgY29uc3QgSU5UTF9EQVRFX1RJTUVaT05FID1cbiAgbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ0ludGxEYXRlVGltZXpvbmUnKTtcblxuZXhwb3J0IGNvbnN0IElOVExfREFURV9QUkVTRVRfU0hPUlQ6IEludGxEYXRlT3B0aW9ucyA9XG4gIHsgZGF0ZVN0eWxlOiAnc2hvcnQnLCB0aW1lU3R5bGU6ICdzaG9ydCcgfTtcbmV4cG9ydCBjb25zdCBJTlRMX0RBVEVfUFJFU0VUX01FRElVTTogSW50bERhdGVPcHRpb25zID1cbiAgeyBkYXRlU3R5bGU6ICdtZWRpdW0nLCB0aW1lU3R5bGU6ICdtZWRpdW0nIH07XG5leHBvcnQgY29uc3QgSU5UTF9EQVRFX1BSRVNFVF9MT05HOiBJbnRsRGF0ZU9wdGlvbnMgPVxuICB7IGRhdGVTdHlsZTogJ2xvbmcnLCB0aW1lU3R5bGU6ICdsb25nJyB9O1xuZXhwb3J0IGNvbnN0IElOVExfREFURV9QUkVTRVRfRlVMTDogSW50bERhdGVPcHRpb25zID1cbiAgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnLCB3ZWVrZGF5OiAnbG9uZycsIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYycsIHNlY29uZDogJ251bWVyaWMnLCB0aW1lWm9uZU5hbWU6ICdsb25nJyB9O1xuZXhwb3J0IGNvbnN0IElOVExfREFURV9QUkVTRVRfU0hPUlRfREFURTogSW50bERhdGVPcHRpb25zID1cbiAgeyBkYXRlU3R5bGU6ICdzaG9ydCcgfTtcbmV4cG9ydCBjb25zdCBJTlRMX0RBVEVfUFJFU0VUX01FRElVTV9EQVRFOiBJbnRsRGF0ZU9wdGlvbnMgPVxuICB7IGRhdGVTdHlsZTogJ21lZGl1bScgfTtcbmV4cG9ydCBjb25zdCBJTlRMX0RBVEVfUFJFU0VUX0xPTkdfREFURTogSW50bERhdGVPcHRpb25zID1cbiAgeyBkYXRlU3R5bGU6ICdsb25nJyB9O1xuZXhwb3J0IGNvbnN0IElOVExfREFURV9QUkVTRVRfRlVMTF9EQVRFOiBJbnRsRGF0ZU9wdGlvbnMgPVxuICB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycsIHdlZWtkYXk6ICdsb25nJyB9O1xuZXhwb3J0IGNvbnN0IElOVExfREFURV9QUkVTRVRfU0hPUlRfVElNRTogSW50bERhdGVPcHRpb25zID1cbiAgeyB0aW1lU3R5bGU6ICdzaG9ydCcgfTtcbmV4cG9ydCBjb25zdCBJTlRMX0RBVEVfUFJFU0VUX01FRElVTV9USU1FOiBJbnRsRGF0ZU9wdGlvbnMgPVxuICB7IHRpbWVTdHlsZTogJ21lZGl1bScgfTtcbmV4cG9ydCBjb25zdCBJTlRMX0RBVEVfUFJFU0VUX0xPTkdfVElNRTogSW50bERhdGVPcHRpb25zID1cbiAgeyB0aW1lU3R5bGU6ICdsb25nJyB9O1xuZXhwb3J0IGNvbnN0IElOVExfREFURV9QUkVTRVRfRlVMTF9USU1FOiBJbnRsRGF0ZU9wdGlvbnMgPVxuICB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYycsIHNlY29uZDogJ251bWVyaWMnLCB0aW1lWm9uZU5hbWU6ICdsb25nJyB9O1xuXG4vKipcbiAqIEEgcGlwZSB0aGF0IGZvcm1hdHMgYSBkYXRlIHVzaW5nIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IEFQSS5cbiAqL1xuQFBpcGUoe1xuICBuYW1lOiAnaW50bERhdGUnLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEludGxEYXRlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX09QVElPTlM6IEludGxEYXRlR2xvYmFsT3B0aW9ucyA9IHtcbiAgICBwcmVzZXRzOiB7XG4gICAgICBzaG9ydDogSU5UTF9EQVRFX1BSRVNFVF9TSE9SVCxcbiAgICAgIG1lZGl1bTogSU5UTF9EQVRFX1BSRVNFVF9NRURJVU0sXG4gICAgICBsb25nOiBJTlRMX0RBVEVfUFJFU0VUX0xPTkcsXG4gICAgICBmdWxsOiBJTlRMX0RBVEVfUFJFU0VUX0ZVTEwsXG4gICAgICBzaG9ydERhdGU6IElOVExfREFURV9QUkVTRVRfU0hPUlRfREFURSxcbiAgICAgIG1lZGl1bURhdGU6IElOVExfREFURV9QUkVTRVRfTUVESVVNX0RBVEUsXG4gICAgICBsb25nRGF0ZTogSU5UTF9EQVRFX1BSRVNFVF9MT05HX0RBVEUsXG4gICAgICBmdWxsRGF0ZTogSU5UTF9EQVRFX1BSRVNFVF9GVUxMX0RBVEUsXG4gICAgICBzaG9ydFRpbWU6IElOVExfREFURV9QUkVTRVRfU0hPUlRfVElNRSxcbiAgICAgIG1lZGl1bVRpbWU6IElOVExfREFURV9QUkVTRVRfTUVESVVNX1RJTUUsXG4gICAgICBsb25nVGltZTogSU5UTF9EQVRFX1BSRVNFVF9MT05HX1RJTUUsXG4gICAgICBmdWxsVGltZTogSU5UTF9EQVRFX1BSRVNFVF9GVUxMX1RJTUVcbiAgICB9XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxlOiBzdHJpbmcsXG4gICAgQEluamVjdChJTlRMX0RBVEVfT1BUSU9OUykgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbnRsRGF0ZUdsb2JhbE9wdGlvbnMgfCBudWxsLFxuICAgIEBJbmplY3QoSU5UTF9EQVRFX1RJTUVaT05FKSBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRpbWV6b25lOiBzdHJpbmcgfCBudWxsXG4gICkge31cblxuICB0cmFuc2Zvcm0odmFsdWU/OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgb3B0aW9ucz86IHN0cmluZyB8IEludGxEYXRlTG9jYWxPcHRpb25zLCAuLi5sb2NhbGVzOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgX2xvY2FsZXMgPSB0aGlzLmdldExvY2FsZXMobG9jYWxlcyk7XG4gICAgY29uc3QgX29wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgZm9ybWF0VmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUodmFsdWUpIDogdmFsdWU7XG4gICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KF9sb2NhbGVzLCBfb3B0aW9ucykuZm9ybWF0KGZvcm1hdFZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9jYWxlcyhsb2NhbGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLmxvY2FsZXMsIHRoaXMubG9jYWxlXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3B0aW9ucyhvcHRpb25zPzogc3RyaW5nIHwgSW50bERhdGVMb2NhbE9wdGlvbnMpOiBJbnRsRGF0ZU9wdGlvbnMge1xuICAgIGNvbnN0IHByZXNldFN0ciA9IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJztcbiAgICBjb25zdCBwcmVzZXRLZXkgPSAhcHJlc2V0U3RyXG4gICAgICA/IG9wdGlvbnM/LnByZXNldCB8fCB0aGlzLm9wdGlvbnM/LmRlZmF1bHRQcmVzZXQgfHwgSW50bERhdGVQaXBlLkRFRkFVTFRfT1BUSU9OUy5kZWZhdWx0UHJlc2V0XG4gICAgICA6IG9wdGlvbnM7XG4gICAgY29uc3QgcHJlc2V0ID0gcHJlc2V0S2V5XG4gICAgICA/ICh0aGlzLm9wdGlvbnM/LnByZXNldHM/LltwcmVzZXRLZXldIHx8IEludGxEYXRlUGlwZS5ERUZBVUxUX09QVElPTlMucHJlc2V0cz8uW3ByZXNldEtleV0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0aW1lem9uZSA9IHRoaXMudGltZXpvbmUgPyB7IHRpbWVab25lOiB0aGlzLnRpbWV6b25lIH0gOiB7fTtcbiAgICByZXR1cm4gey4uLnRpbWV6b25lLCAuLi5wcmVzZXQsIC4uLighcHJlc2V0U3RyID8gb3B0aW9ucyA6IHVuZGVmaW5lZCl9O1xuICB9XG59XG4iXX0=