diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 91b66a2..be81050 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -36,6 +36,7 @@ Estado al cierre: - `libs/cach/engine.ts` delega lectura `get()` en `runtime-get.ts`. - `libs/cach/engine.ts` delega escritura `set()` en `runtime-set.ts`. - `libs/cach/engine.ts` delega `query()` en `runtime-query.ts`; conserva composition root para context/io/delete/invalidate/mutate/explain. + - `arts/sium/engine-sium.ts` delega resolucion Lang/fallback e issues en `engine-resolver.ts`. - `arts/conn/connection.ts` delega decode/routing de frames entrantes en `connection-message-router.ts`. - `arts/conn/connection.ts` delega el intento open/auth/flush/join en `connection-connect.ts`. - `arts/conn/connection.ts` delega current transport, attach/detach y close en `connection-transport-runtime.ts`. diff --git a/src/arts/sium/engine-resolver.ts b/src/arts/sium/engine-resolver.ts new file mode 100644 index 0000000..3ac187f --- /dev/null +++ b/src/arts/sium/engine-resolver.ts @@ -0,0 +1,61 @@ +import type { EngineLang, LangParams, SupportedLocale } from '$lang'; +import { ID_FALLBACK_SEPARATOR, parseLangRef } from '$lang'; +import { SIUM_DIAGNOSTIC_EVENTS } from './consts'; +import { emitSiumDiagnostic, type SiumDiagnostics } from './diagnostics'; +import { resolve as resolveFallbackTemplate } from './langs'; +import type { Issue } from './core'; + +export interface SiumResolver { + readonly resolve: (message: string, params?: LangParams, locale?: SupportedLocale) => string; + readonly resolveIssue: (issue: Issue, locale?: SupportedLocale) => string; + readonly resolveIssues: (issues: ReadonlyArray, locale?: SupportedLocale) => string[]; +} + +interface SiumResolverOptions { + readonly lang?: EngineLang; + readonly defaultLocale: SupportedLocale; + readonly diagnostics: SiumDiagnostics; +} + +function composeLangPath(message: string): string | undefined { + const parsed = parseLangRef(message); + if (parsed === null) return undefined; + if (parsed.fallback === undefined) return parsed.path; + return `${parsed.path}${ID_FALLBACK_SEPARATOR}${parsed.fallback}`; +} + +function fallbackMessage(message: string, params?: LangParams): string { + const parsed = parseLangRef(message); + return resolveFallbackTemplate(parsed?.fallback ?? parsed?.path ?? message, params); +} + +export function createSiumResolver(options: SiumResolverOptions): SiumResolver { + const { lang, defaultLocale, diagnostics } = options; + + const resolve: SiumResolver['resolve'] = (message, params, locale = defaultLocale) => { + const langPath = composeLangPath(message); + if (lang === undefined || langPath === undefined) { + return fallbackMessage(message, params); + } + + try { + return lang.t(langPath, params, locale); + } catch (error) { + emitSiumDiagnostic(diagnostics, SIUM_DIAGNOSTIC_EVENTS.RESOLVE_FALLBACK, { + message, + error + }); + return fallbackMessage(message, params); + } + }; + + const resolveIssue: SiumResolver['resolveIssue'] = (entry, locale) => { + return resolve(entry.message, entry.params, locale); + }; + + const resolveIssues: SiumResolver['resolveIssues'] = (issues, locale) => { + return issues.map((entry) => resolveIssue(entry, locale)); + }; + + return { resolve, resolveIssue, resolveIssues }; +} diff --git a/src/arts/sium/engine-sium.ts b/src/arts/sium/engine-sium.ts index 300d687..d21bed6 100644 --- a/src/arts/sium/engine-sium.ts +++ b/src/arts/sium/engine-sium.ts @@ -1,8 +1,8 @@ import type { EngineLang, LangParams, SupportedLocale } from '$lang'; -import { ID_FALLBACK_SEPARATOR, parseLangRef } from '$lang'; import type { Logger } from '$libs/logr'; import { SIUM_DIAGNOSTIC_EVENTS } from './consts'; import { createSiumDiagnostics, emitSiumDiagnostic, issueDiagnosticMeta } from './diagnostics'; +import { createSiumResolver } from './engine-resolver'; import { array, boolean, @@ -59,7 +59,7 @@ import { timeValue, year } from './types'; -import { ISSUE_CODES, resolve as resolveFallbackTemplate, siumLangs } from './langs'; +import { ISSUE_CODES, siumLangs } from './langs'; export interface EngineSiumOptions { lang?: EngineLang; @@ -134,18 +134,6 @@ export interface EngineSium { ) => Result; } -function composeLangPath(message: string): string | undefined { - const parsed = parseLangRef(message); - if (parsed === null) return undefined; - if (parsed.fallback === undefined) return parsed.path; - return `${parsed.path}${ID_FALLBACK_SEPARATOR}${parsed.fallback}`; -} - -function fallbackMessage(message: string, params?: LangParams): string { - const parsed = parseLangRef(message); - return resolveFallbackTemplate(parsed?.fallback ?? parsed?.path ?? message, params); -} - /** * Public Sium facade. * @@ -156,31 +144,7 @@ export function createEngineSium(options: EngineSiumOptions = {}): EngineSium { const { lang, logger } = options; const diagnostics = createSiumDiagnostics(logger); const defaultLocale = options.locale ?? lang?.getDefaultLocale() ?? 'es'; - - const resolveMessage: EngineSium['resolve'] = (message, params, locale = defaultLocale) => { - const langPath = composeLangPath(message); - if (lang === undefined || langPath === undefined) { - return fallbackMessage(message, params); - } - - try { - return lang.t(langPath, params, locale); - } catch (error) { - emitSiumDiagnostic(diagnostics, SIUM_DIAGNOSTIC_EVENTS.RESOLVE_FALLBACK, { - message, - error - }); - return fallbackMessage(message, params); - } - }; - - const resolveIssue: EngineSium['resolveIssue'] = (entry, locale) => { - return resolveMessage(entry.message, entry.params, locale); - }; - - const resolveIssues: EngineSium['resolveIssues'] = (issues, locale) => { - return issues.map((entry) => resolveIssue(entry, locale)); - }; + const resolver = createSiumResolver({ lang, defaultLocale, diagnostics }); const validate: EngineSium['validate'] = async (schema, input, ctx) => { const result = await schema.validate(input, ctx); @@ -258,9 +222,9 @@ export function createEngineSium(options: EngineSiumOptions = {}): EngineSium { alpha, issueCodes: ISSUE_CODES, langSchema: siumLangs, - resolve: resolveMessage, - resolveIssue, - resolveIssues, + resolve: resolver.resolve, + resolveIssue: resolver.resolveIssue, + resolveIssues: resolver.resolveIssues, validate, validateSync };