@formatjs/intl-datetimeformat
Version:
Intl.DateTimeFormat polyfill
304 lines (303 loc) • 14.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DateTimeFormat = void 0;
var tslib_1 = require("tslib");
var ecma402_abstract_1 = require("@formatjs/ecma402-abstract");
var decimal_js_1 = tslib_1.__importDefault(require("decimal.js"));
var FormatDateTime_1 = require("./abstract/FormatDateTime");
var FormatDateTimeRange_1 = require("./abstract/FormatDateTimeRange");
var FormatDateTimeRangeToParts_1 = require("./abstract/FormatDateTimeRangeToParts");
var FormatDateTimeToParts_1 = require("./abstract/FormatDateTimeToParts");
var InitializeDateTimeFormat_1 = require("./abstract/InitializeDateTimeFormat");
var skeleton_1 = require("./abstract/skeleton");
var utils_1 = require("./abstract/utils");
var links_1 = tslib_1.__importDefault(require("./data/links"));
var get_internal_slots_1 = tslib_1.__importDefault(require("./get_internal_slots"));
var packer_1 = require("./packer");
var UPPERCASED_LINKS = Object.keys(links_1.default).reduce(function (all, l) {
all[l.toUpperCase()] = links_1.default[l];
return all;
}, {});
var RESOLVED_OPTIONS_KEYS = [
'locale',
'calendar',
'numberingSystem',
'dateStyle',
'timeStyle',
'timeZone',
'hourCycle',
'weekday',
'era',
'year',
'month',
'day',
'hour',
'minute',
'second',
'timeZoneName',
];
var formatDescriptor = {
enumerable: false,
configurable: true,
get: function () {
if (typeof this !== 'object' ||
!(0, ecma402_abstract_1.OrdinaryHasInstance)(exports.DateTimeFormat, this)) {
throw TypeError('Intl.DateTimeFormat format property accessor called on incompatible receiver');
}
var internalSlots = (0, get_internal_slots_1.default)(this);
// eslint-disable-next-line @typescript-eslint/no-this-alias
var dtf = this;
var boundFormat = internalSlots.boundFormat;
if (boundFormat === undefined) {
// https://tc39.es/proposal-unified-intl-numberformat/section11/numberformat_diff_out.html#sec-number-format-functions
boundFormat = function (date) {
var x;
if (date === undefined) {
x = new decimal_js_1.default(Date.now());
}
else {
x = (0, ecma402_abstract_1.ToNumber)(date);
}
return (0, FormatDateTime_1.FormatDateTime)(dtf, x, {
getInternalSlots: get_internal_slots_1.default,
localeData: exports.DateTimeFormat.localeData,
tzData: exports.DateTimeFormat.tzData,
getDefaultTimeZone: exports.DateTimeFormat.getDefaultTimeZone,
});
};
try {
// https://github.com/tc39/test262/blob/master/test/intl402/NumberFormat/prototype/format/format-function-name.js
Object.defineProperty(boundFormat, 'name', {
configurable: true,
enumerable: false,
writable: false,
value: '',
});
}
catch (e) {
// In older browser (e.g Chrome 36 like polyfill-fastly.io)
// TypeError: Cannot redefine property: name
}
internalSlots.boundFormat = boundFormat;
}
return boundFormat;
},
};
try {
// https://github.com/tc39/test262/blob/master/test/intl402/NumberFormat/prototype/format/name.js
Object.defineProperty(formatDescriptor.get, 'name', {
configurable: true,
enumerable: false,
writable: false,
value: 'get format',
});
}
catch (e) {
// In older browser (e.g Chrome 36 like polyfill-fastly.io)
// TypeError: Cannot redefine property: name
}
exports.DateTimeFormat = function (locales, options) {
// Cannot use `new.target` bc of IE11 & TS transpiles it to something else
if (!this || !(0, ecma402_abstract_1.OrdinaryHasInstance)(exports.DateTimeFormat, this)) {
return new exports.DateTimeFormat(locales, options);
}
(0, InitializeDateTimeFormat_1.InitializeDateTimeFormat)(this, locales, options, {
tzData: exports.DateTimeFormat.tzData,
uppercaseLinks: UPPERCASED_LINKS,
availableLocales: exports.DateTimeFormat.availableLocales,
relevantExtensionKeys: exports.DateTimeFormat.relevantExtensionKeys,
getDefaultLocale: exports.DateTimeFormat.getDefaultLocale,
getDefaultTimeZone: exports.DateTimeFormat.getDefaultTimeZone,
getInternalSlots: get_internal_slots_1.default,
localeData: exports.DateTimeFormat.localeData,
});
/** IMPL START */
var internalSlots = (0, get_internal_slots_1.default)(this);
var dataLocale = internalSlots.dataLocale;
var dataLocaleData = exports.DateTimeFormat.localeData[dataLocale];
(0, ecma402_abstract_1.invariant)(dataLocaleData !== undefined, "Cannot load locale-dependent data for ".concat(dataLocale, "."));
/** IMPL END */
};
// Static properties
(0, ecma402_abstract_1.defineProperty)(exports.DateTimeFormat, 'supportedLocalesOf', {
value: function supportedLocalesOf(locales, options) {
return (0, ecma402_abstract_1.SupportedLocales)(exports.DateTimeFormat.availableLocales, (0, ecma402_abstract_1.CanonicalizeLocaleList)(locales), options);
},
});
(0, ecma402_abstract_1.defineProperty)(exports.DateTimeFormat.prototype, 'resolvedOptions', {
value: function resolvedOptions() {
if (typeof this !== 'object' ||
!(0, ecma402_abstract_1.OrdinaryHasInstance)(exports.DateTimeFormat, this)) {
throw TypeError('Method Intl.DateTimeFormat.prototype.resolvedOptions called on incompatible receiver');
}
var internalSlots = (0, get_internal_slots_1.default)(this);
var ro = {};
for (var _i = 0, RESOLVED_OPTIONS_KEYS_1 = RESOLVED_OPTIONS_KEYS; _i < RESOLVED_OPTIONS_KEYS_1.length; _i++) {
var key = RESOLVED_OPTIONS_KEYS_1[_i];
var value = internalSlots[key];
if (key === 'hourCycle') {
var hour12 = value === 'h11' || value === 'h12'
? true
: value === 'h23' || value === 'h24'
? false
: undefined;
if (hour12 !== undefined) {
ro.hour12 = hour12;
}
}
if (utils_1.DATE_TIME_PROPS.indexOf(key) > -1) {
if (internalSlots.dateStyle !== undefined ||
internalSlots.timeStyle !== undefined) {
value = undefined;
}
}
if (value !== undefined) {
ro[key] = value;
}
}
return ro;
},
});
(0, ecma402_abstract_1.defineProperty)(exports.DateTimeFormat.prototype, 'formatToParts', {
value: function formatToParts(date) {
var x;
if (date === undefined) {
x = new decimal_js_1.default(Date.now());
}
else {
x = (0, ecma402_abstract_1.ToNumber)(date);
}
return (0, FormatDateTimeToParts_1.FormatDateTimeToParts)(this, x, {
getInternalSlots: get_internal_slots_1.default,
localeData: exports.DateTimeFormat.localeData,
tzData: exports.DateTimeFormat.tzData,
getDefaultTimeZone: exports.DateTimeFormat.getDefaultTimeZone,
});
},
});
(0, ecma402_abstract_1.defineProperty)(exports.DateTimeFormat.prototype, 'formatRangeToParts', {
value: function formatRangeToParts(startDate, endDate) {
var dtf = this;
(0, ecma402_abstract_1.invariant)(typeof dtf === 'object', 'receiver is not an object', TypeError);
(0, ecma402_abstract_1.invariant)(startDate !== undefined && endDate !== undefined, 'startDate/endDate cannot be undefined', TypeError);
return (0, FormatDateTimeRangeToParts_1.FormatDateTimeRangeToParts)(dtf, (0, ecma402_abstract_1.ToNumber)(startDate), (0, ecma402_abstract_1.ToNumber)(endDate), {
getInternalSlots: get_internal_slots_1.default,
localeData: exports.DateTimeFormat.localeData,
tzData: exports.DateTimeFormat.tzData,
getDefaultTimeZone: exports.DateTimeFormat.getDefaultTimeZone,
});
},
});
(0, ecma402_abstract_1.defineProperty)(exports.DateTimeFormat.prototype, 'formatRange', {
value: function formatRange(startDate, endDate) {
var dtf = this;
(0, ecma402_abstract_1.invariant)(typeof dtf === 'object', 'receiver is not an object', TypeError);
(0, ecma402_abstract_1.invariant)(startDate !== undefined && endDate !== undefined, 'startDate/endDate cannot be undefined', TypeError);
return (0, FormatDateTimeRange_1.FormatDateTimeRange)(dtf, (0, ecma402_abstract_1.ToNumber)(startDate), (0, ecma402_abstract_1.ToNumber)(endDate), {
getInternalSlots: get_internal_slots_1.default,
localeData: exports.DateTimeFormat.localeData,
tzData: exports.DateTimeFormat.tzData,
getDefaultTimeZone: exports.DateTimeFormat.getDefaultTimeZone,
});
},
});
var DEFAULT_TIMEZONE = 'UTC';
exports.DateTimeFormat.__setDefaultTimeZone = function (timeZone) {
if (timeZone !== undefined) {
timeZone = String(timeZone);
if (!(0, ecma402_abstract_1.IsValidTimeZoneName)(timeZone, {
zoneNamesFromData: Object.keys(exports.DateTimeFormat.tzData),
uppercaseLinks: UPPERCASED_LINKS,
})) {
throw new RangeError('Invalid timeZoneName');
}
timeZone = (0, ecma402_abstract_1.CanonicalizeTimeZoneName)(timeZone, {
zoneNames: Object.keys(exports.DateTimeFormat.tzData),
uppercaseLinks: UPPERCASED_LINKS,
});
}
else {
timeZone = DEFAULT_TIMEZONE;
}
exports.DateTimeFormat.__defaultTimeZone = timeZone;
};
exports.DateTimeFormat.relevantExtensionKeys = ['nu', 'ca', 'hc'];
exports.DateTimeFormat.__defaultTimeZone = DEFAULT_TIMEZONE;
exports.DateTimeFormat.getDefaultTimeZone = function () { return exports.DateTimeFormat.__defaultTimeZone; };
exports.DateTimeFormat.__addLocaleData = function __addLocaleData() {
var data = [];
for (var _i = 0; _i < arguments.length; _i++) {
data[_i] = arguments[_i];
}
var _loop_1 = function (d, locale) {
var dateFormat = d.dateFormat, timeFormat = d.timeFormat, dateTimeFormat = d.dateTimeFormat, formats = d.formats, intervalFormats = d.intervalFormats, rawData = tslib_1.__rest(d, ["dateFormat", "timeFormat", "dateTimeFormat", "formats", "intervalFormats"]);
var processedData = tslib_1.__assign(tslib_1.__assign({}, rawData), { dateFormat: {
full: (0, skeleton_1.parseDateTimeSkeleton)(dateFormat.full),
long: (0, skeleton_1.parseDateTimeSkeleton)(dateFormat.long),
medium: (0, skeleton_1.parseDateTimeSkeleton)(dateFormat.medium),
short: (0, skeleton_1.parseDateTimeSkeleton)(dateFormat.short),
}, timeFormat: {
full: (0, skeleton_1.parseDateTimeSkeleton)(timeFormat.full),
long: (0, skeleton_1.parseDateTimeSkeleton)(timeFormat.long),
medium: (0, skeleton_1.parseDateTimeSkeleton)(timeFormat.medium),
short: (0, skeleton_1.parseDateTimeSkeleton)(timeFormat.short),
}, dateTimeFormat: {
full: (0, skeleton_1.parseDateTimeSkeleton)(dateTimeFormat.full).pattern,
long: (0, skeleton_1.parseDateTimeSkeleton)(dateTimeFormat.long).pattern,
medium: (0, skeleton_1.parseDateTimeSkeleton)(dateTimeFormat.medium).pattern,
short: (0, skeleton_1.parseDateTimeSkeleton)(dateTimeFormat.short).pattern,
}, formats: {} });
var _loop_2 = function (calendar) {
processedData.formats[calendar] = Object.keys(formats[calendar]).map(function (skeleton) {
return (0, skeleton_1.parseDateTimeSkeleton)(skeleton, formats[calendar][skeleton], intervalFormats[skeleton], intervalFormats.intervalFormatFallback);
});
};
for (var calendar in formats) {
_loop_2(calendar);
}
var minimizedLocale = new Intl.Locale(locale)
.minimize()
.toString();
exports.DateTimeFormat.localeData[locale] = exports.DateTimeFormat.localeData[minimizedLocale] = processedData;
exports.DateTimeFormat.availableLocales.add(locale);
exports.DateTimeFormat.availableLocales.add(minimizedLocale);
if (!exports.DateTimeFormat.__defaultLocale) {
exports.DateTimeFormat.__defaultLocale = minimizedLocale;
}
};
for (var _a = 0, data_1 = data; _a < data_1.length; _a++) {
var _b = data_1[_a], d = _b.data, locale = _b.locale;
_loop_1(d, locale);
}
};
Object.defineProperty(exports.DateTimeFormat.prototype, 'format', formatDescriptor);
exports.DateTimeFormat.__defaultLocale = '';
exports.DateTimeFormat.localeData = {};
exports.DateTimeFormat.availableLocales = new Set();
exports.DateTimeFormat.getDefaultLocale = function () {
return exports.DateTimeFormat.__defaultLocale;
};
exports.DateTimeFormat.polyfilled = true;
exports.DateTimeFormat.tzData = {};
exports.DateTimeFormat.__addTZData = function (d) {
exports.DateTimeFormat.tzData = (0, packer_1.unpack)(d);
};
try {
if (typeof Symbol !== 'undefined') {
Object.defineProperty(exports.DateTimeFormat.prototype, Symbol.toStringTag, {
value: 'Intl.DateTimeFormat',
writable: false,
enumerable: false,
configurable: true,
});
}
Object.defineProperty(exports.DateTimeFormat.prototype.constructor, 'length', {
value: 1,
writable: false,
enumerable: false,
configurable: true,
});
}
catch (e) {
// Meta fix so we're test262-compliant, not important
}