UNPKG

@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
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=