@formatjs/intl-datetimeformat
Version:
Intl.DateTimeFormat polyfill
110 lines (109 loc) • 4.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BasicFormatMatcher = BasicFormatMatcher;
var tslib_1 = require("tslib");
var ecma402_abstract_1 = require("@formatjs/ecma402-abstract");
var utils_1 = require("./utils");
/**
* https://tc39.es/ecma402/#sec-basicformatmatcher
* @param options
* @param formats
*/
function BasicFormatMatcher(options, formats) {
var bestScore = -Infinity;
var bestFormat = formats[0];
(0, ecma402_abstract_1.invariant)(Array.isArray(formats), 'formats should be a list of things');
for (var _i = 0, formats_1 = formats; _i < formats_1.length; _i++) {
var format = formats_1[_i];
var score = 0;
for (var _a = 0, DATE_TIME_PROPS_1 = utils_1.DATE_TIME_PROPS; _a < DATE_TIME_PROPS_1.length; _a++) {
var prop = DATE_TIME_PROPS_1[_a];
var optionsProp = options[prop];
var formatProp = format[prop];
if (optionsProp === undefined && formatProp !== undefined) {
score -= utils_1.additionPenalty;
}
else if (optionsProp !== undefined && formatProp === undefined) {
score -= utils_1.removalPenalty;
}
else if (prop === 'timeZoneName') {
if (optionsProp === 'short' || optionsProp === 'shortGeneric') {
if (formatProp === 'shortOffset') {
score -= utils_1.offsetPenalty;
}
else if (formatProp === 'longOffset') {
score -= utils_1.offsetPenalty + utils_1.shortMorePenalty;
}
else if (optionsProp === 'short' && formatProp === 'long') {
score -= utils_1.shortMorePenalty;
}
else if (optionsProp === 'shortGeneric' &&
formatProp === 'longGeneric') {
score -= utils_1.shortMorePenalty;
}
else if (optionsProp !== formatProp) {
score -= utils_1.removalPenalty;
}
}
else if (optionsProp === 'shortOffset' &&
formatProp === 'longOffset') {
score -= utils_1.shortMorePenalty;
}
else if (optionsProp === 'long' || optionsProp === 'longGeneric') {
if (formatProp === 'longOffset') {
score -= utils_1.offsetPenalty;
}
else if (formatProp === 'shortOffset') {
score -= utils_1.offsetPenalty + utils_1.longLessPenalty;
}
else if (optionsProp === 'long' && formatProp === 'short') {
score -= utils_1.longLessPenalty;
}
else if (optionsProp === 'longGeneric' &&
formatProp === 'shortGeneric') {
score -= utils_1.longLessPenalty;
}
else if (optionsProp !== formatProp) {
score -= utils_1.removalPenalty;
}
}
else if (optionsProp === 'longOffset' &&
formatProp === 'shortOffset') {
score -= utils_1.longLessPenalty;
}
else if (optionsProp !== formatProp) {
score -= utils_1.removalPenalty;
}
}
else if (optionsProp !== formatProp) {
var values = void 0;
if (prop === 'fractionalSecondDigits') {
values = [1, 2, 3];
}
else {
values = ['2-digit', 'numeric', 'narrow', 'short', 'long'];
}
var optionsPropIndex = values.indexOf(optionsProp);
var formatPropIndex = values.indexOf(formatProp);
var delta = Math.max(-2, Math.min(formatPropIndex - optionsPropIndex, 2));
if (delta === 2) {
score -= utils_1.longMorePenalty;
}
else if (delta === 1) {
score -= utils_1.shortMorePenalty;
}
else if (delta === -1) {
score -= utils_1.shortLessPenalty;
}
else if (delta === -2) {
score -= utils_1.longLessPenalty;
}
}
}
if (score > bestScore) {
bestScore = score;
bestFormat = format;
}
}
return tslib_1.__assign({}, bestFormat);
}