You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
7.6 KiB
234 lines
7.6 KiB
import aliases from './aliases';
|
|
import parentLocales from './parentLocales';
|
|
import { invariant } from './invariant';
|
|
/**
|
|
* https://tc39.es/ecma262/#sec-toobject
|
|
* @param arg
|
|
*/
|
|
export function toObject(arg) {
|
|
if (arg == null) {
|
|
throw new TypeError('undefined/null cannot be converted to object');
|
|
}
|
|
return Object(arg);
|
|
}
|
|
/**
|
|
* https://tc39.es/ecma262/#sec-tostring
|
|
*/
|
|
export function toString(o) {
|
|
// Only symbol is irregular...
|
|
if (typeof o === 'symbol') {
|
|
throw TypeError('Cannot convert a Symbol value to a string');
|
|
}
|
|
return String(o);
|
|
}
|
|
/**
|
|
* https://tc39.es/ecma402/#sec-getoption
|
|
* @param opts
|
|
* @param prop
|
|
* @param type
|
|
* @param values
|
|
* @param fallback
|
|
*/
|
|
export function getOption(opts, prop, type, values, fallback) {
|
|
// const descriptor = Object.getOwnPropertyDescriptor(opts, prop);
|
|
var value = opts[prop];
|
|
if (value !== undefined) {
|
|
if (type !== 'boolean' && type !== 'string') {
|
|
throw new TypeError('invalid type');
|
|
}
|
|
if (type === 'boolean') {
|
|
value = Boolean(value);
|
|
}
|
|
if (type === 'string') {
|
|
value = toString(value);
|
|
}
|
|
if (values !== undefined && !values.filter(function (val) { return val == value; }).length) {
|
|
throw new RangeError(value + " is not within " + values.join(', '));
|
|
}
|
|
return value;
|
|
}
|
|
return fallback;
|
|
}
|
|
/**
|
|
* https://tc39.es/ecma402/#sec-defaultnumberoption
|
|
* @param val
|
|
* @param min
|
|
* @param max
|
|
* @param fallback
|
|
*/
|
|
export function defaultNumberOption(val, min, max, fallback) {
|
|
if (val !== undefined) {
|
|
val = Number(val);
|
|
if (isNaN(val) || val < min || val > max) {
|
|
throw new RangeError(val + " is outside of range [" + min + ", " + max + "]");
|
|
}
|
|
return Math.floor(val);
|
|
}
|
|
return fallback;
|
|
}
|
|
/**
|
|
* https://tc39.es/ecma402/#sec-getnumberoption
|
|
* @param options
|
|
* @param property
|
|
* @param min
|
|
* @param max
|
|
* @param fallback
|
|
*/
|
|
export function getNumberOption(options, property, minimum, maximum, fallback) {
|
|
var val = options[property];
|
|
return defaultNumberOption(val, minimum, maximum, fallback);
|
|
}
|
|
export function getAliasesByLang(lang) {
|
|
return Object.keys(aliases).reduce(function (all, locale) {
|
|
if (locale.split('-')[0] === lang) {
|
|
all[locale] = aliases[locale];
|
|
}
|
|
return all;
|
|
}, {});
|
|
}
|
|
export function getParentLocalesByLang(lang) {
|
|
return Object.keys(parentLocales).reduce(function (all, locale) {
|
|
if (locale.split('-')[0] === lang) {
|
|
all[locale] = parentLocales[locale];
|
|
}
|
|
return all;
|
|
}, {});
|
|
}
|
|
export function setInternalSlot(map, pl, field, value) {
|
|
if (!map.get(pl)) {
|
|
map.set(pl, Object.create(null));
|
|
}
|
|
var slots = map.get(pl);
|
|
slots[field] = value;
|
|
}
|
|
export function setMultiInternalSlots(map, pl, props) {
|
|
for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {
|
|
var k = _a[_i];
|
|
setInternalSlot(map, pl, k, props[k]);
|
|
}
|
|
}
|
|
export function getInternalSlot(map, pl, field) {
|
|
return getMultiInternalSlots(map, pl, field)[field];
|
|
}
|
|
export function getMultiInternalSlots(map, pl) {
|
|
var fields = [];
|
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
fields[_i - 2] = arguments[_i];
|
|
}
|
|
var slots = map.get(pl);
|
|
if (!slots) {
|
|
throw new TypeError(pl + " InternalSlot has not been initialized");
|
|
}
|
|
return fields.reduce(function (all, f) {
|
|
all[f] = slots[f];
|
|
return all;
|
|
}, Object.create(null));
|
|
}
|
|
export function isLiteralPart(patternPart) {
|
|
return patternPart.type === 'literal';
|
|
}
|
|
export function partitionPattern(pattern) {
|
|
var result = [];
|
|
var beginIndex = pattern.indexOf('{');
|
|
var endIndex = 0;
|
|
var nextIndex = 0;
|
|
var length = pattern.length;
|
|
while (beginIndex < pattern.length && beginIndex > -1) {
|
|
endIndex = pattern.indexOf('}', beginIndex);
|
|
invariant(endIndex > beginIndex, "Invalid pattern " + pattern);
|
|
if (beginIndex > nextIndex) {
|
|
result.push({
|
|
type: 'literal',
|
|
value: pattern.substring(nextIndex, beginIndex),
|
|
});
|
|
}
|
|
result.push({
|
|
type: pattern.substring(beginIndex + 1, endIndex),
|
|
value: undefined,
|
|
});
|
|
nextIndex = endIndex + 1;
|
|
beginIndex = pattern.indexOf('{', nextIndex);
|
|
}
|
|
if (nextIndex < length) {
|
|
result.push({
|
|
type: 'literal',
|
|
value: pattern.substring(nextIndex, length),
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
/**
|
|
* https://tc39.es/ecma402/#sec-setnfdigitoptions
|
|
* https://tc39.es/proposal-unified-intl-numberformat/section11/numberformat_diff_out.html#sec-setnfdigitoptions
|
|
* @param intlObj
|
|
* @param opts
|
|
* @param mnfdDefault
|
|
* @param mxfdDefault
|
|
*/
|
|
export function setNumberFormatDigitOptions(internalSlotMap, intlObj, opts, mnfdDefault, mxfdDefault) {
|
|
var mnid = getNumberOption(opts, 'minimumIntegerDigits', 1, 21, 1);
|
|
var mnfd = opts.minimumFractionDigits;
|
|
var mxfd = opts.maximumFractionDigits;
|
|
var mnsd = opts.minimumSignificantDigits;
|
|
var mxsd = opts.maximumSignificantDigits;
|
|
setInternalSlot(internalSlotMap, intlObj, 'minimumIntegerDigits', mnid);
|
|
if (mnsd !== undefined || mxsd !== undefined) {
|
|
setInternalSlot(internalSlotMap, intlObj, 'roundingType', 'significantDigits');
|
|
mnsd = defaultNumberOption(mnsd, 1, 21, 1);
|
|
mxsd = defaultNumberOption(mxsd, mnsd, 21, 21);
|
|
setInternalSlot(internalSlotMap, intlObj, 'minimumSignificantDigits', mnsd);
|
|
setInternalSlot(internalSlotMap, intlObj, 'maximumSignificantDigits', mxsd);
|
|
}
|
|
else if (mnfd !== undefined || mxfd !== undefined) {
|
|
setInternalSlot(internalSlotMap, intlObj, 'roundingType', 'fractionDigits');
|
|
mnfd = defaultNumberOption(mnfd, 0, 20, mnfdDefault);
|
|
var mxfdActualDefault = Math.max(mnfd, mxfdDefault);
|
|
mxfd = defaultNumberOption(mxfd, mnfd, 20, mxfdActualDefault);
|
|
setInternalSlot(internalSlotMap, intlObj, 'minimumFractionDigits', mnfd);
|
|
setInternalSlot(internalSlotMap, intlObj, 'maximumFractionDigits', mxfd);
|
|
}
|
|
else if (getInternalSlot(internalSlotMap, intlObj, 'notation') === 'compact') {
|
|
setInternalSlot(internalSlotMap, intlObj, 'roundingType', 'compactRounding');
|
|
}
|
|
else {
|
|
setInternalSlot(internalSlotMap, intlObj, 'roundingType', 'fractionDigits');
|
|
setInternalSlot(internalSlotMap, intlObj, 'minimumFractionDigits', mnfdDefault);
|
|
setInternalSlot(internalSlotMap, intlObj, 'maximumFractionDigits', mxfdDefault);
|
|
}
|
|
}
|
|
export function objectIs(x, y) {
|
|
if (Object.is) {
|
|
return Object.is(x, y);
|
|
}
|
|
// SameValue algorithm
|
|
if (x === y) {
|
|
// Steps 1-5, 7-10
|
|
// Steps 6.b-6.e: +0 != -0
|
|
return x !== 0 || 1 / x === 1 / y;
|
|
}
|
|
// Step 6.a: NaN == NaN
|
|
return x !== x && y !== y;
|
|
}
|
|
var NOT_A_Z_REGEX = /[^A-Z]/;
|
|
/**
|
|
* This follows https://tc39.es/ecma402/#sec-case-sensitivity-and-case-mapping
|
|
* @param str string to convert
|
|
*/
|
|
function toUpperCase(str) {
|
|
return str.replace(/([a-z])/g, function (_, c) { return c.toUpperCase(); });
|
|
}
|
|
/**
|
|
* https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-iswellformedcurrencycode
|
|
* @param currency
|
|
*/
|
|
export function isWellFormedCurrencyCode(currency) {
|
|
currency = toUpperCase(currency);
|
|
if (currency.length !== 3) {
|
|
return false;
|
|
}
|
|
if (NOT_A_Z_REGEX.test(currency)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
//# sourceMappingURL=polyfill-utils.js.map
|