@lionrapid/core 0.1.4-beta.2 → 0.2.0
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/base/event-emitter.d.ts.map +1 -1
- package/dist/base/event-emitter.js +4 -1
- package/dist/base/event-emitter.js.map +1 -1
- package/dist/browser/lionrapid.auto.dev.js +12 -8
- package/dist/browser/lionrapid.auto.dev.js.map +2 -2
- package/dist/browser/lionrapid.auto.js +12 -8
- package/dist/browser/lionrapid.auto.js.map +2 -2
- package/dist/browser/lionrapid.auto.min.js +3 -3
- package/dist/browser/lionrapid.auto.min.js.map +3 -3
- package/dist/browser/lionrapid.esm.js +12 -8
- package/dist/browser/lionrapid.esm.js.map +2 -2
- package/dist/browser/lionrapid.esm.min.js +2 -2
- package/dist/browser/lionrapid.esm.min.js.map +3 -3
- package/dist/browser/lionrapid.iife.dev.js +12 -8
- package/dist/browser/lionrapid.iife.dev.js.map +2 -2
- package/dist/browser/lionrapid.iife.js +12 -8
- package/dist/browser/lionrapid.iife.js.map +2 -2
- package/dist/browser/lionrapid.iife.min.js +2 -2
- package/dist/browser/lionrapid.iife.min.js.map +3 -3
- package/dist/browser/lionrapid.umd.js +12 -8
- package/dist/browser/lionrapid.umd.js.map +2 -2
- package/dist/browser/lionrapid.umd.min.js +2 -2
- package/dist/browser/lionrapid.umd.min.js.map +3 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +15 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/translation-flow.d.ts.map +1 -1
- package/dist/utils/translation-flow.js +7 -2
- package/dist/utils/translation-flow.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/config/logger.config.ts", "../../src/utils/logger.ts", "../../src/base/event-emitter.ts", "../../src/handlers/handler-chain.ts", "../../src/utils/namespace-utils.ts", "../../src/utils/context-utils.ts", "../../src/utils/translation-value-utils.ts", "../../src/utils/translation-flow.ts", "../../src/handlers/sync-storage-handler.ts", "../../src/handlers/async-storage-handler.ts", "../../src/errors/translation-errors.ts", "../../src/handlers/network-handler.ts", "../../src/content/safe-href.ts", "../../src/content/style-mapper/DefaultStyleMapper.ts", "../../src/content/parser/MarkupParser.ts", "../../src/content/serializer/HTMLSerializer.ts", "../../src/cache/CacheManager.ts", "../../src/lionRapid.ts", "../../src/sync/missing-translation-queue.ts", "../../src/builder.ts", "../../src/repositories/network-repository.ts", "../../src/repositories/memory-repository.ts", "../../src/content/validator/ContentValidator.ts", "../../src/browser/storage/localstorage-repository.ts", "../../src/browser/storage/cache-storage-repository.ts", "../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4,\n}\n\nexport interface LoggerConfig {\n level?: LogLevel;\n enabled?: boolean;\n prefix?: string;\n showLineNumbers?: boolean;\n useColors?: boolean;\n}\n\nexport interface PackageLoggerConfig extends LoggerConfig {\n packageName?: string;\n packageEmoji?: string;\n}\n", "import type { LoggerConfig } from '../config/logger.config.js';\nimport { LogLevel } from '../config/logger.config.js';\n\n// Build-time constants for dead code elimination\nconst IS_PRODUCTION = process.env.NODE_ENV === 'production';\nconst IS_DEVELOPMENT = process.env.NODE_ENV === 'development';\nconst IS_CI = process.env.CI === 'true';\nconst LIONRAPID_DEV = process.env.LIONRAPID_DEV === 'true';\nconst PERFORMANCE_TRACKING =\n process.env.LIONRAPID_PERFORMANCE_TRACKING === 'true';\n\n/**\n * Read a runtime log-level override from localStorage in browser contexts.\n * Lets a developer flip on verbose logging without a rebuild via\n * localStorage.LIONRAPID_LOG_LEVEL = 'DEBUG'\n * Returns null on SSR or restrictive sandboxes.\n */\nfunction readBrowserLogLevel(): string | null {\n try {\n if (typeof localStorage !== 'undefined') {\n const v = localStorage.getItem('LIONRAPID_LOG_LEVEL');\n if (v && typeof v === 'string') return v;\n }\n } catch {\n // localStorage unavailable (privacy mode, file://, etc.) \u2014 ignore\n }\n return null;\n}\n\n// Environment-specific configuration.\n// Default is WARN \u2014 quiet by default. Customers consuming the published\n// ESM bundles via npm don't get noisy debug/info chatter on every page load.\n// Override via:\n// - build-time: process.env.LOG_LEVEL=DEBUG\n// - runtime (browser): localStorage.LIONRAPID_LOG_LEVEL = 'DEBUG'\n// - runtime (programmatic): logger.configure({ level: LogLevel.DEBUG })\nconst LOG_LEVEL_ENV =\n readBrowserLogLevel() || process.env.LOG_LEVEL || 'WARN';\n\n/**\n * ANSI color codes for terminal output\n */\nexport const Colors = {\n // Reset\n RESET: '\\x1b[0m',\n // Foreground colors\n BLACK: '\\x1b[30m',\n RED: '\\x1b[31m',\n GREEN: '\\x1b[32m',\n YELLOW: '\\x1b[33m',\n BLUE: '\\x1b[34m',\n MAGENTA: '\\x1b[35m',\n CYAN: '\\x1b[36m',\n WHITE: '\\x1b[37m',\n ORANGE: '\\x1b[38;5;208m',\n // Bright foreground colors\n BRIGHT_BLACK: '\\x1b[90m',\n BRIGHT_RED: '\\x1b[91m',\n BRIGHT_GREEN: '\\x1b[92m',\n BRIGHT_YELLOW: '\\x1b[93m',\n BRIGHT_BLUE: '\\x1b[94m',\n BRIGHT_MAGENTA: '\\x1b[95m',\n BRIGHT_CYAN: '\\x1b[96m',\n BRIGHT_WHITE: '\\x1b[97m',\n // Styles\n BOLD: '\\x1b[1m',\n DIM: '\\x1b[2m',\n UNDERLINE: '\\x1b[4m',\n} as const;\n\nexport interface CallSite {\n fileName: string;\n lineNumber: number;\n functionName?: string;\n}\n\nexport interface PackageLoggerConfig extends LoggerConfig {\n packageName?: string;\n packageEmoji?: string;\n}\n\n// Development logger class - completely eliminated in production\nclass DevelopmentLogger {\n private config: Required<LoggerConfig>;\n\n constructor(config: PackageLoggerConfig = {}) {\n this.config = {\n level: this.getLogLevelFromEnv(),\n enabled: this.shouldEnableLogging(),\n prefix: `${config.packageEmoji || '\uD83D\uDCE6'} ${config.packageName || 'LionRapid'}`,\n showLineNumbers: LIONRAPID_DEV && !IS_CI,\n useColors: this.shouldUseColors(),\n ...config,\n };\n }\n\n configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n debug(message: string, data?: unknown): void {\n if (!this.config.enabled || this.config.level > LogLevel.DEBUG) return;\n this.log(LogLevel.DEBUG, message, data);\n }\n\n info(message: string, data?: unknown): void {\n if (this.config.level > LogLevel.INFO) return;\n this.log(LogLevel.INFO, message, data);\n }\n\n warn(message: string, data?: unknown): void {\n this.log(LogLevel.WARN, message, data);\n }\n\n error(message: string, data?: unknown): void {\n this.log(LogLevel.ERROR, message, data);\n }\n\n time(label: string): () => void {\n if (!PERFORMANCE_TRACKING || IS_PRODUCTION) return () => {};\n\n const start = IS_DEVELOPMENT ? performance.now() : 0;\n return () => {\n if (IS_DEVELOPMENT) {\n const duration = performance.now() - start;\n this.debug(`\u23F1\uFE0F ${label}: ${duration.toFixed(2)}ms`, { duration });\n }\n };\n }\n\n private log(level: LogLevel, message: string, data?: unknown): void {\n if (!this.config.enabled || level < this.config.level) return;\n\n const levelName = LogLevel[level];\n const levelEmoji = this.getLevelEmoji(level);\n const callSite = this.config.showLineNumbers ? this.getCallSite() : null;\n\n const logMessage = this.buildColoredMessage(\n level,\n levelEmoji,\n levelName,\n message,\n callSite,\n data\n );\n\n switch (level) {\n case LogLevel.ERROR:\n console.error(logMessage);\n break;\n case LogLevel.WARN:\n console.warn(logMessage);\n break;\n case LogLevel.INFO:\n console.info(logMessage);\n break;\n default:\n console.log(logMessage);\n }\n }\n\n private buildColoredMessage(\n level: LogLevel,\n emoji: string,\n levelName: string,\n message: string,\n callSite: CallSite | null,\n data?: unknown\n ): string {\n if (!this.config.useColors) {\n const locationInfo = callSite\n ? ` (${callSite.fileName}:${callSite.lineNumber})`\n : '';\n let logMessage = `${this.config.prefix} ${emoji} ${levelName} ${message}${locationInfo}`;\n if (data !== undefined) {\n logMessage += ` ${JSON.stringify(data)}`;\n }\n return logMessage;\n }\n\n const levelColor = this.getLevelColor(level);\n const reset = Colors.RESET;\n\n const coloredPrefix = `${Colors.BOLD}${Colors.ORANGE}${this.config.prefix}${reset}`;\n const coloredEmoji = emoji;\n const coloredLevel = `${levelColor}${Colors.BOLD}${levelName}${reset}`;\n const coloredMessage = `${levelColor}${message}${reset}`;\n\n const locationInfo = callSite\n ? `${Colors.DIM}${Colors.BRIGHT_BLACK} (${callSite.fileName}:${callSite.lineNumber})${reset}`\n : '';\n\n const dataInfo =\n data !== undefined\n ? `${Colors.DIM}${Colors.CYAN} ${JSON.stringify(data)}${reset}`\n : '';\n\n return `${coloredPrefix} ${coloredEmoji} ${coloredLevel} ${coloredMessage}${locationInfo}${dataInfo}`;\n }\n\n private getLevelColor(level: LogLevel): string {\n switch (level) {\n case LogLevel.DEBUG:\n return Colors.BRIGHT_GREEN;\n case LogLevel.INFO:\n return Colors.BRIGHT_CYAN;\n case LogLevel.WARN:\n return Colors.BRIGHT_YELLOW;\n case LogLevel.ERROR:\n return Colors.BRIGHT_RED;\n default:\n return Colors.BRIGHT_BLACK;\n }\n }\n\n private getLevelEmoji(level: LogLevel): string {\n switch (level) {\n case LogLevel.DEBUG:\n return '\uD83D\uDD0D';\n case LogLevel.INFO:\n return '\u2139\uFE0F';\n case LogLevel.WARN:\n return '\u26A0\uFE0F';\n case LogLevel.ERROR:\n return '\u274C';\n default:\n return '\uD83D\uDCDD';\n }\n }\n\n private getCallSite(): CallSite | null {\n try {\n const stack = new Error().stack;\n if (!stack) return null;\n\n const lines = stack.split('\\n');\n for (let i = 3; i < lines.length; i++) {\n const line = lines[i];\n if (line && !line.includes('logger.ts') && !line.includes('Logger')) {\n return this.parseStackLine(line);\n }\n }\n } catch {\n // Ignore errors\n }\n return null;\n }\n\n private parseStackLine(line: string): CallSite | null {\n let match = line.match(/at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)/);\n if (match) {\n return {\n functionName: match[1],\n fileName: this.extractFileName(match[2]),\n lineNumber: parseInt(match[3], 10),\n };\n }\n\n match = line.match(/at\\s+(.+):(\\d+):(\\d+)/);\n if (match) {\n return {\n fileName: this.extractFileName(match[1]),\n lineNumber: parseInt(match[2], 10),\n };\n }\n\n return null;\n }\n\n private extractFileName(filePath: string): string {\n const parts = filePath.split('/');\n return parts[parts.length - 1] || filePath;\n }\n\n colorize(text: string, color: keyof typeof Colors): string {\n if (!this.config.useColors) return text;\n return `${Colors[color]}${text}${Colors.RESET}`;\n }\n\n getColors(): typeof Colors {\n return Colors;\n }\n\n createPackageLogger(\n packageName: string,\n packageEmoji?: string\n ): DevelopmentLogger {\n return new DevelopmentLogger({\n ...this.config,\n packageName,\n packageEmoji: packageEmoji || '\uD83D\uDCE6',\n });\n }\n\n private getLogLevelFromEnv(): LogLevel {\n switch (LOG_LEVEL_ENV.toUpperCase()) {\n case 'DEBUG':\n return LogLevel.DEBUG;\n case 'INFO':\n return LogLevel.INFO;\n case 'WARN':\n return LogLevel.WARN;\n case 'ERROR':\n return LogLevel.ERROR;\n case 'NONE':\n return LogLevel.NONE;\n default:\n // Unknown level \u2192 quiet fallback (WARN).\n return LogLevel.WARN;\n }\n }\n\n private shouldEnableLogging(): boolean {\n if (LOG_LEVEL_ENV === 'NONE') return false;\n return true;\n }\n\n private shouldUseColors(): boolean {\n if (IS_CI) return false;\n // Check if we're in a browser environment\n if (typeof window !== 'undefined') {\n return true; // Browsers support console colors\n }\n // Node.js environment\n if (\n typeof process !== 'undefined' &&\n process.stdout &&\n !process.stdout.isTTY\n ) {\n return false;\n }\n return IS_DEVELOPMENT;\n }\n}\n\n// Production no-op functions - these create completely eliminatable calls\nconst noop = () => {};\nconst noopWithReturn = () => () => {};\n\n// Export logger with build-time method elimination\nexport const logger = IS_PRODUCTION\n ? {\n configure: noop,\n debug: noop, // \u2190 This eliminates the call completely\n info: noop, // \u2190 This eliminates the call completely\n warn: (message: string, data?: unknown) => {\n console.warn(`\uD83E\uDD81 LionRapid Core \u26A0\uFE0F ${message}`, data || '');\n },\n error: (message: string, data?: unknown) => {\n console.error(`\uD83E\uDD81 LionRapid Core \u274C ${message}`, data || '');\n },\n time: noopWithReturn,\n colorize: (text: string) => text,\n getColors: () => Colors,\n createPackageLogger: (packageName: string, packageEmoji?: string) => ({\n configure: noop,\n debug: noop, // \u2190 Package logger debug also eliminated\n info: noop, // \u2190 Package logger info also eliminated\n warn: (message: string, data?: unknown) => {\n const prefix = `${packageEmoji || '\uD83D\uDCE6'} ${packageName}`;\n console.warn(`${prefix} \u26A0\uFE0F ${message}`, data || '');\n },\n error: (message: string, data?: unknown) => {\n const prefix = `${packageEmoji || '\uD83D\uDCE6'} ${packageName}`;\n console.error(`${prefix} \u274C ${message}`, data || '');\n },\n time: noopWithReturn,\n colorize: (text: string) => text,\n getColors: () => Colors,\n createPackageLogger: noop,\n }),\n }\n : new DevelopmentLogger({\n packageName: 'LionRapid Core',\n packageEmoji: '\uD83E\uDD81',\n });\n\n// Export Logger class for type compatibility\nexport const Logger = IS_PRODUCTION\n ? function Logger() {\n return logger;\n }\n : DevelopmentLogger;\n\n// Factory function with build-time elimination\nexport const createPackageLogger = (config: PackageLoggerConfig) => {\n if (IS_PRODUCTION) {\n const prefix = `${config.packageEmoji || '\uD83D\uDCE6'} ${config.packageName || 'LionRapid'}`;\n return {\n configure: noop,\n debug: noop, // \u2190 All debug calls eliminated\n info: noop, // \u2190 All info calls eliminated\n warn: (message: string, data?: unknown) => {\n console.warn(`${prefix} \u26A0\uFE0F ${message}`, data || '');\n },\n error: (message: string, data?: unknown) => {\n console.error(`${prefix} \u274C ${message}`, data || '');\n },\n time: noopWithReturn,\n colorize: (text: string) => text,\n getColors: () => Colors,\n createPackageLogger: noop,\n };\n }\n return new DevelopmentLogger(config);\n};\n\n// Performance measurement helper - eliminated in production\nexport const measure = (name: string) => {\n if (IS_PRODUCTION) {\n return {\n start: noop,\n end: noop,\n elapsed: () => 0,\n };\n }\n\n let startTime: number;\n return {\n start: () => {\n if (IS_DEVELOPMENT) {\n startTime = performance.now();\n logger.debug(`\u23F1\uFE0F ${name} - started`);\n }\n },\n end: () => {\n if (IS_DEVELOPMENT) {\n const duration = performance.now() - startTime;\n logger.debug(`\u23F1\uFE0F ${name} - completed in ${duration.toFixed(2)}ms`);\n return duration;\n }\n return 0;\n },\n elapsed: () => (IS_DEVELOPMENT ? performance.now() - startTime : 0),\n };\n};\n", "/**\n * Enhanced event emitter with language change helpers\n * filepath: /home/janrau/tm-integration/packages/core/src/base/event-emitter.ts\n */\n\nimport type {\n LionRapidEventEnvelope,\n LionRapidEventPayloads,\n LionRapidContext,\n} from '../types/lionRapid.types.js';\nimport type { TranslationRequest } from '../types/translation.types.js';\nimport { logger } from '../utils/logger.js';\n\n// \u2705 Type-safe listener function type\ntype EventListener<T extends Record<string, unknown>, K extends keyof T> = (\n envelope: LionRapidEventEnvelope<T, K>\n) => void;\n\n// \u2705 Type-safe listener storage\n// type EventListenerMap = {\n// [K in keyof LionRapidEventPayloads]: Set<\n// EventListener<LionRapidEventPayloads, K>\n// >;\n// };\n\nexport class EventEmitter {\n // \u2705 Properly typed event listeners without `any`\n private eventListeners = new Map<\n keyof LionRapidEventPayloads,\n Set<EventListener<LionRapidEventPayloads, keyof LionRapidEventPayloads>>\n >();\n\n private debugMode: boolean = process.env.NODE_ENV === 'development';\n\n /**\n * Subscribe to events (PUBLIC API) - Fully type-safe\n */\n on<K extends keyof LionRapidEventPayloads>(\n event: K,\n listener: EventListener<LionRapidEventPayloads, K>\n ): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n\n // \u2705 Type assertion is safe here because we control the map structure\n const listeners = this.eventListeners.get(event) as Set<\n EventListener<LionRapidEventPayloads, K>\n >;\n listeners.add(listener);\n }\n\n /**\n * Unsubscribe from events (PUBLIC API) - Fully type-safe\n */\n off<K extends keyof LionRapidEventPayloads>(\n event: K,\n listener: EventListener<LionRapidEventPayloads, K>\n ): void {\n const listeners = this.eventListeners.get(event) as\n | Set<EventListener<LionRapidEventPayloads, K>>\n | undefined;\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * \u2705 Type-safe emit with proper generic constraint\n */\n emit<K extends keyof LionRapidEventPayloads>(\n event: K,\n envelope: LionRapidEventEnvelope<LionRapidEventPayloads, K>\n ): void {\n const listeners = this.eventListeners.get(event) as\n | Set<EventListener<LionRapidEventPayloads, K>>\n | undefined;\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(envelope);\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error);\n }\n });\n }\n }\n\n hasListeners<K extends keyof LionRapidEventPayloads>(event: K): boolean {\n return (\n this.eventListeners.has(event) && this.eventListeners.get(event)!.size > 0\n );\n }\n\n clearEvents(): void {\n this.eventListeners.clear();\n }\n\n /**\n * \u2705 Create base context once per request\n */\n private createContext(\n requestId: string,\n trace: string[],\n extra?: Partial<LionRapidContext>\n ): LionRapidContext {\n return {\n requestId,\n timestamp: performance.now(),\n trace,\n ...extra,\n };\n }\n\n /**\n * \u2705 Type-safe event emission helper\n */\n private emitEvent<K extends keyof LionRapidEventPayloads>(\n event: K,\n payload: LionRapidEventPayloads[K],\n requestId: string,\n trace: string[]\n ): void {\n this.emit(event, {\n context: this.createContext(requestId, trace),\n payload,\n });\n }\n\n /**\n * \u2705 Translation event builder with proper typing\n */\n translation(request: TranslationRequest, handler?: string) {\n const baseTrace = ['translation'];\n const handlerTrace = handler ? [...baseTrace, handler] : baseTrace;\n\n return {\n request: () => {\n this.emit('translation:request', {\n context: this.createContext(request.id, [...baseTrace, 'request']),\n payload: { key: request.cleanKey },\n });\n },\n\n success: (value: string) => {\n this.emit('translation:success', {\n context: this.createContext(request.id, [...handlerTrace, 'success']),\n payload: { key: request.cleanKey, value },\n });\n },\n\n fallback: (value: string) => {\n this.emit('translation:fallback', {\n context: this.createContext(request.id, [...baseTrace, 'fallback']),\n payload: { key: request.cleanKey, value },\n });\n },\n\n missing: (fallbackValue: string, locale: string, namespace: string) => {\n this.emit('translation:missing', {\n context: this.createContext(request.id, [...baseTrace, 'missing']),\n payload: {\n key: request.cleanKey,\n fallbackValue,\n locale,\n namespace,\n },\n });\n },\n\n notFound: (fallbackValue: string, locale: string, namespace: string) => {\n this.emit('translation:not-found', {\n context: this.createContext(request.id, [...baseTrace, 'not-found']),\n payload: {\n key: request.cleanKey,\n fallbackValue,\n locale,\n namespace,\n status: 404 as const,\n },\n });\n },\n\n locked: (fallbackValue: string, locale: string, namespace: string) => {\n this.emit('translation:locked', {\n context: this.createContext(request.id, [...baseTrace, 'locked']),\n payload: {\n key: request.cleanKey,\n fallbackValue,\n locale,\n namespace,\n status: 423 as const,\n },\n });\n },\n };\n }\n\n /**\n * \u2705 Repository event builder with better typing\n */\n repo(request: TranslationRequest | string, source: string) {\n const baseTrace = ['repo', source];\n\n return {\n getStart: () => {\n if (typeof request === 'string') return;\n this.emit('repo:get:start', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'get',\n 'start',\n ]),\n payload: { key: request.cleanKey, source },\n });\n },\n\n getSuccess: (value: string) => {\n if (typeof request === 'string') return;\n this.emit('repo:get:success', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'get',\n 'success',\n ]),\n payload: { key: request.cleanKey, value, source },\n });\n },\n\n getMiss: () => {\n if (typeof request === 'string') return;\n this.emit('repo:get:miss', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'get',\n 'miss',\n ]),\n payload: { key: request.cleanKey, source },\n });\n },\n\n setStart: (value: string) => {\n if (typeof request === 'string') return;\n this.emit('repo:set:start', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'set',\n 'start',\n ]),\n payload: { key: request.cleanKey, value, source },\n });\n },\n\n setSuccess: (value: string) => {\n const id = typeof request === 'string' ? 'system' : request.id;\n const key = typeof request === 'string' ? request : request.cleanKey;\n this.emit('repo:set:success', {\n context: this.createContext(id, [...baseTrace, 'set', 'success']),\n payload: { key: key, value, source },\n });\n },\n\n error: (error: Error) => {\n if (typeof request === 'string') return;\n this.emit('repo:error', {\n context: this.createContext(request.id, [...baseTrace, 'error']),\n payload: { key: request.cleanKey, source, error },\n });\n },\n };\n }\n\n /**\n * \u2705 Network event builder\n */\n network(request: TranslationRequest | string, method?: string) {\n const key = typeof request === 'string' ? request : request.cleanKey;\n const requestId = typeof request === 'string' ? 'network' : request.id;\n const baseTrace = ['network', method || 'request'];\n\n return {\n start: () => {\n this.emit('network:request:start', {\n context: this.createContext(requestId, [...baseTrace, 'start']),\n payload: { key },\n });\n },\n\n success: (value: string) => {\n this.emit('network:request:success', {\n context: this.createContext(requestId, [...baseTrace, 'success']),\n payload: { key, value, method: method || 'GET' },\n });\n },\n\n error: (error: unknown, status?: number) => {\n this.emit('network:request:error', {\n context: this.createContext(requestId, [...baseTrace, 'error']),\n payload: {\n key,\n method: method || 'GET',\n error,\n ...(status && { status }),\n },\n });\n },\n\n retry: (attempt: number, delayMs: number, reason?: string) => {\n this.emit('network:retry', {\n context: this.createContext(requestId, [...baseTrace, 'retry']),\n payload: { key, attempt, delayMs, ...(reason && { reason }) },\n });\n },\n };\n }\n\n /**\n * \u2705 Builder event builder\n */\n builder() {\n const baseTrace = ['builder'];\n const systemId = `build-${Date.now()}`;\n\n return {\n use: (type: 'plugin' | 'sync' | 'async' | 'network') => {\n this.emit('builder:use', {\n context: this.createContext(systemId, [...baseTrace, 'use']),\n payload: { type },\n });\n },\n\n buildStart: (locale: string, namespace: string) => {\n this.emit('builder:build:start', {\n context: this.createContext(systemId, [\n ...baseTrace,\n 'build',\n 'start',\n ]),\n payload: { locale, namespace },\n });\n },\n\n buildDone: (repositories: string[], plugins: string[]) => {\n this.emit('builder:build:done', {\n context: this.createContext(systemId, [\n ...baseTrace,\n 'build',\n 'done',\n ]),\n payload: { repositories, plugins },\n });\n },\n };\n }\n\n /**\n * \u2705 Language change event builder\n */\n language(oldLocale: string, newLocale: string) {\n const requestId = `lang-change-${Date.now()}`;\n const baseTrace = ['language', 'change'];\n\n return {\n start: () => {\n this.emit('language:change:start', {\n context: this.createContext(requestId, [...baseTrace, 'start']),\n payload: { oldLocale, newLocale },\n });\n },\n\n complete: () => {\n this.emit('language:change:success', {\n context: this.createContext(requestId, [...baseTrace, 'complete']),\n payload: { oldLocale, newLocale },\n });\n },\n\n error: (error: Error) => {\n this.emit('language:change:error', {\n context: this.createContext(requestId, [...baseTrace, 'error']),\n payload: { oldLocale, newLocale, error },\n });\n },\n };\n }\n\n /**\n * \u2705 Cache operations (debug only)\n */\n cache(operation: 'clear', reason: string, stats?: { clearedCount: number }) {\n // Only emit in debug mode\n if (!this.debugMode) return { start: () => {}, complete: () => {} };\n\n return {\n start: () => {\n logger.debug(`\uD83E\uDDF9 Cache ${operation} starting: ${reason}`);\n },\n\n complete: () => {\n logger.debug(\n `\u2705 Cache ${operation} complete: ${stats?.clearedCount || 0} entries`\n );\n },\n };\n }\n}\n", "/**\n * Array-based handler chain implementation\n * Much simpler than linked list approach\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport type {\n IAsyncHandler,\n ISyncHandler,\n} from '../interfaces/handler.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n TranslationContext,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger } from '../utils/logger.js';\n\nexport class HandlerChain {\n private asyncHandlers: IAsyncHandler[] = [];\n private syncHandlers: ISyncHandler[] = [];\n private bus: EventEmitter;\n\n constructor(eventEmitter: EventEmitter) {\n this.bus = eventEmitter;\n }\n\n addSyncHandler(handler: ISyncHandler): void {\n if (!handler.enabled) return;\n this.syncHandlers.push(handler);\n this.sortHandlersIfNeeded(this.syncHandlers);\n logger.debug(`Sync handler added: ${handler.name}`);\n }\n\n handleSync(request: TranslationRequest): TranslationResult | null {\n for (const handler of this.syncHandlers) {\n try {\n const result = handler.lookup(request);\n if (result !== null && result.value) {\n logger.debug(`Sync hit: ${handler.name} (${result.duration}ms)`);\n return result;\n }\n } catch (error) {\n logger.warn(`Sync lookup failed in ${handler.name}:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n continue;\n }\n }\n return null;\n }\n\n private saveToMemoryHandlers(\n request: TranslationRequest,\n result: TranslationResult,\n _sourceHandler: IAsyncHandler\n ): void {\n const memoryHandlers = this.syncHandlers;\n if (memoryHandlers.length === 0) return;\n logger.debug(`Saving to ${memoryHandlers.length} memory handlers`);\n\n // Result already contains value and styles from source handler\n memoryHandlers.forEach(handler => {\n try {\n handler.save(request, result);\n logger.debug(`Saved to memory: ${handler.name}`);\n } catch (error) {\n logger.warn(`Failed to save to memory ${handler.name}:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n }\n });\n }\n\n private saveNamespaceToMemoryHandlers(\n translations: TranslationData,\n context: TranslationContext\n ): void {\n const memoryHandlers = this.syncHandlers.filter(\n h => h.type === 'memory' && h.saveNamespace\n );\n\n if (memoryHandlers.length === 0) return;\n\n logger.debug(\n `Saving namespace to ${memoryHandlers.length} memory handlers`\n );\n\n // \u2705 Save to memory handlers (sync)\n memoryHandlers.forEach(handler => {\n try {\n handler.saveNamespace!(translations, context);\n logger.debug(`Namespace saved to memory: ${handler.name}`, {\n locale: context.locale,\n namespace: context.namespace,\n });\n } catch (error) {\n logger.warn(\n `Failed to save namespace to memory ${handler.name}:`,\n error\n );\n const repoBus = this.bus.repo(\n `${context.locale}:${context.namespace}`,\n handler.name\n );\n repoBus.error(error as Error);\n }\n });\n }\n\n addAsyncHandler(handler: IAsyncHandler): void {\n if (!handler.enabled) return;\n this.asyncHandlers.push(handler);\n this.sortHandlersIfNeeded(this.asyncHandlers);\n\n logger.debug(`Async handler added: ${handler.name}`);\n }\n\n async handleAsync(\n request: TranslationRequest\n ): Promise<TranslationResult | null> {\n for (const handler of this.asyncHandlers) {\n try {\n logger.debug(`Trying handler: ${handler.name}`);\n const result = await handler.lookup(request);\n\n // Check if we got a successful result (not fallback)\n if (result.value && result.status === 200) {\n // Found translation - save to all storage handlers that come before this one\n logger.debug(`Async hit: ${handler.name} (${result.duration}ms)`);\n\n // If a full namespace was loaded during lookup, save it first\n if (result.namespaceLoaded) {\n logger.debug(\n `Saving loaded namespace: ${result.namespaceLoaded.locale}:${result.namespaceLoaded.namespace}`\n );\n await this.saveNamespaceToHandlers(result.namespaceLoaded.data, {\n locale: result.namespaceLoaded.locale,\n namespace: result.namespaceLoaded.namespace,\n });\n return result;\n }\n\n // Save to storage and memory handlers (styles included in result)\n await this.saveToStorageHandlers(request, result, handler);\n this.saveToMemoryHandlers(request, result, handler);\n\n return result;\n }\n\n // If we got a fallback result (404, 423, error), continue to next handler\n logger.debug(\n `Handler ${handler.name} returned fallback (status: ${result.status})`\n );\n } catch (error) {\n logger.warn(`Handler ${handler.name} failed:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n continue;\n }\n }\n logger.debug(`No async handlers found translation for ${request.cleanKey}`);\n return null; // Not found in any handler\n }\n\n /**\n * Save translation to all storage handlers that come before the source handler\n */\n private async saveToStorageHandlers(\n request: TranslationRequest,\n result: TranslationResult,\n sourceHandler: IAsyncHandler\n ): Promise<void> {\n const sourceIndex = this.asyncHandlers.indexOf(sourceHandler);\n\n // Get all storage handlers with higher priority (lower index) than source\n const storageHandlers = this.asyncHandlers\n .slice(0, sourceIndex)\n .filter(h => h.type === 'storage');\n\n if (storageHandlers.length === 0) return;\n\n logger.debug(`Saving to ${storageHandlers.length} storage handlers`);\n\n // Result already contains value and styles from source handler\n const savePromises = storageHandlers.map(async handler => {\n try {\n await handler.save(request, result);\n logger.debug(`Saved to storage: ${handler.name}`);\n } catch (error) {\n logger.warn(`Failed to save to storage ${handler.name}:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n }\n });\n\n await Promise.allSettled(savePromises);\n }\n\n private async saveNamespaceToStorageHandlers(\n translations: TranslationData,\n context: TranslationContext\n ): Promise<void> {\n const storageHandlers = this.asyncHandlers.filter(\n h => h.type === 'storage' && h.saveNamespace\n );\n\n if (storageHandlers.length === 0) return;\n\n logger.debug(\n `Saving namespace to ${storageHandlers.length} storage handlers`\n );\n\n // \u2705 Save to storage handlers (async/parallel)\n const savePromises = storageHandlers.map(async handler => {\n try {\n await handler.saveNamespace!(translations, context);\n logger.debug(`Namespace saved to storage: ${handler.name}`, {\n locale: context.locale,\n namespace: context.namespace,\n });\n } catch (error) {\n logger.warn(\n `Failed to save namespace to storage ${handler.name}:`,\n error\n );\n const repoBus = this.bus.repo(\n `${context.locale}:${context.namespace}`,\n handler.name\n );\n repoBus.error(error as Error);\n }\n });\n\n await Promise.allSettled(savePromises);\n }\n\n async saveNamespaceToHandlers(\n translations: TranslationData,\n context: TranslationContext\n ): Promise<void> {\n this.saveNamespaceToMemoryHandlers(translations, context);\n await this.saveNamespaceToStorageHandlers(translations, context);\n }\n\n getSyncHandlers(): ISyncHandler[] {\n return [...this.syncHandlers];\n }\n\n getAsyncHandlers(): IAsyncHandler[] {\n return [...this.asyncHandlers];\n }\n\n /**\n * Get chain info for debugging\n */\n getChainInfo(): {\n length: number;\n handlers: Array<{\n name: string;\n priority: number;\n type: 'memory' | 'storage' | 'network' | 'fallback';\n enabled: boolean | undefined;\n }>;\n } {\n return {\n length: this.syncHandlers.length + this.asyncHandlers.length,\n handlers: [\n ...this.syncHandlers.map(h => ({\n name: h.name,\n priority: h.priority,\n type: h.type,\n enabled: h.enabled,\n })),\n ...this.asyncHandlers.map(h => ({\n name: h.name,\n priority: h.priority,\n type: h.type,\n enabled: h.enabled,\n })),\n ],\n };\n }\n\n /**\n * Check if any handler has cached data\n */\n isCached(request: TranslationRequest): boolean {\n return (\n this.syncHandlers.some(h => h.isCached?.(request) === true) ||\n this.asyncHandlers.some(h => h.isCached?.(request) === true)\n );\n }\n\n /**\n * Get combined cache entries\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries(): Record<string, any> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const entries: Record<string, any> = {};\n\n // \u2705 Fix: Use proper arrays instead of this.handlers\n const allHandlers = [...this.syncHandlers, ...this.asyncHandlers];\n for (const handler of allHandlers) {\n if (handler.getEntries) {\n entries[handler.name] = handler.getEntries();\n }\n }\n return entries;\n }\n\n /**\n * Destroy all handlers\n */\n async destroy(): Promise<void> {\n // \u2705 Fix: Use proper arrays instead of this.handlers\n const allHandlers = [...this.syncHandlers, ...this.asyncHandlers];\n\n const destroyPromises = allHandlers.map(async handler => {\n try {\n await handler.destroy?.();\n logger.debug(`Handler destroyed: ${handler.name}`);\n } catch (error) {\n logger.warn(`Failed to destroy handler: ${handler.name}`, error);\n }\n });\n\n await Promise.allSettled(destroyPromises);\n\n // Clear handler arrays\n this.syncHandlers = [];\n this.asyncHandlers = [];\n }\n\n private sortHandlersIfNeeded(\n handlers: ISyncHandler[] | IAsyncHandler[]\n ): void {\n const hasExplicitPriorities = handlers.some(h => h.priority > 0);\n\n if (hasExplicitPriorities) {\n handlers.sort((a, b) => {\n const priorityA = a.priority || Number.MAX_SAFE_INTEGER;\n const priorityB = b.priority || Number.MAX_SAFE_INTEGER;\n return priorityA - priorityB;\n });\n }\n }\n\n async loadNamespace(\n locale: string,\n namespace: string\n ): Promise<TranslationData | null> {\n for (const handler of this.asyncHandlers) {\n if (handler.type !== 'network') continue;\n try {\n logger.debug(\n `Trying to load namespace: ${locale}:${namespace} from ${handler.name}`\n );\n const result = await handler.loadNamespace?.(locale, namespace);\n if (result && result.data && result.status === 200) {\n logger.debug(\n `Loaded namespace: ${locale}:${namespace} from ${handler.name}`\n );\n await this.saveNamespaceToStorageHandlers(result.data, {\n namespace,\n locale,\n });\n this.saveNamespaceToMemoryHandlers(result.data, {\n namespace,\n locale,\n });\n return result.data;\n }\n } catch (error) {\n logger.warn(\n `Failed to load namespace: ${locale}:${namespace} from ${handler.name}`,\n error\n );\n const repoBus = this.bus.repo(`${locale}:${namespace}`, handler.name);\n repoBus.error(error as Error);\n continue;\n }\n }\n logger.debug(`No handlers found namespace: ${locale}:${namespace}`);\n return null;\n }\n\n clearCache(): void {\n const allHandlers = [...this.syncHandlers, ...this.asyncHandlers];\n\n for (const handler of allHandlers) {\n try {\n handler.destroy?.();\n logger.debug(`Cache cleared for handler: ${handler.name}`);\n } catch (error) {\n logger.warn(\n `Failed to clear cache for handler: ${handler.name}`,\n error\n );\n }\n }\n\n logger.debug('Cache cleared for all handlers');\n }\n\n /**\n * Clear cache entries for a specific namespace\n */\n clearNamespace(locale: string, namespace: string): void {\n // Clear from sync handlers (memory)\n for (const handler of this.syncHandlers) {\n try {\n handler.clearNamespace?.(locale, namespace);\n } catch (error) {\n logger.warn(\n `Failed to clear namespace for handler: ${handler.name}`,\n error\n );\n }\n }\n\n logger.debug(`Cleared namespace: ${locale}:${namespace}`);\n }\n\n /**\n * Set a value directly in the cache (for optimistic updates)\n * Bypasses the normal handler flow to directly set values in memory handlers\n * Stores as ContentUnit (text + styles) for consistency\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @param value - Translation value\n * @param styles - Optional styles for indexed tags\n */\n setCache(key: string, value: string, styles?: Record<string, string[]>): void {\n // Save to memory handlers using the dedicated setCache method\n // Handler stores as ContentUnit JSON internally\n for (const handler of this.syncHandlers) {\n if (handler.type === 'memory' && handler.setCache) {\n try {\n handler.setCache(key, value, styles);\n } catch (error) {\n logger.warn(`Failed to set cache in handler: ${handler.name}`, error);\n }\n }\n }\n\n logger.debug(`Cache set: ${key}`);\n }\n\n /**\n * Get namespace data from cache for ContentUnit style lookup\n *\n * Used by t() to retrieve styles for indexed tags at render time.\n *\n * @param namespaceCacheKey - Cache key in format @locale:namespace\n * @returns Parsed namespace data or null if not found\n */\n getNamespaceData(namespaceCacheKey: string): TranslationData | null {\n // Try to get from memory handlers first (sync)\n for (const handler of this.syncHandlers) {\n if (handler.type === 'memory') {\n try {\n const entries = handler.getEntries?.();\n if (entries && entries[namespaceCacheKey]) {\n const data = entries[namespaceCacheKey];\n // Parse if it's a string (JSON)\n if (typeof data === 'string') {\n return JSON.parse(data);\n }\n return data;\n }\n } catch (error) {\n logger.debug(`Error getting namespace data from ${handler.name}:`, error);\n }\n }\n }\n return null;\n }\n}\n", "import type { ParsedNamespaceKey } from '../types/translation.types.js';\n/**\n * Namespace parsing utilities for translation keys\n * Supports patterns like: 'common:welcome', 'user.profile.name', 'errors:validation.required'\n */\n\n\n/**\n * Parse namespace from translation key\n * Supports: 'namespace:key' pattern\n * Future: Could support other patterns like 'namespace.key' or 'namespace/key'\n * \n * @param key - Translation key (e.g., 'common:welcome' or 'welcome')\n * @returns Parsed namespace information\n */\nexport function parseNamespaceKey(key: string): ParsedNamespaceKey {\n // Simple namespace pattern: 'namespace:key'\n const colonIndex = key.indexOf(':');\n \n if (colonIndex > 0 && colonIndex < key.length - 1) {\n // Has explicit namespace\n const namespace = key.substring(0, colonIndex);\n const cleanKey = key.substring(colonIndex + 1);\n \n return {\n originalKey: key,\n namespace,\n cleanKey,\n hasExplicitNamespace: true\n };\n }\n \n // No namespace found\n return {\n originalKey: key,\n cleanKey: key,\n hasExplicitNamespace: false\n };\n}\n\n/**\n * Create a full namespaced key\n * \n * @param key - Clean translation key\n * @param namespace - Namespace to prepend\n * @returns Namespaced key (e.g., 'common:welcome')\n */\nexport function createNamespacedKey(key: string, namespace?: string): string {\n if (!namespace) return key;\n return `${namespace}:${key}`;\n}\n\n/**\n * Validate namespace format\n * \n * @param namespace - Namespace to validate\n * @returns Whether namespace is valid\n */\nexport function isValidNamespace(namespace: string): boolean {\n // Simple validation: alphanumeric, underscore, hyphen\n return /^[a-zA-Z0-9_-]+$/.test(namespace);\n}", "/**\n * Translation context creation utilities\n */\n\nimport type { TranslationContext, ParsedNamespaceKey } from '../types/translation.types.js';\n\n/**\n * Create translation context with namespace resolution\n * \n * @param parsedKey - Parsed namespace key information\n * @param currentLocale - Current locale\n * @param defaultNamespace - Default namespace if none specified\n * @param fallbackLocale - Fallback locale\n * @returns Complete translation context\n */\nexport function createTranslationContext(\n parsedKey: ParsedNamespaceKey,\n currentLocale: string,\n defaultNamespace?: string,\n fallbackLocale?: string\n): TranslationContext {\n // Use explicit namespace if provided, otherwise use default\n const effectiveNamespace = parsedKey.hasExplicitNamespace \n ? parsedKey.namespace \n : defaultNamespace;\n\n return {\n locale: currentLocale,\n namespace: effectiveNamespace,\n fallbackLocale: fallbackLocale || currentLocale\n };\n}\n\n/**\n * Check if two contexts are equivalent (for caching)\n * \n * @param context1 - First context\n * @param context2 - Second context \n * @returns Whether contexts are equivalent\n */\nexport function areContextsEquivalent(\n context1: TranslationContext, \n context2: TranslationContext\n): boolean {\n return (\n context1.locale === context2.locale &&\n context1.namespace === context2.namespace &&\n context1.fallbackLocale === context2.fallbackLocale\n );\n}", "/**\n * Translation value processing utilities\n * Handles simple strings, nested objects, pluralization, and context\n */\n\n// import type { TranslationParams } from '../types/translation.types.js';\n// import { interpolateParams } from './translation-utils.js';\nimport { logger } from './logger.js';\n\n\n/**\n * \u2705 Resolve nested key path in translation object\n */\n/**\n * \u2705 Resolve nested key from namespace object\n * Examples:\n * - resolveNestedKey({user: {profile: {name: \"John\"}}}, \"user.profile.name\") \u2192 \"John\"\n * - resolveNestedKey({items: [{name: \"Apple\"}]}, \"items[0].name\") \u2192 \"Apple\"\n * - resolveNestedKey({welcome: \"Hello\"}, \"welcome\") \u2192 \"Hello\"\n */\nexport function resolveNestedKey(\n namespace: Record<string, unknown>,\n keyPath: string\n): unknown {\n if (!namespace || !keyPath) {\n return undefined;\n }\n\n // Handle simple key (no nesting)\n if (!keyPath.includes('.') && !keyPath.includes('[')) {\n return namespace[keyPath];\n }\n\n // Handle nested key navigation\n try {\n const keys = parseKeyPath(keyPath);\n let current: unknown = namespace;\n\n for (const key of keys) {\n if (current === null || current === undefined) {\n logger.debug(\n `\uD83D\uDD0D Nested key resolution stopped at null/undefined for: ${keyPath}`\n );\n return undefined;\n }\n\n if (typeof key === 'number') {\n // Array index access\n if (!Array.isArray(current)) {\n logger.debug(\n `\uD83D\uDD0D Expected array for index ${key} in path: ${keyPath}`\n );\n return undefined;\n }\n current = current[key];\n } else {\n // Object property access\n if (typeof current !== 'object') {\n logger.debug(\n `\uD83D\uDD0D Expected object for key '${key}' in path: ${keyPath}`\n );\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n }\n\n logger.debug(\n `\uD83D\uDD0D Nested key resolved: ${keyPath} \u2192 ${typeof current === 'object' ? '[Object]' : current}`\n );\n return current;\n } catch (error) {\n logger.debug(`\uD83D\uDD0D Nested key resolution error for '${keyPath}':`, error);\n return undefined;\n }\n}\n\n/**\n * \u2705 Parse key path into array of keys/indices\n * Examples:\n * - \"user.profile.name\" \u2192 [\"user\", \"profile\", \"name\"]\n * - \"items[0].name\" \u2192 [\"items\", 0, \"name\"]\n * - \"settings.ui.theme\" \u2192 [\"settings\", \"ui\", \"theme\"]\n */\nexport function parseKeyPath(keyPath: string): (string | number)[] {\n const keys: (string | number)[] = [];\n let currentKey = '';\n let inBrackets = false;\n\n for (let i = 0; i < keyPath.length; i++) {\n const char = keyPath[i];\n\n if (char === '.' && !inBrackets) {\n // End of current key\n if (currentKey) {\n keys.push(currentKey);\n currentKey = '';\n }\n } else if (char === '[') {\n // Start of array index\n if (currentKey) {\n keys.push(currentKey);\n currentKey = '';\n }\n inBrackets = true;\n } else if (char === ']' && inBrackets) {\n // End of array index\n if (currentKey) {\n const index = parseInt(currentKey, 10);\n if (!isNaN(index)) {\n keys.push(index);\n } else {\n // Non-numeric index, treat as string\n keys.push(currentKey);\n }\n currentKey = '';\n }\n inBrackets = false;\n } else {\n // Regular character\n currentKey += char;\n }\n }\n\n // Add remaining key\n if (currentKey) {\n keys.push(currentKey);\n }\n\n return keys;\n}\n\n\n/**\n * \u2705 Create individual cache key: locale:namespace:key\n */\nexport function createIndividualCacheKey(\n locale: string,\n namespace: string | undefined,\n key: string\n): string {\n const parts = [locale];\n if (namespace) {\n parts.push(namespace);\n }\n parts.push(key);\n return parts.join(':');\n}\n\n/**\n * \u2705 Create namespace cache key: @locale:namespace\n */\nexport function createNamespaceCacheKey(\n locale: string,\n namespace: string\n): string {\n return `@${locale}:${namespace}`;\n}\n\n/**\n * \u2705 Check if key is namespace cache entry\n */\nexport function isNamespaceCacheKey(key: string): boolean {\n return key.startsWith('@');\n}\n\n/**\n * \u2705 Parse namespace cache key\n */\nexport function parseNamespaceCacheKey(\n key: string\n): { locale: string; namespace: string } | null {\n if (!key.startsWith('@')) return null;\n\n const parts = key.substring(1).split(':');\n if (parts.length !== 2) return null;\n\n const [locale, namespace] = parts;\n return { locale, namespace };\n}\n\n/**\n * \u2705 Parse individual cache key\n */\nexport function parseIndividualCacheKey(\n key: string\n): { locale: string; namespace?: string; translationKey: string } | null {\n if (key.startsWith('@')) return null;\n\n const parts = key.split(':');\n if (parts.length < 2) return null;\n\n if (parts.length === 2) {\n const [locale, translationKey] = parts;\n return { locale, translationKey };\n }\n\n if (parts.length === 3) {\n const [locale, namespace, translationKey] = parts;\n return { locale, namespace, translationKey };\n }\n\n return null;\n}\n\n/**\n * \u2705 Flatten nested translations for caching individual keys\n * Handles both ICU MessageFormat strings and structured objects\n * Stores full ContentUnit as JSON - includes both text and styles\n */\nexport function flattenTranslations(\n translations: Record<string, unknown>,\n prefix = '',\n locale: string,\n namespace: string\n): Record<string, string> {\n const flattened: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(translations)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n const cacheKey = createIndividualCacheKey(locale, namespace, fullKey);\n\n if (typeof value === 'object' && value !== null && 'text' in value && 'styles' in value) {\n // Server returns ContentUnit format: { text, styles }\n // Store as JSON to preserve both text and styles\n flattened[cacheKey] = JSON.stringify(value);\n } else if (typeof value === 'object' && value !== null) {\n // Nested object - flatten recursively\n Object.assign(\n flattened,\n flattenTranslations(value as Record<string, unknown>, fullKey, locale, namespace)\n );\n } else {\n // Fallback for plain strings - wrap in ContentUnit format\n flattened[cacheKey] = JSON.stringify({ text: String(value), styles: {} });\n }\n }\n\n return flattened;\n}\n", "/**\n * Enhanced translation process flow utilities\n * Organizes the step-by-step translation resolution process with i18n features\n */\n\nimport type { TranslationRequest } from '../types/translation.types.js';\nimport { createTranslationContext } from './context-utils.js';\nimport { parseNamespaceKey } from './namespace-utils.js';\nimport {\n createIndividualCacheKey,\n createNamespaceCacheKey,\n} from './translation-value-utils.js';\n\n/**\n * \u2705 Enhanced: Parse and prepare translation request with cache keys\n * This is the entry point that organizes all the parsing logic\n */\nexport function prepareTranslationRequest(\n key: string,\n currentLocale: string,\n defaultValueOrParams?: string | Record<string, unknown>,\n paramsOrDefaultValue?: Record<string, unknown> | string,\n defaultNamespace?: string,\n fallbackLocale?: string\n): TranslationRequest {\n const startTime = performance.now();\n\n // Parse flexible parameters\n const { defaultValue, params } = parseTranslationParams(\n defaultValueOrParams,\n paramsOrDefaultValue\n );\n\n // Parse namespace from key\n const parsedKey = parseNamespaceKey(key);\n\n // Create translation context\n const context = createTranslationContext(\n parsedKey,\n currentLocale,\n defaultNamespace,\n fallbackLocale\n );\n\n // \u2705 Generate cache keys using unified pattern\n const individualCacheKey = createIndividualCacheKey(\n context.locale,\n context.namespace,\n parsedKey.cleanKey\n );\n\n const namespaceCacheKey = context.namespace\n ? createNamespaceCacheKey(context.locale, context.namespace)\n : undefined;\n\n // Generate unique ID for the request (could be a hash or UUID)\n const id = `${individualCacheKey}-${startTime}`;\n\n return {\n id, // Unique request ID\n originalKey: key,\n originalParams: defaultValueOrParams,\n originalDefaultValue: paramsOrDefaultValue,\n cleanKey: parsedKey.cleanKey,\n hasExplicitNamespace: parsedKey.hasExplicitNamespace,\n parsedParams: params,\n parsedDefaultValue: defaultValue,\n locale: currentLocale,\n namespace: context.namespace, // \u2705 Use effective namespace (explicit or default)\n fallbackLocale,\n individualCacheKey, // \u2705 Ready-to-use cache key\n namespaceCacheKey, // \u2705 Ready-to-use namespace key\n startTime,\n };\n}\n\n/**\n * Parse flexible translation parameters\n */\nexport function parseTranslationParams(\n secondParam?: string | Record<string, unknown>,\n thirdParam?: Record<string, unknown> | string\n): { defaultValue?: string; params?: Record<string, unknown> } {\n let defaultValue: string | undefined;\n let params: Record<string, unknown> | undefined;\n\n // Runtime validation: Warn if both params are objects (likely misuse)\n if (\n typeof secondParam === 'object' &&\n typeof thirdParam === 'object' &&\n process.env.NODE_ENV !== 'production'\n ) {\n console.warn(\n '[LionRapid] Warning: Both secondParam and thirdParam are objects. ' +\n 'Expected pattern: t(key, params, defaultValue) or t(key, defaultValue, params). ' +\n 'Second object will be ignored as it cannot be a defaultValue.'\n );\n }\n\n if (typeof secondParam === 'string') {\n // t(key, defaultValue) or t(key, defaultValue, params)\n defaultValue = secondParam;\n if (typeof thirdParam === 'object') {\n params = thirdParam;\n }\n } else if (typeof secondParam === 'object') {\n // t(key, params) or t(key, params, defaultValue)\n params = secondParam;\n if (typeof thirdParam === 'string') {\n defaultValue = thirdParam;\n }\n }\n\n return { defaultValue, params };\n}\n", "/**\n * Simplified memory cache handler\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport { ISyncHandler } from '../interfaces/handler.interface.js';\nimport {\n IStatsProvider,\n ISyncRepository,\n} from '../interfaces/repository.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n TranslationContext,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger } from '../utils/index.js';\nimport {\n createNamespaceCacheKey,\n flattenTranslations,\n resolveNestedKey,\n} from '../utils/translation-value-utils.js';\n\n/**\n * Parsed cache entry containing both text and styles\n */\ninterface CachedContentUnit {\n text: string;\n styles: Record<string, string[]>;\n}\n\n/**\n * Simple memory cache handler\n */\nexport class SyncHandler implements ISyncHandler {\n readonly name: string;\n readonly version = '1.0.0';\n readonly priority: number;\n readonly type = 'memory' as const;\n readonly enabled: boolean;\n private ttlMap = new Map<string, number>();\n private ttl: number;\n private repository: ISyncRepository & IStatsProvider;\n private bus: EventEmitter;\n\n constructor(\n eventEmitter: EventEmitter,\n repository: ISyncRepository & IStatsProvider\n ) {\n this.bus = eventEmitter;\n this.repository = repository;\n this.name = repository.name;\n const config = repository.getConfig();\n this.enabled = config.enabled ?? true;\n this.priority = config.priority ?? 0;\n this.ttl = config.options?.ttl ?? 30 * 60 * 1000; // Default 30 minutes\n }\n\n getSourceType(): 'memory' | 'storage' | 'network' | 'fallback' {\n return 'memory';\n }\n\n /**\n * Simple lookup implementation\n * Returns ContentUnit with both text and styles\n */\n lookup(request: TranslationRequest): TranslationResult {\n const startTime = Date.now();\n logger.debug(`Sync lookup: ${request.cleanKey}`);\n const repoBus = this.bus.repo(request, this.name);\n repoBus.getStart();\n\n const directResult = this.tryDirectLookup(request);\n if (directResult !== null) {\n logger.debug(`Cache hit: ${request.cleanKey}`);\n repoBus.getSuccess(directResult.text);\n return this.createResult(directResult, 'memory', 200, startTime, true);\n }\n\n // Try namespace lookup for nested keys\n if (request.cleanKey.includes('.') && request.namespace) {\n const namespaceResult = this.tryNamespaceLookup(request);\n if (namespaceResult !== null) {\n logger.debug(`Namespace hit: ${request.cleanKey}`);\n repoBus.getSuccess(namespaceResult.text);\n return this.createResult(\n namespaceResult,\n 'memory',\n 200,\n startTime,\n true\n );\n }\n }\n\n logger.debug(`Cache miss: ${request.cleanKey}`);\n repoBus.getMiss();\n\n // Return fallback result (no styles for fallback)\n return this.createResult(\n { text: request.parsedDefaultValue || request.cleanKey, styles: {} },\n 'fallback',\n 404,\n startTime\n );\n }\n\n /**\n * Simple save implementation\n * Stores ContentUnit (text + styles) as JSON\n */\n save(request: TranslationRequest, result: TranslationResult): void {\n if (!result.value) return;\n const repoBus = this.bus.repo(request, this.name);\n\n // Store as ContentUnit JSON (text + styles together)\n const contentUnit: CachedContentUnit = {\n text: result.value,\n styles: result.styles || {},\n };\n this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Saved to cache: ${request.cleanKey}`);\n repoBus.setSuccess(result.value);\n }\n\n /**\n * Namespace saving implementation\n */\n saveNamespace(\n translations: TranslationData,\n context: TranslationContext\n ): void {\n if (!context.namespace) return;\n const repoBus = this.bus.repo(\n context.locale + ':' + context.namespace,\n this.name\n );\n\n // Store full namespace: @locale:namespace\n const namespaceCacheKey = createNamespaceCacheKey(\n context.locale,\n context.namespace\n );\n this.setWithTTL(namespaceCacheKey, JSON.stringify(translations));\n\n // Store flattened individual keys: locale:namespace:key\n const flattened = flattenTranslations(\n translations,\n '',\n context.locale,\n context.namespace!\n );\n\n for (const [flatKey, flatValue] of Object.entries(flattened)) {\n this.setWithTTL(flatKey, flatValue);\n }\n repoBus.setSuccess(JSON.stringify(translations));\n }\n\n /**\n * \u2705 Strategy 1: Direct cache lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private tryDirectLookup(request: TranslationRequest): CachedContentUnit | null {\n // Check TTL and expire if needed\n if (this.checkAndExpireTTL(request.individualCacheKey)) {\n return null;\n }\n\n const cachedValue = this.repository.get(request.individualCacheKey);\n if (!cachedValue) return null;\n\n this.refreshTTL(request.individualCacheKey); // Refresh TTL on access\n\n // Parse cached ContentUnit JSON\n try {\n const parsed = JSON.parse(cachedValue);\n if (typeof parsed === 'object' && 'text' in parsed) {\n return {\n text: String(parsed.text),\n styles: parsed.styles || {},\n };\n }\n // Legacy format: plain string (shouldn't happen with new data)\n return { text: cachedValue, styles: {} };\n } catch {\n // If parse fails, treat as legacy plain string\n return { text: cachedValue, styles: {} };\n }\n }\n\n /**\n * \u2705 Strategy 2: Namespace lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private tryNamespaceLookup(request: TranslationRequest): CachedContentUnit | null {\n if (!request.namespace) return null;\n\n const namespaceCacheKey = createNamespaceCacheKey(\n request.locale,\n request.namespace\n );\n\n // Check TTL for namespace\n if (this.checkAndExpireTTL(namespaceCacheKey)) {\n return null;\n }\n\n const namespaceData = this.repository.get(namespaceCacheKey);\n if (!namespaceData) return null;\n this.refreshTTL(namespaceCacheKey); // Refresh TTL on access\n\n try {\n const translations = JSON.parse(namespaceData);\n const value = resolveNestedKey(translations, request.cleanKey);\n\n if (value !== null && value !== undefined) {\n // Extract ContentUnit from namespace data\n let contentUnit: CachedContentUnit;\n\n if (typeof value === 'object' && value !== null && 'text' in value) {\n // Server ContentUnit format: { text, styles }\n contentUnit = {\n text: String((value as { text: unknown }).text),\n styles: (value as { styles?: Record<string, string[]> }).styles || {},\n };\n } else {\n // Plain string fallback\n contentUnit = { text: String(value), styles: {} };\n }\n\n // Cache the individual key for faster future access (as JSON)\n this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Cached from namespace: ${request.cleanKey}`);\n return contentUnit;\n }\n } catch (error) {\n // Invalid JSON in namespace cache\n logger.debug(\n `Invalid JSON in namespace cache: ${namespaceCacheKey}`,\n error\n );\n this.repository.remove(namespaceCacheKey);\n this.ttlMap.delete(namespaceCacheKey);\n }\n\n return null;\n }\n\n /**\n * Helper to create consistent TranslationResult objects\n * Now includes styles from ContentUnit\n */\n private createResult(\n contentUnit: CachedContentUnit,\n source: 'memory' | 'storage' | 'network' | 'fallback',\n status: number,\n startTime: number,\n cached?: boolean\n ): TranslationResult {\n return {\n value: contentUnit.text,\n styles: contentUnit.styles,\n source,\n status,\n duration: Date.now() - startTime,\n ...(cached !== undefined && { cached }),\n };\n }\n\n /**\n * Check TTL and expire if needed\n * Returns true if expired, false if still valid\n */\n private checkAndExpireTTL(cacheKey: string): boolean {\n const timestamp = this.ttlMap.get(cacheKey);\n if (timestamp && Date.now() - timestamp > this.ttl) {\n this.repository.remove(cacheKey);\n this.ttlMap.delete(cacheKey);\n logger.debug(`TTL expired: ${cacheKey}`);\n return true;\n }\n return false;\n }\n\n /**\n * Set value in repository and update TTL\n */\n private setWithTTL(cacheKey: string, value: string): void {\n this.repository.set(cacheKey, value);\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Refresh TTL on access\n */\n private refreshTTL(cacheKey: string): void {\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Get TTL information for debugging\n */\n getTTLInfo(): Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > {\n const ttlInfo: Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > = {};\n const now = Date.now();\n\n for (const [key, timestamp] of this.ttlMap.entries()) {\n const age = now - timestamp;\n const remaining = Math.max(0, this.ttl - age);\n ttlInfo[key] = { timestamp, age, remaining };\n }\n\n return ttlInfo;\n }\n\n getEntries() {\n if (this.repository.getEntries !== undefined) {\n return this.repository.getEntries();\n }\n }\n\n /**\n * Clear all entries for a specific namespace\n * Removes namespace cache entry, individual keys, and TTL entries\n */\n clearNamespace(locale: string, namespace: string): void {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n const keyPrefix = `${locale}:${namespace}:`;\n\n // Remove namespace cache entry\n this.repository.remove(namespaceCacheKey);\n this.ttlMap.delete(namespaceCacheKey);\n\n // Remove individual translation keys and their TTL entries\n const entries = this.repository.getEntries?.();\n if (entries) {\n for (const key of Object.keys(entries)) {\n if (key.startsWith(keyPrefix)) {\n this.repository.remove(key);\n this.ttlMap.delete(key);\n }\n }\n }\n\n logger.debug(`Cleared namespace: ${locale}:${namespace}`);\n }\n\n destroy(): void {\n this.repository.clear();\n this.ttlMap.clear();\n }\n\n /**\n * Direct cache set (for optimistic updates)\n * Bypasses event emission for direct cache manipulation\n * Stores as ContentUnit JSON (text + styles)\n */\n setCache(key: string, value: string, styles?: Record<string, string[]>): void {\n const contentUnit: CachedContentUnit = {\n text: value,\n styles: styles || {},\n };\n this.setWithTTL(key, JSON.stringify(contentUnit));\n logger.debug(`Direct cache set: ${key}`);\n }\n}\n", "/**\n * Simplified memory cache handler\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport { StorageRepositoryConfig } from '../config';\nimport { IAsyncHandler } from '../interfaces/handler.interface.js';\nimport {\n IAsyncRepository,\n IStatsProvider,\n} from '../interfaces/repository.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n TranslationContext,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger } from '../utils/index.js';\nimport {\n createNamespaceCacheKey,\n flattenTranslations,\n resolveNestedKey,\n} from '../utils/translation-value-utils.js';\n\n/**\n * Parsed cache entry containing both text and styles\n */\ninterface CachedContentUnit {\n text: string;\n styles: Record<string, string[]>;\n}\n\n/**\n * Async storage cache handler (IndexedDB, localStorage, etc.)\n */\nexport class AsyncHandler implements IAsyncHandler {\n readonly name: string;\n readonly version = '1.0.0';\n readonly priority: number;\n readonly type = 'storage' as const;\n readonly enabled: boolean;\n private ttlMap = new Map<string, number>();\n private ttl: number;\n private repository: IAsyncRepository & IStatsProvider;\n private bus: EventEmitter;\n\n constructor(\n eventEmitter: EventEmitter,\n repository: IAsyncRepository & IStatsProvider\n ) {\n this.bus = eventEmitter;\n this.repository = repository;\n this.name = repository.name;\n const config = repository.getConfig() as StorageRepositoryConfig;\n this.enabled = config.enabled ?? true;\n this.priority = config.priority ?? 0;\n this.ttl = config.options?.ttl ?? 30 * 60 * 1000; // Default 30 minutes\n }\n\n getSourceType(): 'memory' | 'storage' | 'network' | 'fallback' {\n return 'memory';\n }\n\n /**\n * Simple lookup implementation\n * Returns ContentUnit with both text and styles\n */\n async lookup(request: TranslationRequest): Promise<TranslationResult> {\n const startTime = Date.now();\n logger.debug(`Async lookup: ${request.cleanKey}`);\n const repoBus = this.bus.repo(request, this.name);\n\n const directResult = await this.tryDirectLookup(request);\n if (directResult !== null) {\n logger.debug(`Cache hit: ${request.cleanKey}`);\n repoBus.getSuccess(directResult.text);\n return this.createResult(directResult, 'storage', 200, startTime, true);\n }\n\n // Try namespace lookup for nested keys\n if (request.cleanKey.includes('.') && request.namespace) {\n const namespaceResult = await this.tryNamespaceLookup(request);\n if (namespaceResult !== null) {\n logger.debug(`Namespace hit: ${request.cleanKey}`);\n repoBus.getSuccess(namespaceResult.text);\n return this.createResult(\n namespaceResult,\n 'storage',\n 200,\n startTime,\n true\n );\n }\n }\n\n logger.debug(`Cache miss: ${request.cleanKey}`);\n repoBus.getMiss();\n\n // Return fallback result (no styles for fallback)\n return this.createResult(\n { text: request.parsedDefaultValue || request.cleanKey, styles: {} },\n 'fallback',\n 404,\n startTime\n );\n }\n\n /**\n * Simple save implementation\n * Stores ContentUnit (text + styles) as JSON\n */\n async save(\n request: TranslationRequest,\n result: TranslationResult\n ): Promise<void> {\n if (!result.value) return;\n const repoBus = this.bus.repo(request, this.name);\n\n // Store as ContentUnit JSON (text + styles together)\n const contentUnit: CachedContentUnit = {\n text: result.value,\n styles: result.styles || {},\n };\n await this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Saved to cache: ${request.cleanKey}`);\n repoBus.setSuccess(result.value);\n }\n\n /**\n * Namespace saving implementation\n */\n async saveNamespace(\n translations: TranslationData,\n context: TranslationContext\n ): Promise<void> {\n if (!context.namespace) return;\n const repoBus = this.bus.repo(\n context.locale + ':' + context.namespace,\n this.name\n );\n const keyCount = Object.keys(translations).length;\n logger.debug(\n `Saving namespace: ${context.locale}:${context.namespace} (${keyCount} keys)`\n );\n\n // Store full namespace: @locale:namespace\n const namespaceCacheKey = createNamespaceCacheKey(\n context.locale,\n context.namespace\n );\n await this.setWithTTL(namespaceCacheKey, JSON.stringify(translations));\n\n // Store flattened individual keys: locale:namespace:key\n const flattened = flattenTranslations(\n translations,\n '',\n context.locale,\n context.namespace!\n );\n\n let savedCount = 0;\n for (const [flatKey, flatValue] of Object.entries(flattened)) {\n await this.setWithTTL(flatKey, flatValue);\n savedCount++;\n }\n\n logger.debug(`Saved: ${savedCount} keys + namespace blob`);\n repoBus.setSuccess(JSON.stringify(translations));\n }\n\n /**\n * \u2705 Strategy 1: Direct cache lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private async tryDirectLookup(\n request: TranslationRequest\n ): Promise<CachedContentUnit | null> {\n // Check TTL and expire if needed\n if (await this.checkAndExpireTTL(request.individualCacheKey)) {\n return null;\n }\n\n const cachedValue = await this.repository.get(request.individualCacheKey);\n if (!cachedValue) return null;\n\n this.refreshTTL(request.individualCacheKey); // Refresh TTL on access\n\n // Parse cached ContentUnit JSON\n try {\n const parsed = JSON.parse(cachedValue);\n if (typeof parsed === 'object' && 'text' in parsed) {\n return {\n text: String(parsed.text),\n styles: parsed.styles || {},\n };\n }\n // Legacy format: plain string\n return { text: cachedValue, styles: {} };\n } catch {\n // If parse fails, treat as legacy plain string\n return { text: cachedValue, styles: {} };\n }\n }\n\n /**\n * \u2705 Strategy 2: Namespace lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private async tryNamespaceLookup(\n request: TranslationRequest\n ): Promise<CachedContentUnit | null> {\n if (!request.namespace) return null;\n\n const namespaceCacheKey = createNamespaceCacheKey(\n request.locale,\n request.namespace\n );\n\n // Check TTL for namespace\n if (await this.checkAndExpireTTL(namespaceCacheKey)) {\n return null;\n }\n\n const namespaceData = await this.repository.get(namespaceCacheKey);\n if (!namespaceData) return null;\n this.refreshTTL(namespaceCacheKey); // Refresh TTL on access\n\n try {\n const translations = JSON.parse(namespaceData);\n const value = resolveNestedKey(translations, request.cleanKey);\n\n if (value !== null && value !== undefined) {\n // Extract ContentUnit from namespace data\n let contentUnit: CachedContentUnit;\n\n if (typeof value === 'object' && value !== null && 'text' in value) {\n // Server ContentUnit format: { text, styles }\n contentUnit = {\n text: String((value as { text: unknown }).text),\n styles: (value as { styles?: Record<string, string[]> }).styles || {},\n };\n } else {\n // Plain string fallback\n contentUnit = { text: String(value), styles: {} };\n }\n\n // Cache the individual key for faster future access (as JSON)\n await this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Cached from namespace: ${request.cleanKey}`);\n return contentUnit;\n }\n } catch (error) {\n // Invalid JSON in namespace cache\n logger.debug(\n `Invalid JSON in namespace cache: ${namespaceCacheKey}`,\n error\n );\n await this.repository.remove(namespaceCacheKey);\n this.ttlMap.delete(namespaceCacheKey);\n }\n\n return null;\n }\n\n /**\n * Helper to create consistent TranslationResult objects\n * Now includes styles from ContentUnit\n */\n private createResult(\n contentUnit: CachedContentUnit,\n source: 'memory' | 'storage' | 'network' | 'fallback',\n status: number,\n startTime: number,\n cached?: boolean\n ): TranslationResult {\n return {\n value: contentUnit.text,\n styles: contentUnit.styles,\n source,\n status,\n duration: Date.now() - startTime,\n ...(cached !== undefined && { cached }),\n };\n }\n\n /**\n * Check TTL and expire if needed (async version)\n * Returns true if expired, false if still valid\n */\n private async checkAndExpireTTL(cacheKey: string): Promise<boolean> {\n const timestamp = this.ttlMap.get(cacheKey);\n if (timestamp && Date.now() - timestamp > this.ttl) {\n await this.repository.remove(cacheKey);\n this.ttlMap.delete(cacheKey);\n logger.debug(`TTL expired: ${cacheKey}`);\n return true;\n }\n return false;\n }\n\n /**\n * Set value in repository and update TTL (async version)\n */\n private async setWithTTL(cacheKey: string, value: string): Promise<void> {\n await this.repository.set(cacheKey, value);\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Refresh TTL on access\n */\n private refreshTTL(cacheKey: string): void {\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Get TTL information for debugging\n */\n getTTLInfo(): Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > {\n const ttlInfo: Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > = {};\n const now = Date.now();\n\n for (const [key, timestamp] of this.ttlMap.entries()) {\n const age = now - timestamp;\n const remaining = Math.max(0, this.ttl - age);\n ttlInfo[key] = { timestamp, age, remaining };\n }\n\n return ttlInfo;\n }\n\n async destroy(): Promise<void> {\n await this.repository.clear();\n this.ttlMap.clear();\n }\n\n getEntries(): Record<string, string> | undefined {\n if (this.repository.getEntries !== undefined) {\n return this.repository.getEntries();\n }\n }\n}\n", "/**\n * Custom error classes for translation operations\n * Used for type-safe exception handling in repositories and handlers\n */\n\n/**\n * Base error class for all translation-related errors\n */\nexport class TranslationError extends Error {\n constructor(\n public readonly key: string,\n public readonly status: number,\n message: string\n ) {\n super(message);\n this.name = this.constructor.name;\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Translation not found in backend (HTTP 404)\n * Should be synced to backend for translators to fill in\n */\nexport class TranslationNotFoundError extends TranslationError {\n constructor(key: string) {\n super(key, 404, `Translation not found: ${key}`);\n }\n}\n\n/**\n * Translation exists but is locked/not ready (HTTP 423)\n * Should NOT be synced to backend - will retry on next app start\n */\nexport class TranslationLockedError extends TranslationError {\n constructor(\n key: string,\n public readonly retryAfter?: number\n ) {\n super(key, 423, `Translation locked: ${key}`);\n }\n}\n\n/**\n * Server error (HTTP 5xx)\n * Should trigger retry logic with exponential backoff\n */\nexport class ServerError extends TranslationError {\n constructor(key: string, status: number) {\n super(key, status, `Server error ${status}: ${key}`);\n }\n}\n\n/**\n * Network error (timeout, DNS failure, CORS, etc.)\n * Not an HTTP error - network layer failed\n */\nexport class NetworkError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Type guard to check if error is a TranslationError\n */\nexport function isTranslationError(error: unknown): error is TranslationError {\n return error instanceof TranslationError;\n}\n\n/**\n * Type guard to check if error is retryable (5xx or network)\n */\nexport function isRetryableError(error: unknown): boolean {\n return error instanceof ServerError || error instanceof NetworkError;\n}\n\n/**\n * Type guard to check if error is client error (4xx - not retryable)\n */\nexport function isClientError(error: unknown): boolean {\n return (\n error instanceof TranslationNotFoundError ||\n error instanceof TranslationLockedError\n );\n}\n", "/**\n * Simplified API handler - no automatic namespace loading\n * Namespace loading is now explicit via builder configuration\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport { NetworkRepositoryConfig, PreloadNamespaces } from '../config';\nimport type { ContentUnit } from '../content/types.js';\nimport {\n isRetryableError,\n TranslationLockedError,\n TranslationNotFoundError,\n} from '../errors/translation-errors.js';\nimport { IAsyncHandler } from '../interfaces/handler.interface.js';\nimport { IAsyncRepository } from '../interfaces/repository.interface.js';\nimport { NetworkRepository } from '../repositories/network-repository.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n NamespaceResult,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger, resolveNestedKey } from '../utils/index.js';\n\n/**\n * Simple API handler - only loads individual keys\n * Namespace loading is handled explicitly by builder\n */\nexport class NetworkHandler implements IAsyncHandler {\n repository: IAsyncRepository;\n readonly name: string;\n readonly priority: number;\n readonly version = '1.0.0';\n readonly type = 'network' as const;\n readonly enabled: boolean;\n private bus: EventEmitter;\n\n private retryCount: number;\n private retryDelay: number;\n\n constructor(eventEmitter: EventEmitter, repository: IAsyncRepository) {\n this.bus = eventEmitter;\n this.repository = repository;\n this.name = repository.name;\n const config = repository.getConfig() as NetworkRepositoryConfig;\n this.enabled = config.enabled ?? false;\n this.priority = config.priority ?? 0;\n this.retryCount = config.options?.retries ?? 3;\n this.retryDelay = config.options?.retryDelay ?? 1000;\n }\n\n initialize(): Promise<void> {\n return Promise.resolve();\n }\n\n getSourceType(): 'memory' | 'storage' | 'network' | 'fallback' {\n return 'network';\n }\n\n /**\n * \u2705 Lookup translation with full error handling\n * Strategy: Key first, namespace as fallback\n * Returns TranslationResult with status, source, duration, styles, and optional error\n */\n async lookup(request: TranslationRequest): Promise<TranslationResult> {\n const startTime = Date.now();\n const fallbackValue = request.parsedDefaultValue || request.cleanKey;\n\n if (!this.enabled) {\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 0,\n startTime\n );\n }\n\n const networkBus = this.bus.network(request, this.name);\n networkBus.start();\n logger.debug(`Network lookup: ${request.cleanKey}`);\n\n // Strategy 1: Try individual key lookup first (returns ContentUnit with styles)\n try {\n const contentUnit = await this.lookupContentUnitWithRetry(\n request.individualCacheKey\n );\n\n logger.debug(`Network hit: ${request.cleanKey}`);\n networkBus.success(contentUnit.text);\n\n // Return text + styles for caching\n return this.createTranslationResult(\n contentUnit.text,\n 'network',\n 200,\n startTime,\n undefined,\n false,\n undefined,\n contentUnit.styles\n );\n } catch (error) {\n // Handle 404 - key not found, try namespace fallback\n if (error instanceof TranslationNotFoundError && request.namespace) {\n logger.debug(\n `Individual key not found, trying namespace: ${request.cleanKey}`\n );\n return this.lookupFromNamespace(request, fallbackValue, startTime, networkBus);\n }\n\n // Handle 423 - locked translation\n if (error instanceof TranslationLockedError) {\n logger.debug(`Translation locked (423): ${request.cleanKey}`);\n return this.handleTranslationLocked(\n request,\n fallbackValue,\n error,\n startTime,\n networkBus\n );\n }\n\n // Handle other errors (server errors, network errors)\n logger.debug(`Network error: ${request.cleanKey}`, error);\n networkBus.error(error as Error);\n\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 0,\n startTime,\n error as Error\n );\n }\n }\n\n /**\n * Strategy 2: Namespace fallback when individual key not found\n */\n private async lookupFromNamespace(\n request: TranslationRequest,\n fallbackValue: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n networkBus: any\n ): Promise<TranslationResult> {\n try {\n const namespaceResult = await this.loadNamespace(\n request.locale,\n request.namespace!\n );\n\n if (namespaceResult && namespaceResult.data) {\n const nestedValue = resolveNestedKey(\n namespaceResult.data,\n request.cleanKey\n );\n\n if (nestedValue !== undefined && nestedValue !== null) {\n // Handle both ContentUnit format and plain strings\n let resolvedValue: string;\n let styles: Record<string, string[]> = {};\n\n if (typeof nestedValue === 'object' && nestedValue !== null && 'text' in nestedValue) {\n // ContentUnit format: { text, styles }\n const contentUnit = nestedValue as { text: unknown; styles?: Record<string, string[]> };\n resolvedValue = String(contentUnit.text);\n styles = contentUnit.styles || {};\n } else {\n // Plain string\n resolvedValue = String(nestedValue);\n }\n\n logger.debug(`Network namespace hit: ${request.cleanKey}, hasStyles=${Object.keys(styles).length > 0}`);\n networkBus.success(resolvedValue);\n\n return this.createTranslationResult(\n resolvedValue,\n 'network',\n 200,\n startTime,\n undefined,\n false,\n {\n locale: request.locale,\n namespace: request.namespace!,\n data: namespaceResult.data,\n },\n styles\n );\n }\n }\n\n // Key not found in namespace either\n const error = new TranslationNotFoundError(request.cleanKey);\n return this.handleTranslationNotFound(\n request,\n fallbackValue,\n error,\n startTime\n );\n } catch (nsError) {\n // Namespace load failed\n logger.debug(`Namespace load failed: ${request.cleanKey}`, nsError);\n\n if (nsError instanceof TranslationNotFoundError) {\n return this.handleTranslationNotFound(\n request,\n fallbackValue,\n nsError,\n startTime\n );\n }\n\n if (nsError instanceof TranslationLockedError) {\n return this.handleTranslationLocked(\n request,\n fallbackValue,\n nsError,\n startTime,\n networkBus\n );\n }\n\n networkBus.error(nsError as Error);\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 0,\n startTime,\n nsError as Error\n );\n }\n }\n\n /**\n * \u2705 Load entire namespace (used for preloading)\n * Returns NamespaceResult with status and error information\n */\n async loadNamespace(\n locale: string,\n namespace: string\n ): Promise<NamespaceResult | null> {\n const startTime = Date.now();\n\n if (!this.enabled) {\n return this.createNamespaceResult(null, 'fallback', 0, startTime);\n }\n\n try {\n const data = await this.loadNamespaceWithRetry(locale, namespace);\n\n // 304 Not Modified \u2014 cached translations are still fresh\n if (data === null) {\n logger.debug(`Network namespace not modified: ${locale}:${namespace}`);\n return this.createNamespaceResult(null, 'network', 304, startTime);\n }\n\n logger.debug(`Network namespace loaded: ${locale}:${namespace}`);\n return this.createNamespaceResult(data, 'network', 200, startTime);\n } catch (error) {\n if (error instanceof TranslationLockedError) {\n logger.debug(`Namespace locked (423): ${locale}:${namespace}`);\n\n return this.createNamespaceResult(\n null,\n 'fallback',\n 423,\n startTime,\n error\n );\n }\n\n if (error instanceof TranslationNotFoundError) {\n logger.debug(`Network namespace not found: ${locale}:${namespace}`);\n\n return this.createNamespaceResult(\n null,\n 'fallback',\n 404,\n startTime,\n error\n );\n }\n\n logger.debug(`Network namespace error: ${locale}:${namespace}`, error);\n\n return this.createNamespaceResult(\n null,\n 'fallback',\n 0,\n startTime,\n error as Error\n );\n }\n }\n\n /**\n * \u2705 Namespace lookup with retry logic\n * Throws custom errors (TranslationNotFoundError, TranslationLockedError, etc.)\n */\n private async loadNamespaceWithRetry(\n locale: string,\n namespace: string\n ): Promise<TranslationData | null> {\n return this.withRetry(\n () => this.repository.getNamespace(locale, namespace),\n `${locale}:${namespace}`,\n 'namespace request'\n );\n }\n\n /**\n * Simple save implementation (API usually doesn't save)\n */\n async save(\n request: TranslationRequest,\n result: TranslationResult\n ): Promise<void> {\n // APIs usually don't save translations, but we could implement PUT if needed\n void request;\n void result;\n }\n\n /**\n * \u2705 Lookup with retry logic for individual keys\n * Throws custom errors (TranslationNotFoundError, TranslationLockedError, etc.)\n */\n private async lookupWithRetry(cacheKey: string): Promise<string> {\n return this.withRetry(\n () => this.repository.get(cacheKey),\n cacheKey,\n 'network request'\n );\n }\n\n /**\n * \u2705 Lookup ContentUnit with retry logic for individual keys\n * Returns full ContentUnit with text and styles\n * Throws custom errors (TranslationNotFoundError, TranslationLockedError, etc.)\n */\n private async lookupContentUnitWithRetry(cacheKey: string): Promise<ContentUnit> {\n // Check if repository supports getContentUnit (NetworkRepository does)\n const repo = this.repository as NetworkRepository;\n if (typeof repo.getContentUnit !== 'function') {\n // Fallback: use get() and wrap in ContentUnit\n const text = await this.lookupWithRetry(cacheKey);\n return { text, styles: {} };\n }\n\n return this.withRetry(\n () => repo.getContentUnit(cacheKey),\n cacheKey,\n 'network content unit request'\n );\n }\n\n /**\n * Delay utility for retries\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private calculateBackoff(attempt: number): number {\n const baseDelay = this.retryDelay;\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n const maxDelay = 10000; // 10 seconds max\n\n // Add jitter to prevent thundering herd\n const jitter = Math.random() * 0.1 * exponentialDelay;\n\n return Math.min(exponentialDelay + jitter, maxDelay);\n }\n\n /**\n * Generic retry wrapper for repository operations\n * Handles retryable errors with exponential backoff\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n contextKey: string,\n contextDescription: string,\n attempt = 1\n ): Promise<T> {\n const networkBus = this.bus.network(contextKey, 'withRetry');\n\n try {\n return await operation();\n } catch (error) {\n // Retry only on retryable errors (5xx, network errors)\n if (attempt <= this.retryCount && isRetryableError(error)) {\n const delay = this.calculateBackoff(attempt);\n networkBus.retry(attempt, delay, (error as Error).message);\n await this.delay(delay);\n\n logger.debug(\n `Retrying ${contextDescription} (${attempt}/${this.retryCount}) after ${delay}ms`\n );\n return this.withRetry(\n operation,\n contextKey,\n contextDescription,\n attempt + 1\n );\n }\n\n // Don't retry client errors (404, 423)\n throw error;\n }\n }\n\n /**\n * Handle translation not found (after namespace fallback also failed)\n */\n private handleTranslationNotFound(\n request: TranslationRequest,\n fallbackValue: string,\n error: TranslationNotFoundError,\n startTime: number\n ): TranslationResult {\n logger.debug(`Network namespace miss: ${request.cleanKey}`);\n const translateBus = this.bus.translation(request);\n translateBus.notFound(\n fallbackValue,\n request.locale,\n request.namespace || 'default'\n );\n\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 404,\n startTime,\n error\n );\n }\n\n /**\n * Handle TranslationLockedError for translation lookups\n */\n private handleTranslationLocked(\n request: TranslationRequest,\n fallbackValue: string,\n error: TranslationLockedError,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n networkBus: any\n ): TranslationResult {\n const translateBus = this.bus.translation(request);\n translateBus.locked(\n fallbackValue,\n request.locale,\n request.namespace || 'default'\n );\n networkBus.error(error, 423);\n\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 423,\n startTime,\n error\n );\n }\n\n /**\n * Helper to create consistent TranslationResult objects\n */\n private createTranslationResult(\n value: string,\n source: 'network' | 'fallback' | 'storage' | 'memory',\n status: number,\n startTime: number,\n error?: Error,\n cached?: boolean,\n namespaceLoaded?: {\n locale: string;\n namespace: string;\n data: TranslationData;\n },\n styles?: Record<string, string[]>\n ): TranslationResult {\n return {\n value,\n source,\n status,\n duration: Date.now() - startTime,\n ...(error && { error }),\n ...(cached !== undefined && { cached }),\n ...(namespaceLoaded && { namespaceLoaded }),\n ...(styles && Object.keys(styles).length > 0 && { styles }),\n };\n }\n\n /**\n * Helper to create consistent NamespaceResult objects\n */\n private createNamespaceResult(\n data: TranslationData | null,\n source: 'network' | 'fallback' | 'storage' | 'memory',\n status: number,\n startTime: number,\n error?: Error\n ): NamespaceResult {\n return {\n data,\n source,\n status,\n duration: Date.now() - startTime,\n ...(error && { error }),\n };\n }\n\n getPreload(): Array<PreloadNamespaces> {\n const config = this.repository.getConfig() as NetworkRepositoryConfig;\n return config.options?.preloadNamespaces || [];\n }\n}\n", "/**\n * URL scheme allowlist for translation `<a href>` serialization.\n *\n * Mirror of packages/edge/src/content/safe-href.ts and\n * packages/wordpress/src/Runtime/Content/SafeHref.php \u2014 translations come\n * through the editor / batch sync pipeline as `ContentUnit.styles` arrays,\n * and a `hyperlink:<url>` style would be serialized verbatim into\n * `<a href=\"<url>\">`. Without this allowlist, a malicious translation\n * author could embed `javascript:fetch(...)` and execute on every site\n * visitor's browser.\n *\n * Allowed:\n * - http: / https:\n * - mailto: / tel: / sms:\n * - relative paths starting with /, ./, ../, ?, #\n *\n * Rejected (returned as `#` so the link still renders but is inert):\n * - javascript:, vbscript:, data:, file:, blob:, jar:, anything else\n * - protocol-relative `//host` (phishing vector)\n */\n\nconst SAFE_SCHEME = /^[a-z][a-z0-9+.-]*:/i;\nconst ALLOWED_SCHEMES = new Set(['http:', 'https:', 'mailto:', 'tel:', 'sms:']);\n\nexport function safeHref(href: string): string {\n if (!href) return '#';\n const trimmed = href.trim();\n if (!trimmed) return '#';\n\n // Reject protocol-relative //host (phishing vector). Translators can use\n // a fully-qualified https:// URL instead.\n if (trimmed.startsWith('//')) {\n return '#';\n }\n\n if (\n trimmed.startsWith('/') ||\n trimmed.startsWith('?') ||\n trimmed.startsWith('#') ||\n trimmed.startsWith('./') ||\n trimmed.startsWith('../')\n ) {\n return trimmed;\n }\n\n const schemeMatch = SAFE_SCHEME.exec(trimmed);\n if (schemeMatch) {\n const scheme = schemeMatch[0].toLowerCase();\n return ALLOWED_SCHEMES.has(scheme) ? trimmed : '#';\n }\n\n return trimmed;\n}\n", "/**\n * Default style mapper for bidirectional HTML element \u2194 style property mapping\n * @module content/style-mapper/DefaultStyleMapper\n */\n\nimport type { IStyleMapper, ElementMapping } from './IStyleMapper.js';\nimport { safeHref } from '../safe-href.js';\n\n/**\n * Default implementation of style mapping\n *\n * Provides bidirectional conversion between HTML elements and style properties:\n * - mapElementToStyles: `<b>` \u2192 `[\"bold\"]`\n * - mapStylesToElement: `[\"bold\"]` \u2192 `<b>`\n *\n * @example\n * ```typescript\n * const mapper = new DefaultStyleMapper();\n *\n * // Parsing: HTML \u2192 styles\n * mapper.mapElementToStyles('a', { href: '/terms' });\n * // \u2192 [\"hyperlink:/terms\"]\n *\n * // Serializing: styles \u2192 HTML\n * mapper.mapStylesToElement(['bold', 'hyperlink:/terms']);\n * // \u2192 { element: 'a', attrs: { href: '/terms' } }\n * ```\n */\nexport class DefaultStyleMapper implements IStyleMapper {\n /**\n * Element \u2192 Style mapping\n * Maps HTML element names to their style property\n */\n private readonly elementToStyles: Record<string, string> = {\n b: 'bold',\n strong: 'bold',\n i: 'italic',\n em: 'italic',\n u: 'underline',\n s: 'strikethrough',\n del: 'strikethrough',\n strike: 'strikethrough',\n code: 'code',\n mark: 'highlight',\n sub: 'subscript',\n sup: 'superscript',\n };\n\n /**\n * Style \u2192 Element mapping (reverse)\n * Uses simple, familiar elements for developer convenience\n * Also accepts element names directly (strong, em, etc.)\n */\n private readonly styleToElement: Record<string, string> = {\n // Semantic style names \u2192 simple elements\n bold: 'b',\n italic: 'i',\n underline: 'u',\n strikethrough: 's',\n code: 'code',\n highlight: 'mark',\n subscript: 'sub',\n superscript: 'sup',\n // Element names (for servers that store styles as element names)\n strong: 'b',\n b: 'b',\n em: 'i',\n i: 'i',\n u: 'u',\n s: 's',\n del: 's',\n strike: 's',\n mark: 'mark',\n sub: 'sub',\n sup: 'sup',\n };\n\n /**\n * Convert HTML element to style properties\n *\n * @param element - Tag name (e.g., \"b\", \"a\", \"strong\")\n * @param attrs - Element attributes (e.g., { href: \"/url\" })\n * @returns Array of style strings\n */\n mapElementToStyles(element: string, attrs: Record<string, string>): string[] {\n const styles: string[] = [];\n const tag = element.toLowerCase();\n\n // Basic element mapping\n const mappedStyle = this.elementToStyles[tag];\n if (mappedStyle) {\n styles.push(mappedStyle);\n }\n\n // Special: <a href=\"...\"> \u2192 hyperlink:url\n if (tag === 'a' && attrs.href) {\n styles.push(`hyperlink:${attrs.href}`);\n }\n\n return styles;\n }\n\n /**\n * Convert style properties to HTML element\n *\n * Priority order:\n * 1. Hyperlink (becomes wrapper element with href)\n * 2. First recognized style property\n * 3. Fallback to span\n *\n * @param styles - Array of style strings\n * @returns Element info for serialization\n */\n mapStylesToElement(styles: string[]): ElementMapping {\n // Check for hyperlink first (takes priority as wrapper element)\n for (const style of styles) {\n if (style.startsWith('hyperlink:')) {\n // Run href through scheme allowlist \u2014 dangerous schemes\n // (javascript:, data:, vbscript:) collapse to `#` so a malicious\n // translation can't embed code execution into a link.\n return {\n element: 'a',\n attrs: { href: safeHref(style.slice('hyperlink:'.length)) },\n };\n }\n }\n\n // Map first recognized style to element\n for (const style of styles) {\n const element = this.styleToElement[style];\n if (element) {\n return {\n element,\n attrs: {},\n };\n }\n }\n\n // Fallback: span with no special attributes\n return { element: 'span', attrs: {} };\n }\n}\n", "/**\n * Markup parser for converting HTML strings to ContentUnit\n * @module content/parser/MarkupParser\n */\n\nimport type { IParser } from './IParser.js';\nimport type { ContentUnit } from '../types.js';\nimport type { IStyleMapper } from '../style-mapper/IStyleMapper.js';\nimport { DefaultStyleMapper } from '../style-mapper/DefaultStyleMapper.js';\n\n/**\n * Configuration options for MarkupParser\n */\nexport interface MarkupParserOptions {\n /**\n * Custom style mapper for element \u2194 style conversion\n * Defaults to DefaultStyleMapper\n */\n styleMapper?: IStyleMapper;\n}\n\n/**\n * Parsed HTML element structure\n */\ninterface _ParsedElement {\n tag: string;\n attrs: Record<string, string>;\n content: string;\n startIndex: number;\n endIndex: number;\n}\n\n/**\n * Parser that converts HTML markup strings to ContentUnit format\n *\n * Transforms inline HTML elements into indexed tags with style mapping:\n * - `<b>bold</b>` \u2192 text: `<1>bold</1>`, styles: `{\"1\": [\"bold\"]}`\n * - `<a href=\"/url\">link</a>` \u2192 styles: `{\"1\": [\"hyperlink:/url\"]}`\n *\n * @example\n * ```typescript\n * const parser = new MarkupParser();\n *\n * const unit = parser.parse('Read our <b>Terms</b>.');\n * // \u2192 { text: \"Read our <1>Terms</1>.\", styles: {\"1\": [\"bold\"]} }\n *\n * const nested = parser.parse('<b>bold <i>and italic</i></b>');\n * // \u2192 { text: \"<1>bold <2>and italic</2></1>\", styles: {\"1\": [\"bold\"], \"2\": [\"italic\"]} }\n * ```\n */\nexport class MarkupParser implements IParser<string> {\n private readonly styleMapper: IStyleMapper;\n\n constructor(options: MarkupParserOptions = {}) {\n this.styleMapper = options.styleMapper ?? new DefaultStyleMapper();\n }\n\n /**\n * Parse HTML string into ContentUnit\n *\n * Handles two input formats:\n * 1. HTML tags: `<b>text</b>` \u2192 converts to indexed `<1>text</1>` with styles\n * 2. Already indexed: `<1>text</1>` \u2192 passes through as-is (from server)\n *\n * @param input - HTML string with inline elements or already indexed\n * @returns ContentUnit with indexed tags and styles\n */\n parse(input: string): ContentUnit {\n // Check if input already uses indexed tags (from server)\n // Pattern: <1>, </1>, <2>, </2>, etc.\n const hasIndexedTags = /<\\/?[0-9]+>/.test(input);\n\n if (hasIndexedTags) {\n // Input already has indexed tags - pass through without style mapping\n // The styles will come from component children in Trans, not from server\n return {\n text: input,\n styles: {}, // Empty - styles determined by children\n };\n }\n\n const styles: Record<string, string[]> = {};\n let tagIndex = 0;\n\n // Stack to track open tags and their indices\n const tagStack: Array<{ tag: string; index: number }> = [];\n\n // Result text being built\n let result = '';\n let pos = 0;\n\n while (pos < input.length) {\n // Look for opening tag\n const tagMatch = this.matchTag(input, pos);\n\n if (!tagMatch) {\n // No more tags, append rest of string\n result += input.slice(pos);\n break;\n }\n\n // Append text before tag\n result += input.slice(pos, tagMatch.startIndex);\n\n if (tagMatch.isClosing) {\n // Closing tag - find matching opening tag\n const matchingOpen = this.findMatchingOpenTag(\n tagStack,\n tagMatch.tag.toLowerCase()\n );\n if (matchingOpen !== null) {\n result += `</${matchingOpen}>`;\n // Remove from stack\n const stackIndex = tagStack.findIndex(\n (t) => t.index === matchingOpen\n );\n if (stackIndex !== -1) {\n tagStack.splice(stackIndex, 1);\n }\n } else {\n // Unmatched closing tag - keep as-is (will be validated later)\n result += input.slice(tagMatch.startIndex, tagMatch.endIndex);\n }\n } else if (tagMatch.isSelfClosing) {\n // Self-closing tag - assign index but no content\n tagIndex++;\n const styleList = this.styleMapper.mapElementToStyles(\n tagMatch.tag,\n tagMatch.attrs\n );\n if (styleList.length > 0) {\n styles[String(tagIndex)] = styleList;\n result += `<${tagIndex}/>`;\n }\n // If no styles mapped, skip the tag entirely\n } else {\n // Opening tag\n const styleList = this.styleMapper.mapElementToStyles(\n tagMatch.tag,\n tagMatch.attrs\n );\n\n if (styleList.length > 0) {\n tagIndex++;\n styles[String(tagIndex)] = styleList;\n result += `<${tagIndex}>`;\n tagStack.push({ tag: tagMatch.tag.toLowerCase(), index: tagIndex });\n } else {\n // Unknown element - don't index it, just process content\n // We need to find the closing tag and process content\n const closingIndex = this.findClosingTagIndex(\n input,\n tagMatch.endIndex,\n tagMatch.tag\n );\n if (closingIndex !== -1) {\n // Recursively parse content\n const innerContent = input.slice(tagMatch.endIndex, closingIndex);\n const innerUnit = this.parse(innerContent);\n\n // Merge inner styles (adjusting indices based on current tagIndex)\n const baseIndex = tagIndex;\n for (const [key, value] of Object.entries(innerUnit.styles)) {\n const adjustedKey = String(baseIndex + parseInt(key, 10));\n styles[adjustedKey] = value;\n }\n\n // Adjust result and indices\n result += innerUnit.text.replace(/<(\\/?)\\d+>/g, (match, slash) => {\n const num = parseInt(match.replace(/[</>]/g, ''), 10);\n return `<${slash}${baseIndex + num}>`;\n });\n\n // Move position past closing tag\n const closingMatch = this.matchTag(input, closingIndex);\n pos = closingMatch ? closingMatch.endIndex : closingIndex;\n\n // Adjust tagIndex to account for inner tags\n const maxInnerIndex = Object.keys(innerUnit.styles).length > 0\n ? Math.max(...Object.keys(innerUnit.styles).map(Number))\n : 0;\n tagIndex = baseIndex + maxInnerIndex;\n continue;\n }\n }\n }\n\n pos = tagMatch.endIndex;\n }\n\n // Handle unclosed tags (add closing tags in reverse order)\n while (tagStack.length > 0) {\n const unclosed = tagStack.pop()!;\n result += `</${unclosed.index}>`;\n }\n\n return {\n text: result,\n styles,\n };\n }\n\n /**\n * Match an HTML tag at the given position\n */\n private matchTag(\n input: string,\n startPos: number\n ): {\n tag: string;\n attrs: Record<string, string>;\n isClosing: boolean;\n isSelfClosing: boolean;\n startIndex: number;\n endIndex: number;\n } | null {\n // Find next '<' from startPos\n const tagStart = input.indexOf('<', startPos);\n if (tagStart === -1) return null;\n\n // Match tag pattern: <tagname attrs> or </tagname> or <tagname/>\n const tagPattern =\n /^<(\\/?)([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[a-zA-Z][a-zA-Z0-9-]*(?:=(?:\"[^\"]*\"|'[^']*'|[^\\s>]*))?)*)\\s*(\\/?)>/;\n const remaining = input.slice(tagStart);\n const match = remaining.match(tagPattern);\n\n if (!match) {\n // Not a valid tag, skip this '<' and try again\n if (tagStart + 1 < input.length) {\n return this.matchTag(input, tagStart + 1);\n }\n return null;\n }\n\n const [fullMatch, closingSlash, tagName, attrsString, selfClosingSlash] =\n match;\n\n return {\n tag: tagName,\n attrs: this.parseAttributes(attrsString),\n isClosing: closingSlash === '/',\n isSelfClosing: selfClosingSlash === '/',\n startIndex: tagStart,\n endIndex: tagStart + fullMatch.length,\n };\n }\n\n /**\n * Parse HTML attributes string into key-value pairs\n */\n private parseAttributes(attrsString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n if (!attrsString.trim()) return attrs;\n\n // Match attribute patterns: name=\"value\" or name='value' or name=value or name\n const attrPattern = /([a-zA-Z][a-zA-Z0-9-]*)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]*)))?/g;\n let match;\n\n while ((match = attrPattern.exec(attrsString)) !== null) {\n const [, name, doubleQuoted, singleQuoted, unquoted] = match;\n const value = doubleQuoted ?? singleQuoted ?? unquoted ?? '';\n attrs[name.toLowerCase()] = value;\n }\n\n return attrs;\n }\n\n /**\n * Find matching opening tag in the stack\n */\n private findMatchingOpenTag(\n stack: Array<{ tag: string; index: number }>,\n tagName: string\n ): number | null {\n // Search from end of stack (most recent)\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i].tag === tagName) {\n return stack[i].index;\n }\n }\n return null;\n }\n\n /**\n * Find the closing tag index for a given opening tag\n */\n private findClosingTagIndex(\n input: string,\n startPos: number,\n tagName: string\n ): number {\n const lowerTag = tagName.toLowerCase();\n let depth = 1;\n let pos = startPos;\n\n while (pos < input.length && depth > 0) {\n const tagMatch = this.matchTag(input, pos);\n if (!tagMatch) break;\n\n if (tagMatch.tag.toLowerCase() === lowerTag) {\n if (tagMatch.isClosing) {\n depth--;\n if (depth === 0) {\n return tagMatch.startIndex;\n }\n } else if (!tagMatch.isSelfClosing) {\n depth++;\n }\n }\n\n pos = tagMatch.endIndex;\n }\n\n return -1;\n }\n}\n", "/**\n * HTML serializer for converting ContentUnit to HTML strings\n * @module content/serializer/HTMLSerializer\n */\n\nimport type { ISerializer } from './ISerializer.js';\nimport type { ContentUnit } from '../types.js';\nimport type { IStyleMapper } from '../style-mapper/IStyleMapper.js';\nimport { DefaultStyleMapper } from '../style-mapper/DefaultStyleMapper.js';\n\n/**\n * Configuration options for HTMLSerializer\n */\nexport interface HTMLSerializerOptions {\n /**\n * Custom style mapper for styles \u2192 element conversion\n * Defaults to DefaultStyleMapper\n */\n styleMapper?: IStyleMapper;\n}\n\n/**\n * Serializer that converts ContentUnit format back to HTML strings\n *\n * Transforms indexed tags and style mappings into HTML:\n * - `<1>bold</1>` with styles `{\"1\": [\"bold\"]}` \u2192 `<b>bold</b>`\n * - `<1>link</1>` with styles `{\"1\": [\"hyperlink:/url\"]}` \u2192 `<a href=\"/url\">link</a>`\n *\n * @example\n * ```typescript\n * const serializer = new HTMLSerializer();\n *\n * const html = serializer.serialize({\n * text: 'Read our <1>Terms</1>.',\n * styles: { '1': ['bold'] }\n * });\n * // \u2192 \"Read our <b>Terms</b>.\"\n *\n * const link = serializer.serialize({\n * text: 'Click <1>here</1>.',\n * styles: { '1': ['hyperlink:/url'] }\n * });\n * // \u2192 \"Click <a href=\\\"/url\\\">here</a>.\"\n * ```\n */\nexport class HTMLSerializer implements ISerializer<string> {\n private readonly styleMapper: IStyleMapper;\n\n constructor(options: HTMLSerializerOptions = {}) {\n this.styleMapper = options.styleMapper ?? new DefaultStyleMapper();\n }\n\n /**\n * Serialize ContentUnit to HTML string\n *\n * @param unit - ContentUnit with indexed tags and styles\n * @returns HTML string with semantic elements\n */\n serialize(unit: ContentUnit): string {\n const { text, styles } = unit;\n\n // Pattern to match indexed tags: <1>, </1>, <1/>\n const tagPattern = /<(\\/?)?(\\d+)(\\/)?>/g;\n\n let result = '';\n let lastIndex = 0;\n let match;\n\n while ((match = tagPattern.exec(text)) !== null) {\n // Append text before the tag\n result += text.slice(lastIndex, match.index);\n\n const [fullMatch, closingSlash, indexStr, selfClosingSlash] = match;\n const tagIndex = indexStr;\n const styleList = styles[tagIndex] || [];\n\n if (closingSlash) {\n // Closing tag: </1>\n const mapping = this.styleMapper.mapStylesToElement(styleList);\n result += `</${mapping.element}>`;\n } else if (selfClosingSlash) {\n // Self-closing tag: <1/>\n const mapping = this.styleMapper.mapStylesToElement(styleList);\n const attrs = this.formatAttributes(mapping.attrs);\n result += `<${mapping.element}${attrs} />`;\n } else {\n // Opening tag: <1>\n const mapping = this.styleMapper.mapStylesToElement(styleList);\n const attrs = this.formatAttributes(mapping.attrs);\n result += `<${mapping.element}${attrs}>`;\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n // Append remaining text\n result += text.slice(lastIndex);\n\n return result;\n }\n\n /**\n * Format attributes object into HTML attribute string\n */\n private formatAttributes(attrs: Record<string, string>): string {\n const entries = Object.entries(attrs);\n if (entries.length === 0) return '';\n\n return (\n ' ' +\n entries\n .map(([key, value]) => `${key}=\"${this.escapeAttributeValue(value)}\"`)\n .join(' ')\n );\n }\n\n /**\n * Escape special characters in attribute values\n */\n private escapeAttributeValue(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n }\n}\n", "/**\n * CacheManager - TanStack Query-inspired cache management\n *\n * Provides unified cache invalidation and optimistic update patterns.\n */\n\nimport type { EventEmitter } from '../base/event-emitter.js';\nimport type { HandlerChain } from '../handlers/handler-chain.js';\n\n/**\n * Options for cache invalidation (like TanStack's invalidateQueries)\n */\nexport interface InvalidateOptions {\n /** Invalidate by namespace */\n namespace?: string;\n /** Invalidate by locale */\n locale?: string;\n /** Invalidate specific key */\n key?: string;\n /** Custom predicate filter */\n predicate?: (key: string) => boolean;\n /** Whether to refetch after invalidation (default: true) */\n refetch?: boolean;\n}\n\n/**\n * Cached translation entry\n */\nexport interface CacheEntry {\n value: string;\n styles?: Record<string, string[]>;\n}\n\n/**\n * Cache event payloads\n */\nexport interface CacheEventPayloads {\n 'cache:invalidate': {\n filter: InvalidateOptions;\n keysCleared: number;\n refetch: boolean;\n };\n 'cache:set': {\n key: string;\n value: string;\n styles?: Record<string, string[]>;\n optimistic: boolean;\n };\n 'cache:rollback': {\n key: string;\n reason: string;\n };\n}\n\n/**\n * CacheManager - Unified cache API inspired by TanStack Query\n *\n * @example\n * ```typescript\n * // Invalidate by namespace\n * await i18n.cache.invalidate({ namespace: 'app' });\n *\n * // Optimistic update\n * const previous = i18n.cache.get('en:app:welcome');\n * i18n.cache.set('en:app:welcome', 'New value');\n * // ... if error, rollback:\n * i18n.cache.set('en:app:welcome', previous.value);\n * ```\n */\nexport class CacheManager {\n private handlerChain: HandlerChain;\n private bus: EventEmitter;\n private currentLocale: () => string;\n private loadNamespaces: (locale: string, namespaces: string[]) => Promise<void>;\n\n constructor(\n handlerChain: HandlerChain,\n bus: EventEmitter,\n getCurrentLocale: () => string,\n loadNamespaces: (locale: string, namespaces: string[]) => Promise<void>\n ) {\n this.handlerChain = handlerChain;\n this.bus = bus;\n this.currentLocale = getCurrentLocale;\n this.loadNamespaces = loadNamespaces;\n }\n\n /**\n * Get a cached translation entry\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @returns Cache entry with value and styles, or null if not found\n */\n get(key: string): CacheEntry | null {\n const entries = this.handlerChain.getEntries();\n\n // Search through all handler entries\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n if (key in handlerEntries) {\n const rawValue = handlerEntries[key];\n\n // Parse ContentUnit JSON (stored as { text, styles })\n try {\n if (typeof rawValue === 'string') {\n const parsed = JSON.parse(rawValue);\n if (typeof parsed === 'object' && 'text' in parsed) {\n return {\n value: String(parsed.text),\n styles: parsed.styles || undefined,\n };\n }\n // Legacy plain string\n return { value: rawValue, styles: undefined };\n }\n // Already an object\n return {\n value: JSON.stringify(rawValue),\n styles: undefined,\n };\n } catch {\n // If parse fails, treat as plain string\n return {\n value: typeof rawValue === 'string' ? rawValue : JSON.stringify(rawValue),\n styles: undefined,\n };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Set a cache entry (for optimistic updates)\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @param value - Translation value\n * @param styles - Optional styles for indexed tags\n */\n set(key: string, value: string, styles?: Record<string, string[]>): void {\n // Parse the key to get locale, namespace, and translation key\n const [locale, namespace, ...keyParts] = key.split(':');\n const translationKey = keyParts.join(':');\n\n if (!locale || !namespace || !translationKey) {\n throw new Error(\n `Invalid cache key format: \"${key}\". Expected format: \"locale:namespace:key\"`\n );\n }\n\n // Use the handler chain's setCache method for optimistic updates\n this.handlerChain.setCache(key, value, styles);\n\n // Emit cache:set event\n this.bus.emit('cache:set', {\n payload: {\n key,\n value,\n styles,\n optimistic: true,\n },\n });\n }\n\n /**\n * Check if a key exists in cache\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @returns true if key is cached\n */\n has(key: string): boolean {\n return this.get(key) !== null;\n }\n\n /**\n * Invalidate cache entries and optionally refetch\n *\n * Like TanStack Query's invalidateQueries, this clears matching cache entries\n * and triggers background refetch by default.\n *\n * @param options - Filter options for invalidation\n *\n * @example\n * ```typescript\n * // Invalidate all\n * await cache.invalidate();\n *\n * // Invalidate by namespace\n * await cache.invalidate({ namespace: 'app' });\n *\n * // Invalidate by locale\n * await cache.invalidate({ locale: 'es' });\n *\n * // Invalidate specific key\n * await cache.invalidate({ key: 'en:app:welcome' });\n *\n * // Invalidate with predicate\n * await cache.invalidate({ predicate: (k) => k.includes('common:') });\n *\n * // Invalidate without refetch\n * await cache.invalidate({ namespace: 'app', refetch: false });\n * ```\n */\n async invalidate(options: InvalidateOptions = {}): Promise<void> {\n const { namespace, locale, key, predicate, refetch = true } = options;\n const currentLocale = this.currentLocale();\n\n let keysCleared = 0;\n\n // Determine what to clear\n if (key) {\n // Clear specific key\n const [keyLocale, keyNamespace] = key.split(':');\n if (keyLocale && keyNamespace) {\n this.handlerChain.clearNamespace(keyLocale, keyNamespace);\n keysCleared = 1;\n }\n } else if (namespace && locale) {\n // Clear specific locale + namespace\n this.handlerChain.clearNamespace(locale, namespace);\n keysCleared = this.countClearedKeys(locale, namespace);\n } else if (namespace) {\n // Clear namespace for current locale\n this.handlerChain.clearNamespace(currentLocale, namespace);\n keysCleared = this.countClearedKeys(currentLocale, namespace);\n } else if (locale) {\n // Clear all namespaces for a specific locale\n const entries = this.handlerChain.getEntries();\n const namespacesToClear = new Set<string>();\n\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n for (const entryKey of Object.keys(handlerEntries)) {\n if (entryKey.startsWith(`${locale}:`) || entryKey.startsWith(`@${locale}:`)) {\n const parts = entryKey.replace('@', '').split(':');\n if (parts[1]) {\n namespacesToClear.add(parts[1]);\n }\n }\n }\n }\n }\n\n for (const ns of namespacesToClear) {\n this.handlerChain.clearNamespace(locale, ns);\n keysCleared++;\n }\n } else if (predicate) {\n // Clear with custom predicate\n const entries = this.handlerChain.getEntries();\n const toClear = new Map<string, Set<string>>(); // locale -> namespaces\n\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n for (const entryKey of Object.keys(handlerEntries)) {\n if (predicate(entryKey)) {\n const parts = entryKey.replace('@', '').split(':');\n const entryLocale = parts[0];\n const entryNs = parts[1];\n if (entryLocale && entryNs) {\n if (!toClear.has(entryLocale)) {\n toClear.set(entryLocale, new Set());\n }\n toClear.get(entryLocale)!.add(entryNs);\n keysCleared++;\n }\n }\n }\n }\n }\n\n for (const [loc, namespaces] of toClear) {\n for (const ns of namespaces) {\n this.handlerChain.clearNamespace(loc, ns);\n }\n }\n } else {\n // Clear all\n this.handlerChain.clearCache();\n keysCleared = -1; // Indicates all cleared\n }\n\n // Emit invalidate event\n this.bus.emit('cache:invalidate', {\n payload: {\n filter: options,\n keysCleared,\n refetch,\n },\n });\n\n // Refetch if requested\n if (refetch) {\n await this.refetchAfterInvalidate(options);\n }\n }\n\n /**\n * Count keys that would be cleared (for event reporting)\n */\n private countClearedKeys(locale: string, namespace: string): number {\n const entries = this.handlerChain.getEntries();\n let count = 0;\n const prefix = `${locale}:${namespace}:`;\n const namespaceKey = `@${locale}:${namespace}`;\n\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n for (const key of Object.keys(handlerEntries)) {\n if (key.startsWith(prefix) || key === namespaceKey) {\n count++;\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Refetch data after invalidation\n */\n private async refetchAfterInvalidate(options: InvalidateOptions): Promise<void> {\n const { namespace, locale, key } = options;\n const currentLocale = this.currentLocale();\n\n if (key) {\n // Refetch specific namespace from key\n const [keyLocale, keyNamespace] = key.split(':');\n if (keyLocale && keyNamespace) {\n await this.loadNamespaces(keyLocale, [keyNamespace]);\n }\n } else if (namespace) {\n // Refetch namespace for specific or current locale\n await this.loadNamespaces(locale || currentLocale, [namespace]);\n } else if (locale) {\n // For locale-wide invalidation, we can't easily know which namespaces to reload\n // The app will lazy-load them as needed\n }\n // For full cache clear, lazy loading will handle refetch\n }\n}\n", "/**\n * Enhanced LionRapid Core with event-based language change and smart caching\n * filepath: /home/janrau/tm-integration/packages/core/src/lionRapid.ts\n */\nimport { EventEmitter } from './base/event-emitter.js';\nimport { HandlerChain } from './handlers/handler-chain.js';\nimport type {\n FormatterFunction,\n IEmbeddedPlugin,\n IPlugin,\n ValueProcessor,\n} from './interfaces/plugin.interface.js';\nimport type { TranslationKeys } from './types/generated.types.js';\nimport type { TranslationRequest } from './types/translation.types.js';\nimport { logger, resolveNestedKey } from './utils/index.js';\nimport { prepareTranslationRequest } from './utils/translation-flow.js';\nimport { createNamespaceCacheKey } from './utils/translation-value-utils.js';\n\n// Content module imports for ContentUnit processing\nimport type { ContentUnit } from './content/types.js';\nimport { MarkupParser } from './content/parser/MarkupParser.js';\nimport { HTMLSerializer } from './content/serializer/HTMLSerializer.js';\n\n// Cache module\nimport { CacheManager } from './cache/CacheManager.js';\n\n/**\n * Regex to detect indexed tags in a string (from server ContentUnit)\n * Matches patterns like <1>, </1>, <2>, </2>, etc.\n */\nconst INDEXED_TAG_REGEX = /<\\/?[0-9]+>/;\n\n/**\n * Regex to detect HTML tags in a string\n * Matches patterns like <b>, <a href=\"...\">, <em>, etc.\n */\nconst HTML_TAG_REGEX = /<[a-z][a-z0-9]*(?:\\s+[^>]*)?\\/?>/i;\n\nexport class LionRapidCore {\n private handlerChain: HandlerChain;\n private currentLocale: string;\n private fallbackLocale: string;\n private defaultNamespace?: string;\n private pendingTranslations = new Map<string, Promise<void>>();\n bus: EventEmitter;\n\n private plugins = new Map<string, IPlugin>();\n\n // \uD83D\uDD25 EMBEDDED: Core integration maps\n private formatters = new Map<string, FormatterFunction>();\n private processors = new Map<string, ValueProcessor>();\n\n // \uD83D\uDCE1 EVENT-DRIVEN: Just track for cleanup\n private eventPlugins = new Set<IPlugin>();\n\n // \uD83D\uDCE6 CONTENT: Parser and serializer for ContentUnit processing\n private readonly markupParser = new MarkupParser();\n private readonly htmlSerializer = new HTMLSerializer();\n\n // \uD83D\uDD04 CACHE: TanStack Query-inspired cache management\n public readonly cache: CacheManager;\n\n constructor(\n eventEmitter: EventEmitter,\n handlerChain: HandlerChain,\n defaultLocale = 'en',\n fallbackLocale = 'en',\n defaultNamespace?: string\n ) {\n this.bus = eventEmitter;\n this.handlerChain = handlerChain;\n this.currentLocale = defaultLocale;\n this.fallbackLocale = fallbackLocale;\n this.defaultNamespace = defaultNamespace;\n\n // Initialize cache manager with dependencies\n this.cache = new CacheManager(\n this.handlerChain,\n this.bus,\n () => this.currentLocale,\n (locale, namespaces) => this.loadNamespaces(locale, namespaces)\n );\n }\n\n /**\n * \u2705 Register plugin (called by builder)\n */\n registerPlugin(plugin: IPlugin): void {\n this.plugins.set(plugin.name, plugin);\n\n // \uD83D\uDD25 EMBEDDED PLUGINS: Extract functionality for core integration\n if (this.isEmbeddedPlugin(plugin)) {\n this.integrateEmbeddedPlugin(plugin as IEmbeddedPlugin);\n }\n\n // \uD83D\uDCE1 EVENT-DRIVEN PLUGINS: Just track for cleanup\n if (this.isEventPlugin(plugin)) {\n this.eventPlugins.add(plugin);\n }\n }\n\n /**\n * \uD83D\uDD25 EMBEDDED: Integrate plugin functionality into core\n */\n private integrateEmbeddedPlugin(plugin: IEmbeddedPlugin): void {\n // Extract formatters\n if (plugin.getFormatters) {\n const pluginFormatters = plugin.getFormatters();\n Object.entries(pluginFormatters).forEach(([name, formatter]) => {\n this.formatters.set(name, formatter);\n logger.debug(`Embedded formatter: ${name} from ${plugin.name}`);\n });\n }\n\n // Extract processors\n if (plugin.getProcessors) {\n const pluginProcessors = plugin.getProcessors();\n Object.entries(pluginProcessors).forEach(([name, processor]) => {\n this.processors.set(name, processor);\n logger.debug(`Embedded processor: ${name} from ${plugin.name}`);\n });\n }\n }\n\n /**\n * \uD83D\uDCE6 TRANSLATION API - Returns PLAIN TEXT\n *\n * Strips indexed tags and returns safe plain text output.\n * For HTML output with styles, use tHtml() instead.\n *\n * @param key - Translation key\n * @param params - Optional interpolation parameters\n * @param defaultValue - Optional default value\n * @returns Plain text string (safe, no XSS risk)\n *\n * @example\n * ```typescript\n * t('welcome') // \u2192 \"Hello World\"\n * t('greeting', { name: 'John' }) // \u2192 \"Hello John\"\n * t('missing', 'Default text') // \u2192 \"Default text\" (if key missing)\n * ```\n */\n t<K extends string>(\n key: K,\n ...args: K extends keyof TranslationKeys\n ? TranslationKeys[K] extends Record<string, never>\n ? [defaultValue?: string]\n : [params: TranslationKeys[K], defaultValue?: string]\n : [params?: Record<string, unknown>, defaultValue?: string]\n ): string {\n const [firstArg, secondArg] = args;\n\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n firstArg as string | Record<string, unknown> | undefined,\n secondArg as Record<string, unknown> | string | undefined,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n // Emit request event\n logger.debug(`Translation requested: ${request.cleanKey}`);\n const translateBus = this.bus.translation(request);\n translateBus.request();\n\n // Try memory cache (sync)\n const syncResult = this.handlerChain.handleSync(request);\n if (syncResult && syncResult.status === 200) {\n const result = this.processValue(syncResult.value, request);\n logger.debug(\n `Translation found: ${request.cleanKey} from ${syncResult.source} (${syncResult.duration}ms)`\n );\n translateBus.success(result);\n return result;\n }\n\n // Cache miss - trigger background load\n this.triggerBackgroundLoad(request);\n\n // Return fallback immediately\n const fallbackValue = request.parsedDefaultValue || request.cleanKey;\n const fallbackResult = this.processValue(fallbackValue, request);\n logger.debug(`Translation fallback: ${request.cleanKey}`);\n translateBus.fallback(fallbackResult);\n return fallbackResult;\n }\n\n /**\n * \uD83D\uDCE6 HTML TRANSLATION API\n * Returns translation as HTML string with styles applied.\n *\n * Use for innerHTML, dangerouslySetInnerHTML, or server-side rendering.\n * For React components, prefer using <Trans> instead.\n *\n * @param key - Translation key\n * @param params - Optional interpolation parameters\n * @param defaultValue - Optional default value (can contain HTML)\n * @returns HTML string with styles applied\n *\n * @example\n * ```typescript\n * // Vanilla JS\n * element.innerHTML = i18n.tHtml('welcome');\n * // \u2192 \"Hello <b>World</b>\"\n *\n * // React (use sparingly)\n * <span dangerouslySetInnerHTML={{ __html: tHtml('welcome') }} />\n * ```\n */\n tHtml<K extends string>(\n key: K,\n ...args: K extends keyof TranslationKeys\n ? TranslationKeys[K] extends Record<string, never>\n ? [defaultValue?: string]\n : [params: TranslationKeys[K], defaultValue?: string]\n : [params?: Record<string, unknown>, defaultValue?: string]\n ): string {\n // Pass arguments directly to prepareTranslationRequest\n // which handles the flexible parameter parsing\n const [firstArg, secondArg] = args;\n\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n firstArg as string | Record<string, unknown> | undefined,\n secondArg as Record<string, unknown> | string | undefined,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n // Emit request event\n logger.debug(`HTML translation requested: ${request.cleanKey}`);\n const translateBus = this.bus.translation(request);\n translateBus.request();\n\n // Try memory cache (sync) - result now includes styles\n const syncResult = this.handlerChain.handleSync(request);\n if (syncResult && syncResult.status === 200) {\n const result = this.processValueAsHtml(syncResult.value, request, syncResult.styles);\n logger.debug(\n `HTML translation found: ${request.cleanKey} from ${syncResult.source}`\n );\n translateBus.success(result);\n return result;\n }\n\n // Cache miss - trigger background load\n this.triggerBackgroundLoad(request);\n\n // Return fallback immediately (processed as HTML, no styles)\n const fallbackValue = request.parsedDefaultValue || request.cleanKey;\n const fallbackResult = this.processValueAsHtml(fallbackValue, request);\n logger.debug(`HTML translation fallback: ${request.cleanKey}`);\n translateBus.fallback(fallbackResult);\n return fallbackResult;\n }\n\n /**\n * \uD83D\uDCE6 Process value as HTML (for tHtml)\n *\n * Converts indexed tags to HTML using styles from result or namespace cache.\n *\n * @internal\n */\n private processValueAsHtml(\n value: string,\n request: TranslationRequest,\n resultStyles?: Record<string, string[]>\n ): string {\n // Process ICU first\n const processedText = this.processTranslationValue(value, request);\n\n // Check for indexed tags (from server ContentUnit)\n if (this.containsIndexedTags(processedText)) {\n // Use styles from result, or fall back to namespace lookup\n const styles = resultStyles || this.getStylesFromNamespace(request);\n const unit: ContentUnit = {\n text: processedText,\n styles,\n };\n return this.htmlSerializer.serialize(unit);\n }\n\n // Check for HTML in defaultValue\n if (this.containsHtml(processedText)) {\n const unit = this.markupParser.parse(processedText);\n return this.htmlSerializer.serialize(unit);\n }\n\n // Plain text - return as-is\n return processedText;\n }\n\n /**\n * \uD83D\uDCE6 Process a value through ContentUnit or ICU pipeline\n *\n * Processing priority:\n * 1. Indexed tags (<1>...</1>) from server ContentUnit \u2192 convert to HTML at render time\n * 2. HTML tags (from defaultValue or legacy) \u2192 MarkupParser \u2192 ContentUnit \u2192 HTML\n * 3. Plain text \u2192 standard ICU processing\n *\n * @internal\n */\n private processValue(value: string, request: TranslationRequest): string {\n // Priority 1: Check for indexed tags (from server ContentUnit)\n // These need to be converted to HTML using the stored styles\n if (this.containsIndexedTags(value)) {\n return this.processIndexedValue(value, request);\n }\n\n // Priority 2: Auto-detect HTML and process through ContentUnit if found\n if (this.containsHtml(value)) {\n return this.processHtmlValue(value, request);\n }\n\n // Priority 3: Standard ICU processing for plain text\n return this.processTranslationValue(value, request);\n }\n\n /**\n * \uD83D\uDCE6 Check if a string contains indexed tags\n *\n * Used for auto-detection of server ContentUnit format.\n *\n * @param value - String to check\n * @returns true if indexed tags are detected\n */\n private containsIndexedTags(value: string): boolean {\n return INDEXED_TAG_REGEX.test(value);\n }\n\n /**\n * \uD83D\uDCE6 Process indexed value - returns PLAIN TEXT\n *\n * Strips indexed tags (<1>text</1>) \u2192 \"text\"\n * For HTML output, use tHtml() instead.\n *\n * @internal\n */\n private processIndexedValue(\n value: string,\n request: TranslationRequest\n ): string {\n // 1. Process ICU first (with indexed tags intact)\n const processedText = this.processTranslationValue(value, request);\n\n // 2. Strip indexed tags - t() returns plain text\n return processedText.replace(/<\\/?[0-9]+>/g, '');\n }\n\n /**\n * \uD83D\uDCE6 Get styles for a translation key from namespace cache (fallback)\n *\n * Used when styles are not available in the result (e.g., for fallback values).\n * Looks up the full ContentUnit from the namespace cache to get styles.\n *\n * @internal\n */\n private getStylesFromNamespace(\n request: TranslationRequest\n ): Record<string, string[]> {\n if (!request.namespace) {\n return {};\n }\n\n try {\n // Get namespace cache key: @locale:namespace\n const namespaceCacheKey = createNamespaceCacheKey(\n request.locale,\n request.namespace\n );\n\n // Get namespace data from handler chain\n const namespaceData = this.handlerChain.getNamespaceData(namespaceCacheKey);\n if (!namespaceData) {\n return {};\n }\n\n // Resolve the content unit for this key (server always returns ContentUnit format)\n const resolved = resolveNestedKey(namespaceData, request.cleanKey);\n\n if (resolved && typeof resolved === 'object' && 'styles' in resolved) {\n const contentUnit = resolved as ContentUnit;\n return contentUnit.styles;\n }\n\n return {};\n } catch (error) {\n logger.debug(`Error getting styles for key ${request.cleanKey}:`, error);\n return {};\n }\n }\n\n /**\n * \uD83D\uDCE6 Process HTML value - returns PLAIN TEXT\n *\n * Parses HTML to ContentUnit, processes ICU, strips indexed tags.\n * For HTML output, use tHtml() instead.\n *\n * @internal\n */\n private processHtmlValue(value: string, request: TranslationRequest): string {\n try {\n // 1. Parse HTML to ContentUnit (converts HTML tags to indexed format)\n const unit = this.markupParser.parse(value);\n\n // 2. Process ICU expressions in the text\n const processedText = this.processTranslationValue(unit.text, request);\n\n // 3. Strip indexed tags - t() returns plain text\n return processedText.replace(/<\\/?[0-9]+>/g, '');\n } catch (error) {\n logger.warn(`ContentUnit processing failed for \"${value}\":`, error);\n // Fallback to standard processing\n return this.processTranslationValue(value, request);\n }\n }\n\n /**\n * \u2705 Process translation value through embedded plugins\n *\n * Public overload for Trans component usage (simple API)\n */\n public processTranslationValue(\n value: string,\n params?: Record<string, unknown>,\n locale?: string,\n key?: string\n ): string;\n\n /**\n * Internal overload (with full TranslationRequest for t() method)\n */\n public processTranslationValue(\n value: string,\n request: TranslationRequest\n ): string;\n\n /**\n * Implementation (handles both overloads)\n */\n public processTranslationValue(\n value: string,\n paramsOrRequest?: Record<string, unknown> | TranslationRequest,\n locale?: string,\n key?: string\n ): string {\n // Determine which overload was called\n let params: Record<string, unknown> | undefined;\n let resolvedLocale: string;\n let resolvedKey: string | undefined;\n\n if (paramsOrRequest && 'cleanKey' in paramsOrRequest) {\n // Internal overload: TranslationRequest\n const request = paramsOrRequest as TranslationRequest;\n params = request.parsedParams;\n resolvedLocale = request.locale;\n resolvedKey = request.cleanKey;\n } else {\n // Public overload: simple parameters\n params = paramsOrRequest as Record<string, unknown> | undefined;\n resolvedLocale = locale || this.currentLocale;\n resolvedKey = key;\n }\n\n let processedValue = value;\n\n try {\n // \u2705 Step 1: Handle structured translation data (plurals, context variations)\n processedValue = this.applyStructuralFormatters(\n processedValue,\n params,\n resolvedKey\n );\n\n // \u2705 Step 2: Apply interpolation through embedded formatter plugin\n // ICU messages need processing even without params (for 'other' defaults)\n if (this.formatters.has('interpolate')) {\n const interpolateFormatter = this.formatters.get('interpolate')!;\n processedValue = interpolateFormatter(\n processedValue,\n params,\n resolvedLocale,\n resolvedKey\n );\n }\n\n // \u2705 Step 3: Apply value processors (escaping, sanitization, etc.)\n if (this.processors.size > 0) {\n for (const [name, processor] of this.processors.entries()) {\n try {\n processedValue = processor(processedValue, params, resolvedKey);\n } catch (error) {\n logger.warn(`Processor ${name} failed:`, error);\n }\n }\n }\n\n return processedValue;\n } catch (error) {\n logger.warn(`Translation processing failed for \"${value}\":`, error);\n return value;\n }\n }\n\n /**\n * \uD83D\uDCE6 CONTENT UNIT API\n * Returns translation as ContentUnit for JSX rendering (Trans component)\n *\n * This is the preferred method for components that need to render\n * styled content with JSX interpolation.\n *\n * @param key - Translation key\n * @param params - Optional interpolation parameters\n * @param defaultValue - Optional default value (can contain HTML)\n * @returns ContentUnit with indexed tags and styles\n *\n * @example\n * ```typescript\n * const unit = i18n.getContentUnit('terms', {}, 'Read our <b>Terms</b>.');\n * // \u2192 { text: \"Read our <1>Terms</1>.\", styles: {\"1\": [\"bold\"]} }\n * ```\n */\n getContentUnit(\n key: string,\n params?: Record<string, unknown>,\n defaultValue?: string\n ): ContentUnit {\n // Get translation value (ICU processing done separately per segment)\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n params,\n defaultValue,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n // Try memory cache\n const syncResult = this.handlerChain.handleSync(request);\n const rawValue =\n syncResult && syncResult.status === 200\n ? syncResult.value\n : request.parsedDefaultValue || request.cleanKey;\n\n // If no translation found, trigger background load\n if (!syncResult || syncResult.status !== 200) {\n this.triggerBackgroundLoad(request);\n }\n\n // Parse HTML to ContentUnit\n return this.markupParser.parse(rawValue);\n }\n\n /**\n * \uD83D\uDCE6 Process ContentUnit text through ICU formatters\n *\n * Used by JSX serializers to process individual text segments.\n *\n * @param text - Text segment (may contain ICU expressions like {name})\n * @param params - Interpolation parameters\n * @returns Processed text with ICU expressions resolved\n */\n processContentText(text: string, params?: Record<string, unknown>): string {\n return this.processTranslationValue(text, params, this.currentLocale);\n }\n\n /**\n * \uD83D\uDCE6 Check if a string contains HTML tags\n *\n * Used for auto-detection of HTML in default values.\n *\n * @param value - String to check\n * @returns true if HTML tags are detected\n */\n containsHtml(value: string): boolean {\n return HTML_TAG_REGEX.test(value);\n }\n\n /**\n * \u2705 Handle structured formatters (plural, context) - embedded in core\n */\n private applyStructuralFormatters(\n value: string,\n params?: Record<string, unknown>,\n translationKey?: string\n ): string {\n const translationData: string = value;\n\n // Type guard for params having a count property\n const hasCount = (\n p: Record<string, unknown> | undefined\n ): p is { count: number } => typeof p?.count === 'number';\n\n // Type guard for params having a context property\n const hasContext = (\n p: Record<string, unknown> | undefined\n ): p is { context: string } => typeof p?.context === 'string';\n\n // Apply plural formatter if available and applicable\n if (this.formatters.has('plural') && hasCount(params)) {\n const pluralFormatter = this.formatters.get('plural')!;\n try {\n const pluralResult = pluralFormatter(\n translationData,\n params,\n this.currentLocale,\n translationKey\n );\n if (pluralResult !== String(translationData)) {\n return pluralResult;\n }\n } catch (error) {\n logger.warn('Plural formatting failed:', error);\n }\n }\n\n // Apply context formatter if available and applicable\n if (this.formatters.has('context') && hasContext(params)) {\n const contextFormatter = this.formatters.get('context')!;\n try {\n const contextResult = contextFormatter(\n translationData,\n params,\n this.currentLocale,\n translationKey\n );\n if (contextResult !== String(translationData)) {\n return contextResult;\n }\n } catch (error) {\n logger.warn('Context formatting failed:', error);\n }\n }\n\n return String(translationData);\n }\n\n /**\n * Trigger background load via handler chain\n */\n private triggerBackgroundLoad(request: TranslationRequest): void {\n logger.debug(`Background load: ${request.cleanKey}`);\n const cacheKey = request.individualCacheKey;\n\n if (!this.pendingTranslations.has(cacheKey)) {\n const promise = this.handlerChain\n .handleAsync(request)\n .then(result => {\n if (result && result.value) {\n logger.debug(`Cached: ${request.cleanKey} = \"${result.value}\"`);\n } else {\n logger.debug(`Not found: ${request.cleanKey}`);\n }\n })\n .catch(error => {\n logger.warn(`Background load failed: ${request.cleanKey}`, error);\n });\n\n this.pendingTranslations.set(cacheKey, promise);\n promise.finally(() => this.pendingTranslations.delete(cacheKey));\n }\n }\n\n /**\n * Get the current locale\n */\n getCurrentLocale(): string {\n return this.currentLocale;\n }\n\n /**\n * Set default namespace (useful for scoped translations)\n */\n setDefaultNamespace(namespace?: string): void {\n this.defaultNamespace = namespace;\n }\n\n /**\n * Get current default namespace\n */\n getDefaultNamespace(): string | undefined {\n return this.defaultNamespace;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries(): Record<string, any> {\n return this.handlerChain.getEntries();\n }\n\n isCached(key: string): boolean {\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n undefined,\n undefined,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n return this.handlerChain.isCached(request);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getHandlerChainInfo(): any {\n return this.handlerChain.getChainInfo();\n }\n\n /**\n * \u2705 Smart language change with selective cache clearing\n */\n async changeLanguage(\n newLocale: string,\n options?: {\n clear?: boolean;\n preloadNamespaces?: string[];\n }\n ): Promise<void> {\n const oldLocale = this.currentLocale;\n\n if (oldLocale === newLocale) {\n logger.debug(`Language already set to ${newLocale}`);\n return;\n }\n\n const clear = options?.clear || false;\n const languageBus = this.bus.language(oldLocale, newLocale);\n\n try {\n logger.info(`Language change: ${oldLocale} \u2192 ${newLocale}`);\n logger.debug('Language change options', {\n clear,\n preloadNamespaces: options?.preloadNamespaces,\n });\n\n languageBus.start();\n\n this.currentLocale = newLocale;\n\n if (clear) {\n await this.clearCache();\n this.clearOldLocalePendingTranslations(oldLocale);\n }\n\n if (options?.preloadNamespaces?.length) {\n await this.loadNamespaces(newLocale, options.preloadNamespaces);\n }\n\n languageBus.complete();\n\n logger.info(`Language changed: ${newLocale}`);\n } catch (error) {\n logger.error('Language change failed:', error);\n languageBus.error(error as Error);\n throw error;\n }\n }\n\n private async clearCache(): Promise<void> {\n this.handlerChain.clearCache();\n logger.debug(`Cache cleared for locale: ${this.currentLocale}`);\n }\n\n private clearOldLocalePendingTranslations(oldLocale: string): void {\n let clearedCount = 0;\n\n for (const key of this.pendingTranslations.keys()) {\n if (key.includes(`${oldLocale}:`)) {\n this.pendingTranslations.delete(key);\n clearedCount++;\n }\n }\n\n if (clearedCount > 0) {\n logger.debug(\n `Cleared ${clearedCount} pending translations for ${oldLocale}`\n );\n }\n }\n\n private async loadNamespaces(\n locale: string,\n namespaces: string[]\n ): Promise<void> {\n logger.debug(`Preloading ${namespaces.length} namespaces for ${locale}`);\n\n const preloadPromises = namespaces.map(async namespace => {\n try {\n await this.handlerChain.loadNamespace?.(locale, namespace);\n logger.debug(`Preloaded: ${locale}:${namespace}`);\n } catch (error) {\n logger.warn(`Failed to preload ${locale}:${namespace}:`, error);\n }\n });\n\n await Promise.allSettled(preloadPromises);\n }\n\n /**\n * Reload a namespace by clearing cache and fetching fresh data from server\n * Useful after syncing new translations to ensure fresh data\n *\n * @param namespace - The namespace to reload\n * @param locale - Optional locale (defaults to current locale)\n * @deprecated Use cache.invalidate({ namespace, refetch: true }) instead\n */\n async reloadNamespace(namespace: string, locale?: string): Promise<void> {\n const targetLocale = locale || this.currentLocale;\n logger.debug(`Reloading namespace: ${targetLocale}:${namespace}`);\n\n // Delegate to cache manager\n await this.cache.invalidate({\n namespace,\n locale: targetLocale,\n refetch: true,\n });\n\n logger.info(`Namespace reloaded: ${targetLocale}:${namespace}`);\n }\n\n // Helper methods\n private isEmbeddedPlugin(plugin: IPlugin): boolean {\n return plugin.capabilities.some(cap =>\n ['formatters', 'processors', 'pluralization', 'context'].includes(cap)\n );\n }\n\n private isEventPlugin(plugin: IPlugin): boolean {\n return plugin.capabilities.some(cap =>\n [\n 'analytics',\n 'logging',\n 'react',\n 'validation',\n 'dev-tools',\n 'monitoring',\n ].includes(cap)\n );\n }\n}\n", "/**\n * Queue for batching and syncing missing translations to the backend\n * Uses debouncing (500ms default) and batching (50 items default)\n */\n\nimport type { EventEmitter } from '../base/event-emitter.js';\nimport type { IAsyncRepository } from '../interfaces/repository.interface.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface MissingTranslationItem {\n key: string;\n fallbackValue: string;\n styles?: Record<string, string[]>;\n locale: string;\n namespace: string;\n}\n\nexport interface MissingTranslationQueueConfig {\n enabled: boolean;\n debounceMs: number;\n batchSize: number;\n}\n\nconst COOLDOWN_MS = 60_000; // 60s cooldown before re-syncing same key\n\nexport class MissingTranslationQueue {\n private queue: Map<string, MissingTranslationItem> = new Map();\n private debounceTimer: NodeJS.Timeout | null = null;\n private repository: IAsyncRepository;\n private config: MissingTranslationQueueConfig;\n private eventEmitter: EventEmitter | null;\n private recentlySynced: Map<string, number> = new Map();\n\n constructor(\n repository: IAsyncRepository,\n config: MissingTranslationQueueConfig,\n eventEmitter?: EventEmitter\n ) {\n this.repository = repository;\n this.config = config;\n this.eventEmitter = eventEmitter ?? null;\n\n if (!config.enabled) {\n logger.debug('MissingTranslationQueue is disabled');\n } else {\n logger.debug(\n `MissingTranslationQueue: debounce=${config.debounceMs}ms, batchSize=${config.batchSize}`\n );\n }\n }\n\n /**\n * Add a missing translation to the queue\n * Triggers debounce timer or immediate flush if batch size reached\n */\n add(item: MissingTranslationItem): void {\n if (!this.config.enabled) return;\n\n // Use individual cache key format: locale:namespace:key\n const cacheKey = `${item.locale}:${item.namespace}:${item.key}`;\n\n // Skip keys synced within cooldown period (prevents re-sync loops)\n const syncedAt = this.recentlySynced.get(cacheKey);\n if (syncedAt && Date.now() - syncedAt < COOLDOWN_MS) {\n logger.debug(`Skipping recently synced key: ${cacheKey}`);\n return;\n }\n\n // Add to queue (overwrites if already exists)\n this.queue.set(cacheKey, item);\n\n logger.debug(\n `Missing translation queued: ${cacheKey} (queue size: ${this.queue.size})`\n );\n\n // Clear existing timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n // Check if batch size limit reached\n if (this.queue.size >= this.config.batchSize) {\n logger.debug(`Batch size reached (${this.config.batchSize}), flushing`);\n this.flush();\n return;\n }\n\n // Start new debounce timer\n this.debounceTimer = setTimeout(() => {\n this.flush();\n }, this.config.debounceMs);\n }\n\n /**\n * Flush the queue - send all queued items to the backend\n * Fire-and-forget pattern (async but not awaited)\n */\n flush(): void {\n if (this.queue.size === 0) return;\n\n // Clean up expired cooldown entries\n const now = Date.now();\n for (const [key, ts] of this.recentlySynced) {\n if (now - ts >= COOLDOWN_MS) this.recentlySynced.delete(key);\n }\n\n // Convert queue to array, preserving styles\n const batch = Array.from(this.queue.entries()).map(([cacheKey, item]) => ({\n key: cacheKey,\n value: item.fallbackValue,\n styles: item.styles,\n }));\n\n const batchSize = batch.length;\n\n // Clear queue\n this.queue.clear();\n\n // Clear timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n logger.debug(`Flushing ${batchSize} missing translations`);\n\n // Fire-and-forget sync (no await)\n this.syncBatch(batch).catch(error => {\n logger.warn(`Failed to sync ${batchSize} missing translations:`, error);\n });\n }\n\n /**\n * Send batch to backend via repository\n * Uses repository's retry logic from makeRequest()\n */\n private async syncBatch(\n batch: Array<{ key: string; value: string; styles?: Record<string, string[]> }>\n ): Promise<void> {\n try {\n // Use setBatchContentUnits when any item has styles\n const hasStyles = batch.some(item => item.styles && Object.keys(item.styles).length > 0);\n\n if (hasStyles && 'setBatchContentUnits' in this.repository) {\n const contentUnitBatch = batch.map(item => ({\n key: item.key,\n value: { text: item.value, styles: item.styles ?? {} },\n }));\n await (\n this.repository as IAsyncRepository & {\n setBatchContentUnits: (\n items: Array<{ key: string; value: { text: string; styles: Record<string, string[]> } }>\n ) => Promise<void>;\n }\n ).setBatchContentUnits(contentUnitBatch);\n logger.debug(`Synced ${batch.length} missing translations (ContentUnit)`);\n } else if ('setBatch' in this.repository) {\n // Plain string batch (no styles)\n const plainBatch = batch.map(item => ({ key: item.key, value: item.value }));\n await (\n this.repository as IAsyncRepository & {\n setBatch: (\n items: Array<{ key: string; value: string }>\n ) => Promise<void>;\n }\n ).setBatch(plainBatch);\n logger.debug(`Synced ${batch.length} missing translations`);\n } else {\n // Fallback: sync individually (parallel)\n logger.warn(\n 'Repository does not support setBatch, syncing individually'\n );\n await this.syncIndividually(batch);\n }\n // Record synced keys for cooldown\n const now = Date.now();\n const syncedKeys: string[] = [];\n for (const item of batch) {\n this.recentlySynced.set(item.key, now);\n syncedKeys.push(item.key);\n }\n\n // Emit sync:batch:complete event\n if (this.eventEmitter) {\n this.eventEmitter.emit('sync:batch:complete', {\n payload: { count: batch.length, keys: syncedKeys },\n });\n }\n } catch (error) {\n logger.error('Batch sync failed:', error);\n throw error;\n }\n }\n\n /**\n * Fallback: sync items individually in parallel\n */\n private async syncIndividually(\n batch: Array<{ key: string; value: string }>\n ): Promise<void> {\n const syncPromises = batch.map(async item => {\n try {\n await this.repository.set(item.key, item.value);\n logger.debug(`Synced: ${item.key}`);\n } catch (error) {\n logger.warn(`Failed to sync ${item.key}:`, error);\n }\n });\n\n await Promise.allSettled(syncPromises);\n }\n\n /**\n * Get current queue size (for debugging)\n */\n getQueueSize(): number {\n return this.queue.size;\n }\n\n /**\n * Get queue stats (for debugging)\n */\n getStats(): {\n queueSize: number;\n enabled: boolean;\n debounceMs: number;\n batchSize: number;\n } {\n return {\n queueSize: this.queue.size,\n enabled: this.config.enabled,\n debounceMs: this.config.debounceMs,\n batchSize: this.config.batchSize,\n };\n }\n\n /**\n * Cleanup - clear timer and queue\n */\n destroy(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n // Discard to avoid blocking during shutdown\n this.queue.clear();\n this.recentlySynced.clear();\n\n logger.debug('MissingTranslationQueue destroyed');\n }\n}\n", "/**\n * LionRapid Builder - Enhanced with explicit namespace preloading\n */\n\nimport { EventEmitter } from './base/event-emitter.js';\nimport type { LionRapidCoreConfig } from './config/lionrapid.config.js';\nimport type { NetworkRepositoryConfig } from './config/repository.config.js';\nimport { HandlerChain } from './handlers/handler-chain.js';\nimport { AsyncHandler, NetworkHandler, SyncHandler } from './handlers/index.js';\nimport type {\n IEmbeddedPlugin,\n IPlugin,\n} from './interfaces/plugin.interface.js';\nimport {\n IAsyncRepository,\n ISyncRepository,\n} from './interfaces/repository.interface.js';\nimport { LionRapidCore } from './lionRapid.js';\nimport { MissingTranslationQueue } from './sync/missing-translation-queue.js';\nimport { logger } from './utils/logger.js';\n\nexport class LionRapidBuilder {\n private config: LionRapidCoreConfig;\n private plugins: IPlugin[] = [];\n private syncStorageRepos: ISyncRepository[] = [];\n private asyncStorageRepos: IAsyncRepository[] = [];\n private networkRepos: IAsyncRepository[] = [];\n private syncQueue: MissingTranslationQueue | null = null;\n\n constructor(config: LionRapidCoreConfig) {\n this.config = {\n defaultLocale: config.defaultLocale || 'en',\n fallbackLocale: config.fallbackLocale || 'en',\n namespace: config.namespace || 'app',\n };\n }\n\n static init(config: LionRapidCoreConfig = {}): LionRapidBuilder {\n return new LionRapidBuilder(config);\n }\n\n private useSyncStorage(memory: ISyncRepository): LionRapidBuilder {\n this.syncStorageRepos.push(memory);\n return this;\n }\n\n private useAsyncStorage(storage: IAsyncRepository): LionRapidBuilder {\n this.asyncStorageRepos.push(storage);\n return this;\n }\n\n private useNetwork(network: IAsyncRepository): LionRapidBuilder {\n this.networkRepos.push(network);\n return this;\n }\n\n use(\n instance: IPlugin | IEmbeddedPlugin | ISyncRepository | IAsyncRepository\n ): LionRapidBuilder {\n switch (instance.type) {\n case 'plugin':\n this.plugins.push(instance);\n break;\n case 'memory':\n this.useSyncStorage(instance);\n break;\n case 'storage':\n this.useAsyncStorage(instance);\n break;\n case 'network':\n this.useNetwork(instance);\n break;\n }\n return this;\n }\n\n async build(): Promise<LionRapidCore> {\n const eventEmitter = new EventEmitter();\n const buildBus = eventEmitter.builder();\n\n logger.info('Builder started');\n logger.debug('Builder config', this.config);\n buildBus.buildStart(this.config.defaultLocale!, this.config.namespace!);\n\n const handlerChain = new HandlerChain(eventEmitter);\n // Always add memory cache handler first\n for (const syncRepo of this.syncStorageRepos) {\n if (!syncRepo.getConfig().enabled) continue;\n const syncHandler = new SyncHandler(eventEmitter, syncRepo);\n buildBus.use('sync');\n handlerChain.addSyncHandler(syncHandler);\n }\n // Always add storage cache handler second\n for (const asyncRepo of this.asyncStorageRepos) {\n if (!asyncRepo.getConfig().enabled) continue;\n const asyncHandler = new AsyncHandler(eventEmitter, asyncRepo);\n buildBus.use('async');\n handlerChain.addAsyncHandler(asyncHandler);\n }\n\n // Always add network cache handler last\n let networkFirst: NetworkHandler | null = null;\n for (const networkRepo of this.networkRepos) {\n if (\n !networkRepo.getConfig().enabled ||\n !networkRepo.getConfig().options?.baseUrl\n )\n continue;\n const networkHandler = new NetworkHandler(eventEmitter, networkRepo);\n if (!networkFirst) {\n networkFirst = networkHandler;\n }\n buildBus.use('network');\n handlerChain.addAsyncHandler(networkHandler);\n\n // \u2705 Initialize missing translation sync queue if enabled\n const config = networkRepo.getConfig() as NetworkRepositoryConfig;\n if (config.options?.syncMissing?.enabled) {\n this.syncQueue = new MissingTranslationQueue(networkRepo, {\n enabled: config.options.syncMissing.enabled,\n debounceMs: config.options.syncMissing.debounceMs || 500,\n batchSize: config.options.syncMissing.batchSize || 50,\n }, eventEmitter);\n\n // Subscribe to translation:not-found events (404 only)\n // Note: translation:locked (423) is NOT synced since translation exists but is not ready\n eventEmitter.on('translation:not-found', envelope => {\n if (this.syncQueue) {\n this.syncQueue.add({\n key: envelope.payload.key,\n fallbackValue: envelope.payload.fallbackValue,\n styles: envelope.payload.styles,\n locale: envelope.payload.locale,\n namespace: envelope.payload.namespace,\n });\n }\n });\n\n logger.info('Missing translation sync enabled');\n logger.debug('Sync queue config', config.options.syncMissing);\n }\n }\n\n logger.debug('Handler chain constructed');\n\n // Create facade\n const facade = new LionRapidCore(\n eventEmitter,\n handlerChain,\n this.config.defaultLocale,\n this.config.fallbackLocale,\n this.config.namespace\n );\n\n // Initialize plugins and add their handlers\n for (const plugin of this.plugins) {\n buildBus.use('plugin');\n await plugin.initialize({ core: facade, bus: eventEmitter });\n facade.registerPlugin(plugin);\n logger.info(`Plugin initialized: ${plugin.name}`);\n logger.debug(`Plugin version: ${plugin.version}`, plugin.capabilities);\n }\n\n const chainInfo = handlerChain.getChainInfo();\n\n // \u2705 Explicit namespace preloading\n if (networkFirst) {\n await this.executePreloading(networkFirst, handlerChain);\n }\n logger.info('Builder completed');\n buildBus.buildDone(\n chainInfo.handlers.map(r => r.name),\n this.plugins.map(p => p.name)\n );\n\n return facade;\n }\n\n // \u2705 CLEAN: Preloading logic\n private async executePreloading(\n networkHandler: NetworkHandler,\n handlerChain: HandlerChain\n ): Promise<void> {\n const eagerPreloads = networkHandler\n .getPreload()\n .filter(config => config.eager !== false);\n\n if (!eagerPreloads || eagerPreloads.length === 0) {\n return;\n }\n\n logger.info(`Preloading ${eagerPreloads.length} namespaces`);\n logger.debug('Preload targets', {\n namespaces: eagerPreloads.map(c => `${c.locale}:${c.namespace}`),\n });\n\n const promises = eagerPreloads.map(async preloadConfig => {\n try {\n const result = await networkHandler.loadNamespace(\n preloadConfig.locale,\n preloadConfig.namespace\n );\n\n if (result && result.data && result.status === 200) {\n const context = {\n locale: preloadConfig.locale,\n namespace: preloadConfig.namespace,\n fallbackLocale: this.config.fallbackLocale,\n };\n\n await handlerChain.saveNamespaceToHandlers(result.data, context);\n logger.debug(\n `Preloaded: ${preloadConfig.locale}:${preloadConfig.namespace}`\n );\n }\n } catch (error) {\n logger.warn(\n `Preload failed: ${preloadConfig.locale}:${preloadConfig.namespace}`,\n error\n );\n }\n });\n\n await Promise.allSettled(promises);\n logger.info('Preloading completed');\n }\n}\n", "/**\n * API repository - Simple HTTP data access layer\n * No business logic - just GET/POST operations\n *\n * Server always returns ContentUnit format: { text, styles }\n */\n\nimport type { NetworkRepositoryConfig } from '../config/repository.config.js';\nimport type { ContentUnit } from '../content/types.js';\nimport {\n NetworkError,\n ServerError,\n TranslationLockedError,\n TranslationNotFoundError,\n} from '../errors/translation-errors.js';\nimport type { IAsyncRepository } from '../interfaces/repository.interface.js';\nimport type {\n ContentUnitData,\n TranslationData,\n} from '../types/translation-data.types.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * API repository implementation\n * Pure data access - no caching, no business logic\n */\nexport class NetworkRepository\n implements IAsyncRepository<NetworkRepositoryConfig>\n{\n readonly name = 'NetworkRepository';\n readonly type = 'network';\n readonly config: NetworkRepositoryConfig = {};\n\n /** Cached version (opaque string from server) per namespace key \"locale:namespace\" */\n private namespaceVersions = new Map<string, string>();\n\n /** localStorage key prefix for persisted versions */\n private static readonly VERSION_PREFIX = 'lionrapid:v:';\n\n /**\n * Default endpoint templates with placeholder support\n * Placeholders: :key, :locale, :namespace\n */\n private readonly DEFAULT_ENDPOINTS = {\n getTranslation: '/api/integrations/translations/:key',\n getNamespace: '/api/integrations/translations/:locale/:namespace',\n setTranslation: '/api/integrations/sync/:key',\n setNamespace: '/api/integrations/sync/:locale/:namespace',\n setBatch: '/api/integrations/sync/batch',\n removeTranslation: '/api/integrations/sync/:key',\n clearTranslations: '/translations',\n } as const;\n\n constructor(config: NetworkRepositoryConfig = {}) {\n this.config = {\n options: {\n timeout: config.options?.timeout ?? 5000,\n baseUrl: config.options?.baseUrl ?? '',\n headers: config.options?.headers ?? {},\n },\n ...config,\n };\n }\n\n /**\n * Get single translation from API\n * Uses platform-specific integration endpoint\n * @throws {TranslationNotFoundError} When translation doesn't exist (404)\n * @throws {TranslationLockedError} When translation is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async get(key: string): Promise<string> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getTranslation', { key });\n logger.debug(`API GET: ${url}`);\n\n try {\n const response = await this.makeRequest(url, 'GET');\n\n if (!response.ok) {\n this.handleHttpError(response, key);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n // Try multiple key formats: meta.key, original key, or first translation\n const translation = data.translations[data.meta?.key]\n || data.translations[key]\n || Object.values(data.translations)[0];\n\n logger.debug(`Fetched translation for key \"${key}\":`, translation);\n if (!translation) {\n throw new TranslationNotFoundError(key);\n }\n\n // Handle both ContentUnit format and plain string\n if (typeof translation === 'object' && 'text' in translation) {\n logger.debug(`ContentUnit text: \"${translation.text}\"`);\n return translation.text;\n }\n\n return String(translation);\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Get single translation as full ContentUnit (with styles)\n * Used by NetworkHandler for individual key lookups that need styles\n * @throws {TranslationNotFoundError} When translation doesn't exist (404)\n * @throws {TranslationLockedError} When translation is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async getContentUnit(key: string): Promise<ContentUnit> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getTranslation', { key });\n logger.debug(`API GET ContentUnit: ${url}`);\n\n try {\n const response = await this.makeRequest(url, 'GET');\n\n if (!response.ok) {\n this.handleHttpError(response, key);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n // Try multiple key formats: meta.key, original key, or first translation\n const translation = data.translations[data.meta?.key]\n || data.translations[key]\n || Object.values(data.translations)[0];\n\n if (!translation) {\n throw new TranslationNotFoundError(key);\n }\n\n // Handle both ContentUnit format and plain string\n if (typeof translation === 'object' && 'text' in translation) {\n // Server returned ContentUnit format\n logger.debug(`ContentUnit for \"${key}\": text=\"${translation.text}\", styles=`, translation.styles);\n return {\n text: translation.text,\n styles: translation.styles || {},\n };\n }\n\n // Server returned plain string - wrap in ContentUnit\n logger.debug(`Plain string for \"${key}\": \"${translation}\" (no styles)`);\n return {\n text: String(translation),\n styles: {},\n };\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Get namespace with all translations\n * @throws {TranslationNotFoundError} When namespace doesn't exist (404)\n * @throws {TranslationLockedError} When namespace is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async getNamespace(\n locale: string,\n namespace: string\n ): Promise<TranslationData | null> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getNamespace', { locale, namespace });\n logger.debug(`API GET Namespace: ${url}`);\n\n const namespaceKey = `${locale}:${namespace}`;\n\n try {\n // Send If-None-Match for conditional request\n const extraHeaders: Record<string, string> = {};\n const cachedVersion = this.getVersion(namespaceKey);\n if (cachedVersion) {\n extraHeaders['If-None-Match'] = `W/\"${cachedVersion}\"`;\n }\n\n const response = await this.makeRequest(url, 'GET', undefined, extraHeaders);\n\n // 304 Not Modified \u2014 cached translations are still fresh\n if (response.status === 304) {\n logger.debug(`Namespace ${namespaceKey}: 304 Not Modified`);\n return null;\n }\n\n if (!response.ok) {\n this.handleHttpError(response, namespaceKey);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n if (!data.translations) {\n throw new TranslationNotFoundError(namespaceKey);\n }\n\n // Track version for future conditional requests (memory + localStorage)\n const version = data.meta?.version != null ? String(data.meta.version) : null;\n if (version) {\n this.setVersion(namespaceKey, version);\n }\n\n return data.translations;\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Save translation to API (if supported)\n */\n async set(key: string, value: string): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('setTranslation', { key });\n const response = await this.makeRequest(url, 'PUT', {\n translation: value,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save translation: ${response.status}`);\n }\n } catch (error) {\n logger.debug(`API set failed for key \"${key}\":`, error);\n throw error;\n }\n }\n\n async setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('setNamespace', { locale, namespace });\n const response = await this.makeRequest(url, 'PUT', {\n translations,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save namespace: ${response.status}`);\n }\n } catch (error) {\n logger.debug(\n `API setNamespace failed for ${locale}:${namespace}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Batch sync multiple missing translations\n * Uses new batch endpoint for efficiency\n */\n async setBatch(items: Array<{ key: string; value: string }>): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n\n try {\n const url = this.buildUrl('setBatch');\n logger.debug(`API POST Batch: ${url} (${items.length} items)`);\n\n const response = await this.makeRequest(url, 'POST', {\n translations: items,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to sync batch: ${response.status}`);\n }\n\n logger.debug(`Batch sync successful: ${items.length} items`);\n } catch (error) {\n logger.debug(`API setBatch failed for ${items.length} items:`, error);\n throw error;\n }\n }\n\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n // ContentUnit API Methods\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n /**\n * Get namespace with all translations as ContentUnit data\n *\n * @returns ContentUnitData (Record<string, ContentUnit>)\n * @throws {TranslationNotFoundError} When namespace doesn't exist (404)\n * @throws {TranslationLockedError} When namespace is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async getNamespaceContentUnits(\n locale: string,\n namespace: string\n ): Promise<ContentUnitData | null> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getNamespace', { locale, namespace });\n logger.debug(`API GET Namespace ContentUnits: ${url}`);\n\n const namespaceKey = `${locale}:${namespace}`;\n\n try {\n // Send If-None-Match for conditional request\n const extraHeaders: Record<string, string> = {};\n const cachedVersion = this.getVersion(namespaceKey);\n if (cachedVersion) {\n extraHeaders['If-None-Match'] = `W/\"${cachedVersion}\"`;\n }\n\n const response = await this.makeRequest(url, 'GET', undefined, extraHeaders);\n\n // 304 Not Modified \u2014 cached translations are still fresh\n if (response.status === 304) {\n logger.debug(`Namespace ContentUnits ${namespaceKey}: 304 Not Modified`);\n return null;\n }\n\n if (!response.ok) {\n this.handleHttpError(response, namespaceKey);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n if (!data.translations) {\n throw new TranslationNotFoundError(namespaceKey);\n }\n\n // Track version for future conditional requests (memory + localStorage)\n const version = data.meta?.version != null ? String(data.meta.version) : null;\n if (version) {\n this.setVersion(namespaceKey, version);\n }\n\n // Server always returns ContentUnit format\n return data.translations as ContentUnitData;\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Save ContentUnit to API\n *\n * Sends the ContentUnit format to server for storage.\n * Server should store in ContentUnit format for efficient retrieval.\n *\n * @param key - Translation key\n * @param unit - ContentUnit to save\n */\n async setContentUnit(key: string, unit: ContentUnit): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n\n try {\n const url = this.buildUrl('setTranslation', { key });\n const response = await this.makeRequest(url, 'PUT', {\n translation: unit,\n format: 'contentunit', // Signal to server that this is ContentUnit format\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save ContentUnit: ${response.status}`);\n }\n\n logger.debug(`Saved ContentUnit for key \"${key}\"`);\n } catch (error) {\n logger.debug(`API setContentUnit failed for key \"${key}\":`, error);\n throw error;\n }\n }\n\n /**\n * Batch sync multiple ContentUnits\n *\n * Sends ContentUnit format to server for batch storage.\n *\n * @param items - Array of key-ContentUnit pairs\n */\n async setBatchContentUnits(\n items: Array<{ key: string; value: ContentUnit }>\n ): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n\n try {\n const url = this.buildUrl('setBatch');\n logger.debug(\n `API POST Batch ContentUnits: ${url} (${items.length} items)`\n );\n\n const response = await this.makeRequest(url, 'POST', {\n translations: items,\n format: 'contentunit', // Signal to server that this is ContentUnit format\n });\n\n if (!response.ok) {\n throw new Error(`Failed to sync batch ContentUnits: ${response.status}`);\n }\n\n logger.debug(`Batch ContentUnit sync successful: ${items.length} items`);\n } catch (error) {\n logger.debug(\n `API setBatchContentUnits failed for ${items.length} items:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Remove translation from API (if supported)\n */\n async remove(key: string): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('removeTranslation', { key });\n const response = await this.makeRequest(url, 'DELETE');\n\n if (!response.ok) {\n throw new Error(`Failed to remove translation: ${response.status}`);\n }\n } catch (error) {\n logger.debug(`API remove failed for key \"${key}\":`, error);\n throw error;\n }\n }\n\n /**\n * Clear all translations (if supported)\n */\n async clear(): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('clearTranslations');\n const response = await this.makeRequest(url, 'DELETE');\n\n if (!response.ok) {\n throw new Error(`Failed to clear translations: ${response.status}`);\n }\n } catch (error) {\n logger.debug('API clear failed:', error);\n throw error;\n }\n }\n\n getConfig(): NetworkRepositoryConfig {\n return this.config;\n }\n\n /** Read persisted version from localStorage, falling back to in-memory map */\n private getVersion(namespaceKey: string): string | undefined {\n const mem = this.namespaceVersions.get(namespaceKey);\n if (mem) return mem;\n try {\n const stored = localStorage.getItem(NetworkRepository.VERSION_PREFIX + namespaceKey);\n if (stored) {\n this.namespaceVersions.set(namespaceKey, stored);\n return stored;\n }\n } catch { /* SSR or localStorage unavailable */ }\n return undefined;\n }\n\n /** Persist version to both in-memory map and localStorage */\n private setVersion(namespaceKey: string, version: string): void {\n this.namespaceVersions.set(namespaceKey, version);\n try {\n localStorage.setItem(NetworkRepository.VERSION_PREFIX + namespaceKey, version);\n } catch { /* quota exceeded or unavailable */ }\n }\n\n /**\n * Handle HTTP error responses by mapping to domain errors\n * @throws {TranslationNotFoundError} When status is 404\n * @throws {TranslationLockedError} When status is 423\n * @throws {ServerError} When status is 5xx\n * @throws {NetworkError} For other client errors\n */\n private handleHttpError(response: Response, key: string): never {\n logger.debug(`API response: ${response.status} ${response.statusText}`);\n\n if (response.status === 404) {\n throw new TranslationNotFoundError(key);\n }\n\n if (response.status === 423) {\n const retryAfter = response.headers.get('Retry-After');\n throw new TranslationLockedError(\n key,\n retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined\n );\n }\n\n if (response.status >= 500 && response.status < 600) {\n throw new ServerError(key, response.status);\n }\n\n // Other client errors (400, 401, 403, etc.)\n throw new NetworkError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n /**\n * Handle caught errors by wrapping non-domain errors\n * @throws {TranslationError} Always throws - propagates domain errors or wraps unexpected ones\n */\n private handleCaughtError(error: unknown): never {\n // Custom errors propagate automatically, wrap everything else\n if (\n error instanceof TranslationNotFoundError ||\n error instanceof TranslationLockedError ||\n error instanceof ServerError ||\n error instanceof NetworkError\n ) {\n throw error;\n }\n\n // Wrap unexpected errors (fetch abort, JSON parse, etc.)\n throw new NetworkError('Network request failed', error);\n }\n\n /**\n * Build URL from endpoint template and parameters\n * Supports placeholders: :key, :locale, :namespace\n * @param endpoint - Endpoint key from DEFAULT_ENDPOINTS\n * @param params - Parameters to replace placeholders with\n * @returns Complete URL with baseUrl + endpoint path\n */\n private buildUrl(\n endpoint: keyof typeof this.DEFAULT_ENDPOINTS,\n params: Record<string, string> = {}\n ): string {\n const baseUrl = this.config.options?.baseUrl || '';\n\n // Get endpoint template from config or use default\n let endpointTemplate =\n this.config.options?.endpoints?.[endpoint] ||\n this.DEFAULT_ENDPOINTS[endpoint];\n\n // Ensure endpoint starts with / for consistent URL building\n if (!endpointTemplate.startsWith('/')) {\n endpointTemplate = `/${endpointTemplate}`;\n }\n\n // Replace all placeholders with actual values (encoded)\n // Use global replace to handle multiple occurrences\n let path = endpointTemplate;\n for (const [key, value] of Object.entries(params)) {\n const placeholder = new RegExp(`:${key}`, 'g');\n path = path.replace(placeholder, encodeURIComponent(value));\n }\n\n return `${baseUrl}${path}`;\n }\n\n /**\n * Make HTTP request with timeout and headers\n */\n private async makeRequest(\n url: string,\n method: string,\n body?: unknown,\n extraHeaders?: Record<string, string>\n ): Promise<Response> {\n const controller = new AbortController();\n const timeout = this.config.options?.timeout ?? 10000;\n const timeoutId = setTimeout(\n () => controller.abort(),\n timeout\n );\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.config.options?.headers,\n ...extraHeaders,\n };\n\n if (this.config.options?.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.options.apiKey}`;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n", "import { MemoryRepositoryConfig } from '../config/repository.config.js';\nimport type {\n IStatsProvider,\n ISyncRepository,\n} from '../interfaces/repository.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport { createNamespaceCacheKey } from '../utils/index.js';\n\nexport class MemoryRepository\n implements ISyncRepository<MemoryRepositoryConfig>, IStatsProvider\n{\n readonly name = 'MemoryRepository';\n readonly type = 'memory';\n readonly config: MemoryRepositoryConfig = {};\n private cache = new Map<string, string>();\n private accessOrder = new Map<string, number>();\n private maxSize: number = 1000;\n\n constructor(config: MemoryRepositoryConfig) {\n this.config = config;\n this.maxSize = this.config.options?.maxSize || 1000;\n }\n\n get(key: string): string | null {\n const value = this.cache.get(key);\n if (value !== undefined) {\n // Update access time for LRU\n this.accessOrder.set(key, Date.now());\n return value;\n }\n return null;\n }\n\n set(key: string, value: string): void {\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n this.evictOldest();\n }\n\n this.cache.set(key, value);\n this.accessOrder.set(key, Date.now());\n }\n\n remove(key: string): void {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n this.accessOrder.clear();\n }\n\n /**\n * Clear all entries for a specific namespace\n * Removes both the namespace cache entry and all individual translation keys\n */\n clearNamespace(locale: string, namespace: string): void {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n const keyPrefix = `${locale}:${namespace}:`;\n\n // Remove namespace cache entry\n this.cache.delete(namespaceCacheKey);\n this.accessOrder.delete(namespaceCacheKey);\n\n // Remove individual translation keys\n for (const key of this.cache.keys()) {\n if (key.startsWith(keyPrefix)) {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n }\n }\n }\n\n getNamespace(locale: string, namespace: string): TranslationData | null {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n const namespaceData = this.cache.get(namespaceCacheKey);\n if (!namespaceData) return null;\n\n try {\n return JSON.parse(namespaceData);\n } catch (error) {\n this.cache.delete(namespaceCacheKey);\n return null;\n }\n }\n\n setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): void {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n this.cache.set(namespaceCacheKey, JSON.stringify(translations));\n }\n\n private evictOldest(): void {\n let oldestKey = '';\n let oldestTime = Date.now();\n\n for (const [key, time] of this.accessOrder.entries()) {\n if (time < oldestTime) {\n oldestTime = time;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.cache.delete(oldestKey);\n this.accessOrder.delete(oldestKey);\n }\n }\n /**\n * Get all cache entries for debugging\n */\n getEntries(): Record<string, string> {\n const entries: Record<string, string> = {};\n for (const [key, value] of this.cache.entries()) {\n entries[key] = value;\n }\n return entries;\n }\n\n getConfig(): MemoryRepositoryConfig {\n return this.config;\n }\n}\n", "/**\n * Content validator for ContentUnit integrity checking\n * @module content/validator/ContentValidator\n */\n\nimport type {\n IValidator,\n ValidationResult,\n ValidationError,\n ValidationWarning,\n ValidationErrorCode,\n ValidationWarningCode,\n} from './IValidator.js';\nimport type { ContentUnit } from '../types.js';\n\n/**\n * Validates ContentUnit for structural integrity\n *\n * Checks for:\n * - Balanced indexed tags (`<1>...</1>`)\n * - Valid tag indices (no invalid/malformed tags)\n * - Style references (styles referenced by tags exist)\n * - Orphan styles (styles defined but not used)\n * - Basic ICU brace balance validation\n *\n * @example\n * ```typescript\n * const validator = new ContentValidator();\n *\n * // Valid unit\n * const valid = validator.validate({\n * text: 'Hello <1>world</1>',\n * styles: { '1': ['bold'] }\n * });\n * // \u2192 { valid: true, errors: [], warnings: [] }\n *\n * // Unbalanced tags\n * const invalid = validator.validate({\n * text: 'Hello <1>world',\n * styles: { '1': ['bold'] }\n * });\n * // \u2192 { valid: false, errors: [{ code: 'UNBALANCED_TAGS', ... }], ... }\n * ```\n */\nexport class ContentValidator implements IValidator {\n /**\n * Validate a ContentUnit for structural integrity\n *\n * @param unit - ContentUnit to validate\n * @returns Validation result with errors and warnings\n */\n validate(unit: ContentUnit): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check tag balance\n this.validateTagBalance(unit.text, errors);\n\n // Check style references\n this.validateStyleReferences(unit.text, unit.styles, errors, warnings);\n\n // Check ICU brace balance (always, since text may contain ICU patterns)\n this.validateICUBraces(unit.text, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Validate that all indexed tags are properly balanced and correctly nested\n */\n private validateTagBalance(text: string, errors: ValidationError[]): void {\n // Pattern to match indexed tags: <1>, </1>, <1/>\n const tagPattern = /<(\\/?)?(\\d+)(\\/)?>/g;\n // Stack-based approach to verify proper nesting order\n const tagStack: Array<{ index: string; position: number }> = [];\n let match;\n\n while ((match = tagPattern.exec(text)) !== null) {\n const [, closingSlash, indexStr, selfClosingSlash] = match;\n\n if (selfClosingSlash) {\n // Self-closing tag: <1/> - always valid\n continue;\n }\n\n if (closingSlash) {\n // Closing tag: </1>\n // Must match the most recently opened tag (proper nesting)\n if (tagStack.length === 0) {\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Closing tag </${indexStr}> has no matching opening tag`,\n path: `text[${match.index}]`,\n });\n } else {\n const lastOpen = tagStack[tagStack.length - 1];\n if (lastOpen.index === indexStr) {\n // Proper closing - pop the stack\n tagStack.pop();\n } else {\n // Check if this tag was opened earlier (improper nesting)\n const foundIndex = tagStack.findIndex((t) => t.index === indexStr);\n if (foundIndex >= 0) {\n // Tag was opened but not in the right order\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Improperly nested: </${indexStr}> should close before </${lastOpen.index}>`,\n path: `text[${match.index}]`,\n });\n // Remove the out-of-order tag from stack\n tagStack.splice(foundIndex, 1);\n } else {\n // Tag was never opened\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Closing tag </${indexStr}> has no matching opening tag`,\n path: `text[${match.index}]`,\n });\n }\n }\n }\n } else {\n // Opening tag: <1>\n tagStack.push({ index: indexStr, position: match.index });\n }\n }\n\n // Check for unclosed tags\n for (const { index } of tagStack) {\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Opening tag <${index}> has no matching closing tag`,\n path: 'text',\n });\n }\n }\n\n /**\n * Validate style references - check that used tags have styles and vice versa\n */\n private validateStyleReferences(\n text: string,\n styles: Record<string, string[]>,\n errors: ValidationError[],\n warnings: ValidationWarning[]\n ): void {\n // Find all tag indices used in text\n const usedIndices = new Set<string>();\n const tagPattern = /<\\/?(\\d+)(?:\\/)?>/g;\n let match;\n\n while ((match = tagPattern.exec(text)) !== null) {\n usedIndices.add(match[1]);\n }\n\n // Check for used indices without style definitions\n for (const index of usedIndices) {\n if (!styles[index] || styles[index].length === 0) {\n // This is a warning, not an error - tag will render as <span>\n warnings.push({\n code: 'EMPTY_STYLE' as ValidationWarningCode,\n message: `Tag <${index}> has no style definition, will render as <span>`,\n });\n }\n }\n\n // Check for defined styles not used in text (orphan styles)\n for (const index of Object.keys(styles)) {\n if (!usedIndices.has(index)) {\n warnings.push({\n code: 'UNUSED_TAG' as ValidationWarningCode,\n message: `Style for tag <${index}> is defined but tag is not used in text`,\n });\n }\n }\n }\n\n /**\n * Validate ICU MessageFormat brace balance\n */\n private validateICUBraces(\n text: string,\n errors: ValidationError[]\n ): void {\n // Check for balanced braces\n let depth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const prevChar = i > 0 ? text[i - 1] : '';\n\n // Handle string escaping\n if (\n (char === '\"' || char === \"'\") &&\n prevChar !== '\\\\'\n ) {\n if (!inString) {\n inString = true;\n stringChar = char;\n } else if (char === stringChar) {\n inString = false;\n stringChar = '';\n }\n continue;\n }\n\n if (inString) continue;\n\n if (char === '{') {\n depth++;\n } else if (char === '}') {\n depth--;\n if (depth < 0) {\n errors.push({\n code: 'INVALID_ICU' as ValidationErrorCode,\n message: `Unbalanced ICU braces: unexpected '}' at position ${i}`,\n path: `text[${i}]`,\n });\n depth = 0; // Reset to continue checking\n }\n }\n }\n\n if (depth > 0) {\n errors.push({\n code: 'INVALID_ICU' as ValidationErrorCode,\n message: `Unbalanced ICU braces: ${depth} unclosed '{'`,\n path: 'text',\n });\n }\n\n // Check for empty variable names\n const emptyVarPattern = /\\{\\s*[,}]/;\n if (emptyVarPattern.test(text)) {\n errors.push({\n code: 'INVALID_ICU' as ValidationErrorCode,\n message: 'ICU variable name is empty or missing',\n path: 'text',\n });\n }\n }\n}\n", "/**\n * LocalStorage Repository for persistent cache (Browser Bundle Version)\n * Implements ISyncRepository for synchronous access to localStorage\n */\n\nimport type {\n ISyncRepository,\n IStatsProvider,\n} from '../../interfaces/repository.interface.js';\nimport type { MemoryRepositoryConfig } from '../../config/repository.config.js';\nimport type { TranslationData } from '../../types/translation-data.types.js';\n\nconst STORAGE_PREFIX = 'lionrapid:';\nconst VERSION_KEY = `${STORAGE_PREFIX}version`;\nconst CURRENT_VERSION = '1';\n\n/**\n * Stored item structure with TTL support\n */\ninterface StoredItem {\n value: string;\n expiry: number | null;\n timestamp: number;\n}\n\n/**\n * Configuration options for LocalStorageRepository\n */\nexport interface LocalStorageRepositoryConfig extends MemoryRepositoryConfig {\n options?: MemoryRepositoryConfig['options'] & {\n prefix?: string;\n ttl?: number;\n maxSize?: number;\n };\n}\n\n/**\n * LocalStorage-based repository for persistent translation caching\n */\nexport class LocalStorageRepository\n implements ISyncRepository<LocalStorageRepositoryConfig>, IStatsProvider\n{\n readonly name = 'LocalStorageRepository';\n readonly type = 'memory' as const;\n readonly config: LocalStorageRepositoryConfig;\n\n private available: boolean;\n private prefix: string;\n private defaultTTL: number;\n private maxSize: number;\n\n constructor(config: LocalStorageRepositoryConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n priority: config.priority ?? 0,\n options: {\n prefix: config.options?.prefix ?? STORAGE_PREFIX,\n ttl: config.options?.ttl ?? 24 * 60 * 60 * 1000,\n maxSize: config.options?.maxSize ?? 500,\n ...config.options,\n },\n };\n\n this.prefix = this.config.options?.prefix ?? STORAGE_PREFIX;\n this.defaultTTL = this.config.options?.ttl ?? 24 * 60 * 60 * 1000;\n this.maxSize = this.config.options?.maxSize ?? 500;\n this.available = this.checkAvailability();\n\n if (this.available) {\n this.migrateIfNeeded();\n }\n }\n\n private checkAvailability(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n try {\n const testKey = `${this.prefix}__test__`;\n window.localStorage.setItem(testKey, 'test');\n window.localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n }\n\n private migrateIfNeeded(): void {\n try {\n const storedVersion = window.localStorage.getItem(VERSION_KEY);\n if (storedVersion !== CURRENT_VERSION) {\n this.clear();\n window.localStorage.setItem(VERSION_KEY, CURRENT_VERSION);\n }\n } catch {\n // Ignore migration errors\n }\n }\n\n get(key: string): string | null {\n if (!this.available) return null;\n\n try {\n const fullKey = this.prefix + key;\n const itemStr = window.localStorage.getItem(fullKey);\n if (!itemStr) return null;\n\n const item: StoredItem = JSON.parse(itemStr);\n\n if (item.expiry !== null && Date.now() > item.expiry) {\n window.localStorage.removeItem(fullKey);\n return null;\n }\n\n return item.value;\n } catch {\n return null;\n }\n }\n\n set(key: string, value: string): void {\n if (!this.available) return;\n\n const fullKey = this.prefix + key;\n const item: StoredItem = {\n value,\n expiry: this.defaultTTL ? Date.now() + this.defaultTTL : null,\n timestamp: Date.now(),\n };\n\n try {\n const entryCount = this.getEntryCount();\n if (entryCount >= this.maxSize) {\n this.evictOldest();\n }\n\n window.localStorage.setItem(fullKey, JSON.stringify(item));\n } catch (error) {\n if (this.isQuotaError(error)) {\n this.evictOldest();\n try {\n window.localStorage.setItem(fullKey, JSON.stringify(item));\n } catch {\n // Give up silently\n }\n }\n }\n }\n\n remove(key: string): void {\n if (!this.available) return;\n\n try {\n window.localStorage.removeItem(this.prefix + key);\n } catch {\n // Ignore removal errors\n }\n }\n\n clear(): void {\n if (!this.available) return;\n\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (key?.startsWith(this.prefix) && key !== VERSION_KEY) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((k) => window.localStorage.removeItem(k));\n } catch {\n // Ignore clear errors\n }\n }\n\n clearNamespace(locale: string, namespace: string): void {\n if (!this.available) return;\n\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const keyPrefix = `${locale}:${namespace}:`;\n\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (!key?.startsWith(this.prefix)) continue;\n\n const innerKey = key.slice(this.prefix.length);\n if (innerKey === namespaceCacheKey || innerKey.startsWith(keyPrefix)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((k) => window.localStorage.removeItem(k));\n } catch {\n // Ignore errors\n }\n }\n\n getNamespace(locale: string, namespace: string): TranslationData | null {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const value = this.get(namespaceCacheKey);\n if (!value) return null;\n\n try {\n return JSON.parse(value);\n } catch {\n this.remove(namespaceCacheKey);\n return null;\n }\n }\n\n setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): void {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n this.set(namespaceCacheKey, JSON.stringify(translations));\n }\n\n getEntries(): Record<string, string> {\n const entries: Record<string, string> = {};\n if (!this.available) return entries;\n\n try {\n for (let i = 0; i < window.localStorage.length; i++) {\n const fullKey = window.localStorage.key(i);\n if (!fullKey?.startsWith(this.prefix) || fullKey === VERSION_KEY) {\n continue;\n }\n\n const key = fullKey.slice(this.prefix.length);\n const value = this.get(key);\n if (value !== null) {\n entries[key] = value;\n }\n }\n } catch {\n // Ignore errors\n }\n\n return entries;\n }\n\n getConfig(): LocalStorageRepositoryConfig {\n return this.config;\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n private getEntryCount(): number {\n if (!this.available) return 0;\n\n let count = 0;\n try {\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (key?.startsWith(this.prefix) && key !== VERSION_KEY) {\n count++;\n }\n }\n } catch {\n // Ignore errors\n }\n\n return count;\n }\n\n private isQuotaError(error: unknown): boolean {\n if (error instanceof DOMException) {\n return (\n error.name === 'QuotaExceededError' ||\n error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n );\n }\n return false;\n }\n\n private evictOldest(): void {\n if (!this.available) return;\n\n try {\n const entries: Array<{ key: string; timestamp: number }> = [];\n\n for (let i = 0; i < window.localStorage.length; i++) {\n const fullKey = window.localStorage.key(i);\n if (!fullKey?.startsWith(this.prefix) || fullKey === VERSION_KEY) {\n continue;\n }\n\n try {\n const itemStr = window.localStorage.getItem(fullKey);\n if (itemStr) {\n const item: StoredItem = JSON.parse(itemStr);\n entries.push({ key: fullKey, timestamp: item.timestamp });\n }\n } catch {\n window.localStorage.removeItem(fullKey);\n }\n }\n\n entries.sort((a, b) => a.timestamp - b.timestamp);\n\n const removeCount = Math.max(1, Math.floor(entries.length * 0.25));\n for (let i = 0; i < removeCount && i < entries.length; i++) {\n window.localStorage.removeItem(entries[i].key);\n }\n } catch {\n // Ignore eviction errors\n }\n }\n\n getCacheStats(): { size: number; maxSize: number; usage: string } {\n const size = this.getEntryCount();\n const usage =\n this.maxSize > 0 ? `${Math.round((size / this.maxSize) * 100)}%` : '0%';\n\n return {\n size,\n maxSize: this.maxSize,\n usage,\n };\n }\n}\n", "/**\n * CacheStorageRepository - Cache API-based persistent storage (Browser Bundle Version)\n * Implements IAsyncRepository for asynchronous access to Cache API\n */\n\nimport type { IAsyncRepository } from '../../interfaces/repository.interface.js';\nimport type { StorageRepositoryConfig } from '../../config/repository.config.js';\nimport type { TranslationData } from '../../types/translation-data.types.js';\nimport { TranslationNotFoundError } from '../../errors/translation-errors.js';\n\nconst CACHE_NAME = 'lionrapid-v1';\nconst CACHE_PREFIX = 'lionrapid:';\n\n/**\n * Stored item structure with TTL support\n */\ninterface StoredItem {\n value: string;\n expiry: number | null;\n timestamp: number;\n}\n\n/**\n * Configuration options for CacheStorageRepository\n */\nexport interface CacheStorageRepositoryConfig extends StorageRepositoryConfig {\n options?: StorageRepositoryConfig['options'] & {\n cacheName?: string;\n ttl?: number;\n };\n}\n\n/**\n * Cache API-based repository for persistent translation caching\n */\nexport class CacheStorageRepository\n implements IAsyncRepository<CacheStorageRepositoryConfig>\n{\n readonly name = 'CacheStorageRepository';\n readonly type = 'storage' as const;\n readonly config: CacheStorageRepositoryConfig;\n\n private cacheName: string;\n private defaultTTL: number;\n private available: boolean;\n\n constructor(config: CacheStorageRepositoryConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n priority: config.priority ?? 0,\n options: {\n cacheName: config.options?.cacheName ?? CACHE_NAME,\n ttl: config.options?.ttl ?? 7 * 24 * 60 * 60 * 1000,\n ...config.options,\n },\n };\n\n this.cacheName = this.config.options?.cacheName ?? CACHE_NAME;\n this.defaultTTL = this.config.options?.ttl ?? 7 * 24 * 60 * 60 * 1000;\n this.available = this.checkAvailability();\n }\n\n private checkAvailability(): boolean {\n return typeof caches !== 'undefined';\n }\n\n async get(key: string): Promise<string> {\n if (!this.available) {\n throw new TranslationNotFoundError(key);\n }\n\n try {\n const cache = await caches.open(this.cacheName);\n const response = await cache.match(CACHE_PREFIX + key);\n\n if (!response) {\n throw new TranslationNotFoundError(key);\n }\n\n const data: StoredItem = await response.json();\n\n if (data.expiry !== null && Date.now() > data.expiry) {\n await cache.delete(CACHE_PREFIX + key);\n throw new TranslationNotFoundError(key);\n }\n\n return data.value;\n } catch (error) {\n if (error instanceof TranslationNotFoundError) {\n throw error;\n }\n throw new TranslationNotFoundError(key);\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!this.available) return;\n\n try {\n const cache = await caches.open(this.cacheName);\n const data: StoredItem = {\n value,\n expiry: this.defaultTTL ? Date.now() + this.defaultTTL : null,\n timestamp: Date.now(),\n };\n\n await cache.put(\n CACHE_PREFIX + key,\n new Response(JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n })\n );\n } catch {\n // Silently fail - cache is non-critical\n }\n }\n\n async remove(key: string): Promise<void> {\n if (!this.available) return;\n\n try {\n const cache = await caches.open(this.cacheName);\n await cache.delete(CACHE_PREFIX + key);\n } catch {\n // Silently fail\n }\n }\n\n async clear(): Promise<void> {\n if (!this.available) return;\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n\n await Promise.all(\n keys\n .filter((request) => request.url.includes(CACHE_PREFIX))\n .map((request) => cache.delete(request))\n );\n } catch {\n // Silently fail\n }\n }\n\n async clearNamespace(locale: string, namespace: string): Promise<void> {\n if (!this.available) return;\n\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const keyPrefix = `${locale}:${namespace}:`;\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n\n await Promise.all(\n keys\n .filter((request) => {\n const url = request.url;\n const key = url.includes(CACHE_PREFIX)\n ? url.substring(url.indexOf(CACHE_PREFIX) + CACHE_PREFIX.length)\n : '';\n return key === namespaceCacheKey || key.startsWith(keyPrefix);\n })\n .map((request) => cache.delete(request))\n );\n } catch {\n // Silently fail\n }\n }\n\n async getNamespace(\n locale: string,\n namespace: string\n ): Promise<TranslationData> {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const value = await this.get(namespaceCacheKey);\n\n try {\n return JSON.parse(value);\n } catch {\n await this.remove(namespaceCacheKey);\n throw new TranslationNotFoundError(namespaceCacheKey);\n }\n }\n\n async setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): Promise<void> {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n await this.set(namespaceCacheKey, JSON.stringify(translations));\n }\n\n getConfig(): CacheStorageRepositoryConfig {\n return this.config;\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n async getEntries(): Promise<Record<string, string>> {\n const entries: Record<string, string> = {};\n if (!this.available) return entries;\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n\n for (const request of keys) {\n const url = request.url;\n if (!url.includes(CACHE_PREFIX)) continue;\n\n const key = url.substring(\n url.indexOf(CACHE_PREFIX) + CACHE_PREFIX.length\n );\n try {\n const value = await this.get(key);\n entries[key] = value;\n } catch {\n // Skip expired or invalid entries\n }\n }\n } catch {\n // Silently fail\n }\n\n return entries;\n }\n\n async getCacheStats(): Promise<{ size: number; cacheName: string }> {\n if (!this.available) {\n return { size: 0, cacheName: this.cacheName };\n }\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n const size = keys.filter((r) => r.url.includes(CACHE_PREFIX)).length;\n\n return { size, cacheName: this.cacheName };\n } catch {\n return { size: 0, cacheName: this.cacheName };\n }\n }\n}\n", "/**\n * Minimal core package - only essential functionality\n * filepath: /home/janrau/tm-integration/packages/core/src/index.ts\n */\n\n// Core engine\nexport { LionRapidBuilder } from './builder.js';\nexport { LionRapidCore } from './lionRapid.js';\n\n// Base infrastructure\nexport { EventEmitter } from './base/event-emitter.js';\nexport { HandlerChain } from './handlers/handler-chain.js';\nexport { MemoryRepository, NetworkRepository } from './repositories/index.js';\n\n// Sync utilities\nexport { MissingTranslationQueue } from './sync/missing-translation-queue.js';\nexport type {\n MissingTranslationItem,\n MissingTranslationQueueConfig,\n} from './sync/missing-translation-queue.js';\n\n// Plugin system\nexport type {\n FormatterFunction,\n IAsyncHandler,\n IEmbeddedPlugin,\n IEventPlugin,\n IPlugin,\n ISyncHandler,\n PluginContext,\n} from './interfaces/index.js';\n\n// Repository interfaces (for external storage implementations)\nexport type {\n ISyncRepository,\n IAsyncRepository,\n IStatsProvider,\n} from './interfaces/repository.interface.js';\n\n// Core types\nexport type { TranslationRequest, TranslationResult } from './types/index.js';\n\n// Content module (Unified Content Architecture)\nexport type {\n ContentUnit,\n ElementMapping,\n IParser,\n ISerializer,\n IStyleMapper,\n IValidator,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n ValidationWarning,\n ValidationWarningCode,\n} from './content/index.js';\n\nexport {\n ContentValidator,\n DefaultStyleMapper,\n HTMLSerializer,\n MarkupParser,\n} from './content/index.js';\nexport type {\n HTMLSerializerOptions,\n MarkupParserOptions,\n} from './content/index.js';\n\n// Cache module (TanStack Query-inspired)\nexport { CacheManager } from './cache/index.js';\nexport type {\n CacheEventPayloads,\n CacheManagerEntry,\n InvalidateOptions,\n} from './cache/index.js';\n\n// Error classes\nexport {\n isClientError,\n isRetryableError,\n isTranslationError,\n NetworkError,\n ServerError,\n TranslationError,\n TranslationLockedError,\n TranslationNotFoundError,\n} from './errors/translation-errors.js';\n\n// Type safety enhancements\nexport type {\n FormatterParams,\n ProcessorParams,\n TranslationParams,\n} from './types/parameters.types.js';\n\nexport type {\n ContentUnitData,\n FlatTranslationData,\n NamespaceData,\n TranslationData,\n TranslationResponse,\n TranslationValue,\n} from './types/translation-data.types.js';\n\nexport type {\n GenericEventPayload,\n HandlerAfterPayload,\n HandlerBeforePayload,\n HandlerEventData,\n} from './types/event-payloads.types.js';\n\nexport type {\n LanguageChangePayload,\n LionRapidContext,\n LionRapidEventEnvelope,\n LionRapidEventPayloads,\n} from './types/lionRapid.types.js';\n\nexport type {\n CacheEntries,\n CacheEntry,\n CacheStats,\n HandlerChainInfo,\n HandlerInfo,\n} from './types/cache.types.js';\n\n// Generated types support\nexport type {\n RequiredParamKeys,\n // Core interfaces\n TranslationKeys,\n\n // Union type helpers\n ZeroParamKeys,\n} from './types/generated.types.js';\n\n// Note: Branded type guards were removed as they're not used in the current implementation\n\n// Browser storage repositories\nexport { LocalStorageRepository } from './browser/storage/localstorage-repository.js';\nexport type { LocalStorageRepositoryConfig } from './browser/storage/localstorage-repository.js';\n\nexport { CacheStorageRepository } from './browser/storage/cache-storage-repository.js';\nexport type { CacheStorageRepositoryConfig } from './browser/storage/cache-storage-repository.js';\n\n// Essential utilities\nexport {\n parseKeyPath,\n prepareTranslationRequest,\n resolveNestedKey,\n} from './utils/index.js';\n\n// Internal utilities (for package development)\nexport {\n Colors,\n createPackageLogger,\n Logger,\n logger,\n measure,\n} from './utils/logger.js';\n\nexport { LoggerConfig, LogLevel } from './config/logger.config.js';\nexport type { CallSite, PackageLoggerConfig } from './utils/logger.js';\n\n// Repository configuration types\nexport type {\n MemoryRepositoryConfig,\n NetworkRepositoryConfig,\n PreloadNamespaces,\n StorageRepositoryConfig,\n SyncMissingConfig,\n} from './config/repository.config.js';\n\n// Version information\nexport const VERSION = '1.0.0';\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4,\n}\n\nexport interface LoggerConfig {\n level?: LogLevel;\n enabled?: boolean;\n prefix?: string;\n showLineNumbers?: boolean;\n useColors?: boolean;\n}\n\nexport interface PackageLoggerConfig extends LoggerConfig {\n packageName?: string;\n packageEmoji?: string;\n}\n", "import type { LoggerConfig } from '../config/logger.config.js';\nimport { LogLevel } from '../config/logger.config.js';\n\n// Browser-safe env access \u2014 `process` is a Node global and is undeclared\n// in browser contexts, so a bare `process.env.NODE_ENV` throws\n// `ReferenceError: process is not defined` when this module is imported\n// directly into a browser (e.g., a Vite/Webpack project that doesn't\n// pre-bundle deps from node_modules, or `<script type=module>` consumers).\n// Bundlers like esbuild/Vite still statically substitute `process.env.X`\n// inside the conditional at build time; in unbundled environments we\n// fall back to an empty object so reads are `undefined`, never throw.\nconst _ENV: Record<string, string | undefined> =\n typeof process !== 'undefined' && process.env ? process.env : {};\n\n// Build-time constants for dead code elimination\nconst IS_PRODUCTION = _ENV.NODE_ENV === 'production';\nconst IS_DEVELOPMENT = _ENV.NODE_ENV === 'development';\nconst IS_CI = _ENV.CI === 'true';\nconst LIONRAPID_DEV = _ENV.LIONRAPID_DEV === 'true';\nconst PERFORMANCE_TRACKING = _ENV.LIONRAPID_PERFORMANCE_TRACKING === 'true';\n\n/**\n * Read a runtime log-level override from localStorage in browser contexts.\n * Lets a developer flip on verbose logging without a rebuild via\n * localStorage.LIONRAPID_LOG_LEVEL = 'DEBUG'\n * Returns null on SSR or restrictive sandboxes.\n */\nfunction readBrowserLogLevel(): string | null {\n try {\n if (typeof localStorage !== 'undefined') {\n const v = localStorage.getItem('LIONRAPID_LOG_LEVEL');\n if (v && typeof v === 'string') return v;\n }\n } catch {\n // localStorage unavailable (privacy mode, file://, etc.) \u2014 ignore\n }\n return null;\n}\n\n// Environment-specific configuration.\n// Default is WARN \u2014 quiet by default. Customers consuming the published\n// ESM bundles via npm don't get noisy debug/info chatter on every page load.\n// Override via:\n// - build-time: process.env.LOG_LEVEL=DEBUG\n// - runtime (browser): localStorage.LIONRAPID_LOG_LEVEL = 'DEBUG'\n// - runtime (programmatic): logger.configure({ level: LogLevel.DEBUG })\nconst LOG_LEVEL_ENV = readBrowserLogLevel() || _ENV.LOG_LEVEL || 'WARN';\n\n/**\n * ANSI color codes for terminal output\n */\nexport const Colors = {\n // Reset\n RESET: '\\x1b[0m',\n // Foreground colors\n BLACK: '\\x1b[30m',\n RED: '\\x1b[31m',\n GREEN: '\\x1b[32m',\n YELLOW: '\\x1b[33m',\n BLUE: '\\x1b[34m',\n MAGENTA: '\\x1b[35m',\n CYAN: '\\x1b[36m',\n WHITE: '\\x1b[37m',\n ORANGE: '\\x1b[38;5;208m',\n // Bright foreground colors\n BRIGHT_BLACK: '\\x1b[90m',\n BRIGHT_RED: '\\x1b[91m',\n BRIGHT_GREEN: '\\x1b[92m',\n BRIGHT_YELLOW: '\\x1b[93m',\n BRIGHT_BLUE: '\\x1b[94m',\n BRIGHT_MAGENTA: '\\x1b[95m',\n BRIGHT_CYAN: '\\x1b[96m',\n BRIGHT_WHITE: '\\x1b[97m',\n // Styles\n BOLD: '\\x1b[1m',\n DIM: '\\x1b[2m',\n UNDERLINE: '\\x1b[4m',\n} as const;\n\nexport interface CallSite {\n fileName: string;\n lineNumber: number;\n functionName?: string;\n}\n\nexport interface PackageLoggerConfig extends LoggerConfig {\n packageName?: string;\n packageEmoji?: string;\n}\n\n// Development logger class - completely eliminated in production\nclass DevelopmentLogger {\n private config: Required<LoggerConfig>;\n\n constructor(config: PackageLoggerConfig = {}) {\n this.config = {\n level: this.getLogLevelFromEnv(),\n enabled: this.shouldEnableLogging(),\n prefix: `${config.packageEmoji || '\uD83D\uDCE6'} ${config.packageName || 'LionRapid'}`,\n showLineNumbers: LIONRAPID_DEV && !IS_CI,\n useColors: this.shouldUseColors(),\n ...config,\n };\n }\n\n configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n debug(message: string, data?: unknown): void {\n if (!this.config.enabled || this.config.level > LogLevel.DEBUG) return;\n this.log(LogLevel.DEBUG, message, data);\n }\n\n info(message: string, data?: unknown): void {\n if (this.config.level > LogLevel.INFO) return;\n this.log(LogLevel.INFO, message, data);\n }\n\n warn(message: string, data?: unknown): void {\n this.log(LogLevel.WARN, message, data);\n }\n\n error(message: string, data?: unknown): void {\n this.log(LogLevel.ERROR, message, data);\n }\n\n time(label: string): () => void {\n if (!PERFORMANCE_TRACKING || IS_PRODUCTION) return () => {};\n\n const start = IS_DEVELOPMENT ? performance.now() : 0;\n return () => {\n if (IS_DEVELOPMENT) {\n const duration = performance.now() - start;\n this.debug(`\u23F1\uFE0F ${label}: ${duration.toFixed(2)}ms`, { duration });\n }\n };\n }\n\n private log(level: LogLevel, message: string, data?: unknown): void {\n if (!this.config.enabled || level < this.config.level) return;\n\n const levelName = LogLevel[level];\n const levelEmoji = this.getLevelEmoji(level);\n const callSite = this.config.showLineNumbers ? this.getCallSite() : null;\n\n const logMessage = this.buildColoredMessage(\n level,\n levelEmoji,\n levelName,\n message,\n callSite,\n data\n );\n\n switch (level) {\n case LogLevel.ERROR:\n console.error(logMessage);\n break;\n case LogLevel.WARN:\n console.warn(logMessage);\n break;\n case LogLevel.INFO:\n console.info(logMessage);\n break;\n default:\n console.log(logMessage);\n }\n }\n\n private buildColoredMessage(\n level: LogLevel,\n emoji: string,\n levelName: string,\n message: string,\n callSite: CallSite | null,\n data?: unknown\n ): string {\n if (!this.config.useColors) {\n const locationInfo = callSite\n ? ` (${callSite.fileName}:${callSite.lineNumber})`\n : '';\n let logMessage = `${this.config.prefix} ${emoji} ${levelName} ${message}${locationInfo}`;\n if (data !== undefined) {\n logMessage += ` ${JSON.stringify(data)}`;\n }\n return logMessage;\n }\n\n const levelColor = this.getLevelColor(level);\n const reset = Colors.RESET;\n\n const coloredPrefix = `${Colors.BOLD}${Colors.ORANGE}${this.config.prefix}${reset}`;\n const coloredEmoji = emoji;\n const coloredLevel = `${levelColor}${Colors.BOLD}${levelName}${reset}`;\n const coloredMessage = `${levelColor}${message}${reset}`;\n\n const locationInfo = callSite\n ? `${Colors.DIM}${Colors.BRIGHT_BLACK} (${callSite.fileName}:${callSite.lineNumber})${reset}`\n : '';\n\n const dataInfo =\n data !== undefined\n ? `${Colors.DIM}${Colors.CYAN} ${JSON.stringify(data)}${reset}`\n : '';\n\n return `${coloredPrefix} ${coloredEmoji} ${coloredLevel} ${coloredMessage}${locationInfo}${dataInfo}`;\n }\n\n private getLevelColor(level: LogLevel): string {\n switch (level) {\n case LogLevel.DEBUG:\n return Colors.BRIGHT_GREEN;\n case LogLevel.INFO:\n return Colors.BRIGHT_CYAN;\n case LogLevel.WARN:\n return Colors.BRIGHT_YELLOW;\n case LogLevel.ERROR:\n return Colors.BRIGHT_RED;\n default:\n return Colors.BRIGHT_BLACK;\n }\n }\n\n private getLevelEmoji(level: LogLevel): string {\n switch (level) {\n case LogLevel.DEBUG:\n return '\uD83D\uDD0D';\n case LogLevel.INFO:\n return '\u2139\uFE0F';\n case LogLevel.WARN:\n return '\u26A0\uFE0F';\n case LogLevel.ERROR:\n return '\u274C';\n default:\n return '\uD83D\uDCDD';\n }\n }\n\n private getCallSite(): CallSite | null {\n try {\n const stack = new Error().stack;\n if (!stack) return null;\n\n const lines = stack.split('\\n');\n for (let i = 3; i < lines.length; i++) {\n const line = lines[i];\n if (line && !line.includes('logger.ts') && !line.includes('Logger')) {\n return this.parseStackLine(line);\n }\n }\n } catch {\n // Ignore errors\n }\n return null;\n }\n\n private parseStackLine(line: string): CallSite | null {\n let match = line.match(/at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)/);\n if (match) {\n return {\n functionName: match[1],\n fileName: this.extractFileName(match[2]),\n lineNumber: parseInt(match[3], 10),\n };\n }\n\n match = line.match(/at\\s+(.+):(\\d+):(\\d+)/);\n if (match) {\n return {\n fileName: this.extractFileName(match[1]),\n lineNumber: parseInt(match[2], 10),\n };\n }\n\n return null;\n }\n\n private extractFileName(filePath: string): string {\n const parts = filePath.split('/');\n return parts[parts.length - 1] || filePath;\n }\n\n colorize(text: string, color: keyof typeof Colors): string {\n if (!this.config.useColors) return text;\n return `${Colors[color]}${text}${Colors.RESET}`;\n }\n\n getColors(): typeof Colors {\n return Colors;\n }\n\n createPackageLogger(\n packageName: string,\n packageEmoji?: string\n ): DevelopmentLogger {\n return new DevelopmentLogger({\n ...this.config,\n packageName,\n packageEmoji: packageEmoji || '\uD83D\uDCE6',\n });\n }\n\n private getLogLevelFromEnv(): LogLevel {\n switch (LOG_LEVEL_ENV.toUpperCase()) {\n case 'DEBUG':\n return LogLevel.DEBUG;\n case 'INFO':\n return LogLevel.INFO;\n case 'WARN':\n return LogLevel.WARN;\n case 'ERROR':\n return LogLevel.ERROR;\n case 'NONE':\n return LogLevel.NONE;\n default:\n // Unknown level \u2192 quiet fallback (WARN).\n return LogLevel.WARN;\n }\n }\n\n private shouldEnableLogging(): boolean {\n if (LOG_LEVEL_ENV === 'NONE') return false;\n return true;\n }\n\n private shouldUseColors(): boolean {\n if (IS_CI) return false;\n // Check if we're in a browser environment\n if (typeof window !== 'undefined') {\n return true; // Browsers support console colors\n }\n // Node.js environment\n if (\n typeof process !== 'undefined' &&\n process.stdout &&\n !process.stdout.isTTY\n ) {\n return false;\n }\n return IS_DEVELOPMENT;\n }\n}\n\n// Production no-op functions - these create completely eliminatable calls\nconst noop = () => {};\nconst noopWithReturn = () => () => {};\n\n// Export logger with build-time method elimination\nexport const logger = IS_PRODUCTION\n ? {\n configure: noop,\n debug: noop, // \u2190 This eliminates the call completely\n info: noop, // \u2190 This eliminates the call completely\n warn: (message: string, data?: unknown) => {\n console.warn(`\uD83E\uDD81 LionRapid Core \u26A0\uFE0F ${message}`, data || '');\n },\n error: (message: string, data?: unknown) => {\n console.error(`\uD83E\uDD81 LionRapid Core \u274C ${message}`, data || '');\n },\n time: noopWithReturn,\n colorize: (text: string) => text,\n getColors: () => Colors,\n createPackageLogger: (packageName: string, packageEmoji?: string) => ({\n configure: noop,\n debug: noop, // \u2190 Package logger debug also eliminated\n info: noop, // \u2190 Package logger info also eliminated\n warn: (message: string, data?: unknown) => {\n const prefix = `${packageEmoji || '\uD83D\uDCE6'} ${packageName}`;\n console.warn(`${prefix} \u26A0\uFE0F ${message}`, data || '');\n },\n error: (message: string, data?: unknown) => {\n const prefix = `${packageEmoji || '\uD83D\uDCE6'} ${packageName}`;\n console.error(`${prefix} \u274C ${message}`, data || '');\n },\n time: noopWithReturn,\n colorize: (text: string) => text,\n getColors: () => Colors,\n createPackageLogger: noop,\n }),\n }\n : new DevelopmentLogger({\n packageName: 'LionRapid Core',\n packageEmoji: '\uD83E\uDD81',\n });\n\n// Export Logger class for type compatibility\nexport const Logger = IS_PRODUCTION\n ? function Logger() {\n return logger;\n }\n : DevelopmentLogger;\n\n// Factory function with build-time elimination\nexport const createPackageLogger = (config: PackageLoggerConfig) => {\n if (IS_PRODUCTION) {\n const prefix = `${config.packageEmoji || '\uD83D\uDCE6'} ${config.packageName || 'LionRapid'}`;\n return {\n configure: noop,\n debug: noop, // \u2190 All debug calls eliminated\n info: noop, // \u2190 All info calls eliminated\n warn: (message: string, data?: unknown) => {\n console.warn(`${prefix} \u26A0\uFE0F ${message}`, data || '');\n },\n error: (message: string, data?: unknown) => {\n console.error(`${prefix} \u274C ${message}`, data || '');\n },\n time: noopWithReturn,\n colorize: (text: string) => text,\n getColors: () => Colors,\n createPackageLogger: noop,\n };\n }\n return new DevelopmentLogger(config);\n};\n\n// Performance measurement helper - eliminated in production\nexport const measure = (name: string) => {\n if (IS_PRODUCTION) {\n return {\n start: noop,\n end: noop,\n elapsed: () => 0,\n };\n }\n\n let startTime: number;\n return {\n start: () => {\n if (IS_DEVELOPMENT) {\n startTime = performance.now();\n logger.debug(`\u23F1\uFE0F ${name} - started`);\n }\n },\n end: () => {\n if (IS_DEVELOPMENT) {\n const duration = performance.now() - startTime;\n logger.debug(`\u23F1\uFE0F ${name} - completed in ${duration.toFixed(2)}ms`);\n return duration;\n }\n return 0;\n },\n elapsed: () => (IS_DEVELOPMENT ? performance.now() - startTime : 0),\n };\n};\n", "/**\n * Enhanced event emitter with language change helpers\n * filepath: /home/janrau/tm-integration/packages/core/src/base/event-emitter.ts\n */\n\nimport type {\n LionRapidEventEnvelope,\n LionRapidEventPayloads,\n LionRapidContext,\n} from '../types/lionRapid.types.js';\nimport type { TranslationRequest } from '../types/translation.types.js';\nimport { logger } from '../utils/logger.js';\n\n// \u2705 Type-safe listener function type\ntype EventListener<T extends Record<string, unknown>, K extends keyof T> = (\n envelope: LionRapidEventEnvelope<T, K>\n) => void;\n\n// \u2705 Type-safe listener storage\n// type EventListenerMap = {\n// [K in keyof LionRapidEventPayloads]: Set<\n// EventListener<LionRapidEventPayloads, K>\n// >;\n// };\n\nexport class EventEmitter {\n // \u2705 Properly typed event listeners without `any`\n private eventListeners = new Map<\n keyof LionRapidEventPayloads,\n Set<EventListener<LionRapidEventPayloads, keyof LionRapidEventPayloads>>\n >();\n\n // Browser-safe: `process` is undeclared in browsers; guard before reading.\n // Bundlers still substitute `process.env.NODE_ENV` at build time.\n private debugMode: boolean =\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'development';\n\n /**\n * Subscribe to events (PUBLIC API) - Fully type-safe\n */\n on<K extends keyof LionRapidEventPayloads>(\n event: K,\n listener: EventListener<LionRapidEventPayloads, K>\n ): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n\n // \u2705 Type assertion is safe here because we control the map structure\n const listeners = this.eventListeners.get(event) as Set<\n EventListener<LionRapidEventPayloads, K>\n >;\n listeners.add(listener);\n }\n\n /**\n * Unsubscribe from events (PUBLIC API) - Fully type-safe\n */\n off<K extends keyof LionRapidEventPayloads>(\n event: K,\n listener: EventListener<LionRapidEventPayloads, K>\n ): void {\n const listeners = this.eventListeners.get(event) as\n | Set<EventListener<LionRapidEventPayloads, K>>\n | undefined;\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * \u2705 Type-safe emit with proper generic constraint\n */\n emit<K extends keyof LionRapidEventPayloads>(\n event: K,\n envelope: LionRapidEventEnvelope<LionRapidEventPayloads, K>\n ): void {\n const listeners = this.eventListeners.get(event) as\n | Set<EventListener<LionRapidEventPayloads, K>>\n | undefined;\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(envelope);\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error);\n }\n });\n }\n }\n\n hasListeners<K extends keyof LionRapidEventPayloads>(event: K): boolean {\n return (\n this.eventListeners.has(event) && this.eventListeners.get(event)!.size > 0\n );\n }\n\n clearEvents(): void {\n this.eventListeners.clear();\n }\n\n /**\n * \u2705 Create base context once per request\n */\n private createContext(\n requestId: string,\n trace: string[],\n extra?: Partial<LionRapidContext>\n ): LionRapidContext {\n return {\n requestId,\n timestamp: performance.now(),\n trace,\n ...extra,\n };\n }\n\n /**\n * \u2705 Type-safe event emission helper\n */\n private emitEvent<K extends keyof LionRapidEventPayloads>(\n event: K,\n payload: LionRapidEventPayloads[K],\n requestId: string,\n trace: string[]\n ): void {\n this.emit(event, {\n context: this.createContext(requestId, trace),\n payload,\n });\n }\n\n /**\n * \u2705 Translation event builder with proper typing\n */\n translation(request: TranslationRequest, handler?: string) {\n const baseTrace = ['translation'];\n const handlerTrace = handler ? [...baseTrace, handler] : baseTrace;\n\n return {\n request: () => {\n this.emit('translation:request', {\n context: this.createContext(request.id, [...baseTrace, 'request']),\n payload: { key: request.cleanKey },\n });\n },\n\n success: (value: string) => {\n this.emit('translation:success', {\n context: this.createContext(request.id, [...handlerTrace, 'success']),\n payload: { key: request.cleanKey, value },\n });\n },\n\n fallback: (value: string) => {\n this.emit('translation:fallback', {\n context: this.createContext(request.id, [...baseTrace, 'fallback']),\n payload: { key: request.cleanKey, value },\n });\n },\n\n missing: (fallbackValue: string, locale: string, namespace: string) => {\n this.emit('translation:missing', {\n context: this.createContext(request.id, [...baseTrace, 'missing']),\n payload: {\n key: request.cleanKey,\n fallbackValue,\n locale,\n namespace,\n },\n });\n },\n\n notFound: (fallbackValue: string, locale: string, namespace: string) => {\n this.emit('translation:not-found', {\n context: this.createContext(request.id, [...baseTrace, 'not-found']),\n payload: {\n key: request.cleanKey,\n fallbackValue,\n locale,\n namespace,\n status: 404 as const,\n },\n });\n },\n\n locked: (fallbackValue: string, locale: string, namespace: string) => {\n this.emit('translation:locked', {\n context: this.createContext(request.id, [...baseTrace, 'locked']),\n payload: {\n key: request.cleanKey,\n fallbackValue,\n locale,\n namespace,\n status: 423 as const,\n },\n });\n },\n };\n }\n\n /**\n * \u2705 Repository event builder with better typing\n */\n repo(request: TranslationRequest | string, source: string) {\n const baseTrace = ['repo', source];\n\n return {\n getStart: () => {\n if (typeof request === 'string') return;\n this.emit('repo:get:start', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'get',\n 'start',\n ]),\n payload: { key: request.cleanKey, source },\n });\n },\n\n getSuccess: (value: string) => {\n if (typeof request === 'string') return;\n this.emit('repo:get:success', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'get',\n 'success',\n ]),\n payload: { key: request.cleanKey, value, source },\n });\n },\n\n getMiss: () => {\n if (typeof request === 'string') return;\n this.emit('repo:get:miss', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'get',\n 'miss',\n ]),\n payload: { key: request.cleanKey, source },\n });\n },\n\n setStart: (value: string) => {\n if (typeof request === 'string') return;\n this.emit('repo:set:start', {\n context: this.createContext(request.id, [\n ...baseTrace,\n 'set',\n 'start',\n ]),\n payload: { key: request.cleanKey, value, source },\n });\n },\n\n setSuccess: (value: string) => {\n const id = typeof request === 'string' ? 'system' : request.id;\n const key = typeof request === 'string' ? request : request.cleanKey;\n this.emit('repo:set:success', {\n context: this.createContext(id, [...baseTrace, 'set', 'success']),\n payload: { key: key, value, source },\n });\n },\n\n error: (error: Error) => {\n if (typeof request === 'string') return;\n this.emit('repo:error', {\n context: this.createContext(request.id, [...baseTrace, 'error']),\n payload: { key: request.cleanKey, source, error },\n });\n },\n };\n }\n\n /**\n * \u2705 Network event builder\n */\n network(request: TranslationRequest | string, method?: string) {\n const key = typeof request === 'string' ? request : request.cleanKey;\n const requestId = typeof request === 'string' ? 'network' : request.id;\n const baseTrace = ['network', method || 'request'];\n\n return {\n start: () => {\n this.emit('network:request:start', {\n context: this.createContext(requestId, [...baseTrace, 'start']),\n payload: { key },\n });\n },\n\n success: (value: string) => {\n this.emit('network:request:success', {\n context: this.createContext(requestId, [...baseTrace, 'success']),\n payload: { key, value, method: method || 'GET' },\n });\n },\n\n error: (error: unknown, status?: number) => {\n this.emit('network:request:error', {\n context: this.createContext(requestId, [...baseTrace, 'error']),\n payload: {\n key,\n method: method || 'GET',\n error,\n ...(status && { status }),\n },\n });\n },\n\n retry: (attempt: number, delayMs: number, reason?: string) => {\n this.emit('network:retry', {\n context: this.createContext(requestId, [...baseTrace, 'retry']),\n payload: { key, attempt, delayMs, ...(reason && { reason }) },\n });\n },\n };\n }\n\n /**\n * \u2705 Builder event builder\n */\n builder() {\n const baseTrace = ['builder'];\n const systemId = `build-${Date.now()}`;\n\n return {\n use: (type: 'plugin' | 'sync' | 'async' | 'network') => {\n this.emit('builder:use', {\n context: this.createContext(systemId, [...baseTrace, 'use']),\n payload: { type },\n });\n },\n\n buildStart: (locale: string, namespace: string) => {\n this.emit('builder:build:start', {\n context: this.createContext(systemId, [\n ...baseTrace,\n 'build',\n 'start',\n ]),\n payload: { locale, namespace },\n });\n },\n\n buildDone: (repositories: string[], plugins: string[]) => {\n this.emit('builder:build:done', {\n context: this.createContext(systemId, [\n ...baseTrace,\n 'build',\n 'done',\n ]),\n payload: { repositories, plugins },\n });\n },\n };\n }\n\n /**\n * \u2705 Language change event builder\n */\n language(oldLocale: string, newLocale: string) {\n const requestId = `lang-change-${Date.now()}`;\n const baseTrace = ['language', 'change'];\n\n return {\n start: () => {\n this.emit('language:change:start', {\n context: this.createContext(requestId, [...baseTrace, 'start']),\n payload: { oldLocale, newLocale },\n });\n },\n\n complete: () => {\n this.emit('language:change:success', {\n context: this.createContext(requestId, [...baseTrace, 'complete']),\n payload: { oldLocale, newLocale },\n });\n },\n\n error: (error: Error) => {\n this.emit('language:change:error', {\n context: this.createContext(requestId, [...baseTrace, 'error']),\n payload: { oldLocale, newLocale, error },\n });\n },\n };\n }\n\n /**\n * \u2705 Cache operations (debug only)\n */\n cache(operation: 'clear', reason: string, stats?: { clearedCount: number }) {\n // Only emit in debug mode\n if (!this.debugMode) return { start: () => {}, complete: () => {} };\n\n return {\n start: () => {\n logger.debug(`\uD83E\uDDF9 Cache ${operation} starting: ${reason}`);\n },\n\n complete: () => {\n logger.debug(\n `\u2705 Cache ${operation} complete: ${stats?.clearedCount || 0} entries`\n );\n },\n };\n }\n}\n", "/**\n * Array-based handler chain implementation\n * Much simpler than linked list approach\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport type {\n IAsyncHandler,\n ISyncHandler,\n} from '../interfaces/handler.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n TranslationContext,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger } from '../utils/logger.js';\n\nexport class HandlerChain {\n private asyncHandlers: IAsyncHandler[] = [];\n private syncHandlers: ISyncHandler[] = [];\n private bus: EventEmitter;\n\n constructor(eventEmitter: EventEmitter) {\n this.bus = eventEmitter;\n }\n\n addSyncHandler(handler: ISyncHandler): void {\n if (!handler.enabled) return;\n this.syncHandlers.push(handler);\n this.sortHandlersIfNeeded(this.syncHandlers);\n logger.debug(`Sync handler added: ${handler.name}`);\n }\n\n handleSync(request: TranslationRequest): TranslationResult | null {\n for (const handler of this.syncHandlers) {\n try {\n const result = handler.lookup(request);\n if (result !== null && result.value) {\n logger.debug(`Sync hit: ${handler.name} (${result.duration}ms)`);\n return result;\n }\n } catch (error) {\n logger.warn(`Sync lookup failed in ${handler.name}:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n continue;\n }\n }\n return null;\n }\n\n private saveToMemoryHandlers(\n request: TranslationRequest,\n result: TranslationResult,\n _sourceHandler: IAsyncHandler\n ): void {\n const memoryHandlers = this.syncHandlers;\n if (memoryHandlers.length === 0) return;\n logger.debug(`Saving to ${memoryHandlers.length} memory handlers`);\n\n // Result already contains value and styles from source handler\n memoryHandlers.forEach(handler => {\n try {\n handler.save(request, result);\n logger.debug(`Saved to memory: ${handler.name}`);\n } catch (error) {\n logger.warn(`Failed to save to memory ${handler.name}:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n }\n });\n }\n\n private saveNamespaceToMemoryHandlers(\n translations: TranslationData,\n context: TranslationContext\n ): void {\n const memoryHandlers = this.syncHandlers.filter(\n h => h.type === 'memory' && h.saveNamespace\n );\n\n if (memoryHandlers.length === 0) return;\n\n logger.debug(\n `Saving namespace to ${memoryHandlers.length} memory handlers`\n );\n\n // \u2705 Save to memory handlers (sync)\n memoryHandlers.forEach(handler => {\n try {\n handler.saveNamespace!(translations, context);\n logger.debug(`Namespace saved to memory: ${handler.name}`, {\n locale: context.locale,\n namespace: context.namespace,\n });\n } catch (error) {\n logger.warn(\n `Failed to save namespace to memory ${handler.name}:`,\n error\n );\n const repoBus = this.bus.repo(\n `${context.locale}:${context.namespace}`,\n handler.name\n );\n repoBus.error(error as Error);\n }\n });\n }\n\n addAsyncHandler(handler: IAsyncHandler): void {\n if (!handler.enabled) return;\n this.asyncHandlers.push(handler);\n this.sortHandlersIfNeeded(this.asyncHandlers);\n\n logger.debug(`Async handler added: ${handler.name}`);\n }\n\n async handleAsync(\n request: TranslationRequest\n ): Promise<TranslationResult | null> {\n for (const handler of this.asyncHandlers) {\n try {\n logger.debug(`Trying handler: ${handler.name}`);\n const result = await handler.lookup(request);\n\n // Check if we got a successful result (not fallback)\n if (result.value && result.status === 200) {\n // Found translation - save to all storage handlers that come before this one\n logger.debug(`Async hit: ${handler.name} (${result.duration}ms)`);\n\n // If a full namespace was loaded during lookup, save it first\n if (result.namespaceLoaded) {\n logger.debug(\n `Saving loaded namespace: ${result.namespaceLoaded.locale}:${result.namespaceLoaded.namespace}`\n );\n await this.saveNamespaceToHandlers(result.namespaceLoaded.data, {\n locale: result.namespaceLoaded.locale,\n namespace: result.namespaceLoaded.namespace,\n });\n return result;\n }\n\n // Save to storage and memory handlers (styles included in result)\n await this.saveToStorageHandlers(request, result, handler);\n this.saveToMemoryHandlers(request, result, handler);\n\n return result;\n }\n\n // If we got a fallback result (404, 423, error), continue to next handler\n logger.debug(\n `Handler ${handler.name} returned fallback (status: ${result.status})`\n );\n } catch (error) {\n logger.warn(`Handler ${handler.name} failed:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n continue;\n }\n }\n logger.debug(`No async handlers found translation for ${request.cleanKey}`);\n return null; // Not found in any handler\n }\n\n /**\n * Save translation to all storage handlers that come before the source handler\n */\n private async saveToStorageHandlers(\n request: TranslationRequest,\n result: TranslationResult,\n sourceHandler: IAsyncHandler\n ): Promise<void> {\n const sourceIndex = this.asyncHandlers.indexOf(sourceHandler);\n\n // Get all storage handlers with higher priority (lower index) than source\n const storageHandlers = this.asyncHandlers\n .slice(0, sourceIndex)\n .filter(h => h.type === 'storage');\n\n if (storageHandlers.length === 0) return;\n\n logger.debug(`Saving to ${storageHandlers.length} storage handlers`);\n\n // Result already contains value and styles from source handler\n const savePromises = storageHandlers.map(async handler => {\n try {\n await handler.save(request, result);\n logger.debug(`Saved to storage: ${handler.name}`);\n } catch (error) {\n logger.warn(`Failed to save to storage ${handler.name}:`, error);\n const repoBus = this.bus.repo(request, handler.name);\n repoBus.error(error as Error);\n }\n });\n\n await Promise.allSettled(savePromises);\n }\n\n private async saveNamespaceToStorageHandlers(\n translations: TranslationData,\n context: TranslationContext\n ): Promise<void> {\n const storageHandlers = this.asyncHandlers.filter(\n h => h.type === 'storage' && h.saveNamespace\n );\n\n if (storageHandlers.length === 0) return;\n\n logger.debug(\n `Saving namespace to ${storageHandlers.length} storage handlers`\n );\n\n // \u2705 Save to storage handlers (async/parallel)\n const savePromises = storageHandlers.map(async handler => {\n try {\n await handler.saveNamespace!(translations, context);\n logger.debug(`Namespace saved to storage: ${handler.name}`, {\n locale: context.locale,\n namespace: context.namespace,\n });\n } catch (error) {\n logger.warn(\n `Failed to save namespace to storage ${handler.name}:`,\n error\n );\n const repoBus = this.bus.repo(\n `${context.locale}:${context.namespace}`,\n handler.name\n );\n repoBus.error(error as Error);\n }\n });\n\n await Promise.allSettled(savePromises);\n }\n\n async saveNamespaceToHandlers(\n translations: TranslationData,\n context: TranslationContext\n ): Promise<void> {\n this.saveNamespaceToMemoryHandlers(translations, context);\n await this.saveNamespaceToStorageHandlers(translations, context);\n }\n\n getSyncHandlers(): ISyncHandler[] {\n return [...this.syncHandlers];\n }\n\n getAsyncHandlers(): IAsyncHandler[] {\n return [...this.asyncHandlers];\n }\n\n /**\n * Get chain info for debugging\n */\n getChainInfo(): {\n length: number;\n handlers: Array<{\n name: string;\n priority: number;\n type: 'memory' | 'storage' | 'network' | 'fallback';\n enabled: boolean | undefined;\n }>;\n } {\n return {\n length: this.syncHandlers.length + this.asyncHandlers.length,\n handlers: [\n ...this.syncHandlers.map(h => ({\n name: h.name,\n priority: h.priority,\n type: h.type,\n enabled: h.enabled,\n })),\n ...this.asyncHandlers.map(h => ({\n name: h.name,\n priority: h.priority,\n type: h.type,\n enabled: h.enabled,\n })),\n ],\n };\n }\n\n /**\n * Check if any handler has cached data\n */\n isCached(request: TranslationRequest): boolean {\n return (\n this.syncHandlers.some(h => h.isCached?.(request) === true) ||\n this.asyncHandlers.some(h => h.isCached?.(request) === true)\n );\n }\n\n /**\n * Get combined cache entries\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries(): Record<string, any> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const entries: Record<string, any> = {};\n\n // \u2705 Fix: Use proper arrays instead of this.handlers\n const allHandlers = [...this.syncHandlers, ...this.asyncHandlers];\n for (const handler of allHandlers) {\n if (handler.getEntries) {\n entries[handler.name] = handler.getEntries();\n }\n }\n return entries;\n }\n\n /**\n * Destroy all handlers\n */\n async destroy(): Promise<void> {\n // \u2705 Fix: Use proper arrays instead of this.handlers\n const allHandlers = [...this.syncHandlers, ...this.asyncHandlers];\n\n const destroyPromises = allHandlers.map(async handler => {\n try {\n await handler.destroy?.();\n logger.debug(`Handler destroyed: ${handler.name}`);\n } catch (error) {\n logger.warn(`Failed to destroy handler: ${handler.name}`, error);\n }\n });\n\n await Promise.allSettled(destroyPromises);\n\n // Clear handler arrays\n this.syncHandlers = [];\n this.asyncHandlers = [];\n }\n\n private sortHandlersIfNeeded(\n handlers: ISyncHandler[] | IAsyncHandler[]\n ): void {\n const hasExplicitPriorities = handlers.some(h => h.priority > 0);\n\n if (hasExplicitPriorities) {\n handlers.sort((a, b) => {\n const priorityA = a.priority || Number.MAX_SAFE_INTEGER;\n const priorityB = b.priority || Number.MAX_SAFE_INTEGER;\n return priorityA - priorityB;\n });\n }\n }\n\n async loadNamespace(\n locale: string,\n namespace: string\n ): Promise<TranslationData | null> {\n for (const handler of this.asyncHandlers) {\n if (handler.type !== 'network') continue;\n try {\n logger.debug(\n `Trying to load namespace: ${locale}:${namespace} from ${handler.name}`\n );\n const result = await handler.loadNamespace?.(locale, namespace);\n if (result && result.data && result.status === 200) {\n logger.debug(\n `Loaded namespace: ${locale}:${namespace} from ${handler.name}`\n );\n await this.saveNamespaceToStorageHandlers(result.data, {\n namespace,\n locale,\n });\n this.saveNamespaceToMemoryHandlers(result.data, {\n namespace,\n locale,\n });\n return result.data;\n }\n } catch (error) {\n logger.warn(\n `Failed to load namespace: ${locale}:${namespace} from ${handler.name}`,\n error\n );\n const repoBus = this.bus.repo(`${locale}:${namespace}`, handler.name);\n repoBus.error(error as Error);\n continue;\n }\n }\n logger.debug(`No handlers found namespace: ${locale}:${namespace}`);\n return null;\n }\n\n clearCache(): void {\n const allHandlers = [...this.syncHandlers, ...this.asyncHandlers];\n\n for (const handler of allHandlers) {\n try {\n handler.destroy?.();\n logger.debug(`Cache cleared for handler: ${handler.name}`);\n } catch (error) {\n logger.warn(\n `Failed to clear cache for handler: ${handler.name}`,\n error\n );\n }\n }\n\n logger.debug('Cache cleared for all handlers');\n }\n\n /**\n * Clear cache entries for a specific namespace\n */\n clearNamespace(locale: string, namespace: string): void {\n // Clear from sync handlers (memory)\n for (const handler of this.syncHandlers) {\n try {\n handler.clearNamespace?.(locale, namespace);\n } catch (error) {\n logger.warn(\n `Failed to clear namespace for handler: ${handler.name}`,\n error\n );\n }\n }\n\n logger.debug(`Cleared namespace: ${locale}:${namespace}`);\n }\n\n /**\n * Set a value directly in the cache (for optimistic updates)\n * Bypasses the normal handler flow to directly set values in memory handlers\n * Stores as ContentUnit (text + styles) for consistency\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @param value - Translation value\n * @param styles - Optional styles for indexed tags\n */\n setCache(key: string, value: string, styles?: Record<string, string[]>): void {\n // Save to memory handlers using the dedicated setCache method\n // Handler stores as ContentUnit JSON internally\n for (const handler of this.syncHandlers) {\n if (handler.type === 'memory' && handler.setCache) {\n try {\n handler.setCache(key, value, styles);\n } catch (error) {\n logger.warn(`Failed to set cache in handler: ${handler.name}`, error);\n }\n }\n }\n\n logger.debug(`Cache set: ${key}`);\n }\n\n /**\n * Get namespace data from cache for ContentUnit style lookup\n *\n * Used by t() to retrieve styles for indexed tags at render time.\n *\n * @param namespaceCacheKey - Cache key in format @locale:namespace\n * @returns Parsed namespace data or null if not found\n */\n getNamespaceData(namespaceCacheKey: string): TranslationData | null {\n // Try to get from memory handlers first (sync)\n for (const handler of this.syncHandlers) {\n if (handler.type === 'memory') {\n try {\n const entries = handler.getEntries?.();\n if (entries && entries[namespaceCacheKey]) {\n const data = entries[namespaceCacheKey];\n // Parse if it's a string (JSON)\n if (typeof data === 'string') {\n return JSON.parse(data);\n }\n return data;\n }\n } catch (error) {\n logger.debug(`Error getting namespace data from ${handler.name}:`, error);\n }\n }\n }\n return null;\n }\n}\n", "import type { ParsedNamespaceKey } from '../types/translation.types.js';\n/**\n * Namespace parsing utilities for translation keys\n * Supports patterns like: 'common:welcome', 'user.profile.name', 'errors:validation.required'\n */\n\n\n/**\n * Parse namespace from translation key\n * Supports: 'namespace:key' pattern\n * Future: Could support other patterns like 'namespace.key' or 'namespace/key'\n * \n * @param key - Translation key (e.g., 'common:welcome' or 'welcome')\n * @returns Parsed namespace information\n */\nexport function parseNamespaceKey(key: string): ParsedNamespaceKey {\n // Simple namespace pattern: 'namespace:key'\n const colonIndex = key.indexOf(':');\n \n if (colonIndex > 0 && colonIndex < key.length - 1) {\n // Has explicit namespace\n const namespace = key.substring(0, colonIndex);\n const cleanKey = key.substring(colonIndex + 1);\n \n return {\n originalKey: key,\n namespace,\n cleanKey,\n hasExplicitNamespace: true\n };\n }\n \n // No namespace found\n return {\n originalKey: key,\n cleanKey: key,\n hasExplicitNamespace: false\n };\n}\n\n/**\n * Create a full namespaced key\n * \n * @param key - Clean translation key\n * @param namespace - Namespace to prepend\n * @returns Namespaced key (e.g., 'common:welcome')\n */\nexport function createNamespacedKey(key: string, namespace?: string): string {\n if (!namespace) return key;\n return `${namespace}:${key}`;\n}\n\n/**\n * Validate namespace format\n * \n * @param namespace - Namespace to validate\n * @returns Whether namespace is valid\n */\nexport function isValidNamespace(namespace: string): boolean {\n // Simple validation: alphanumeric, underscore, hyphen\n return /^[a-zA-Z0-9_-]+$/.test(namespace);\n}", "/**\n * Translation context creation utilities\n */\n\nimport type { TranslationContext, ParsedNamespaceKey } from '../types/translation.types.js';\n\n/**\n * Create translation context with namespace resolution\n * \n * @param parsedKey - Parsed namespace key information\n * @param currentLocale - Current locale\n * @param defaultNamespace - Default namespace if none specified\n * @param fallbackLocale - Fallback locale\n * @returns Complete translation context\n */\nexport function createTranslationContext(\n parsedKey: ParsedNamespaceKey,\n currentLocale: string,\n defaultNamespace?: string,\n fallbackLocale?: string\n): TranslationContext {\n // Use explicit namespace if provided, otherwise use default\n const effectiveNamespace = parsedKey.hasExplicitNamespace \n ? parsedKey.namespace \n : defaultNamespace;\n\n return {\n locale: currentLocale,\n namespace: effectiveNamespace,\n fallbackLocale: fallbackLocale || currentLocale\n };\n}\n\n/**\n * Check if two contexts are equivalent (for caching)\n * \n * @param context1 - First context\n * @param context2 - Second context \n * @returns Whether contexts are equivalent\n */\nexport function areContextsEquivalent(\n context1: TranslationContext, \n context2: TranslationContext\n): boolean {\n return (\n context1.locale === context2.locale &&\n context1.namespace === context2.namespace &&\n context1.fallbackLocale === context2.fallbackLocale\n );\n}", "/**\n * Translation value processing utilities\n * Handles simple strings, nested objects, pluralization, and context\n */\n\n// import type { TranslationParams } from '../types/translation.types.js';\n// import { interpolateParams } from './translation-utils.js';\nimport { logger } from './logger.js';\n\n\n/**\n * \u2705 Resolve nested key path in translation object\n */\n/**\n * \u2705 Resolve nested key from namespace object\n * Examples:\n * - resolveNestedKey({user: {profile: {name: \"John\"}}}, \"user.profile.name\") \u2192 \"John\"\n * - resolveNestedKey({items: [{name: \"Apple\"}]}, \"items[0].name\") \u2192 \"Apple\"\n * - resolveNestedKey({welcome: \"Hello\"}, \"welcome\") \u2192 \"Hello\"\n */\nexport function resolveNestedKey(\n namespace: Record<string, unknown>,\n keyPath: string\n): unknown {\n if (!namespace || !keyPath) {\n return undefined;\n }\n\n // Handle simple key (no nesting)\n if (!keyPath.includes('.') && !keyPath.includes('[')) {\n return namespace[keyPath];\n }\n\n // Handle nested key navigation\n try {\n const keys = parseKeyPath(keyPath);\n let current: unknown = namespace;\n\n for (const key of keys) {\n if (current === null || current === undefined) {\n logger.debug(\n `\uD83D\uDD0D Nested key resolution stopped at null/undefined for: ${keyPath}`\n );\n return undefined;\n }\n\n if (typeof key === 'number') {\n // Array index access\n if (!Array.isArray(current)) {\n logger.debug(\n `\uD83D\uDD0D Expected array for index ${key} in path: ${keyPath}`\n );\n return undefined;\n }\n current = current[key];\n } else {\n // Object property access\n if (typeof current !== 'object') {\n logger.debug(\n `\uD83D\uDD0D Expected object for key '${key}' in path: ${keyPath}`\n );\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n }\n\n logger.debug(\n `\uD83D\uDD0D Nested key resolved: ${keyPath} \u2192 ${typeof current === 'object' ? '[Object]' : current}`\n );\n return current;\n } catch (error) {\n logger.debug(`\uD83D\uDD0D Nested key resolution error for '${keyPath}':`, error);\n return undefined;\n }\n}\n\n/**\n * \u2705 Parse key path into array of keys/indices\n * Examples:\n * - \"user.profile.name\" \u2192 [\"user\", \"profile\", \"name\"]\n * - \"items[0].name\" \u2192 [\"items\", 0, \"name\"]\n * - \"settings.ui.theme\" \u2192 [\"settings\", \"ui\", \"theme\"]\n */\nexport function parseKeyPath(keyPath: string): (string | number)[] {\n const keys: (string | number)[] = [];\n let currentKey = '';\n let inBrackets = false;\n\n for (let i = 0; i < keyPath.length; i++) {\n const char = keyPath[i];\n\n if (char === '.' && !inBrackets) {\n // End of current key\n if (currentKey) {\n keys.push(currentKey);\n currentKey = '';\n }\n } else if (char === '[') {\n // Start of array index\n if (currentKey) {\n keys.push(currentKey);\n currentKey = '';\n }\n inBrackets = true;\n } else if (char === ']' && inBrackets) {\n // End of array index\n if (currentKey) {\n const index = parseInt(currentKey, 10);\n if (!isNaN(index)) {\n keys.push(index);\n } else {\n // Non-numeric index, treat as string\n keys.push(currentKey);\n }\n currentKey = '';\n }\n inBrackets = false;\n } else {\n // Regular character\n currentKey += char;\n }\n }\n\n // Add remaining key\n if (currentKey) {\n keys.push(currentKey);\n }\n\n return keys;\n}\n\n\n/**\n * \u2705 Create individual cache key: locale:namespace:key\n */\nexport function createIndividualCacheKey(\n locale: string,\n namespace: string | undefined,\n key: string\n): string {\n const parts = [locale];\n if (namespace) {\n parts.push(namespace);\n }\n parts.push(key);\n return parts.join(':');\n}\n\n/**\n * \u2705 Create namespace cache key: @locale:namespace\n */\nexport function createNamespaceCacheKey(\n locale: string,\n namespace: string\n): string {\n return `@${locale}:${namespace}`;\n}\n\n/**\n * \u2705 Check if key is namespace cache entry\n */\nexport function isNamespaceCacheKey(key: string): boolean {\n return key.startsWith('@');\n}\n\n/**\n * \u2705 Parse namespace cache key\n */\nexport function parseNamespaceCacheKey(\n key: string\n): { locale: string; namespace: string } | null {\n if (!key.startsWith('@')) return null;\n\n const parts = key.substring(1).split(':');\n if (parts.length !== 2) return null;\n\n const [locale, namespace] = parts;\n return { locale, namespace };\n}\n\n/**\n * \u2705 Parse individual cache key\n */\nexport function parseIndividualCacheKey(\n key: string\n): { locale: string; namespace?: string; translationKey: string } | null {\n if (key.startsWith('@')) return null;\n\n const parts = key.split(':');\n if (parts.length < 2) return null;\n\n if (parts.length === 2) {\n const [locale, translationKey] = parts;\n return { locale, translationKey };\n }\n\n if (parts.length === 3) {\n const [locale, namespace, translationKey] = parts;\n return { locale, namespace, translationKey };\n }\n\n return null;\n}\n\n/**\n * \u2705 Flatten nested translations for caching individual keys\n * Handles both ICU MessageFormat strings and structured objects\n * Stores full ContentUnit as JSON - includes both text and styles\n */\nexport function flattenTranslations(\n translations: Record<string, unknown>,\n prefix = '',\n locale: string,\n namespace: string\n): Record<string, string> {\n const flattened: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(translations)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n const cacheKey = createIndividualCacheKey(locale, namespace, fullKey);\n\n if (typeof value === 'object' && value !== null && 'text' in value && 'styles' in value) {\n // Server returns ContentUnit format: { text, styles }\n // Store as JSON to preserve both text and styles\n flattened[cacheKey] = JSON.stringify(value);\n } else if (typeof value === 'object' && value !== null) {\n // Nested object - flatten recursively\n Object.assign(\n flattened,\n flattenTranslations(value as Record<string, unknown>, fullKey, locale, namespace)\n );\n } else {\n // Fallback for plain strings - wrap in ContentUnit format\n flattened[cacheKey] = JSON.stringify({ text: String(value), styles: {} });\n }\n }\n\n return flattened;\n}\n", "/**\n * Enhanced translation process flow utilities\n * Organizes the step-by-step translation resolution process with i18n features\n */\n\nimport type { TranslationRequest } from '../types/translation.types.js';\nimport { createTranslationContext } from './context-utils.js';\nimport { parseNamespaceKey } from './namespace-utils.js';\nimport {\n createIndividualCacheKey,\n createNamespaceCacheKey,\n} from './translation-value-utils.js';\n\n/**\n * \u2705 Enhanced: Parse and prepare translation request with cache keys\n * This is the entry point that organizes all the parsing logic\n */\nexport function prepareTranslationRequest(\n key: string,\n currentLocale: string,\n defaultValueOrParams?: string | Record<string, unknown>,\n paramsOrDefaultValue?: Record<string, unknown> | string,\n defaultNamespace?: string,\n fallbackLocale?: string\n): TranslationRequest {\n const startTime = performance.now();\n\n // Parse flexible parameters\n const { defaultValue, params } = parseTranslationParams(\n defaultValueOrParams,\n paramsOrDefaultValue\n );\n\n // Parse namespace from key\n const parsedKey = parseNamespaceKey(key);\n\n // Create translation context\n const context = createTranslationContext(\n parsedKey,\n currentLocale,\n defaultNamespace,\n fallbackLocale\n );\n\n // \u2705 Generate cache keys using unified pattern\n const individualCacheKey = createIndividualCacheKey(\n context.locale,\n context.namespace,\n parsedKey.cleanKey\n );\n\n const namespaceCacheKey = context.namespace\n ? createNamespaceCacheKey(context.locale, context.namespace)\n : undefined;\n\n // Generate unique ID for the request (could be a hash or UUID)\n const id = `${individualCacheKey}-${startTime}`;\n\n return {\n id, // Unique request ID\n originalKey: key,\n originalParams: defaultValueOrParams,\n originalDefaultValue: paramsOrDefaultValue,\n cleanKey: parsedKey.cleanKey,\n hasExplicitNamespace: parsedKey.hasExplicitNamespace,\n parsedParams: params,\n parsedDefaultValue: defaultValue,\n locale: currentLocale,\n namespace: context.namespace, // \u2705 Use effective namespace (explicit or default)\n fallbackLocale,\n individualCacheKey, // \u2705 Ready-to-use cache key\n namespaceCacheKey, // \u2705 Ready-to-use namespace key\n startTime,\n };\n}\n\n/**\n * Parse flexible translation parameters\n */\nexport function parseTranslationParams(\n secondParam?: string | Record<string, unknown>,\n thirdParam?: Record<string, unknown> | string\n): { defaultValue?: string; params?: Record<string, unknown> } {\n let defaultValue: string | undefined;\n let params: Record<string, unknown> | undefined;\n\n // Runtime validation: Warn if both params are objects (likely misuse).\n // process is Node-only; browsers throw ReferenceError without the typeof\n // guard. Treat \"no process\" as \"not production\" so the dev warning still\n // fires in browser dev environments.\n const _isNotProd =\n typeof process === 'undefined' ||\n process.env?.NODE_ENV !== 'production';\n if (\n typeof secondParam === 'object' &&\n typeof thirdParam === 'object' &&\n _isNotProd\n ) {\n console.warn(\n '[LionRapid] Warning: Both secondParam and thirdParam are objects. ' +\n 'Expected pattern: t(key, params, defaultValue) or t(key, defaultValue, params). ' +\n 'Second object will be ignored as it cannot be a defaultValue.'\n );\n }\n\n if (typeof secondParam === 'string') {\n // t(key, defaultValue) or t(key, defaultValue, params)\n defaultValue = secondParam;\n if (typeof thirdParam === 'object') {\n params = thirdParam;\n }\n } else if (typeof secondParam === 'object') {\n // t(key, params) or t(key, params, defaultValue)\n params = secondParam;\n if (typeof thirdParam === 'string') {\n defaultValue = thirdParam;\n }\n }\n\n return { defaultValue, params };\n}\n", "/**\n * Simplified memory cache handler\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport { ISyncHandler } from '../interfaces/handler.interface.js';\nimport {\n IStatsProvider,\n ISyncRepository,\n} from '../interfaces/repository.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n TranslationContext,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger } from '../utils/index.js';\nimport {\n createNamespaceCacheKey,\n flattenTranslations,\n resolveNestedKey,\n} from '../utils/translation-value-utils.js';\n\n/**\n * Parsed cache entry containing both text and styles\n */\ninterface CachedContentUnit {\n text: string;\n styles: Record<string, string[]>;\n}\n\n/**\n * Simple memory cache handler\n */\nexport class SyncHandler implements ISyncHandler {\n readonly name: string;\n readonly version = '1.0.0';\n readonly priority: number;\n readonly type = 'memory' as const;\n readonly enabled: boolean;\n private ttlMap = new Map<string, number>();\n private ttl: number;\n private repository: ISyncRepository & IStatsProvider;\n private bus: EventEmitter;\n\n constructor(\n eventEmitter: EventEmitter,\n repository: ISyncRepository & IStatsProvider\n ) {\n this.bus = eventEmitter;\n this.repository = repository;\n this.name = repository.name;\n const config = repository.getConfig();\n this.enabled = config.enabled ?? true;\n this.priority = config.priority ?? 0;\n this.ttl = config.options?.ttl ?? 30 * 60 * 1000; // Default 30 minutes\n }\n\n getSourceType(): 'memory' | 'storage' | 'network' | 'fallback' {\n return 'memory';\n }\n\n /**\n * Simple lookup implementation\n * Returns ContentUnit with both text and styles\n */\n lookup(request: TranslationRequest): TranslationResult {\n const startTime = Date.now();\n logger.debug(`Sync lookup: ${request.cleanKey}`);\n const repoBus = this.bus.repo(request, this.name);\n repoBus.getStart();\n\n const directResult = this.tryDirectLookup(request);\n if (directResult !== null) {\n logger.debug(`Cache hit: ${request.cleanKey}`);\n repoBus.getSuccess(directResult.text);\n return this.createResult(directResult, 'memory', 200, startTime, true);\n }\n\n // Try namespace lookup for nested keys\n if (request.cleanKey.includes('.') && request.namespace) {\n const namespaceResult = this.tryNamespaceLookup(request);\n if (namespaceResult !== null) {\n logger.debug(`Namespace hit: ${request.cleanKey}`);\n repoBus.getSuccess(namespaceResult.text);\n return this.createResult(\n namespaceResult,\n 'memory',\n 200,\n startTime,\n true\n );\n }\n }\n\n logger.debug(`Cache miss: ${request.cleanKey}`);\n repoBus.getMiss();\n\n // Return fallback result (no styles for fallback)\n return this.createResult(\n { text: request.parsedDefaultValue || request.cleanKey, styles: {} },\n 'fallback',\n 404,\n startTime\n );\n }\n\n /**\n * Simple save implementation\n * Stores ContentUnit (text + styles) as JSON\n */\n save(request: TranslationRequest, result: TranslationResult): void {\n if (!result.value) return;\n const repoBus = this.bus.repo(request, this.name);\n\n // Store as ContentUnit JSON (text + styles together)\n const contentUnit: CachedContentUnit = {\n text: result.value,\n styles: result.styles || {},\n };\n this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Saved to cache: ${request.cleanKey}`);\n repoBus.setSuccess(result.value);\n }\n\n /**\n * Namespace saving implementation\n */\n saveNamespace(\n translations: TranslationData,\n context: TranslationContext\n ): void {\n if (!context.namespace) return;\n const repoBus = this.bus.repo(\n context.locale + ':' + context.namespace,\n this.name\n );\n\n // Store full namespace: @locale:namespace\n const namespaceCacheKey = createNamespaceCacheKey(\n context.locale,\n context.namespace\n );\n this.setWithTTL(namespaceCacheKey, JSON.stringify(translations));\n\n // Store flattened individual keys: locale:namespace:key\n const flattened = flattenTranslations(\n translations,\n '',\n context.locale,\n context.namespace!\n );\n\n for (const [flatKey, flatValue] of Object.entries(flattened)) {\n this.setWithTTL(flatKey, flatValue);\n }\n repoBus.setSuccess(JSON.stringify(translations));\n }\n\n /**\n * \u2705 Strategy 1: Direct cache lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private tryDirectLookup(request: TranslationRequest): CachedContentUnit | null {\n // Check TTL and expire if needed\n if (this.checkAndExpireTTL(request.individualCacheKey)) {\n return null;\n }\n\n const cachedValue = this.repository.get(request.individualCacheKey);\n if (!cachedValue) return null;\n\n this.refreshTTL(request.individualCacheKey); // Refresh TTL on access\n\n // Parse cached ContentUnit JSON\n try {\n const parsed = JSON.parse(cachedValue);\n if (typeof parsed === 'object' && 'text' in parsed) {\n return {\n text: String(parsed.text),\n styles: parsed.styles || {},\n };\n }\n // Legacy format: plain string (shouldn't happen with new data)\n return { text: cachedValue, styles: {} };\n } catch {\n // If parse fails, treat as legacy plain string\n return { text: cachedValue, styles: {} };\n }\n }\n\n /**\n * \u2705 Strategy 2: Namespace lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private tryNamespaceLookup(request: TranslationRequest): CachedContentUnit | null {\n if (!request.namespace) return null;\n\n const namespaceCacheKey = createNamespaceCacheKey(\n request.locale,\n request.namespace\n );\n\n // Check TTL for namespace\n if (this.checkAndExpireTTL(namespaceCacheKey)) {\n return null;\n }\n\n const namespaceData = this.repository.get(namespaceCacheKey);\n if (!namespaceData) return null;\n this.refreshTTL(namespaceCacheKey); // Refresh TTL on access\n\n try {\n const translations = JSON.parse(namespaceData);\n const value = resolveNestedKey(translations, request.cleanKey);\n\n if (value !== null && value !== undefined) {\n // Extract ContentUnit from namespace data\n let contentUnit: CachedContentUnit;\n\n if (typeof value === 'object' && value !== null && 'text' in value) {\n // Server ContentUnit format: { text, styles }\n contentUnit = {\n text: String((value as { text: unknown }).text),\n styles: (value as { styles?: Record<string, string[]> }).styles || {},\n };\n } else {\n // Plain string fallback\n contentUnit = { text: String(value), styles: {} };\n }\n\n // Cache the individual key for faster future access (as JSON)\n this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Cached from namespace: ${request.cleanKey}`);\n return contentUnit;\n }\n } catch (error) {\n // Invalid JSON in namespace cache\n logger.debug(\n `Invalid JSON in namespace cache: ${namespaceCacheKey}`,\n error\n );\n this.repository.remove(namespaceCacheKey);\n this.ttlMap.delete(namespaceCacheKey);\n }\n\n return null;\n }\n\n /**\n * Helper to create consistent TranslationResult objects\n * Now includes styles from ContentUnit\n */\n private createResult(\n contentUnit: CachedContentUnit,\n source: 'memory' | 'storage' | 'network' | 'fallback',\n status: number,\n startTime: number,\n cached?: boolean\n ): TranslationResult {\n return {\n value: contentUnit.text,\n styles: contentUnit.styles,\n source,\n status,\n duration: Date.now() - startTime,\n ...(cached !== undefined && { cached }),\n };\n }\n\n /**\n * Check TTL and expire if needed\n * Returns true if expired, false if still valid\n */\n private checkAndExpireTTL(cacheKey: string): boolean {\n const timestamp = this.ttlMap.get(cacheKey);\n if (timestamp && Date.now() - timestamp > this.ttl) {\n this.repository.remove(cacheKey);\n this.ttlMap.delete(cacheKey);\n logger.debug(`TTL expired: ${cacheKey}`);\n return true;\n }\n return false;\n }\n\n /**\n * Set value in repository and update TTL\n */\n private setWithTTL(cacheKey: string, value: string): void {\n this.repository.set(cacheKey, value);\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Refresh TTL on access\n */\n private refreshTTL(cacheKey: string): void {\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Get TTL information for debugging\n */\n getTTLInfo(): Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > {\n const ttlInfo: Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > = {};\n const now = Date.now();\n\n for (const [key, timestamp] of this.ttlMap.entries()) {\n const age = now - timestamp;\n const remaining = Math.max(0, this.ttl - age);\n ttlInfo[key] = { timestamp, age, remaining };\n }\n\n return ttlInfo;\n }\n\n getEntries() {\n if (this.repository.getEntries !== undefined) {\n return this.repository.getEntries();\n }\n }\n\n /**\n * Clear all entries for a specific namespace\n * Removes namespace cache entry, individual keys, and TTL entries\n */\n clearNamespace(locale: string, namespace: string): void {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n const keyPrefix = `${locale}:${namespace}:`;\n\n // Remove namespace cache entry\n this.repository.remove(namespaceCacheKey);\n this.ttlMap.delete(namespaceCacheKey);\n\n // Remove individual translation keys and their TTL entries\n const entries = this.repository.getEntries?.();\n if (entries) {\n for (const key of Object.keys(entries)) {\n if (key.startsWith(keyPrefix)) {\n this.repository.remove(key);\n this.ttlMap.delete(key);\n }\n }\n }\n\n logger.debug(`Cleared namespace: ${locale}:${namespace}`);\n }\n\n destroy(): void {\n this.repository.clear();\n this.ttlMap.clear();\n }\n\n /**\n * Direct cache set (for optimistic updates)\n * Bypasses event emission for direct cache manipulation\n * Stores as ContentUnit JSON (text + styles)\n */\n setCache(key: string, value: string, styles?: Record<string, string[]>): void {\n const contentUnit: CachedContentUnit = {\n text: value,\n styles: styles || {},\n };\n this.setWithTTL(key, JSON.stringify(contentUnit));\n logger.debug(`Direct cache set: ${key}`);\n }\n}\n", "/**\n * Simplified memory cache handler\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport { StorageRepositoryConfig } from '../config';\nimport { IAsyncHandler } from '../interfaces/handler.interface.js';\nimport {\n IAsyncRepository,\n IStatsProvider,\n} from '../interfaces/repository.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n TranslationContext,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger } from '../utils/index.js';\nimport {\n createNamespaceCacheKey,\n flattenTranslations,\n resolveNestedKey,\n} from '../utils/translation-value-utils.js';\n\n/**\n * Parsed cache entry containing both text and styles\n */\ninterface CachedContentUnit {\n text: string;\n styles: Record<string, string[]>;\n}\n\n/**\n * Async storage cache handler (IndexedDB, localStorage, etc.)\n */\nexport class AsyncHandler implements IAsyncHandler {\n readonly name: string;\n readonly version = '1.0.0';\n readonly priority: number;\n readonly type = 'storage' as const;\n readonly enabled: boolean;\n private ttlMap = new Map<string, number>();\n private ttl: number;\n private repository: IAsyncRepository & IStatsProvider;\n private bus: EventEmitter;\n\n constructor(\n eventEmitter: EventEmitter,\n repository: IAsyncRepository & IStatsProvider\n ) {\n this.bus = eventEmitter;\n this.repository = repository;\n this.name = repository.name;\n const config = repository.getConfig() as StorageRepositoryConfig;\n this.enabled = config.enabled ?? true;\n this.priority = config.priority ?? 0;\n this.ttl = config.options?.ttl ?? 30 * 60 * 1000; // Default 30 minutes\n }\n\n getSourceType(): 'memory' | 'storage' | 'network' | 'fallback' {\n return 'memory';\n }\n\n /**\n * Simple lookup implementation\n * Returns ContentUnit with both text and styles\n */\n async lookup(request: TranslationRequest): Promise<TranslationResult> {\n const startTime = Date.now();\n logger.debug(`Async lookup: ${request.cleanKey}`);\n const repoBus = this.bus.repo(request, this.name);\n\n const directResult = await this.tryDirectLookup(request);\n if (directResult !== null) {\n logger.debug(`Cache hit: ${request.cleanKey}`);\n repoBus.getSuccess(directResult.text);\n return this.createResult(directResult, 'storage', 200, startTime, true);\n }\n\n // Try namespace lookup for nested keys\n if (request.cleanKey.includes('.') && request.namespace) {\n const namespaceResult = await this.tryNamespaceLookup(request);\n if (namespaceResult !== null) {\n logger.debug(`Namespace hit: ${request.cleanKey}`);\n repoBus.getSuccess(namespaceResult.text);\n return this.createResult(\n namespaceResult,\n 'storage',\n 200,\n startTime,\n true\n );\n }\n }\n\n logger.debug(`Cache miss: ${request.cleanKey}`);\n repoBus.getMiss();\n\n // Return fallback result (no styles for fallback)\n return this.createResult(\n { text: request.parsedDefaultValue || request.cleanKey, styles: {} },\n 'fallback',\n 404,\n startTime\n );\n }\n\n /**\n * Simple save implementation\n * Stores ContentUnit (text + styles) as JSON\n */\n async save(\n request: TranslationRequest,\n result: TranslationResult\n ): Promise<void> {\n if (!result.value) return;\n const repoBus = this.bus.repo(request, this.name);\n\n // Store as ContentUnit JSON (text + styles together)\n const contentUnit: CachedContentUnit = {\n text: result.value,\n styles: result.styles || {},\n };\n await this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Saved to cache: ${request.cleanKey}`);\n repoBus.setSuccess(result.value);\n }\n\n /**\n * Namespace saving implementation\n */\n async saveNamespace(\n translations: TranslationData,\n context: TranslationContext\n ): Promise<void> {\n if (!context.namespace) return;\n const repoBus = this.bus.repo(\n context.locale + ':' + context.namespace,\n this.name\n );\n const keyCount = Object.keys(translations).length;\n logger.debug(\n `Saving namespace: ${context.locale}:${context.namespace} (${keyCount} keys)`\n );\n\n // Store full namespace: @locale:namespace\n const namespaceCacheKey = createNamespaceCacheKey(\n context.locale,\n context.namespace\n );\n await this.setWithTTL(namespaceCacheKey, JSON.stringify(translations));\n\n // Store flattened individual keys: locale:namespace:key\n const flattened = flattenTranslations(\n translations,\n '',\n context.locale,\n context.namespace!\n );\n\n let savedCount = 0;\n for (const [flatKey, flatValue] of Object.entries(flattened)) {\n await this.setWithTTL(flatKey, flatValue);\n savedCount++;\n }\n\n logger.debug(`Saved: ${savedCount} keys + namespace blob`);\n repoBus.setSuccess(JSON.stringify(translations));\n }\n\n /**\n * \u2705 Strategy 1: Direct cache lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private async tryDirectLookup(\n request: TranslationRequest\n ): Promise<CachedContentUnit | null> {\n // Check TTL and expire if needed\n if (await this.checkAndExpireTTL(request.individualCacheKey)) {\n return null;\n }\n\n const cachedValue = await this.repository.get(request.individualCacheKey);\n if (!cachedValue) return null;\n\n this.refreshTTL(request.individualCacheKey); // Refresh TTL on access\n\n // Parse cached ContentUnit JSON\n try {\n const parsed = JSON.parse(cachedValue);\n if (typeof parsed === 'object' && 'text' in parsed) {\n return {\n text: String(parsed.text),\n styles: parsed.styles || {},\n };\n }\n // Legacy format: plain string\n return { text: cachedValue, styles: {} };\n } catch {\n // If parse fails, treat as legacy plain string\n return { text: cachedValue, styles: {} };\n }\n }\n\n /**\n * \u2705 Strategy 2: Namespace lookup using unified pattern\n * Returns parsed ContentUnit (text + styles) or null\n */\n private async tryNamespaceLookup(\n request: TranslationRequest\n ): Promise<CachedContentUnit | null> {\n if (!request.namespace) return null;\n\n const namespaceCacheKey = createNamespaceCacheKey(\n request.locale,\n request.namespace\n );\n\n // Check TTL for namespace\n if (await this.checkAndExpireTTL(namespaceCacheKey)) {\n return null;\n }\n\n const namespaceData = await this.repository.get(namespaceCacheKey);\n if (!namespaceData) return null;\n this.refreshTTL(namespaceCacheKey); // Refresh TTL on access\n\n try {\n const translations = JSON.parse(namespaceData);\n const value = resolveNestedKey(translations, request.cleanKey);\n\n if (value !== null && value !== undefined) {\n // Extract ContentUnit from namespace data\n let contentUnit: CachedContentUnit;\n\n if (typeof value === 'object' && value !== null && 'text' in value) {\n // Server ContentUnit format: { text, styles }\n contentUnit = {\n text: String((value as { text: unknown }).text),\n styles: (value as { styles?: Record<string, string[]> }).styles || {},\n };\n } else {\n // Plain string fallback\n contentUnit = { text: String(value), styles: {} };\n }\n\n // Cache the individual key for faster future access (as JSON)\n await this.setWithTTL(request.individualCacheKey, JSON.stringify(contentUnit));\n\n logger.debug(`Cached from namespace: ${request.cleanKey}`);\n return contentUnit;\n }\n } catch (error) {\n // Invalid JSON in namespace cache\n logger.debug(\n `Invalid JSON in namespace cache: ${namespaceCacheKey}`,\n error\n );\n await this.repository.remove(namespaceCacheKey);\n this.ttlMap.delete(namespaceCacheKey);\n }\n\n return null;\n }\n\n /**\n * Helper to create consistent TranslationResult objects\n * Now includes styles from ContentUnit\n */\n private createResult(\n contentUnit: CachedContentUnit,\n source: 'memory' | 'storage' | 'network' | 'fallback',\n status: number,\n startTime: number,\n cached?: boolean\n ): TranslationResult {\n return {\n value: contentUnit.text,\n styles: contentUnit.styles,\n source,\n status,\n duration: Date.now() - startTime,\n ...(cached !== undefined && { cached }),\n };\n }\n\n /**\n * Check TTL and expire if needed (async version)\n * Returns true if expired, false if still valid\n */\n private async checkAndExpireTTL(cacheKey: string): Promise<boolean> {\n const timestamp = this.ttlMap.get(cacheKey);\n if (timestamp && Date.now() - timestamp > this.ttl) {\n await this.repository.remove(cacheKey);\n this.ttlMap.delete(cacheKey);\n logger.debug(`TTL expired: ${cacheKey}`);\n return true;\n }\n return false;\n }\n\n /**\n * Set value in repository and update TTL (async version)\n */\n private async setWithTTL(cacheKey: string, value: string): Promise<void> {\n await this.repository.set(cacheKey, value);\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Refresh TTL on access\n */\n private refreshTTL(cacheKey: string): void {\n this.ttlMap.set(cacheKey, Date.now());\n }\n\n /**\n * Get TTL information for debugging\n */\n getTTLInfo(): Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > {\n const ttlInfo: Record<\n string,\n { timestamp: number; age: number; remaining: number }\n > = {};\n const now = Date.now();\n\n for (const [key, timestamp] of this.ttlMap.entries()) {\n const age = now - timestamp;\n const remaining = Math.max(0, this.ttl - age);\n ttlInfo[key] = { timestamp, age, remaining };\n }\n\n return ttlInfo;\n }\n\n async destroy(): Promise<void> {\n await this.repository.clear();\n this.ttlMap.clear();\n }\n\n getEntries(): Record<string, string> | undefined {\n if (this.repository.getEntries !== undefined) {\n return this.repository.getEntries();\n }\n }\n}\n", "/**\n * Custom error classes for translation operations\n * Used for type-safe exception handling in repositories and handlers\n */\n\n/**\n * Base error class for all translation-related errors\n */\nexport class TranslationError extends Error {\n constructor(\n public readonly key: string,\n public readonly status: number,\n message: string\n ) {\n super(message);\n this.name = this.constructor.name;\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Translation not found in backend (HTTP 404)\n * Should be synced to backend for translators to fill in\n */\nexport class TranslationNotFoundError extends TranslationError {\n constructor(key: string) {\n super(key, 404, `Translation not found: ${key}`);\n }\n}\n\n/**\n * Translation exists but is locked/not ready (HTTP 423)\n * Should NOT be synced to backend - will retry on next app start\n */\nexport class TranslationLockedError extends TranslationError {\n constructor(\n key: string,\n public readonly retryAfter?: number\n ) {\n super(key, 423, `Translation locked: ${key}`);\n }\n}\n\n/**\n * Server error (HTTP 5xx)\n * Should trigger retry logic with exponential backoff\n */\nexport class ServerError extends TranslationError {\n constructor(key: string, status: number) {\n super(key, status, `Server error ${status}: ${key}`);\n }\n}\n\n/**\n * Network error (timeout, DNS failure, CORS, etc.)\n * Not an HTTP error - network layer failed\n */\nexport class NetworkError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Type guard to check if error is a TranslationError\n */\nexport function isTranslationError(error: unknown): error is TranslationError {\n return error instanceof TranslationError;\n}\n\n/**\n * Type guard to check if error is retryable (5xx or network)\n */\nexport function isRetryableError(error: unknown): boolean {\n return error instanceof ServerError || error instanceof NetworkError;\n}\n\n/**\n * Type guard to check if error is client error (4xx - not retryable)\n */\nexport function isClientError(error: unknown): boolean {\n return (\n error instanceof TranslationNotFoundError ||\n error instanceof TranslationLockedError\n );\n}\n", "/**\n * Simplified API handler - no automatic namespace loading\n * Namespace loading is now explicit via builder configuration\n */\n\nimport { EventEmitter } from '../base/event-emitter.js';\nimport { NetworkRepositoryConfig, PreloadNamespaces } from '../config';\nimport type { ContentUnit } from '../content/types.js';\nimport {\n isRetryableError,\n TranslationLockedError,\n TranslationNotFoundError,\n} from '../errors/translation-errors.js';\nimport { IAsyncHandler } from '../interfaces/handler.interface.js';\nimport { IAsyncRepository } from '../interfaces/repository.interface.js';\nimport { NetworkRepository } from '../repositories/network-repository.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport type {\n NamespaceResult,\n TranslationRequest,\n TranslationResult,\n} from '../types/translation.types.js';\nimport { logger, resolveNestedKey } from '../utils/index.js';\n\n/**\n * Simple API handler - only loads individual keys\n * Namespace loading is handled explicitly by builder\n */\nexport class NetworkHandler implements IAsyncHandler {\n repository: IAsyncRepository;\n readonly name: string;\n readonly priority: number;\n readonly version = '1.0.0';\n readonly type = 'network' as const;\n readonly enabled: boolean;\n private bus: EventEmitter;\n\n private retryCount: number;\n private retryDelay: number;\n\n constructor(eventEmitter: EventEmitter, repository: IAsyncRepository) {\n this.bus = eventEmitter;\n this.repository = repository;\n this.name = repository.name;\n const config = repository.getConfig() as NetworkRepositoryConfig;\n this.enabled = config.enabled ?? false;\n this.priority = config.priority ?? 0;\n this.retryCount = config.options?.retries ?? 3;\n this.retryDelay = config.options?.retryDelay ?? 1000;\n }\n\n initialize(): Promise<void> {\n return Promise.resolve();\n }\n\n getSourceType(): 'memory' | 'storage' | 'network' | 'fallback' {\n return 'network';\n }\n\n /**\n * \u2705 Lookup translation with full error handling\n * Strategy: Key first, namespace as fallback\n * Returns TranslationResult with status, source, duration, styles, and optional error\n */\n async lookup(request: TranslationRequest): Promise<TranslationResult> {\n const startTime = Date.now();\n const fallbackValue = request.parsedDefaultValue || request.cleanKey;\n\n if (!this.enabled) {\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 0,\n startTime\n );\n }\n\n const networkBus = this.bus.network(request, this.name);\n networkBus.start();\n logger.debug(`Network lookup: ${request.cleanKey}`);\n\n // Strategy 1: Try individual key lookup first (returns ContentUnit with styles)\n try {\n const contentUnit = await this.lookupContentUnitWithRetry(\n request.individualCacheKey\n );\n\n logger.debug(`Network hit: ${request.cleanKey}`);\n networkBus.success(contentUnit.text);\n\n // Return text + styles for caching\n return this.createTranslationResult(\n contentUnit.text,\n 'network',\n 200,\n startTime,\n undefined,\n false,\n undefined,\n contentUnit.styles\n );\n } catch (error) {\n // Handle 404 - key not found, try namespace fallback\n if (error instanceof TranslationNotFoundError && request.namespace) {\n logger.debug(\n `Individual key not found, trying namespace: ${request.cleanKey}`\n );\n return this.lookupFromNamespace(request, fallbackValue, startTime, networkBus);\n }\n\n // Handle 423 - locked translation\n if (error instanceof TranslationLockedError) {\n logger.debug(`Translation locked (423): ${request.cleanKey}`);\n return this.handleTranslationLocked(\n request,\n fallbackValue,\n error,\n startTime,\n networkBus\n );\n }\n\n // Handle other errors (server errors, network errors)\n logger.debug(`Network error: ${request.cleanKey}`, error);\n networkBus.error(error as Error);\n\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 0,\n startTime,\n error as Error\n );\n }\n }\n\n /**\n * Strategy 2: Namespace fallback when individual key not found\n */\n private async lookupFromNamespace(\n request: TranslationRequest,\n fallbackValue: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n networkBus: any\n ): Promise<TranslationResult> {\n try {\n const namespaceResult = await this.loadNamespace(\n request.locale,\n request.namespace!\n );\n\n if (namespaceResult && namespaceResult.data) {\n const nestedValue = resolveNestedKey(\n namespaceResult.data,\n request.cleanKey\n );\n\n if (nestedValue !== undefined && nestedValue !== null) {\n // Handle both ContentUnit format and plain strings\n let resolvedValue: string;\n let styles: Record<string, string[]> = {};\n\n if (typeof nestedValue === 'object' && nestedValue !== null && 'text' in nestedValue) {\n // ContentUnit format: { text, styles }\n const contentUnit = nestedValue as { text: unknown; styles?: Record<string, string[]> };\n resolvedValue = String(contentUnit.text);\n styles = contentUnit.styles || {};\n } else {\n // Plain string\n resolvedValue = String(nestedValue);\n }\n\n logger.debug(`Network namespace hit: ${request.cleanKey}, hasStyles=${Object.keys(styles).length > 0}`);\n networkBus.success(resolvedValue);\n\n return this.createTranslationResult(\n resolvedValue,\n 'network',\n 200,\n startTime,\n undefined,\n false,\n {\n locale: request.locale,\n namespace: request.namespace!,\n data: namespaceResult.data,\n },\n styles\n );\n }\n }\n\n // Key not found in namespace either\n const error = new TranslationNotFoundError(request.cleanKey);\n return this.handleTranslationNotFound(\n request,\n fallbackValue,\n error,\n startTime\n );\n } catch (nsError) {\n // Namespace load failed\n logger.debug(`Namespace load failed: ${request.cleanKey}`, nsError);\n\n if (nsError instanceof TranslationNotFoundError) {\n return this.handleTranslationNotFound(\n request,\n fallbackValue,\n nsError,\n startTime\n );\n }\n\n if (nsError instanceof TranslationLockedError) {\n return this.handleTranslationLocked(\n request,\n fallbackValue,\n nsError,\n startTime,\n networkBus\n );\n }\n\n networkBus.error(nsError as Error);\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 0,\n startTime,\n nsError as Error\n );\n }\n }\n\n /**\n * \u2705 Load entire namespace (used for preloading)\n * Returns NamespaceResult with status and error information\n */\n async loadNamespace(\n locale: string,\n namespace: string\n ): Promise<NamespaceResult | null> {\n const startTime = Date.now();\n\n if (!this.enabled) {\n return this.createNamespaceResult(null, 'fallback', 0, startTime);\n }\n\n try {\n const data = await this.loadNamespaceWithRetry(locale, namespace);\n\n // 304 Not Modified \u2014 cached translations are still fresh\n if (data === null) {\n logger.debug(`Network namespace not modified: ${locale}:${namespace}`);\n return this.createNamespaceResult(null, 'network', 304, startTime);\n }\n\n logger.debug(`Network namespace loaded: ${locale}:${namespace}`);\n return this.createNamespaceResult(data, 'network', 200, startTime);\n } catch (error) {\n if (error instanceof TranslationLockedError) {\n logger.debug(`Namespace locked (423): ${locale}:${namespace}`);\n\n return this.createNamespaceResult(\n null,\n 'fallback',\n 423,\n startTime,\n error\n );\n }\n\n if (error instanceof TranslationNotFoundError) {\n logger.debug(`Network namespace not found: ${locale}:${namespace}`);\n\n return this.createNamespaceResult(\n null,\n 'fallback',\n 404,\n startTime,\n error\n );\n }\n\n logger.debug(`Network namespace error: ${locale}:${namespace}`, error);\n\n return this.createNamespaceResult(\n null,\n 'fallback',\n 0,\n startTime,\n error as Error\n );\n }\n }\n\n /**\n * \u2705 Namespace lookup with retry logic\n * Throws custom errors (TranslationNotFoundError, TranslationLockedError, etc.)\n */\n private async loadNamespaceWithRetry(\n locale: string,\n namespace: string\n ): Promise<TranslationData | null> {\n return this.withRetry(\n () => this.repository.getNamespace(locale, namespace),\n `${locale}:${namespace}`,\n 'namespace request'\n );\n }\n\n /**\n * Simple save implementation (API usually doesn't save)\n */\n async save(\n request: TranslationRequest,\n result: TranslationResult\n ): Promise<void> {\n // APIs usually don't save translations, but we could implement PUT if needed\n void request;\n void result;\n }\n\n /**\n * \u2705 Lookup with retry logic for individual keys\n * Throws custom errors (TranslationNotFoundError, TranslationLockedError, etc.)\n */\n private async lookupWithRetry(cacheKey: string): Promise<string> {\n return this.withRetry(\n () => this.repository.get(cacheKey),\n cacheKey,\n 'network request'\n );\n }\n\n /**\n * \u2705 Lookup ContentUnit with retry logic for individual keys\n * Returns full ContentUnit with text and styles\n * Throws custom errors (TranslationNotFoundError, TranslationLockedError, etc.)\n */\n private async lookupContentUnitWithRetry(cacheKey: string): Promise<ContentUnit> {\n // Check if repository supports getContentUnit (NetworkRepository does)\n const repo = this.repository as NetworkRepository;\n if (typeof repo.getContentUnit !== 'function') {\n // Fallback: use get() and wrap in ContentUnit\n const text = await this.lookupWithRetry(cacheKey);\n return { text, styles: {} };\n }\n\n return this.withRetry(\n () => repo.getContentUnit(cacheKey),\n cacheKey,\n 'network content unit request'\n );\n }\n\n /**\n * Delay utility for retries\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private calculateBackoff(attempt: number): number {\n const baseDelay = this.retryDelay;\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n const maxDelay = 10000; // 10 seconds max\n\n // Add jitter to prevent thundering herd\n const jitter = Math.random() * 0.1 * exponentialDelay;\n\n return Math.min(exponentialDelay + jitter, maxDelay);\n }\n\n /**\n * Generic retry wrapper for repository operations\n * Handles retryable errors with exponential backoff\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n contextKey: string,\n contextDescription: string,\n attempt = 1\n ): Promise<T> {\n const networkBus = this.bus.network(contextKey, 'withRetry');\n\n try {\n return await operation();\n } catch (error) {\n // Retry only on retryable errors (5xx, network errors)\n if (attempt <= this.retryCount && isRetryableError(error)) {\n const delay = this.calculateBackoff(attempt);\n networkBus.retry(attempt, delay, (error as Error).message);\n await this.delay(delay);\n\n logger.debug(\n `Retrying ${contextDescription} (${attempt}/${this.retryCount}) after ${delay}ms`\n );\n return this.withRetry(\n operation,\n contextKey,\n contextDescription,\n attempt + 1\n );\n }\n\n // Don't retry client errors (404, 423)\n throw error;\n }\n }\n\n /**\n * Handle translation not found (after namespace fallback also failed)\n */\n private handleTranslationNotFound(\n request: TranslationRequest,\n fallbackValue: string,\n error: TranslationNotFoundError,\n startTime: number\n ): TranslationResult {\n logger.debug(`Network namespace miss: ${request.cleanKey}`);\n const translateBus = this.bus.translation(request);\n translateBus.notFound(\n fallbackValue,\n request.locale,\n request.namespace || 'default'\n );\n\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 404,\n startTime,\n error\n );\n }\n\n /**\n * Handle TranslationLockedError for translation lookups\n */\n private handleTranslationLocked(\n request: TranslationRequest,\n fallbackValue: string,\n error: TranslationLockedError,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n networkBus: any\n ): TranslationResult {\n const translateBus = this.bus.translation(request);\n translateBus.locked(\n fallbackValue,\n request.locale,\n request.namespace || 'default'\n );\n networkBus.error(error, 423);\n\n return this.createTranslationResult(\n fallbackValue,\n 'fallback',\n 423,\n startTime,\n error\n );\n }\n\n /**\n * Helper to create consistent TranslationResult objects\n */\n private createTranslationResult(\n value: string,\n source: 'network' | 'fallback' | 'storage' | 'memory',\n status: number,\n startTime: number,\n error?: Error,\n cached?: boolean,\n namespaceLoaded?: {\n locale: string;\n namespace: string;\n data: TranslationData;\n },\n styles?: Record<string, string[]>\n ): TranslationResult {\n return {\n value,\n source,\n status,\n duration: Date.now() - startTime,\n ...(error && { error }),\n ...(cached !== undefined && { cached }),\n ...(namespaceLoaded && { namespaceLoaded }),\n ...(styles && Object.keys(styles).length > 0 && { styles }),\n };\n }\n\n /**\n * Helper to create consistent NamespaceResult objects\n */\n private createNamespaceResult(\n data: TranslationData | null,\n source: 'network' | 'fallback' | 'storage' | 'memory',\n status: number,\n startTime: number,\n error?: Error\n ): NamespaceResult {\n return {\n data,\n source,\n status,\n duration: Date.now() - startTime,\n ...(error && { error }),\n };\n }\n\n getPreload(): Array<PreloadNamespaces> {\n const config = this.repository.getConfig() as NetworkRepositoryConfig;\n return config.options?.preloadNamespaces || [];\n }\n}\n", "/**\n * URL scheme allowlist for translation `<a href>` serialization.\n *\n * Mirror of packages/edge/src/content/safe-href.ts and\n * packages/wordpress/src/Runtime/Content/SafeHref.php \u2014 translations come\n * through the editor / batch sync pipeline as `ContentUnit.styles` arrays,\n * and a `hyperlink:<url>` style would be serialized verbatim into\n * `<a href=\"<url>\">`. Without this allowlist, a malicious translation\n * author could embed `javascript:fetch(...)` and execute on every site\n * visitor's browser.\n *\n * Allowed:\n * - http: / https:\n * - mailto: / tel: / sms:\n * - relative paths starting with /, ./, ../, ?, #\n *\n * Rejected (returned as `#` so the link still renders but is inert):\n * - javascript:, vbscript:, data:, file:, blob:, jar:, anything else\n * - protocol-relative `//host` (phishing vector)\n */\n\nconst SAFE_SCHEME = /^[a-z][a-z0-9+.-]*:/i;\nconst ALLOWED_SCHEMES = new Set(['http:', 'https:', 'mailto:', 'tel:', 'sms:']);\n\nexport function safeHref(href: string): string {\n if (!href) return '#';\n const trimmed = href.trim();\n if (!trimmed) return '#';\n\n // Reject protocol-relative //host (phishing vector). Translators can use\n // a fully-qualified https:// URL instead.\n if (trimmed.startsWith('//')) {\n return '#';\n }\n\n if (\n trimmed.startsWith('/') ||\n trimmed.startsWith('?') ||\n trimmed.startsWith('#') ||\n trimmed.startsWith('./') ||\n trimmed.startsWith('../')\n ) {\n return trimmed;\n }\n\n const schemeMatch = SAFE_SCHEME.exec(trimmed);\n if (schemeMatch) {\n const scheme = schemeMatch[0].toLowerCase();\n return ALLOWED_SCHEMES.has(scheme) ? trimmed : '#';\n }\n\n return trimmed;\n}\n", "/**\n * Default style mapper for bidirectional HTML element \u2194 style property mapping\n * @module content/style-mapper/DefaultStyleMapper\n */\n\nimport type { IStyleMapper, ElementMapping } from './IStyleMapper.js';\nimport { safeHref } from '../safe-href.js';\n\n/**\n * Default implementation of style mapping\n *\n * Provides bidirectional conversion between HTML elements and style properties:\n * - mapElementToStyles: `<b>` \u2192 `[\"bold\"]`\n * - mapStylesToElement: `[\"bold\"]` \u2192 `<b>`\n *\n * @example\n * ```typescript\n * const mapper = new DefaultStyleMapper();\n *\n * // Parsing: HTML \u2192 styles\n * mapper.mapElementToStyles('a', { href: '/terms' });\n * // \u2192 [\"hyperlink:/terms\"]\n *\n * // Serializing: styles \u2192 HTML\n * mapper.mapStylesToElement(['bold', 'hyperlink:/terms']);\n * // \u2192 { element: 'a', attrs: { href: '/terms' } }\n * ```\n */\nexport class DefaultStyleMapper implements IStyleMapper {\n /**\n * Element \u2192 Style mapping\n * Maps HTML element names to their style property\n */\n private readonly elementToStyles: Record<string, string> = {\n b: 'bold',\n strong: 'bold',\n i: 'italic',\n em: 'italic',\n u: 'underline',\n s: 'strikethrough',\n del: 'strikethrough',\n strike: 'strikethrough',\n code: 'code',\n mark: 'highlight',\n sub: 'subscript',\n sup: 'superscript',\n };\n\n /**\n * Style \u2192 Element mapping (reverse)\n * Uses simple, familiar elements for developer convenience\n * Also accepts element names directly (strong, em, etc.)\n */\n private readonly styleToElement: Record<string, string> = {\n // Semantic style names \u2192 simple elements\n bold: 'b',\n italic: 'i',\n underline: 'u',\n strikethrough: 's',\n code: 'code',\n highlight: 'mark',\n subscript: 'sub',\n superscript: 'sup',\n // Element names (for servers that store styles as element names)\n strong: 'b',\n b: 'b',\n em: 'i',\n i: 'i',\n u: 'u',\n s: 's',\n del: 's',\n strike: 's',\n mark: 'mark',\n sub: 'sub',\n sup: 'sup',\n };\n\n /**\n * Convert HTML element to style properties\n *\n * @param element - Tag name (e.g., \"b\", \"a\", \"strong\")\n * @param attrs - Element attributes (e.g., { href: \"/url\" })\n * @returns Array of style strings\n */\n mapElementToStyles(element: string, attrs: Record<string, string>): string[] {\n const styles: string[] = [];\n const tag = element.toLowerCase();\n\n // Basic element mapping\n const mappedStyle = this.elementToStyles[tag];\n if (mappedStyle) {\n styles.push(mappedStyle);\n }\n\n // Special: <a href=\"...\"> \u2192 hyperlink:url\n if (tag === 'a' && attrs.href) {\n styles.push(`hyperlink:${attrs.href}`);\n }\n\n return styles;\n }\n\n /**\n * Convert style properties to HTML element\n *\n * Priority order:\n * 1. Hyperlink (becomes wrapper element with href)\n * 2. First recognized style property\n * 3. Fallback to span\n *\n * @param styles - Array of style strings\n * @returns Element info for serialization\n */\n mapStylesToElement(styles: string[]): ElementMapping {\n // Check for hyperlink first (takes priority as wrapper element)\n for (const style of styles) {\n if (style.startsWith('hyperlink:')) {\n // Run href through scheme allowlist \u2014 dangerous schemes\n // (javascript:, data:, vbscript:) collapse to `#` so a malicious\n // translation can't embed code execution into a link.\n return {\n element: 'a',\n attrs: { href: safeHref(style.slice('hyperlink:'.length)) },\n };\n }\n }\n\n // Map first recognized style to element\n for (const style of styles) {\n const element = this.styleToElement[style];\n if (element) {\n return {\n element,\n attrs: {},\n };\n }\n }\n\n // Fallback: span with no special attributes\n return { element: 'span', attrs: {} };\n }\n}\n", "/**\n * Markup parser for converting HTML strings to ContentUnit\n * @module content/parser/MarkupParser\n */\n\nimport type { IParser } from './IParser.js';\nimport type { ContentUnit } from '../types.js';\nimport type { IStyleMapper } from '../style-mapper/IStyleMapper.js';\nimport { DefaultStyleMapper } from '../style-mapper/DefaultStyleMapper.js';\n\n/**\n * Configuration options for MarkupParser\n */\nexport interface MarkupParserOptions {\n /**\n * Custom style mapper for element \u2194 style conversion\n * Defaults to DefaultStyleMapper\n */\n styleMapper?: IStyleMapper;\n}\n\n/**\n * Parsed HTML element structure\n */\ninterface _ParsedElement {\n tag: string;\n attrs: Record<string, string>;\n content: string;\n startIndex: number;\n endIndex: number;\n}\n\n/**\n * Parser that converts HTML markup strings to ContentUnit format\n *\n * Transforms inline HTML elements into indexed tags with style mapping:\n * - `<b>bold</b>` \u2192 text: `<1>bold</1>`, styles: `{\"1\": [\"bold\"]}`\n * - `<a href=\"/url\">link</a>` \u2192 styles: `{\"1\": [\"hyperlink:/url\"]}`\n *\n * @example\n * ```typescript\n * const parser = new MarkupParser();\n *\n * const unit = parser.parse('Read our <b>Terms</b>.');\n * // \u2192 { text: \"Read our <1>Terms</1>.\", styles: {\"1\": [\"bold\"]} }\n *\n * const nested = parser.parse('<b>bold <i>and italic</i></b>');\n * // \u2192 { text: \"<1>bold <2>and italic</2></1>\", styles: {\"1\": [\"bold\"], \"2\": [\"italic\"]} }\n * ```\n */\nexport class MarkupParser implements IParser<string> {\n private readonly styleMapper: IStyleMapper;\n\n constructor(options: MarkupParserOptions = {}) {\n this.styleMapper = options.styleMapper ?? new DefaultStyleMapper();\n }\n\n /**\n * Parse HTML string into ContentUnit\n *\n * Handles two input formats:\n * 1. HTML tags: `<b>text</b>` \u2192 converts to indexed `<1>text</1>` with styles\n * 2. Already indexed: `<1>text</1>` \u2192 passes through as-is (from server)\n *\n * @param input - HTML string with inline elements or already indexed\n * @returns ContentUnit with indexed tags and styles\n */\n parse(input: string): ContentUnit {\n // Check if input already uses indexed tags (from server)\n // Pattern: <1>, </1>, <2>, </2>, etc.\n const hasIndexedTags = /<\\/?[0-9]+>/.test(input);\n\n if (hasIndexedTags) {\n // Input already has indexed tags - pass through without style mapping\n // The styles will come from component children in Trans, not from server\n return {\n text: input,\n styles: {}, // Empty - styles determined by children\n };\n }\n\n const styles: Record<string, string[]> = {};\n let tagIndex = 0;\n\n // Stack to track open tags and their indices\n const tagStack: Array<{ tag: string; index: number }> = [];\n\n // Result text being built\n let result = '';\n let pos = 0;\n\n while (pos < input.length) {\n // Look for opening tag\n const tagMatch = this.matchTag(input, pos);\n\n if (!tagMatch) {\n // No more tags, append rest of string\n result += input.slice(pos);\n break;\n }\n\n // Append text before tag\n result += input.slice(pos, tagMatch.startIndex);\n\n if (tagMatch.isClosing) {\n // Closing tag - find matching opening tag\n const matchingOpen = this.findMatchingOpenTag(\n tagStack,\n tagMatch.tag.toLowerCase()\n );\n if (matchingOpen !== null) {\n result += `</${matchingOpen}>`;\n // Remove from stack\n const stackIndex = tagStack.findIndex(\n (t) => t.index === matchingOpen\n );\n if (stackIndex !== -1) {\n tagStack.splice(stackIndex, 1);\n }\n } else {\n // Unmatched closing tag - keep as-is (will be validated later)\n result += input.slice(tagMatch.startIndex, tagMatch.endIndex);\n }\n } else if (tagMatch.isSelfClosing) {\n // Self-closing tag - assign index but no content\n tagIndex++;\n const styleList = this.styleMapper.mapElementToStyles(\n tagMatch.tag,\n tagMatch.attrs\n );\n if (styleList.length > 0) {\n styles[String(tagIndex)] = styleList;\n result += `<${tagIndex}/>`;\n }\n // If no styles mapped, skip the tag entirely\n } else {\n // Opening tag\n const styleList = this.styleMapper.mapElementToStyles(\n tagMatch.tag,\n tagMatch.attrs\n );\n\n if (styleList.length > 0) {\n tagIndex++;\n styles[String(tagIndex)] = styleList;\n result += `<${tagIndex}>`;\n tagStack.push({ tag: tagMatch.tag.toLowerCase(), index: tagIndex });\n } else {\n // Unknown element - don't index it, just process content\n // We need to find the closing tag and process content\n const closingIndex = this.findClosingTagIndex(\n input,\n tagMatch.endIndex,\n tagMatch.tag\n );\n if (closingIndex !== -1) {\n // Recursively parse content\n const innerContent = input.slice(tagMatch.endIndex, closingIndex);\n const innerUnit = this.parse(innerContent);\n\n // Merge inner styles (adjusting indices based on current tagIndex)\n const baseIndex = tagIndex;\n for (const [key, value] of Object.entries(innerUnit.styles)) {\n const adjustedKey = String(baseIndex + parseInt(key, 10));\n styles[adjustedKey] = value;\n }\n\n // Adjust result and indices\n result += innerUnit.text.replace(/<(\\/?)\\d+>/g, (match, slash) => {\n const num = parseInt(match.replace(/[</>]/g, ''), 10);\n return `<${slash}${baseIndex + num}>`;\n });\n\n // Move position past closing tag\n const closingMatch = this.matchTag(input, closingIndex);\n pos = closingMatch ? closingMatch.endIndex : closingIndex;\n\n // Adjust tagIndex to account for inner tags\n const maxInnerIndex = Object.keys(innerUnit.styles).length > 0\n ? Math.max(...Object.keys(innerUnit.styles).map(Number))\n : 0;\n tagIndex = baseIndex + maxInnerIndex;\n continue;\n }\n }\n }\n\n pos = tagMatch.endIndex;\n }\n\n // Handle unclosed tags (add closing tags in reverse order)\n while (tagStack.length > 0) {\n const unclosed = tagStack.pop()!;\n result += `</${unclosed.index}>`;\n }\n\n return {\n text: result,\n styles,\n };\n }\n\n /**\n * Match an HTML tag at the given position\n */\n private matchTag(\n input: string,\n startPos: number\n ): {\n tag: string;\n attrs: Record<string, string>;\n isClosing: boolean;\n isSelfClosing: boolean;\n startIndex: number;\n endIndex: number;\n } | null {\n // Find next '<' from startPos\n const tagStart = input.indexOf('<', startPos);\n if (tagStart === -1) return null;\n\n // Match tag pattern: <tagname attrs> or </tagname> or <tagname/>\n const tagPattern =\n /^<(\\/?)([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[a-zA-Z][a-zA-Z0-9-]*(?:=(?:\"[^\"]*\"|'[^']*'|[^\\s>]*))?)*)\\s*(\\/?)>/;\n const remaining = input.slice(tagStart);\n const match = remaining.match(tagPattern);\n\n if (!match) {\n // Not a valid tag, skip this '<' and try again\n if (tagStart + 1 < input.length) {\n return this.matchTag(input, tagStart + 1);\n }\n return null;\n }\n\n const [fullMatch, closingSlash, tagName, attrsString, selfClosingSlash] =\n match;\n\n return {\n tag: tagName,\n attrs: this.parseAttributes(attrsString),\n isClosing: closingSlash === '/',\n isSelfClosing: selfClosingSlash === '/',\n startIndex: tagStart,\n endIndex: tagStart + fullMatch.length,\n };\n }\n\n /**\n * Parse HTML attributes string into key-value pairs\n */\n private parseAttributes(attrsString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n if (!attrsString.trim()) return attrs;\n\n // Match attribute patterns: name=\"value\" or name='value' or name=value or name\n const attrPattern = /([a-zA-Z][a-zA-Z0-9-]*)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]*)))?/g;\n let match;\n\n while ((match = attrPattern.exec(attrsString)) !== null) {\n const [, name, doubleQuoted, singleQuoted, unquoted] = match;\n const value = doubleQuoted ?? singleQuoted ?? unquoted ?? '';\n attrs[name.toLowerCase()] = value;\n }\n\n return attrs;\n }\n\n /**\n * Find matching opening tag in the stack\n */\n private findMatchingOpenTag(\n stack: Array<{ tag: string; index: number }>,\n tagName: string\n ): number | null {\n // Search from end of stack (most recent)\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i].tag === tagName) {\n return stack[i].index;\n }\n }\n return null;\n }\n\n /**\n * Find the closing tag index for a given opening tag\n */\n private findClosingTagIndex(\n input: string,\n startPos: number,\n tagName: string\n ): number {\n const lowerTag = tagName.toLowerCase();\n let depth = 1;\n let pos = startPos;\n\n while (pos < input.length && depth > 0) {\n const tagMatch = this.matchTag(input, pos);\n if (!tagMatch) break;\n\n if (tagMatch.tag.toLowerCase() === lowerTag) {\n if (tagMatch.isClosing) {\n depth--;\n if (depth === 0) {\n return tagMatch.startIndex;\n }\n } else if (!tagMatch.isSelfClosing) {\n depth++;\n }\n }\n\n pos = tagMatch.endIndex;\n }\n\n return -1;\n }\n}\n", "/**\n * HTML serializer for converting ContentUnit to HTML strings\n * @module content/serializer/HTMLSerializer\n */\n\nimport type { ISerializer } from './ISerializer.js';\nimport type { ContentUnit } from '../types.js';\nimport type { IStyleMapper } from '../style-mapper/IStyleMapper.js';\nimport { DefaultStyleMapper } from '../style-mapper/DefaultStyleMapper.js';\n\n/**\n * Configuration options for HTMLSerializer\n */\nexport interface HTMLSerializerOptions {\n /**\n * Custom style mapper for styles \u2192 element conversion\n * Defaults to DefaultStyleMapper\n */\n styleMapper?: IStyleMapper;\n}\n\n/**\n * Serializer that converts ContentUnit format back to HTML strings\n *\n * Transforms indexed tags and style mappings into HTML:\n * - `<1>bold</1>` with styles `{\"1\": [\"bold\"]}` \u2192 `<b>bold</b>`\n * - `<1>link</1>` with styles `{\"1\": [\"hyperlink:/url\"]}` \u2192 `<a href=\"/url\">link</a>`\n *\n * @example\n * ```typescript\n * const serializer = new HTMLSerializer();\n *\n * const html = serializer.serialize({\n * text: 'Read our <1>Terms</1>.',\n * styles: { '1': ['bold'] }\n * });\n * // \u2192 \"Read our <b>Terms</b>.\"\n *\n * const link = serializer.serialize({\n * text: 'Click <1>here</1>.',\n * styles: { '1': ['hyperlink:/url'] }\n * });\n * // \u2192 \"Click <a href=\\\"/url\\\">here</a>.\"\n * ```\n */\nexport class HTMLSerializer implements ISerializer<string> {\n private readonly styleMapper: IStyleMapper;\n\n constructor(options: HTMLSerializerOptions = {}) {\n this.styleMapper = options.styleMapper ?? new DefaultStyleMapper();\n }\n\n /**\n * Serialize ContentUnit to HTML string\n *\n * @param unit - ContentUnit with indexed tags and styles\n * @returns HTML string with semantic elements\n */\n serialize(unit: ContentUnit): string {\n const { text, styles } = unit;\n\n // Pattern to match indexed tags: <1>, </1>, <1/>\n const tagPattern = /<(\\/?)?(\\d+)(\\/)?>/g;\n\n let result = '';\n let lastIndex = 0;\n let match;\n\n while ((match = tagPattern.exec(text)) !== null) {\n // Append text before the tag\n result += text.slice(lastIndex, match.index);\n\n const [fullMatch, closingSlash, indexStr, selfClosingSlash] = match;\n const tagIndex = indexStr;\n const styleList = styles[tagIndex] || [];\n\n if (closingSlash) {\n // Closing tag: </1>\n const mapping = this.styleMapper.mapStylesToElement(styleList);\n result += `</${mapping.element}>`;\n } else if (selfClosingSlash) {\n // Self-closing tag: <1/>\n const mapping = this.styleMapper.mapStylesToElement(styleList);\n const attrs = this.formatAttributes(mapping.attrs);\n result += `<${mapping.element}${attrs} />`;\n } else {\n // Opening tag: <1>\n const mapping = this.styleMapper.mapStylesToElement(styleList);\n const attrs = this.formatAttributes(mapping.attrs);\n result += `<${mapping.element}${attrs}>`;\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n // Append remaining text\n result += text.slice(lastIndex);\n\n return result;\n }\n\n /**\n * Format attributes object into HTML attribute string\n */\n private formatAttributes(attrs: Record<string, string>): string {\n const entries = Object.entries(attrs);\n if (entries.length === 0) return '';\n\n return (\n ' ' +\n entries\n .map(([key, value]) => `${key}=\"${this.escapeAttributeValue(value)}\"`)\n .join(' ')\n );\n }\n\n /**\n * Escape special characters in attribute values\n */\n private escapeAttributeValue(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n }\n}\n", "/**\n * CacheManager - TanStack Query-inspired cache management\n *\n * Provides unified cache invalidation and optimistic update patterns.\n */\n\nimport type { EventEmitter } from '../base/event-emitter.js';\nimport type { HandlerChain } from '../handlers/handler-chain.js';\n\n/**\n * Options for cache invalidation (like TanStack's invalidateQueries)\n */\nexport interface InvalidateOptions {\n /** Invalidate by namespace */\n namespace?: string;\n /** Invalidate by locale */\n locale?: string;\n /** Invalidate specific key */\n key?: string;\n /** Custom predicate filter */\n predicate?: (key: string) => boolean;\n /** Whether to refetch after invalidation (default: true) */\n refetch?: boolean;\n}\n\n/**\n * Cached translation entry\n */\nexport interface CacheEntry {\n value: string;\n styles?: Record<string, string[]>;\n}\n\n/**\n * Cache event payloads\n */\nexport interface CacheEventPayloads {\n 'cache:invalidate': {\n filter: InvalidateOptions;\n keysCleared: number;\n refetch: boolean;\n };\n 'cache:set': {\n key: string;\n value: string;\n styles?: Record<string, string[]>;\n optimistic: boolean;\n };\n 'cache:rollback': {\n key: string;\n reason: string;\n };\n}\n\n/**\n * CacheManager - Unified cache API inspired by TanStack Query\n *\n * @example\n * ```typescript\n * // Invalidate by namespace\n * await i18n.cache.invalidate({ namespace: 'app' });\n *\n * // Optimistic update\n * const previous = i18n.cache.get('en:app:welcome');\n * i18n.cache.set('en:app:welcome', 'New value');\n * // ... if error, rollback:\n * i18n.cache.set('en:app:welcome', previous.value);\n * ```\n */\nexport class CacheManager {\n private handlerChain: HandlerChain;\n private bus: EventEmitter;\n private currentLocale: () => string;\n private loadNamespaces: (locale: string, namespaces: string[]) => Promise<void>;\n\n constructor(\n handlerChain: HandlerChain,\n bus: EventEmitter,\n getCurrentLocale: () => string,\n loadNamespaces: (locale: string, namespaces: string[]) => Promise<void>\n ) {\n this.handlerChain = handlerChain;\n this.bus = bus;\n this.currentLocale = getCurrentLocale;\n this.loadNamespaces = loadNamespaces;\n }\n\n /**\n * Get a cached translation entry\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @returns Cache entry with value and styles, or null if not found\n */\n get(key: string): CacheEntry | null {\n const entries = this.handlerChain.getEntries();\n\n // Search through all handler entries\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n if (key in handlerEntries) {\n const rawValue = handlerEntries[key];\n\n // Parse ContentUnit JSON (stored as { text, styles })\n try {\n if (typeof rawValue === 'string') {\n const parsed = JSON.parse(rawValue);\n if (typeof parsed === 'object' && 'text' in parsed) {\n return {\n value: String(parsed.text),\n styles: parsed.styles || undefined,\n };\n }\n // Legacy plain string\n return { value: rawValue, styles: undefined };\n }\n // Already an object\n return {\n value: JSON.stringify(rawValue),\n styles: undefined,\n };\n } catch {\n // If parse fails, treat as plain string\n return {\n value: typeof rawValue === 'string' ? rawValue : JSON.stringify(rawValue),\n styles: undefined,\n };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Set a cache entry (for optimistic updates)\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @param value - Translation value\n * @param styles - Optional styles for indexed tags\n */\n set(key: string, value: string, styles?: Record<string, string[]>): void {\n // Parse the key to get locale, namespace, and translation key\n const [locale, namespace, ...keyParts] = key.split(':');\n const translationKey = keyParts.join(':');\n\n if (!locale || !namespace || !translationKey) {\n throw new Error(\n `Invalid cache key format: \"${key}\". Expected format: \"locale:namespace:key\"`\n );\n }\n\n // Use the handler chain's setCache method for optimistic updates\n this.handlerChain.setCache(key, value, styles);\n\n // Emit cache:set event\n this.bus.emit('cache:set', {\n payload: {\n key,\n value,\n styles,\n optimistic: true,\n },\n });\n }\n\n /**\n * Check if a key exists in cache\n *\n * @param key - Full cache key (e.g., 'en:app:welcome')\n * @returns true if key is cached\n */\n has(key: string): boolean {\n return this.get(key) !== null;\n }\n\n /**\n * Invalidate cache entries and optionally refetch\n *\n * Like TanStack Query's invalidateQueries, this clears matching cache entries\n * and triggers background refetch by default.\n *\n * @param options - Filter options for invalidation\n *\n * @example\n * ```typescript\n * // Invalidate all\n * await cache.invalidate();\n *\n * // Invalidate by namespace\n * await cache.invalidate({ namespace: 'app' });\n *\n * // Invalidate by locale\n * await cache.invalidate({ locale: 'es' });\n *\n * // Invalidate specific key\n * await cache.invalidate({ key: 'en:app:welcome' });\n *\n * // Invalidate with predicate\n * await cache.invalidate({ predicate: (k) => k.includes('common:') });\n *\n * // Invalidate without refetch\n * await cache.invalidate({ namespace: 'app', refetch: false });\n * ```\n */\n async invalidate(options: InvalidateOptions = {}): Promise<void> {\n const { namespace, locale, key, predicate, refetch = true } = options;\n const currentLocale = this.currentLocale();\n\n let keysCleared = 0;\n\n // Determine what to clear\n if (key) {\n // Clear specific key\n const [keyLocale, keyNamespace] = key.split(':');\n if (keyLocale && keyNamespace) {\n this.handlerChain.clearNamespace(keyLocale, keyNamespace);\n keysCleared = 1;\n }\n } else if (namespace && locale) {\n // Clear specific locale + namespace\n this.handlerChain.clearNamespace(locale, namespace);\n keysCleared = this.countClearedKeys(locale, namespace);\n } else if (namespace) {\n // Clear namespace for current locale\n this.handlerChain.clearNamespace(currentLocale, namespace);\n keysCleared = this.countClearedKeys(currentLocale, namespace);\n } else if (locale) {\n // Clear all namespaces for a specific locale\n const entries = this.handlerChain.getEntries();\n const namespacesToClear = new Set<string>();\n\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n for (const entryKey of Object.keys(handlerEntries)) {\n if (entryKey.startsWith(`${locale}:`) || entryKey.startsWith(`@${locale}:`)) {\n const parts = entryKey.replace('@', '').split(':');\n if (parts[1]) {\n namespacesToClear.add(parts[1]);\n }\n }\n }\n }\n }\n\n for (const ns of namespacesToClear) {\n this.handlerChain.clearNamespace(locale, ns);\n keysCleared++;\n }\n } else if (predicate) {\n // Clear with custom predicate\n const entries = this.handlerChain.getEntries();\n const toClear = new Map<string, Set<string>>(); // locale -> namespaces\n\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n for (const entryKey of Object.keys(handlerEntries)) {\n if (predicate(entryKey)) {\n const parts = entryKey.replace('@', '').split(':');\n const entryLocale = parts[0];\n const entryNs = parts[1];\n if (entryLocale && entryNs) {\n if (!toClear.has(entryLocale)) {\n toClear.set(entryLocale, new Set());\n }\n toClear.get(entryLocale)!.add(entryNs);\n keysCleared++;\n }\n }\n }\n }\n }\n\n for (const [loc, namespaces] of toClear) {\n for (const ns of namespaces) {\n this.handlerChain.clearNamespace(loc, ns);\n }\n }\n } else {\n // Clear all\n this.handlerChain.clearCache();\n keysCleared = -1; // Indicates all cleared\n }\n\n // Emit invalidate event\n this.bus.emit('cache:invalidate', {\n payload: {\n filter: options,\n keysCleared,\n refetch,\n },\n });\n\n // Refetch if requested\n if (refetch) {\n await this.refetchAfterInvalidate(options);\n }\n }\n\n /**\n * Count keys that would be cleared (for event reporting)\n */\n private countClearedKeys(locale: string, namespace: string): number {\n const entries = this.handlerChain.getEntries();\n let count = 0;\n const prefix = `${locale}:${namespace}:`;\n const namespaceKey = `@${locale}:${namespace}`;\n\n for (const handlerName in entries) {\n const handlerEntries = entries[handlerName];\n if (handlerEntries && typeof handlerEntries === 'object') {\n for (const key of Object.keys(handlerEntries)) {\n if (key.startsWith(prefix) || key === namespaceKey) {\n count++;\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Refetch data after invalidation\n */\n private async refetchAfterInvalidate(options: InvalidateOptions): Promise<void> {\n const { namespace, locale, key } = options;\n const currentLocale = this.currentLocale();\n\n if (key) {\n // Refetch specific namespace from key\n const [keyLocale, keyNamespace] = key.split(':');\n if (keyLocale && keyNamespace) {\n await this.loadNamespaces(keyLocale, [keyNamespace]);\n }\n } else if (namespace) {\n // Refetch namespace for specific or current locale\n await this.loadNamespaces(locale || currentLocale, [namespace]);\n } else if (locale) {\n // For locale-wide invalidation, we can't easily know which namespaces to reload\n // The app will lazy-load them as needed\n }\n // For full cache clear, lazy loading will handle refetch\n }\n}\n", "/**\n * Enhanced LionRapid Core with event-based language change and smart caching\n * filepath: /home/janrau/tm-integration/packages/core/src/lionRapid.ts\n */\nimport { EventEmitter } from './base/event-emitter.js';\nimport { HandlerChain } from './handlers/handler-chain.js';\nimport type {\n FormatterFunction,\n IEmbeddedPlugin,\n IPlugin,\n ValueProcessor,\n} from './interfaces/plugin.interface.js';\nimport type { TranslationKeys } from './types/generated.types.js';\nimport type { TranslationRequest } from './types/translation.types.js';\nimport { logger, resolveNestedKey } from './utils/index.js';\nimport { prepareTranslationRequest } from './utils/translation-flow.js';\nimport { createNamespaceCacheKey } from './utils/translation-value-utils.js';\n\n// Content module imports for ContentUnit processing\nimport type { ContentUnit } from './content/types.js';\nimport { MarkupParser } from './content/parser/MarkupParser.js';\nimport { HTMLSerializer } from './content/serializer/HTMLSerializer.js';\n\n// Cache module\nimport { CacheManager } from './cache/CacheManager.js';\n\n/**\n * Regex to detect indexed tags in a string (from server ContentUnit)\n * Matches patterns like <1>, </1>, <2>, </2>, etc.\n */\nconst INDEXED_TAG_REGEX = /<\\/?[0-9]+>/;\n\n/**\n * Regex to detect HTML tags in a string\n * Matches patterns like <b>, <a href=\"...\">, <em>, etc.\n */\nconst HTML_TAG_REGEX = /<[a-z][a-z0-9]*(?:\\s+[^>]*)?\\/?>/i;\n\nexport class LionRapidCore {\n private handlerChain: HandlerChain;\n private currentLocale: string;\n private fallbackLocale: string;\n private defaultNamespace?: string;\n private pendingTranslations = new Map<string, Promise<void>>();\n bus: EventEmitter;\n\n private plugins = new Map<string, IPlugin>();\n\n // \uD83D\uDD25 EMBEDDED: Core integration maps\n private formatters = new Map<string, FormatterFunction>();\n private processors = new Map<string, ValueProcessor>();\n\n // \uD83D\uDCE1 EVENT-DRIVEN: Just track for cleanup\n private eventPlugins = new Set<IPlugin>();\n\n // \uD83D\uDCE6 CONTENT: Parser and serializer for ContentUnit processing\n private readonly markupParser = new MarkupParser();\n private readonly htmlSerializer = new HTMLSerializer();\n\n // \uD83D\uDD04 CACHE: TanStack Query-inspired cache management\n public readonly cache: CacheManager;\n\n constructor(\n eventEmitter: EventEmitter,\n handlerChain: HandlerChain,\n defaultLocale = 'en',\n fallbackLocale = 'en',\n defaultNamespace?: string\n ) {\n this.bus = eventEmitter;\n this.handlerChain = handlerChain;\n this.currentLocale = defaultLocale;\n this.fallbackLocale = fallbackLocale;\n this.defaultNamespace = defaultNamespace;\n\n // Initialize cache manager with dependencies\n this.cache = new CacheManager(\n this.handlerChain,\n this.bus,\n () => this.currentLocale,\n (locale, namespaces) => this.loadNamespaces(locale, namespaces)\n );\n }\n\n /**\n * \u2705 Register plugin (called by builder)\n */\n registerPlugin(plugin: IPlugin): void {\n this.plugins.set(plugin.name, plugin);\n\n // \uD83D\uDD25 EMBEDDED PLUGINS: Extract functionality for core integration\n if (this.isEmbeddedPlugin(plugin)) {\n this.integrateEmbeddedPlugin(plugin as IEmbeddedPlugin);\n }\n\n // \uD83D\uDCE1 EVENT-DRIVEN PLUGINS: Just track for cleanup\n if (this.isEventPlugin(plugin)) {\n this.eventPlugins.add(plugin);\n }\n }\n\n /**\n * \uD83D\uDD25 EMBEDDED: Integrate plugin functionality into core\n */\n private integrateEmbeddedPlugin(plugin: IEmbeddedPlugin): void {\n // Extract formatters\n if (plugin.getFormatters) {\n const pluginFormatters = plugin.getFormatters();\n Object.entries(pluginFormatters).forEach(([name, formatter]) => {\n this.formatters.set(name, formatter);\n logger.debug(`Embedded formatter: ${name} from ${plugin.name}`);\n });\n }\n\n // Extract processors\n if (plugin.getProcessors) {\n const pluginProcessors = plugin.getProcessors();\n Object.entries(pluginProcessors).forEach(([name, processor]) => {\n this.processors.set(name, processor);\n logger.debug(`Embedded processor: ${name} from ${plugin.name}`);\n });\n }\n }\n\n /**\n * \uD83D\uDCE6 TRANSLATION API - Returns PLAIN TEXT\n *\n * Strips indexed tags and returns safe plain text output.\n * For HTML output with styles, use tHtml() instead.\n *\n * @param key - Translation key\n * @param params - Optional interpolation parameters\n * @param defaultValue - Optional default value\n * @returns Plain text string (safe, no XSS risk)\n *\n * @example\n * ```typescript\n * t('welcome') // \u2192 \"Hello World\"\n * t('greeting', { name: 'John' }) // \u2192 \"Hello John\"\n * t('missing', 'Default text') // \u2192 \"Default text\" (if key missing)\n * ```\n */\n t<K extends string>(\n key: K,\n ...args: K extends keyof TranslationKeys\n ? TranslationKeys[K] extends Record<string, never>\n ? [defaultValue?: string]\n : [params: TranslationKeys[K], defaultValue?: string]\n : [params?: Record<string, unknown>, defaultValue?: string]\n ): string {\n const [firstArg, secondArg] = args;\n\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n firstArg as string | Record<string, unknown> | undefined,\n secondArg as Record<string, unknown> | string | undefined,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n // Emit request event\n logger.debug(`Translation requested: ${request.cleanKey}`);\n const translateBus = this.bus.translation(request);\n translateBus.request();\n\n // Try memory cache (sync)\n const syncResult = this.handlerChain.handleSync(request);\n if (syncResult && syncResult.status === 200) {\n const result = this.processValue(syncResult.value, request);\n logger.debug(\n `Translation found: ${request.cleanKey} from ${syncResult.source} (${syncResult.duration}ms)`\n );\n translateBus.success(result);\n return result;\n }\n\n // Cache miss - trigger background load\n this.triggerBackgroundLoad(request);\n\n // Return fallback immediately\n const fallbackValue = request.parsedDefaultValue || request.cleanKey;\n const fallbackResult = this.processValue(fallbackValue, request);\n logger.debug(`Translation fallback: ${request.cleanKey}`);\n translateBus.fallback(fallbackResult);\n return fallbackResult;\n }\n\n /**\n * \uD83D\uDCE6 HTML TRANSLATION API\n * Returns translation as HTML string with styles applied.\n *\n * Use for innerHTML, dangerouslySetInnerHTML, or server-side rendering.\n * For React components, prefer using <Trans> instead.\n *\n * @param key - Translation key\n * @param params - Optional interpolation parameters\n * @param defaultValue - Optional default value (can contain HTML)\n * @returns HTML string with styles applied\n *\n * @example\n * ```typescript\n * // Vanilla JS\n * element.innerHTML = i18n.tHtml('welcome');\n * // \u2192 \"Hello <b>World</b>\"\n *\n * // React (use sparingly)\n * <span dangerouslySetInnerHTML={{ __html: tHtml('welcome') }} />\n * ```\n */\n tHtml<K extends string>(\n key: K,\n ...args: K extends keyof TranslationKeys\n ? TranslationKeys[K] extends Record<string, never>\n ? [defaultValue?: string]\n : [params: TranslationKeys[K], defaultValue?: string]\n : [params?: Record<string, unknown>, defaultValue?: string]\n ): string {\n // Pass arguments directly to prepareTranslationRequest\n // which handles the flexible parameter parsing\n const [firstArg, secondArg] = args;\n\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n firstArg as string | Record<string, unknown> | undefined,\n secondArg as Record<string, unknown> | string | undefined,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n // Emit request event\n logger.debug(`HTML translation requested: ${request.cleanKey}`);\n const translateBus = this.bus.translation(request);\n translateBus.request();\n\n // Try memory cache (sync) - result now includes styles\n const syncResult = this.handlerChain.handleSync(request);\n if (syncResult && syncResult.status === 200) {\n const result = this.processValueAsHtml(syncResult.value, request, syncResult.styles);\n logger.debug(\n `HTML translation found: ${request.cleanKey} from ${syncResult.source}`\n );\n translateBus.success(result);\n return result;\n }\n\n // Cache miss - trigger background load\n this.triggerBackgroundLoad(request);\n\n // Return fallback immediately (processed as HTML, no styles)\n const fallbackValue = request.parsedDefaultValue || request.cleanKey;\n const fallbackResult = this.processValueAsHtml(fallbackValue, request);\n logger.debug(`HTML translation fallback: ${request.cleanKey}`);\n translateBus.fallback(fallbackResult);\n return fallbackResult;\n }\n\n /**\n * \uD83D\uDCE6 Process value as HTML (for tHtml)\n *\n * Converts indexed tags to HTML using styles from result or namespace cache.\n *\n * @internal\n */\n private processValueAsHtml(\n value: string,\n request: TranslationRequest,\n resultStyles?: Record<string, string[]>\n ): string {\n // Process ICU first\n const processedText = this.processTranslationValue(value, request);\n\n // Check for indexed tags (from server ContentUnit)\n if (this.containsIndexedTags(processedText)) {\n // Use styles from result, or fall back to namespace lookup\n const styles = resultStyles || this.getStylesFromNamespace(request);\n const unit: ContentUnit = {\n text: processedText,\n styles,\n };\n return this.htmlSerializer.serialize(unit);\n }\n\n // Check for HTML in defaultValue\n if (this.containsHtml(processedText)) {\n const unit = this.markupParser.parse(processedText);\n return this.htmlSerializer.serialize(unit);\n }\n\n // Plain text - return as-is\n return processedText;\n }\n\n /**\n * \uD83D\uDCE6 Process a value through ContentUnit or ICU pipeline\n *\n * Processing priority:\n * 1. Indexed tags (<1>...</1>) from server ContentUnit \u2192 convert to HTML at render time\n * 2. HTML tags (from defaultValue or legacy) \u2192 MarkupParser \u2192 ContentUnit \u2192 HTML\n * 3. Plain text \u2192 standard ICU processing\n *\n * @internal\n */\n private processValue(value: string, request: TranslationRequest): string {\n // Priority 1: Check for indexed tags (from server ContentUnit)\n // These need to be converted to HTML using the stored styles\n if (this.containsIndexedTags(value)) {\n return this.processIndexedValue(value, request);\n }\n\n // Priority 2: Auto-detect HTML and process through ContentUnit if found\n if (this.containsHtml(value)) {\n return this.processHtmlValue(value, request);\n }\n\n // Priority 3: Standard ICU processing for plain text\n return this.processTranslationValue(value, request);\n }\n\n /**\n * \uD83D\uDCE6 Check if a string contains indexed tags\n *\n * Used for auto-detection of server ContentUnit format.\n *\n * @param value - String to check\n * @returns true if indexed tags are detected\n */\n private containsIndexedTags(value: string): boolean {\n return INDEXED_TAG_REGEX.test(value);\n }\n\n /**\n * \uD83D\uDCE6 Process indexed value - returns PLAIN TEXT\n *\n * Strips indexed tags (<1>text</1>) \u2192 \"text\"\n * For HTML output, use tHtml() instead.\n *\n * @internal\n */\n private processIndexedValue(\n value: string,\n request: TranslationRequest\n ): string {\n // 1. Process ICU first (with indexed tags intact)\n const processedText = this.processTranslationValue(value, request);\n\n // 2. Strip indexed tags - t() returns plain text\n return processedText.replace(/<\\/?[0-9]+>/g, '');\n }\n\n /**\n * \uD83D\uDCE6 Get styles for a translation key from namespace cache (fallback)\n *\n * Used when styles are not available in the result (e.g., for fallback values).\n * Looks up the full ContentUnit from the namespace cache to get styles.\n *\n * @internal\n */\n private getStylesFromNamespace(\n request: TranslationRequest\n ): Record<string, string[]> {\n if (!request.namespace) {\n return {};\n }\n\n try {\n // Get namespace cache key: @locale:namespace\n const namespaceCacheKey = createNamespaceCacheKey(\n request.locale,\n request.namespace\n );\n\n // Get namespace data from handler chain\n const namespaceData = this.handlerChain.getNamespaceData(namespaceCacheKey);\n if (!namespaceData) {\n return {};\n }\n\n // Resolve the content unit for this key (server always returns ContentUnit format)\n const resolved = resolveNestedKey(namespaceData, request.cleanKey);\n\n if (resolved && typeof resolved === 'object' && 'styles' in resolved) {\n const contentUnit = resolved as ContentUnit;\n return contentUnit.styles;\n }\n\n return {};\n } catch (error) {\n logger.debug(`Error getting styles for key ${request.cleanKey}:`, error);\n return {};\n }\n }\n\n /**\n * \uD83D\uDCE6 Process HTML value - returns PLAIN TEXT\n *\n * Parses HTML to ContentUnit, processes ICU, strips indexed tags.\n * For HTML output, use tHtml() instead.\n *\n * @internal\n */\n private processHtmlValue(value: string, request: TranslationRequest): string {\n try {\n // 1. Parse HTML to ContentUnit (converts HTML tags to indexed format)\n const unit = this.markupParser.parse(value);\n\n // 2. Process ICU expressions in the text\n const processedText = this.processTranslationValue(unit.text, request);\n\n // 3. Strip indexed tags - t() returns plain text\n return processedText.replace(/<\\/?[0-9]+>/g, '');\n } catch (error) {\n logger.warn(`ContentUnit processing failed for \"${value}\":`, error);\n // Fallback to standard processing\n return this.processTranslationValue(value, request);\n }\n }\n\n /**\n * \u2705 Process translation value through embedded plugins\n *\n * Public overload for Trans component usage (simple API)\n */\n public processTranslationValue(\n value: string,\n params?: Record<string, unknown>,\n locale?: string,\n key?: string\n ): string;\n\n /**\n * Internal overload (with full TranslationRequest for t() method)\n */\n public processTranslationValue(\n value: string,\n request: TranslationRequest\n ): string;\n\n /**\n * Implementation (handles both overloads)\n */\n public processTranslationValue(\n value: string,\n paramsOrRequest?: Record<string, unknown> | TranslationRequest,\n locale?: string,\n key?: string\n ): string {\n // Determine which overload was called\n let params: Record<string, unknown> | undefined;\n let resolvedLocale: string;\n let resolvedKey: string | undefined;\n\n if (paramsOrRequest && 'cleanKey' in paramsOrRequest) {\n // Internal overload: TranslationRequest\n const request = paramsOrRequest as TranslationRequest;\n params = request.parsedParams;\n resolvedLocale = request.locale;\n resolvedKey = request.cleanKey;\n } else {\n // Public overload: simple parameters\n params = paramsOrRequest as Record<string, unknown> | undefined;\n resolvedLocale = locale || this.currentLocale;\n resolvedKey = key;\n }\n\n let processedValue = value;\n\n try {\n // \u2705 Step 1: Handle structured translation data (plurals, context variations)\n processedValue = this.applyStructuralFormatters(\n processedValue,\n params,\n resolvedKey\n );\n\n // \u2705 Step 2: Apply interpolation through embedded formatter plugin\n // ICU messages need processing even without params (for 'other' defaults)\n if (this.formatters.has('interpolate')) {\n const interpolateFormatter = this.formatters.get('interpolate')!;\n processedValue = interpolateFormatter(\n processedValue,\n params,\n resolvedLocale,\n resolvedKey\n );\n }\n\n // \u2705 Step 3: Apply value processors (escaping, sanitization, etc.)\n if (this.processors.size > 0) {\n for (const [name, processor] of this.processors.entries()) {\n try {\n processedValue = processor(processedValue, params, resolvedKey);\n } catch (error) {\n logger.warn(`Processor ${name} failed:`, error);\n }\n }\n }\n\n return processedValue;\n } catch (error) {\n logger.warn(`Translation processing failed for \"${value}\":`, error);\n return value;\n }\n }\n\n /**\n * \uD83D\uDCE6 CONTENT UNIT API\n * Returns translation as ContentUnit for JSX rendering (Trans component)\n *\n * This is the preferred method for components that need to render\n * styled content with JSX interpolation.\n *\n * @param key - Translation key\n * @param params - Optional interpolation parameters\n * @param defaultValue - Optional default value (can contain HTML)\n * @returns ContentUnit with indexed tags and styles\n *\n * @example\n * ```typescript\n * const unit = i18n.getContentUnit('terms', {}, 'Read our <b>Terms</b>.');\n * // \u2192 { text: \"Read our <1>Terms</1>.\", styles: {\"1\": [\"bold\"]} }\n * ```\n */\n getContentUnit(\n key: string,\n params?: Record<string, unknown>,\n defaultValue?: string\n ): ContentUnit {\n // Get translation value (ICU processing done separately per segment)\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n params,\n defaultValue,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n // Try memory cache\n const syncResult = this.handlerChain.handleSync(request);\n const rawValue =\n syncResult && syncResult.status === 200\n ? syncResult.value\n : request.parsedDefaultValue || request.cleanKey;\n\n // If no translation found, trigger background load\n if (!syncResult || syncResult.status !== 200) {\n this.triggerBackgroundLoad(request);\n }\n\n // Parse HTML to ContentUnit\n return this.markupParser.parse(rawValue);\n }\n\n /**\n * \uD83D\uDCE6 Process ContentUnit text through ICU formatters\n *\n * Used by JSX serializers to process individual text segments.\n *\n * @param text - Text segment (may contain ICU expressions like {name})\n * @param params - Interpolation parameters\n * @returns Processed text with ICU expressions resolved\n */\n processContentText(text: string, params?: Record<string, unknown>): string {\n return this.processTranslationValue(text, params, this.currentLocale);\n }\n\n /**\n * \uD83D\uDCE6 Check if a string contains HTML tags\n *\n * Used for auto-detection of HTML in default values.\n *\n * @param value - String to check\n * @returns true if HTML tags are detected\n */\n containsHtml(value: string): boolean {\n return HTML_TAG_REGEX.test(value);\n }\n\n /**\n * \u2705 Handle structured formatters (plural, context) - embedded in core\n */\n private applyStructuralFormatters(\n value: string,\n params?: Record<string, unknown>,\n translationKey?: string\n ): string {\n const translationData: string = value;\n\n // Type guard for params having a count property\n const hasCount = (\n p: Record<string, unknown> | undefined\n ): p is { count: number } => typeof p?.count === 'number';\n\n // Type guard for params having a context property\n const hasContext = (\n p: Record<string, unknown> | undefined\n ): p is { context: string } => typeof p?.context === 'string';\n\n // Apply plural formatter if available and applicable\n if (this.formatters.has('plural') && hasCount(params)) {\n const pluralFormatter = this.formatters.get('plural')!;\n try {\n const pluralResult = pluralFormatter(\n translationData,\n params,\n this.currentLocale,\n translationKey\n );\n if (pluralResult !== String(translationData)) {\n return pluralResult;\n }\n } catch (error) {\n logger.warn('Plural formatting failed:', error);\n }\n }\n\n // Apply context formatter if available and applicable\n if (this.formatters.has('context') && hasContext(params)) {\n const contextFormatter = this.formatters.get('context')!;\n try {\n const contextResult = contextFormatter(\n translationData,\n params,\n this.currentLocale,\n translationKey\n );\n if (contextResult !== String(translationData)) {\n return contextResult;\n }\n } catch (error) {\n logger.warn('Context formatting failed:', error);\n }\n }\n\n return String(translationData);\n }\n\n /**\n * Trigger background load via handler chain\n */\n private triggerBackgroundLoad(request: TranslationRequest): void {\n logger.debug(`Background load: ${request.cleanKey}`);\n const cacheKey = request.individualCacheKey;\n\n if (!this.pendingTranslations.has(cacheKey)) {\n const promise = this.handlerChain\n .handleAsync(request)\n .then(result => {\n if (result && result.value) {\n logger.debug(`Cached: ${request.cleanKey} = \"${result.value}\"`);\n } else {\n logger.debug(`Not found: ${request.cleanKey}`);\n }\n })\n .catch(error => {\n logger.warn(`Background load failed: ${request.cleanKey}`, error);\n });\n\n this.pendingTranslations.set(cacheKey, promise);\n promise.finally(() => this.pendingTranslations.delete(cacheKey));\n }\n }\n\n /**\n * Get the current locale\n */\n getCurrentLocale(): string {\n return this.currentLocale;\n }\n\n /**\n * Set default namespace (useful for scoped translations)\n */\n setDefaultNamespace(namespace?: string): void {\n this.defaultNamespace = namespace;\n }\n\n /**\n * Get current default namespace\n */\n getDefaultNamespace(): string | undefined {\n return this.defaultNamespace;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries(): Record<string, any> {\n return this.handlerChain.getEntries();\n }\n\n isCached(key: string): boolean {\n const request = prepareTranslationRequest(\n key,\n this.currentLocale,\n undefined,\n undefined,\n this.defaultNamespace,\n this.fallbackLocale\n );\n\n return this.handlerChain.isCached(request);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getHandlerChainInfo(): any {\n return this.handlerChain.getChainInfo();\n }\n\n /**\n * \u2705 Smart language change with selective cache clearing\n */\n async changeLanguage(\n newLocale: string,\n options?: {\n clear?: boolean;\n preloadNamespaces?: string[];\n }\n ): Promise<void> {\n const oldLocale = this.currentLocale;\n\n if (oldLocale === newLocale) {\n logger.debug(`Language already set to ${newLocale}`);\n return;\n }\n\n const clear = options?.clear || false;\n const languageBus = this.bus.language(oldLocale, newLocale);\n\n try {\n logger.info(`Language change: ${oldLocale} \u2192 ${newLocale}`);\n logger.debug('Language change options', {\n clear,\n preloadNamespaces: options?.preloadNamespaces,\n });\n\n languageBus.start();\n\n this.currentLocale = newLocale;\n\n if (clear) {\n await this.clearCache();\n this.clearOldLocalePendingTranslations(oldLocale);\n }\n\n if (options?.preloadNamespaces?.length) {\n await this.loadNamespaces(newLocale, options.preloadNamespaces);\n }\n\n languageBus.complete();\n\n logger.info(`Language changed: ${newLocale}`);\n } catch (error) {\n logger.error('Language change failed:', error);\n languageBus.error(error as Error);\n throw error;\n }\n }\n\n private async clearCache(): Promise<void> {\n this.handlerChain.clearCache();\n logger.debug(`Cache cleared for locale: ${this.currentLocale}`);\n }\n\n private clearOldLocalePendingTranslations(oldLocale: string): void {\n let clearedCount = 0;\n\n for (const key of this.pendingTranslations.keys()) {\n if (key.includes(`${oldLocale}:`)) {\n this.pendingTranslations.delete(key);\n clearedCount++;\n }\n }\n\n if (clearedCount > 0) {\n logger.debug(\n `Cleared ${clearedCount} pending translations for ${oldLocale}`\n );\n }\n }\n\n private async loadNamespaces(\n locale: string,\n namespaces: string[]\n ): Promise<void> {\n logger.debug(`Preloading ${namespaces.length} namespaces for ${locale}`);\n\n const preloadPromises = namespaces.map(async namespace => {\n try {\n await this.handlerChain.loadNamespace?.(locale, namespace);\n logger.debug(`Preloaded: ${locale}:${namespace}`);\n } catch (error) {\n logger.warn(`Failed to preload ${locale}:${namespace}:`, error);\n }\n });\n\n await Promise.allSettled(preloadPromises);\n }\n\n /**\n * Reload a namespace by clearing cache and fetching fresh data from server\n * Useful after syncing new translations to ensure fresh data\n *\n * @param namespace - The namespace to reload\n * @param locale - Optional locale (defaults to current locale)\n * @deprecated Use cache.invalidate({ namespace, refetch: true }) instead\n */\n async reloadNamespace(namespace: string, locale?: string): Promise<void> {\n const targetLocale = locale || this.currentLocale;\n logger.debug(`Reloading namespace: ${targetLocale}:${namespace}`);\n\n // Delegate to cache manager\n await this.cache.invalidate({\n namespace,\n locale: targetLocale,\n refetch: true,\n });\n\n logger.info(`Namespace reloaded: ${targetLocale}:${namespace}`);\n }\n\n // Helper methods\n private isEmbeddedPlugin(plugin: IPlugin): boolean {\n return plugin.capabilities.some(cap =>\n ['formatters', 'processors', 'pluralization', 'context'].includes(cap)\n );\n }\n\n private isEventPlugin(plugin: IPlugin): boolean {\n return plugin.capabilities.some(cap =>\n [\n 'analytics',\n 'logging',\n 'react',\n 'validation',\n 'dev-tools',\n 'monitoring',\n ].includes(cap)\n );\n }\n}\n", "/**\n * Queue for batching and syncing missing translations to the backend\n * Uses debouncing (500ms default) and batching (50 items default)\n */\n\nimport type { EventEmitter } from '../base/event-emitter.js';\nimport type { IAsyncRepository } from '../interfaces/repository.interface.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface MissingTranslationItem {\n key: string;\n fallbackValue: string;\n styles?: Record<string, string[]>;\n locale: string;\n namespace: string;\n}\n\nexport interface MissingTranslationQueueConfig {\n enabled: boolean;\n debounceMs: number;\n batchSize: number;\n}\n\nconst COOLDOWN_MS = 60_000; // 60s cooldown before re-syncing same key\n\nexport class MissingTranslationQueue {\n private queue: Map<string, MissingTranslationItem> = new Map();\n private debounceTimer: NodeJS.Timeout | null = null;\n private repository: IAsyncRepository;\n private config: MissingTranslationQueueConfig;\n private eventEmitter: EventEmitter | null;\n private recentlySynced: Map<string, number> = new Map();\n\n constructor(\n repository: IAsyncRepository,\n config: MissingTranslationQueueConfig,\n eventEmitter?: EventEmitter\n ) {\n this.repository = repository;\n this.config = config;\n this.eventEmitter = eventEmitter ?? null;\n\n if (!config.enabled) {\n logger.debug('MissingTranslationQueue is disabled');\n } else {\n logger.debug(\n `MissingTranslationQueue: debounce=${config.debounceMs}ms, batchSize=${config.batchSize}`\n );\n }\n }\n\n /**\n * Add a missing translation to the queue\n * Triggers debounce timer or immediate flush if batch size reached\n */\n add(item: MissingTranslationItem): void {\n if (!this.config.enabled) return;\n\n // Use individual cache key format: locale:namespace:key\n const cacheKey = `${item.locale}:${item.namespace}:${item.key}`;\n\n // Skip keys synced within cooldown period (prevents re-sync loops)\n const syncedAt = this.recentlySynced.get(cacheKey);\n if (syncedAt && Date.now() - syncedAt < COOLDOWN_MS) {\n logger.debug(`Skipping recently synced key: ${cacheKey}`);\n return;\n }\n\n // Add to queue (overwrites if already exists)\n this.queue.set(cacheKey, item);\n\n logger.debug(\n `Missing translation queued: ${cacheKey} (queue size: ${this.queue.size})`\n );\n\n // Clear existing timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n // Check if batch size limit reached\n if (this.queue.size >= this.config.batchSize) {\n logger.debug(`Batch size reached (${this.config.batchSize}), flushing`);\n this.flush();\n return;\n }\n\n // Start new debounce timer\n this.debounceTimer = setTimeout(() => {\n this.flush();\n }, this.config.debounceMs);\n }\n\n /**\n * Flush the queue - send all queued items to the backend\n * Fire-and-forget pattern (async but not awaited)\n */\n flush(): void {\n if (this.queue.size === 0) return;\n\n // Clean up expired cooldown entries\n const now = Date.now();\n for (const [key, ts] of this.recentlySynced) {\n if (now - ts >= COOLDOWN_MS) this.recentlySynced.delete(key);\n }\n\n // Convert queue to array, preserving styles\n const batch = Array.from(this.queue.entries()).map(([cacheKey, item]) => ({\n key: cacheKey,\n value: item.fallbackValue,\n styles: item.styles,\n }));\n\n const batchSize = batch.length;\n\n // Clear queue\n this.queue.clear();\n\n // Clear timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n logger.debug(`Flushing ${batchSize} missing translations`);\n\n // Fire-and-forget sync (no await)\n this.syncBatch(batch).catch(error => {\n logger.warn(`Failed to sync ${batchSize} missing translations:`, error);\n });\n }\n\n /**\n * Send batch to backend via repository\n * Uses repository's retry logic from makeRequest()\n */\n private async syncBatch(\n batch: Array<{ key: string; value: string; styles?: Record<string, string[]> }>\n ): Promise<void> {\n try {\n // Use setBatchContentUnits when any item has styles\n const hasStyles = batch.some(item => item.styles && Object.keys(item.styles).length > 0);\n\n if (hasStyles && 'setBatchContentUnits' in this.repository) {\n const contentUnitBatch = batch.map(item => ({\n key: item.key,\n value: { text: item.value, styles: item.styles ?? {} },\n }));\n await (\n this.repository as IAsyncRepository & {\n setBatchContentUnits: (\n items: Array<{ key: string; value: { text: string; styles: Record<string, string[]> } }>\n ) => Promise<void>;\n }\n ).setBatchContentUnits(contentUnitBatch);\n logger.debug(`Synced ${batch.length} missing translations (ContentUnit)`);\n } else if ('setBatch' in this.repository) {\n // Plain string batch (no styles)\n const plainBatch = batch.map(item => ({ key: item.key, value: item.value }));\n await (\n this.repository as IAsyncRepository & {\n setBatch: (\n items: Array<{ key: string; value: string }>\n ) => Promise<void>;\n }\n ).setBatch(plainBatch);\n logger.debug(`Synced ${batch.length} missing translations`);\n } else {\n // Fallback: sync individually (parallel)\n logger.warn(\n 'Repository does not support setBatch, syncing individually'\n );\n await this.syncIndividually(batch);\n }\n // Record synced keys for cooldown\n const now = Date.now();\n const syncedKeys: string[] = [];\n for (const item of batch) {\n this.recentlySynced.set(item.key, now);\n syncedKeys.push(item.key);\n }\n\n // Emit sync:batch:complete event\n if (this.eventEmitter) {\n this.eventEmitter.emit('sync:batch:complete', {\n payload: { count: batch.length, keys: syncedKeys },\n });\n }\n } catch (error) {\n logger.error('Batch sync failed:', error);\n throw error;\n }\n }\n\n /**\n * Fallback: sync items individually in parallel\n */\n private async syncIndividually(\n batch: Array<{ key: string; value: string }>\n ): Promise<void> {\n const syncPromises = batch.map(async item => {\n try {\n await this.repository.set(item.key, item.value);\n logger.debug(`Synced: ${item.key}`);\n } catch (error) {\n logger.warn(`Failed to sync ${item.key}:`, error);\n }\n });\n\n await Promise.allSettled(syncPromises);\n }\n\n /**\n * Get current queue size (for debugging)\n */\n getQueueSize(): number {\n return this.queue.size;\n }\n\n /**\n * Get queue stats (for debugging)\n */\n getStats(): {\n queueSize: number;\n enabled: boolean;\n debounceMs: number;\n batchSize: number;\n } {\n return {\n queueSize: this.queue.size,\n enabled: this.config.enabled,\n debounceMs: this.config.debounceMs,\n batchSize: this.config.batchSize,\n };\n }\n\n /**\n * Cleanup - clear timer and queue\n */\n destroy(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n // Discard to avoid blocking during shutdown\n this.queue.clear();\n this.recentlySynced.clear();\n\n logger.debug('MissingTranslationQueue destroyed');\n }\n}\n", "/**\n * LionRapid Builder - Enhanced with explicit namespace preloading\n */\n\nimport { EventEmitter } from './base/event-emitter.js';\nimport type { LionRapidCoreConfig } from './config/lionrapid.config.js';\nimport type { NetworkRepositoryConfig } from './config/repository.config.js';\nimport { HandlerChain } from './handlers/handler-chain.js';\nimport { AsyncHandler, NetworkHandler, SyncHandler } from './handlers/index.js';\nimport type {\n IEmbeddedPlugin,\n IPlugin,\n} from './interfaces/plugin.interface.js';\nimport {\n IAsyncRepository,\n ISyncRepository,\n} from './interfaces/repository.interface.js';\nimport { LionRapidCore } from './lionRapid.js';\nimport { MissingTranslationQueue } from './sync/missing-translation-queue.js';\nimport { logger } from './utils/logger.js';\n\nexport class LionRapidBuilder {\n private config: LionRapidCoreConfig;\n private plugins: IPlugin[] = [];\n private syncStorageRepos: ISyncRepository[] = [];\n private asyncStorageRepos: IAsyncRepository[] = [];\n private networkRepos: IAsyncRepository[] = [];\n private syncQueue: MissingTranslationQueue | null = null;\n\n constructor(config: LionRapidCoreConfig) {\n this.config = {\n defaultLocale: config.defaultLocale || 'en',\n fallbackLocale: config.fallbackLocale || 'en',\n namespace: config.namespace || 'app',\n };\n }\n\n static init(config: LionRapidCoreConfig = {}): LionRapidBuilder {\n return new LionRapidBuilder(config);\n }\n\n private useSyncStorage(memory: ISyncRepository): LionRapidBuilder {\n this.syncStorageRepos.push(memory);\n return this;\n }\n\n private useAsyncStorage(storage: IAsyncRepository): LionRapidBuilder {\n this.asyncStorageRepos.push(storage);\n return this;\n }\n\n private useNetwork(network: IAsyncRepository): LionRapidBuilder {\n this.networkRepos.push(network);\n return this;\n }\n\n use(\n instance: IPlugin | IEmbeddedPlugin | ISyncRepository | IAsyncRepository\n ): LionRapidBuilder {\n switch (instance.type) {\n case 'plugin':\n this.plugins.push(instance);\n break;\n case 'memory':\n this.useSyncStorage(instance);\n break;\n case 'storage':\n this.useAsyncStorage(instance);\n break;\n case 'network':\n this.useNetwork(instance);\n break;\n }\n return this;\n }\n\n async build(): Promise<LionRapidCore> {\n const eventEmitter = new EventEmitter();\n const buildBus = eventEmitter.builder();\n\n logger.info('Builder started');\n logger.debug('Builder config', this.config);\n buildBus.buildStart(this.config.defaultLocale!, this.config.namespace!);\n\n const handlerChain = new HandlerChain(eventEmitter);\n // Always add memory cache handler first\n for (const syncRepo of this.syncStorageRepos) {\n if (!syncRepo.getConfig().enabled) continue;\n const syncHandler = new SyncHandler(eventEmitter, syncRepo);\n buildBus.use('sync');\n handlerChain.addSyncHandler(syncHandler);\n }\n // Always add storage cache handler second\n for (const asyncRepo of this.asyncStorageRepos) {\n if (!asyncRepo.getConfig().enabled) continue;\n const asyncHandler = new AsyncHandler(eventEmitter, asyncRepo);\n buildBus.use('async');\n handlerChain.addAsyncHandler(asyncHandler);\n }\n\n // Always add network cache handler last\n let networkFirst: NetworkHandler | null = null;\n for (const networkRepo of this.networkRepos) {\n if (\n !networkRepo.getConfig().enabled ||\n !networkRepo.getConfig().options?.baseUrl\n )\n continue;\n const networkHandler = new NetworkHandler(eventEmitter, networkRepo);\n if (!networkFirst) {\n networkFirst = networkHandler;\n }\n buildBus.use('network');\n handlerChain.addAsyncHandler(networkHandler);\n\n // \u2705 Initialize missing translation sync queue if enabled\n const config = networkRepo.getConfig() as NetworkRepositoryConfig;\n if (config.options?.syncMissing?.enabled) {\n this.syncQueue = new MissingTranslationQueue(networkRepo, {\n enabled: config.options.syncMissing.enabled,\n debounceMs: config.options.syncMissing.debounceMs || 500,\n batchSize: config.options.syncMissing.batchSize || 50,\n }, eventEmitter);\n\n // Subscribe to translation:not-found events (404 only)\n // Note: translation:locked (423) is NOT synced since translation exists but is not ready\n eventEmitter.on('translation:not-found', envelope => {\n if (this.syncQueue) {\n this.syncQueue.add({\n key: envelope.payload.key,\n fallbackValue: envelope.payload.fallbackValue,\n styles: envelope.payload.styles,\n locale: envelope.payload.locale,\n namespace: envelope.payload.namespace,\n });\n }\n });\n\n logger.info('Missing translation sync enabled');\n logger.debug('Sync queue config', config.options.syncMissing);\n }\n }\n\n logger.debug('Handler chain constructed');\n\n // Create facade\n const facade = new LionRapidCore(\n eventEmitter,\n handlerChain,\n this.config.defaultLocale,\n this.config.fallbackLocale,\n this.config.namespace\n );\n\n // Initialize plugins and add their handlers\n for (const plugin of this.plugins) {\n buildBus.use('plugin');\n await plugin.initialize({ core: facade, bus: eventEmitter });\n facade.registerPlugin(plugin);\n logger.info(`Plugin initialized: ${plugin.name}`);\n logger.debug(`Plugin version: ${plugin.version}`, plugin.capabilities);\n }\n\n const chainInfo = handlerChain.getChainInfo();\n\n // \u2705 Explicit namespace preloading\n if (networkFirst) {\n await this.executePreloading(networkFirst, handlerChain);\n }\n logger.info('Builder completed');\n buildBus.buildDone(\n chainInfo.handlers.map(r => r.name),\n this.plugins.map(p => p.name)\n );\n\n return facade;\n }\n\n // \u2705 CLEAN: Preloading logic\n private async executePreloading(\n networkHandler: NetworkHandler,\n handlerChain: HandlerChain\n ): Promise<void> {\n const eagerPreloads = networkHandler\n .getPreload()\n .filter(config => config.eager !== false);\n\n if (!eagerPreloads || eagerPreloads.length === 0) {\n return;\n }\n\n logger.info(`Preloading ${eagerPreloads.length} namespaces`);\n logger.debug('Preload targets', {\n namespaces: eagerPreloads.map(c => `${c.locale}:${c.namespace}`),\n });\n\n const promises = eagerPreloads.map(async preloadConfig => {\n try {\n const result = await networkHandler.loadNamespace(\n preloadConfig.locale,\n preloadConfig.namespace\n );\n\n if (result && result.data && result.status === 200) {\n const context = {\n locale: preloadConfig.locale,\n namespace: preloadConfig.namespace,\n fallbackLocale: this.config.fallbackLocale,\n };\n\n await handlerChain.saveNamespaceToHandlers(result.data, context);\n logger.debug(\n `Preloaded: ${preloadConfig.locale}:${preloadConfig.namespace}`\n );\n }\n } catch (error) {\n logger.warn(\n `Preload failed: ${preloadConfig.locale}:${preloadConfig.namespace}`,\n error\n );\n }\n });\n\n await Promise.allSettled(promises);\n logger.info('Preloading completed');\n }\n}\n", "/**\n * API repository - Simple HTTP data access layer\n * No business logic - just GET/POST operations\n *\n * Server always returns ContentUnit format: { text, styles }\n */\n\nimport type { NetworkRepositoryConfig } from '../config/repository.config.js';\nimport type { ContentUnit } from '../content/types.js';\nimport {\n NetworkError,\n ServerError,\n TranslationLockedError,\n TranslationNotFoundError,\n} from '../errors/translation-errors.js';\nimport type { IAsyncRepository } from '../interfaces/repository.interface.js';\nimport type {\n ContentUnitData,\n TranslationData,\n} from '../types/translation-data.types.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * API repository implementation\n * Pure data access - no caching, no business logic\n */\nexport class NetworkRepository\n implements IAsyncRepository<NetworkRepositoryConfig>\n{\n readonly name = 'NetworkRepository';\n readonly type = 'network';\n readonly config: NetworkRepositoryConfig = {};\n\n /** Cached version (opaque string from server) per namespace key \"locale:namespace\" */\n private namespaceVersions = new Map<string, string>();\n\n /** localStorage key prefix for persisted versions */\n private static readonly VERSION_PREFIX = 'lionrapid:v:';\n\n /**\n * Default endpoint templates with placeholder support\n * Placeholders: :key, :locale, :namespace\n */\n private readonly DEFAULT_ENDPOINTS = {\n getTranslation: '/api/integrations/translations/:key',\n getNamespace: '/api/integrations/translations/:locale/:namespace',\n setTranslation: '/api/integrations/sync/:key',\n setNamespace: '/api/integrations/sync/:locale/:namespace',\n setBatch: '/api/integrations/sync/batch',\n removeTranslation: '/api/integrations/sync/:key',\n clearTranslations: '/translations',\n } as const;\n\n constructor(config: NetworkRepositoryConfig = {}) {\n this.config = {\n options: {\n timeout: config.options?.timeout ?? 5000,\n baseUrl: config.options?.baseUrl ?? '',\n headers: config.options?.headers ?? {},\n },\n ...config,\n };\n }\n\n /**\n * Get single translation from API\n * Uses platform-specific integration endpoint\n * @throws {TranslationNotFoundError} When translation doesn't exist (404)\n * @throws {TranslationLockedError} When translation is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async get(key: string): Promise<string> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getTranslation', { key });\n logger.debug(`API GET: ${url}`);\n\n try {\n const response = await this.makeRequest(url, 'GET');\n\n if (!response.ok) {\n this.handleHttpError(response, key);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n // Try multiple key formats: meta.key, original key, or first translation\n const translation = data.translations[data.meta?.key]\n || data.translations[key]\n || Object.values(data.translations)[0];\n\n logger.debug(`Fetched translation for key \"${key}\":`, translation);\n if (!translation) {\n throw new TranslationNotFoundError(key);\n }\n\n // Handle both ContentUnit format and plain string\n if (typeof translation === 'object' && 'text' in translation) {\n logger.debug(`ContentUnit text: \"${translation.text}\"`);\n return translation.text;\n }\n\n return String(translation);\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Get single translation as full ContentUnit (with styles)\n * Used by NetworkHandler for individual key lookups that need styles\n * @throws {TranslationNotFoundError} When translation doesn't exist (404)\n * @throws {TranslationLockedError} When translation is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async getContentUnit(key: string): Promise<ContentUnit> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getTranslation', { key });\n logger.debug(`API GET ContentUnit: ${url}`);\n\n try {\n const response = await this.makeRequest(url, 'GET');\n\n if (!response.ok) {\n this.handleHttpError(response, key);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n // Try multiple key formats: meta.key, original key, or first translation\n const translation = data.translations[data.meta?.key]\n || data.translations[key]\n || Object.values(data.translations)[0];\n\n if (!translation) {\n throw new TranslationNotFoundError(key);\n }\n\n // Handle both ContentUnit format and plain string\n if (typeof translation === 'object' && 'text' in translation) {\n // Server returned ContentUnit format\n logger.debug(`ContentUnit for \"${key}\": text=\"${translation.text}\", styles=`, translation.styles);\n return {\n text: translation.text,\n styles: translation.styles || {},\n };\n }\n\n // Server returned plain string - wrap in ContentUnit\n logger.debug(`Plain string for \"${key}\": \"${translation}\" (no styles)`);\n return {\n text: String(translation),\n styles: {},\n };\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Get namespace with all translations\n * @throws {TranslationNotFoundError} When namespace doesn't exist (404)\n * @throws {TranslationLockedError} When namespace is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async getNamespace(\n locale: string,\n namespace: string\n ): Promise<TranslationData | null> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getNamespace', { locale, namespace });\n logger.debug(`API GET Namespace: ${url}`);\n\n const namespaceKey = `${locale}:${namespace}`;\n\n try {\n // Send If-None-Match for conditional request\n const extraHeaders: Record<string, string> = {};\n const cachedVersion = this.getVersion(namespaceKey);\n if (cachedVersion) {\n extraHeaders['If-None-Match'] = `W/\"${cachedVersion}\"`;\n }\n\n const response = await this.makeRequest(url, 'GET', undefined, extraHeaders);\n\n // 304 Not Modified \u2014 cached translations are still fresh\n if (response.status === 304) {\n logger.debug(`Namespace ${namespaceKey}: 304 Not Modified`);\n return null;\n }\n\n if (!response.ok) {\n this.handleHttpError(response, namespaceKey);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n if (!data.translations) {\n throw new TranslationNotFoundError(namespaceKey);\n }\n\n // Track version for future conditional requests (memory + localStorage)\n const version = data.meta?.version != null ? String(data.meta.version) : null;\n if (version) {\n this.setVersion(namespaceKey, version);\n }\n\n return data.translations;\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Save translation to API (if supported)\n */\n async set(key: string, value: string): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('setTranslation', { key });\n const response = await this.makeRequest(url, 'PUT', {\n translation: value,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save translation: ${response.status}`);\n }\n } catch (error) {\n logger.debug(`API set failed for key \"${key}\":`, error);\n throw error;\n }\n }\n\n async setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('setNamespace', { locale, namespace });\n const response = await this.makeRequest(url, 'PUT', {\n translations,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save namespace: ${response.status}`);\n }\n } catch (error) {\n logger.debug(\n `API setNamespace failed for ${locale}:${namespace}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Batch sync multiple missing translations\n * Uses new batch endpoint for efficiency\n */\n async setBatch(items: Array<{ key: string; value: string }>): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n\n try {\n const url = this.buildUrl('setBatch');\n logger.debug(`API POST Batch: ${url} (${items.length} items)`);\n\n const response = await this.makeRequest(url, 'POST', {\n translations: items,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to sync batch: ${response.status}`);\n }\n\n logger.debug(`Batch sync successful: ${items.length} items`);\n } catch (error) {\n logger.debug(`API setBatch failed for ${items.length} items:`, error);\n throw error;\n }\n }\n\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n // ContentUnit API Methods\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n /**\n * Get namespace with all translations as ContentUnit data\n *\n * @returns ContentUnitData (Record<string, ContentUnit>)\n * @throws {TranslationNotFoundError} When namespace doesn't exist (404)\n * @throws {TranslationLockedError} When namespace is locked/not ready (423)\n * @throws {ServerError} When server returns 5xx error\n * @throws {NetworkError} When network request fails\n */\n async getNamespaceContentUnits(\n locale: string,\n namespace: string\n ): Promise<ContentUnitData | null> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n throw new NetworkError('API base URL is not set');\n }\n\n const url = this.buildUrl('getNamespace', { locale, namespace });\n logger.debug(`API GET Namespace ContentUnits: ${url}`);\n\n const namespaceKey = `${locale}:${namespace}`;\n\n try {\n // Send If-None-Match for conditional request\n const extraHeaders: Record<string, string> = {};\n const cachedVersion = this.getVersion(namespaceKey);\n if (cachedVersion) {\n extraHeaders['If-None-Match'] = `W/\"${cachedVersion}\"`;\n }\n\n const response = await this.makeRequest(url, 'GET', undefined, extraHeaders);\n\n // 304 Not Modified \u2014 cached translations are still fresh\n if (response.status === 304) {\n logger.debug(`Namespace ContentUnits ${namespaceKey}: 304 Not Modified`);\n return null;\n }\n\n if (!response.ok) {\n this.handleHttpError(response, namespaceKey);\n }\n\n const data = await response.json();\n logger.debug('API response data:', data);\n\n if (!data.translations) {\n throw new TranslationNotFoundError(namespaceKey);\n }\n\n // Track version for future conditional requests (memory + localStorage)\n const version = data.meta?.version != null ? String(data.meta.version) : null;\n if (version) {\n this.setVersion(namespaceKey, version);\n }\n\n // Server always returns ContentUnit format\n return data.translations as ContentUnitData;\n } catch (error) {\n this.handleCaughtError(error);\n }\n }\n\n /**\n * Save ContentUnit to API\n *\n * Sends the ContentUnit format to server for storage.\n * Server should store in ContentUnit format for efficient retrieval.\n *\n * @param key - Translation key\n * @param unit - ContentUnit to save\n */\n async setContentUnit(key: string, unit: ContentUnit): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n\n try {\n const url = this.buildUrl('setTranslation', { key });\n const response = await this.makeRequest(url, 'PUT', {\n translation: unit,\n format: 'contentunit', // Signal to server that this is ContentUnit format\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save ContentUnit: ${response.status}`);\n }\n\n logger.debug(`Saved ContentUnit for key \"${key}\"`);\n } catch (error) {\n logger.debug(`API setContentUnit failed for key \"${key}\":`, error);\n throw error;\n }\n }\n\n /**\n * Batch sync multiple ContentUnits\n *\n * Sends ContentUnit format to server for batch storage.\n *\n * @param items - Array of key-ContentUnit pairs\n */\n async setBatchContentUnits(\n items: Array<{ key: string; value: ContentUnit }>\n ): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n\n try {\n const url = this.buildUrl('setBatch');\n logger.debug(\n `API POST Batch ContentUnits: ${url} (${items.length} items)`\n );\n\n const response = await this.makeRequest(url, 'POST', {\n translations: items,\n format: 'contentunit', // Signal to server that this is ContentUnit format\n });\n\n if (!response.ok) {\n throw new Error(`Failed to sync batch ContentUnits: ${response.status}`);\n }\n\n logger.debug(`Batch ContentUnit sync successful: ${items.length} items`);\n } catch (error) {\n logger.debug(\n `API setBatchContentUnits failed for ${items.length} items:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Remove translation from API (if supported)\n */\n async remove(key: string): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('removeTranslation', { key });\n const response = await this.makeRequest(url, 'DELETE');\n\n if (!response.ok) {\n throw new Error(`Failed to remove translation: ${response.status}`);\n }\n } catch (error) {\n logger.debug(`API remove failed for key \"${key}\":`, error);\n throw error;\n }\n }\n\n /**\n * Clear all translations (if supported)\n */\n async clear(): Promise<void> {\n if (!this.config?.options?.baseUrl) {\n logger.debug('API base URL is not set');\n return Promise.reject(new Error('API base URL is not set'));\n }\n try {\n const url = this.buildUrl('clearTranslations');\n const response = await this.makeRequest(url, 'DELETE');\n\n if (!response.ok) {\n throw new Error(`Failed to clear translations: ${response.status}`);\n }\n } catch (error) {\n logger.debug('API clear failed:', error);\n throw error;\n }\n }\n\n getConfig(): NetworkRepositoryConfig {\n return this.config;\n }\n\n /** Read persisted version from localStorage, falling back to in-memory map */\n private getVersion(namespaceKey: string): string | undefined {\n const mem = this.namespaceVersions.get(namespaceKey);\n if (mem) return mem;\n try {\n const stored = localStorage.getItem(NetworkRepository.VERSION_PREFIX + namespaceKey);\n if (stored) {\n this.namespaceVersions.set(namespaceKey, stored);\n return stored;\n }\n } catch { /* SSR or localStorage unavailable */ }\n return undefined;\n }\n\n /** Persist version to both in-memory map and localStorage */\n private setVersion(namespaceKey: string, version: string): void {\n this.namespaceVersions.set(namespaceKey, version);\n try {\n localStorage.setItem(NetworkRepository.VERSION_PREFIX + namespaceKey, version);\n } catch { /* quota exceeded or unavailable */ }\n }\n\n /**\n * Handle HTTP error responses by mapping to domain errors\n * @throws {TranslationNotFoundError} When status is 404\n * @throws {TranslationLockedError} When status is 423\n * @throws {ServerError} When status is 5xx\n * @throws {NetworkError} For other client errors\n */\n private handleHttpError(response: Response, key: string): never {\n logger.debug(`API response: ${response.status} ${response.statusText}`);\n\n if (response.status === 404) {\n throw new TranslationNotFoundError(key);\n }\n\n if (response.status === 423) {\n const retryAfter = response.headers.get('Retry-After');\n throw new TranslationLockedError(\n key,\n retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined\n );\n }\n\n if (response.status >= 500 && response.status < 600) {\n throw new ServerError(key, response.status);\n }\n\n // Other client errors (400, 401, 403, etc.)\n throw new NetworkError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n /**\n * Handle caught errors by wrapping non-domain errors\n * @throws {TranslationError} Always throws - propagates domain errors or wraps unexpected ones\n */\n private handleCaughtError(error: unknown): never {\n // Custom errors propagate automatically, wrap everything else\n if (\n error instanceof TranslationNotFoundError ||\n error instanceof TranslationLockedError ||\n error instanceof ServerError ||\n error instanceof NetworkError\n ) {\n throw error;\n }\n\n // Wrap unexpected errors (fetch abort, JSON parse, etc.)\n throw new NetworkError('Network request failed', error);\n }\n\n /**\n * Build URL from endpoint template and parameters\n * Supports placeholders: :key, :locale, :namespace\n * @param endpoint - Endpoint key from DEFAULT_ENDPOINTS\n * @param params - Parameters to replace placeholders with\n * @returns Complete URL with baseUrl + endpoint path\n */\n private buildUrl(\n endpoint: keyof typeof this.DEFAULT_ENDPOINTS,\n params: Record<string, string> = {}\n ): string {\n const baseUrl = this.config.options?.baseUrl || '';\n\n // Get endpoint template from config or use default\n let endpointTemplate =\n this.config.options?.endpoints?.[endpoint] ||\n this.DEFAULT_ENDPOINTS[endpoint];\n\n // Ensure endpoint starts with / for consistent URL building\n if (!endpointTemplate.startsWith('/')) {\n endpointTemplate = `/${endpointTemplate}`;\n }\n\n // Replace all placeholders with actual values (encoded)\n // Use global replace to handle multiple occurrences\n let path = endpointTemplate;\n for (const [key, value] of Object.entries(params)) {\n const placeholder = new RegExp(`:${key}`, 'g');\n path = path.replace(placeholder, encodeURIComponent(value));\n }\n\n return `${baseUrl}${path}`;\n }\n\n /**\n * Make HTTP request with timeout and headers\n */\n private async makeRequest(\n url: string,\n method: string,\n body?: unknown,\n extraHeaders?: Record<string, string>\n ): Promise<Response> {\n const controller = new AbortController();\n const timeout = this.config.options?.timeout ?? 10000;\n const timeoutId = setTimeout(\n () => controller.abort(),\n timeout\n );\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.config.options?.headers,\n ...extraHeaders,\n };\n\n if (this.config.options?.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.options.apiKey}`;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n", "import { MemoryRepositoryConfig } from '../config/repository.config.js';\nimport type {\n IStatsProvider,\n ISyncRepository,\n} from '../interfaces/repository.interface.js';\nimport type { TranslationData } from '../types/translation-data.types.js';\nimport { createNamespaceCacheKey } from '../utils/index.js';\n\nexport class MemoryRepository\n implements ISyncRepository<MemoryRepositoryConfig>, IStatsProvider\n{\n readonly name = 'MemoryRepository';\n readonly type = 'memory';\n readonly config: MemoryRepositoryConfig = {};\n private cache = new Map<string, string>();\n private accessOrder = new Map<string, number>();\n private maxSize: number = 1000;\n\n constructor(config: MemoryRepositoryConfig) {\n this.config = config;\n this.maxSize = this.config.options?.maxSize || 1000;\n }\n\n get(key: string): string | null {\n const value = this.cache.get(key);\n if (value !== undefined) {\n // Update access time for LRU\n this.accessOrder.set(key, Date.now());\n return value;\n }\n return null;\n }\n\n set(key: string, value: string): void {\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n this.evictOldest();\n }\n\n this.cache.set(key, value);\n this.accessOrder.set(key, Date.now());\n }\n\n remove(key: string): void {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n this.accessOrder.clear();\n }\n\n /**\n * Clear all entries for a specific namespace\n * Removes both the namespace cache entry and all individual translation keys\n */\n clearNamespace(locale: string, namespace: string): void {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n const keyPrefix = `${locale}:${namespace}:`;\n\n // Remove namespace cache entry\n this.cache.delete(namespaceCacheKey);\n this.accessOrder.delete(namespaceCacheKey);\n\n // Remove individual translation keys\n for (const key of this.cache.keys()) {\n if (key.startsWith(keyPrefix)) {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n }\n }\n }\n\n getNamespace(locale: string, namespace: string): TranslationData | null {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n const namespaceData = this.cache.get(namespaceCacheKey);\n if (!namespaceData) return null;\n\n try {\n return JSON.parse(namespaceData);\n } catch (error) {\n this.cache.delete(namespaceCacheKey);\n return null;\n }\n }\n\n setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): void {\n const namespaceCacheKey = createNamespaceCacheKey(locale, namespace);\n this.cache.set(namespaceCacheKey, JSON.stringify(translations));\n }\n\n private evictOldest(): void {\n let oldestKey = '';\n let oldestTime = Date.now();\n\n for (const [key, time] of this.accessOrder.entries()) {\n if (time < oldestTime) {\n oldestTime = time;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.cache.delete(oldestKey);\n this.accessOrder.delete(oldestKey);\n }\n }\n /**\n * Get all cache entries for debugging\n */\n getEntries(): Record<string, string> {\n const entries: Record<string, string> = {};\n for (const [key, value] of this.cache.entries()) {\n entries[key] = value;\n }\n return entries;\n }\n\n getConfig(): MemoryRepositoryConfig {\n return this.config;\n }\n}\n", "/**\n * Content validator for ContentUnit integrity checking\n * @module content/validator/ContentValidator\n */\n\nimport type {\n IValidator,\n ValidationResult,\n ValidationError,\n ValidationWarning,\n ValidationErrorCode,\n ValidationWarningCode,\n} from './IValidator.js';\nimport type { ContentUnit } from '../types.js';\n\n/**\n * Validates ContentUnit for structural integrity\n *\n * Checks for:\n * - Balanced indexed tags (`<1>...</1>`)\n * - Valid tag indices (no invalid/malformed tags)\n * - Style references (styles referenced by tags exist)\n * - Orphan styles (styles defined but not used)\n * - Basic ICU brace balance validation\n *\n * @example\n * ```typescript\n * const validator = new ContentValidator();\n *\n * // Valid unit\n * const valid = validator.validate({\n * text: 'Hello <1>world</1>',\n * styles: { '1': ['bold'] }\n * });\n * // \u2192 { valid: true, errors: [], warnings: [] }\n *\n * // Unbalanced tags\n * const invalid = validator.validate({\n * text: 'Hello <1>world',\n * styles: { '1': ['bold'] }\n * });\n * // \u2192 { valid: false, errors: [{ code: 'UNBALANCED_TAGS', ... }], ... }\n * ```\n */\nexport class ContentValidator implements IValidator {\n /**\n * Validate a ContentUnit for structural integrity\n *\n * @param unit - ContentUnit to validate\n * @returns Validation result with errors and warnings\n */\n validate(unit: ContentUnit): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check tag balance\n this.validateTagBalance(unit.text, errors);\n\n // Check style references\n this.validateStyleReferences(unit.text, unit.styles, errors, warnings);\n\n // Check ICU brace balance (always, since text may contain ICU patterns)\n this.validateICUBraces(unit.text, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Validate that all indexed tags are properly balanced and correctly nested\n */\n private validateTagBalance(text: string, errors: ValidationError[]): void {\n // Pattern to match indexed tags: <1>, </1>, <1/>\n const tagPattern = /<(\\/?)?(\\d+)(\\/)?>/g;\n // Stack-based approach to verify proper nesting order\n const tagStack: Array<{ index: string; position: number }> = [];\n let match;\n\n while ((match = tagPattern.exec(text)) !== null) {\n const [, closingSlash, indexStr, selfClosingSlash] = match;\n\n if (selfClosingSlash) {\n // Self-closing tag: <1/> - always valid\n continue;\n }\n\n if (closingSlash) {\n // Closing tag: </1>\n // Must match the most recently opened tag (proper nesting)\n if (tagStack.length === 0) {\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Closing tag </${indexStr}> has no matching opening tag`,\n path: `text[${match.index}]`,\n });\n } else {\n const lastOpen = tagStack[tagStack.length - 1];\n if (lastOpen.index === indexStr) {\n // Proper closing - pop the stack\n tagStack.pop();\n } else {\n // Check if this tag was opened earlier (improper nesting)\n const foundIndex = tagStack.findIndex((t) => t.index === indexStr);\n if (foundIndex >= 0) {\n // Tag was opened but not in the right order\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Improperly nested: </${indexStr}> should close before </${lastOpen.index}>`,\n path: `text[${match.index}]`,\n });\n // Remove the out-of-order tag from stack\n tagStack.splice(foundIndex, 1);\n } else {\n // Tag was never opened\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Closing tag </${indexStr}> has no matching opening tag`,\n path: `text[${match.index}]`,\n });\n }\n }\n }\n } else {\n // Opening tag: <1>\n tagStack.push({ index: indexStr, position: match.index });\n }\n }\n\n // Check for unclosed tags\n for (const { index } of tagStack) {\n errors.push({\n code: 'UNBALANCED_TAGS' as ValidationErrorCode,\n message: `Opening tag <${index}> has no matching closing tag`,\n path: 'text',\n });\n }\n }\n\n /**\n * Validate style references - check that used tags have styles and vice versa\n */\n private validateStyleReferences(\n text: string,\n styles: Record<string, string[]>,\n errors: ValidationError[],\n warnings: ValidationWarning[]\n ): void {\n // Find all tag indices used in text\n const usedIndices = new Set<string>();\n const tagPattern = /<\\/?(\\d+)(?:\\/)?>/g;\n let match;\n\n while ((match = tagPattern.exec(text)) !== null) {\n usedIndices.add(match[1]);\n }\n\n // Check for used indices without style definitions\n for (const index of usedIndices) {\n if (!styles[index] || styles[index].length === 0) {\n // This is a warning, not an error - tag will render as <span>\n warnings.push({\n code: 'EMPTY_STYLE' as ValidationWarningCode,\n message: `Tag <${index}> has no style definition, will render as <span>`,\n });\n }\n }\n\n // Check for defined styles not used in text (orphan styles)\n for (const index of Object.keys(styles)) {\n if (!usedIndices.has(index)) {\n warnings.push({\n code: 'UNUSED_TAG' as ValidationWarningCode,\n message: `Style for tag <${index}> is defined but tag is not used in text`,\n });\n }\n }\n }\n\n /**\n * Validate ICU MessageFormat brace balance\n */\n private validateICUBraces(\n text: string,\n errors: ValidationError[]\n ): void {\n // Check for balanced braces\n let depth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const prevChar = i > 0 ? text[i - 1] : '';\n\n // Handle string escaping\n if (\n (char === '\"' || char === \"'\") &&\n prevChar !== '\\\\'\n ) {\n if (!inString) {\n inString = true;\n stringChar = char;\n } else if (char === stringChar) {\n inString = false;\n stringChar = '';\n }\n continue;\n }\n\n if (inString) continue;\n\n if (char === '{') {\n depth++;\n } else if (char === '}') {\n depth--;\n if (depth < 0) {\n errors.push({\n code: 'INVALID_ICU' as ValidationErrorCode,\n message: `Unbalanced ICU braces: unexpected '}' at position ${i}`,\n path: `text[${i}]`,\n });\n depth = 0; // Reset to continue checking\n }\n }\n }\n\n if (depth > 0) {\n errors.push({\n code: 'INVALID_ICU' as ValidationErrorCode,\n message: `Unbalanced ICU braces: ${depth} unclosed '{'`,\n path: 'text',\n });\n }\n\n // Check for empty variable names\n const emptyVarPattern = /\\{\\s*[,}]/;\n if (emptyVarPattern.test(text)) {\n errors.push({\n code: 'INVALID_ICU' as ValidationErrorCode,\n message: 'ICU variable name is empty or missing',\n path: 'text',\n });\n }\n }\n}\n", "/**\n * LocalStorage Repository for persistent cache (Browser Bundle Version)\n * Implements ISyncRepository for synchronous access to localStorage\n */\n\nimport type {\n ISyncRepository,\n IStatsProvider,\n} from '../../interfaces/repository.interface.js';\nimport type { MemoryRepositoryConfig } from '../../config/repository.config.js';\nimport type { TranslationData } from '../../types/translation-data.types.js';\n\nconst STORAGE_PREFIX = 'lionrapid:';\nconst VERSION_KEY = `${STORAGE_PREFIX}version`;\nconst CURRENT_VERSION = '1';\n\n/**\n * Stored item structure with TTL support\n */\ninterface StoredItem {\n value: string;\n expiry: number | null;\n timestamp: number;\n}\n\n/**\n * Configuration options for LocalStorageRepository\n */\nexport interface LocalStorageRepositoryConfig extends MemoryRepositoryConfig {\n options?: MemoryRepositoryConfig['options'] & {\n prefix?: string;\n ttl?: number;\n maxSize?: number;\n };\n}\n\n/**\n * LocalStorage-based repository for persistent translation caching\n */\nexport class LocalStorageRepository\n implements ISyncRepository<LocalStorageRepositoryConfig>, IStatsProvider\n{\n readonly name = 'LocalStorageRepository';\n readonly type = 'memory' as const;\n readonly config: LocalStorageRepositoryConfig;\n\n private available: boolean;\n private prefix: string;\n private defaultTTL: number;\n private maxSize: number;\n\n constructor(config: LocalStorageRepositoryConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n priority: config.priority ?? 0,\n options: {\n prefix: config.options?.prefix ?? STORAGE_PREFIX,\n ttl: config.options?.ttl ?? 24 * 60 * 60 * 1000,\n maxSize: config.options?.maxSize ?? 500,\n ...config.options,\n },\n };\n\n this.prefix = this.config.options?.prefix ?? STORAGE_PREFIX;\n this.defaultTTL = this.config.options?.ttl ?? 24 * 60 * 60 * 1000;\n this.maxSize = this.config.options?.maxSize ?? 500;\n this.available = this.checkAvailability();\n\n if (this.available) {\n this.migrateIfNeeded();\n }\n }\n\n private checkAvailability(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n try {\n const testKey = `${this.prefix}__test__`;\n window.localStorage.setItem(testKey, 'test');\n window.localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n }\n\n private migrateIfNeeded(): void {\n try {\n const storedVersion = window.localStorage.getItem(VERSION_KEY);\n if (storedVersion !== CURRENT_VERSION) {\n this.clear();\n window.localStorage.setItem(VERSION_KEY, CURRENT_VERSION);\n }\n } catch {\n // Ignore migration errors\n }\n }\n\n get(key: string): string | null {\n if (!this.available) return null;\n\n try {\n const fullKey = this.prefix + key;\n const itemStr = window.localStorage.getItem(fullKey);\n if (!itemStr) return null;\n\n const item: StoredItem = JSON.parse(itemStr);\n\n if (item.expiry !== null && Date.now() > item.expiry) {\n window.localStorage.removeItem(fullKey);\n return null;\n }\n\n return item.value;\n } catch {\n return null;\n }\n }\n\n set(key: string, value: string): void {\n if (!this.available) return;\n\n const fullKey = this.prefix + key;\n const item: StoredItem = {\n value,\n expiry: this.defaultTTL ? Date.now() + this.defaultTTL : null,\n timestamp: Date.now(),\n };\n\n try {\n const entryCount = this.getEntryCount();\n if (entryCount >= this.maxSize) {\n this.evictOldest();\n }\n\n window.localStorage.setItem(fullKey, JSON.stringify(item));\n } catch (error) {\n if (this.isQuotaError(error)) {\n this.evictOldest();\n try {\n window.localStorage.setItem(fullKey, JSON.stringify(item));\n } catch {\n // Give up silently\n }\n }\n }\n }\n\n remove(key: string): void {\n if (!this.available) return;\n\n try {\n window.localStorage.removeItem(this.prefix + key);\n } catch {\n // Ignore removal errors\n }\n }\n\n clear(): void {\n if (!this.available) return;\n\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (key?.startsWith(this.prefix) && key !== VERSION_KEY) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((k) => window.localStorage.removeItem(k));\n } catch {\n // Ignore clear errors\n }\n }\n\n clearNamespace(locale: string, namespace: string): void {\n if (!this.available) return;\n\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const keyPrefix = `${locale}:${namespace}:`;\n\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (!key?.startsWith(this.prefix)) continue;\n\n const innerKey = key.slice(this.prefix.length);\n if (innerKey === namespaceCacheKey || innerKey.startsWith(keyPrefix)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((k) => window.localStorage.removeItem(k));\n } catch {\n // Ignore errors\n }\n }\n\n getNamespace(locale: string, namespace: string): TranslationData | null {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const value = this.get(namespaceCacheKey);\n if (!value) return null;\n\n try {\n return JSON.parse(value);\n } catch {\n this.remove(namespaceCacheKey);\n return null;\n }\n }\n\n setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): void {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n this.set(namespaceCacheKey, JSON.stringify(translations));\n }\n\n getEntries(): Record<string, string> {\n const entries: Record<string, string> = {};\n if (!this.available) return entries;\n\n try {\n for (let i = 0; i < window.localStorage.length; i++) {\n const fullKey = window.localStorage.key(i);\n if (!fullKey?.startsWith(this.prefix) || fullKey === VERSION_KEY) {\n continue;\n }\n\n const key = fullKey.slice(this.prefix.length);\n const value = this.get(key);\n if (value !== null) {\n entries[key] = value;\n }\n }\n } catch {\n // Ignore errors\n }\n\n return entries;\n }\n\n getConfig(): LocalStorageRepositoryConfig {\n return this.config;\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n private getEntryCount(): number {\n if (!this.available) return 0;\n\n let count = 0;\n try {\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (key?.startsWith(this.prefix) && key !== VERSION_KEY) {\n count++;\n }\n }\n } catch {\n // Ignore errors\n }\n\n return count;\n }\n\n private isQuotaError(error: unknown): boolean {\n if (error instanceof DOMException) {\n return (\n error.name === 'QuotaExceededError' ||\n error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n );\n }\n return false;\n }\n\n private evictOldest(): void {\n if (!this.available) return;\n\n try {\n const entries: Array<{ key: string; timestamp: number }> = [];\n\n for (let i = 0; i < window.localStorage.length; i++) {\n const fullKey = window.localStorage.key(i);\n if (!fullKey?.startsWith(this.prefix) || fullKey === VERSION_KEY) {\n continue;\n }\n\n try {\n const itemStr = window.localStorage.getItem(fullKey);\n if (itemStr) {\n const item: StoredItem = JSON.parse(itemStr);\n entries.push({ key: fullKey, timestamp: item.timestamp });\n }\n } catch {\n window.localStorage.removeItem(fullKey);\n }\n }\n\n entries.sort((a, b) => a.timestamp - b.timestamp);\n\n const removeCount = Math.max(1, Math.floor(entries.length * 0.25));\n for (let i = 0; i < removeCount && i < entries.length; i++) {\n window.localStorage.removeItem(entries[i].key);\n }\n } catch {\n // Ignore eviction errors\n }\n }\n\n getCacheStats(): { size: number; maxSize: number; usage: string } {\n const size = this.getEntryCount();\n const usage =\n this.maxSize > 0 ? `${Math.round((size / this.maxSize) * 100)}%` : '0%';\n\n return {\n size,\n maxSize: this.maxSize,\n usage,\n };\n }\n}\n", "/**\n * CacheStorageRepository - Cache API-based persistent storage (Browser Bundle Version)\n * Implements IAsyncRepository for asynchronous access to Cache API\n */\n\nimport type { IAsyncRepository } from '../../interfaces/repository.interface.js';\nimport type { StorageRepositoryConfig } from '../../config/repository.config.js';\nimport type { TranslationData } from '../../types/translation-data.types.js';\nimport { TranslationNotFoundError } from '../../errors/translation-errors.js';\n\nconst CACHE_NAME = 'lionrapid-v1';\nconst CACHE_PREFIX = 'lionrapid:';\n\n/**\n * Stored item structure with TTL support\n */\ninterface StoredItem {\n value: string;\n expiry: number | null;\n timestamp: number;\n}\n\n/**\n * Configuration options for CacheStorageRepository\n */\nexport interface CacheStorageRepositoryConfig extends StorageRepositoryConfig {\n options?: StorageRepositoryConfig['options'] & {\n cacheName?: string;\n ttl?: number;\n };\n}\n\n/**\n * Cache API-based repository for persistent translation caching\n */\nexport class CacheStorageRepository\n implements IAsyncRepository<CacheStorageRepositoryConfig>\n{\n readonly name = 'CacheStorageRepository';\n readonly type = 'storage' as const;\n readonly config: CacheStorageRepositoryConfig;\n\n private cacheName: string;\n private defaultTTL: number;\n private available: boolean;\n\n constructor(config: CacheStorageRepositoryConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n priority: config.priority ?? 0,\n options: {\n cacheName: config.options?.cacheName ?? CACHE_NAME,\n ttl: config.options?.ttl ?? 7 * 24 * 60 * 60 * 1000,\n ...config.options,\n },\n };\n\n this.cacheName = this.config.options?.cacheName ?? CACHE_NAME;\n this.defaultTTL = this.config.options?.ttl ?? 7 * 24 * 60 * 60 * 1000;\n this.available = this.checkAvailability();\n }\n\n private checkAvailability(): boolean {\n return typeof caches !== 'undefined';\n }\n\n async get(key: string): Promise<string> {\n if (!this.available) {\n throw new TranslationNotFoundError(key);\n }\n\n try {\n const cache = await caches.open(this.cacheName);\n const response = await cache.match(CACHE_PREFIX + key);\n\n if (!response) {\n throw new TranslationNotFoundError(key);\n }\n\n const data: StoredItem = await response.json();\n\n if (data.expiry !== null && Date.now() > data.expiry) {\n await cache.delete(CACHE_PREFIX + key);\n throw new TranslationNotFoundError(key);\n }\n\n return data.value;\n } catch (error) {\n if (error instanceof TranslationNotFoundError) {\n throw error;\n }\n throw new TranslationNotFoundError(key);\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!this.available) return;\n\n try {\n const cache = await caches.open(this.cacheName);\n const data: StoredItem = {\n value,\n expiry: this.defaultTTL ? Date.now() + this.defaultTTL : null,\n timestamp: Date.now(),\n };\n\n await cache.put(\n CACHE_PREFIX + key,\n new Response(JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n })\n );\n } catch {\n // Silently fail - cache is non-critical\n }\n }\n\n async remove(key: string): Promise<void> {\n if (!this.available) return;\n\n try {\n const cache = await caches.open(this.cacheName);\n await cache.delete(CACHE_PREFIX + key);\n } catch {\n // Silently fail\n }\n }\n\n async clear(): Promise<void> {\n if (!this.available) return;\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n\n await Promise.all(\n keys\n .filter((request) => request.url.includes(CACHE_PREFIX))\n .map((request) => cache.delete(request))\n );\n } catch {\n // Silently fail\n }\n }\n\n async clearNamespace(locale: string, namespace: string): Promise<void> {\n if (!this.available) return;\n\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const keyPrefix = `${locale}:${namespace}:`;\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n\n await Promise.all(\n keys\n .filter((request) => {\n const url = request.url;\n const key = url.includes(CACHE_PREFIX)\n ? url.substring(url.indexOf(CACHE_PREFIX) + CACHE_PREFIX.length)\n : '';\n return key === namespaceCacheKey || key.startsWith(keyPrefix);\n })\n .map((request) => cache.delete(request))\n );\n } catch {\n // Silently fail\n }\n }\n\n async getNamespace(\n locale: string,\n namespace: string\n ): Promise<TranslationData> {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n const value = await this.get(namespaceCacheKey);\n\n try {\n return JSON.parse(value);\n } catch {\n await this.remove(namespaceCacheKey);\n throw new TranslationNotFoundError(namespaceCacheKey);\n }\n }\n\n async setNamespace(\n locale: string,\n namespace: string,\n translations: TranslationData\n ): Promise<void> {\n const namespaceCacheKey = `@${locale}:${namespace}`;\n await this.set(namespaceCacheKey, JSON.stringify(translations));\n }\n\n getConfig(): CacheStorageRepositoryConfig {\n return this.config;\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n async getEntries(): Promise<Record<string, string>> {\n const entries: Record<string, string> = {};\n if (!this.available) return entries;\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n\n for (const request of keys) {\n const url = request.url;\n if (!url.includes(CACHE_PREFIX)) continue;\n\n const key = url.substring(\n url.indexOf(CACHE_PREFIX) + CACHE_PREFIX.length\n );\n try {\n const value = await this.get(key);\n entries[key] = value;\n } catch {\n // Skip expired or invalid entries\n }\n }\n } catch {\n // Silently fail\n }\n\n return entries;\n }\n\n async getCacheStats(): Promise<{ size: number; cacheName: string }> {\n if (!this.available) {\n return { size: 0, cacheName: this.cacheName };\n }\n\n try {\n const cache = await caches.open(this.cacheName);\n const keys = await cache.keys();\n const size = keys.filter((r) => r.url.includes(CACHE_PREFIX)).length;\n\n return { size, cacheName: this.cacheName };\n } catch {\n return { size: 0, cacheName: this.cacheName };\n }\n }\n}\n", "/**\n * Minimal core package - only essential functionality\n * filepath: /home/janrau/tm-integration/packages/core/src/index.ts\n */\n\n// Core engine\nexport { LionRapidBuilder } from './builder.js';\nexport { LionRapidCore } from './lionRapid.js';\n\n// Base infrastructure\nexport { EventEmitter } from './base/event-emitter.js';\nexport { HandlerChain } from './handlers/handler-chain.js';\nexport { MemoryRepository, NetworkRepository } from './repositories/index.js';\n\n// Sync utilities\nexport { MissingTranslationQueue } from './sync/missing-translation-queue.js';\nexport type {\n MissingTranslationItem,\n MissingTranslationQueueConfig,\n} from './sync/missing-translation-queue.js';\n\n// Plugin system\nexport type {\n FormatterFunction,\n IAsyncHandler,\n IEmbeddedPlugin,\n IEventPlugin,\n IPlugin,\n ISyncHandler,\n PluginContext,\n} from './interfaces/index.js';\n\n// Repository interfaces (for external storage implementations)\nexport type {\n ISyncRepository,\n IAsyncRepository,\n IStatsProvider,\n} from './interfaces/repository.interface.js';\n\n// Core types\nexport type { TranslationRequest, TranslationResult } from './types/index.js';\n\n// Content module (Unified Content Architecture)\nexport type {\n ContentUnit,\n ElementMapping,\n IParser,\n ISerializer,\n IStyleMapper,\n IValidator,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n ValidationWarning,\n ValidationWarningCode,\n} from './content/index.js';\n\nexport {\n ContentValidator,\n DefaultStyleMapper,\n HTMLSerializer,\n MarkupParser,\n} from './content/index.js';\nexport type {\n HTMLSerializerOptions,\n MarkupParserOptions,\n} from './content/index.js';\n\n// Cache module (TanStack Query-inspired)\nexport { CacheManager } from './cache/index.js';\nexport type {\n CacheEventPayloads,\n CacheManagerEntry,\n InvalidateOptions,\n} from './cache/index.js';\n\n// Error classes\nexport {\n isClientError,\n isRetryableError,\n isTranslationError,\n NetworkError,\n ServerError,\n TranslationError,\n TranslationLockedError,\n TranslationNotFoundError,\n} from './errors/translation-errors.js';\n\n// Type safety enhancements\nexport type {\n FormatterParams,\n ProcessorParams,\n TranslationParams,\n} from './types/parameters.types.js';\n\nexport type {\n ContentUnitData,\n FlatTranslationData,\n NamespaceData,\n TranslationData,\n TranslationResponse,\n TranslationValue,\n} from './types/translation-data.types.js';\n\nexport type {\n GenericEventPayload,\n HandlerAfterPayload,\n HandlerBeforePayload,\n HandlerEventData,\n} from './types/event-payloads.types.js';\n\nexport type {\n LanguageChangePayload,\n LionRapidContext,\n LionRapidEventEnvelope,\n LionRapidEventPayloads,\n} from './types/lionRapid.types.js';\n\nexport type {\n CacheEntries,\n CacheEntry,\n CacheStats,\n HandlerChainInfo,\n HandlerInfo,\n} from './types/cache.types.js';\n\n// Generated types support\nexport type {\n RequiredParamKeys,\n // Core interfaces\n TranslationKeys,\n\n // Union type helpers\n ZeroParamKeys,\n} from './types/generated.types.js';\n\n// Note: Branded type guards were removed as they're not used in the current implementation\n\n// Browser storage repositories\nexport { LocalStorageRepository } from './browser/storage/localstorage-repository.js';\nexport type { LocalStorageRepositoryConfig } from './browser/storage/localstorage-repository.js';\n\nexport { CacheStorageRepository } from './browser/storage/cache-storage-repository.js';\nexport type { CacheStorageRepositoryConfig } from './browser/storage/cache-storage-repository.js';\n\n// Essential utilities\nexport {\n parseKeyPath,\n prepareTranslationRequest,\n resolveNestedKey,\n} from './utils/index.js';\n\n// Internal utilities (for package development)\nexport {\n Colors,\n createPackageLogger,\n Logger,\n logger,\n measure,\n} from './utils/logger.js';\n\nexport { LoggerConfig, LogLevel } from './config/logger.config.js';\nexport type { CallSite, PackageLoggerConfig } from './utils/logger.js';\n\n// Repository configuration types\nexport type {\n MemoryRepositoryConfig,\n NetworkRepositoryConfig,\n PreloadNamespaces,\n StorageRepositoryConfig,\n SyncMissingConfig,\n} from './config/repository.config.js';\n\n// Version information\nexport const VERSION = '1.0.0';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["LogLevel", "locationInfo", "Logger"]
|
|
7
7
|
}
|