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.
122 lines
5.8 KiB
122 lines
5.8 KiB
"use strict";
|
|
/*
|
|
* Copyright 2015, Yahoo Inc.
|
|
* Copyrights licensed under the New BSD License.
|
|
* See the accompanying LICENSE file for terms.
|
|
*/
|
|
var __assign = (this && this.__assign) || function () {
|
|
__assign = Object.assign || function(t) {
|
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
s = arguments[i];
|
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
t[p] = s[p];
|
|
}
|
|
return t;
|
|
};
|
|
return __assign.apply(this, arguments);
|
|
};
|
|
var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
r[k] = a[j];
|
|
return r;
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var React = require("react");
|
|
var intl_utils_1 = require("@formatjs/intl-utils");
|
|
var utils_1 = require("../utils");
|
|
var intl_messageformat_1 = require("intl-messageformat");
|
|
function setTimeZoneInOptions(opts, timeZone) {
|
|
return Object.keys(opts).reduce(function (all, k) {
|
|
all[k] = __assign({ timeZone: timeZone }, opts[k]);
|
|
return all;
|
|
}, {});
|
|
}
|
|
function deepMergeOptions(opts1, opts2) {
|
|
var keys = Object.keys(__assign(__assign({}, opts1), opts2));
|
|
return keys.reduce(function (all, k) {
|
|
all[k] = __assign(__assign({}, (opts1[k] || {})), (opts2[k] || {}));
|
|
return all;
|
|
}, {});
|
|
}
|
|
function deepMergeFormatsAndSetTimeZone(f1, timeZone) {
|
|
if (!timeZone) {
|
|
return f1;
|
|
}
|
|
var mfFormats = intl_messageformat_1.default.formats;
|
|
return __assign(__assign(__assign({}, mfFormats), f1), { date: deepMergeOptions(setTimeZoneInOptions(mfFormats.date, timeZone), setTimeZoneInOptions(f1.date || {}, timeZone)), time: deepMergeOptions(setTimeZoneInOptions(mfFormats.time, timeZone), setTimeZoneInOptions(f1.time || {}, timeZone)) });
|
|
}
|
|
exports.prepareIntlMessageFormatHtmlOutput = function (chunks) { return React.createElement.apply(React, __spreadArrays([React.Fragment, null], chunks)); };
|
|
function formatMessage(_a, state, messageDescriptor, values) {
|
|
var locale = _a.locale, formats = _a.formats, messages = _a.messages, defaultLocale = _a.defaultLocale, defaultFormats = _a.defaultFormats, onError = _a.onError, timeZone = _a.timeZone;
|
|
if (messageDescriptor === void 0) { messageDescriptor = { id: '' }; }
|
|
if (values === void 0) { values = {}; }
|
|
var id = messageDescriptor.id, defaultMessage = messageDescriptor.defaultMessage;
|
|
// `id` is a required field of a Message Descriptor.
|
|
intl_utils_1.invariant(!!id, '[React Intl] An `id` must be provided to format a message.');
|
|
var message = messages && messages[String(id)];
|
|
formats = deepMergeFormatsAndSetTimeZone(formats, timeZone);
|
|
defaultFormats = deepMergeFormatsAndSetTimeZone(defaultFormats, timeZone);
|
|
var formattedMessageParts = [];
|
|
if (message) {
|
|
try {
|
|
var formatter = state.getMessageFormat(message, locale, formats, {
|
|
formatters: state,
|
|
});
|
|
formattedMessageParts = formatter.formatHTMLMessage(values);
|
|
}
|
|
catch (e) {
|
|
onError(utils_1.createError("Error formatting message: \"" + id + "\" for locale: \"" + locale + "\"" +
|
|
(defaultMessage ? ', using default message as fallback.' : ''), e));
|
|
}
|
|
}
|
|
else {
|
|
// This prevents warnings from littering the console in development
|
|
// when no `messages` are passed into the <IntlProvider> for the
|
|
// default locale, and a default message is in the source.
|
|
if (!defaultMessage ||
|
|
(locale && locale.toLowerCase() !== defaultLocale.toLowerCase())) {
|
|
onError(utils_1.createError("Missing message: \"" + id + "\" for locale: \"" + locale + "\"" +
|
|
(defaultMessage ? ', using default message as fallback.' : '')));
|
|
}
|
|
}
|
|
if (!formattedMessageParts.length && defaultMessage) {
|
|
try {
|
|
var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats);
|
|
formattedMessageParts = formatter.formatHTMLMessage(values);
|
|
}
|
|
catch (e) {
|
|
onError(utils_1.createError("Error formatting the default message for: \"" + id + "\"", e));
|
|
}
|
|
}
|
|
if (!formattedMessageParts.length) {
|
|
onError(utils_1.createError("Cannot format message: \"" + id + "\", " +
|
|
("using message " + (message || defaultMessage ? 'source' : 'id') + " as fallback.")));
|
|
if (typeof message === 'string') {
|
|
return message || defaultMessage || String(id);
|
|
}
|
|
return defaultMessage || String(id);
|
|
}
|
|
if (formattedMessageParts.length === 1 &&
|
|
typeof formattedMessageParts[0] === 'string') {
|
|
return formattedMessageParts[0] || defaultMessage || String(id);
|
|
}
|
|
return exports.prepareIntlMessageFormatHtmlOutput(formattedMessageParts);
|
|
}
|
|
exports.formatMessage = formatMessage;
|
|
function formatHTMLMessage(config, state, messageDescriptor, rawValues) {
|
|
if (messageDescriptor === void 0) { messageDescriptor = { id: '' }; }
|
|
if (rawValues === void 0) { rawValues = {}; }
|
|
// Process all the values before they are used when formatting the ICU
|
|
// Message string. Since the formatted message might be injected via
|
|
// `innerHTML`, all String-based values need to be HTML-escaped.
|
|
var escapedValues = Object.keys(rawValues).reduce(function (escaped, name) {
|
|
var value = rawValues[name];
|
|
escaped[name] = typeof value === 'string' ? utils_1.escape(value) : value;
|
|
return escaped;
|
|
}, {});
|
|
return formatMessage(config, state, messageDescriptor, escapedValues);
|
|
}
|
|
exports.formatHTMLMessage = formatHTMLMessage;
|