vona-core 5.1.51 → 5.1.52

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 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 : 'en-us';
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;
@@ -4984,34 +5014,47 @@ function loadErrors (app, modules) {
4984
5014
  }
4985
5015
 
4986
5016
  async function loadLocales (app, modules) {
4987
- // all locales
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
- // load locales
4992
- await loadLocales();
4993
- async function loadLocales() {
4994
- const localesAll = await app.options.locales();
4995
- // project locales default
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