UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

961 lines (960 loc) 31.4 kB
import { getGlobalThis, isObject, isArray, isPlainObject, isString, isBoolean, assign, isFunction, isRegExp, warn, escapeHtml, isNumber, isEmptyObject, generateFormatCacheKey, isDate, toDisplayString } from "../../shared/dist/shared.esm-bundler.mjs"; import { defaultOnError, baseCompile, createCompileError, CompileErrorCodes } from "../../message-compiler/dist/message-compiler.esm-bundler.mjs"; export { CompileErrorCodes, createCompileError } from "../../message-compiler/dist/message-compiler.esm-bundler.mjs"; import { IntlifyDevToolsHooks } from "../../devtools-if/dist/devtools-if.esm-bundler.mjs"; /*! * core-base v9.2.2 * (c) 2022 kazuya kawaguchi * Released under the MIT License. */ const pathStateMachine = []; pathStateMachine[0] = { ["w"]: [0], ["i"]: [3, 0], ["["]: [4], ["o"]: [7] }; pathStateMachine[1] = { ["w"]: [1], ["."]: [2], ["["]: [4], ["o"]: [7] }; pathStateMachine[2] = { ["w"]: [2], ["i"]: [3, 0], ["0"]: [3, 0] }; pathStateMachine[3] = { ["i"]: [3, 0], ["0"]: [3, 0], ["w"]: [1, 1], ["."]: [2, 1], ["["]: [4, 1], ["o"]: [7, 1] }; pathStateMachine[4] = { ["'"]: [5, 0], ['"']: [6, 0], ["["]: [ 4, 2 ], ["]"]: [1, 3], ["o"]: 8, ["l"]: [4, 0] }; pathStateMachine[5] = { ["'"]: [4, 0], ["o"]: 8, ["l"]: [5, 0] }; pathStateMachine[6] = { ['"']: [4, 0], ["o"]: 8, ["l"]: [6, 0] }; const literalValueRE = /^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/; function isLiteral(exp) { return literalValueRE.test(exp); } function stripQuotes(str) { const a = str.charCodeAt(0); const b = str.charCodeAt(str.length - 1); return a === b && (a === 34 || a === 39) ? str.slice(1, -1) : str; } function getPathCharType(ch) { if (ch === void 0 || ch === null) { return "o"; } const code2 = ch.charCodeAt(0); switch (code2) { case 91: case 93: case 46: case 34: case 39: return ch; case 95: case 36: case 45: return "i"; case 9: case 10: case 13: case 160: case 65279: case 8232: case 8233: return "w"; } return "i"; } function formatSubPath(path) { const trimmed = path.trim(); if (path.charAt(0) === "0" && isNaN(parseInt(path))) { return false; } return isLiteral(trimmed) ? stripQuotes(trimmed) : "*" + trimmed; } function parse(path) { const keys = []; let index = -1; let mode = 0; let subPathDepth = 0; let c; let key; let newChar; let type; let transition; let action; let typeMap; const actions = []; actions[0] = () => { if (key === void 0) { key = newChar; } else { key += newChar; } }; actions[1] = () => { if (key !== void 0) { keys.push(key); key = void 0; } }; actions[2] = () => { actions[0](); subPathDepth++; }; actions[3] = () => { if (subPathDepth > 0) { subPathDepth--; mode = 4; actions[0](); } else { subPathDepth = 0; if (key === void 0) { return false; } key = formatSubPath(key); if (key === false) { return false; } else { actions[1](); } } }; function maybeUnescapeQuote() { const nextChar = path[index + 1]; if (mode === 5 && nextChar === "'" || mode === 6 && nextChar === '"') { index++; newChar = "\\" + nextChar; actions[0](); return true; } } while (mode !== null) { index++; c = path[index]; if (c === "\\" && maybeUnescapeQuote()) { continue; } type = getPathCharType(c); typeMap = pathStateMachine[mode]; transition = typeMap[type] || typeMap["l"] || 8; if (transition === 8) { return; } mode = transition[0]; if (transition[1] !== void 0) { action = actions[transition[1]]; if (action) { newChar = c; if (action() === false) { return; } } } if (mode === 7) { return keys; } } } const cache = /* @__PURE__ */ new Map(); function resolveWithKeyValue(obj, path) { return isObject(obj) ? obj[path] : null; } function resolveValue(obj, path) { if (!isObject(obj)) { return null; } let hit = cache.get(path); if (!hit) { hit = parse(path); if (hit) { cache.set(path, hit); } } if (!hit) { return null; } const len = hit.length; let last = obj; let i = 0; while (i < len) { const val = last[hit[i]]; if (val === void 0) { return null; } last = val; i++; } return last; } const DEFAULT_MODIFIER = (str) => str; const DEFAULT_MESSAGE = (ctx) => ""; 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) { return choice ? choice > 1 ? 1 : 0 : 1; } return choice ? Math.min(choice, 2) : 0; } function getPluralIndex(options) { const index = isNumber(options.pluralIndex) ? options.pluralIndex : -1; 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 : void 0; const plural = (messages) => { return messages[pluralRule(pluralIndex, messages.length, orgPluralRule)]; }; const _list = options.list || []; const list = (index) => _list[index]; const _named = options.named || {}; isNumber(options.pluralIndex) && normalizeNamed(pluralIndex, _named); const named = (key) => _named[key]; function message(key) { const msg = isFunction(options.messages) ? options.messages(key) : isObject(options.messages) ? options.messages[key] : false; return !msg ? options.parent ? options.parent.message(key) : 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 linked = (key, ...args) => { const [arg1, arg2] = args; let type2 = "text"; let modifier = ""; if (args.length === 1) { if (isObject(arg1)) { modifier = arg1.modifier || modifier; type2 = arg1.type || type2; } else if (isString(arg1)) { modifier = arg1 || modifier; } } else if (args.length === 2) { if (isString(arg1)) { modifier = arg1 || modifier; } if (isString(arg2)) { type2 = arg2 || type2; } } let msg = message(key)(ctx); if (type2 === "vnode" && isArray(msg) && modifier) { msg = msg[0]; } return modifier ? _modifier(modifier)(msg, type2) : msg; }; const ctx = { ["list"]: list, ["named"]: named, ["plural"]: plural, ["linked"]: linked, ["message"]: message, ["type"]: type, ["interpolate"]: interpolate, ["normalize"]: normalize }; return ctx; } let devtools = null; function setDevToolsHook(hook) { devtools = hook; } function initI18nDevTools(i18n, version, meta) { 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); } const CoreWarnCodes = { NOT_FOUND_KEY: 1, FALLBACK_TO_TRANSLATE: 2, CANNOT_FORMAT_NUMBER: 3, FALLBACK_TO_NUMBER_FORMAT: 4, CANNOT_FORMAT_DATE: 5, FALLBACK_TO_DATE_FORMAT: 6, __EXTEND_POINT__: 7 }; function fallbackWithSimple(ctx, fallback, start) { return [.../* @__PURE__ */ new Set([ start, ...isArray(fallback) ? fallback : isObject(fallback) ? Object.keys(fallback) : isString(fallback) ? [fallback] : [start] ])]; } function fallbackWithLocaleChain(ctx, fallback, start) { const startLocale = isString(start) ? start : DEFAULT_LOCALE; const context = ctx; if (!context.__localeChainCache) { context.__localeChainCache = /* @__PURE__ */ new Map(); } let chain = context.__localeChainCache.get(startLocale); if (!chain) { chain = []; let block = [start]; while (isArray(block)) { block = appendBlockToChain(chain, block, fallback); } const defaults = isArray(fallback) || !isPlainObject(fallback) ? fallback : fallback["default"] ? fallback["default"] : null; block = isString(defaults) ? [defaults] : defaults; if (isArray(block)) { appendBlockToChain(chain, block, false); } context.__localeChainCache.set(startLocale, 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]) { follow = blocks[locale]; } } } return follow; } const VERSION = "9.2.2"; const NOT_REOSLVED = -1; const DEFAULT_LOCALE = "en-US"; const MISSING_RESOLVE_VALUE = ""; const capitalize = (str) => `${str.charAt(0).toLocaleUpperCase()}${str.substr(1)}`; function getDefaultLinkedModifiers() { return { upper: (val, type) => { return type === "text" && isString(val) ? val.toUpperCase() : type === "vnode" && isObject(val) && "__v_isVNode" in val ? val.children.toUpperCase() : val; }, lower: (val, type) => { return type === "text" && isString(val) ? val.toLowerCase() : type === "vnode" && isObject(val) && "__v_isVNode" in val ? val.children.toLowerCase() : val; }, capitalize: (val, type) => { return type === "text" && isString(val) ? capitalize(val) : type === "vnode" && isObject(val) && "__v_isVNode" in val ? capitalize(val.children) : val; } }; } let _compiler; function registerMessageCompiler(compiler) { _compiler = compiler; } let _resolver; function registerMessageResolver(resolver) { _resolver = resolver; } let _fallbacker; function registerLocaleFallbacker(fallbacker) { _fallbacker = fallbacker; } let _additionalMeta = null; const setAdditionalMeta = (meta) => { _additionalMeta = meta; }; const getAdditionalMeta = () => _additionalMeta; let _fallbackContext = null; const setFallbackContext = (context) => { _fallbackContext = context; }; const getFallbackContext = () => _fallbackContext; let _cid = 0; function createCoreContext(options = {}) { const version = isString(options.version) ? options.version : VERSION; const locale = isString(options.locale) ? options.locale : DEFAULT_LOCALE; 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 messageResolver = isFunction(options.messageResolver) ? options.messageResolver : _resolver || resolveWithKeyValue; const localeFallbacker = isFunction(options.localeFallbacker) ? options.localeFallbacker : _fallbacker || fallbackWithSimple; const fallbackContext = isObject(options.fallbackContext) ? options.fallbackContext : void 0; const onWarn = isFunction(options.onWarn) ? options.onWarn : warn; const internalOptions = options; const __datetimeFormatters = isObject(internalOptions.__datetimeFormatters) ? internalOptions.__datetimeFormatters : /* @__PURE__ */ new Map(); const __numberFormatters = isObject(internalOptions.__numberFormatters) ? internalOptions.__numberFormatters : /* @__PURE__ */ new Map(); const __meta = isObject(internalOptions.__meta) ? internalOptions.__meta : {}; _cid++; const context = { version, cid: _cid, locale, fallbackLocale, messages, modifiers, pluralRules, missing, missingWarn, fallbackWarn, fallbackFormat, unresolving, postTranslation, processor, warnHtmlMessage, escapeParameter, messageCompiler, messageResolver, localeFallbacker, fallbackContext, onWarn, __meta }; { context.datetimeFormats = datetimeFormats; context.numberFormats = numberFormats; context.__datetimeFormatters = __datetimeFormatters; context.__numberFormatters = __numberFormatters; } if (__INTLIFY_PROD_DEVTOOLS__) { initI18nDevTools(context, version, __meta); } return context; } function handleMissing(context, key, locale, missingWarn, type) { const { missing, onWarn } = context; if (missing !== null) { const ret = missing(context, locale, key, type); return isString(ret) ? ret : key; } else { return key; } } function updateFallbackLocale(ctx, locale, fallback) { const context = ctx; context.__localeChainCache = /* @__PURE__ */ new Map(); ctx.localeFallbacker(ctx, fallback, locale); } const defaultOnCacheKey = (source) => source; let compileCache = /* @__PURE__ */ Object.create(null); function compileToFunction(source, options = {}) { { const onCacheKey = options.onCacheKey || defaultOnCacheKey; const key = onCacheKey(source); const cached = compileCache[key]; if (cached) { return cached; } let occurred = false; const onError = options.onError || defaultOnError; options.onError = (err) => { occurred = true; onError(err); }; const { code: code2 } = baseCompile(source, options); const msg = new Function(`return ${code2}`)(); return !occurred ? compileCache[key] = msg : msg; } } let code = CompileErrorCodes.__EXTEND_POINT__; const inc = () => ++code; const CoreErrorCodes = { INVALID_ARGUMENT: code, INVALID_DATE_ARGUMENT: inc(), INVALID_ISO_DATE_ARGUMENT: inc(), __EXTEND_POINT__: inc() }; function createCoreError(code2) { return createCompileError(code2, null, void 0); } const NOOP_MESSAGE_FUNCTION = () => ""; const isMessageFunction = (val) => isFunction(val); function translate(context, ...args) { const { fallbackFormat, postTranslation, unresolving, messageCompiler, 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; const defaultMsgOrKey = isString(options.default) || isBoolean(options.default) ? !isBoolean(options.default) ? options.default : !messageCompiler ? () => key : key : fallbackFormat ? !messageCompiler ? () => key : key : ""; const enableDefaultMsg = fallbackFormat || defaultMsgOrKey !== ""; const locale = isString(options.locale) ? options.locale : context.locale; escapeParameter && escapeParams(options); let [formatScope, targetLocale, message] = !resolvedMessage ? resolveMessageFormat(context, key, locale, fallbackLocale, fallbackWarn, missingWarn) : [ key, locale, messages[locale] || {} ]; let format = formatScope; let cacheBaseKey = key; if (!resolvedMessage && !(isString(format) || isMessageFunction(format))) { if (enableDefaultMsg) { format = defaultMsgOrKey; cacheBaseKey = format; } } if (!resolvedMessage && (!(isString(format) || isMessageFunction(format)) || !isString(targetLocale))) { return unresolving ? NOT_REOSLVED : key; } let occurred = false; const errorDetector = () => { occurred = true; }; const msg = !isMessageFunction(format) ? compileMessageFormat(context, key, targetLocale, format, cacheBaseKey, errorDetector) : format; if (occurred) { return format; } const ctxOptions = getMessageContextOptions(context, targetLocale, message, options); const msgContext = createMessageContext(ctxOptions); const messaged = evaluateMessage(context, msg, msgContext); const ret = postTranslation ? postTranslation(messaged, key) : messaged; if (__INTLIFY_PROD_DEVTOOLS__) { 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, messageResolver: resolveValue2, localeFallbacker } = context; const locales = localeFallbacker(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 = resolveValue2(message, key)) === null) { format = message[key]; } if (isString(format) || 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 msg2 = format; msg2.locale = msg2.locale || targetLocale; msg2.key = msg2.key || key; return msg2; } if (messageCompiler == null) { const msg2 = () => format; msg2.locale = targetLocale; msg2.key = key; return msg2; } 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; } function parseTranslateArgs(...args) { const [arg1, arg2, arg3] = args; const options = {}; if (!isString(arg1) && !isNumber(arg1) && !isMessageFunction(arg1)) { throw createCoreError(CoreErrorCodes.INVALID_ARGUMENT); } 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); { throw err; } }, onCacheKey: (source2) => generateFormatCacheKey(locale, key, source2) }; } function getMessageContextOptions(context, locale, message, options) { const { modifiers, pluralRules, messageResolver: resolveValue2, fallbackLocale, fallbackWarn, missingWarn, fallbackContext } = context; const resolveMessage = (key) => { let val = resolveValue2(message, key); if (val == null && fallbackContext) { const [, , message2] = resolveMessageFormat(fallbackContext, key, locale, fallbackLocale, fallbackWarn, missingWarn); val = resolveValue2(message2, 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 { 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; } function datetime(context, ...args) { const { datetimeFormats, unresolving, fallbackLocale, onWarn, localeFallbacker } = context; const { __datetimeFormatters } = context; const [key, value, options, overrides] = parseDateTimeArgs(...args); const missingWarn = isBoolean(options.missingWarn) ? options.missingWarn : context.missingWarn; isBoolean(options.fallbackWarn) ? options.fallbackWarn : context.fallbackWarn; const part = !!options.part; const locale = isString(options.locale) ? options.locale : context.locale; const locales = localeFallbacker( context, fallbackLocale, locale ); if (!isString(key) || key === "") { return new Intl.DateTimeFormat(locale, overrides).format(value); } 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 (isPlainObject(format)) break; handleMissing(context, key, targetLocale, missingWarn, type); } 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); } const DATETIME_FORMAT_OPTIONS_KEYS = [ "localeMatcher", "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "formatMatcher", "hour12", "timeZone", "dateStyle", "timeStyle", "calendar", "dayPeriod", "numberingSystem", "hourCycle", "fractionalSecondDigits" ]; function parseDateTimeArgs(...args) { const [arg1, arg2, arg3, arg4] = args; const options = {}; let overrides = {}; let value; if (isString(arg1)) { const matches = arg1.match(/(\d{4}-\d{2}-\d{2})(T|\s)?(.*)/); if (!matches) { throw createCoreError(CoreErrorCodes.INVALID_ISO_DATE_ARGUMENT); } const dateTime = matches[3] ? matches[3].trim().startsWith("T") ? `${matches[1].trim()}${matches[3].trim()}` : `${matches[1].trim()}T${matches[3].trim()}` : matches[1].trim(); value = new Date(dateTime); try { value.toISOString(); } catch (e) { throw createCoreError(CoreErrorCodes.INVALID_ISO_DATE_ARGUMENT); } } else if (isDate(arg1)) { if (isNaN(arg1.getTime())) { throw createCoreError(CoreErrorCodes.INVALID_DATE_ARGUMENT); } value = arg1; } else if (isNumber(arg1)) { value = arg1; } else { throw createCoreError(CoreErrorCodes.INVALID_ARGUMENT); } if (isString(arg2)) { options.key = arg2; } else if (isPlainObject(arg2)) { Object.keys(arg2).forEach((key) => { if (DATETIME_FORMAT_OPTIONS_KEYS.includes(key)) { overrides[key] = arg2[key]; } else { options[key] = arg2[key]; } }); } if (isString(arg3)) { options.locale = arg3; } else if (isPlainObject(arg3)) { overrides = arg3; } if (isPlainObject(arg4)) { overrides = arg4; } return [options.key || "", value, options, overrides]; } 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); } } function number(context, ...args) { const { numberFormats, unresolving, fallbackLocale, onWarn, localeFallbacker } = context; const { __numberFormatters } = context; const [key, value, options, overrides] = parseNumberArgs(...args); const missingWarn = isBoolean(options.missingWarn) ? options.missingWarn : context.missingWarn; isBoolean(options.fallbackWarn) ? options.fallbackWarn : context.fallbackWarn; const part = !!options.part; const locale = isString(options.locale) ? options.locale : context.locale; const locales = localeFallbacker( context, fallbackLocale, locale ); if (!isString(key) || key === "") { return new Intl.NumberFormat(locale, overrides).format(value); } 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 (isPlainObject(format)) break; handleMissing(context, key, targetLocale, missingWarn, type); } 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); } const NUMBER_FORMAT_OPTIONS_KEYS = [ "localeMatcher", "style", "currency", "currencyDisplay", "currencySign", "useGrouping", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits", "compactDisplay", "notation", "signDisplay", "unit", "unitDisplay", "roundingMode", "roundingPriority", "roundingIncrement", "trailingZeroDisplay" ]; function parseNumberArgs(...args) { const [arg1, arg2, arg3, arg4] = args; const options = {}; let overrides = {}; if (!isNumber(arg1)) { throw createCoreError(CoreErrorCodes.INVALID_ARGUMENT); } const value = arg1; if (isString(arg2)) { options.key = arg2; } else if (isPlainObject(arg2)) { Object.keys(arg2).forEach((key) => { if (NUMBER_FORMAT_OPTIONS_KEYS.includes(key)) { overrides[key] = arg2[key]; } else { options[key] = arg2[key]; } }); } if (isString(arg3)) { options.locale = arg3; } else if (isPlainObject(arg3)) { overrides = arg3; } if (isPlainObject(arg4)) { overrides = arg4; } return [options.key || "", value, options, overrides]; } 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 { CoreErrorCodes, CoreWarnCodes, DATETIME_FORMAT_OPTIONS_KEYS, DEFAULT_LOCALE, DEFAULT_MESSAGE_DATA_TYPE, MISSING_RESOLVE_VALUE, NOT_REOSLVED, NUMBER_FORMAT_OPTIONS_KEYS, VERSION, clearDateTimeFormat, clearNumberFormat, compileToFunction, createCoreContext, createCoreError, createMessageContext, datetime, fallbackWithLocaleChain, fallbackWithSimple, getAdditionalMeta, getFallbackContext, handleMissing, initI18nDevTools, isMessageFunction, number, parse, parseDateTimeArgs, parseNumberArgs, parseTranslateArgs, registerLocaleFallbacker, registerMessageCompiler, registerMessageResolver, resolveValue, resolveWithKeyValue, setAdditionalMeta, setDevToolsHook, setFallbackContext, translate, translateDevTools, updateFallbackLocale };