vona-core 5.1.51 → 5.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +71 -26
- package/dist/index.js.map +1 -1
- package/dist/lib/bean/resource/locale/utils.d.ts +8 -1
- package/dist/lib/bean/resource/locale/utils.d.ts.map +1 -1
- package/dist/lib/module/locales.d.ts.map +1 -1
- package/dist/lib/utils/zod-enhance.d.ts +1 -1
- package/dist/lib/utils/zod-enhance.d.ts.map +1 -1
- package/dist/types/config/config.d.ts +2 -0
- package/dist/types/config/config.d.ts.map +1 -1
- package/dist/types/config/locale.d.ts +9 -1
- package/dist/types/config/locale.d.ts.map +1 -1
- package/dist/types/interface/module.d.ts +1 -0
- package/dist/types/interface/module.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/lib/bean/resource/locale/appLocale.ts +2 -2
- package/src/lib/bean/resource/locale/utils.ts +46 -1
- package/src/lib/core/application.ts +2 -2
- package/src/lib/framework/start.ts +4 -0
- package/src/lib/module/locales.ts +41 -22
- package/src/lib/utils/zod-enhance.ts +1 -1
- package/src/types/config/config.ts +2 -0
- package/src/types/config/locale.ts +11 -4
- package/src/types/interface/module.ts +1 -0
package/dist/index.js
CHANGED
|
@@ -2412,10 +2412,40 @@ function text$1(strings, ...expressions) {
|
|
|
2412
2412
|
function isLocaleMagic(str) {
|
|
2413
2413
|
return typeof str === 'object' && cast(str).toJSON;
|
|
2414
2414
|
}
|
|
2415
|
+
function canonicalizeLocale(value) {
|
|
2416
|
+
return typeof value === 'string' ? value.trim().replaceAll('_', '-').toLowerCase() : '';
|
|
2417
|
+
}
|
|
2418
|
+
function validateLocaleConfig(config) {
|
|
2419
|
+
const items = config?.items;
|
|
2420
|
+
if (!items || typeof items !== 'object' || Object.keys(items).length === 0) {
|
|
2421
|
+
throw new Error('config.locale.items must contain at least one enabled locale');
|
|
2422
|
+
}
|
|
2423
|
+
for (const key of Object.keys(items)) {
|
|
2424
|
+
if (!key || canonicalizeLocale(key) !== key || typeof items[key] !== 'string') {
|
|
2425
|
+
throw new Error(`config.locale.items contains an invalid locale: ${key}`);
|
|
2426
|
+
}
|
|
2427
|
+
}
|
|
2428
|
+
if (typeof config.default !== 'string' || !Object.hasOwn(items, config.default) || canonicalizeLocale(config.default) !== config.default) {
|
|
2429
|
+
throw new Error('config.locale.default must be an enabled config.locale.items key');
|
|
2430
|
+
}
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
/** Resolve an enabled input without allowing aliases to expand the configured set. */
|
|
2434
|
+
function resolveEnabledLocale(value, config, aliases = {}) {
|
|
2435
|
+
validateLocaleConfig(config);
|
|
2436
|
+
let locale = canonicalizeLocale(value);
|
|
2437
|
+
if (Object.hasOwn(aliases, locale)) locale = canonicalizeLocale(aliases[locale]);
|
|
2438
|
+
return Object.hasOwn(config.items, locale) ? locale : undefined;
|
|
2439
|
+
}
|
|
2440
|
+
|
|
2441
|
+
/** Active-language selection only; explicit translation lookup remains independent. */
|
|
2442
|
+
function resolveLocale(value, config, aliases) {
|
|
2443
|
+
return resolveEnabledLocale(value, config, aliases) ?? config.default;
|
|
2444
|
+
}
|
|
2415
2445
|
|
|
2416
2446
|
class AppLocale extends BeanSimple {
|
|
2417
2447
|
get current() {
|
|
2418
|
-
return this.ctx ? this.ctx.locale :
|
|
2448
|
+
return this.ctx ? this.ctx.locale : resolveLocale(undefined, this.app.config.locale);
|
|
2419
2449
|
}
|
|
2420
2450
|
set current(value) {
|
|
2421
2451
|
this.ctx.locale = value;
|
|
@@ -3425,8 +3455,8 @@ class VonaApplication extends KoaApplication {
|
|
|
3425
3455
|
protocol,
|
|
3426
3456
|
secure: false,
|
|
3427
3457
|
method: 'POST',
|
|
3428
|
-
url: '',
|
|
3429
|
-
path: '',
|
|
3458
|
+
url: '/',
|
|
3459
|
+
path: '/',
|
|
3430
3460
|
socket: {
|
|
3431
3461
|
encrypted: false,
|
|
3432
3462
|
remoteAddress: '127.0.0.1',
|
|
@@ -4984,34 +5014,47 @@ function loadErrors (app, modules) {
|
|
|
4984
5014
|
}
|
|
4985
5015
|
|
|
4986
5016
|
async function loadLocales (app, modules) {
|
|
4987
|
-
//
|
|
4988
|
-
app.meta.locales = localesDefault;
|
|
5017
|
+
// Each application owns its registry; never add provider/project data to imported resources.
|
|
5018
|
+
app.meta.locales = deepExtend({}, localesDefault);
|
|
4989
5019
|
app.meta.localeModules = {};
|
|
5020
|
+
const localesAll = await app.options.locales();
|
|
5021
|
+
// Preserve existing project global/module override semantics.
|
|
5022
|
+
for (const locale in localesAll.localesDefault) {
|
|
5023
|
+
_initLocales(locale, localesAll.localesDefault[locale]);
|
|
5024
|
+
}
|
|
5025
|
+
for (const locale in localesAll.localesModules) {
|
|
5026
|
+
_initLocales(locale, localesAll.localesModules[locale]);
|
|
5027
|
+
}
|
|
5028
|
+
|
|
5029
|
+
// Providers precede all ordinary dictionaries, independent of their module order.
|
|
5030
|
+
for (const moduleName of Object.keys(modules)) {
|
|
5031
|
+
const module = modules[moduleName];
|
|
5032
|
+
if (!module.info.capabilities?.locale) continue;
|
|
5033
|
+
const locales = module.resource.localesProvider;
|
|
5034
|
+
if (!locales) continue;
|
|
5035
|
+
for (const locale of Object.keys(locales)) {
|
|
5036
|
+
const resource = locales[locale];
|
|
5037
|
+
const globals = Object.fromEntries(Object.entries(resource).filter(([key, value]) => key !== 'modules' && typeof value === 'string'));
|
|
5038
|
+
app.meta.locales[locale] = Object.assign({}, globals, app.meta.locales[locale]);
|
|
5039
|
+
for (const target of Object.keys(resource.modules ?? {})) {
|
|
5040
|
+
// Metadata membership is sufficient; no target import, install or dependency is needed.
|
|
5041
|
+
if (!Object.hasOwn(modules, target)) continue;
|
|
5042
|
+
_registerLocale(target, locale, resource.modules[target]);
|
|
5043
|
+
}
|
|
5044
|
+
}
|
|
5045
|
+
}
|
|
4990
5046
|
|
|
4991
|
-
//
|
|
4992
|
-
|
|
4993
|
-
|
|
4994
|
-
const
|
|
4995
|
-
|
|
4996
|
-
for (const locale in localesAll.localesDefault) {
|
|
4997
|
-
_initLocales(locale, localesAll.localesDefault[locale]);
|
|
4998
|
-
}
|
|
4999
|
-
// project locales modules
|
|
5000
|
-
for (const locale in localesAll.localesModules) {
|
|
5001
|
-
_initLocales(locale, localesAll.localesModules[locale]);
|
|
5002
|
-
}
|
|
5003
|
-
// app cache
|
|
5004
|
-
app.meta.hmrCacheLocaleModules = deepExtend({}, app.meta.localeModules);
|
|
5005
|
-
// module locales
|
|
5006
|
-
for (const moduleName in modules) {
|
|
5007
|
-
const module = modules[moduleName];
|
|
5047
|
+
// Preserve project/provider precedence when ordinary target dictionaries are reloaded.
|
|
5048
|
+
app.meta.hmrCacheLocaleModules = deepExtend({}, app.meta.localeModules);
|
|
5049
|
+
for (const moduleName of Object.keys(modules)) {
|
|
5050
|
+
const module = modules[moduleName];
|
|
5051
|
+
if (!module.info.capabilities?.locale) {
|
|
5008
5052
|
_registerLocales(moduleName, module.resource.locales);
|
|
5009
5053
|
}
|
|
5010
5054
|
}
|
|
5011
5055
|
function _initLocales(locale, locales) {
|
|
5012
5056
|
if (!locales) return;
|
|
5013
5057
|
if (!locales.modules) {
|
|
5014
|
-
// override
|
|
5015
5058
|
app.meta.locales[locale] = Object.assign({}, app.meta.locales[locale], locales);
|
|
5016
5059
|
} else {
|
|
5017
5060
|
const moduleMap = locales.modules;
|
|
@@ -5027,9 +5070,7 @@ async function loadLocales (app, modules) {
|
|
|
5027
5070
|
}
|
|
5028
5071
|
}
|
|
5029
5072
|
function _registerLocale(moduleName, locale, moduleLocales) {
|
|
5030
|
-
// locales: not override
|
|
5031
5073
|
app.meta.locales[locale] = Object.assign({}, moduleLocales, app.meta.locales[locale]);
|
|
5032
|
-
// localeModules
|
|
5033
5074
|
if (!app.meta.localeModules[moduleName]) app.meta.localeModules[moduleName] = {};
|
|
5034
5075
|
app.meta.localeModules[moduleName][locale] = Object.assign({}, moduleLocales, app.meta.localeModules[moduleName][locale]);
|
|
5035
5076
|
}
|
|
@@ -5165,6 +5206,10 @@ async function __prepareConfig(app) {
|
|
|
5165
5206
|
const configItemsRes = await Promise.all(configItemsPromise);
|
|
5166
5207
|
for (const configItem of configItemsRes) {
|
|
5167
5208
|
if (configItem) {
|
|
5209
|
+
// An explicit language subset replaces the preceding policy, not its individual keys.
|
|
5210
|
+
if (configItem.locale && Object.hasOwn(configItem.locale, 'items') && config.locale) {
|
|
5211
|
+
delete config.locale.items;
|
|
5212
|
+
}
|
|
5168
5213
|
deepExtend(config, configItem);
|
|
5169
5214
|
}
|
|
5170
5215
|
}
|
|
@@ -5491,5 +5536,5 @@ async function retry(options, fn) {
|
|
|
5491
5536
|
|
|
5492
5537
|
zodExtendOpenApi();
|
|
5493
5538
|
|
|
5494
|
-
export { $Class, $localeScope, $makeLocaleMagic, $protocolKey, AppHmr, AppHmrDeps, AppLocale, AppLogger, AppMeta, AppMetadata, AppResource, AppUtil, BeanAopBase, BeanAopMethodBase, BeanBase, BeanBaseSimple, BeanContainer, BeanInfo, BeanScopeBase, BeanScopeContainer, BeanScopeError, BeanScopeErrorImpl, BeanScopeLocale, BeanScopeScene, BeanScopeUtil, BeanSimple, EnumAppEvent, ErrorClass, Global, LocaleModuleNameSeparator, PickClassInner, ProxyDisable, SymbolBeanContainerInstances, SymbolBeanFullName, SymbolBeanInstanceKey, SymbolBeanInstancePropsLazy, SymbolCacheAopChains, SymbolCacheAopChainsKey, SymbolDecoratorBeanFullName, SymbolDecoratorBeanInfo, SymbolDecoratorGlobal, SymbolDecoratorProxyDisable, SymbolDecoratorUse, SymbolDecoratorVirtual, SymbolHmrStateLoad, SymbolHmrStateSave, SymbolMappedClassMetadataKeys, SymbolModuleBelong, SymbolModuleName, TEST_CLAIM_DIRECTORY, TEST_CLAIM_TOKEN_ENV, TEST_CLAIM_URL_ENV, TEST_CLAIM_WINDOWS_GUARDIAN_ENV, TEST_REQUIRE_FRESH_RESOURCES_ENV, TEST_RUN_ID_ENV, TEST_RUN_OWNER_FILE, Use, Virtual, VonaApplication, __prepareInjectSelectorInfo, appHmrDeps, appMetadata, appResource, assertDisposableDatabaseName, assertFreshTestResources, assertFreshTestResourcesReady, assertIsolatedTestConfig, assertIsolatedTestDatabaseClient, assertIsolatedTestPath, assertTestAppIdentity, assertTestClaimDatabaseClient, assertTestClaimRedisClient, assertTestClaimSafePath, assertTestClaimWindowsJob, assertTestRunOwner, beanFullNameFromOnionName, beginCompletedInstance, bootstrap, buildTestClaimResourceInventory, captureCompletedInstance, captureRequestBoundary, cast, closeApp, closeProcessWorker, combineConfigDefault, combineFilePathSafe, compose, copyAddon, copyMetadataOfClasses, copyProperties, copyPropertiesOfClasses, createApp, createAppMaster, createBeanDecorator, createCompletedReadiness, createDiagnosticLogger, createFreshnessDependencies, createGeneralApp, createHash, createRequestBoundary, createTestClaim, deepExtend, disposeInstance, errorsInternal, filterHeaders, finishCompletedInstance, formatLoggerAxiosError, formatLoggerBoundary, formatLoggerConsole, formatLoggerCtx, formatLoggerDummy, formatLoggerErrors, formatLoggerFilter, functionNoop, getDatabaseTestPrefix, getHomeVonaAppDir, getLoggerPathPhysicalRoot, getMappedClassMetadataKeys, getPlatformArch, getPublicPathPhysicalRoot, getRequestBoundary, getRuntimePathPhysicalRoot, getSqlite3DatabaseNameDefault, getSuppressedDiagnosticLogger, getTestAppName, getTestClaimCreatedAt, getTestClaimPaths, getTestClaimRedisPrefix, getTestRunIdFromEnv, hasFreshnessDatabase, hasFreshnessRedis, hasTestClaimTransport, instanceDesp, invalidateCompletedInstance, isExistingReadyContext, isLocaleMagic, loadJSONFile, loadTestClaim, mergeTestClaimDatabaseOptions, mergeTestClaimRedisOptions, normalizeTestClaimDatabaseEndpoint, normalizeTestClaimRedisEndpoint, onionNameFromBeanFullName, pathToHref, pinExistingReadyContext, polyfillDispose, prepareEnv, registerMappedClassMetadataKey, registerTestClaimDatabaseCreation, registerTestClaimResourceInventory, registerTestClaimWindowsJobVerifier, requireAddon, requireDynamic, requiresFreshTestResources, resolveAddon, resolveExistingReadyCapability, resolveTestRunId, resolveVonaLocalPaths, resolverSharp, resolverSharpLibvips, resolverSqlite3, retry, runWithRequestBoundary, runWithZodQueryCoercion, saveJSONFile, sendTestClaimEvent, setMappedClassMetadataKeys, startTestClaimBroker, text$1 as text, useApp, usePrepareArg, usePrepareArgs, uuidv4, validateTestClaim, withIsolatedTestDatabaseDiscovery, writeTestClaim };
|
|
5539
|
+
export { $Class, $localeScope, $makeLocaleMagic, $protocolKey, AppHmr, AppHmrDeps, AppLocale, AppLogger, AppMeta, AppMetadata, AppResource, AppUtil, BeanAopBase, BeanAopMethodBase, BeanBase, BeanBaseSimple, BeanContainer, BeanInfo, BeanScopeBase, BeanScopeContainer, BeanScopeError, BeanScopeErrorImpl, BeanScopeLocale, BeanScopeScene, BeanScopeUtil, BeanSimple, EnumAppEvent, ErrorClass, Global, LocaleModuleNameSeparator, PickClassInner, ProxyDisable, SymbolBeanContainerInstances, SymbolBeanFullName, SymbolBeanInstanceKey, SymbolBeanInstancePropsLazy, SymbolCacheAopChains, SymbolCacheAopChainsKey, SymbolDecoratorBeanFullName, SymbolDecoratorBeanInfo, SymbolDecoratorGlobal, SymbolDecoratorProxyDisable, SymbolDecoratorUse, SymbolDecoratorVirtual, SymbolHmrStateLoad, SymbolHmrStateSave, SymbolMappedClassMetadataKeys, SymbolModuleBelong, SymbolModuleName, TEST_CLAIM_DIRECTORY, TEST_CLAIM_TOKEN_ENV, TEST_CLAIM_URL_ENV, TEST_CLAIM_WINDOWS_GUARDIAN_ENV, TEST_REQUIRE_FRESH_RESOURCES_ENV, TEST_RUN_ID_ENV, TEST_RUN_OWNER_FILE, Use, Virtual, VonaApplication, __prepareInjectSelectorInfo, appHmrDeps, appMetadata, appResource, assertDisposableDatabaseName, assertFreshTestResources, assertFreshTestResourcesReady, assertIsolatedTestConfig, assertIsolatedTestDatabaseClient, assertIsolatedTestPath, assertTestAppIdentity, assertTestClaimDatabaseClient, assertTestClaimRedisClient, assertTestClaimSafePath, assertTestClaimWindowsJob, assertTestRunOwner, beanFullNameFromOnionName, beginCompletedInstance, bootstrap, buildTestClaimResourceInventory, canonicalizeLocale, captureCompletedInstance, captureRequestBoundary, cast, closeApp, closeProcessWorker, combineConfigDefault, combineFilePathSafe, compose, copyAddon, copyMetadataOfClasses, copyProperties, copyPropertiesOfClasses, createApp, createAppMaster, createBeanDecorator, createCompletedReadiness, createDiagnosticLogger, createFreshnessDependencies, createGeneralApp, createHash, createRequestBoundary, createTestClaim, deepExtend, disposeInstance, errorsInternal, filterHeaders, finishCompletedInstance, formatLoggerAxiosError, formatLoggerBoundary, formatLoggerConsole, formatLoggerCtx, formatLoggerDummy, formatLoggerErrors, formatLoggerFilter, functionNoop, getDatabaseTestPrefix, getHomeVonaAppDir, getLoggerPathPhysicalRoot, getMappedClassMetadataKeys, getPlatformArch, getPublicPathPhysicalRoot, getRequestBoundary, getRuntimePathPhysicalRoot, getSqlite3DatabaseNameDefault, getSuppressedDiagnosticLogger, getTestAppName, getTestClaimCreatedAt, getTestClaimPaths, getTestClaimRedisPrefix, getTestRunIdFromEnv, hasFreshnessDatabase, hasFreshnessRedis, hasTestClaimTransport, instanceDesp, invalidateCompletedInstance, isExistingReadyContext, isLocaleMagic, loadJSONFile, loadTestClaim, mergeTestClaimDatabaseOptions, mergeTestClaimRedisOptions, normalizeTestClaimDatabaseEndpoint, normalizeTestClaimRedisEndpoint, onionNameFromBeanFullName, pathToHref, pinExistingReadyContext, polyfillDispose, prepareEnv, registerMappedClassMetadataKey, registerTestClaimDatabaseCreation, registerTestClaimResourceInventory, registerTestClaimWindowsJobVerifier, requireAddon, requireDynamic, requiresFreshTestResources, resolveAddon, resolveEnabledLocale, resolveExistingReadyCapability, resolveLocale, resolveTestRunId, resolveVonaLocalPaths, resolverSharp, resolverSharpLibvips, resolverSqlite3, retry, runWithRequestBoundary, runWithZodQueryCoercion, saveJSONFile, sendTestClaimEvent, setMappedClassMetadataKeys, startTestClaimBroker, text$1 as text, useApp, usePrepareArg, usePrepareArgs, uuidv4, validateLocaleConfig, validateTestClaim, withIsolatedTestDatabaseDiscovery, writeTestClaim };
|
|
5495
5540
|
//# sourceMappingURL=index.js.map
|