"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InitializeNumberFormat = void 0; var CanonicalizeLocaleList_1 = require("../CanonicalizeLocaleList"); var GetOption_1 = require("../GetOption"); var intl_localematcher_1 = require("@formatjs/intl-localematcher"); var SetNumberFormatUnitOptions_1 = require("./SetNumberFormatUnitOptions"); var CurrencyDigits_1 = require("./CurrencyDigits"); var SetNumberFormatDigitOptions_1 = require("./SetNumberFormatDigitOptions"); var utils_1 = require("../utils"); var CoerceOptionsToObject_1 = require("../CoerceOptionsToObject"); var GetNumberOption_1 = require("../GetNumberOption"); var GetStringOrBooleanOption_1 = require("../GetStringOrBooleanOption"); var VALID_ROUND_INCREMENT_VALUES = [ 1, 2, 5, 10, 20, 25, 50, 100, 200, 250, 500, 1000, 2000, ]; /** * https://tc39.es/ecma402/#sec-initializenumberformat */ function InitializeNumberFormat(nf, locales, opts, _a) { var getInternalSlots = _a.getInternalSlots, localeData = _a.localeData, availableLocales = _a.availableLocales, numberingSystemNames = _a.numberingSystemNames, getDefaultLocale = _a.getDefaultLocale, currencyDigitsData = _a.currencyDigitsData; // @ts-ignore var requestedLocales = (0, CanonicalizeLocaleList_1.CanonicalizeLocaleList)(locales); var options = (0, CoerceOptionsToObject_1.CoerceOptionsToObject)(opts); var opt = Object.create(null); var matcher = (0, GetOption_1.GetOption)(options, 'localeMatcher', 'string', ['lookup', 'best fit'], 'best fit'); opt.localeMatcher = matcher; var numberingSystem = (0, GetOption_1.GetOption)(options, 'numberingSystem', 'string', undefined, undefined); if (numberingSystem !== undefined && numberingSystemNames.indexOf(numberingSystem) < 0) { // 8.a. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, // throw a RangeError exception. throw RangeError("Invalid numberingSystems: ".concat(numberingSystem)); } opt.nu = numberingSystem; var r = (0, intl_localematcher_1.ResolveLocale)(availableLocales, requestedLocales, opt, // [[RelevantExtensionKeys]] slot, which is a constant ['nu'], localeData, getDefaultLocale); var dataLocaleData = localeData[r.dataLocale]; (0, utils_1.invariant)(!!dataLocaleData, "Missing locale data for ".concat(r.dataLocale)); var internalSlots = getInternalSlots(nf); internalSlots.locale = r.locale; internalSlots.dataLocale = r.dataLocale; internalSlots.numberingSystem = r.nu; internalSlots.dataLocaleData = dataLocaleData; (0, SetNumberFormatUnitOptions_1.SetNumberFormatUnitOptions)(nf, options, { getInternalSlots: getInternalSlots }); var style = internalSlots.style; var mnfdDefault; var mxfdDefault; if (style === 'currency') { var currency = internalSlots.currency; var cDigits = (0, CurrencyDigits_1.CurrencyDigits)(currency, { currencyDigitsData: currencyDigitsData }); mnfdDefault = cDigits; mxfdDefault = cDigits; } else { mnfdDefault = 0; mxfdDefault = style === 'percent' ? 0 : 3; } var notation = (0, GetOption_1.GetOption)(options, 'notation', 'string', ['standard', 'scientific', 'engineering', 'compact'], 'standard'); internalSlots.notation = notation; (0, SetNumberFormatDigitOptions_1.SetNumberFormatDigitOptions)(internalSlots, options, mnfdDefault, mxfdDefault, notation); var roundingIncrement = (0, GetNumberOption_1.GetNumberOption)(options, 'roundingIncrement', 1, 5000, 1); if (VALID_ROUND_INCREMENT_VALUES.indexOf(roundingIncrement) === -1) { throw new RangeError("Invalid rounding increment value: ".concat(roundingIncrement, ".\nValid values are ").concat(VALID_ROUND_INCREMENT_VALUES, ".")); } if (roundingIncrement !== 1 && internalSlots.roundingType !== 'fractionDigits') { throw new TypeError("For roundingIncrement > 1 only fractionDigits is a valid roundingType"); } if (roundingIncrement !== 1 && internalSlots.maximumFractionDigits !== internalSlots.minimumFractionDigits) { throw new RangeError('With roundingIncrement > 1, maximumFractionDigits and minimumFractionDigits must be equal.'); } internalSlots.roundingIncrement = roundingIncrement; var trailingZeroDisplay = (0, GetOption_1.GetOption)(options, 'trailingZeroDisplay', 'string', ['auto', 'stripIfInteger'], 'auto'); internalSlots.trailingZeroDisplay = trailingZeroDisplay; var compactDisplay = (0, GetOption_1.GetOption)(options, 'compactDisplay', 'string', ['short', 'long'], 'short'); var defaultUseGrouping = 'auto'; if (notation === 'compact') { internalSlots.compactDisplay = compactDisplay; defaultUseGrouping = 'min2'; } internalSlots.useGrouping = (0, GetStringOrBooleanOption_1.GetStringOrBooleanOption)(options, 'useGrouping', ['min2', 'auto', 'always'], 'always', false, defaultUseGrouping); internalSlots.signDisplay = (0, GetOption_1.GetOption)(options, 'signDisplay', 'string', ['auto', 'never', 'always', 'exceptZero', 'negative'], 'auto'); internalSlots.roundingMode = (0, GetOption_1.GetOption)(options, 'roundingMode', 'string', [ 'ceil', 'floor', 'expand', 'trunc', 'halfCeil', 'halfFloor', 'halfExpand', 'halfTrunc', 'halfEven', ], 'halfExpand'); return nf; } exports.InitializeNumberFormat = InitializeNumberFormat;