更新
This commit is contained in:
+20
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020 kazuya kawaguchi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
# @intlify/core-base
|
||||
|
||||
The intlify core base module
|
||||
|
||||
## :copyright: License
|
||||
|
||||
[MIT](http://opensource.org/licenses/MIT)
|
||||
+989
@@ -0,0 +1,989 @@
|
||||
/*!
|
||||
* @intlify/core-base v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
var messageResolver = require('@intlify/message-resolver');
|
||||
var runtime = require('@intlify/runtime');
|
||||
var messageCompiler = require('@intlify/message-compiler');
|
||||
var shared = require('@intlify/shared');
|
||||
var devtoolsIf = require('@intlify/devtools-if');
|
||||
|
||||
let devtools = null;
|
||||
function setDevToolsHook(hook) {
|
||||
devtools = hook;
|
||||
}
|
||||
function getDevToolsHook() {
|
||||
return devtools;
|
||||
}
|
||||
function initI18nDevTools(i18n, version, meta) {
|
||||
// TODO: queue if devtools is undefined
|
||||
devtools &&
|
||||
devtools.emit(devtoolsIf.IntlifyDevToolsHooks.I18nInit, {
|
||||
timestamp: Date.now(),
|
||||
i18n,
|
||||
version,
|
||||
meta
|
||||
});
|
||||
}
|
||||
const translateDevTools = /* #__PURE__*/ createDevToolsHook(devtoolsIf.IntlifyDevToolsHooks.FunctionTranslate);
|
||||
function createDevToolsHook(hook) {
|
||||
return (payloads) => devtools && devtools.emit(hook, payloads);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
const warnMessages = {
|
||||
[0 /* NOT_FOUND_KEY */]: `Not found '{key}' key in '{locale}' locale messages.`,
|
||||
[1 /* FALLBACK_TO_TRANSLATE */]: `Fall back to translate '{key}' key with '{target}' locale.`,
|
||||
[2 /* CANNOT_FORMAT_NUMBER */]: `Cannot format a number value due to not supported Intl.NumberFormat.`,
|
||||
[3 /* FALLBACK_TO_NUMBER_FORMAT */]: `Fall back to number format '{key}' key with '{target}' locale.`,
|
||||
[4 /* CANNOT_FORMAT_DATE */]: `Cannot format a date value due to not supported Intl.DateTimeFormat.`,
|
||||
[5 /* FALLBACK_TO_DATE_FORMAT */]: `Fall back to datetime format '{key}' key with '{target}' locale.`
|
||||
};
|
||||
function getWarnMessage(code, ...args) {
|
||||
return shared.format(warnMessages[code], ...args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Intlify core-base version
|
||||
* @internal
|
||||
*/
|
||||
const VERSION = '9.1.9';
|
||||
const NOT_REOSLVED = -1;
|
||||
const MISSING_RESOLVE_VALUE = '';
|
||||
function getDefaultLinkedModifiers() {
|
||||
return {
|
||||
upper: (val) => (shared.isString(val) ? val.toUpperCase() : val),
|
||||
lower: (val) => (shared.isString(val) ? val.toLowerCase() : val),
|
||||
// prettier-ignore
|
||||
capitalize: (val) => (shared.isString(val)
|
||||
? `${val.charAt(0).toLocaleUpperCase()}${val.substr(1)}`
|
||||
: val)
|
||||
};
|
||||
}
|
||||
let _compiler;
|
||||
function registerMessageCompiler(compiler) {
|
||||
_compiler = compiler;
|
||||
}
|
||||
// Additional Meta for Intlify DevTools
|
||||
let _additionalMeta = null;
|
||||
const setAdditionalMeta = /* #__PURE__*/ (meta) => {
|
||||
_additionalMeta = meta;
|
||||
};
|
||||
const getAdditionalMeta = /* #__PURE__*/ () => _additionalMeta;
|
||||
// ID for CoreContext
|
||||
let _cid = 0;
|
||||
function createCoreContext(options = {}) {
|
||||
// setup options
|
||||
const version = shared.isString(options.version) ? options.version : VERSION;
|
||||
const locale = shared.isString(options.locale) ? options.locale : 'en-US';
|
||||
const fallbackLocale = shared.isArray(options.fallbackLocale) ||
|
||||
shared.isPlainObject(options.fallbackLocale) ||
|
||||
shared.isString(options.fallbackLocale) ||
|
||||
options.fallbackLocale === false
|
||||
? options.fallbackLocale
|
||||
: locale;
|
||||
const messages = shared.isPlainObject(options.messages)
|
||||
? options.messages
|
||||
: { [locale]: {} };
|
||||
const datetimeFormats = shared.isPlainObject(options.datetimeFormats)
|
||||
? options.datetimeFormats
|
||||
: { [locale]: {} };
|
||||
const numberFormats = shared.isPlainObject(options.numberFormats)
|
||||
? options.numberFormats
|
||||
: { [locale]: {} };
|
||||
const modifiers = shared.assign({}, options.modifiers || {}, getDefaultLinkedModifiers());
|
||||
const pluralRules = options.pluralRules || {};
|
||||
const missing = shared.isFunction(options.missing) ? options.missing : null;
|
||||
const missingWarn = shared.isBoolean(options.missingWarn) || shared.isRegExp(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: true;
|
||||
const fallbackWarn = shared.isBoolean(options.fallbackWarn) || shared.isRegExp(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: true;
|
||||
const fallbackFormat = !!options.fallbackFormat;
|
||||
const unresolving = !!options.unresolving;
|
||||
const postTranslation = shared.isFunction(options.postTranslation)
|
||||
? options.postTranslation
|
||||
: null;
|
||||
const processor = shared.isPlainObject(options.processor) ? options.processor : null;
|
||||
const warnHtmlMessage = shared.isBoolean(options.warnHtmlMessage)
|
||||
? options.warnHtmlMessage
|
||||
: true;
|
||||
const escapeParameter = !!options.escapeParameter;
|
||||
const messageCompiler = shared.isFunction(options.messageCompiler)
|
||||
? options.messageCompiler
|
||||
: _compiler;
|
||||
const onWarn = shared.isFunction(options.onWarn) ? options.onWarn : shared.warn;
|
||||
// setup internal options
|
||||
const internalOptions = options;
|
||||
const __datetimeFormatters = shared.isObject(internalOptions.__datetimeFormatters)
|
||||
? internalOptions.__datetimeFormatters
|
||||
: new Map();
|
||||
const __numberFormatters = shared.isObject(internalOptions.__numberFormatters)
|
||||
? internalOptions.__numberFormatters
|
||||
: new Map();
|
||||
const __meta = shared.isObject(internalOptions.__meta) ? internalOptions.__meta : {};
|
||||
_cid++;
|
||||
const context = {
|
||||
version,
|
||||
cid: _cid,
|
||||
locale,
|
||||
fallbackLocale,
|
||||
messages,
|
||||
datetimeFormats,
|
||||
numberFormats,
|
||||
modifiers,
|
||||
pluralRules,
|
||||
missing,
|
||||
missingWarn,
|
||||
fallbackWarn,
|
||||
fallbackFormat,
|
||||
unresolving,
|
||||
postTranslation,
|
||||
processor,
|
||||
warnHtmlMessage,
|
||||
escapeParameter,
|
||||
messageCompiler,
|
||||
onWarn,
|
||||
__datetimeFormatters,
|
||||
__numberFormatters,
|
||||
__meta
|
||||
};
|
||||
// for vue-devtools timeline event
|
||||
{
|
||||
context.__v_emitter =
|
||||
internalOptions.__v_emitter != null
|
||||
? internalOptions.__v_emitter
|
||||
: undefined;
|
||||
}
|
||||
// NOTE: experimental !!
|
||||
{
|
||||
initI18nDevTools(context, version, __meta);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
/** @internal */
|
||||
function isTranslateFallbackWarn(fallback, key) {
|
||||
return fallback instanceof RegExp ? fallback.test(key) : fallback;
|
||||
}
|
||||
/** @internal */
|
||||
function isTranslateMissingWarn(missing, key) {
|
||||
return missing instanceof RegExp ? missing.test(key) : missing;
|
||||
}
|
||||
/** @internal */
|
||||
function handleMissing(context, key, locale, missingWarn, type) {
|
||||
const { missing, onWarn } = context;
|
||||
// for vue-devtools timeline event
|
||||
{
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("missing" /* MISSING */, {
|
||||
locale,
|
||||
key,
|
||||
type,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
if (missing !== null) {
|
||||
const ret = missing(context, locale, key, type);
|
||||
return shared.isString(ret) ? ret : key;
|
||||
}
|
||||
else {
|
||||
if (isTranslateMissingWarn(missingWarn, key)) {
|
||||
onWarn(getWarnMessage(0 /* NOT_FOUND_KEY */, { key, locale }));
|
||||
}
|
||||
return key;
|
||||
}
|
||||
}
|
||||
/** @internal */
|
||||
function getLocaleChain(ctx, fallback, start) {
|
||||
const context = ctx;
|
||||
if (!context.__localeChainCache) {
|
||||
context.__localeChainCache = new Map();
|
||||
}
|
||||
let chain = context.__localeChainCache.get(start);
|
||||
if (!chain) {
|
||||
chain = [];
|
||||
// first block defined by start
|
||||
let block = [start];
|
||||
// while any intervening block found
|
||||
while (shared.isArray(block)) {
|
||||
block = appendBlockToChain(chain, block, fallback);
|
||||
}
|
||||
// prettier-ignore
|
||||
// last block defined by default
|
||||
const defaults = shared.isArray(fallback)
|
||||
? fallback
|
||||
: shared.isPlainObject(fallback)
|
||||
? fallback['default']
|
||||
? fallback['default']
|
||||
: null
|
||||
: fallback;
|
||||
// convert defaults to array
|
||||
block = shared.isString(defaults) ? [defaults] : defaults;
|
||||
if (shared.isArray(block)) {
|
||||
appendBlockToChain(chain, block, false);
|
||||
}
|
||||
context.__localeChainCache.set(start, chain);
|
||||
}
|
||||
return chain;
|
||||
}
|
||||
function appendBlockToChain(chain, block, blocks) {
|
||||
let follow = true;
|
||||
for (let i = 0; i < block.length && shared.isBoolean(follow); i++) {
|
||||
const locale = block[i];
|
||||
if (shared.isString(locale)) {
|
||||
follow = appendLocaleToChain(chain, block[i], blocks);
|
||||
}
|
||||
}
|
||||
return follow;
|
||||
}
|
||||
function appendLocaleToChain(chain, locale, blocks) {
|
||||
let follow;
|
||||
const tokens = locale.split('-');
|
||||
do {
|
||||
const target = tokens.join('-');
|
||||
follow = appendItemToChain(chain, target, blocks);
|
||||
tokens.splice(-1, 1);
|
||||
} while (tokens.length && follow === true);
|
||||
return follow;
|
||||
}
|
||||
function appendItemToChain(chain, target, blocks) {
|
||||
let follow = false;
|
||||
if (!chain.includes(target)) {
|
||||
follow = true;
|
||||
if (target) {
|
||||
follow = target[target.length - 1] !== '!';
|
||||
const locale = target.replace(/!/g, '');
|
||||
chain.push(locale);
|
||||
if ((shared.isArray(blocks) || shared.isPlainObject(blocks)) &&
|
||||
blocks[locale] // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
follow = blocks[locale];
|
||||
}
|
||||
}
|
||||
}
|
||||
return follow;
|
||||
}
|
||||
/** @internal */
|
||||
function updateFallbackLocale(ctx, locale, fallback) {
|
||||
const context = ctx;
|
||||
context.__localeChainCache = new Map();
|
||||
getLocaleChain(ctx, fallback, locale);
|
||||
}
|
||||
|
||||
const RE_HTML_TAG = /<\/?[\w\s="/.':;#-\/]+>/;
|
||||
const WARN_MESSAGE = `Detected HTML in '{source}' message. Recommend not using HTML messages to avoid XSS.`;
|
||||
function checkHtmlMessage(source, options) {
|
||||
const warnHtmlMessage = shared.isBoolean(options.warnHtmlMessage)
|
||||
? options.warnHtmlMessage
|
||||
: true;
|
||||
if (warnHtmlMessage && RE_HTML_TAG.test(source)) {
|
||||
shared.warn(shared.format(WARN_MESSAGE, { source }));
|
||||
}
|
||||
}
|
||||
const defaultOnCacheKey = (source) => source;
|
||||
let compileCache = Object.create(null);
|
||||
function clearCompileCache() {
|
||||
compileCache = Object.create(null);
|
||||
}
|
||||
function compileToFunction(source, options = {}) {
|
||||
{
|
||||
// check HTML message
|
||||
checkHtmlMessage(source, options);
|
||||
// check caches
|
||||
const onCacheKey = options.onCacheKey || defaultOnCacheKey;
|
||||
const key = onCacheKey(source);
|
||||
const cached = compileCache[key];
|
||||
if (cached) {
|
||||
return cached;
|
||||
}
|
||||
// compile error detecting
|
||||
let occurred = false;
|
||||
const onError = options.onError || messageCompiler.defaultOnError;
|
||||
options.onError = (err) => {
|
||||
occurred = true;
|
||||
onError(err);
|
||||
};
|
||||
// compile
|
||||
const { code } = messageCompiler.baseCompile(source, options);
|
||||
// evaluate function
|
||||
const msg = new Function(`return ${code}`)();
|
||||
// if occurred compile error, don't cache
|
||||
return !occurred ? (compileCache[key] = msg) : msg;
|
||||
}
|
||||
}
|
||||
|
||||
function createCoreError(code) {
|
||||
return messageCompiler.createCompileError(code, null, { messages: errorMessages } );
|
||||
}
|
||||
/** @internal */
|
||||
const errorMessages = {
|
||||
[14 /* INVALID_ARGUMENT */]: 'Invalid arguments',
|
||||
[15 /* INVALID_DATE_ARGUMENT */]: 'The date provided is an invalid Date object.' +
|
||||
'Make sure your Date represents a valid date.',
|
||||
[16 /* INVALID_ISO_DATE_ARGUMENT */]: 'The argument provided is not a valid ISO date string'
|
||||
};
|
||||
|
||||
const NOOP_MESSAGE_FUNCTION = () => '';
|
||||
const isMessageFunction = (val) => shared.isFunction(val);
|
||||
// implementation of `translate` function
|
||||
function translate(context, ...args) {
|
||||
const { fallbackFormat, postTranslation, unresolving, fallbackLocale, messages } = context;
|
||||
const [key, options] = parseTranslateArgs(...args);
|
||||
const missingWarn = shared.isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
const fallbackWarn = shared.isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const escapeParameter = shared.isBoolean(options.escapeParameter)
|
||||
? options.escapeParameter
|
||||
: context.escapeParameter;
|
||||
const resolvedMessage = !!options.resolvedMessage;
|
||||
// prettier-ignore
|
||||
const defaultMsgOrKey = shared.isString(options.default) || shared.isBoolean(options.default) // default by function option
|
||||
? !shared.isBoolean(options.default)
|
||||
? options.default
|
||||
: key
|
||||
: fallbackFormat // default by `fallbackFormat` option
|
||||
? key
|
||||
: '';
|
||||
const enableDefaultMsg = fallbackFormat || defaultMsgOrKey !== '';
|
||||
const locale = shared.isString(options.locale) ? options.locale : context.locale;
|
||||
// escape params
|
||||
escapeParameter && escapeParams(options);
|
||||
// resolve message format
|
||||
// eslint-disable-next-line prefer-const
|
||||
let [format, targetLocale, message] = !resolvedMessage
|
||||
? resolveMessageFormat(context, key, locale, fallbackLocale, fallbackWarn, missingWarn)
|
||||
: [
|
||||
key,
|
||||
locale,
|
||||
messages[locale] || {}
|
||||
];
|
||||
// if you use default message, set it as message format!
|
||||
let cacheBaseKey = key;
|
||||
if (!resolvedMessage &&
|
||||
!(shared.isString(format) || isMessageFunction(format))) {
|
||||
if (enableDefaultMsg) {
|
||||
format = defaultMsgOrKey;
|
||||
cacheBaseKey = format;
|
||||
}
|
||||
}
|
||||
// checking message format and target locale
|
||||
if (!resolvedMessage &&
|
||||
(!(shared.isString(format) || isMessageFunction(format)) ||
|
||||
!shared.isString(targetLocale))) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
if (shared.isString(format) && context.messageCompiler == null) {
|
||||
shared.warn(`The message format compilation is not supported in this build. ` +
|
||||
`Because message compiler isn't included. ` +
|
||||
`You need to pre-compilation all message format. ` +
|
||||
`So translate function return '${key}'.`);
|
||||
return key;
|
||||
}
|
||||
// setup compile error detecting
|
||||
let occurred = false;
|
||||
const errorDetector = () => {
|
||||
occurred = true;
|
||||
};
|
||||
// compile message format
|
||||
const msg = !isMessageFunction(format)
|
||||
? compileMessageFormat(context, key, targetLocale, format, cacheBaseKey, errorDetector)
|
||||
: format;
|
||||
// if occurred compile error, return the message format
|
||||
if (occurred) {
|
||||
return format;
|
||||
}
|
||||
// evaluate message with context
|
||||
const ctxOptions = getMessageContextOptions(context, targetLocale, message, options);
|
||||
const msgContext = runtime.createMessageContext(ctxOptions);
|
||||
const messaged = evaluateMessage(context, msg, msgContext);
|
||||
// if use post translation option, proceed it with handler
|
||||
const ret = postTranslation ? postTranslation(messaged) : messaged;
|
||||
// NOTE: experimental !!
|
||||
{
|
||||
// prettier-ignore
|
||||
const payloads = {
|
||||
timestamp: Date.now(),
|
||||
key: shared.isString(key)
|
||||
? key
|
||||
: isMessageFunction(format)
|
||||
? format.key
|
||||
: '',
|
||||
locale: targetLocale || (isMessageFunction(format)
|
||||
? format.locale
|
||||
: ''),
|
||||
format: shared.isString(format)
|
||||
? format
|
||||
: isMessageFunction(format)
|
||||
? format.source
|
||||
: '',
|
||||
message: ret
|
||||
};
|
||||
payloads.meta = shared.assign({}, context.__meta, getAdditionalMeta() || {});
|
||||
translateDevTools(payloads);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
function escapeParams(options) {
|
||||
if (shared.isArray(options.list)) {
|
||||
options.list = options.list.map(item => shared.isString(item) ? shared.escapeHtml(item) : item);
|
||||
}
|
||||
else if (shared.isObject(options.named)) {
|
||||
Object.keys(options.named).forEach(key => {
|
||||
if (shared.isString(options.named[key])) {
|
||||
options.named[key] = shared.escapeHtml(options.named[key]);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
function resolveMessageFormat(context, key, locale, fallbackLocale, fallbackWarn, missingWarn) {
|
||||
const { messages, onWarn } = context;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
let message = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
let from = locale;
|
||||
let to = null;
|
||||
const type = 'translate';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = to = locales[i];
|
||||
if (locale !== targetLocale &&
|
||||
isTranslateFallbackWarn(fallbackWarn, key)) {
|
||||
onWarn(getWarnMessage(1 /* FALLBACK_TO_TRANSLATE */, {
|
||||
key,
|
||||
target: targetLocale
|
||||
}));
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if (locale !== targetLocale) {
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("fallback" /* FALBACK */, {
|
||||
type,
|
||||
key,
|
||||
from,
|
||||
to,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
message =
|
||||
messages[targetLocale] || {};
|
||||
// for vue-devtools timeline event
|
||||
let start = null;
|
||||
let startTag;
|
||||
let endTag;
|
||||
if (shared.inBrowser) {
|
||||
start = window.performance.now();
|
||||
startTag = 'intlify-message-resolve-start';
|
||||
endTag = 'intlify-message-resolve-end';
|
||||
shared.mark && shared.mark(startTag);
|
||||
}
|
||||
if ((format = messageResolver.resolveValue(message, key)) === null) {
|
||||
// if null, resolve with object key path
|
||||
format = message[key]; // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if (shared.inBrowser) {
|
||||
const end = window.performance.now();
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter && start && format) {
|
||||
emitter.emit("message-resolve" /* MESSAGE_RESOLVE */, {
|
||||
type: "message-resolve" /* MESSAGE_RESOLVE */,
|
||||
key,
|
||||
message: format,
|
||||
time: end - start,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
if (startTag && endTag && shared.mark && shared.measure) {
|
||||
shared.mark(endTag);
|
||||
shared.measure('intlify message resolve', startTag, endTag);
|
||||
}
|
||||
}
|
||||
if (shared.isString(format) || shared.isFunction(format))
|
||||
break;
|
||||
const missingRet = handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
if (missingRet !== key) {
|
||||
format = missingRet;
|
||||
}
|
||||
from = to;
|
||||
}
|
||||
return [format, targetLocale, message];
|
||||
}
|
||||
function compileMessageFormat(context, key, targetLocale, format, cacheBaseKey, errorDetector) {
|
||||
const { messageCompiler, warnHtmlMessage } = context;
|
||||
if (isMessageFunction(format)) {
|
||||
const msg = format;
|
||||
msg.locale = msg.locale || targetLocale;
|
||||
msg.key = msg.key || key;
|
||||
return msg;
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
let start = null;
|
||||
let startTag;
|
||||
let endTag;
|
||||
if (shared.inBrowser) {
|
||||
start = window.performance.now();
|
||||
startTag = 'intlify-message-compilation-start';
|
||||
endTag = 'intlify-message-compilation-end';
|
||||
shared.mark && shared.mark(startTag);
|
||||
}
|
||||
const msg = messageCompiler(format, getCompileOptions(context, targetLocale, cacheBaseKey, format, warnHtmlMessage, errorDetector));
|
||||
// for vue-devtools timeline event
|
||||
if (shared.inBrowser) {
|
||||
const end = window.performance.now();
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter && start) {
|
||||
emitter.emit("message-compilation" /* MESSAGE_COMPILATION */, {
|
||||
type: "message-compilation" /* MESSAGE_COMPILATION */,
|
||||
message: format,
|
||||
time: end - start,
|
||||
groupId: `${'translate'}:${key}`
|
||||
});
|
||||
}
|
||||
if (startTag && endTag && shared.mark && shared.measure) {
|
||||
shared.mark(endTag);
|
||||
shared.measure('intlify message compilation', startTag, endTag);
|
||||
}
|
||||
}
|
||||
msg.locale = targetLocale;
|
||||
msg.key = key;
|
||||
msg.source = format;
|
||||
return msg;
|
||||
}
|
||||
function evaluateMessage(context, msg, msgCtx) {
|
||||
// for vue-devtools timeline event
|
||||
let start = null;
|
||||
let startTag;
|
||||
let endTag;
|
||||
if (shared.inBrowser) {
|
||||
start = window.performance.now();
|
||||
startTag = 'intlify-message-evaluation-start';
|
||||
endTag = 'intlify-message-evaluation-end';
|
||||
shared.mark && shared.mark(startTag);
|
||||
}
|
||||
const messaged = msg(msgCtx);
|
||||
// for vue-devtools timeline event
|
||||
if (shared.inBrowser) {
|
||||
const end = window.performance.now();
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter && start) {
|
||||
emitter.emit("message-evaluation" /* MESSAGE_EVALUATION */, {
|
||||
type: "message-evaluation" /* MESSAGE_EVALUATION */,
|
||||
value: messaged,
|
||||
time: end - start,
|
||||
groupId: `${'translate'}:${msg.key}`
|
||||
});
|
||||
}
|
||||
if (startTag && endTag && shared.mark && shared.measure) {
|
||||
shared.mark(endTag);
|
||||
shared.measure('intlify message evaluation', startTag, endTag);
|
||||
}
|
||||
}
|
||||
return messaged;
|
||||
}
|
||||
/** @internal */
|
||||
function parseTranslateArgs(...args) {
|
||||
const [arg1, arg2, arg3] = args;
|
||||
const options = {};
|
||||
if (!shared.isString(arg1) && !shared.isNumber(arg1) && !isMessageFunction(arg1)) {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
// prettier-ignore
|
||||
const key = shared.isNumber(arg1)
|
||||
? String(arg1)
|
||||
: isMessageFunction(arg1)
|
||||
? arg1
|
||||
: arg1;
|
||||
if (shared.isNumber(arg2)) {
|
||||
options.plural = arg2;
|
||||
}
|
||||
else if (shared.isString(arg2)) {
|
||||
options.default = arg2;
|
||||
}
|
||||
else if (shared.isPlainObject(arg2) && !shared.isEmptyObject(arg2)) {
|
||||
options.named = arg2;
|
||||
}
|
||||
else if (shared.isArray(arg2)) {
|
||||
options.list = arg2;
|
||||
}
|
||||
if (shared.isNumber(arg3)) {
|
||||
options.plural = arg3;
|
||||
}
|
||||
else if (shared.isString(arg3)) {
|
||||
options.default = arg3;
|
||||
}
|
||||
else if (shared.isPlainObject(arg3)) {
|
||||
shared.assign(options, arg3);
|
||||
}
|
||||
return [key, options];
|
||||
}
|
||||
function getCompileOptions(context, locale, key, source, warnHtmlMessage, errorDetector) {
|
||||
return {
|
||||
warnHtmlMessage,
|
||||
onError: (err) => {
|
||||
errorDetector && errorDetector(err);
|
||||
{
|
||||
const message = `Message compilation error: ${err.message}`;
|
||||
const codeFrame = err.location &&
|
||||
shared.generateCodeFrame(source, err.location.start.offset, err.location.end.offset);
|
||||
const emitter = context
|
||||
.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("compile-error" /* COMPILE_ERROR */, {
|
||||
message: source,
|
||||
error: err.message,
|
||||
start: err.location && err.location.start.offset,
|
||||
end: err.location && err.location.end.offset,
|
||||
groupId: `${'translate'}:${key}`
|
||||
});
|
||||
}
|
||||
console.error(codeFrame ? `${message}\n${codeFrame}` : message);
|
||||
}
|
||||
},
|
||||
onCacheKey: (source) => shared.generateFormatCacheKey(locale, key, source)
|
||||
};
|
||||
}
|
||||
function getMessageContextOptions(context, locale, message, options) {
|
||||
const { modifiers, pluralRules } = context;
|
||||
const resolveMessage = (key) => {
|
||||
const val = messageResolver.resolveValue(message, key);
|
||||
if (shared.isString(val)) {
|
||||
let occurred = false;
|
||||
const errorDetector = () => {
|
||||
occurred = true;
|
||||
};
|
||||
const msg = compileMessageFormat(context, key, locale, val, key, errorDetector);
|
||||
return !occurred
|
||||
? msg
|
||||
: NOOP_MESSAGE_FUNCTION;
|
||||
}
|
||||
else if (isMessageFunction(val)) {
|
||||
return val;
|
||||
}
|
||||
else {
|
||||
// TODO: should be implemented warning message
|
||||
return NOOP_MESSAGE_FUNCTION;
|
||||
}
|
||||
};
|
||||
const ctxOptions = {
|
||||
locale,
|
||||
modifiers,
|
||||
pluralRules,
|
||||
messages: resolveMessage
|
||||
};
|
||||
if (context.processor) {
|
||||
ctxOptions.processor = context.processor;
|
||||
}
|
||||
if (options.list) {
|
||||
ctxOptions.list = options.list;
|
||||
}
|
||||
if (options.named) {
|
||||
ctxOptions.named = options.named;
|
||||
}
|
||||
if (shared.isNumber(options.plural)) {
|
||||
ctxOptions.pluralIndex = options.plural;
|
||||
}
|
||||
return ctxOptions;
|
||||
}
|
||||
|
||||
const intlDefined = typeof Intl !== 'undefined';
|
||||
const Availabilities = {
|
||||
dateTimeFormat: intlDefined && typeof Intl.DateTimeFormat !== 'undefined',
|
||||
numberFormat: intlDefined && typeof Intl.NumberFormat !== 'undefined'
|
||||
};
|
||||
|
||||
// implementation of `datetime` function
|
||||
function datetime(context, ...args) {
|
||||
const { datetimeFormats, unresolving, fallbackLocale, onWarn } = context;
|
||||
const { __datetimeFormatters } = context;
|
||||
if (!Availabilities.dateTimeFormat) {
|
||||
onWarn(getWarnMessage(4 /* CANNOT_FORMAT_DATE */));
|
||||
return MISSING_RESOLVE_VALUE;
|
||||
}
|
||||
const [key, value, options, overrides] = parseDateTimeArgs(...args);
|
||||
const missingWarn = shared.isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
const fallbackWarn = shared.isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const part = !!options.part;
|
||||
const locale = shared.isString(options.locale) ? options.locale : context.locale;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
if (!shared.isString(key) || key === '') {
|
||||
return new Intl.DateTimeFormat(locale).format(value);
|
||||
}
|
||||
// resolve format
|
||||
let datetimeFormat = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
let from = locale;
|
||||
let to = null;
|
||||
const type = 'datetime format';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = to = locales[i];
|
||||
if (locale !== targetLocale &&
|
||||
isTranslateFallbackWarn(fallbackWarn, key)) {
|
||||
onWarn(getWarnMessage(5 /* FALLBACK_TO_DATE_FORMAT */, {
|
||||
key,
|
||||
target: targetLocale
|
||||
}));
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if (locale !== targetLocale) {
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("fallback" /* FALBACK */, {
|
||||
type,
|
||||
key,
|
||||
from,
|
||||
to,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
datetimeFormat =
|
||||
datetimeFormats[targetLocale] || {};
|
||||
format = datetimeFormat[key];
|
||||
if (shared.isPlainObject(format))
|
||||
break;
|
||||
handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
from = to;
|
||||
}
|
||||
// checking format and target locale
|
||||
if (!shared.isPlainObject(format) || !shared.isString(targetLocale)) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
let id = `${targetLocale}__${key}`;
|
||||
if (!shared.isEmptyObject(overrides)) {
|
||||
id = `${id}__${JSON.stringify(overrides)}`;
|
||||
}
|
||||
let formatter = __datetimeFormatters.get(id);
|
||||
if (!formatter) {
|
||||
formatter = new Intl.DateTimeFormat(targetLocale, shared.assign({}, format, overrides));
|
||||
__datetimeFormatters.set(id, formatter);
|
||||
}
|
||||
return !part ? formatter.format(value) : formatter.formatToParts(value);
|
||||
}
|
||||
/** @internal */
|
||||
function parseDateTimeArgs(...args) {
|
||||
const [arg1, arg2, arg3, arg4] = args;
|
||||
let options = {};
|
||||
let overrides = {};
|
||||
let value;
|
||||
if (shared.isString(arg1)) {
|
||||
// Only allow ISO strings - other date formats are often supported,
|
||||
// but may cause different results in different browsers.
|
||||
if (!/\d{4}-\d{2}-\d{2}(T.*)?/.test(arg1)) {
|
||||
throw createCoreError(16 /* INVALID_ISO_DATE_ARGUMENT */);
|
||||
}
|
||||
value = new Date(arg1);
|
||||
try {
|
||||
// This will fail if the date is not valid
|
||||
value.toISOString();
|
||||
}
|
||||
catch (e) {
|
||||
throw createCoreError(16 /* INVALID_ISO_DATE_ARGUMENT */);
|
||||
}
|
||||
}
|
||||
else if (shared.isDate(arg1)) {
|
||||
if (isNaN(arg1.getTime())) {
|
||||
throw createCoreError(15 /* INVALID_DATE_ARGUMENT */);
|
||||
}
|
||||
value = arg1;
|
||||
}
|
||||
else if (shared.isNumber(arg1)) {
|
||||
value = arg1;
|
||||
}
|
||||
else {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
if (shared.isString(arg2)) {
|
||||
options.key = arg2;
|
||||
}
|
||||
else if (shared.isPlainObject(arg2)) {
|
||||
options = arg2;
|
||||
}
|
||||
if (shared.isString(arg3)) {
|
||||
options.locale = arg3;
|
||||
}
|
||||
else if (shared.isPlainObject(arg3)) {
|
||||
overrides = arg3;
|
||||
}
|
||||
if (shared.isPlainObject(arg4)) {
|
||||
overrides = arg4;
|
||||
}
|
||||
return [options.key || '', value, options, overrides];
|
||||
}
|
||||
/** @internal */
|
||||
function clearDateTimeFormat(ctx, locale, format) {
|
||||
const context = ctx;
|
||||
for (const key in format) {
|
||||
const id = `${locale}__${key}`;
|
||||
if (!context.__datetimeFormatters.has(id)) {
|
||||
continue;
|
||||
}
|
||||
context.__datetimeFormatters.delete(id);
|
||||
}
|
||||
}
|
||||
|
||||
// implementation of `number` function
|
||||
function number(context, ...args) {
|
||||
const { numberFormats, unresolving, fallbackLocale, onWarn } = context;
|
||||
const { __numberFormatters } = context;
|
||||
if (!Availabilities.numberFormat) {
|
||||
onWarn(getWarnMessage(2 /* CANNOT_FORMAT_NUMBER */));
|
||||
return MISSING_RESOLVE_VALUE;
|
||||
}
|
||||
const [key, value, options, overrides] = parseNumberArgs(...args);
|
||||
const missingWarn = shared.isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
const fallbackWarn = shared.isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const part = !!options.part;
|
||||
const locale = shared.isString(options.locale) ? options.locale : context.locale;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
if (!shared.isString(key) || key === '') {
|
||||
return new Intl.NumberFormat(locale).format(value);
|
||||
}
|
||||
// resolve format
|
||||
let numberFormat = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
let from = locale;
|
||||
let to = null;
|
||||
const type = 'number format';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = to = locales[i];
|
||||
if (locale !== targetLocale &&
|
||||
isTranslateFallbackWarn(fallbackWarn, key)) {
|
||||
onWarn(getWarnMessage(3 /* FALLBACK_TO_NUMBER_FORMAT */, {
|
||||
key,
|
||||
target: targetLocale
|
||||
}));
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if (locale !== targetLocale) {
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("fallback" /* FALBACK */, {
|
||||
type,
|
||||
key,
|
||||
from,
|
||||
to,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
numberFormat =
|
||||
numberFormats[targetLocale] || {};
|
||||
format = numberFormat[key];
|
||||
if (shared.isPlainObject(format))
|
||||
break;
|
||||
handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
from = to;
|
||||
}
|
||||
// checking format and target locale
|
||||
if (!shared.isPlainObject(format) || !shared.isString(targetLocale)) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
let id = `${targetLocale}__${key}`;
|
||||
if (!shared.isEmptyObject(overrides)) {
|
||||
id = `${id}__${JSON.stringify(overrides)}`;
|
||||
}
|
||||
let formatter = __numberFormatters.get(id);
|
||||
if (!formatter) {
|
||||
formatter = new Intl.NumberFormat(targetLocale, shared.assign({}, format, overrides));
|
||||
__numberFormatters.set(id, formatter);
|
||||
}
|
||||
return !part ? formatter.format(value) : formatter.formatToParts(value);
|
||||
}
|
||||
/** @internal */
|
||||
function parseNumberArgs(...args) {
|
||||
const [arg1, arg2, arg3, arg4] = args;
|
||||
let options = {};
|
||||
let overrides = {};
|
||||
if (!shared.isNumber(arg1)) {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
const value = arg1;
|
||||
if (shared.isString(arg2)) {
|
||||
options.key = arg2;
|
||||
}
|
||||
else if (shared.isPlainObject(arg2)) {
|
||||
options = arg2;
|
||||
}
|
||||
if (shared.isString(arg3)) {
|
||||
options.locale = arg3;
|
||||
}
|
||||
else if (shared.isPlainObject(arg3)) {
|
||||
overrides = arg3;
|
||||
}
|
||||
if (shared.isPlainObject(arg4)) {
|
||||
overrides = arg4;
|
||||
}
|
||||
return [options.key || '', value, options, overrides];
|
||||
}
|
||||
/** @internal */
|
||||
function clearNumberFormat(ctx, locale, format) {
|
||||
const context = ctx;
|
||||
for (const key in format) {
|
||||
const id = `${locale}__${key}`;
|
||||
if (!context.__numberFormatters.has(id)) {
|
||||
continue;
|
||||
}
|
||||
context.__numberFormatters.delete(id);
|
||||
}
|
||||
}
|
||||
|
||||
exports.createCompileError = messageCompiler.createCompileError;
|
||||
exports.MISSING_RESOLVE_VALUE = MISSING_RESOLVE_VALUE;
|
||||
exports.NOT_REOSLVED = NOT_REOSLVED;
|
||||
exports.VERSION = VERSION;
|
||||
exports.clearCompileCache = clearCompileCache;
|
||||
exports.clearDateTimeFormat = clearDateTimeFormat;
|
||||
exports.clearNumberFormat = clearNumberFormat;
|
||||
exports.compileToFunction = compileToFunction;
|
||||
exports.createCoreContext = createCoreContext;
|
||||
exports.createCoreError = createCoreError;
|
||||
exports.datetime = datetime;
|
||||
exports.getAdditionalMeta = getAdditionalMeta;
|
||||
exports.getDevToolsHook = getDevToolsHook;
|
||||
exports.getLocaleChain = getLocaleChain;
|
||||
exports.getWarnMessage = getWarnMessage;
|
||||
exports.handleMissing = handleMissing;
|
||||
exports.initI18nDevTools = initI18nDevTools;
|
||||
exports.isMessageFunction = isMessageFunction;
|
||||
exports.isTranslateFallbackWarn = isTranslateFallbackWarn;
|
||||
exports.isTranslateMissingWarn = isTranslateMissingWarn;
|
||||
exports.number = number;
|
||||
exports.parseDateTimeArgs = parseDateTimeArgs;
|
||||
exports.parseNumberArgs = parseNumberArgs;
|
||||
exports.parseTranslateArgs = parseTranslateArgs;
|
||||
exports.registerMessageCompiler = registerMessageCompiler;
|
||||
exports.setAdditionalMeta = setAdditionalMeta;
|
||||
exports.setDevToolsHook = setDevToolsHook;
|
||||
exports.translate = translate;
|
||||
exports.translateDevTools = translateDevTools;
|
||||
exports.updateFallbackLocale = updateFallbackLocale;
|
||||
Object.keys(messageResolver).forEach(function (k) {
|
||||
if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = messageResolver[k];
|
||||
});
|
||||
Object.keys(runtime).forEach(function (k) {
|
||||
if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = runtime[k];
|
||||
});
|
||||
+735
@@ -0,0 +1,735 @@
|
||||
/*!
|
||||
* @intlify/core-base v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
var messageResolver = require('@intlify/message-resolver');
|
||||
var runtime = require('@intlify/runtime');
|
||||
var messageCompiler = require('@intlify/message-compiler');
|
||||
var shared = require('@intlify/shared');
|
||||
var devtoolsIf = require('@intlify/devtools-if');
|
||||
|
||||
let devtools = null;
|
||||
function setDevToolsHook(hook) {
|
||||
devtools = hook;
|
||||
}
|
||||
function getDevToolsHook() {
|
||||
return devtools;
|
||||
}
|
||||
function initI18nDevTools(i18n, version, meta) {
|
||||
// TODO: queue if devtools is undefined
|
||||
devtools &&
|
||||
devtools.emit(devtoolsIf.IntlifyDevToolsHooks.I18nInit, {
|
||||
timestamp: Date.now(),
|
||||
i18n,
|
||||
version,
|
||||
meta
|
||||
});
|
||||
}
|
||||
const translateDevTools = /* #__PURE__*/ createDevToolsHook(devtoolsIf.IntlifyDevToolsHooks.FunctionTranslate);
|
||||
function createDevToolsHook(hook) {
|
||||
return (payloads) => devtools && devtools.emit(hook, payloads);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
const warnMessages = {
|
||||
[0 /* NOT_FOUND_KEY */]: `Not found '{key}' key in '{locale}' locale messages.`,
|
||||
[1 /* FALLBACK_TO_TRANSLATE */]: `Fall back to translate '{key}' key with '{target}' locale.`,
|
||||
[2 /* CANNOT_FORMAT_NUMBER */]: `Cannot format a number value due to not supported Intl.NumberFormat.`,
|
||||
[3 /* FALLBACK_TO_NUMBER_FORMAT */]: `Fall back to number format '{key}' key with '{target}' locale.`,
|
||||
[4 /* CANNOT_FORMAT_DATE */]: `Cannot format a date value due to not supported Intl.DateTimeFormat.`,
|
||||
[5 /* FALLBACK_TO_DATE_FORMAT */]: `Fall back to datetime format '{key}' key with '{target}' locale.`
|
||||
};
|
||||
function getWarnMessage(code, ...args) {
|
||||
return shared.format(warnMessages[code], ...args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Intlify core-base version
|
||||
* @internal
|
||||
*/
|
||||
const VERSION = '9.1.9';
|
||||
const NOT_REOSLVED = -1;
|
||||
const MISSING_RESOLVE_VALUE = '';
|
||||
function getDefaultLinkedModifiers() {
|
||||
return {
|
||||
upper: (val) => (shared.isString(val) ? val.toUpperCase() : val),
|
||||
lower: (val) => (shared.isString(val) ? val.toLowerCase() : val),
|
||||
// prettier-ignore
|
||||
capitalize: (val) => (shared.isString(val)
|
||||
? `${val.charAt(0).toLocaleUpperCase()}${val.substr(1)}`
|
||||
: val)
|
||||
};
|
||||
}
|
||||
let _compiler;
|
||||
function registerMessageCompiler(compiler) {
|
||||
_compiler = compiler;
|
||||
}
|
||||
// Additional Meta for Intlify DevTools
|
||||
let _additionalMeta = null;
|
||||
const setAdditionalMeta = /* #__PURE__*/ (meta) => {
|
||||
_additionalMeta = meta;
|
||||
};
|
||||
const getAdditionalMeta = /* #__PURE__*/ () => _additionalMeta;
|
||||
// ID for CoreContext
|
||||
let _cid = 0;
|
||||
function createCoreContext(options = {}) {
|
||||
// setup options
|
||||
const version = shared.isString(options.version) ? options.version : VERSION;
|
||||
const locale = shared.isString(options.locale) ? options.locale : 'en-US';
|
||||
const fallbackLocale = shared.isArray(options.fallbackLocale) ||
|
||||
shared.isPlainObject(options.fallbackLocale) ||
|
||||
shared.isString(options.fallbackLocale) ||
|
||||
options.fallbackLocale === false
|
||||
? options.fallbackLocale
|
||||
: locale;
|
||||
const messages = shared.isPlainObject(options.messages)
|
||||
? options.messages
|
||||
: { [locale]: {} };
|
||||
const datetimeFormats = shared.isPlainObject(options.datetimeFormats)
|
||||
? options.datetimeFormats
|
||||
: { [locale]: {} };
|
||||
const numberFormats = shared.isPlainObject(options.numberFormats)
|
||||
? options.numberFormats
|
||||
: { [locale]: {} };
|
||||
const modifiers = shared.assign({}, options.modifiers || {}, getDefaultLinkedModifiers());
|
||||
const pluralRules = options.pluralRules || {};
|
||||
const missing = shared.isFunction(options.missing) ? options.missing : null;
|
||||
const missingWarn = shared.isBoolean(options.missingWarn) || shared.isRegExp(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: true;
|
||||
const fallbackWarn = shared.isBoolean(options.fallbackWarn) || shared.isRegExp(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: true;
|
||||
const fallbackFormat = !!options.fallbackFormat;
|
||||
const unresolving = !!options.unresolving;
|
||||
const postTranslation = shared.isFunction(options.postTranslation)
|
||||
? options.postTranslation
|
||||
: null;
|
||||
const processor = shared.isPlainObject(options.processor) ? options.processor : null;
|
||||
const warnHtmlMessage = shared.isBoolean(options.warnHtmlMessage)
|
||||
? options.warnHtmlMessage
|
||||
: true;
|
||||
const escapeParameter = !!options.escapeParameter;
|
||||
const messageCompiler = shared.isFunction(options.messageCompiler)
|
||||
? options.messageCompiler
|
||||
: _compiler;
|
||||
const onWarn = shared.isFunction(options.onWarn) ? options.onWarn : shared.warn;
|
||||
// setup internal options
|
||||
const internalOptions = options;
|
||||
const __datetimeFormatters = shared.isObject(internalOptions.__datetimeFormatters)
|
||||
? internalOptions.__datetimeFormatters
|
||||
: new Map();
|
||||
const __numberFormatters = shared.isObject(internalOptions.__numberFormatters)
|
||||
? internalOptions.__numberFormatters
|
||||
: new Map();
|
||||
const __meta = shared.isObject(internalOptions.__meta) ? internalOptions.__meta : {};
|
||||
_cid++;
|
||||
const context = {
|
||||
version,
|
||||
cid: _cid,
|
||||
locale,
|
||||
fallbackLocale,
|
||||
messages,
|
||||
datetimeFormats,
|
||||
numberFormats,
|
||||
modifiers,
|
||||
pluralRules,
|
||||
missing,
|
||||
missingWarn,
|
||||
fallbackWarn,
|
||||
fallbackFormat,
|
||||
unresolving,
|
||||
postTranslation,
|
||||
processor,
|
||||
warnHtmlMessage,
|
||||
escapeParameter,
|
||||
messageCompiler,
|
||||
onWarn,
|
||||
__datetimeFormatters,
|
||||
__numberFormatters,
|
||||
__meta
|
||||
};
|
||||
return context;
|
||||
}
|
||||
/** @internal */
|
||||
function isTranslateFallbackWarn(fallback, key) {
|
||||
return fallback instanceof RegExp ? fallback.test(key) : fallback;
|
||||
}
|
||||
/** @internal */
|
||||
function isTranslateMissingWarn(missing, key) {
|
||||
return missing instanceof RegExp ? missing.test(key) : missing;
|
||||
}
|
||||
/** @internal */
|
||||
function handleMissing(context, key, locale, missingWarn, type) {
|
||||
const { missing, onWarn } = context;
|
||||
if (missing !== null) {
|
||||
const ret = missing(context, locale, key, type);
|
||||
return shared.isString(ret) ? ret : key;
|
||||
}
|
||||
else {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
/** @internal */
|
||||
function getLocaleChain(ctx, fallback, start) {
|
||||
const context = ctx;
|
||||
if (!context.__localeChainCache) {
|
||||
context.__localeChainCache = new Map();
|
||||
}
|
||||
let chain = context.__localeChainCache.get(start);
|
||||
if (!chain) {
|
||||
chain = [];
|
||||
// first block defined by start
|
||||
let block = [start];
|
||||
// while any intervening block found
|
||||
while (shared.isArray(block)) {
|
||||
block = appendBlockToChain(chain, block, fallback);
|
||||
}
|
||||
// prettier-ignore
|
||||
// last block defined by default
|
||||
const defaults = shared.isArray(fallback)
|
||||
? fallback
|
||||
: shared.isPlainObject(fallback)
|
||||
? fallback['default']
|
||||
? fallback['default']
|
||||
: null
|
||||
: fallback;
|
||||
// convert defaults to array
|
||||
block = shared.isString(defaults) ? [defaults] : defaults;
|
||||
if (shared.isArray(block)) {
|
||||
appendBlockToChain(chain, block, false);
|
||||
}
|
||||
context.__localeChainCache.set(start, chain);
|
||||
}
|
||||
return chain;
|
||||
}
|
||||
function appendBlockToChain(chain, block, blocks) {
|
||||
let follow = true;
|
||||
for (let i = 0; i < block.length && shared.isBoolean(follow); i++) {
|
||||
const locale = block[i];
|
||||
if (shared.isString(locale)) {
|
||||
follow = appendLocaleToChain(chain, block[i], blocks);
|
||||
}
|
||||
}
|
||||
return follow;
|
||||
}
|
||||
function appendLocaleToChain(chain, locale, blocks) {
|
||||
let follow;
|
||||
const tokens = locale.split('-');
|
||||
do {
|
||||
const target = tokens.join('-');
|
||||
follow = appendItemToChain(chain, target, blocks);
|
||||
tokens.splice(-1, 1);
|
||||
} while (tokens.length && follow === true);
|
||||
return follow;
|
||||
}
|
||||
function appendItemToChain(chain, target, blocks) {
|
||||
let follow = false;
|
||||
if (!chain.includes(target)) {
|
||||
follow = true;
|
||||
if (target) {
|
||||
follow = target[target.length - 1] !== '!';
|
||||
const locale = target.replace(/!/g, '');
|
||||
chain.push(locale);
|
||||
if ((shared.isArray(blocks) || shared.isPlainObject(blocks)) &&
|
||||
blocks[locale] // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
follow = blocks[locale];
|
||||
}
|
||||
}
|
||||
}
|
||||
return follow;
|
||||
}
|
||||
/** @internal */
|
||||
function updateFallbackLocale(ctx, locale, fallback) {
|
||||
const context = ctx;
|
||||
context.__localeChainCache = new Map();
|
||||
getLocaleChain(ctx, fallback, locale);
|
||||
}
|
||||
|
||||
const defaultOnCacheKey = (source) => source;
|
||||
let compileCache = Object.create(null);
|
||||
function clearCompileCache() {
|
||||
compileCache = Object.create(null);
|
||||
}
|
||||
function compileToFunction(source, options = {}) {
|
||||
{
|
||||
// check caches
|
||||
const onCacheKey = options.onCacheKey || defaultOnCacheKey;
|
||||
const key = onCacheKey(source);
|
||||
const cached = compileCache[key];
|
||||
if (cached) {
|
||||
return cached;
|
||||
}
|
||||
// compile error detecting
|
||||
let occurred = false;
|
||||
const onError = options.onError || messageCompiler.defaultOnError;
|
||||
options.onError = (err) => {
|
||||
occurred = true;
|
||||
onError(err);
|
||||
};
|
||||
// compile
|
||||
const { code } = messageCompiler.baseCompile(source, options);
|
||||
// evaluate function
|
||||
const msg = new Function(`return ${code}`)();
|
||||
// if occurred compile error, don't cache
|
||||
return !occurred ? (compileCache[key] = msg) : msg;
|
||||
}
|
||||
}
|
||||
|
||||
function createCoreError(code) {
|
||||
return messageCompiler.createCompileError(code, null, undefined);
|
||||
}
|
||||
|
||||
const NOOP_MESSAGE_FUNCTION = () => '';
|
||||
const isMessageFunction = (val) => shared.isFunction(val);
|
||||
// implementation of `translate` function
|
||||
function translate(context, ...args) {
|
||||
const { fallbackFormat, postTranslation, unresolving, fallbackLocale, messages } = context;
|
||||
const [key, options] = parseTranslateArgs(...args);
|
||||
const missingWarn = shared.isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
const fallbackWarn = shared.isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const escapeParameter = shared.isBoolean(options.escapeParameter)
|
||||
? options.escapeParameter
|
||||
: context.escapeParameter;
|
||||
const resolvedMessage = !!options.resolvedMessage;
|
||||
// prettier-ignore
|
||||
const defaultMsgOrKey = shared.isString(options.default) || shared.isBoolean(options.default) // default by function option
|
||||
? !shared.isBoolean(options.default)
|
||||
? options.default
|
||||
: key
|
||||
: fallbackFormat // default by `fallbackFormat` option
|
||||
? key
|
||||
: '';
|
||||
const enableDefaultMsg = fallbackFormat || defaultMsgOrKey !== '';
|
||||
const locale = shared.isString(options.locale) ? options.locale : context.locale;
|
||||
// escape params
|
||||
escapeParameter && escapeParams(options);
|
||||
// resolve message format
|
||||
// eslint-disable-next-line prefer-const
|
||||
let [format, targetLocale, message] = !resolvedMessage
|
||||
? resolveMessageFormat(context, key, locale, fallbackLocale, fallbackWarn, missingWarn)
|
||||
: [
|
||||
key,
|
||||
locale,
|
||||
messages[locale] || {}
|
||||
];
|
||||
// if you use default message, set it as message format!
|
||||
let cacheBaseKey = key;
|
||||
if (!resolvedMessage &&
|
||||
!(shared.isString(format) || isMessageFunction(format))) {
|
||||
if (enableDefaultMsg) {
|
||||
format = defaultMsgOrKey;
|
||||
cacheBaseKey = format;
|
||||
}
|
||||
}
|
||||
// checking message format and target locale
|
||||
if (!resolvedMessage &&
|
||||
(!(shared.isString(format) || isMessageFunction(format)) ||
|
||||
!shared.isString(targetLocale))) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
// setup compile error detecting
|
||||
let occurred = false;
|
||||
const errorDetector = () => {
|
||||
occurred = true;
|
||||
};
|
||||
// compile message format
|
||||
const msg = !isMessageFunction(format)
|
||||
? compileMessageFormat(context, key, targetLocale, format, cacheBaseKey, errorDetector)
|
||||
: format;
|
||||
// if occurred compile error, return the message format
|
||||
if (occurred) {
|
||||
return format;
|
||||
}
|
||||
// evaluate message with context
|
||||
const ctxOptions = getMessageContextOptions(context, targetLocale, message, options);
|
||||
const msgContext = runtime.createMessageContext(ctxOptions);
|
||||
const messaged = evaluateMessage(context, msg, msgContext);
|
||||
// if use post translation option, proceed it with handler
|
||||
const ret = postTranslation ? postTranslation(messaged) : messaged;
|
||||
return ret;
|
||||
}
|
||||
function escapeParams(options) {
|
||||
if (shared.isArray(options.list)) {
|
||||
options.list = options.list.map(item => shared.isString(item) ? shared.escapeHtml(item) : item);
|
||||
}
|
||||
else if (shared.isObject(options.named)) {
|
||||
Object.keys(options.named).forEach(key => {
|
||||
if (shared.isString(options.named[key])) {
|
||||
options.named[key] = shared.escapeHtml(options.named[key]);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
function resolveMessageFormat(context, key, locale, fallbackLocale, fallbackWarn, missingWarn) {
|
||||
const { messages, onWarn } = context;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
let message = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
const type = 'translate';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = locales[i];
|
||||
message =
|
||||
messages[targetLocale] || {};
|
||||
if ((format = messageResolver.resolveValue(message, key)) === null) {
|
||||
// if null, resolve with object key path
|
||||
format = message[key]; // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
}
|
||||
if (shared.isString(format) || shared.isFunction(format))
|
||||
break;
|
||||
const missingRet = handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
if (missingRet !== key) {
|
||||
format = missingRet;
|
||||
}
|
||||
}
|
||||
return [format, targetLocale, message];
|
||||
}
|
||||
function compileMessageFormat(context, key, targetLocale, format, cacheBaseKey, errorDetector) {
|
||||
const { messageCompiler, warnHtmlMessage } = context;
|
||||
if (isMessageFunction(format)) {
|
||||
const msg = format;
|
||||
msg.locale = msg.locale || targetLocale;
|
||||
msg.key = msg.key || key;
|
||||
return msg;
|
||||
}
|
||||
const msg = messageCompiler(format, getCompileOptions(context, targetLocale, cacheBaseKey, format, warnHtmlMessage, errorDetector));
|
||||
msg.locale = targetLocale;
|
||||
msg.key = key;
|
||||
msg.source = format;
|
||||
return msg;
|
||||
}
|
||||
function evaluateMessage(context, msg, msgCtx) {
|
||||
const messaged = msg(msgCtx);
|
||||
return messaged;
|
||||
}
|
||||
/** @internal */
|
||||
function parseTranslateArgs(...args) {
|
||||
const [arg1, arg2, arg3] = args;
|
||||
const options = {};
|
||||
if (!shared.isString(arg1) && !shared.isNumber(arg1) && !isMessageFunction(arg1)) {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
// prettier-ignore
|
||||
const key = shared.isNumber(arg1)
|
||||
? String(arg1)
|
||||
: isMessageFunction(arg1)
|
||||
? arg1
|
||||
: arg1;
|
||||
if (shared.isNumber(arg2)) {
|
||||
options.plural = arg2;
|
||||
}
|
||||
else if (shared.isString(arg2)) {
|
||||
options.default = arg2;
|
||||
}
|
||||
else if (shared.isPlainObject(arg2) && !shared.isEmptyObject(arg2)) {
|
||||
options.named = arg2;
|
||||
}
|
||||
else if (shared.isArray(arg2)) {
|
||||
options.list = arg2;
|
||||
}
|
||||
if (shared.isNumber(arg3)) {
|
||||
options.plural = arg3;
|
||||
}
|
||||
else if (shared.isString(arg3)) {
|
||||
options.default = arg3;
|
||||
}
|
||||
else if (shared.isPlainObject(arg3)) {
|
||||
shared.assign(options, arg3);
|
||||
}
|
||||
return [key, options];
|
||||
}
|
||||
function getCompileOptions(context, locale, key, source, warnHtmlMessage, errorDetector) {
|
||||
return {
|
||||
warnHtmlMessage,
|
||||
onError: (err) => {
|
||||
errorDetector && errorDetector(err);
|
||||
{
|
||||
throw err;
|
||||
}
|
||||
},
|
||||
onCacheKey: (source) => shared.generateFormatCacheKey(locale, key, source)
|
||||
};
|
||||
}
|
||||
function getMessageContextOptions(context, locale, message, options) {
|
||||
const { modifiers, pluralRules } = context;
|
||||
const resolveMessage = (key) => {
|
||||
const val = messageResolver.resolveValue(message, key);
|
||||
if (shared.isString(val)) {
|
||||
let occurred = false;
|
||||
const errorDetector = () => {
|
||||
occurred = true;
|
||||
};
|
||||
const msg = compileMessageFormat(context, key, locale, val, key, errorDetector);
|
||||
return !occurred
|
||||
? msg
|
||||
: NOOP_MESSAGE_FUNCTION;
|
||||
}
|
||||
else if (isMessageFunction(val)) {
|
||||
return val;
|
||||
}
|
||||
else {
|
||||
// TODO: should be implemented warning message
|
||||
return NOOP_MESSAGE_FUNCTION;
|
||||
}
|
||||
};
|
||||
const ctxOptions = {
|
||||
locale,
|
||||
modifiers,
|
||||
pluralRules,
|
||||
messages: resolveMessage
|
||||
};
|
||||
if (context.processor) {
|
||||
ctxOptions.processor = context.processor;
|
||||
}
|
||||
if (options.list) {
|
||||
ctxOptions.list = options.list;
|
||||
}
|
||||
if (options.named) {
|
||||
ctxOptions.named = options.named;
|
||||
}
|
||||
if (shared.isNumber(options.plural)) {
|
||||
ctxOptions.pluralIndex = options.plural;
|
||||
}
|
||||
return ctxOptions;
|
||||
}
|
||||
|
||||
// implementation of `datetime` function
|
||||
function datetime(context, ...args) {
|
||||
const { datetimeFormats, unresolving, fallbackLocale, onWarn } = context;
|
||||
const { __datetimeFormatters } = context;
|
||||
const [key, value, options, overrides] = parseDateTimeArgs(...args);
|
||||
const missingWarn = shared.isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
shared.isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const part = !!options.part;
|
||||
const locale = shared.isString(options.locale) ? options.locale : context.locale;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
if (!shared.isString(key) || key === '') {
|
||||
return new Intl.DateTimeFormat(locale).format(value);
|
||||
}
|
||||
// resolve format
|
||||
let datetimeFormat = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
const type = 'datetime format';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = locales[i];
|
||||
datetimeFormat =
|
||||
datetimeFormats[targetLocale] || {};
|
||||
format = datetimeFormat[key];
|
||||
if (shared.isPlainObject(format))
|
||||
break;
|
||||
handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
}
|
||||
// checking format and target locale
|
||||
if (!shared.isPlainObject(format) || !shared.isString(targetLocale)) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
let id = `${targetLocale}__${key}`;
|
||||
if (!shared.isEmptyObject(overrides)) {
|
||||
id = `${id}__${JSON.stringify(overrides)}`;
|
||||
}
|
||||
let formatter = __datetimeFormatters.get(id);
|
||||
if (!formatter) {
|
||||
formatter = new Intl.DateTimeFormat(targetLocale, shared.assign({}, format, overrides));
|
||||
__datetimeFormatters.set(id, formatter);
|
||||
}
|
||||
return !part ? formatter.format(value) : formatter.formatToParts(value);
|
||||
}
|
||||
/** @internal */
|
||||
function parseDateTimeArgs(...args) {
|
||||
const [arg1, arg2, arg3, arg4] = args;
|
||||
let options = {};
|
||||
let overrides = {};
|
||||
let value;
|
||||
if (shared.isString(arg1)) {
|
||||
// Only allow ISO strings - other date formats are often supported,
|
||||
// but may cause different results in different browsers.
|
||||
if (!/\d{4}-\d{2}-\d{2}(T.*)?/.test(arg1)) {
|
||||
throw createCoreError(16 /* INVALID_ISO_DATE_ARGUMENT */);
|
||||
}
|
||||
value = new Date(arg1);
|
||||
try {
|
||||
// This will fail if the date is not valid
|
||||
value.toISOString();
|
||||
}
|
||||
catch (e) {
|
||||
throw createCoreError(16 /* INVALID_ISO_DATE_ARGUMENT */);
|
||||
}
|
||||
}
|
||||
else if (shared.isDate(arg1)) {
|
||||
if (isNaN(arg1.getTime())) {
|
||||
throw createCoreError(15 /* INVALID_DATE_ARGUMENT */);
|
||||
}
|
||||
value = arg1;
|
||||
}
|
||||
else if (shared.isNumber(arg1)) {
|
||||
value = arg1;
|
||||
}
|
||||
else {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
if (shared.isString(arg2)) {
|
||||
options.key = arg2;
|
||||
}
|
||||
else if (shared.isPlainObject(arg2)) {
|
||||
options = arg2;
|
||||
}
|
||||
if (shared.isString(arg3)) {
|
||||
options.locale = arg3;
|
||||
}
|
||||
else if (shared.isPlainObject(arg3)) {
|
||||
overrides = arg3;
|
||||
}
|
||||
if (shared.isPlainObject(arg4)) {
|
||||
overrides = arg4;
|
||||
}
|
||||
return [options.key || '', value, options, overrides];
|
||||
}
|
||||
/** @internal */
|
||||
function clearDateTimeFormat(ctx, locale, format) {
|
||||
const context = ctx;
|
||||
for (const key in format) {
|
||||
const id = `${locale}__${key}`;
|
||||
if (!context.__datetimeFormatters.has(id)) {
|
||||
continue;
|
||||
}
|
||||
context.__datetimeFormatters.delete(id);
|
||||
}
|
||||
}
|
||||
|
||||
// implementation of `number` function
|
||||
function number(context, ...args) {
|
||||
const { numberFormats, unresolving, fallbackLocale, onWarn } = context;
|
||||
const { __numberFormatters } = context;
|
||||
const [key, value, options, overrides] = parseNumberArgs(...args);
|
||||
const missingWarn = shared.isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
shared.isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const part = !!options.part;
|
||||
const locale = shared.isString(options.locale) ? options.locale : context.locale;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
if (!shared.isString(key) || key === '') {
|
||||
return new Intl.NumberFormat(locale).format(value);
|
||||
}
|
||||
// resolve format
|
||||
let numberFormat = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
const type = 'number format';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = locales[i];
|
||||
numberFormat =
|
||||
numberFormats[targetLocale] || {};
|
||||
format = numberFormat[key];
|
||||
if (shared.isPlainObject(format))
|
||||
break;
|
||||
handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
}
|
||||
// checking format and target locale
|
||||
if (!shared.isPlainObject(format) || !shared.isString(targetLocale)) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
let id = `${targetLocale}__${key}`;
|
||||
if (!shared.isEmptyObject(overrides)) {
|
||||
id = `${id}__${JSON.stringify(overrides)}`;
|
||||
}
|
||||
let formatter = __numberFormatters.get(id);
|
||||
if (!formatter) {
|
||||
formatter = new Intl.NumberFormat(targetLocale, shared.assign({}, format, overrides));
|
||||
__numberFormatters.set(id, formatter);
|
||||
}
|
||||
return !part ? formatter.format(value) : formatter.formatToParts(value);
|
||||
}
|
||||
/** @internal */
|
||||
function parseNumberArgs(...args) {
|
||||
const [arg1, arg2, arg3, arg4] = args;
|
||||
let options = {};
|
||||
let overrides = {};
|
||||
if (!shared.isNumber(arg1)) {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
const value = arg1;
|
||||
if (shared.isString(arg2)) {
|
||||
options.key = arg2;
|
||||
}
|
||||
else if (shared.isPlainObject(arg2)) {
|
||||
options = arg2;
|
||||
}
|
||||
if (shared.isString(arg3)) {
|
||||
options.locale = arg3;
|
||||
}
|
||||
else if (shared.isPlainObject(arg3)) {
|
||||
overrides = arg3;
|
||||
}
|
||||
if (shared.isPlainObject(arg4)) {
|
||||
overrides = arg4;
|
||||
}
|
||||
return [options.key || '', value, options, overrides];
|
||||
}
|
||||
/** @internal */
|
||||
function clearNumberFormat(ctx, locale, format) {
|
||||
const context = ctx;
|
||||
for (const key in format) {
|
||||
const id = `${locale}__${key}`;
|
||||
if (!context.__numberFormatters.has(id)) {
|
||||
continue;
|
||||
}
|
||||
context.__numberFormatters.delete(id);
|
||||
}
|
||||
}
|
||||
|
||||
exports.createCompileError = messageCompiler.createCompileError;
|
||||
exports.MISSING_RESOLVE_VALUE = MISSING_RESOLVE_VALUE;
|
||||
exports.NOT_REOSLVED = NOT_REOSLVED;
|
||||
exports.VERSION = VERSION;
|
||||
exports.clearCompileCache = clearCompileCache;
|
||||
exports.clearDateTimeFormat = clearDateTimeFormat;
|
||||
exports.clearNumberFormat = clearNumberFormat;
|
||||
exports.compileToFunction = compileToFunction;
|
||||
exports.createCoreContext = createCoreContext;
|
||||
exports.createCoreError = createCoreError;
|
||||
exports.datetime = datetime;
|
||||
exports.getAdditionalMeta = getAdditionalMeta;
|
||||
exports.getDevToolsHook = getDevToolsHook;
|
||||
exports.getLocaleChain = getLocaleChain;
|
||||
exports.getWarnMessage = getWarnMessage;
|
||||
exports.handleMissing = handleMissing;
|
||||
exports.initI18nDevTools = initI18nDevTools;
|
||||
exports.isMessageFunction = isMessageFunction;
|
||||
exports.isTranslateFallbackWarn = isTranslateFallbackWarn;
|
||||
exports.isTranslateMissingWarn = isTranslateMissingWarn;
|
||||
exports.number = number;
|
||||
exports.parseDateTimeArgs = parseDateTimeArgs;
|
||||
exports.parseNumberArgs = parseNumberArgs;
|
||||
exports.parseTranslateArgs = parseTranslateArgs;
|
||||
exports.registerMessageCompiler = registerMessageCompiler;
|
||||
exports.setAdditionalMeta = setAdditionalMeta;
|
||||
exports.setDevToolsHook = setDevToolsHook;
|
||||
exports.translate = translate;
|
||||
exports.translateDevTools = translateDevTools;
|
||||
exports.updateFallbackLocale = updateFallbackLocale;
|
||||
Object.keys(messageResolver).forEach(function (k) {
|
||||
if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = messageResolver[k];
|
||||
});
|
||||
Object.keys(runtime).forEach(function (k) {
|
||||
if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = runtime[k];
|
||||
});
|
||||
+576
@@ -0,0 +1,576 @@
|
||||
import { CompileError } from '@intlify/message-compiler';
|
||||
import { CompileErrorCodes } from '@intlify/message-compiler';
|
||||
import type { CompileOptions } from '@intlify/message-compiler';
|
||||
import type { CoreMissingType } from '@intlify/runtime';
|
||||
import { createCompileError } from '@intlify/message-compiler';
|
||||
import type { FallbackLocale } from '@intlify/runtime';
|
||||
import type { IntlifyDevToolsEmitter } from '@intlify/devtools-if';
|
||||
import type { IntlifyDevToolsHookPayloads } from '@intlify/devtools-if';
|
||||
import { IntlifyDevToolsHooks } from '@intlify/devtools-if';
|
||||
import type { LinkedModifiers } from '@intlify/runtime';
|
||||
import type { Locale } from '@intlify/runtime';
|
||||
import type { MessageFunction } from '@intlify/runtime';
|
||||
import type { MessageProcessor } from '@intlify/runtime';
|
||||
import type { MessageType } from '@intlify/runtime';
|
||||
import type { NamedValue } from '@intlify/runtime';
|
||||
import type { Path } from '@intlify/message-resolver';
|
||||
import type { PluralizationRules } from '@intlify/runtime';
|
||||
import type { VueDevToolsEmitter } from '@intlify/vue-devtools';
|
||||
|
||||
export declare function clearCompileCache(): void;
|
||||
|
||||
/* Excluded from this release type: clearDateTimeFormat */
|
||||
|
||||
/* Excluded from this release type: clearNumberFormat */
|
||||
export { CompileError }
|
||||
export { CompileErrorCodes }
|
||||
|
||||
export declare function compileToFunction<T = string>(source: string, options?: CompileOptions): MessageFunction<T>;
|
||||
|
||||
export declare interface CoreCommonContext<Message = string> {
|
||||
cid: number;
|
||||
version: string;
|
||||
locale: Locale;
|
||||
fallbackLocale: FallbackLocale;
|
||||
missing: CoreMissingHandler<Message> | null;
|
||||
missingWarn: boolean | RegExp;
|
||||
fallbackWarn: boolean | RegExp;
|
||||
fallbackFormat: boolean;
|
||||
unresolving: boolean;
|
||||
onWarn(msg: string, err?: Error): void;
|
||||
}
|
||||
|
||||
export declare interface CoreContext<Messages = {}, DateTimeFormats = {}, NumberFormats = {}, Message = string> extends CoreTranslationContext<Messages, Message>, CoreDateTimeContext<DateTimeFormats, Message>, CoreNumberContext<NumberFormats, Message> {
|
||||
}
|
||||
|
||||
export declare interface CoreDateTimeContext<DateTimeFormats = {}, Message = string> extends CoreCommonContext<Message> {
|
||||
datetimeFormats: DateTimeFormats;
|
||||
}
|
||||
|
||||
export declare interface CoreError extends CompileError {
|
||||
code: CoreErrorCodes;
|
||||
}
|
||||
|
||||
export declare const enum CoreErrorCodes {
|
||||
INVALID_ARGUMENT = 14,
|
||||
INVALID_DATE_ARGUMENT = 15,
|
||||
INVALID_ISO_DATE_ARGUMENT = 16,
|
||||
__EXTEND_POINT__ = 17
|
||||
}
|
||||
|
||||
export declare interface CoreInternalContext {
|
||||
__datetimeFormatters: Map<string, Intl.DateTimeFormat>;
|
||||
__numberFormatters: Map<string, Intl.NumberFormat>;
|
||||
__localeChainCache?: Map<Locale, Locale[]>;
|
||||
__v_emitter?: VueDevToolsEmitter;
|
||||
__meta: MetaInfo;
|
||||
}
|
||||
|
||||
export declare interface CoreInternalOptions {
|
||||
__datetimeFormatters?: Map<string, Intl.DateTimeFormat>;
|
||||
__numberFormatters?: Map<string, Intl.NumberFormat>;
|
||||
__v_emitter?: VueDevToolsEmitter;
|
||||
__meta?: MetaInfo;
|
||||
}
|
||||
|
||||
export declare type CoreMissingHandler<Message = string> = (context: CoreCommonContext<Message>, locale: Locale, key: Path, type: CoreMissingType, ...values: unknown[]) => string | void;
|
||||
|
||||
export declare interface CoreNumberContext<NumberFormats = {}, Message = string> extends CoreCommonContext<Message> {
|
||||
numberFormats: NumberFormats;
|
||||
}
|
||||
|
||||
export declare interface CoreOptions<Message = string> {
|
||||
version?: string;
|
||||
locale?: Locale;
|
||||
fallbackLocale?: FallbackLocale;
|
||||
messages?: LocaleMessages<Message>;
|
||||
datetimeFormats?: DateTimeFormats;
|
||||
numberFormats?: NumberFormats;
|
||||
modifiers?: LinkedModifiers<Message>;
|
||||
pluralRules?: PluralizationRules;
|
||||
missing?: CoreMissingHandler<Message>;
|
||||
missingWarn?: boolean | RegExp;
|
||||
fallbackWarn?: boolean | RegExp;
|
||||
fallbackFormat?: boolean;
|
||||
unresolving?: boolean;
|
||||
postTranslation?: PostTranslationHandler<Message>;
|
||||
processor?: MessageProcessor<Message>;
|
||||
warnHtmlMessage?: boolean;
|
||||
escapeParameter?: boolean;
|
||||
messageCompiler?: MessageCompiler<Message>;
|
||||
onWarn?: (msg: string, err?: Error) => void;
|
||||
}
|
||||
|
||||
export declare interface CoreTranslationContext<Messages = {}, Message = string> extends CoreCommonContext<Message> {
|
||||
messages: Messages;
|
||||
modifiers: LinkedModifiers<Message>;
|
||||
pluralRules?: PluralizationRules;
|
||||
postTranslation: PostTranslationHandler<Message> | null;
|
||||
processor: MessageProcessor<Message> | null;
|
||||
warnHtmlMessage: boolean;
|
||||
escapeParameter: boolean;
|
||||
messageCompiler: MessageCompiler<Message> | null;
|
||||
}
|
||||
|
||||
export declare const enum CoreWarnCodes {
|
||||
NOT_FOUND_KEY = 0,
|
||||
FALLBACK_TO_TRANSLATE = 1,
|
||||
CANNOT_FORMAT_NUMBER = 2,
|
||||
FALLBACK_TO_NUMBER_FORMAT = 3,
|
||||
CANNOT_FORMAT_DATE = 4,
|
||||
FALLBACK_TO_DATE_FORMAT = 5,
|
||||
__EXTEND_POINT__ = 6
|
||||
}
|
||||
export { createCompileError }
|
||||
|
||||
export declare function createCoreContext<Message = string, Options extends CoreOptions<Message> = object, Messages extends Record<keyof Options['messages'], LocaleMessageDictionary<Message>> = Record<keyof Options['messages'], LocaleMessageDictionary<Message>>, DateTimeFormats extends Record<keyof Options['datetimeFormats'], DateTimeFormat> = Record<keyof Options['datetimeFormats'], DateTimeFormat>, NumberFormats extends Record<keyof Options['numberFormats'], NumberFormat> = Record<keyof Options['numberFormats'], NumberFormat>>(options?: Options): CoreContext<Options['messages'], Options['datetimeFormats'], Options['numberFormats'], Message>;
|
||||
|
||||
export declare function createCoreError(code: CoreErrorCodes): CoreError;
|
||||
|
||||
/**
|
||||
* number
|
||||
*/
|
||||
export declare type CurrencyDisplay = 'symbol' | 'code' | 'name';
|
||||
|
||||
export declare interface CurrencyNumberFormatOptions extends Intl.NumberFormatOptions {
|
||||
style: 'currency';
|
||||
currency: string;
|
||||
currencyDisplay?: CurrencyDisplay;
|
||||
localeMatcher?: LocaleMatcher;
|
||||
formatMatcher?: FormatMatcher;
|
||||
}
|
||||
|
||||
export declare function datetime<DateTimeFormats, Message = string>(context: CoreDateTimeContext<DateTimeFormats, Message>, value: number | Date): string | number | Intl.DateTimeFormatPart[];
|
||||
|
||||
export declare function datetime<DateTimeFormats, Message = string>(context: CoreDateTimeContext<DateTimeFormats, Message>, value: number | Date, key: string): string | number | Intl.DateTimeFormatPart[];
|
||||
|
||||
export declare function datetime<DateTimeFormats, Message = string>(context: CoreDateTimeContext<DateTimeFormats, Message>, value: number | Date, key: string, locale: Locale): string | number | Intl.DateTimeFormatPart[];
|
||||
|
||||
export declare function datetime<DateTimeFormats, Message = string>(context: CoreDateTimeContext<DateTimeFormats, Message>, value: number | Date, options: DateTimeOptions): string | number | Intl.DateTimeFormatPart[];
|
||||
|
||||
export declare function datetime<DateTimeFormats, Message = string>(context: CoreDateTimeContext<DateTimeFormats, Message>, ...args: unknown[]): string | number | Intl.DateTimeFormatPart[];
|
||||
|
||||
export declare type DateTimeDigital = 'numeric' | '2-digit';
|
||||
|
||||
export declare type DateTimeFormat = {
|
||||
[key: string]: DateTimeFormatOptions;
|
||||
};
|
||||
|
||||
export declare type DateTimeFormatOptions = Intl.DateTimeFormatOptions | SpecificDateTimeFormatOptions;
|
||||
|
||||
export declare type DateTimeFormats = {
|
||||
[locale: string]: DateTimeFormat;
|
||||
};
|
||||
|
||||
/**
|
||||
* datetime
|
||||
*/
|
||||
export declare type DateTimeHumanReadable = 'long' | 'short' | 'narrow';
|
||||
|
||||
/**
|
||||
* # datetime
|
||||
*
|
||||
* ## usages:
|
||||
* // for example `context.datetimeFormats` below
|
||||
* 'en-US': {
|
||||
* short: {
|
||||
* year: 'numeric', month: '2-digit', day: '2-digit',
|
||||
* hour: '2-digit', minute: '2-digit'
|
||||
* }
|
||||
* },
|
||||
* 'ja-JP': { ... }
|
||||
*
|
||||
* // datetimeable value only
|
||||
* datetime(context, value)
|
||||
*
|
||||
* // key argument
|
||||
* datetime(context, value, 'short')
|
||||
*
|
||||
* // key & locale argument
|
||||
* datetime(context, value, 'short', 'ja-JP')
|
||||
*
|
||||
* // object sytle argument
|
||||
* datetime(context, value, { key: 'short', locale: 'ja-JP' })
|
||||
*
|
||||
* // suppress localize miss warning option, override context.missingWarn
|
||||
* datetime(context, value, { key: 'short', locale: 'ja-JP', missingWarn: false })
|
||||
*
|
||||
* // suppress localize fallback warning option, override context.fallbackWarn
|
||||
* datetime(context, value, { key: 'short', locale: 'ja-JP', fallbackWarn: false })
|
||||
*
|
||||
* // if you specify `part` options, you can get an array of objects containing the formatted datetime in parts
|
||||
* datetime(context, value, { key: 'short', part: true })
|
||||
*
|
||||
* // orverride context.datetimeFormats[locale] options with functino options
|
||||
* datetime(cnotext, value, 'short', { currency: 'EUR' })
|
||||
* datetime(cnotext, value, 'short', 'ja-JP', { currency: 'EUR' })
|
||||
* datetime(context, value, { key: 'short', part: true }, { currency: 'EUR'})
|
||||
*/
|
||||
/**
|
||||
* DateTime options
|
||||
*
|
||||
* @remarks
|
||||
* Options for Datetime formatting API
|
||||
*
|
||||
* @VueI18nGeneral
|
||||
*/
|
||||
export declare interface DateTimeOptions {
|
||||
/**
|
||||
* @remarks
|
||||
* The target format key
|
||||
*/
|
||||
key?: string;
|
||||
/**
|
||||
* @remarks
|
||||
* The locale of localization
|
||||
*/
|
||||
locale?: Locale;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether suppress warnings outputted when localization fails
|
||||
*/
|
||||
missingWarn?: boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether do resolve on format keys when your language lacks a formatting for a key
|
||||
*/
|
||||
fallbackWarn?: boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether to use [Intel.DateTimeFormat#formatToParts](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/formatToParts)
|
||||
*/
|
||||
part?: boolean;
|
||||
}
|
||||
|
||||
export declare type FormatMatcher = 'basic' | 'best fit';
|
||||
|
||||
export declare type FormattedNumberPart = {
|
||||
type: FormattedNumberPartType;
|
||||
value: string;
|
||||
};
|
||||
|
||||
export declare type FormattedNumberPartType = 'currency' | 'decimal' | 'fraction' | 'group' | 'infinity' | 'integer' | 'literal' | 'minusSign' | 'nan' | 'plusSign' | 'percentSign';
|
||||
|
||||
export declare const getAdditionalMeta: () => MetaInfo | null;
|
||||
|
||||
export declare function getDevToolsHook(): IntlifyDevToolsEmitter | null;
|
||||
|
||||
/* Excluded from this release type: getLocaleChain */
|
||||
|
||||
export declare function getWarnMessage(code: CoreWarnCodes, ...args: unknown[]): string;
|
||||
|
||||
/* Excluded from this release type: handleMissing */
|
||||
|
||||
export declare function initI18nDevTools(i18n: unknown, version: string, meta?: Record<string, unknown>): void;
|
||||
|
||||
export declare const isMessageFunction: <T>(val: unknown) => val is MessageFunction<T>;
|
||||
|
||||
/* Excluded from this release type: isTranslateFallbackWarn */
|
||||
|
||||
/* Excluded from this release type: isTranslateMissingWarn */
|
||||
|
||||
export declare type LocaleMatcher = 'lookup' | 'best fit';
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare interface LocaleMessageArray<Message = string> extends Array<LocaleMessageValue<Message>> {
|
||||
}
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type LocaleMessageDictionary<Message = string> = {
|
||||
[property: string]: LocaleMessageValue<Message>;
|
||||
};
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type LocaleMessages<Message = string> = Record<Locale, LocaleMessageDictionary<Message>>;
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type LocaleMessageValue<Message = string> = string | MessageFunction<Message> | LocaleMessageDictionary<Message> | LocaleMessageArray<Message>;
|
||||
|
||||
export declare type MessageCompiler<Message = string> = (source: string, options?: CompileOptions) => MessageFunction<Message>;
|
||||
|
||||
export declare interface MetaInfo {
|
||||
[field: string]: unknown;
|
||||
}
|
||||
|
||||
export declare const MISSING_RESOLVE_VALUE = "";
|
||||
|
||||
export declare const NOT_REOSLVED = -1;
|
||||
|
||||
export declare function number<NumberFormats, Message = string>(context: CoreNumberContext<NumberFormats, Message>, value: number): string | number | Intl.NumberFormatPart[];
|
||||
|
||||
export declare function number<NumberFormats, Message = string>(context: CoreNumberContext<NumberFormats, Message>, value: number, key: string): string | number | Intl.NumberFormatPart[];
|
||||
|
||||
export declare function number<NumberFormats, Message = string>(context: CoreNumberContext<NumberFormats, Message>, value: number, key: string, locale: Locale): string | number | Intl.NumberFormatPart[];
|
||||
|
||||
export declare function number<NumberFormats, Message = string>(context: CoreNumberContext<NumberFormats, Message>, value: number, options: NumberOptions): string | number | Intl.NumberFormatPart[];
|
||||
|
||||
export declare function number<NumberFormats, Message = string>(context: CoreNumberContext<NumberFormats, Message>, ...args: unknown[]): string | number | Intl.NumberFormatPart[];
|
||||
|
||||
export declare type NumberFormat = {
|
||||
[key: string]: NumberFormatOptions;
|
||||
};
|
||||
|
||||
export declare type NumberFormatOptions = Intl.NumberFormatOptions | SpecificNumberFormatOptions | CurrencyNumberFormatOptions;
|
||||
|
||||
export declare type NumberFormats = {
|
||||
[locale: string]: NumberFormat;
|
||||
};
|
||||
|
||||
export declare type NumberFormatToPartsResult = {
|
||||
[index: number]: FormattedNumberPart;
|
||||
};
|
||||
|
||||
/**
|
||||
* # number
|
||||
*
|
||||
* ## usages
|
||||
* // for example `context.numberFormats` below
|
||||
* 'en-US': {
|
||||
* 'currency': {
|
||||
* style: 'currency', currency: 'USD', currencyDisplay: 'symbol'
|
||||
* }
|
||||
* },
|
||||
* 'ja-JP: { ... }
|
||||
*
|
||||
* // value only
|
||||
* number(context, value)
|
||||
*
|
||||
* // key argument
|
||||
* number(context, value, 'currency')
|
||||
*
|
||||
* // key & locale argument
|
||||
* number(context, value, 'currency', 'ja-JP')
|
||||
*
|
||||
* // object sytle argument
|
||||
* number(context, value, { key: 'currency', locale: 'ja-JP' })
|
||||
*
|
||||
* // suppress localize miss warning option, override context.missingWarn
|
||||
* number(context, value, { key: 'currency', locale: 'ja-JP', missingWarn: false })
|
||||
*
|
||||
* // suppress localize fallback warning option, override context.fallbackWarn
|
||||
* number(context, value, { key: 'currency', locale: 'ja-JP', fallbackWarn: false })
|
||||
*
|
||||
* // if you specify `part` options, you can get an array of objects containing the formatted number in parts
|
||||
* number(context, value, { key: 'currenty', part: true })
|
||||
*
|
||||
* // orverride context.numberFormats[locale] options with functino options
|
||||
* number(cnotext, value, 'currency', { year: '2-digit' })
|
||||
* number(cnotext, value, 'currency', 'ja-JP', { year: '2-digit' })
|
||||
* number(context, value, { key: 'currenty', part: true }, { year: '2-digit'})
|
||||
*/
|
||||
/**
|
||||
* Number Options
|
||||
*
|
||||
* @remarks
|
||||
* Options for Number formatting API
|
||||
*
|
||||
* @VueI18nGeneral
|
||||
*/
|
||||
export declare interface NumberOptions {
|
||||
/**
|
||||
* @remarks
|
||||
* The target format key
|
||||
*/
|
||||
key?: string;
|
||||
/**
|
||||
* @remarks
|
||||
* The locale of localization
|
||||
*/
|
||||
locale?: Locale;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether suppress warnings outputted when localization fails
|
||||
*/
|
||||
missingWarn?: boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether do resolve on format keys when your language lacks a formatting for a key
|
||||
*/
|
||||
fallbackWarn?: boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether to use [Intel.NumberFormat#formatToParts](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/formatToParts)
|
||||
*/
|
||||
part?: boolean;
|
||||
}
|
||||
|
||||
/* Excluded from this release type: parseDateTimeArgs */
|
||||
|
||||
/* Excluded from this release type: parseNumberArgs */
|
||||
|
||||
/* Excluded from this release type: parseTranslateArgs */
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type PostTranslationHandler<Message = string> = (translated: MessageType<Message>) => MessageType<Message>;
|
||||
|
||||
export declare function registerMessageCompiler<Message>(compiler: MessageCompiler<Message>): void;
|
||||
|
||||
export declare const setAdditionalMeta: (meta: MetaInfo | null) => void;
|
||||
|
||||
export declare function setDevToolsHook(hook: IntlifyDevToolsEmitter | null): void;
|
||||
|
||||
export declare interface SpecificDateTimeFormatOptions extends Intl.DateTimeFormatOptions {
|
||||
year?: DateTimeDigital;
|
||||
month?: DateTimeDigital | DateTimeHumanReadable;
|
||||
day?: DateTimeDigital;
|
||||
hour?: DateTimeDigital;
|
||||
minute?: DateTimeDigital;
|
||||
second?: DateTimeDigital;
|
||||
weekday?: DateTimeHumanReadable;
|
||||
era?: DateTimeHumanReadable;
|
||||
timeZoneName?: 'long' | 'short';
|
||||
localeMatcher?: LocaleMatcher;
|
||||
formatMatcher?: FormatMatcher;
|
||||
}
|
||||
|
||||
export declare interface SpecificNumberFormatOptions extends Intl.NumberFormatOptions {
|
||||
style?: 'decimal' | 'percent';
|
||||
currency?: string;
|
||||
currencyDisplay?: CurrencyDisplay;
|
||||
localeMatcher?: LocaleMatcher;
|
||||
formatMatcher?: FormatMatcher;
|
||||
}
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, plural: number): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, plural: number, options: TranslateOptions): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, message: MessageFunction<Message> | string, plural: number, options: TranslateOptions): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, defaultMsg: string): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, defaultMsg: string, options: TranslateOptions): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, list: unknown[]): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, list: unknown[], plural: number): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, list: unknown[], defaultMsg: string): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, list: unknown[], options: TranslateOptions): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, message: MessageFunction<Message> | string, list: unknown[], options: TranslateOptions): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, named: NamedValue): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, named: NamedValue, plural: number): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, named: NamedValue, defaultMsg: string): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, key: Path | number, named: NamedValue, options: TranslateOptions): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, message: MessageFunction<Message> | string, named: NamedValue, options: TranslateOptions): MessageType<Message> | number;
|
||||
|
||||
export declare function translate<Messages, Message = string>(context: CoreTranslationContext<Messages, Message>, ...args: unknown[]): MessageType<Message> | number;
|
||||
|
||||
export declare const translateDevTools: (payloads: IntlifyDevToolsHookPayloads[IntlifyDevToolsHooks]) => void | null;
|
||||
|
||||
/**
|
||||
* # translate
|
||||
*
|
||||
* ## usages:
|
||||
* // for example, locale messages key
|
||||
* { 'foo.bar': 'hi {0} !' or 'hi {name} !' }
|
||||
*
|
||||
* // no argument, context & path only
|
||||
* translate(context, 'foo.bar')
|
||||
*
|
||||
* // list argument
|
||||
* translate(context, 'foo.bar', ['kazupon'])
|
||||
*
|
||||
* // named argument
|
||||
* translate(context, 'foo.bar', { name: 'kazupon' })
|
||||
*
|
||||
* // plural choice number
|
||||
* translate(context, 'foo.bar', 2)
|
||||
*
|
||||
* // plural choice number with name argument
|
||||
* translate(context, 'foo.bar', { name: 'kazupon' }, 2)
|
||||
*
|
||||
* // default message argument
|
||||
* translate(context, 'foo.bar', 'this is default message')
|
||||
*
|
||||
* // default message with named argument
|
||||
* translate(context, 'foo.bar', { name: 'kazupon' }, 'Hello {name} !')
|
||||
*
|
||||
* // use key as default message
|
||||
* translate(context, 'hi {0} !', ['kazupon'], { default: true })
|
||||
*
|
||||
* // locale option, override context.locale
|
||||
* translate(context, 'foo.bar', { name: 'kazupon' }, { locale: 'ja' })
|
||||
*
|
||||
* // suppress localize miss warning option, override context.missingWarn
|
||||
* translate(context, 'foo.bar', { name: 'kazupon' }, { missingWarn: false })
|
||||
*
|
||||
* // suppress localize fallback warning option, override context.fallbackWarn
|
||||
* translate(context, 'foo.bar', { name: 'kazupon' }, { fallbackWarn: false })
|
||||
*
|
||||
* // escape parameter option, override context.escapeParameter
|
||||
* translate(context, 'foo.bar', { name: 'kazupon' }, { escapeParameter: true })
|
||||
*/
|
||||
/**
|
||||
* Translate Options
|
||||
*
|
||||
* @remarks
|
||||
* Options for Translation API
|
||||
*
|
||||
* @VueI18nGeneral
|
||||
*/
|
||||
export declare interface TranslateOptions {
|
||||
/**
|
||||
* @remarks
|
||||
* List interpolation
|
||||
*/
|
||||
list?: unknown[];
|
||||
/**
|
||||
* @remarks
|
||||
* Named interpolation
|
||||
*/
|
||||
named?: NamedValue;
|
||||
/**
|
||||
* @remarks
|
||||
* Plulralzation choice number
|
||||
*/
|
||||
plural?: number;
|
||||
/**
|
||||
* @remarks
|
||||
* Default message when is occurred translation missing
|
||||
*/
|
||||
default?: string | boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* The locale of localization
|
||||
*/
|
||||
locale?: Locale;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether suppress warnings outputted when localization fails
|
||||
*/
|
||||
missingWarn?: boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether do template interpolation on translation keys when your language lacks a translation for a key
|
||||
*/
|
||||
fallbackWarn?: boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether do escape parameter for list or named interpolation values
|
||||
*/
|
||||
escapeParameter?: boolean;
|
||||
/**
|
||||
* @remarks
|
||||
* Whether the message has been resolved
|
||||
*/
|
||||
resolvedMessage?: boolean;
|
||||
}
|
||||
|
||||
/* Excluded from this release type: updateFallbackLocale */
|
||||
|
||||
/* Excluded from this release type: VERSION */
|
||||
|
||||
export * from "@intlify/message-resolver";
|
||||
export * from "@intlify/runtime";
|
||||
|
||||
export { }
|
||||
+2766
File diff suppressed because it is too large
Load Diff
+6
File diff suppressed because one or more lines are too long
+965
@@ -0,0 +1,965 @@
|
||||
/*!
|
||||
* @intlify/core-base v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
import { format, isString, isArray, isPlainObject, assign, isFunction, isBoolean, isRegExp, warn, isObject, escapeHtml, inBrowser, mark, measure, generateCodeFrame, generateFormatCacheKey, isNumber, isEmptyObject, isDate, getGlobalThis } from '@intlify/shared';
|
||||
import { resolveValue } from '@intlify/message-resolver';
|
||||
export * from '@intlify/message-resolver';
|
||||
import { createMessageContext } from '@intlify/runtime';
|
||||
export * from '@intlify/runtime';
|
||||
import { defaultOnError, baseCompile, createCompileError } from '@intlify/message-compiler';
|
||||
export { createCompileError } from '@intlify/message-compiler';
|
||||
import { IntlifyDevToolsHooks } from '@intlify/devtools-if';
|
||||
|
||||
let devtools = null;
|
||||
function setDevToolsHook(hook) {
|
||||
devtools = hook;
|
||||
}
|
||||
function getDevToolsHook() {
|
||||
return devtools;
|
||||
}
|
||||
function initI18nDevTools(i18n, version, meta) {
|
||||
// TODO: queue if devtools is undefined
|
||||
devtools &&
|
||||
devtools.emit(IntlifyDevToolsHooks.I18nInit, {
|
||||
timestamp: Date.now(),
|
||||
i18n,
|
||||
version,
|
||||
meta
|
||||
});
|
||||
}
|
||||
const translateDevTools = /* #__PURE__*/ createDevToolsHook(IntlifyDevToolsHooks.FunctionTranslate);
|
||||
function createDevToolsHook(hook) {
|
||||
return (payloads) => devtools && devtools.emit(hook, payloads);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
const warnMessages = {
|
||||
[0 /* NOT_FOUND_KEY */]: `Not found '{key}' key in '{locale}' locale messages.`,
|
||||
[1 /* FALLBACK_TO_TRANSLATE */]: `Fall back to translate '{key}' key with '{target}' locale.`,
|
||||
[2 /* CANNOT_FORMAT_NUMBER */]: `Cannot format a number value due to not supported Intl.NumberFormat.`,
|
||||
[3 /* FALLBACK_TO_NUMBER_FORMAT */]: `Fall back to number format '{key}' key with '{target}' locale.`,
|
||||
[4 /* CANNOT_FORMAT_DATE */]: `Cannot format a date value due to not supported Intl.DateTimeFormat.`,
|
||||
[5 /* FALLBACK_TO_DATE_FORMAT */]: `Fall back to datetime format '{key}' key with '{target}' locale.`
|
||||
};
|
||||
function getWarnMessage(code, ...args) {
|
||||
return format(warnMessages[code], ...args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Intlify core-base version
|
||||
* @internal
|
||||
*/
|
||||
const VERSION = '9.1.9';
|
||||
const NOT_REOSLVED = -1;
|
||||
const MISSING_RESOLVE_VALUE = '';
|
||||
function getDefaultLinkedModifiers() {
|
||||
return {
|
||||
upper: (val) => (isString(val) ? val.toUpperCase() : val),
|
||||
lower: (val) => (isString(val) ? val.toLowerCase() : val),
|
||||
// prettier-ignore
|
||||
capitalize: (val) => (isString(val)
|
||||
? `${val.charAt(0).toLocaleUpperCase()}${val.substr(1)}`
|
||||
: val)
|
||||
};
|
||||
}
|
||||
let _compiler;
|
||||
function registerMessageCompiler(compiler) {
|
||||
_compiler = compiler;
|
||||
}
|
||||
// Additional Meta for Intlify DevTools
|
||||
let _additionalMeta = null;
|
||||
const setAdditionalMeta = /* #__PURE__*/ (meta) => {
|
||||
_additionalMeta = meta;
|
||||
};
|
||||
const getAdditionalMeta = /* #__PURE__*/ () => _additionalMeta;
|
||||
// ID for CoreContext
|
||||
let _cid = 0;
|
||||
function createCoreContext(options = {}) {
|
||||
// setup options
|
||||
const version = isString(options.version) ? options.version : VERSION;
|
||||
const locale = isString(options.locale) ? options.locale : 'en-US';
|
||||
const fallbackLocale = isArray(options.fallbackLocale) ||
|
||||
isPlainObject(options.fallbackLocale) ||
|
||||
isString(options.fallbackLocale) ||
|
||||
options.fallbackLocale === false
|
||||
? options.fallbackLocale
|
||||
: locale;
|
||||
const messages = isPlainObject(options.messages)
|
||||
? options.messages
|
||||
: { [locale]: {} };
|
||||
const datetimeFormats = isPlainObject(options.datetimeFormats)
|
||||
? options.datetimeFormats
|
||||
: { [locale]: {} };
|
||||
const numberFormats = isPlainObject(options.numberFormats)
|
||||
? options.numberFormats
|
||||
: { [locale]: {} };
|
||||
const modifiers = assign({}, options.modifiers || {}, getDefaultLinkedModifiers());
|
||||
const pluralRules = options.pluralRules || {};
|
||||
const missing = isFunction(options.missing) ? options.missing : null;
|
||||
const missingWarn = isBoolean(options.missingWarn) || isRegExp(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: true;
|
||||
const fallbackWarn = isBoolean(options.fallbackWarn) || isRegExp(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: true;
|
||||
const fallbackFormat = !!options.fallbackFormat;
|
||||
const unresolving = !!options.unresolving;
|
||||
const postTranslation = isFunction(options.postTranslation)
|
||||
? options.postTranslation
|
||||
: null;
|
||||
const processor = isPlainObject(options.processor) ? options.processor : null;
|
||||
const warnHtmlMessage = isBoolean(options.warnHtmlMessage)
|
||||
? options.warnHtmlMessage
|
||||
: true;
|
||||
const escapeParameter = !!options.escapeParameter;
|
||||
const messageCompiler = isFunction(options.messageCompiler)
|
||||
? options.messageCompiler
|
||||
: _compiler;
|
||||
const onWarn = isFunction(options.onWarn) ? options.onWarn : warn;
|
||||
// setup internal options
|
||||
const internalOptions = options;
|
||||
const __datetimeFormatters = isObject(internalOptions.__datetimeFormatters)
|
||||
? internalOptions.__datetimeFormatters
|
||||
: new Map();
|
||||
const __numberFormatters = isObject(internalOptions.__numberFormatters)
|
||||
? internalOptions.__numberFormatters
|
||||
: new Map();
|
||||
const __meta = isObject(internalOptions.__meta) ? internalOptions.__meta : {};
|
||||
_cid++;
|
||||
const context = {
|
||||
version,
|
||||
cid: _cid,
|
||||
locale,
|
||||
fallbackLocale,
|
||||
messages,
|
||||
datetimeFormats,
|
||||
numberFormats,
|
||||
modifiers,
|
||||
pluralRules,
|
||||
missing,
|
||||
missingWarn,
|
||||
fallbackWarn,
|
||||
fallbackFormat,
|
||||
unresolving,
|
||||
postTranslation,
|
||||
processor,
|
||||
warnHtmlMessage,
|
||||
escapeParameter,
|
||||
messageCompiler,
|
||||
onWarn,
|
||||
__datetimeFormatters,
|
||||
__numberFormatters,
|
||||
__meta
|
||||
};
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production')) {
|
||||
context.__v_emitter =
|
||||
internalOptions.__v_emitter != null
|
||||
? internalOptions.__v_emitter
|
||||
: undefined;
|
||||
}
|
||||
// NOTE: experimental !!
|
||||
if ((process.env.NODE_ENV !== 'production') || __INTLIFY_PROD_DEVTOOLS__) {
|
||||
initI18nDevTools(context, version, __meta);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
/** @internal */
|
||||
function isTranslateFallbackWarn(fallback, key) {
|
||||
return fallback instanceof RegExp ? fallback.test(key) : fallback;
|
||||
}
|
||||
/** @internal */
|
||||
function isTranslateMissingWarn(missing, key) {
|
||||
return missing instanceof RegExp ? missing.test(key) : missing;
|
||||
}
|
||||
/** @internal */
|
||||
function handleMissing(context, key, locale, missingWarn, type) {
|
||||
const { missing, onWarn } = context;
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production')) {
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("missing" /* MISSING */, {
|
||||
locale,
|
||||
key,
|
||||
type,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
if (missing !== null) {
|
||||
const ret = missing(context, locale, key, type);
|
||||
return isString(ret) ? ret : key;
|
||||
}
|
||||
else {
|
||||
if ((process.env.NODE_ENV !== 'production') && isTranslateMissingWarn(missingWarn, key)) {
|
||||
onWarn(getWarnMessage(0 /* NOT_FOUND_KEY */, { key, locale }));
|
||||
}
|
||||
return key;
|
||||
}
|
||||
}
|
||||
/** @internal */
|
||||
function getLocaleChain(ctx, fallback, start) {
|
||||
const context = ctx;
|
||||
if (!context.__localeChainCache) {
|
||||
context.__localeChainCache = new Map();
|
||||
}
|
||||
let chain = context.__localeChainCache.get(start);
|
||||
if (!chain) {
|
||||
chain = [];
|
||||
// first block defined by start
|
||||
let block = [start];
|
||||
// while any intervening block found
|
||||
while (isArray(block)) {
|
||||
block = appendBlockToChain(chain, block, fallback);
|
||||
}
|
||||
// prettier-ignore
|
||||
// last block defined by default
|
||||
const defaults = isArray(fallback)
|
||||
? fallback
|
||||
: isPlainObject(fallback)
|
||||
? fallback['default']
|
||||
? fallback['default']
|
||||
: null
|
||||
: fallback;
|
||||
// convert defaults to array
|
||||
block = isString(defaults) ? [defaults] : defaults;
|
||||
if (isArray(block)) {
|
||||
appendBlockToChain(chain, block, false);
|
||||
}
|
||||
context.__localeChainCache.set(start, chain);
|
||||
}
|
||||
return chain;
|
||||
}
|
||||
function appendBlockToChain(chain, block, blocks) {
|
||||
let follow = true;
|
||||
for (let i = 0; i < block.length && isBoolean(follow); i++) {
|
||||
const locale = block[i];
|
||||
if (isString(locale)) {
|
||||
follow = appendLocaleToChain(chain, block[i], blocks);
|
||||
}
|
||||
}
|
||||
return follow;
|
||||
}
|
||||
function appendLocaleToChain(chain, locale, blocks) {
|
||||
let follow;
|
||||
const tokens = locale.split('-');
|
||||
do {
|
||||
const target = tokens.join('-');
|
||||
follow = appendItemToChain(chain, target, blocks);
|
||||
tokens.splice(-1, 1);
|
||||
} while (tokens.length && follow === true);
|
||||
return follow;
|
||||
}
|
||||
function appendItemToChain(chain, target, blocks) {
|
||||
let follow = false;
|
||||
if (!chain.includes(target)) {
|
||||
follow = true;
|
||||
if (target) {
|
||||
follow = target[target.length - 1] !== '!';
|
||||
const locale = target.replace(/!/g, '');
|
||||
chain.push(locale);
|
||||
if ((isArray(blocks) || isPlainObject(blocks)) &&
|
||||
blocks[locale] // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
follow = blocks[locale];
|
||||
}
|
||||
}
|
||||
}
|
||||
return follow;
|
||||
}
|
||||
/** @internal */
|
||||
function updateFallbackLocale(ctx, locale, fallback) {
|
||||
const context = ctx;
|
||||
context.__localeChainCache = new Map();
|
||||
getLocaleChain(ctx, fallback, locale);
|
||||
}
|
||||
|
||||
const RE_HTML_TAG = /<\/?[\w\s="/.':;#-\/]+>/;
|
||||
const WARN_MESSAGE = `Detected HTML in '{source}' message. Recommend not using HTML messages to avoid XSS.`;
|
||||
function checkHtmlMessage(source, options) {
|
||||
const warnHtmlMessage = isBoolean(options.warnHtmlMessage)
|
||||
? options.warnHtmlMessage
|
||||
: true;
|
||||
if (warnHtmlMessage && RE_HTML_TAG.test(source)) {
|
||||
warn(format(WARN_MESSAGE, { source }));
|
||||
}
|
||||
}
|
||||
const defaultOnCacheKey = (source) => source;
|
||||
let compileCache = Object.create(null);
|
||||
function clearCompileCache() {
|
||||
compileCache = Object.create(null);
|
||||
}
|
||||
function compileToFunction(source, options = {}) {
|
||||
{
|
||||
// check HTML message
|
||||
(process.env.NODE_ENV !== 'production') && checkHtmlMessage(source, options);
|
||||
// check caches
|
||||
const onCacheKey = options.onCacheKey || defaultOnCacheKey;
|
||||
const key = onCacheKey(source);
|
||||
const cached = compileCache[key];
|
||||
if (cached) {
|
||||
return cached;
|
||||
}
|
||||
// compile error detecting
|
||||
let occurred = false;
|
||||
const onError = options.onError || defaultOnError;
|
||||
options.onError = (err) => {
|
||||
occurred = true;
|
||||
onError(err);
|
||||
};
|
||||
// compile
|
||||
const { code } = baseCompile(source, options);
|
||||
// evaluate function
|
||||
const msg = new Function(`return ${code}`)();
|
||||
// if occurred compile error, don't cache
|
||||
return !occurred ? (compileCache[key] = msg) : msg;
|
||||
}
|
||||
}
|
||||
|
||||
function createCoreError(code) {
|
||||
return createCompileError(code, null, (process.env.NODE_ENV !== 'production') ? { messages: errorMessages } : undefined);
|
||||
}
|
||||
/** @internal */
|
||||
const errorMessages = {
|
||||
[14 /* INVALID_ARGUMENT */]: 'Invalid arguments',
|
||||
[15 /* INVALID_DATE_ARGUMENT */]: 'The date provided is an invalid Date object.' +
|
||||
'Make sure your Date represents a valid date.',
|
||||
[16 /* INVALID_ISO_DATE_ARGUMENT */]: 'The argument provided is not a valid ISO date string'
|
||||
};
|
||||
|
||||
const NOOP_MESSAGE_FUNCTION = () => '';
|
||||
const isMessageFunction = (val) => isFunction(val);
|
||||
// implementation of `translate` function
|
||||
function translate(context, ...args) {
|
||||
const { fallbackFormat, postTranslation, unresolving, fallbackLocale, messages } = context;
|
||||
const [key, options] = parseTranslateArgs(...args);
|
||||
const missingWarn = isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
const fallbackWarn = isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const escapeParameter = isBoolean(options.escapeParameter)
|
||||
? options.escapeParameter
|
||||
: context.escapeParameter;
|
||||
const resolvedMessage = !!options.resolvedMessage;
|
||||
// prettier-ignore
|
||||
const defaultMsgOrKey = isString(options.default) || isBoolean(options.default) // default by function option
|
||||
? !isBoolean(options.default)
|
||||
? options.default
|
||||
: key
|
||||
: fallbackFormat // default by `fallbackFormat` option
|
||||
? key
|
||||
: '';
|
||||
const enableDefaultMsg = fallbackFormat || defaultMsgOrKey !== '';
|
||||
const locale = isString(options.locale) ? options.locale : context.locale;
|
||||
// escape params
|
||||
escapeParameter && escapeParams(options);
|
||||
// resolve message format
|
||||
// eslint-disable-next-line prefer-const
|
||||
let [format, targetLocale, message] = !resolvedMessage
|
||||
? resolveMessageFormat(context, key, locale, fallbackLocale, fallbackWarn, missingWarn)
|
||||
: [
|
||||
key,
|
||||
locale,
|
||||
messages[locale] || {}
|
||||
];
|
||||
// if you use default message, set it as message format!
|
||||
let cacheBaseKey = key;
|
||||
if (!resolvedMessage &&
|
||||
!(isString(format) || isMessageFunction(format))) {
|
||||
if (enableDefaultMsg) {
|
||||
format = defaultMsgOrKey;
|
||||
cacheBaseKey = format;
|
||||
}
|
||||
}
|
||||
// checking message format and target locale
|
||||
if (!resolvedMessage &&
|
||||
(!(isString(format) || isMessageFunction(format)) ||
|
||||
!isString(targetLocale))) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
if ((process.env.NODE_ENV !== 'production') && isString(format) && context.messageCompiler == null) {
|
||||
warn(`The message format compilation is not supported in this build. ` +
|
||||
`Because message compiler isn't included. ` +
|
||||
`You need to pre-compilation all message format. ` +
|
||||
`So translate function return '${key}'.`);
|
||||
return key;
|
||||
}
|
||||
// setup compile error detecting
|
||||
let occurred = false;
|
||||
const errorDetector = () => {
|
||||
occurred = true;
|
||||
};
|
||||
// compile message format
|
||||
const msg = !isMessageFunction(format)
|
||||
? compileMessageFormat(context, key, targetLocale, format, cacheBaseKey, errorDetector)
|
||||
: format;
|
||||
// if occurred compile error, return the message format
|
||||
if (occurred) {
|
||||
return format;
|
||||
}
|
||||
// evaluate message with context
|
||||
const ctxOptions = getMessageContextOptions(context, targetLocale, message, options);
|
||||
const msgContext = createMessageContext(ctxOptions);
|
||||
const messaged = evaluateMessage(context, msg, msgContext);
|
||||
// if use post translation option, proceed it with handler
|
||||
const ret = postTranslation ? postTranslation(messaged) : messaged;
|
||||
// NOTE: experimental !!
|
||||
if ((process.env.NODE_ENV !== 'production') || __INTLIFY_PROD_DEVTOOLS__) {
|
||||
// prettier-ignore
|
||||
const payloads = {
|
||||
timestamp: Date.now(),
|
||||
key: isString(key)
|
||||
? key
|
||||
: isMessageFunction(format)
|
||||
? format.key
|
||||
: '',
|
||||
locale: targetLocale || (isMessageFunction(format)
|
||||
? format.locale
|
||||
: ''),
|
||||
format: isString(format)
|
||||
? format
|
||||
: isMessageFunction(format)
|
||||
? format.source
|
||||
: '',
|
||||
message: ret
|
||||
};
|
||||
payloads.meta = assign({}, context.__meta, getAdditionalMeta() || {});
|
||||
translateDevTools(payloads);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
function escapeParams(options) {
|
||||
if (isArray(options.list)) {
|
||||
options.list = options.list.map(item => isString(item) ? escapeHtml(item) : item);
|
||||
}
|
||||
else if (isObject(options.named)) {
|
||||
Object.keys(options.named).forEach(key => {
|
||||
if (isString(options.named[key])) {
|
||||
options.named[key] = escapeHtml(options.named[key]);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
function resolveMessageFormat(context, key, locale, fallbackLocale, fallbackWarn, missingWarn) {
|
||||
const { messages, onWarn } = context;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
let message = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
let from = locale;
|
||||
let to = null;
|
||||
const type = 'translate';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = to = locales[i];
|
||||
if ((process.env.NODE_ENV !== 'production') &&
|
||||
locale !== targetLocale &&
|
||||
isTranslateFallbackWarn(fallbackWarn, key)) {
|
||||
onWarn(getWarnMessage(1 /* FALLBACK_TO_TRANSLATE */, {
|
||||
key,
|
||||
target: targetLocale
|
||||
}));
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production') && locale !== targetLocale) {
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("fallback" /* FALBACK */, {
|
||||
type,
|
||||
key,
|
||||
from,
|
||||
to,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
message =
|
||||
messages[targetLocale] || {};
|
||||
// for vue-devtools timeline event
|
||||
let start = null;
|
||||
let startTag;
|
||||
let endTag;
|
||||
if ((process.env.NODE_ENV !== 'production') && inBrowser) {
|
||||
start = window.performance.now();
|
||||
startTag = 'intlify-message-resolve-start';
|
||||
endTag = 'intlify-message-resolve-end';
|
||||
mark && mark(startTag);
|
||||
}
|
||||
if ((format = resolveValue(message, key)) === null) {
|
||||
// if null, resolve with object key path
|
||||
format = message[key]; // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production') && inBrowser) {
|
||||
const end = window.performance.now();
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter && start && format) {
|
||||
emitter.emit("message-resolve" /* MESSAGE_RESOLVE */, {
|
||||
type: "message-resolve" /* MESSAGE_RESOLVE */,
|
||||
key,
|
||||
message: format,
|
||||
time: end - start,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
if (startTag && endTag && mark && measure) {
|
||||
mark(endTag);
|
||||
measure('intlify message resolve', startTag, endTag);
|
||||
}
|
||||
}
|
||||
if (isString(format) || isFunction(format))
|
||||
break;
|
||||
const missingRet = handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
if (missingRet !== key) {
|
||||
format = missingRet;
|
||||
}
|
||||
from = to;
|
||||
}
|
||||
return [format, targetLocale, message];
|
||||
}
|
||||
function compileMessageFormat(context, key, targetLocale, format, cacheBaseKey, errorDetector) {
|
||||
const { messageCompiler, warnHtmlMessage } = context;
|
||||
if (isMessageFunction(format)) {
|
||||
const msg = format;
|
||||
msg.locale = msg.locale || targetLocale;
|
||||
msg.key = msg.key || key;
|
||||
return msg;
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
let start = null;
|
||||
let startTag;
|
||||
let endTag;
|
||||
if ((process.env.NODE_ENV !== 'production') && inBrowser) {
|
||||
start = window.performance.now();
|
||||
startTag = 'intlify-message-compilation-start';
|
||||
endTag = 'intlify-message-compilation-end';
|
||||
mark && mark(startTag);
|
||||
}
|
||||
const msg = messageCompiler(format, getCompileOptions(context, targetLocale, cacheBaseKey, format, warnHtmlMessage, errorDetector));
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production') && inBrowser) {
|
||||
const end = window.performance.now();
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter && start) {
|
||||
emitter.emit("message-compilation" /* MESSAGE_COMPILATION */, {
|
||||
type: "message-compilation" /* MESSAGE_COMPILATION */,
|
||||
message: format,
|
||||
time: end - start,
|
||||
groupId: `${'translate'}:${key}`
|
||||
});
|
||||
}
|
||||
if (startTag && endTag && mark && measure) {
|
||||
mark(endTag);
|
||||
measure('intlify message compilation', startTag, endTag);
|
||||
}
|
||||
}
|
||||
msg.locale = targetLocale;
|
||||
msg.key = key;
|
||||
msg.source = format;
|
||||
return msg;
|
||||
}
|
||||
function evaluateMessage(context, msg, msgCtx) {
|
||||
// for vue-devtools timeline event
|
||||
let start = null;
|
||||
let startTag;
|
||||
let endTag;
|
||||
if ((process.env.NODE_ENV !== 'production') && inBrowser) {
|
||||
start = window.performance.now();
|
||||
startTag = 'intlify-message-evaluation-start';
|
||||
endTag = 'intlify-message-evaluation-end';
|
||||
mark && mark(startTag);
|
||||
}
|
||||
const messaged = msg(msgCtx);
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production') && inBrowser) {
|
||||
const end = window.performance.now();
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter && start) {
|
||||
emitter.emit("message-evaluation" /* MESSAGE_EVALUATION */, {
|
||||
type: "message-evaluation" /* MESSAGE_EVALUATION */,
|
||||
value: messaged,
|
||||
time: end - start,
|
||||
groupId: `${'translate'}:${msg.key}`
|
||||
});
|
||||
}
|
||||
if (startTag && endTag && mark && measure) {
|
||||
mark(endTag);
|
||||
measure('intlify message evaluation', startTag, endTag);
|
||||
}
|
||||
}
|
||||
return messaged;
|
||||
}
|
||||
/** @internal */
|
||||
function parseTranslateArgs(...args) {
|
||||
const [arg1, arg2, arg3] = args;
|
||||
const options = {};
|
||||
if (!isString(arg1) && !isNumber(arg1) && !isMessageFunction(arg1)) {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
// prettier-ignore
|
||||
const key = isNumber(arg1)
|
||||
? String(arg1)
|
||||
: isMessageFunction(arg1)
|
||||
? arg1
|
||||
: arg1;
|
||||
if (isNumber(arg2)) {
|
||||
options.plural = arg2;
|
||||
}
|
||||
else if (isString(arg2)) {
|
||||
options.default = arg2;
|
||||
}
|
||||
else if (isPlainObject(arg2) && !isEmptyObject(arg2)) {
|
||||
options.named = arg2;
|
||||
}
|
||||
else if (isArray(arg2)) {
|
||||
options.list = arg2;
|
||||
}
|
||||
if (isNumber(arg3)) {
|
||||
options.plural = arg3;
|
||||
}
|
||||
else if (isString(arg3)) {
|
||||
options.default = arg3;
|
||||
}
|
||||
else if (isPlainObject(arg3)) {
|
||||
assign(options, arg3);
|
||||
}
|
||||
return [key, options];
|
||||
}
|
||||
function getCompileOptions(context, locale, key, source, warnHtmlMessage, errorDetector) {
|
||||
return {
|
||||
warnHtmlMessage,
|
||||
onError: (err) => {
|
||||
errorDetector && errorDetector(err);
|
||||
if ((process.env.NODE_ENV !== 'production')) {
|
||||
const message = `Message compilation error: ${err.message}`;
|
||||
const codeFrame = err.location &&
|
||||
generateCodeFrame(source, err.location.start.offset, err.location.end.offset);
|
||||
const emitter = context
|
||||
.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("compile-error" /* COMPILE_ERROR */, {
|
||||
message: source,
|
||||
error: err.message,
|
||||
start: err.location && err.location.start.offset,
|
||||
end: err.location && err.location.end.offset,
|
||||
groupId: `${'translate'}:${key}`
|
||||
});
|
||||
}
|
||||
console.error(codeFrame ? `${message}\n${codeFrame}` : message);
|
||||
}
|
||||
else {
|
||||
throw err;
|
||||
}
|
||||
},
|
||||
onCacheKey: (source) => generateFormatCacheKey(locale, key, source)
|
||||
};
|
||||
}
|
||||
function getMessageContextOptions(context, locale, message, options) {
|
||||
const { modifiers, pluralRules } = context;
|
||||
const resolveMessage = (key) => {
|
||||
const val = resolveValue(message, key);
|
||||
if (isString(val)) {
|
||||
let occurred = false;
|
||||
const errorDetector = () => {
|
||||
occurred = true;
|
||||
};
|
||||
const msg = compileMessageFormat(context, key, locale, val, key, errorDetector);
|
||||
return !occurred
|
||||
? msg
|
||||
: NOOP_MESSAGE_FUNCTION;
|
||||
}
|
||||
else if (isMessageFunction(val)) {
|
||||
return val;
|
||||
}
|
||||
else {
|
||||
// TODO: should be implemented warning message
|
||||
return NOOP_MESSAGE_FUNCTION;
|
||||
}
|
||||
};
|
||||
const ctxOptions = {
|
||||
locale,
|
||||
modifiers,
|
||||
pluralRules,
|
||||
messages: resolveMessage
|
||||
};
|
||||
if (context.processor) {
|
||||
ctxOptions.processor = context.processor;
|
||||
}
|
||||
if (options.list) {
|
||||
ctxOptions.list = options.list;
|
||||
}
|
||||
if (options.named) {
|
||||
ctxOptions.named = options.named;
|
||||
}
|
||||
if (isNumber(options.plural)) {
|
||||
ctxOptions.pluralIndex = options.plural;
|
||||
}
|
||||
return ctxOptions;
|
||||
}
|
||||
|
||||
const intlDefined = typeof Intl !== 'undefined';
|
||||
const Availabilities = {
|
||||
dateTimeFormat: intlDefined && typeof Intl.DateTimeFormat !== 'undefined',
|
||||
numberFormat: intlDefined && typeof Intl.NumberFormat !== 'undefined'
|
||||
};
|
||||
|
||||
// implementation of `datetime` function
|
||||
function datetime(context, ...args) {
|
||||
const { datetimeFormats, unresolving, fallbackLocale, onWarn } = context;
|
||||
const { __datetimeFormatters } = context;
|
||||
if ((process.env.NODE_ENV !== 'production') && !Availabilities.dateTimeFormat) {
|
||||
onWarn(getWarnMessage(4 /* CANNOT_FORMAT_DATE */));
|
||||
return MISSING_RESOLVE_VALUE;
|
||||
}
|
||||
const [key, value, options, overrides] = parseDateTimeArgs(...args);
|
||||
const missingWarn = isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
const fallbackWarn = isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const part = !!options.part;
|
||||
const locale = isString(options.locale) ? options.locale : context.locale;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
if (!isString(key) || key === '') {
|
||||
return new Intl.DateTimeFormat(locale).format(value);
|
||||
}
|
||||
// resolve format
|
||||
let datetimeFormat = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
let from = locale;
|
||||
let to = null;
|
||||
const type = 'datetime format';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = to = locales[i];
|
||||
if ((process.env.NODE_ENV !== 'production') &&
|
||||
locale !== targetLocale &&
|
||||
isTranslateFallbackWarn(fallbackWarn, key)) {
|
||||
onWarn(getWarnMessage(5 /* FALLBACK_TO_DATE_FORMAT */, {
|
||||
key,
|
||||
target: targetLocale
|
||||
}));
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production') && locale !== targetLocale) {
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("fallback" /* FALBACK */, {
|
||||
type,
|
||||
key,
|
||||
from,
|
||||
to,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
datetimeFormat =
|
||||
datetimeFormats[targetLocale] || {};
|
||||
format = datetimeFormat[key];
|
||||
if (isPlainObject(format))
|
||||
break;
|
||||
handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
from = to;
|
||||
}
|
||||
// checking format and target locale
|
||||
if (!isPlainObject(format) || !isString(targetLocale)) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
let id = `${targetLocale}__${key}`;
|
||||
if (!isEmptyObject(overrides)) {
|
||||
id = `${id}__${JSON.stringify(overrides)}`;
|
||||
}
|
||||
let formatter = __datetimeFormatters.get(id);
|
||||
if (!formatter) {
|
||||
formatter = new Intl.DateTimeFormat(targetLocale, assign({}, format, overrides));
|
||||
__datetimeFormatters.set(id, formatter);
|
||||
}
|
||||
return !part ? formatter.format(value) : formatter.formatToParts(value);
|
||||
}
|
||||
/** @internal */
|
||||
function parseDateTimeArgs(...args) {
|
||||
const [arg1, arg2, arg3, arg4] = args;
|
||||
let options = {};
|
||||
let overrides = {};
|
||||
let value;
|
||||
if (isString(arg1)) {
|
||||
// Only allow ISO strings - other date formats are often supported,
|
||||
// but may cause different results in different browsers.
|
||||
if (!/\d{4}-\d{2}-\d{2}(T.*)?/.test(arg1)) {
|
||||
throw createCoreError(16 /* INVALID_ISO_DATE_ARGUMENT */);
|
||||
}
|
||||
value = new Date(arg1);
|
||||
try {
|
||||
// This will fail if the date is not valid
|
||||
value.toISOString();
|
||||
}
|
||||
catch (e) {
|
||||
throw createCoreError(16 /* INVALID_ISO_DATE_ARGUMENT */);
|
||||
}
|
||||
}
|
||||
else if (isDate(arg1)) {
|
||||
if (isNaN(arg1.getTime())) {
|
||||
throw createCoreError(15 /* INVALID_DATE_ARGUMENT */);
|
||||
}
|
||||
value = arg1;
|
||||
}
|
||||
else if (isNumber(arg1)) {
|
||||
value = arg1;
|
||||
}
|
||||
else {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
if (isString(arg2)) {
|
||||
options.key = arg2;
|
||||
}
|
||||
else if (isPlainObject(arg2)) {
|
||||
options = arg2;
|
||||
}
|
||||
if (isString(arg3)) {
|
||||
options.locale = arg3;
|
||||
}
|
||||
else if (isPlainObject(arg3)) {
|
||||
overrides = arg3;
|
||||
}
|
||||
if (isPlainObject(arg4)) {
|
||||
overrides = arg4;
|
||||
}
|
||||
return [options.key || '', value, options, overrides];
|
||||
}
|
||||
/** @internal */
|
||||
function clearDateTimeFormat(ctx, locale, format) {
|
||||
const context = ctx;
|
||||
for (const key in format) {
|
||||
const id = `${locale}__${key}`;
|
||||
if (!context.__datetimeFormatters.has(id)) {
|
||||
continue;
|
||||
}
|
||||
context.__datetimeFormatters.delete(id);
|
||||
}
|
||||
}
|
||||
|
||||
// implementation of `number` function
|
||||
function number(context, ...args) {
|
||||
const { numberFormats, unresolving, fallbackLocale, onWarn } = context;
|
||||
const { __numberFormatters } = context;
|
||||
if ((process.env.NODE_ENV !== 'production') && !Availabilities.numberFormat) {
|
||||
onWarn(getWarnMessage(2 /* CANNOT_FORMAT_NUMBER */));
|
||||
return MISSING_RESOLVE_VALUE;
|
||||
}
|
||||
const [key, value, options, overrides] = parseNumberArgs(...args);
|
||||
const missingWarn = isBoolean(options.missingWarn)
|
||||
? options.missingWarn
|
||||
: context.missingWarn;
|
||||
const fallbackWarn = isBoolean(options.fallbackWarn)
|
||||
? options.fallbackWarn
|
||||
: context.fallbackWarn;
|
||||
const part = !!options.part;
|
||||
const locale = isString(options.locale) ? options.locale : context.locale;
|
||||
const locales = getLocaleChain(context, fallbackLocale, locale);
|
||||
if (!isString(key) || key === '') {
|
||||
return new Intl.NumberFormat(locale).format(value);
|
||||
}
|
||||
// resolve format
|
||||
let numberFormat = {};
|
||||
let targetLocale;
|
||||
let format = null;
|
||||
let from = locale;
|
||||
let to = null;
|
||||
const type = 'number format';
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
targetLocale = to = locales[i];
|
||||
if ((process.env.NODE_ENV !== 'production') &&
|
||||
locale !== targetLocale &&
|
||||
isTranslateFallbackWarn(fallbackWarn, key)) {
|
||||
onWarn(getWarnMessage(3 /* FALLBACK_TO_NUMBER_FORMAT */, {
|
||||
key,
|
||||
target: targetLocale
|
||||
}));
|
||||
}
|
||||
// for vue-devtools timeline event
|
||||
if ((process.env.NODE_ENV !== 'production') && locale !== targetLocale) {
|
||||
const emitter = context.__v_emitter;
|
||||
if (emitter) {
|
||||
emitter.emit("fallback" /* FALBACK */, {
|
||||
type,
|
||||
key,
|
||||
from,
|
||||
to,
|
||||
groupId: `${type}:${key}`
|
||||
});
|
||||
}
|
||||
}
|
||||
numberFormat =
|
||||
numberFormats[targetLocale] || {};
|
||||
format = numberFormat[key];
|
||||
if (isPlainObject(format))
|
||||
break;
|
||||
handleMissing(context, key, targetLocale, missingWarn, type);
|
||||
from = to;
|
||||
}
|
||||
// checking format and target locale
|
||||
if (!isPlainObject(format) || !isString(targetLocale)) {
|
||||
return unresolving ? NOT_REOSLVED : key;
|
||||
}
|
||||
let id = `${targetLocale}__${key}`;
|
||||
if (!isEmptyObject(overrides)) {
|
||||
id = `${id}__${JSON.stringify(overrides)}`;
|
||||
}
|
||||
let formatter = __numberFormatters.get(id);
|
||||
if (!formatter) {
|
||||
formatter = new Intl.NumberFormat(targetLocale, assign({}, format, overrides));
|
||||
__numberFormatters.set(id, formatter);
|
||||
}
|
||||
return !part ? formatter.format(value) : formatter.formatToParts(value);
|
||||
}
|
||||
/** @internal */
|
||||
function parseNumberArgs(...args) {
|
||||
const [arg1, arg2, arg3, arg4] = args;
|
||||
let options = {};
|
||||
let overrides = {};
|
||||
if (!isNumber(arg1)) {
|
||||
throw createCoreError(14 /* INVALID_ARGUMENT */);
|
||||
}
|
||||
const value = arg1;
|
||||
if (isString(arg2)) {
|
||||
options.key = arg2;
|
||||
}
|
||||
else if (isPlainObject(arg2)) {
|
||||
options = arg2;
|
||||
}
|
||||
if (isString(arg3)) {
|
||||
options.locale = arg3;
|
||||
}
|
||||
else if (isPlainObject(arg3)) {
|
||||
overrides = arg3;
|
||||
}
|
||||
if (isPlainObject(arg4)) {
|
||||
overrides = arg4;
|
||||
}
|
||||
return [options.key || '', value, options, overrides];
|
||||
}
|
||||
/** @internal */
|
||||
function clearNumberFormat(ctx, locale, format) {
|
||||
const context = ctx;
|
||||
for (const key in format) {
|
||||
const id = `${locale}__${key}`;
|
||||
if (!context.__numberFormatters.has(id)) {
|
||||
continue;
|
||||
}
|
||||
context.__numberFormatters.delete(id);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
if (typeof __INTLIFY_PROD_DEVTOOLS__ !== 'boolean') {
|
||||
getGlobalThis().__INTLIFY_PROD_DEVTOOLS__ = false;
|
||||
}
|
||||
}
|
||||
|
||||
export { MISSING_RESOLVE_VALUE, NOT_REOSLVED, VERSION, clearCompileCache, clearDateTimeFormat, clearNumberFormat, compileToFunction, createCoreContext, createCoreError, datetime, getAdditionalMeta, getDevToolsHook, getLocaleChain, getWarnMessage, handleMissing, initI18nDevTools, isMessageFunction, isTranslateFallbackWarn, isTranslateMissingWarn, number, parseDateTimeArgs, parseNumberArgs, parseTranslateArgs, registerMessageCompiler, setAdditionalMeta, setDevToolsHook, translate, translateDevTools, updateFallbackLocale };
|
||||
+2809
File diff suppressed because it is too large
Load Diff
+6
File diff suppressed because one or more lines are too long
+7
@@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./dist/core-base.cjs.prod.js')
|
||||
} else {
|
||||
module.exports = require('./dist/core-base.cjs.js')
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "@intlify/core-base",
|
||||
"version": "9.1.9",
|
||||
"description": "@intlify/core-base",
|
||||
"keywords": [
|
||||
"core",
|
||||
"fundamental",
|
||||
"i18n",
|
||||
"internationalization",
|
||||
"intlify"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "kazuya kawaguchi",
|
||||
"email": "kawakazu80@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/intlify/vue-i18n-next/tree/master/packages/core-base#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/intlify/vue-i18n-next.git",
|
||||
"directory": "packages/core"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/intlify/vue-i18n-next/issues"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"dist"
|
||||
],
|
||||
"main": "index.js",
|
||||
"module": "dist/core-base.esm-bundler.js",
|
||||
"unpkg": "dist/core-base.global.js",
|
||||
"jsdelivr": "dist/core-base.global.js",
|
||||
"types": "dist/core-base.d.ts",
|
||||
"dependencies": {
|
||||
"@intlify/devtools-if": "9.1.9",
|
||||
"@intlify/message-compiler": "9.1.9",
|
||||
"@intlify/message-resolver": "9.1.9",
|
||||
"@intlify/runtime": "9.1.9",
|
||||
"@intlify/shared": "9.1.9",
|
||||
"@intlify/vue-devtools": "9.1.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"buildOptions": {
|
||||
"name": "IntlifyCoreBase",
|
||||
"formats": [
|
||||
"esm-bundler",
|
||||
"esm-browser",
|
||||
"cjs",
|
||||
"global"
|
||||
]
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2021 kazuya kawaguchi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
# @intlify/devtools-if
|
||||
|
||||
The [`@intlify/devtools`](https://github.com/intlify/devtools) interface(I/F:if) for intlify projects
|
||||
|
||||
## :warning: NOTE:
|
||||
|
||||
This is experimental.
|
||||
|
||||
Don’t use in production yet.
|
||||
|
||||
## :copyright: License
|
||||
|
||||
[MIT](http://opensource.org/licenses/MIT)
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
/*!
|
||||
* @intlify/devtools-if v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
const IntlifyDevToolsHooks = {
|
||||
I18nInit: 'i18n:init',
|
||||
FunctionTranslate: 'function:translate'
|
||||
};
|
||||
|
||||
exports.IntlifyDevToolsHooks = IntlifyDevToolsHooks;
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
/*!
|
||||
* @intlify/devtools-if v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
const IntlifyDevToolsHooks = {
|
||||
I18nInit: 'i18n:init',
|
||||
FunctionTranslate: 'function:translate'
|
||||
};
|
||||
|
||||
exports.IntlifyDevToolsHooks = IntlifyDevToolsHooks;
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
import type { Emittable } from '@intlify/shared';
|
||||
|
||||
export declare type AdditionalPayloads = {
|
||||
meta?: Record<string, unknown>;
|
||||
};
|
||||
|
||||
export declare type IntlifyDevToolsEmitter = Emittable<IntlifyDevToolsEmitterHooks>;
|
||||
|
||||
export declare type IntlifyDevToolsEmitterHooks = {
|
||||
[IntlifyDevToolsHooks.I18nInit]: IntlifyDevToolsHookPayloads[typeof IntlifyDevToolsHooks.I18nInit];
|
||||
[IntlifyDevToolsHooks.FunctionTranslate]: IntlifyDevToolsHookPayloads[typeof IntlifyDevToolsHooks.FunctionTranslate];
|
||||
};
|
||||
|
||||
export declare type IntlifyDevToolsHookPayloads = {
|
||||
[IntlifyDevToolsHooks.I18nInit]: {
|
||||
timestamp: number;
|
||||
i18n: unknown;
|
||||
version: string;
|
||||
} & AdditionalPayloads;
|
||||
[IntlifyDevToolsHooks.FunctionTranslate]: {
|
||||
timestamp: number;
|
||||
message: string | number;
|
||||
key: string;
|
||||
locale: string;
|
||||
format?: string;
|
||||
} & AdditionalPayloads;
|
||||
};
|
||||
|
||||
export declare const IntlifyDevToolsHooks: {
|
||||
readonly I18nInit: "i18n:init";
|
||||
readonly FunctionTranslate: "function:translate";
|
||||
};
|
||||
|
||||
export declare type IntlifyDevToolsHooks = typeof IntlifyDevToolsHooks[keyof typeof IntlifyDevToolsHooks];
|
||||
|
||||
export declare interface IntlifyRecord {
|
||||
id: number;
|
||||
i18n: unknown;
|
||||
version: string;
|
||||
types: Record<string, string | Symbol>;
|
||||
}
|
||||
|
||||
export { }
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
/*!
|
||||
* @intlify/devtools-if v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
const IntlifyDevToolsHooks = {
|
||||
I18nInit: 'i18n:init',
|
||||
FunctionTranslate: 'function:translate'
|
||||
};
|
||||
|
||||
export { IntlifyDevToolsHooks };
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./dist/devtools-if.cjs.prod.js')
|
||||
} else {
|
||||
module.exports = require('./dist/devtools-if.cjs.js')
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"name": "@intlify/devtools-if",
|
||||
"version": "9.1.9",
|
||||
"description": "@intlify/devtools-if",
|
||||
"keywords": [
|
||||
"devtools",
|
||||
"i18n",
|
||||
"internationalization",
|
||||
"intlify"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "kazuya kawaguchi",
|
||||
"email": "kawakazu80@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/intlify/vue-i18n-next/tree/master/packages/devtools-if#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/intlify/vue-i18n-next.git",
|
||||
"directory": "packages/devtools-if"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/intlify/vue-i18n-next/issues"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"dist"
|
||||
],
|
||||
"main": "index.js",
|
||||
"module": "dist/devtools-if.esm-bundler.js",
|
||||
"types": "dist/devtools-if.d.ts",
|
||||
"dependencies": {
|
||||
"@intlify/shared": "9.1.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"buildOptions": {
|
||||
"name": "IntlifyDevToolsIf",
|
||||
"formats": [
|
||||
"esm-bundler",
|
||||
"cjs"
|
||||
]
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020 kazuya kawaguchi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
# @intlify/message-compiler
|
||||
|
||||
The message compiler for intlify project
|
||||
|
||||
## :copyright: License
|
||||
|
||||
[MIT](http://opensource.org/licenses/MIT)
|
||||
+1395
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+1390
File diff suppressed because it is too large
Load Diff
+197
@@ -0,0 +1,197 @@
|
||||
import { RawSourceMap } from 'source-map';
|
||||
|
||||
export declare function baseCompile(source: string, options?: CompileOptions): CodeGenResult;
|
||||
|
||||
export declare interface CodeGenOptions {
|
||||
mode?: 'normal' | 'arrow';
|
||||
breakLineCode?: '\n' | ';';
|
||||
needIndent?: boolean;
|
||||
onError?: CompileErrorHandler;
|
||||
sourceMap?: boolean;
|
||||
filename?: string;
|
||||
}
|
||||
|
||||
declare interface CodeGenResult {
|
||||
code: string;
|
||||
ast: ResourceNode;
|
||||
map?: RawSourceMap;
|
||||
}
|
||||
|
||||
export declare type CompileCacheKeyHandler = (source: string) => string;
|
||||
|
||||
export declare type CompileDomain = 'tokenizer' | 'parser' | 'generator' | 'transformer' | 'compiler';
|
||||
|
||||
export declare interface CompileError extends SyntaxError {
|
||||
code: number;
|
||||
domain?: CompileDomain;
|
||||
location?: SourceLocation;
|
||||
}
|
||||
|
||||
export declare const enum CompileErrorCodes {
|
||||
EXPECTED_TOKEN = 0,
|
||||
INVALID_TOKEN_IN_PLACEHOLDER = 1,
|
||||
UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER = 2,
|
||||
UNKNOWN_ESCAPE_SEQUENCE = 3,
|
||||
INVALID_UNICODE_ESCAPE_SEQUENCE = 4,
|
||||
UNBALANCED_CLOSING_BRACE = 5,
|
||||
UNTERMINATED_CLOSING_BRACE = 6,
|
||||
EMPTY_PLACEHOLDER = 7,
|
||||
NOT_ALLOW_NEST_PLACEHOLDER = 8,
|
||||
INVALID_LINKED_FORMAT = 9,
|
||||
MUST_HAVE_MESSAGES_IN_PLURAL = 10,
|
||||
UNEXPECTED_EMPTY_LINKED_MODIFIER = 11,
|
||||
UNEXPECTED_EMPTY_LINKED_KEY = 12,
|
||||
UNEXPECTED_LEXICAL_ANALYSIS = 13,
|
||||
__EXTEND_POINT__ = 14
|
||||
}
|
||||
|
||||
export declare type CompileErrorHandler = (error: CompileError) => void;
|
||||
|
||||
export declare type CompileOptions = {
|
||||
warnHtmlMessage?: boolean;
|
||||
onCacheKey?: CompileCacheKeyHandler;
|
||||
} & TransformOptions & CodeGenOptions & ParserOptions & TokenizeOptions;
|
||||
|
||||
export declare function createCompileError<T extends number>(code: T, loc: SourceLocation | null, options?: CreateCompileErrorOptions): CompileError;
|
||||
|
||||
export declare interface CreateCompileErrorOptions {
|
||||
domain?: CompileDomain;
|
||||
messages?: {
|
||||
[code: number]: string;
|
||||
};
|
||||
args?: unknown[];
|
||||
}
|
||||
|
||||
export declare function createLocation(start: Position, end: Position, source?: string): SourceLocation;
|
||||
|
||||
export declare function createParser(options?: ParserOptions): Parser;
|
||||
|
||||
export declare function createPosition(line: number, column: number, offset: number): Position;
|
||||
|
||||
/* Excluded from this release type: defaultOnError */
|
||||
|
||||
export declare const ERROR_DOMAIN = "parser";
|
||||
|
||||
/* Excluded from this release type: errorMessages */
|
||||
|
||||
export declare const enum HelperNameMap {
|
||||
LIST = "list",
|
||||
NAMED = "named",
|
||||
PLURAL = "plural",
|
||||
LINKED = "linked",
|
||||
MESSAGE = "message",
|
||||
TYPE = "type",
|
||||
INTERPOLATE = "interpolate",
|
||||
NORMALIZE = "normalize"
|
||||
}
|
||||
|
||||
export declare type Identifier = string;
|
||||
|
||||
export declare interface LinkedKeyNode extends Node_2 {
|
||||
type: NodeTypes.LinkedKey;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export declare interface LinkedModifierNode extends Node_2 {
|
||||
type: NodeTypes.LinkedModifier;
|
||||
value: Identifier;
|
||||
}
|
||||
|
||||
export declare interface LinkedNode extends Node_2 {
|
||||
type: NodeTypes.Linked;
|
||||
modifier?: LinkedModifierNode;
|
||||
key: LinkedKeyNode | NamedNode | ListNode | LiteralNode;
|
||||
}
|
||||
|
||||
export declare interface ListNode extends Node_2 {
|
||||
type: NodeTypes.List;
|
||||
index: number;
|
||||
}
|
||||
|
||||
export declare interface LiteralNode extends Node_2 {
|
||||
type: NodeTypes.Literal;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export declare const LocationStub: SourceLocation;
|
||||
|
||||
declare type MessageElementNode = TextNode | NamedNode | ListNode | LiteralNode | LinkedNode;
|
||||
|
||||
export declare interface MessageNode extends Node_2 {
|
||||
type: NodeTypes.Message;
|
||||
items: MessageElementNode[];
|
||||
}
|
||||
|
||||
export declare interface NamedNode extends Node_2 {
|
||||
type: NodeTypes.Named;
|
||||
key: Identifier;
|
||||
}
|
||||
|
||||
declare interface Node_2 {
|
||||
type: NodeTypes;
|
||||
start: number;
|
||||
end: number;
|
||||
loc?: SourceLocation;
|
||||
}
|
||||
export { Node_2 as Node }
|
||||
|
||||
export declare const enum NodeTypes {
|
||||
Resource = 0,
|
||||
Plural = 1,
|
||||
Message = 2,
|
||||
Text = 3,
|
||||
Named = 4,
|
||||
List = 5,
|
||||
Linked = 6,
|
||||
LinkedKey = 7,
|
||||
LinkedModifier = 8,
|
||||
Literal = 9
|
||||
}
|
||||
|
||||
export declare interface Parser {
|
||||
parse(source: string): ResourceNode;
|
||||
}
|
||||
|
||||
export declare interface ParserOptions {
|
||||
location?: boolean;
|
||||
onError?: CompileErrorHandler;
|
||||
}
|
||||
|
||||
export declare interface PluralNode extends Node_2 {
|
||||
type: NodeTypes.Plural;
|
||||
cases: MessageNode[];
|
||||
}
|
||||
|
||||
export declare interface Position {
|
||||
offset: number;
|
||||
line: number;
|
||||
column: number;
|
||||
}
|
||||
|
||||
export declare interface ResourceNode extends Node_2 {
|
||||
type: NodeTypes.Resource;
|
||||
body: MessageNode | PluralNode;
|
||||
helpers?: string[];
|
||||
}
|
||||
|
||||
export declare interface SourceLocation {
|
||||
start: Position;
|
||||
end: Position;
|
||||
source?: string;
|
||||
}
|
||||
|
||||
export declare interface TextNode extends Node_2 {
|
||||
type: NodeTypes.Text;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export declare interface TokenizeOptions {
|
||||
location?: boolean;
|
||||
onError?: CompileErrorHandler;
|
||||
}
|
||||
|
||||
export declare interface TransformOptions {
|
||||
onError?: CompileErrorHandler;
|
||||
}
|
||||
|
||||
export { }
|
||||
Generated
Vendored
+1343
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+6
File diff suppressed because one or more lines are too long
Generated
Vendored
+1324
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+1360
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+6
File diff suppressed because one or more lines are too long
+7
@@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./dist/message-compiler.cjs.prod.js')
|
||||
} else {
|
||||
module.exports = require('./dist/message-compiler.cjs.js')
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"name": "@intlify/message-compiler",
|
||||
"version": "9.1.9",
|
||||
"description": "@intlify/message-compiler",
|
||||
"keywords": [
|
||||
"compiler",
|
||||
"i18n",
|
||||
"internationalization",
|
||||
"intlify",
|
||||
"message-format"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "kazuya kawaguchi",
|
||||
"email": "kawakazu80@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/intlify/vue-i18n-next/tree/master/packages/message-compiler#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/intlify/vue-i18n-next.git",
|
||||
"directory": "packages/message-compiler"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/intlify/vue-i18n-next/issues"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"dist"
|
||||
],
|
||||
"main": "index.js",
|
||||
"module": "dist/message-compiler.esm-bundler.js",
|
||||
"unpkg": "dist/message-compiler.global.js",
|
||||
"jsdelivr": "dist/message-compiler.global.js",
|
||||
"types": "dist/message-compiler.d.ts",
|
||||
"dependencies": {
|
||||
"@intlify/message-resolver": "9.1.9",
|
||||
"@intlify/shared": "9.1.9",
|
||||
"source-map": "0.6.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"buildOptions": {
|
||||
"name": "IntlifyMessageCompiler",
|
||||
"formats": [
|
||||
"esm-bundler",
|
||||
"esm-browser",
|
||||
"cjs",
|
||||
"global"
|
||||
]
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020 kazuya kawaguchi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
# @intlify/message-resolver
|
||||
|
||||
The locale message resolver for intlify project
|
||||
|
||||
## :copyright: License
|
||||
|
||||
[MIT](http://opensource.org/licenses/MIT)
|
||||
+302
@@ -0,0 +1,302 @@
|
||||
/*!
|
||||
* @intlify/message-resolver v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
/**
|
||||
* Original Utilities
|
||||
* written by kazuya kawaguchi
|
||||
*/
|
||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
function hasOwn(obj, key) {
|
||||
return hasOwnProperty.call(obj, key);
|
||||
}
|
||||
const isObject = (val) => // eslint-disable-line
|
||||
val !== null && typeof val === 'object';
|
||||
|
||||
const pathStateMachine = [];
|
||||
pathStateMachine[0 /* BEFORE_PATH */] = {
|
||||
["w" /* WORKSPACE */]: [0 /* BEFORE_PATH */],
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */]
|
||||
};
|
||||
pathStateMachine[1 /* IN_PATH */] = {
|
||||
["w" /* WORKSPACE */]: [1 /* IN_PATH */],
|
||||
["." /* DOT */]: [2 /* BEFORE_IDENT */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */]
|
||||
};
|
||||
pathStateMachine[2 /* BEFORE_IDENT */] = {
|
||||
["w" /* WORKSPACE */]: [2 /* BEFORE_IDENT */],
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["0" /* ZERO */]: [3 /* IN_IDENT */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[3 /* IN_IDENT */] = {
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["0" /* ZERO */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["w" /* WORKSPACE */]: [1 /* IN_PATH */, 1 /* PUSH */],
|
||||
["." /* DOT */]: [2 /* BEFORE_IDENT */, 1 /* PUSH */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */, 1 /* PUSH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */, 1 /* PUSH */]
|
||||
};
|
||||
pathStateMachine[4 /* IN_SUB_PATH */] = {
|
||||
["'" /* SINGLE_QUOTE */]: [5 /* IN_SINGLE_QUOTE */, 0 /* APPEND */],
|
||||
["\"" /* DOUBLE_QUOTE */]: [6 /* IN_DOUBLE_QUOTE */, 0 /* APPEND */],
|
||||
["[" /* LEFT_BRACKET */]: [
|
||||
4 /* IN_SUB_PATH */,
|
||||
2 /* INC_SUB_PATH_DEPTH */
|
||||
],
|
||||
["]" /* RIGHT_BRACKET */]: [1 /* IN_PATH */, 3 /* PUSH_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[5 /* IN_SINGLE_QUOTE */] = {
|
||||
["'" /* SINGLE_QUOTE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [5 /* IN_SINGLE_QUOTE */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[6 /* IN_DOUBLE_QUOTE */] = {
|
||||
["\"" /* DOUBLE_QUOTE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [6 /* IN_DOUBLE_QUOTE */, 0 /* APPEND */]
|
||||
};
|
||||
/**
|
||||
* Check if an expression is a literal value.
|
||||
*/
|
||||
const literalValueRE = /^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;
|
||||
function isLiteral(exp) {
|
||||
return literalValueRE.test(exp);
|
||||
}
|
||||
/**
|
||||
* Strip quotes from a string
|
||||
*/
|
||||
function stripQuotes(str) {
|
||||
const a = str.charCodeAt(0);
|
||||
const b = str.charCodeAt(str.length - 1);
|
||||
return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str;
|
||||
}
|
||||
/**
|
||||
* Determine the type of a character in a keypath.
|
||||
*/
|
||||
function getPathCharType(ch) {
|
||||
if (ch === undefined || ch === null) {
|
||||
return "o" /* END_OF_FAIL */;
|
||||
}
|
||||
const code = ch.charCodeAt(0);
|
||||
switch (code) {
|
||||
case 0x5b: // [
|
||||
case 0x5d: // ]
|
||||
case 0x2e: // .
|
||||
case 0x22: // "
|
||||
case 0x27: // '
|
||||
return ch;
|
||||
case 0x5f: // _
|
||||
case 0x24: // $
|
||||
case 0x2d: // -
|
||||
return "i" /* IDENT */;
|
||||
case 0x09: // Tab (HT)
|
||||
case 0x0a: // Newline (LF)
|
||||
case 0x0d: // Return (CR)
|
||||
case 0xa0: // No-break space (NBSP)
|
||||
case 0xfeff: // Byte Order Mark (BOM)
|
||||
case 0x2028: // Line Separator (LS)
|
||||
case 0x2029: // Paragraph Separator (PS)
|
||||
return "w" /* WORKSPACE */;
|
||||
}
|
||||
return "i" /* IDENT */;
|
||||
}
|
||||
/**
|
||||
* Format a subPath, return its plain form if it is
|
||||
* a literal string or number. Otherwise prepend the
|
||||
* dynamic indicator (*).
|
||||
*/
|
||||
function formatSubPath(path) {
|
||||
const trimmed = path.trim();
|
||||
// invalid leading 0
|
||||
if (path.charAt(0) === '0' && isNaN(parseInt(path))) {
|
||||
return false;
|
||||
}
|
||||
return isLiteral(trimmed)
|
||||
? stripQuotes(trimmed)
|
||||
: "*" /* ASTARISK */ + trimmed;
|
||||
}
|
||||
/**
|
||||
* Parse a string path into an array of segments
|
||||
*/
|
||||
function parse(path) {
|
||||
const keys = [];
|
||||
let index = -1;
|
||||
let mode = 0 /* BEFORE_PATH */;
|
||||
let subPathDepth = 0;
|
||||
let c;
|
||||
let key; // eslint-disable-line
|
||||
let newChar;
|
||||
let type;
|
||||
let transition;
|
||||
let action;
|
||||
let typeMap;
|
||||
const actions = [];
|
||||
actions[0 /* APPEND */] = () => {
|
||||
if (key === undefined) {
|
||||
key = newChar;
|
||||
}
|
||||
else {
|
||||
key += newChar;
|
||||
}
|
||||
};
|
||||
actions[1 /* PUSH */] = () => {
|
||||
if (key !== undefined) {
|
||||
keys.push(key);
|
||||
key = undefined;
|
||||
}
|
||||
};
|
||||
actions[2 /* INC_SUB_PATH_DEPTH */] = () => {
|
||||
actions[0 /* APPEND */]();
|
||||
subPathDepth++;
|
||||
};
|
||||
actions[3 /* PUSH_SUB_PATH */] = () => {
|
||||
if (subPathDepth > 0) {
|
||||
subPathDepth--;
|
||||
mode = 4 /* IN_SUB_PATH */;
|
||||
actions[0 /* APPEND */]();
|
||||
}
|
||||
else {
|
||||
subPathDepth = 0;
|
||||
if (key === undefined) {
|
||||
return false;
|
||||
}
|
||||
key = formatSubPath(key);
|
||||
if (key === false) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
actions[1 /* PUSH */]();
|
||||
}
|
||||
}
|
||||
};
|
||||
function maybeUnescapeQuote() {
|
||||
const nextChar = path[index + 1];
|
||||
if ((mode === 5 /* IN_SINGLE_QUOTE */ &&
|
||||
nextChar === "'" /* SINGLE_QUOTE */) ||
|
||||
(mode === 6 /* IN_DOUBLE_QUOTE */ &&
|
||||
nextChar === "\"" /* DOUBLE_QUOTE */)) {
|
||||
index++;
|
||||
newChar = '\\' + nextChar;
|
||||
actions[0 /* APPEND */]();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
while (mode !== null) {
|
||||
index++;
|
||||
c = path[index];
|
||||
if (c === '\\' && maybeUnescapeQuote()) {
|
||||
continue;
|
||||
}
|
||||
type = getPathCharType(c);
|
||||
typeMap = pathStateMachine[mode];
|
||||
transition = typeMap[type] || typeMap["l" /* ELSE */] || 8 /* ERROR */;
|
||||
// check parse error
|
||||
if (transition === 8 /* ERROR */) {
|
||||
return;
|
||||
}
|
||||
mode = transition[0];
|
||||
if (transition[1] !== undefined) {
|
||||
action = actions[transition[1]];
|
||||
if (action) {
|
||||
newChar = c;
|
||||
if (action() === false) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// check parse finish
|
||||
if (mode === 7 /* AFTER_PATH */) {
|
||||
return keys;
|
||||
}
|
||||
}
|
||||
}
|
||||
// path token cache
|
||||
const cache = new Map();
|
||||
function resolveValue(obj, path) {
|
||||
// check object
|
||||
if (!isObject(obj)) {
|
||||
return null;
|
||||
}
|
||||
// parse path
|
||||
let hit = cache.get(path);
|
||||
if (!hit) {
|
||||
hit = parse(path);
|
||||
if (hit) {
|
||||
cache.set(path, hit);
|
||||
}
|
||||
}
|
||||
// check hit
|
||||
if (!hit) {
|
||||
return null;
|
||||
}
|
||||
// resolve path value
|
||||
const len = hit.length;
|
||||
let last = obj;
|
||||
let i = 0;
|
||||
while (i < len) {
|
||||
const val = last[hit[i]];
|
||||
if (val === undefined) {
|
||||
return null;
|
||||
}
|
||||
last = val;
|
||||
i++;
|
||||
}
|
||||
return last;
|
||||
}
|
||||
/**
|
||||
* Transform flat json in obj to normal json in obj
|
||||
*/
|
||||
function handleFlatJson(obj) {
|
||||
// check obj
|
||||
if (!isObject(obj)) {
|
||||
return obj;
|
||||
}
|
||||
for (const key in obj) {
|
||||
// check key
|
||||
if (!hasOwn(obj, key)) {
|
||||
continue;
|
||||
}
|
||||
// handle for normal json
|
||||
if (!key.includes("." /* DOT */)) {
|
||||
// recursive process value if value is also a object
|
||||
if (isObject(obj[key])) {
|
||||
handleFlatJson(obj[key]);
|
||||
}
|
||||
}
|
||||
// handle for flat json, transform to normal json
|
||||
else {
|
||||
// go to the last object
|
||||
const subKeys = key.split("." /* DOT */);
|
||||
const lastIndex = subKeys.length - 1;
|
||||
let currentObj = obj;
|
||||
for (let i = 0; i < lastIndex; i++) {
|
||||
if (!(subKeys[i] in currentObj)) {
|
||||
currentObj[subKeys[i]] = {};
|
||||
}
|
||||
currentObj = currentObj[subKeys[i]];
|
||||
}
|
||||
// update last object value, delete old property
|
||||
currentObj[subKeys[lastIndex]] = obj[key];
|
||||
delete obj[key];
|
||||
// recursive process value if value is also a object
|
||||
if (isObject(currentObj[subKeys[lastIndex]])) {
|
||||
handleFlatJson(currentObj[subKeys[lastIndex]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
exports.handleFlatJson = handleFlatJson;
|
||||
exports.parse = parse;
|
||||
exports.resolveValue = resolveValue;
|
||||
Generated
Vendored
+302
@@ -0,0 +1,302 @@
|
||||
/*!
|
||||
* @intlify/message-resolver v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
/**
|
||||
* Original Utilities
|
||||
* written by kazuya kawaguchi
|
||||
*/
|
||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
function hasOwn(obj, key) {
|
||||
return hasOwnProperty.call(obj, key);
|
||||
}
|
||||
const isObject = (val) => // eslint-disable-line
|
||||
val !== null && typeof val === 'object';
|
||||
|
||||
const pathStateMachine = [];
|
||||
pathStateMachine[0 /* BEFORE_PATH */] = {
|
||||
["w" /* WORKSPACE */]: [0 /* BEFORE_PATH */],
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */]
|
||||
};
|
||||
pathStateMachine[1 /* IN_PATH */] = {
|
||||
["w" /* WORKSPACE */]: [1 /* IN_PATH */],
|
||||
["." /* DOT */]: [2 /* BEFORE_IDENT */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */]
|
||||
};
|
||||
pathStateMachine[2 /* BEFORE_IDENT */] = {
|
||||
["w" /* WORKSPACE */]: [2 /* BEFORE_IDENT */],
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["0" /* ZERO */]: [3 /* IN_IDENT */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[3 /* IN_IDENT */] = {
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["0" /* ZERO */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["w" /* WORKSPACE */]: [1 /* IN_PATH */, 1 /* PUSH */],
|
||||
["." /* DOT */]: [2 /* BEFORE_IDENT */, 1 /* PUSH */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */, 1 /* PUSH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */, 1 /* PUSH */]
|
||||
};
|
||||
pathStateMachine[4 /* IN_SUB_PATH */] = {
|
||||
["'" /* SINGLE_QUOTE */]: [5 /* IN_SINGLE_QUOTE */, 0 /* APPEND */],
|
||||
["\"" /* DOUBLE_QUOTE */]: [6 /* IN_DOUBLE_QUOTE */, 0 /* APPEND */],
|
||||
["[" /* LEFT_BRACKET */]: [
|
||||
4 /* IN_SUB_PATH */,
|
||||
2 /* INC_SUB_PATH_DEPTH */
|
||||
],
|
||||
["]" /* RIGHT_BRACKET */]: [1 /* IN_PATH */, 3 /* PUSH_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[5 /* IN_SINGLE_QUOTE */] = {
|
||||
["'" /* SINGLE_QUOTE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [5 /* IN_SINGLE_QUOTE */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[6 /* IN_DOUBLE_QUOTE */] = {
|
||||
["\"" /* DOUBLE_QUOTE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [6 /* IN_DOUBLE_QUOTE */, 0 /* APPEND */]
|
||||
};
|
||||
/**
|
||||
* Check if an expression is a literal value.
|
||||
*/
|
||||
const literalValueRE = /^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;
|
||||
function isLiteral(exp) {
|
||||
return literalValueRE.test(exp);
|
||||
}
|
||||
/**
|
||||
* Strip quotes from a string
|
||||
*/
|
||||
function stripQuotes(str) {
|
||||
const a = str.charCodeAt(0);
|
||||
const b = str.charCodeAt(str.length - 1);
|
||||
return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str;
|
||||
}
|
||||
/**
|
||||
* Determine the type of a character in a keypath.
|
||||
*/
|
||||
function getPathCharType(ch) {
|
||||
if (ch === undefined || ch === null) {
|
||||
return "o" /* END_OF_FAIL */;
|
||||
}
|
||||
const code = ch.charCodeAt(0);
|
||||
switch (code) {
|
||||
case 0x5b: // [
|
||||
case 0x5d: // ]
|
||||
case 0x2e: // .
|
||||
case 0x22: // "
|
||||
case 0x27: // '
|
||||
return ch;
|
||||
case 0x5f: // _
|
||||
case 0x24: // $
|
||||
case 0x2d: // -
|
||||
return "i" /* IDENT */;
|
||||
case 0x09: // Tab (HT)
|
||||
case 0x0a: // Newline (LF)
|
||||
case 0x0d: // Return (CR)
|
||||
case 0xa0: // No-break space (NBSP)
|
||||
case 0xfeff: // Byte Order Mark (BOM)
|
||||
case 0x2028: // Line Separator (LS)
|
||||
case 0x2029: // Paragraph Separator (PS)
|
||||
return "w" /* WORKSPACE */;
|
||||
}
|
||||
return "i" /* IDENT */;
|
||||
}
|
||||
/**
|
||||
* Format a subPath, return its plain form if it is
|
||||
* a literal string or number. Otherwise prepend the
|
||||
* dynamic indicator (*).
|
||||
*/
|
||||
function formatSubPath(path) {
|
||||
const trimmed = path.trim();
|
||||
// invalid leading 0
|
||||
if (path.charAt(0) === '0' && isNaN(parseInt(path))) {
|
||||
return false;
|
||||
}
|
||||
return isLiteral(trimmed)
|
||||
? stripQuotes(trimmed)
|
||||
: "*" /* ASTARISK */ + trimmed;
|
||||
}
|
||||
/**
|
||||
* Parse a string path into an array of segments
|
||||
*/
|
||||
function parse(path) {
|
||||
const keys = [];
|
||||
let index = -1;
|
||||
let mode = 0 /* BEFORE_PATH */;
|
||||
let subPathDepth = 0;
|
||||
let c;
|
||||
let key; // eslint-disable-line
|
||||
let newChar;
|
||||
let type;
|
||||
let transition;
|
||||
let action;
|
||||
let typeMap;
|
||||
const actions = [];
|
||||
actions[0 /* APPEND */] = () => {
|
||||
if (key === undefined) {
|
||||
key = newChar;
|
||||
}
|
||||
else {
|
||||
key += newChar;
|
||||
}
|
||||
};
|
||||
actions[1 /* PUSH */] = () => {
|
||||
if (key !== undefined) {
|
||||
keys.push(key);
|
||||
key = undefined;
|
||||
}
|
||||
};
|
||||
actions[2 /* INC_SUB_PATH_DEPTH */] = () => {
|
||||
actions[0 /* APPEND */]();
|
||||
subPathDepth++;
|
||||
};
|
||||
actions[3 /* PUSH_SUB_PATH */] = () => {
|
||||
if (subPathDepth > 0) {
|
||||
subPathDepth--;
|
||||
mode = 4 /* IN_SUB_PATH */;
|
||||
actions[0 /* APPEND */]();
|
||||
}
|
||||
else {
|
||||
subPathDepth = 0;
|
||||
if (key === undefined) {
|
||||
return false;
|
||||
}
|
||||
key = formatSubPath(key);
|
||||
if (key === false) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
actions[1 /* PUSH */]();
|
||||
}
|
||||
}
|
||||
};
|
||||
function maybeUnescapeQuote() {
|
||||
const nextChar = path[index + 1];
|
||||
if ((mode === 5 /* IN_SINGLE_QUOTE */ &&
|
||||
nextChar === "'" /* SINGLE_QUOTE */) ||
|
||||
(mode === 6 /* IN_DOUBLE_QUOTE */ &&
|
||||
nextChar === "\"" /* DOUBLE_QUOTE */)) {
|
||||
index++;
|
||||
newChar = '\\' + nextChar;
|
||||
actions[0 /* APPEND */]();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
while (mode !== null) {
|
||||
index++;
|
||||
c = path[index];
|
||||
if (c === '\\' && maybeUnescapeQuote()) {
|
||||
continue;
|
||||
}
|
||||
type = getPathCharType(c);
|
||||
typeMap = pathStateMachine[mode];
|
||||
transition = typeMap[type] || typeMap["l" /* ELSE */] || 8 /* ERROR */;
|
||||
// check parse error
|
||||
if (transition === 8 /* ERROR */) {
|
||||
return;
|
||||
}
|
||||
mode = transition[0];
|
||||
if (transition[1] !== undefined) {
|
||||
action = actions[transition[1]];
|
||||
if (action) {
|
||||
newChar = c;
|
||||
if (action() === false) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// check parse finish
|
||||
if (mode === 7 /* AFTER_PATH */) {
|
||||
return keys;
|
||||
}
|
||||
}
|
||||
}
|
||||
// path token cache
|
||||
const cache = new Map();
|
||||
function resolveValue(obj, path) {
|
||||
// check object
|
||||
if (!isObject(obj)) {
|
||||
return null;
|
||||
}
|
||||
// parse path
|
||||
let hit = cache.get(path);
|
||||
if (!hit) {
|
||||
hit = parse(path);
|
||||
if (hit) {
|
||||
cache.set(path, hit);
|
||||
}
|
||||
}
|
||||
// check hit
|
||||
if (!hit) {
|
||||
return null;
|
||||
}
|
||||
// resolve path value
|
||||
const len = hit.length;
|
||||
let last = obj;
|
||||
let i = 0;
|
||||
while (i < len) {
|
||||
const val = last[hit[i]];
|
||||
if (val === undefined) {
|
||||
return null;
|
||||
}
|
||||
last = val;
|
||||
i++;
|
||||
}
|
||||
return last;
|
||||
}
|
||||
/**
|
||||
* Transform flat json in obj to normal json in obj
|
||||
*/
|
||||
function handleFlatJson(obj) {
|
||||
// check obj
|
||||
if (!isObject(obj)) {
|
||||
return obj;
|
||||
}
|
||||
for (const key in obj) {
|
||||
// check key
|
||||
if (!hasOwn(obj, key)) {
|
||||
continue;
|
||||
}
|
||||
// handle for normal json
|
||||
if (!key.includes("." /* DOT */)) {
|
||||
// recursive process value if value is also a object
|
||||
if (isObject(obj[key])) {
|
||||
handleFlatJson(obj[key]);
|
||||
}
|
||||
}
|
||||
// handle for flat json, transform to normal json
|
||||
else {
|
||||
// go to the last object
|
||||
const subKeys = key.split("." /* DOT */);
|
||||
const lastIndex = subKeys.length - 1;
|
||||
let currentObj = obj;
|
||||
for (let i = 0; i < lastIndex; i++) {
|
||||
if (!(subKeys[i] in currentObj)) {
|
||||
currentObj[subKeys[i]] = {};
|
||||
}
|
||||
currentObj = currentObj[subKeys[i]];
|
||||
}
|
||||
// update last object value, delete old property
|
||||
currentObj[subKeys[lastIndex]] = obj[key];
|
||||
delete obj[key];
|
||||
// recursive process value if value is also a object
|
||||
if (isObject(currentObj[subKeys[lastIndex]])) {
|
||||
handleFlatJson(currentObj[subKeys[lastIndex]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
exports.handleFlatJson = handleFlatJson;
|
||||
exports.parse = parse;
|
||||
exports.resolveValue = resolveValue;
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
|
||||
/**
|
||||
* Transform flat json in obj to normal json in obj
|
||||
*/
|
||||
export declare function handleFlatJson(obj: unknown): unknown;
|
||||
|
||||
/**
|
||||
* Parse a string path into an array of segments
|
||||
*/
|
||||
export declare function parse(path: Path): string[] | undefined;
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type Path = string;
|
||||
|
||||
export declare type PathValue = string | number | boolean | Function | null | {
|
||||
[key: string]: PathValue;
|
||||
} | PathValue[];
|
||||
|
||||
export declare function resolveValue(obj: unknown, path: Path): PathValue;
|
||||
|
||||
export { }
|
||||
Generated
Vendored
+297
@@ -0,0 +1,297 @@
|
||||
/*!
|
||||
* @intlify/message-resolver v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
/**
|
||||
* Original Utilities
|
||||
* written by kazuya kawaguchi
|
||||
*/
|
||||
if ((process.env.NODE_ENV !== 'production')) ;
|
||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
function hasOwn(obj, key) {
|
||||
return hasOwnProperty.call(obj, key);
|
||||
}
|
||||
const isObject = (val) => // eslint-disable-line
|
||||
val !== null && typeof val === 'object';
|
||||
|
||||
const pathStateMachine = [];
|
||||
pathStateMachine[0 /* BEFORE_PATH */] = {
|
||||
["w" /* WORKSPACE */]: [0 /* BEFORE_PATH */],
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */]
|
||||
};
|
||||
pathStateMachine[1 /* IN_PATH */] = {
|
||||
["w" /* WORKSPACE */]: [1 /* IN_PATH */],
|
||||
["." /* DOT */]: [2 /* BEFORE_IDENT */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */]
|
||||
};
|
||||
pathStateMachine[2 /* BEFORE_IDENT */] = {
|
||||
["w" /* WORKSPACE */]: [2 /* BEFORE_IDENT */],
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["0" /* ZERO */]: [3 /* IN_IDENT */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[3 /* IN_IDENT */] = {
|
||||
["i" /* IDENT */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["0" /* ZERO */]: [3 /* IN_IDENT */, 0 /* APPEND */],
|
||||
["w" /* WORKSPACE */]: [1 /* IN_PATH */, 1 /* PUSH */],
|
||||
["." /* DOT */]: [2 /* BEFORE_IDENT */, 1 /* PUSH */],
|
||||
["[" /* LEFT_BRACKET */]: [4 /* IN_SUB_PATH */, 1 /* PUSH */],
|
||||
["o" /* END_OF_FAIL */]: [7 /* AFTER_PATH */, 1 /* PUSH */]
|
||||
};
|
||||
pathStateMachine[4 /* IN_SUB_PATH */] = {
|
||||
["'" /* SINGLE_QUOTE */]: [5 /* IN_SINGLE_QUOTE */, 0 /* APPEND */],
|
||||
["\"" /* DOUBLE_QUOTE */]: [6 /* IN_DOUBLE_QUOTE */, 0 /* APPEND */],
|
||||
["[" /* LEFT_BRACKET */]: [
|
||||
4 /* IN_SUB_PATH */,
|
||||
2 /* INC_SUB_PATH_DEPTH */
|
||||
],
|
||||
["]" /* RIGHT_BRACKET */]: [1 /* IN_PATH */, 3 /* PUSH_SUB_PATH */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[5 /* IN_SINGLE_QUOTE */] = {
|
||||
["'" /* SINGLE_QUOTE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [5 /* IN_SINGLE_QUOTE */, 0 /* APPEND */]
|
||||
};
|
||||
pathStateMachine[6 /* IN_DOUBLE_QUOTE */] = {
|
||||
["\"" /* DOUBLE_QUOTE */]: [4 /* IN_SUB_PATH */, 0 /* APPEND */],
|
||||
["o" /* END_OF_FAIL */]: 8 /* ERROR */,
|
||||
["l" /* ELSE */]: [6 /* IN_DOUBLE_QUOTE */, 0 /* APPEND */]
|
||||
};
|
||||
/**
|
||||
* Check if an expression is a literal value.
|
||||
*/
|
||||
const literalValueRE = /^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;
|
||||
function isLiteral(exp) {
|
||||
return literalValueRE.test(exp);
|
||||
}
|
||||
/**
|
||||
* Strip quotes from a string
|
||||
*/
|
||||
function stripQuotes(str) {
|
||||
const a = str.charCodeAt(0);
|
||||
const b = str.charCodeAt(str.length - 1);
|
||||
return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str;
|
||||
}
|
||||
/**
|
||||
* Determine the type of a character in a keypath.
|
||||
*/
|
||||
function getPathCharType(ch) {
|
||||
if (ch === undefined || ch === null) {
|
||||
return "o" /* END_OF_FAIL */;
|
||||
}
|
||||
const code = ch.charCodeAt(0);
|
||||
switch (code) {
|
||||
case 0x5b: // [
|
||||
case 0x5d: // ]
|
||||
case 0x2e: // .
|
||||
case 0x22: // "
|
||||
case 0x27: // '
|
||||
return ch;
|
||||
case 0x5f: // _
|
||||
case 0x24: // $
|
||||
case 0x2d: // -
|
||||
return "i" /* IDENT */;
|
||||
case 0x09: // Tab (HT)
|
||||
case 0x0a: // Newline (LF)
|
||||
case 0x0d: // Return (CR)
|
||||
case 0xa0: // No-break space (NBSP)
|
||||
case 0xfeff: // Byte Order Mark (BOM)
|
||||
case 0x2028: // Line Separator (LS)
|
||||
case 0x2029: // Paragraph Separator (PS)
|
||||
return "w" /* WORKSPACE */;
|
||||
}
|
||||
return "i" /* IDENT */;
|
||||
}
|
||||
/**
|
||||
* Format a subPath, return its plain form if it is
|
||||
* a literal string or number. Otherwise prepend the
|
||||
* dynamic indicator (*).
|
||||
*/
|
||||
function formatSubPath(path) {
|
||||
const trimmed = path.trim();
|
||||
// invalid leading 0
|
||||
if (path.charAt(0) === '0' && isNaN(parseInt(path))) {
|
||||
return false;
|
||||
}
|
||||
return isLiteral(trimmed)
|
||||
? stripQuotes(trimmed)
|
||||
: "*" /* ASTARISK */ + trimmed;
|
||||
}
|
||||
/**
|
||||
* Parse a string path into an array of segments
|
||||
*/
|
||||
function parse(path) {
|
||||
const keys = [];
|
||||
let index = -1;
|
||||
let mode = 0 /* BEFORE_PATH */;
|
||||
let subPathDepth = 0;
|
||||
let c;
|
||||
let key; // eslint-disable-line
|
||||
let newChar;
|
||||
let type;
|
||||
let transition;
|
||||
let action;
|
||||
let typeMap;
|
||||
const actions = [];
|
||||
actions[0 /* APPEND */] = () => {
|
||||
if (key === undefined) {
|
||||
key = newChar;
|
||||
}
|
||||
else {
|
||||
key += newChar;
|
||||
}
|
||||
};
|
||||
actions[1 /* PUSH */] = () => {
|
||||
if (key !== undefined) {
|
||||
keys.push(key);
|
||||
key = undefined;
|
||||
}
|
||||
};
|
||||
actions[2 /* INC_SUB_PATH_DEPTH */] = () => {
|
||||
actions[0 /* APPEND */]();
|
||||
subPathDepth++;
|
||||
};
|
||||
actions[3 /* PUSH_SUB_PATH */] = () => {
|
||||
if (subPathDepth > 0) {
|
||||
subPathDepth--;
|
||||
mode = 4 /* IN_SUB_PATH */;
|
||||
actions[0 /* APPEND */]();
|
||||
}
|
||||
else {
|
||||
subPathDepth = 0;
|
||||
if (key === undefined) {
|
||||
return false;
|
||||
}
|
||||
key = formatSubPath(key);
|
||||
if (key === false) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
actions[1 /* PUSH */]();
|
||||
}
|
||||
}
|
||||
};
|
||||
function maybeUnescapeQuote() {
|
||||
const nextChar = path[index + 1];
|
||||
if ((mode === 5 /* IN_SINGLE_QUOTE */ &&
|
||||
nextChar === "'" /* SINGLE_QUOTE */) ||
|
||||
(mode === 6 /* IN_DOUBLE_QUOTE */ &&
|
||||
nextChar === "\"" /* DOUBLE_QUOTE */)) {
|
||||
index++;
|
||||
newChar = '\\' + nextChar;
|
||||
actions[0 /* APPEND */]();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
while (mode !== null) {
|
||||
index++;
|
||||
c = path[index];
|
||||
if (c === '\\' && maybeUnescapeQuote()) {
|
||||
continue;
|
||||
}
|
||||
type = getPathCharType(c);
|
||||
typeMap = pathStateMachine[mode];
|
||||
transition = typeMap[type] || typeMap["l" /* ELSE */] || 8 /* ERROR */;
|
||||
// check parse error
|
||||
if (transition === 8 /* ERROR */) {
|
||||
return;
|
||||
}
|
||||
mode = transition[0];
|
||||
if (transition[1] !== undefined) {
|
||||
action = actions[transition[1]];
|
||||
if (action) {
|
||||
newChar = c;
|
||||
if (action() === false) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// check parse finish
|
||||
if (mode === 7 /* AFTER_PATH */) {
|
||||
return keys;
|
||||
}
|
||||
}
|
||||
}
|
||||
// path token cache
|
||||
const cache = new Map();
|
||||
function resolveValue(obj, path) {
|
||||
// check object
|
||||
if (!isObject(obj)) {
|
||||
return null;
|
||||
}
|
||||
// parse path
|
||||
let hit = cache.get(path);
|
||||
if (!hit) {
|
||||
hit = parse(path);
|
||||
if (hit) {
|
||||
cache.set(path, hit);
|
||||
}
|
||||
}
|
||||
// check hit
|
||||
if (!hit) {
|
||||
return null;
|
||||
}
|
||||
// resolve path value
|
||||
const len = hit.length;
|
||||
let last = obj;
|
||||
let i = 0;
|
||||
while (i < len) {
|
||||
const val = last[hit[i]];
|
||||
if (val === undefined) {
|
||||
return null;
|
||||
}
|
||||
last = val;
|
||||
i++;
|
||||
}
|
||||
return last;
|
||||
}
|
||||
/**
|
||||
* Transform flat json in obj to normal json in obj
|
||||
*/
|
||||
function handleFlatJson(obj) {
|
||||
// check obj
|
||||
if (!isObject(obj)) {
|
||||
return obj;
|
||||
}
|
||||
for (const key in obj) {
|
||||
// check key
|
||||
if (!hasOwn(obj, key)) {
|
||||
continue;
|
||||
}
|
||||
// handle for normal json
|
||||
if (!key.includes("." /* DOT */)) {
|
||||
// recursive process value if value is also a object
|
||||
if (isObject(obj[key])) {
|
||||
handleFlatJson(obj[key]);
|
||||
}
|
||||
}
|
||||
// handle for flat json, transform to normal json
|
||||
else {
|
||||
// go to the last object
|
||||
const subKeys = key.split("." /* DOT */);
|
||||
const lastIndex = subKeys.length - 1;
|
||||
let currentObj = obj;
|
||||
for (let i = 0; i < lastIndex; i++) {
|
||||
if (!(subKeys[i] in currentObj)) {
|
||||
currentObj[subKeys[i]] = {};
|
||||
}
|
||||
currentObj = currentObj[subKeys[i]];
|
||||
}
|
||||
// update last object value, delete old property
|
||||
currentObj[subKeys[lastIndex]] = obj[key];
|
||||
delete obj[key];
|
||||
// recursive process value if value is also a object
|
||||
if (isObject(currentObj[subKeys[lastIndex]])) {
|
||||
handleFlatJson(currentObj[subKeys[lastIndex]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
export { handleFlatJson, parse, resolveValue };
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./dist/message-resolver.cjs.prod.js')
|
||||
} else {
|
||||
module.exports = require('./dist/message-resolver.cjs.js')
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"name": "@intlify/message-resolver",
|
||||
"version": "9.1.9",
|
||||
"description": "@intlify/message-resolver",
|
||||
"keywords": [
|
||||
"i18n",
|
||||
"internationalization",
|
||||
"intlify",
|
||||
"resolver"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "kazuya kawaguchi",
|
||||
"email": "kawakazu80@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/intlify/vue-i18n-next/tree/master/packages/message-resolver#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/intlify/vue-i18n-next.git",
|
||||
"directory": "packages/message-resolver"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/intlify/vue-i18n-next/issues"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"dist"
|
||||
],
|
||||
"main": "index.js",
|
||||
"module": "dist/message-resolver.esm-bundler.js",
|
||||
"types": "dist/message-resolver.d.ts",
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"buildOptions": {
|
||||
"name": "IntlifyMessageResolver",
|
||||
"formats": [
|
||||
"esm-bundler",
|
||||
"cjs"
|
||||
]
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020 kazuya kawaguchi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
# @intlify/runtime
|
||||
|
||||
The runtime for intlify project
|
||||
|
||||
## :copyright: License
|
||||
|
||||
[MIT](http://opensource.org/licenses/MIT)
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
/*!
|
||||
* @intlify/runtime v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
var shared = require('@intlify/shared');
|
||||
|
||||
const DEFAULT_MODIFIER = (str) => str;
|
||||
const DEFAULT_MESSAGE = (ctx) => ''; // eslint-disable-line
|
||||
const DEFAULT_MESSAGE_DATA_TYPE = 'text';
|
||||
const DEFAULT_NORMALIZE = (values) => values.length === 0 ? '' : values.join('');
|
||||
const DEFAULT_INTERPOLATE = shared.toDisplayString;
|
||||
function pluralDefault(choice, choicesLength) {
|
||||
choice = Math.abs(choice);
|
||||
if (choicesLength === 2) {
|
||||
// prettier-ignore
|
||||
return choice
|
||||
? choice > 1
|
||||
? 1
|
||||
: 0
|
||||
: 1;
|
||||
}
|
||||
return choice ? Math.min(choice, 2) : 0;
|
||||
}
|
||||
function getPluralIndex(options) {
|
||||
// prettier-ignore
|
||||
const index = shared.isNumber(options.pluralIndex)
|
||||
? options.pluralIndex
|
||||
: -1;
|
||||
// prettier-ignore
|
||||
return options.named && (shared.isNumber(options.named.count) || shared.isNumber(options.named.n))
|
||||
? shared.isNumber(options.named.count)
|
||||
? options.named.count
|
||||
: shared.isNumber(options.named.n)
|
||||
? options.named.n
|
||||
: index
|
||||
: index;
|
||||
}
|
||||
function normalizeNamed(pluralIndex, props) {
|
||||
if (!props.count) {
|
||||
props.count = pluralIndex;
|
||||
}
|
||||
if (!props.n) {
|
||||
props.n = pluralIndex;
|
||||
}
|
||||
}
|
||||
function createMessageContext(options = {}) {
|
||||
const locale = options.locale;
|
||||
const pluralIndex = getPluralIndex(options);
|
||||
const pluralRule = shared.isObject(options.pluralRules) &&
|
||||
shared.isString(locale) &&
|
||||
shared.isFunction(options.pluralRules[locale])
|
||||
? options.pluralRules[locale]
|
||||
: pluralDefault;
|
||||
const orgPluralRule = shared.isObject(options.pluralRules) &&
|
||||
shared.isString(locale) &&
|
||||
shared.isFunction(options.pluralRules[locale])
|
||||
? pluralDefault
|
||||
: undefined;
|
||||
const plural = (messages) => messages[pluralRule(pluralIndex, messages.length, orgPluralRule)];
|
||||
const _list = options.list || [];
|
||||
const list = (index) => _list[index];
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const _named = options.named || {};
|
||||
shared.isNumber(options.pluralIndex) && normalizeNamed(pluralIndex, _named);
|
||||
const named = (key) => _named[key];
|
||||
// TODO: need to design resolve message function?
|
||||
function message(key) {
|
||||
// prettier-ignore
|
||||
const msg = shared.isFunction(options.messages)
|
||||
? options.messages(key)
|
||||
: shared.isObject(options.messages)
|
||||
? options.messages[key]
|
||||
: false;
|
||||
return !msg
|
||||
? options.parent
|
||||
? options.parent.message(key) // resolve from parent messages
|
||||
: DEFAULT_MESSAGE
|
||||
: msg;
|
||||
}
|
||||
const _modifier = (name) => options.modifiers
|
||||
? options.modifiers[name]
|
||||
: DEFAULT_MODIFIER;
|
||||
const normalize = shared.isPlainObject(options.processor) && shared.isFunction(options.processor.normalize)
|
||||
? options.processor.normalize
|
||||
: DEFAULT_NORMALIZE;
|
||||
const interpolate = shared.isPlainObject(options.processor) &&
|
||||
shared.isFunction(options.processor.interpolate)
|
||||
? options.processor.interpolate
|
||||
: DEFAULT_INTERPOLATE;
|
||||
const type = shared.isPlainObject(options.processor) && shared.isString(options.processor.type)
|
||||
? options.processor.type
|
||||
: DEFAULT_MESSAGE_DATA_TYPE;
|
||||
const ctx = {
|
||||
["list" /* LIST */]: list,
|
||||
["named" /* NAMED */]: named,
|
||||
["plural" /* PLURAL */]: plural,
|
||||
["linked" /* LINKED */]: (key, modifier) => {
|
||||
// TODO: should check `key`
|
||||
const msg = message(key)(ctx);
|
||||
return shared.isString(modifier) ? _modifier(modifier)(msg) : msg;
|
||||
},
|
||||
["message" /* MESSAGE */]: message,
|
||||
["type" /* TYPE */]: type,
|
||||
["interpolate" /* INTERPOLATE */]: interpolate,
|
||||
["normalize" /* NORMALIZE */]: normalize
|
||||
};
|
||||
return ctx;
|
||||
}
|
||||
|
||||
exports.DEFAULT_MESSAGE_DATA_TYPE = DEFAULT_MESSAGE_DATA_TYPE;
|
||||
exports.createMessageContext = createMessageContext;
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
/*!
|
||||
* @intlify/runtime v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
var shared = require('@intlify/shared');
|
||||
|
||||
const DEFAULT_MODIFIER = (str) => str;
|
||||
const DEFAULT_MESSAGE = (ctx) => ''; // eslint-disable-line
|
||||
const DEFAULT_MESSAGE_DATA_TYPE = 'text';
|
||||
const DEFAULT_NORMALIZE = (values) => values.length === 0 ? '' : values.join('');
|
||||
const DEFAULT_INTERPOLATE = shared.toDisplayString;
|
||||
function pluralDefault(choice, choicesLength) {
|
||||
choice = Math.abs(choice);
|
||||
if (choicesLength === 2) {
|
||||
// prettier-ignore
|
||||
return choice
|
||||
? choice > 1
|
||||
? 1
|
||||
: 0
|
||||
: 1;
|
||||
}
|
||||
return choice ? Math.min(choice, 2) : 0;
|
||||
}
|
||||
function getPluralIndex(options) {
|
||||
// prettier-ignore
|
||||
const index = shared.isNumber(options.pluralIndex)
|
||||
? options.pluralIndex
|
||||
: -1;
|
||||
// prettier-ignore
|
||||
return options.named && (shared.isNumber(options.named.count) || shared.isNumber(options.named.n))
|
||||
? shared.isNumber(options.named.count)
|
||||
? options.named.count
|
||||
: shared.isNumber(options.named.n)
|
||||
? options.named.n
|
||||
: index
|
||||
: index;
|
||||
}
|
||||
function normalizeNamed(pluralIndex, props) {
|
||||
if (!props.count) {
|
||||
props.count = pluralIndex;
|
||||
}
|
||||
if (!props.n) {
|
||||
props.n = pluralIndex;
|
||||
}
|
||||
}
|
||||
function createMessageContext(options = {}) {
|
||||
const locale = options.locale;
|
||||
const pluralIndex = getPluralIndex(options);
|
||||
const pluralRule = shared.isObject(options.pluralRules) &&
|
||||
shared.isString(locale) &&
|
||||
shared.isFunction(options.pluralRules[locale])
|
||||
? options.pluralRules[locale]
|
||||
: pluralDefault;
|
||||
const orgPluralRule = shared.isObject(options.pluralRules) &&
|
||||
shared.isString(locale) &&
|
||||
shared.isFunction(options.pluralRules[locale])
|
||||
? pluralDefault
|
||||
: undefined;
|
||||
const plural = (messages) => messages[pluralRule(pluralIndex, messages.length, orgPluralRule)];
|
||||
const _list = options.list || [];
|
||||
const list = (index) => _list[index];
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const _named = options.named || {};
|
||||
shared.isNumber(options.pluralIndex) && normalizeNamed(pluralIndex, _named);
|
||||
const named = (key) => _named[key];
|
||||
// TODO: need to design resolve message function?
|
||||
function message(key) {
|
||||
// prettier-ignore
|
||||
const msg = shared.isFunction(options.messages)
|
||||
? options.messages(key)
|
||||
: shared.isObject(options.messages)
|
||||
? options.messages[key]
|
||||
: false;
|
||||
return !msg
|
||||
? options.parent
|
||||
? options.parent.message(key) // resolve from parent messages
|
||||
: DEFAULT_MESSAGE
|
||||
: msg;
|
||||
}
|
||||
const _modifier = (name) => options.modifiers
|
||||
? options.modifiers[name]
|
||||
: DEFAULT_MODIFIER;
|
||||
const normalize = shared.isPlainObject(options.processor) && shared.isFunction(options.processor.normalize)
|
||||
? options.processor.normalize
|
||||
: DEFAULT_NORMALIZE;
|
||||
const interpolate = shared.isPlainObject(options.processor) &&
|
||||
shared.isFunction(options.processor.interpolate)
|
||||
? options.processor.interpolate
|
||||
: DEFAULT_INTERPOLATE;
|
||||
const type = shared.isPlainObject(options.processor) && shared.isString(options.processor.type)
|
||||
? options.processor.type
|
||||
: DEFAULT_MESSAGE_DATA_TYPE;
|
||||
const ctx = {
|
||||
["list" /* LIST */]: list,
|
||||
["named" /* NAMED */]: named,
|
||||
["plural" /* PLURAL */]: plural,
|
||||
["linked" /* LINKED */]: (key, modifier) => {
|
||||
// TODO: should check `key`
|
||||
const msg = message(key)(ctx);
|
||||
return shared.isString(modifier) ? _modifier(modifier)(msg) : msg;
|
||||
},
|
||||
["message" /* MESSAGE */]: message,
|
||||
["type" /* TYPE */]: type,
|
||||
["interpolate" /* INTERPOLATE */]: interpolate,
|
||||
["normalize" /* NORMALIZE */]: normalize
|
||||
};
|
||||
return ctx;
|
||||
}
|
||||
|
||||
exports.DEFAULT_MESSAGE_DATA_TYPE = DEFAULT_MESSAGE_DATA_TYPE;
|
||||
exports.createMessageContext = createMessageContext;
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
import { Path } from '@intlify/message-resolver';
|
||||
|
||||
export declare type CoreMissingType = 'translate' | 'datetime format' | 'number format';
|
||||
|
||||
export declare function createMessageContext<T = string, N = {}>(options?: MessageContextOptions<T, N>): MessageContext<T>;
|
||||
|
||||
export declare const DEFAULT_MESSAGE_DATA_TYPE = "text";
|
||||
|
||||
declare type ExtractToStringFunction<T> = T[ExtractToStringKey<T>];
|
||||
|
||||
declare type ExtractToStringKey<T> = Extract<keyof T, 'toString'>;
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type FallbackLocale = Locale | Locale[] | {
|
||||
[locale in string]: Locale[];
|
||||
} | false;
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type LinkedModifiers<T = string> = {
|
||||
[key: string]: LinkedModify<T>;
|
||||
};
|
||||
|
||||
export declare type LinkedModify<T = string> = (value: T) => MessageType<T>;
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type Locale = string;
|
||||
|
||||
export declare interface MessageContext<T = string> {
|
||||
list(index: number): unknown;
|
||||
named(key: string): unknown;
|
||||
plural(messages: T[]): T;
|
||||
linked(key: Path, modifier?: string): MessageType<T>;
|
||||
message(key: Path): MessageFunction<T>;
|
||||
type: string;
|
||||
interpolate: MessageInterpolate<T>;
|
||||
normalize: MessageNormalize<T>;
|
||||
}
|
||||
|
||||
export declare interface MessageContextOptions<T = string, N = {}> {
|
||||
parent?: MessageContext<T>;
|
||||
locale?: string;
|
||||
list?: unknown[];
|
||||
named?: NamedValue<N>;
|
||||
modifiers?: LinkedModifiers<T>;
|
||||
pluralIndex?: number;
|
||||
pluralRules?: PluralizationRules;
|
||||
messages?: MessageFunctions<T> | MessageResolveFunction<T>;
|
||||
processor?: MessageProcessor<T>;
|
||||
}
|
||||
|
||||
export declare type MessageFunction<T = string> = MessageFunctionCallable | MessageFunctionInternal<T>;
|
||||
|
||||
export declare type MessageFunctionCallable = <T = string>(ctx: MessageContext<T>) => MessageType<T>;
|
||||
|
||||
export declare type MessageFunctionInternal<T = string> = {
|
||||
(ctx: MessageContext<T>): MessageType<T>;
|
||||
key?: string;
|
||||
locale?: string;
|
||||
source?: string;
|
||||
};
|
||||
|
||||
export declare type MessageFunctions<T = string> = Record<string, MessageFunction<T>>;
|
||||
|
||||
export declare type MessageInterpolate<T = string> = (val: unknown) => MessageType<T>;
|
||||
|
||||
export declare type MessageNormalize<T = string> = (values: MessageType<string | T>[]) => MessageType<T | T[]>;
|
||||
|
||||
export declare interface MessageProcessor<T = string> {
|
||||
type?: string;
|
||||
interpolate?: MessageInterpolate<T>;
|
||||
normalize?: MessageNormalize<T>;
|
||||
}
|
||||
|
||||
export declare type MessageResolveFunction<T = string> = (key: string) => MessageFunction<T>;
|
||||
|
||||
export declare type MessageType<T = string> = T extends string ? string : StringConvertable<T>;
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type NamedValue<T = {}> = T & Record<string, unknown>;
|
||||
|
||||
export declare type PluralizationProps = {
|
||||
n?: number;
|
||||
count?: number;
|
||||
};
|
||||
|
||||
export declare type PluralizationRule = (choice: number, choicesLength: number, orgRule?: PluralizationRule) => number;
|
||||
|
||||
/** @VueI18nGeneral */
|
||||
export declare type PluralizationRules = {
|
||||
[locale: string]: PluralizationRule;
|
||||
};
|
||||
|
||||
declare type StringConvertable<T> = ExtractToStringKey<T> extends never ? unknown : ExtractToStringFunction<T> extends (...args: any) => string ? T : unknown;
|
||||
|
||||
export { }
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
/*!
|
||||
* @intlify/runtime v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
import { isNumber, isObject, isString, isFunction, isPlainObject, toDisplayString } from '@intlify/shared';
|
||||
|
||||
const DEFAULT_MODIFIER = (str) => str;
|
||||
const DEFAULT_MESSAGE = (ctx) => ''; // eslint-disable-line
|
||||
const DEFAULT_MESSAGE_DATA_TYPE = 'text';
|
||||
const DEFAULT_NORMALIZE = (values) => values.length === 0 ? '' : values.join('');
|
||||
const DEFAULT_INTERPOLATE = toDisplayString;
|
||||
function pluralDefault(choice, choicesLength) {
|
||||
choice = Math.abs(choice);
|
||||
if (choicesLength === 2) {
|
||||
// prettier-ignore
|
||||
return choice
|
||||
? choice > 1
|
||||
? 1
|
||||
: 0
|
||||
: 1;
|
||||
}
|
||||
return choice ? Math.min(choice, 2) : 0;
|
||||
}
|
||||
function getPluralIndex(options) {
|
||||
// prettier-ignore
|
||||
const index = isNumber(options.pluralIndex)
|
||||
? options.pluralIndex
|
||||
: -1;
|
||||
// prettier-ignore
|
||||
return options.named && (isNumber(options.named.count) || isNumber(options.named.n))
|
||||
? isNumber(options.named.count)
|
||||
? options.named.count
|
||||
: isNumber(options.named.n)
|
||||
? options.named.n
|
||||
: index
|
||||
: index;
|
||||
}
|
||||
function normalizeNamed(pluralIndex, props) {
|
||||
if (!props.count) {
|
||||
props.count = pluralIndex;
|
||||
}
|
||||
if (!props.n) {
|
||||
props.n = pluralIndex;
|
||||
}
|
||||
}
|
||||
function createMessageContext(options = {}) {
|
||||
const locale = options.locale;
|
||||
const pluralIndex = getPluralIndex(options);
|
||||
const pluralRule = isObject(options.pluralRules) &&
|
||||
isString(locale) &&
|
||||
isFunction(options.pluralRules[locale])
|
||||
? options.pluralRules[locale]
|
||||
: pluralDefault;
|
||||
const orgPluralRule = isObject(options.pluralRules) &&
|
||||
isString(locale) &&
|
||||
isFunction(options.pluralRules[locale])
|
||||
? pluralDefault
|
||||
: undefined;
|
||||
const plural = (messages) => messages[pluralRule(pluralIndex, messages.length, orgPluralRule)];
|
||||
const _list = options.list || [];
|
||||
const list = (index) => _list[index];
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const _named = options.named || {};
|
||||
isNumber(options.pluralIndex) && normalizeNamed(pluralIndex, _named);
|
||||
const named = (key) => _named[key];
|
||||
// TODO: need to design resolve message function?
|
||||
function message(key) {
|
||||
// prettier-ignore
|
||||
const msg = isFunction(options.messages)
|
||||
? options.messages(key)
|
||||
: isObject(options.messages)
|
||||
? options.messages[key]
|
||||
: false;
|
||||
return !msg
|
||||
? options.parent
|
||||
? options.parent.message(key) // resolve from parent messages
|
||||
: DEFAULT_MESSAGE
|
||||
: msg;
|
||||
}
|
||||
const _modifier = (name) => options.modifiers
|
||||
? options.modifiers[name]
|
||||
: DEFAULT_MODIFIER;
|
||||
const normalize = isPlainObject(options.processor) && isFunction(options.processor.normalize)
|
||||
? options.processor.normalize
|
||||
: DEFAULT_NORMALIZE;
|
||||
const interpolate = isPlainObject(options.processor) &&
|
||||
isFunction(options.processor.interpolate)
|
||||
? options.processor.interpolate
|
||||
: DEFAULT_INTERPOLATE;
|
||||
const type = isPlainObject(options.processor) && isString(options.processor.type)
|
||||
? options.processor.type
|
||||
: DEFAULT_MESSAGE_DATA_TYPE;
|
||||
const ctx = {
|
||||
["list" /* LIST */]: list,
|
||||
["named" /* NAMED */]: named,
|
||||
["plural" /* PLURAL */]: plural,
|
||||
["linked" /* LINKED */]: (key, modifier) => {
|
||||
// TODO: should check `key`
|
||||
const msg = message(key)(ctx);
|
||||
return isString(modifier) ? _modifier(modifier)(msg) : msg;
|
||||
},
|
||||
["message" /* MESSAGE */]: message,
|
||||
["type" /* TYPE */]: type,
|
||||
["interpolate" /* INTERPOLATE */]: interpolate,
|
||||
["normalize" /* NORMALIZE */]: normalize
|
||||
};
|
||||
return ctx;
|
||||
}
|
||||
|
||||
export { DEFAULT_MESSAGE_DATA_TYPE, createMessageContext };
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./dist/runtime.cjs.prod.js')
|
||||
} else {
|
||||
module.exports = require('./dist/runtime.cjs.js')
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"name": "@intlify/runtime",
|
||||
"version": "9.1.9",
|
||||
"description": "@intlify/runtime",
|
||||
"keywords": [
|
||||
"i18n",
|
||||
"internationalization",
|
||||
"intlify",
|
||||
"runtime"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "kazuya kawaguchi",
|
||||
"email": "kawakazu80@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/intlify/vue-i18n-next/tree/master/packages/runtime#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/intlify/vue-i18n-next.git",
|
||||
"directory": "packages/runtime"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/intlify/vue-i18n-next/issues"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"dist"
|
||||
],
|
||||
"main": "index.js",
|
||||
"module": "dist/runtime.esm-bundler.js",
|
||||
"types": "dist/runtime.d.ts",
|
||||
"dependencies": {
|
||||
"@intlify/message-compiler": "9.1.9",
|
||||
"@intlify/message-resolver": "9.1.9",
|
||||
"@intlify/shared": "9.1.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"buildOptions": {
|
||||
"name": "IntlifyRuntime",
|
||||
"formats": [
|
||||
"esm-bundler",
|
||||
"cjs"
|
||||
]
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020 kazuya kawaguchi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
# @intlify/shared
|
||||
|
||||
The shared utility package for intlify project
|
||||
|
||||
## Forks
|
||||
The implementation of this module is contains code forked from other packages or projects:
|
||||
|
||||
- [@vue/shared](https://github.com/vuejs/vue-next/tree/master/packages/shared)
|
||||
- Useful Utilities at `utils.ts`
|
||||
- Author: Evan You
|
||||
- License: MIT
|
||||
- Event Emitter at `emitter.ts` and `emittable.ts`
|
||||
- Author: Jason Miller
|
||||
- License: MIT
|
||||
|
||||
## :copyright: License
|
||||
|
||||
[MIT](http://opensource.org/licenses/MIT)
|
||||
+222
@@ -0,0 +1,222 @@
|
||||
/*!
|
||||
* @intlify/shared v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
/**
|
||||
* Original Utilities
|
||||
* written by kazuya kawaguchi
|
||||
*/
|
||||
const inBrowser = typeof window !== 'undefined';
|
||||
exports.mark = void 0;
|
||||
exports.measure = void 0;
|
||||
{
|
||||
const perf = inBrowser && window.performance;
|
||||
if (perf &&
|
||||
perf.mark &&
|
||||
perf.measure &&
|
||||
perf.clearMarks &&
|
||||
perf.clearMeasures) {
|
||||
exports.mark = (tag) => perf.mark(tag);
|
||||
exports.measure = (name, startTag, endTag) => {
|
||||
perf.measure(name, startTag, endTag);
|
||||
perf.clearMarks(startTag);
|
||||
perf.clearMarks(endTag);
|
||||
};
|
||||
}
|
||||
}
|
||||
const RE_ARGS = /\{([0-9a-zA-Z]+)\}/g;
|
||||
/* eslint-disable */
|
||||
function format(message, ...args) {
|
||||
if (args.length === 1 && isObject(args[0])) {
|
||||
args = args[0];
|
||||
}
|
||||
if (!args || !args.hasOwnProperty) {
|
||||
args = {};
|
||||
}
|
||||
return message.replace(RE_ARGS, (match, identifier) => {
|
||||
return args.hasOwnProperty(identifier) ? args[identifier] : '';
|
||||
});
|
||||
}
|
||||
const hasSymbol = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
|
||||
const makeSymbol = (name) => hasSymbol ? Symbol(name) : name;
|
||||
const generateFormatCacheKey = (locale, key, source) => friendlyJSONstringify({ l: locale, k: key, s: source });
|
||||
const friendlyJSONstringify = (json) => JSON.stringify(json)
|
||||
.replace(/\u2028/g, '\\u2028')
|
||||
.replace(/\u2029/g, '\\u2029')
|
||||
.replace(/\u0027/g, '\\u0027');
|
||||
const isNumber = (val) => typeof val === 'number' && isFinite(val);
|
||||
const isDate = (val) => toTypeString(val) === '[object Date]';
|
||||
const isRegExp = (val) => toTypeString(val) === '[object RegExp]';
|
||||
const isEmptyObject = (val) => isPlainObject(val) && Object.keys(val).length === 0;
|
||||
function warn(msg, err) {
|
||||
if (typeof console !== 'undefined') {
|
||||
console.warn(`[intlify] ` + msg);
|
||||
/* istanbul ignore if */
|
||||
if (err) {
|
||||
console.warn(err.stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
const assign = Object.assign;
|
||||
let _globalThis;
|
||||
const getGlobalThis = () => {
|
||||
// prettier-ignore
|
||||
return (_globalThis ||
|
||||
(_globalThis =
|
||||
typeof globalThis !== 'undefined'
|
||||
? globalThis
|
||||
: typeof self !== 'undefined'
|
||||
? self
|
||||
: typeof window !== 'undefined'
|
||||
? window
|
||||
: typeof global !== 'undefined'
|
||||
? global
|
||||
: {}));
|
||||
};
|
||||
function escapeHtml(rawText) {
|
||||
return rawText
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
}
|
||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
function hasOwn(obj, key) {
|
||||
return hasOwnProperty.call(obj, key);
|
||||
}
|
||||
/* eslint-enable */
|
||||
/**
|
||||
* Useful Utilities By Evan you
|
||||
* Modified by kazuya kawaguchi
|
||||
* MIT License
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/index.ts
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/codeframe.ts
|
||||
*/
|
||||
const isArray = Array.isArray;
|
||||
const isFunction = (val) => typeof val === 'function';
|
||||
const isString = (val) => typeof val === 'string';
|
||||
const isBoolean = (val) => typeof val === 'boolean';
|
||||
const isSymbol = (val) => typeof val === 'symbol';
|
||||
const isObject = (val) => // eslint-disable-line
|
||||
val !== null && typeof val === 'object';
|
||||
const isPromise = (val) => {
|
||||
return isObject(val) && isFunction(val.then) && isFunction(val.catch);
|
||||
};
|
||||
const objectToString = Object.prototype.toString;
|
||||
const toTypeString = (value) => objectToString.call(value);
|
||||
const isPlainObject = (val) => toTypeString(val) === '[object Object]';
|
||||
// for converting list and named values to displayed strings.
|
||||
const toDisplayString = (val) => {
|
||||
return val == null
|
||||
? ''
|
||||
: isArray(val) || (isPlainObject(val) && val.toString === objectToString)
|
||||
? JSON.stringify(val, null, 2)
|
||||
: String(val);
|
||||
};
|
||||
const RANGE = 2;
|
||||
function generateCodeFrame(source, start = 0, end = source.length) {
|
||||
const lines = source.split(/\r?\n/);
|
||||
let count = 0;
|
||||
const res = [];
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
count += lines[i].length + 1;
|
||||
if (count >= start) {
|
||||
for (let j = i - RANGE; j <= i + RANGE || end > count; j++) {
|
||||
if (j < 0 || j >= lines.length)
|
||||
continue;
|
||||
const line = j + 1;
|
||||
res.push(`${line}${' '.repeat(3 - String(line).length)}| ${lines[j]}`);
|
||||
const lineLength = lines[j].length;
|
||||
if (j === i) {
|
||||
// push underline
|
||||
const pad = start - (count - lineLength) + 1;
|
||||
const length = Math.max(1, end > count ? lineLength - pad : end - start);
|
||||
res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));
|
||||
}
|
||||
else if (j > i) {
|
||||
if (end > count) {
|
||||
const length = Math.max(Math.min(end - count, lineLength), 1);
|
||||
res.push(` | ` + '^'.repeat(length));
|
||||
}
|
||||
count += lineLength + 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return res.join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Event emitter, forked from the below:
|
||||
* - original repository url: https://github.com/developit/mitt
|
||||
* - code url: https://github.com/developit/mitt/blob/master/src/index.ts
|
||||
* - author: Jason Miller (https://github.com/developit)
|
||||
* - license: MIT
|
||||
*/
|
||||
/**
|
||||
* Create a event emitter
|
||||
*
|
||||
* @returns An event emitter
|
||||
*/
|
||||
function createEmitter() {
|
||||
const events = new Map();
|
||||
const emitter = {
|
||||
events,
|
||||
on(event, handler) {
|
||||
const handlers = events.get(event);
|
||||
const added = handlers && handlers.push(handler);
|
||||
if (!added) {
|
||||
events.set(event, [handler]);
|
||||
}
|
||||
},
|
||||
off(event, handler) {
|
||||
const handlers = events.get(event);
|
||||
if (handlers) {
|
||||
handlers.splice(handlers.indexOf(handler) >>> 0, 1);
|
||||
}
|
||||
},
|
||||
emit(event, payload) {
|
||||
(events.get(event) || [])
|
||||
.slice()
|
||||
.map(handler => handler(payload));
|
||||
(events.get('*') || [])
|
||||
.slice()
|
||||
.map(handler => handler(event, payload));
|
||||
}
|
||||
};
|
||||
return emitter;
|
||||
}
|
||||
|
||||
exports.assign = assign;
|
||||
exports.createEmitter = createEmitter;
|
||||
exports.escapeHtml = escapeHtml;
|
||||
exports.format = format;
|
||||
exports.friendlyJSONstringify = friendlyJSONstringify;
|
||||
exports.generateCodeFrame = generateCodeFrame;
|
||||
exports.generateFormatCacheKey = generateFormatCacheKey;
|
||||
exports.getGlobalThis = getGlobalThis;
|
||||
exports.hasOwn = hasOwn;
|
||||
exports.inBrowser = inBrowser;
|
||||
exports.isArray = isArray;
|
||||
exports.isBoolean = isBoolean;
|
||||
exports.isDate = isDate;
|
||||
exports.isEmptyObject = isEmptyObject;
|
||||
exports.isFunction = isFunction;
|
||||
exports.isNumber = isNumber;
|
||||
exports.isObject = isObject;
|
||||
exports.isPlainObject = isPlainObject;
|
||||
exports.isPromise = isPromise;
|
||||
exports.isRegExp = isRegExp;
|
||||
exports.isString = isString;
|
||||
exports.isSymbol = isSymbol;
|
||||
exports.makeSymbol = makeSymbol;
|
||||
exports.objectToString = objectToString;
|
||||
exports.toDisplayString = toDisplayString;
|
||||
exports.toTypeString = toTypeString;
|
||||
exports.warn = warn;
|
||||
+209
@@ -0,0 +1,209 @@
|
||||
/*!
|
||||
* @intlify/shared v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
/**
|
||||
* Original Utilities
|
||||
* written by kazuya kawaguchi
|
||||
*/
|
||||
const inBrowser = typeof window !== 'undefined';
|
||||
let mark;
|
||||
let measure;
|
||||
const RE_ARGS = /\{([0-9a-zA-Z]+)\}/g;
|
||||
/* eslint-disable */
|
||||
function format(message, ...args) {
|
||||
if (args.length === 1 && isObject(args[0])) {
|
||||
args = args[0];
|
||||
}
|
||||
if (!args || !args.hasOwnProperty) {
|
||||
args = {};
|
||||
}
|
||||
return message.replace(RE_ARGS, (match, identifier) => {
|
||||
return args.hasOwnProperty(identifier) ? args[identifier] : '';
|
||||
});
|
||||
}
|
||||
const hasSymbol = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
|
||||
const makeSymbol = (name) => hasSymbol ? Symbol(name) : name;
|
||||
const generateFormatCacheKey = (locale, key, source) => friendlyJSONstringify({ l: locale, k: key, s: source });
|
||||
const friendlyJSONstringify = (json) => JSON.stringify(json)
|
||||
.replace(/\u2028/g, '\\u2028')
|
||||
.replace(/\u2029/g, '\\u2029')
|
||||
.replace(/\u0027/g, '\\u0027');
|
||||
const isNumber = (val) => typeof val === 'number' && isFinite(val);
|
||||
const isDate = (val) => toTypeString(val) === '[object Date]';
|
||||
const isRegExp = (val) => toTypeString(val) === '[object RegExp]';
|
||||
const isEmptyObject = (val) => isPlainObject(val) && Object.keys(val).length === 0;
|
||||
function warn(msg, err) {
|
||||
if (typeof console !== 'undefined') {
|
||||
console.warn(`[intlify] ` + msg);
|
||||
/* istanbul ignore if */
|
||||
if (err) {
|
||||
console.warn(err.stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
const assign = Object.assign;
|
||||
let _globalThis;
|
||||
const getGlobalThis = () => {
|
||||
// prettier-ignore
|
||||
return (_globalThis ||
|
||||
(_globalThis =
|
||||
typeof globalThis !== 'undefined'
|
||||
? globalThis
|
||||
: typeof self !== 'undefined'
|
||||
? self
|
||||
: typeof window !== 'undefined'
|
||||
? window
|
||||
: typeof global !== 'undefined'
|
||||
? global
|
||||
: {}));
|
||||
};
|
||||
function escapeHtml(rawText) {
|
||||
return rawText
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
}
|
||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
function hasOwn(obj, key) {
|
||||
return hasOwnProperty.call(obj, key);
|
||||
}
|
||||
/* eslint-enable */
|
||||
/**
|
||||
* Useful Utilities By Evan you
|
||||
* Modified by kazuya kawaguchi
|
||||
* MIT License
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/index.ts
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/codeframe.ts
|
||||
*/
|
||||
const isArray = Array.isArray;
|
||||
const isFunction = (val) => typeof val === 'function';
|
||||
const isString = (val) => typeof val === 'string';
|
||||
const isBoolean = (val) => typeof val === 'boolean';
|
||||
const isSymbol = (val) => typeof val === 'symbol';
|
||||
const isObject = (val) => // eslint-disable-line
|
||||
val !== null && typeof val === 'object';
|
||||
const isPromise = (val) => {
|
||||
return isObject(val) && isFunction(val.then) && isFunction(val.catch);
|
||||
};
|
||||
const objectToString = Object.prototype.toString;
|
||||
const toTypeString = (value) => objectToString.call(value);
|
||||
const isPlainObject = (val) => toTypeString(val) === '[object Object]';
|
||||
// for converting list and named values to displayed strings.
|
||||
const toDisplayString = (val) => {
|
||||
return val == null
|
||||
? ''
|
||||
: isArray(val) || (isPlainObject(val) && val.toString === objectToString)
|
||||
? JSON.stringify(val, null, 2)
|
||||
: String(val);
|
||||
};
|
||||
const RANGE = 2;
|
||||
function generateCodeFrame(source, start = 0, end = source.length) {
|
||||
const lines = source.split(/\r?\n/);
|
||||
let count = 0;
|
||||
const res = [];
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
count += lines[i].length + 1;
|
||||
if (count >= start) {
|
||||
for (let j = i - RANGE; j <= i + RANGE || end > count; j++) {
|
||||
if (j < 0 || j >= lines.length)
|
||||
continue;
|
||||
const line = j + 1;
|
||||
res.push(`${line}${' '.repeat(3 - String(line).length)}| ${lines[j]}`);
|
||||
const lineLength = lines[j].length;
|
||||
if (j === i) {
|
||||
// push underline
|
||||
const pad = start - (count - lineLength) + 1;
|
||||
const length = Math.max(1, end > count ? lineLength - pad : end - start);
|
||||
res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));
|
||||
}
|
||||
else if (j > i) {
|
||||
if (end > count) {
|
||||
const length = Math.max(Math.min(end - count, lineLength), 1);
|
||||
res.push(` | ` + '^'.repeat(length));
|
||||
}
|
||||
count += lineLength + 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return res.join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Event emitter, forked from the below:
|
||||
* - original repository url: https://github.com/developit/mitt
|
||||
* - code url: https://github.com/developit/mitt/blob/master/src/index.ts
|
||||
* - author: Jason Miller (https://github.com/developit)
|
||||
* - license: MIT
|
||||
*/
|
||||
/**
|
||||
* Create a event emitter
|
||||
*
|
||||
* @returns An event emitter
|
||||
*/
|
||||
function createEmitter() {
|
||||
const events = new Map();
|
||||
const emitter = {
|
||||
events,
|
||||
on(event, handler) {
|
||||
const handlers = events.get(event);
|
||||
const added = handlers && handlers.push(handler);
|
||||
if (!added) {
|
||||
events.set(event, [handler]);
|
||||
}
|
||||
},
|
||||
off(event, handler) {
|
||||
const handlers = events.get(event);
|
||||
if (handlers) {
|
||||
handlers.splice(handlers.indexOf(handler) >>> 0, 1);
|
||||
}
|
||||
},
|
||||
emit(event, payload) {
|
||||
(events.get(event) || [])
|
||||
.slice()
|
||||
.map(handler => handler(payload));
|
||||
(events.get('*') || [])
|
||||
.slice()
|
||||
.map(handler => handler(event, payload));
|
||||
}
|
||||
};
|
||||
return emitter;
|
||||
}
|
||||
|
||||
exports.assign = assign;
|
||||
exports.createEmitter = createEmitter;
|
||||
exports.escapeHtml = escapeHtml;
|
||||
exports.format = format;
|
||||
exports.friendlyJSONstringify = friendlyJSONstringify;
|
||||
exports.generateCodeFrame = generateCodeFrame;
|
||||
exports.generateFormatCacheKey = generateFormatCacheKey;
|
||||
exports.getGlobalThis = getGlobalThis;
|
||||
exports.hasOwn = hasOwn;
|
||||
exports.inBrowser = inBrowser;
|
||||
exports.isArray = isArray;
|
||||
exports.isBoolean = isBoolean;
|
||||
exports.isDate = isDate;
|
||||
exports.isEmptyObject = isEmptyObject;
|
||||
exports.isFunction = isFunction;
|
||||
exports.isNumber = isNumber;
|
||||
exports.isObject = isObject;
|
||||
exports.isPlainObject = isPlainObject;
|
||||
exports.isPromise = isPromise;
|
||||
exports.isRegExp = isRegExp;
|
||||
exports.isString = isString;
|
||||
exports.isSymbol = isSymbol;
|
||||
exports.makeSymbol = makeSymbol;
|
||||
exports.mark = mark;
|
||||
exports.measure = measure;
|
||||
exports.objectToString = objectToString;
|
||||
exports.toDisplayString = toDisplayString;
|
||||
exports.toTypeString = toTypeString;
|
||||
exports.warn = warn;
|
||||
+145
@@ -0,0 +1,145 @@
|
||||
|
||||
export declare const assign: {
|
||||
<T, U>(target: T, source: U): T & U;
|
||||
<T_1, U_1, V>(target: T_1, source1: U_1, source2: V): T_1 & U_1 & V;
|
||||
<T_2, U_2, V_1, W>(target: T_2, source1: U_2, source2: V_1, source3: W): T_2 & U_2 & V_1 & W;
|
||||
(target: object, ...sources: any[]): any;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a event emitter
|
||||
*
|
||||
* @returns An event emitter
|
||||
*/
|
||||
export declare function createEmitter<Events extends Record<EventType, unknown>>(): Emittable<Events>;
|
||||
|
||||
/**
|
||||
* Event emitter interface
|
||||
*/
|
||||
export declare interface Emittable<Events extends Record<EventType, unknown> = {}> {
|
||||
/**
|
||||
* A map of event names of registered event handlers
|
||||
*/
|
||||
events: EventHandlerMap<Events>;
|
||||
/**
|
||||
* Register an event handler with the event type
|
||||
*
|
||||
* @param event - An {@link EventType}
|
||||
* @param handler - An {@link EventHandler}, or a {@link WildcardEventHandler} if you are specified "*"
|
||||
*/
|
||||
on<Key extends keyof Events>(event: Key | '*', handler: EventHandler<Events[keyof Events]> | WildcardEventHandler<Events>): void;
|
||||
/**
|
||||
* Unregister an event handler for the event type
|
||||
*
|
||||
* @param event - An {@link EventType}
|
||||
* @param handler - An {@link EventHandler}, or a {@link WildcardEventHandler} if you are specified "*"
|
||||
*/
|
||||
off<Key extends keyof Events>(event: Key | '*', handler: EventHandler<Events[keyof Events]> | WildcardEventHandler<Events>): void;
|
||||
/**
|
||||
* Invoke all handlers with the event type
|
||||
*
|
||||
* @remarks
|
||||
* Note Manually firing "*" handlers should be not supported
|
||||
*
|
||||
* @param event - An {@link EventType}
|
||||
* @param payload - An event payload, optional
|
||||
*/
|
||||
emit<Key extends keyof Events>(event: Key, payload?: Events[keyof Events]): void;
|
||||
}
|
||||
|
||||
export declare function escapeHtml(rawText: string): string;
|
||||
|
||||
/**
|
||||
* Event handler
|
||||
*/
|
||||
export declare type EventHandler<T = unknown> = (payload?: T) => void;
|
||||
|
||||
/**
|
||||
* Event handler list
|
||||
*/
|
||||
export declare type EventHandlerList<T = unknown> = Array<EventHandler<T>>;
|
||||
|
||||
/**
|
||||
* Event handler map
|
||||
*/
|
||||
export declare type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<keyof Events | '*', EventHandlerList<Events[keyof Events]> | WildcardEventHandlerList<Events>>;
|
||||
|
||||
/**
|
||||
* Event type
|
||||
*/
|
||||
export declare type EventType = string | symbol;
|
||||
|
||||
export declare function format(message: string, ...args: any): string;
|
||||
|
||||
export declare const friendlyJSONstringify: (json: unknown) => string;
|
||||
|
||||
export declare function generateCodeFrame(source: string, start?: number, end?: number): string;
|
||||
|
||||
export declare const generateFormatCacheKey: (locale: string, key: string, source: string) => string;
|
||||
|
||||
export declare const getGlobalThis: () => any;
|
||||
|
||||
export declare function hasOwn(obj: object | Array<any>, key: string): boolean;
|
||||
|
||||
/**
|
||||
* Original Utilities
|
||||
* written by kazuya kawaguchi
|
||||
*/
|
||||
export declare const inBrowser: boolean;
|
||||
|
||||
/**
|
||||
* Useful Utilities By Evan you
|
||||
* Modified by kazuya kawaguchi
|
||||
* MIT License
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/index.ts
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/codeframe.ts
|
||||
*/
|
||||
export declare const isArray: (arg: any) => arg is any[];
|
||||
|
||||
export declare const isBoolean: (val: unknown) => val is boolean;
|
||||
|
||||
export declare const isDate: (val: unknown) => val is Date;
|
||||
|
||||
export declare const isEmptyObject: (val: unknown) => val is boolean;
|
||||
|
||||
export declare const isFunction: (val: unknown) => val is Function;
|
||||
|
||||
export declare const isNumber: (val: unknown) => val is number;
|
||||
|
||||
export declare const isObject: (val: unknown) => val is Record<any, any>;
|
||||
|
||||
export declare const isPlainObject: (val: unknown) => val is object;
|
||||
|
||||
export declare const isPromise: <T = any>(val: unknown) => val is Promise<T>;
|
||||
|
||||
export declare const isRegExp: (val: unknown) => val is RegExp;
|
||||
|
||||
export declare const isString: (val: unknown) => val is string;
|
||||
|
||||
export declare const isSymbol: (val: unknown) => val is symbol;
|
||||
|
||||
export declare const makeSymbol: (name: string) => symbol | string;
|
||||
|
||||
export declare let mark: (tag: string) => void | undefined;
|
||||
|
||||
export declare let measure: (name: string, startTag: string, endTag: string) => void | undefined;
|
||||
|
||||
export declare const objectToString: () => string;
|
||||
|
||||
export declare const toDisplayString: (val: unknown) => string;
|
||||
|
||||
export declare const toTypeString: (value: unknown) => string;
|
||||
|
||||
export declare function warn(msg: string, err?: Error): void;
|
||||
|
||||
/**
|
||||
* Wildcard event handler
|
||||
*/
|
||||
export declare type WildcardEventHandler<T = Record<string, unknown>> = (event: keyof T, payload?: T[keyof T]) => void;
|
||||
|
||||
/**
|
||||
* Wildcard event handler list
|
||||
*/
|
||||
export declare type WildcardEventHandlerList<T = Record<string, unknown>> = Array<WildcardEventHandler<T>>;
|
||||
|
||||
export { }
|
||||
+192
@@ -0,0 +1,192 @@
|
||||
/*!
|
||||
* @intlify/shared v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
/**
|
||||
* Original Utilities
|
||||
* written by kazuya kawaguchi
|
||||
*/
|
||||
const inBrowser = typeof window !== 'undefined';
|
||||
let mark;
|
||||
let measure;
|
||||
if ((process.env.NODE_ENV !== 'production')) {
|
||||
const perf = inBrowser && window.performance;
|
||||
if (perf &&
|
||||
perf.mark &&
|
||||
perf.measure &&
|
||||
perf.clearMarks &&
|
||||
perf.clearMeasures) {
|
||||
mark = (tag) => perf.mark(tag);
|
||||
measure = (name, startTag, endTag) => {
|
||||
perf.measure(name, startTag, endTag);
|
||||
perf.clearMarks(startTag);
|
||||
perf.clearMarks(endTag);
|
||||
};
|
||||
}
|
||||
}
|
||||
const RE_ARGS = /\{([0-9a-zA-Z]+)\}/g;
|
||||
/* eslint-disable */
|
||||
function format(message, ...args) {
|
||||
if (args.length === 1 && isObject(args[0])) {
|
||||
args = args[0];
|
||||
}
|
||||
if (!args || !args.hasOwnProperty) {
|
||||
args = {};
|
||||
}
|
||||
return message.replace(RE_ARGS, (match, identifier) => {
|
||||
return args.hasOwnProperty(identifier) ? args[identifier] : '';
|
||||
});
|
||||
}
|
||||
const hasSymbol = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
|
||||
const makeSymbol = (name) => hasSymbol ? Symbol(name) : name;
|
||||
const generateFormatCacheKey = (locale, key, source) => friendlyJSONstringify({ l: locale, k: key, s: source });
|
||||
const friendlyJSONstringify = (json) => JSON.stringify(json)
|
||||
.replace(/\u2028/g, '\\u2028')
|
||||
.replace(/\u2029/g, '\\u2029')
|
||||
.replace(/\u0027/g, '\\u0027');
|
||||
const isNumber = (val) => typeof val === 'number' && isFinite(val);
|
||||
const isDate = (val) => toTypeString(val) === '[object Date]';
|
||||
const isRegExp = (val) => toTypeString(val) === '[object RegExp]';
|
||||
const isEmptyObject = (val) => isPlainObject(val) && Object.keys(val).length === 0;
|
||||
function warn(msg, err) {
|
||||
if (typeof console !== 'undefined') {
|
||||
console.warn(`[intlify] ` + msg);
|
||||
/* istanbul ignore if */
|
||||
if (err) {
|
||||
console.warn(err.stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
const assign = Object.assign;
|
||||
let _globalThis;
|
||||
const getGlobalThis = () => {
|
||||
// prettier-ignore
|
||||
return (_globalThis ||
|
||||
(_globalThis =
|
||||
typeof globalThis !== 'undefined'
|
||||
? globalThis
|
||||
: typeof self !== 'undefined'
|
||||
? self
|
||||
: typeof window !== 'undefined'
|
||||
? window
|
||||
: typeof global !== 'undefined'
|
||||
? global
|
||||
: {}));
|
||||
};
|
||||
function escapeHtml(rawText) {
|
||||
return rawText
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
}
|
||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
function hasOwn(obj, key) {
|
||||
return hasOwnProperty.call(obj, key);
|
||||
}
|
||||
/* eslint-enable */
|
||||
/**
|
||||
* Useful Utilities By Evan you
|
||||
* Modified by kazuya kawaguchi
|
||||
* MIT License
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/index.ts
|
||||
* https://github.com/vuejs/vue-next/blob/master/packages/shared/src/codeframe.ts
|
||||
*/
|
||||
const isArray = Array.isArray;
|
||||
const isFunction = (val) => typeof val === 'function';
|
||||
const isString = (val) => typeof val === 'string';
|
||||
const isBoolean = (val) => typeof val === 'boolean';
|
||||
const isSymbol = (val) => typeof val === 'symbol';
|
||||
const isObject = (val) => // eslint-disable-line
|
||||
val !== null && typeof val === 'object';
|
||||
const isPromise = (val) => {
|
||||
return isObject(val) && isFunction(val.then) && isFunction(val.catch);
|
||||
};
|
||||
const objectToString = Object.prototype.toString;
|
||||
const toTypeString = (value) => objectToString.call(value);
|
||||
const isPlainObject = (val) => toTypeString(val) === '[object Object]';
|
||||
// for converting list and named values to displayed strings.
|
||||
const toDisplayString = (val) => {
|
||||
return val == null
|
||||
? ''
|
||||
: isArray(val) || (isPlainObject(val) && val.toString === objectToString)
|
||||
? JSON.stringify(val, null, 2)
|
||||
: String(val);
|
||||
};
|
||||
const RANGE = 2;
|
||||
function generateCodeFrame(source, start = 0, end = source.length) {
|
||||
const lines = source.split(/\r?\n/);
|
||||
let count = 0;
|
||||
const res = [];
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
count += lines[i].length + 1;
|
||||
if (count >= start) {
|
||||
for (let j = i - RANGE; j <= i + RANGE || end > count; j++) {
|
||||
if (j < 0 || j >= lines.length)
|
||||
continue;
|
||||
const line = j + 1;
|
||||
res.push(`${line}${' '.repeat(3 - String(line).length)}| ${lines[j]}`);
|
||||
const lineLength = lines[j].length;
|
||||
if (j === i) {
|
||||
// push underline
|
||||
const pad = start - (count - lineLength) + 1;
|
||||
const length = Math.max(1, end > count ? lineLength - pad : end - start);
|
||||
res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));
|
||||
}
|
||||
else if (j > i) {
|
||||
if (end > count) {
|
||||
const length = Math.max(Math.min(end - count, lineLength), 1);
|
||||
res.push(` | ` + '^'.repeat(length));
|
||||
}
|
||||
count += lineLength + 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return res.join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Event emitter, forked from the below:
|
||||
* - original repository url: https://github.com/developit/mitt
|
||||
* - code url: https://github.com/developit/mitt/blob/master/src/index.ts
|
||||
* - author: Jason Miller (https://github.com/developit)
|
||||
* - license: MIT
|
||||
*/
|
||||
/**
|
||||
* Create a event emitter
|
||||
*
|
||||
* @returns An event emitter
|
||||
*/
|
||||
function createEmitter() {
|
||||
const events = new Map();
|
||||
const emitter = {
|
||||
events,
|
||||
on(event, handler) {
|
||||
const handlers = events.get(event);
|
||||
const added = handlers && handlers.push(handler);
|
||||
if (!added) {
|
||||
events.set(event, [handler]);
|
||||
}
|
||||
},
|
||||
off(event, handler) {
|
||||
const handlers = events.get(event);
|
||||
if (handlers) {
|
||||
handlers.splice(handlers.indexOf(handler) >>> 0, 1);
|
||||
}
|
||||
},
|
||||
emit(event, payload) {
|
||||
(events.get(event) || [])
|
||||
.slice()
|
||||
.map(handler => handler(payload));
|
||||
(events.get('*') || [])
|
||||
.slice()
|
||||
.map(handler => handler(event, payload));
|
||||
}
|
||||
};
|
||||
return emitter;
|
||||
}
|
||||
|
||||
export { assign, createEmitter, escapeHtml, format, friendlyJSONstringify, generateCodeFrame, generateFormatCacheKey, getGlobalThis, hasOwn, inBrowser, isArray, isBoolean, isDate, isEmptyObject, isFunction, isNumber, isObject, isPlainObject, isPromise, isRegExp, isString, isSymbol, makeSymbol, mark, measure, objectToString, toDisplayString, toTypeString, warn };
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./dist/shared.cjs.prod.js')
|
||||
} else {
|
||||
module.exports = require('./dist/shared.cjs.js')
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"name": "@intlify/shared",
|
||||
"version": "9.1.9",
|
||||
"description": "@intlify/shared",
|
||||
"keywords": [
|
||||
"i18n",
|
||||
"internationalization",
|
||||
"intlify",
|
||||
"utitlity"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "kazuya kawaguchi",
|
||||
"email": "kawakazu80@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/intlify/vue-i18n-next/tree/master/packages/shared#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/intlify/vue-i18n-next.git",
|
||||
"directory": "packages/shared"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/intlify/vue-i18n-next/issues"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"dist"
|
||||
],
|
||||
"main": "index.js",
|
||||
"module": "dist/shared.esm-bundler.js",
|
||||
"types": "dist/shared.d.ts",
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"buildOptions": {
|
||||
"name": "IntlifyShared",
|
||||
"formats": [
|
||||
"esm-bundler",
|
||||
"cjs"
|
||||
]
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2021 kazuya kawaguchi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
# @intlify/vue-devtools
|
||||
|
||||
The Vue DevTools I/F package for intlify project
|
||||
|
||||
## :copyright: License
|
||||
|
||||
[MIT](http://opensource.org/licenses/MIT)
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
/*!
|
||||
* @intlify/vue-devtools v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
const VueDevToolsLabels = {
|
||||
["vue-devtools-plugin-vue-i18n" /* PLUGIN */]: 'Vue I18n devtools',
|
||||
["vue-i18n-resource-inspector" /* CUSTOM_INSPECTOR */]: 'I18n Resources',
|
||||
["vue-i18n-timeline" /* TIMELINE */]: 'Vue I18n'
|
||||
};
|
||||
const VueDevToolsPlaceholders = {
|
||||
["vue-i18n-resource-inspector" /* CUSTOM_INSPECTOR */]: 'Search for scopes ...'
|
||||
};
|
||||
const VueDevToolsTimelineColors = {
|
||||
["vue-i18n-timeline" /* TIMELINE */]: 0xffcd19
|
||||
};
|
||||
|
||||
exports.VueDevToolsLabels = VueDevToolsLabels;
|
||||
exports.VueDevToolsPlaceholders = VueDevToolsPlaceholders;
|
||||
exports.VueDevToolsTimelineColors = VueDevToolsTimelineColors;
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
/*!
|
||||
* @intlify/vue-devtools v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
const VueDevToolsLabels = {
|
||||
["vue-devtools-plugin-vue-i18n" /* PLUGIN */]: 'Vue I18n devtools',
|
||||
["vue-i18n-resource-inspector" /* CUSTOM_INSPECTOR */]: 'I18n Resources',
|
||||
["vue-i18n-timeline" /* TIMELINE */]: 'Vue I18n'
|
||||
};
|
||||
const VueDevToolsPlaceholders = {
|
||||
["vue-i18n-resource-inspector" /* CUSTOM_INSPECTOR */]: 'Search for scopes ...'
|
||||
};
|
||||
const VueDevToolsTimelineColors = {
|
||||
["vue-i18n-timeline" /* TIMELINE */]: 0xffcd19
|
||||
};
|
||||
|
||||
exports.VueDevToolsLabels = VueDevToolsLabels;
|
||||
exports.VueDevToolsPlaceholders = VueDevToolsPlaceholders;
|
||||
exports.VueDevToolsTimelineColors = VueDevToolsTimelineColors;
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
import type { CoreMissingType } from '@intlify/runtime';
|
||||
import type { Emittable } from '@intlify/shared';
|
||||
import type { Locale } from '@intlify/runtime';
|
||||
import type { Path } from '@intlify/message-resolver';
|
||||
import type { PathValue } from '@intlify/message-resolver';
|
||||
|
||||
export declare type VueDevToolsEmitter = Emittable<VueDevToolsEmitterEvents>;
|
||||
|
||||
export declare type VueDevToolsEmitterEvents = {
|
||||
[VueDevToolsTimelineEvents.COMPILE_ERROR]: VueDevToolsTimelineEventPayloads[VueDevToolsTimelineEvents.COMPILE_ERROR];
|
||||
[VueDevToolsTimelineEvents.MISSING]: VueDevToolsTimelineEventPayloads[VueDevToolsTimelineEvents.MISSING];
|
||||
[VueDevToolsTimelineEvents.FALBACK]: VueDevToolsTimelineEventPayloads[VueDevToolsTimelineEvents.FALBACK];
|
||||
[VueDevToolsTimelineEvents.MESSAGE_RESOLVE]: VueDevToolsTimelineEventPayloads[VueDevToolsTimelineEvents.MESSAGE_RESOLVE];
|
||||
[VueDevToolsTimelineEvents.MESSAGE_COMPILATION]: VueDevToolsTimelineEventPayloads[VueDevToolsTimelineEvents.MESSAGE_COMPILATION];
|
||||
[VueDevToolsTimelineEvents.MESSAGE_EVALUATION]: VueDevToolsTimelineEventPayloads[VueDevToolsTimelineEvents.MESSAGE_EVALUATION];
|
||||
};
|
||||
|
||||
export declare const enum VueDevToolsIDs {
|
||||
PLUGIN = "vue-devtools-plugin-vue-i18n",
|
||||
CUSTOM_INSPECTOR = "vue-i18n-resource-inspector",
|
||||
TIMELINE = "vue-i18n-timeline"
|
||||
}
|
||||
|
||||
export declare const VueDevToolsLabels: Record<string, string>;
|
||||
|
||||
export declare const VueDevToolsPlaceholders: Record<string, string>;
|
||||
|
||||
export declare const VueDevToolsTimelineColors: Record<string, number>;
|
||||
|
||||
export declare type VueDevToolsTimelineEventPayloads = {
|
||||
[VueDevToolsTimelineEvents.COMPILE_ERROR]: {
|
||||
message: PathValue;
|
||||
error: string;
|
||||
start?: number;
|
||||
end?: number;
|
||||
groupId?: string;
|
||||
};
|
||||
[VueDevToolsTimelineEvents.MISSING]: {
|
||||
locale: Locale;
|
||||
key: Path;
|
||||
type: CoreMissingType;
|
||||
groupId?: string;
|
||||
};
|
||||
[VueDevToolsTimelineEvents.FALBACK]: {
|
||||
key: Path;
|
||||
type: CoreMissingType;
|
||||
from?: Locale;
|
||||
to: Locale | 'global';
|
||||
groupId?: string;
|
||||
};
|
||||
[VueDevToolsTimelineEvents.MESSAGE_RESOLVE]: {
|
||||
type: VueDevToolsTimelineEvents.MESSAGE_RESOLVE;
|
||||
key: Path;
|
||||
message: PathValue;
|
||||
time: number;
|
||||
groupId?: string;
|
||||
};
|
||||
[VueDevToolsTimelineEvents.MESSAGE_COMPILATION]: {
|
||||
type: VueDevToolsTimelineEvents.MESSAGE_COMPILATION;
|
||||
message: PathValue;
|
||||
time: number;
|
||||
groupId?: string;
|
||||
};
|
||||
[VueDevToolsTimelineEvents.MESSAGE_EVALUATION]: {
|
||||
type: VueDevToolsTimelineEvents.MESSAGE_EVALUATION;
|
||||
value: unknown;
|
||||
time: number;
|
||||
groupId?: string;
|
||||
};
|
||||
};
|
||||
|
||||
export declare const enum VueDevToolsTimelineEvents {
|
||||
COMPILE_ERROR = "compile-error",
|
||||
MISSING = "missing",
|
||||
FALBACK = "fallback",
|
||||
MESSAGE_RESOLVE = "message-resolve",
|
||||
MESSAGE_COMPILATION = "message-compilation",
|
||||
MESSAGE_EVALUATION = "message-evaluation"
|
||||
}
|
||||
|
||||
export { }
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
/*!
|
||||
* @intlify/vue-devtools v9.1.9
|
||||
* (c) 2021 kazuya kawaguchi
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
const VueDevToolsLabels = {
|
||||
["vue-devtools-plugin-vue-i18n" /* PLUGIN */]: 'Vue I18n devtools',
|
||||
["vue-i18n-resource-inspector" /* CUSTOM_INSPECTOR */]: 'I18n Resources',
|
||||
["vue-i18n-timeline" /* TIMELINE */]: 'Vue I18n'
|
||||
};
|
||||
const VueDevToolsPlaceholders = {
|
||||
["vue-i18n-resource-inspector" /* CUSTOM_INSPECTOR */]: 'Search for scopes ...'
|
||||
};
|
||||
const VueDevToolsTimelineColors = {
|
||||
["vue-i18n-timeline" /* TIMELINE */]: 0xffcd19
|
||||
};
|
||||
|
||||
export { VueDevToolsLabels, VueDevToolsPlaceholders, VueDevToolsTimelineColors };
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./dist/vue-devtools.cjs.prod.js')
|
||||
} else {
|
||||
module.exports = require('./dist/vue-devtools.cjs.js')
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"name": "@intlify/vue-devtools",
|
||||
"version": "9.1.9",
|
||||
"description": "@intlify/vue-devtools",
|
||||
"keywords": [
|
||||
"i18n",
|
||||
"internationalization",
|
||||
"intlify",
|
||||
"vue-devtools"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "kazuya kawaguchi",
|
||||
"email": "kawakazu80@gmail.com"
|
||||
},
|
||||
"homepage": "https://github.com/intlify/vue-i18n-next/tree/master/packages/vue-devtools#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/intlify/vue-i18n-next.git",
|
||||
"directory": "packages/vue-devtools"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/intlify/vue-i18n-next/issues"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"dist"
|
||||
],
|
||||
"main": "index.js",
|
||||
"module": "dist/vue-devtools.esm-bundler.js",
|
||||
"types": "dist/vue-devtools.d.ts",
|
||||
"dependencies": {
|
||||
"@intlify/message-resolver": "9.1.9",
|
||||
"@intlify/runtime": "9.1.9",
|
||||
"@intlify/shared": "9.1.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
},
|
||||
"buildOptions": {
|
||||
"name": "IntlifyVueDevtools",
|
||||
"formats": [
|
||||
"esm-bundler",
|
||||
"cjs"
|
||||
]
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
Reference in New Issue
Block a user