186 lines
5.9 KiB
JavaScript
186 lines
5.9 KiB
JavaScript
'use strict';
|
|
|
|
var fastMemoize = require('@formatjs/fast-memoize');
|
|
|
|
function _defineProperty(e, r, t) {
|
|
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
value: t,
|
|
enumerable: !0,
|
|
configurable: !0,
|
|
writable: !0
|
|
}) : e[r] = t, e;
|
|
}
|
|
function _toPrimitive(t, r) {
|
|
if ("object" != typeof t || !t) return t;
|
|
var e = t[Symbol.toPrimitive];
|
|
if (void 0 !== e) {
|
|
var i = e.call(t, r || "default");
|
|
if ("object" != typeof i) return i;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return ("string" === r ? String : Number)(t);
|
|
}
|
|
function _toPropertyKey(t) {
|
|
var i = _toPrimitive(t, "string");
|
|
return "symbol" == typeof i ? i : i + "";
|
|
}
|
|
|
|
let IntlErrorCode = /*#__PURE__*/function (IntlErrorCode) {
|
|
IntlErrorCode["MISSING_MESSAGE"] = "MISSING_MESSAGE";
|
|
IntlErrorCode["MISSING_FORMAT"] = "MISSING_FORMAT";
|
|
IntlErrorCode["ENVIRONMENT_FALLBACK"] = "ENVIRONMENT_FALLBACK";
|
|
IntlErrorCode["INSUFFICIENT_PATH"] = "INSUFFICIENT_PATH";
|
|
IntlErrorCode["INVALID_MESSAGE"] = "INVALID_MESSAGE";
|
|
IntlErrorCode["INVALID_KEY"] = "INVALID_KEY";
|
|
IntlErrorCode["FORMATTING_ERROR"] = "FORMATTING_ERROR";
|
|
return IntlErrorCode;
|
|
}({});
|
|
class IntlError extends Error {
|
|
constructor(code, originalMessage) {
|
|
let message = code;
|
|
if (originalMessage) {
|
|
message += ': ' + originalMessage;
|
|
}
|
|
super(message);
|
|
_defineProperty(this, "code", void 0);
|
|
_defineProperty(this, "originalMessage", void 0);
|
|
this.code = code;
|
|
if (originalMessage) {
|
|
this.originalMessage = originalMessage;
|
|
}
|
|
}
|
|
}
|
|
|
|
function joinPath() {
|
|
for (var _len = arguments.length, parts = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
parts[_key] = arguments[_key];
|
|
}
|
|
return parts.filter(Boolean).join('.');
|
|
}
|
|
|
|
/**
|
|
* Contains defaults that are used for all entry points into the core.
|
|
* See also `InitializedIntlConfiguration`.
|
|
*/
|
|
|
|
function defaultGetMessageFallback(props) {
|
|
return joinPath(props.namespace, props.key);
|
|
}
|
|
function defaultOnError(error) {
|
|
console.error(error);
|
|
}
|
|
|
|
function createCache() {
|
|
return {
|
|
dateTime: {},
|
|
number: {},
|
|
message: {},
|
|
relativeTime: {},
|
|
pluralRules: {},
|
|
list: {},
|
|
displayNames: {}
|
|
};
|
|
}
|
|
function createMemoCache(store) {
|
|
return {
|
|
create() {
|
|
return {
|
|
get(key) {
|
|
return store[key];
|
|
},
|
|
set(key, value) {
|
|
store[key] = value;
|
|
}
|
|
};
|
|
}
|
|
};
|
|
}
|
|
function memoFn(fn, cache) {
|
|
return fastMemoize.memoize(fn, {
|
|
cache: createMemoCache(cache),
|
|
strategy: fastMemoize.strategies.variadic
|
|
});
|
|
}
|
|
function memoConstructor(ConstructorFn, cache) {
|
|
return memoFn(function () {
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
return new ConstructorFn(...args);
|
|
}, cache);
|
|
}
|
|
function createIntlFormatters(cache) {
|
|
const getDateTimeFormat = memoConstructor(Intl.DateTimeFormat, cache.dateTime);
|
|
const getNumberFormat = memoConstructor(Intl.NumberFormat, cache.number);
|
|
const getPluralRules = memoConstructor(Intl.PluralRules, cache.pluralRules);
|
|
const getRelativeTimeFormat = memoConstructor(Intl.RelativeTimeFormat, cache.relativeTime);
|
|
const getListFormat = memoConstructor(Intl.ListFormat, cache.list);
|
|
const getDisplayNames = memoConstructor(Intl.DisplayNames, cache.displayNames);
|
|
return {
|
|
getDateTimeFormat,
|
|
getNumberFormat,
|
|
getPluralRules,
|
|
getRelativeTimeFormat,
|
|
getListFormat,
|
|
getDisplayNames
|
|
};
|
|
}
|
|
|
|
function validateMessagesSegment(messages, invalidKeyLabels, parentPath) {
|
|
Object.entries(messages).forEach(_ref => {
|
|
let [key, messageOrMessages] = _ref;
|
|
if (key.includes('.')) {
|
|
let keyLabel = key;
|
|
if (parentPath) keyLabel += " (at ".concat(parentPath, ")");
|
|
invalidKeyLabels.push(keyLabel);
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
if (messageOrMessages != null && typeof messageOrMessages === 'object') {
|
|
validateMessagesSegment(messageOrMessages, invalidKeyLabels, joinPath(parentPath, key));
|
|
}
|
|
});
|
|
}
|
|
function validateMessages(messages, onError) {
|
|
const invalidKeyLabels = [];
|
|
validateMessagesSegment(messages, invalidKeyLabels);
|
|
if (invalidKeyLabels.length > 0) {
|
|
onError(new IntlError(IntlErrorCode.INVALID_KEY, "Namespace keys can not contain the character \".\" as this is used to express nesting. Please remove it or replace it with another character.\n\nInvalid ".concat(invalidKeyLabels.length === 1 ? 'key' : 'keys', ": ").concat(invalidKeyLabels.join(', '), "\n\nIf you're migrating from a flat structure, you can convert your messages as follows:\n\nimport {set} from \"lodash\";\n\nconst input = {\n \"one.one\": \"1.1\",\n \"one.two\": \"1.2\",\n \"two.one.one\": \"2.1.1\"\n};\n\nconst output = Object.entries(input).reduce(\n (acc, [key, value]) => set(acc, key, value),\n {}\n);\n\n// Output:\n//\n// {\n// \"one\": {\n// \"one\": \"1.1\",\n// \"two\": \"1.2\"\n// },\n// \"two\": {\n// \"one\": {\n// \"one\": \"2.1.1\"\n// }\n// }\n// }\n") ));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enhances the incoming props with defaults.
|
|
*/
|
|
function initializeConfig(_ref) {
|
|
let {
|
|
getMessageFallback,
|
|
messages,
|
|
onError,
|
|
...rest
|
|
} = _ref;
|
|
const finalOnError = onError || defaultOnError;
|
|
const finalGetMessageFallback = getMessageFallback || defaultGetMessageFallback;
|
|
{
|
|
if (messages) {
|
|
validateMessages(messages, finalOnError);
|
|
}
|
|
}
|
|
return {
|
|
...rest,
|
|
messages,
|
|
onError: finalOnError,
|
|
getMessageFallback: finalGetMessageFallback
|
|
};
|
|
}
|
|
|
|
exports.IntlError = IntlError;
|
|
exports.IntlErrorCode = IntlErrorCode;
|
|
exports.createCache = createCache;
|
|
exports.createIntlFormatters = createIntlFormatters;
|
|
exports.defaultGetMessageFallback = defaultGetMessageFallback;
|
|
exports.defaultOnError = defaultOnError;
|
|
exports.initializeConfig = initializeConfig;
|
|
exports.joinPath = joinPath;
|
|
exports.memoFn = memoFn;
|