@seliseblocks/blocks-angular-localization 0.0.1
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seliseblocks-blocks-angular-localization.mjs","sources":["../../src/lib/tokens.ts","../../src/lib/uilm-indexeddb-cache.ts","../../src/lib/utils/flatten-json.ts","../../src/lib/utils/lang-codes.ts","../../src/lib/uilm-loader.ts","../../src/lib/uilm-store.ts","../../src/lib/provide-blocks-localization.ts","../../src/lib/provide-uilm-scope.ts","../../src/lib/lang-switcher.ts","../../src/lib/directives/uilm-translate.directive.ts","../../src/lib/pipes/multi-lang.pipe.ts","../../src/lib/pipes/uilm-translate.pipe.ts","../../src/lib/uilm-translate.service.ts","../../src/lib/components/uilm-loading-screen.component.ts","../../src/lib/utils/i18n-record.ts","../../src/testing/provide-blocks-localization-testing.ts","../../src/index.ts","../../src/seliseblocks-blocks-angular-localization.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nimport { BlocksLocalizationConfig } from './types';\n\n/**\n * Injection token for the blocks-localization configuration.\n * Provided by `provideBlocksLocalization()` at the application root.\n */\nexport const BLOCKS_LOCALIZATION_CONFIG = new InjectionToken<BlocksLocalizationConfig>(\n 'BlocksLocalizationConfig',\n);\n","import { Injectable } from '@angular/core';\n\nimport { TranslationMap } from './uilm-store';\n\n/** Shape of a single entry persisted in the IndexedDB object store. */\ninterface IndexedDbCacheEntry {\n /** Composite key: `{prefix}::{lang}` */\n key: string;\n data: TranslationMap;\n /** Unix-epoch ms when this entry was written. */\n timestamp: number;\n}\n\nconst DB_NAME = 'uilm-translations';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'translations';\n\n/**\n * IndexedDB persistence layer for UILM translation cache.\n *\n * Stores translation maps keyed by `{prefix}::{lang}` with timestamps\n * for TTL-based invalidation. Falls back gracefully to `null` when\n * IndexedDB is unavailable (SSR, restrictive incognito, etc.).\n *\n * All public methods are **fire-and-forget safe** — they never throw\n * and resolve to `null` / `void` on any failure.\n *\n * @publicApi\n */\n@Injectable({ providedIn: 'root' })\nexport class UilmIndexedDbCache {\n private dbReady: Promise<IDBDatabase | null>;\n\n constructor() {\n this.dbReady = this.openDb();\n }\n\n /** Re-open the database connection (used after unexpected close). */\n private reconnect(): void {\n this.dbReady = this.openDb();\n }\n\n /**\n * Retrieve a cached entry if it exists and hasn't exceeded the TTL.\n *\n * @param key Cache key (`{prefix}::{lang}`)\n * @param ttl Time-to-live in ms. `0` disables expiry (entry is always valid).\n * @returns The translation map, or `null` on miss / expiry / error.\n */\n async get(key: string, ttl: number): Promise<TranslationMap | null> {\n const db = await this.dbReady;\n if (!db) return null;\n\n try {\n const entry = await this.txGet(db, key);\n if (!entry) return null;\n if (ttl > 0 && Date.now() - entry.timestamp >= ttl) {\n return null;\n }\n return entry.data;\n } catch {\n this.reconnect();\n return null;\n }\n }\n\n /**\n * Retrieve a stale entry (ignoring TTL) for fallback purposes.\n *\n * @param key Cache key\n * @returns The translation map regardless of age, or `null` if absent.\n */\n async getStale(key: string): Promise<TranslationMap | null> {\n const db = await this.dbReady;\n if (!db) return null;\n\n try {\n const entry = await this.txGet(db, key);\n return entry?.data ?? null;\n } catch {\n this.reconnect();\n return null;\n }\n }\n\n /**\n * Persist a translation map.\n *\n * @param key Cache key\n * @param data Flat key→value translation map\n */\n async set(key: string, data: TranslationMap): Promise<void> {\n const db = await this.dbReady;\n if (!db) return;\n\n try {\n await this.txPut(db, { key, data, timestamp: Date.now() });\n } catch {\n this.reconnect();\n }\n }\n\n /** Remove all cached translations from IndexedDB. */\n async clear(): Promise<void> {\n const db = await this.dbReady;\n if (!db) return;\n\n try {\n await this.txClear(db);\n } catch {\n this.reconnect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private — IndexedDB primitives\n // ---------------------------------------------------------------------------\n\n private openDb(): Promise<IDBDatabase | null> {\n return new Promise((resolve) => {\n try {\n if (typeof indexedDB === 'undefined') {\n resolve(null);\n return;\n }\n\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: 'key' });\n }\n };\n\n request.onsuccess = () => {\n const db = request.result;\n // Allow other tabs to upgrade the DB by closing our connection on demand\n db.onversionchange = () => {\n db.close();\n this.reconnect();\n };\n // Reconnect if the browser unexpectedly closes the connection\n db.onclose = () => {\n this.reconnect();\n };\n resolve(db);\n };\n request.onerror = () => resolve(null);\n } catch {\n resolve(null);\n }\n });\n }\n\n private txGet(db: IDBDatabase, key: string): Promise<IndexedDbCacheEntry | undefined> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const request = tx.objectStore(STORE_NAME).get(key);\n request.onsuccess = () => resolve(request.result as IndexedDbCacheEntry | undefined);\n request.onerror = () => reject(request.error);\n });\n }\n\n private txPut(db: IDBDatabase, entry: IndexedDbCacheEntry): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const request = tx.objectStore(STORE_NAME).put(entry);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n private txClear(db: IDBDatabase): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const request = tx.objectStore(STORE_NAME).clear();\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n}\n","/**\n * Flattens a nested object into dot-notation keys.\n *\n * @example\n * ```typescript\n * flattenJson({ LABEL: { HELLO: 'Hello', WORLD: 'World' }, BTN: { SAVE: 'Save' } })\n * // → { 'LABEL.HELLO': 'Hello', 'LABEL.WORLD': 'World', 'BTN.SAVE': 'Save' }\n * ```\n */\nexport function flattenJson(\n obj: Record<string, unknown>,\n parentKey = '',\n separator = '.',\n _visited = new Set<object>(),\n): Record<string, string> {\n _visited.add(obj);\n const result: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = parentKey ? `${parentKey}${separator}${key}` : key;\n\n if (value != null && typeof value === 'object' && !Array.isArray(value)) {\n if (_visited.has(value as object)) continue; // skip circular refs\n _visited.add(value as object);\n Object.assign(\n result,\n flattenJson(value as Record<string, unknown>, newKey, separator, _visited),\n );\n } else if (Array.isArray(value)) {\n if (_visited.has(value)) continue; // skip circular refs\n _visited.add(value);\n value.forEach((item, i) => {\n const arrKey = `${newKey}${separator}${i}`;\n if (item != null && typeof item === 'object' && !Array.isArray(item)) {\n if (_visited.has(item as object)) return;\n _visited.add(item as object);\n Object.assign(\n result,\n flattenJson(item as Record<string, unknown>, arrKey, separator, _visited),\n );\n } else {\n result[arrKey] = String(item ?? '');\n }\n });\n } else {\n result[newKey] = String(value ?? '');\n }\n }\n\n return result;\n}\n","/**\n * Convert a short language code to a full locale code using the provided mapping.\n * Returns the original code if no mapping is found or if it's already a full code.\n */\nexport function toFullLangCode(lang: string, mapping: Record<string, string>): string {\n if (lang.includes('-')) {\n return lang;\n }\n return mapping[lang] || lang;\n}\n\n/**\n * Convert a full locale code (e.g. 'en-US') to a short code (e.g. 'en').\n */\nexport function toShortLangCode(fullCode: string): string {\n return fullCode.split('-')[0];\n}\n\n/**\n * Build a reverse mapping from full locale codes to short codes.\n */\nexport function buildReverseMapping(localeMapping: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(localeMapping).map(([short, full]) => [full, short]));\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { from, Observable, of, shareReplay, Subject } from 'rxjs';\nimport { catchError, map, switchMap, tap } from 'rxjs/operators';\n\nimport { BLOCKS_LOCALIZATION_CONFIG } from './tokens';\nimport { BlocksLocalizationConfig, UilmLanguage, UilmModule } from './types';\nimport { UilmIndexedDbCache } from './uilm-indexeddb-cache';\nimport { TranslationMap } from './uilm-store';\nimport { flattenJson } from './utils/flatten-json';\nimport { toFullLangCode } from './utils/lang-codes';\n\n/** In-memory cache entry with a write timestamp for TTL checks. */\ninterface CacheEntry {\n data: TranslationMap;\n timestamp: number;\n}\n\n/**\n * Low-level HTTP client for fetching translations from the UILM API.\n *\n * ## Caching architecture (two-tier)\n *\n * | Layer | Storage | Lifetime | When enabled |\n * |-------|-----------------|-----------------|---------------------------|\n * | L1 | In-memory `Map` | Current session | Always |\n * | L2 | IndexedDB | Cross-session | `cacheStorage: 'indexeddb'`|\n *\n * ### Lookup order\n * 1. **L1 hit** (valid TTL) → return immediately\n * 2. **In-flight dedup** → share existing Observable\n * 3. **L2 hit** (valid TTL, if enabled) → populate L1, return\n * 4. **HTTP fetch** → populate L1 + L2, return\n * 5. **Error fallback chain**: stale L1 → stale L2 → local JSON → empty `{}`\n *\n * @publicApi\n */\n@Injectable({ providedIn: 'root' })\nexport class UilmLoader {\n private readonly http = inject(HttpClient);\n private readonly config = inject<BlocksLocalizationConfig>(BLOCKS_LOCALIZATION_CONFIG);\n private readonly idbCache = inject(UilmIndexedDbCache);\n private readonly destroyRef = inject(DestroyRef);\n\n /** L1 in-memory cache. */\n private readonly memCache = new Map<string, CacheEntry>();\n\n /** Tracks in-flight HTTP observables for request deduplication. */\n private readonly inflight = new Map<string, Observable<TranslationMap>>();\n\n /** Emits when a background revalidation produces updated translations. */\n readonly revalidated$ = new Subject<{ lang: string; data: TranslationMap }>();\n\n private availableModules: UilmModule[] = [];\n private availableLanguages: UilmLanguage[] = [];\n private shortToFullMapping: Record<string, string> = {};\n private modulesLoaded = false;\n private languagesLoaded = false;\n private metadataInflight$: Observable<void> | null = null;\n\n constructor() {\n if (this.config.localeMapping) {\n this.shortToFullMapping = { ...this.config.localeMapping };\n }\n }\n\n // ---------------------------------------------------------------------------\n // Derived config helpers\n // ---------------------------------------------------------------------------\n\n private get cacheTimeout(): number {\n return this.config.cacheTimeout ?? 0;\n }\n\n private get shouldPrefixKeys(): boolean {\n return !!this.config.prefixKeysWithModule;\n }\n\n private get useIndexedDb(): boolean {\n return this.config.cacheStorage === 'indexeddb';\n }\n\n private get shouldRevalidate(): boolean {\n return this.useIndexedDb && !!this.config.revalidateInBackground;\n }\n\n private get shouldFallbackToLocal(): boolean {\n return this.config.fallbackToLocal !== false;\n }\n\n private get localAssetsPath(): string {\n return this.config.localAssetsPath ?? 'assets/i18n';\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n /**\n * Fetch a single UILM module's translations.\n *\n * @param lang Short language code (e.g. `'en'`)\n * @param moduleName UILM module name as registered in the API\n * @param alias Optional alias used as the key prefix instead of the module name\n * @returns Observable emitting the (optionally prefixed) key→value map\n */\n fetchModuleTranslations(\n lang: string,\n moduleName: string,\n alias?: string,\n ): Observable<TranslationMap> {\n const prefix = alias ?? moduleName;\n const cacheKey = this.buildCacheKey(prefix, lang);\n\n // 1. L1 hit\n const l1Entry = this.memCache.get(cacheKey);\n if (l1Entry && this.isL1Valid(cacheKey)) {\n // Still fire background revalidation so stale cached data gets updated\n if (this.shouldRevalidate) {\n this.revalidateFromApi(lang, moduleName, prefix, cacheKey, l1Entry.data);\n }\n return of(l1Entry.data);\n }\n\n // 2. In-flight dedup\n const existing = this.inflight.get(cacheKey);\n if (existing) return existing;\n\n // 3. Build the fetch pipeline: L2 → HTTP → fallback\n const request$ = this.resolveTranslation(lang, moduleName, prefix, cacheKey).pipe(\n shareReplay(1),\n );\n\n this.inflight.set(cacheKey, request$);\n return request$;\n }\n\n /**\n * Attempt to load translations from IndexedDB cache only (no API, no metadata).\n * Returns `null` if IndexedDB is disabled or the entry is missing.\n * Used for instant store hydration before metadata is available.\n */\n loadFromCacheOnly(\n lang: string,\n moduleName: string,\n alias?: string,\n ): Observable<TranslationMap | null> {\n if (!this.useIndexedDb) return of(null);\n\n const prefix = alias ?? moduleName;\n const cacheKey = this.buildCacheKey(prefix, lang);\n\n // L1 hit\n const l1Entry = this.memCache.get(cacheKey);\n if (l1Entry && this.isL1Valid(cacheKey)) {\n return of(l1Entry.data);\n }\n\n return from(this.idbCache.get(cacheKey, this.cacheTimeout)).pipe(\n map((data) => {\n if (data) {\n this.memCache.set(cacheKey, { data, timestamp: Date.now() });\n }\n return data;\n }),\n catchError(() => of(null)),\n );\n }\n\n /** Ensure modules and languages metadata are loaded (fetches once, then no-ops). */\n ensureMetadataLoaded(): Observable<void> {\n if (this.modulesLoaded && this.languagesLoaded) {\n return of(undefined);\n }\n if (this.metadataInflight$) return this.metadataInflight$;\n this.metadataInflight$ = this.getAvailableModules().pipe(\n switchMap(() => this.getAvailableLanguages()),\n map(() => undefined),\n tap(() => {\n this.metadataInflight$ = null;\n }),\n catchError((err) => {\n this.metadataInflight$ = null;\n throw err;\n }),\n shareReplay(1),\n );\n return this.metadataInflight$;\n }\n\n /** Clear all translation caches (L1 in-memory, in-flight, and L2 IndexedDB if enabled). */\n clearCache(): void {\n this.memCache.clear();\n this.inflight.clear();\n if (this.useIndexedDb) {\n this.idbCache.clear();\n }\n }\n\n /** Fetch available languages from the UILM API. */\n getAvailableLanguages(): Observable<UilmLanguage[]> {\n if (this.languagesLoaded && this.availableLanguages.length > 0) {\n return of(this.availableLanguages);\n }\n\n const url = `${this.config.uilmApiBaseUrl}/Language/Gets?ProjectKey=${encodeURIComponent(this.config.projectKey)}`;\n\n return this.http.get<UilmLanguage[]>(url, { headers: this.buildHeaders() }).pipe(\n tap((languages) => {\n this.availableLanguages = languages ?? [];\n for (const lang of this.availableLanguages) {\n const shortCode = lang.languageCode.split('-')[0];\n // Only populate mapping if user config didn't already define this short code\n if (!this.shortToFullMapping[shortCode]) {\n this.shortToFullMapping[shortCode] = lang.languageCode;\n }\n }\n this.languagesLoaded = true;\n }),\n catchError(() => {\n this.languagesLoaded = true;\n return of([]);\n }),\n );\n }\n\n /** Fetch available modules from the UILM API. */\n getAvailableModules(): Observable<UilmModule[]> {\n if (this.modulesLoaded && this.availableModules.length > 0) {\n return of(this.availableModules);\n }\n\n const url = `${this.config.uilmApiBaseUrl}/Module/Gets?ProjectKey=${encodeURIComponent(this.config.projectKey)}`;\n\n return this.http.get<UilmModule[]>(url, { headers: this.buildHeaders() }).pipe(\n tap((modules) => {\n this.availableModules = modules ?? [];\n this.modulesLoaded = true;\n }),\n catchError(() => {\n this.modulesLoaded = true;\n return of([]);\n }),\n );\n }\n\n /** Get cached languages (empty until `ensureMetadataLoaded()` resolves). */\n getLanguages(): UilmLanguage[] {\n return this.availableLanguages;\n }\n\n /** Get cached modules (empty until `ensureMetadataLoaded()` resolves). */\n getModules(): UilmModule[] {\n return this.availableModules;\n }\n\n // ---------------------------------------------------------------------------\n // Private — cache helpers\n // ---------------------------------------------------------------------------\n\n private buildCacheKey(prefix: string, lang: string): string {\n return `${prefix}::${lang}`;\n }\n\n /** Check whether the L1 entry is present and within TTL. `cacheTimeout=0` means no expiry. */\n private isL1Valid(key: string): boolean {\n const entry = this.memCache.get(key);\n if (!entry) return false;\n if (this.cacheTimeout <= 0) return true; // 0 = no expiry, entry is always valid\n return Date.now() - entry.timestamp < this.cacheTimeout;\n }\n\n /** Write data to L1 (always) and L2 (when enabled). */\n private populateCache(key: string, data: TranslationMap): void {\n this.memCache.set(key, { data, timestamp: Date.now() });\n if (this.useIndexedDb) {\n // Fire-and-forget — IndexedDB write is best-effort\n this.idbCache.set(key, data);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private — fetch pipeline\n // ---------------------------------------------------------------------------\n\n /**\n * Resolve translations through the full L2 → HTTP → fallback chain.\n * Called only when L1 misses and no in-flight request exists.\n */\n private resolveTranslation(\n lang: string,\n moduleName: string,\n prefix: string,\n cacheKey: string,\n ): Observable<TranslationMap> {\n if (this.useIndexedDb) {\n return from(this.idbCache.get(cacheKey, this.cacheTimeout)).pipe(\n switchMap((idbData) => {\n if (idbData) {\n this.memCache.set(cacheKey, { data: idbData, timestamp: Date.now() });\n this.inflight.delete(cacheKey);\n\n if (this.shouldRevalidate) {\n this.revalidateFromApi(lang, moduleName, prefix, cacheKey, idbData);\n }\n\n return of(idbData);\n }\n return this.fetchFromApi(lang, moduleName, prefix, cacheKey);\n }),\n );\n }\n return this.fetchFromApi(lang, moduleName, prefix, cacheKey);\n }\n\n /** Issue the HTTP request and handle success / error with full fallback chain. */\n private fetchFromApi(\n lang: string,\n moduleName: string,\n prefix: string,\n cacheKey: string,\n ): Observable<TranslationMap> {\n const fullLangCode = toFullLangCode(lang, this.shortToFullMapping);\n const url =\n `${this.config.uilmApiBaseUrl}/Key/GetUilmFile` +\n `?ProjectKey=${this.config.projectKey}` +\n `&ModuleName=${encodeURIComponent(moduleName)}` +\n `&Language=${encodeURIComponent(fullLangCode)}`;\n\n return this.http.get<TranslationMap>(url, { headers: this.buildHeaders() }).pipe(\n map((data) => this.sanitizeApiResponse(data)),\n map((data) => (this.shouldPrefixKeys ? this.prefixKeys(data, prefix) : data)),\n tap((data) => {\n this.populateCache(cacheKey, data);\n this.inflight.delete(cacheKey);\n }),\n catchError(() => {\n this.inflight.delete(cacheKey);\n return this.resolveFromFallbacks(lang, moduleName, prefix, cacheKey);\n }),\n );\n }\n\n /**\n * Fallback chain on HTTP failure:\n * 1. Stale L1 (in-memory)\n * 2. Stale L2 (IndexedDB, if enabled)\n * 3. Local JSON file (if enabled)\n * 4. Empty map\n */\n private resolveFromFallbacks(\n lang: string,\n moduleName: string,\n prefix: string,\n cacheKey: string,\n ): Observable<TranslationMap> {\n // 1. Stale L1\n const staleL1 = this.memCache.get(cacheKey);\n if (staleL1) return of(staleL1.data);\n\n // 2. Stale L2\n if (this.useIndexedDb) {\n return from(this.idbCache.getStale(cacheKey)).pipe(\n switchMap((staleIdb) => {\n if (staleIdb) return of(staleIdb);\n return this.localFallbackOrEmpty(lang, moduleName, prefix);\n }),\n );\n }\n\n // 3 + 4. Local JSON or empty\n return this.localFallbackOrEmpty(lang, moduleName, prefix);\n }\n\n /** Attempt local JSON fallback, or return empty map. */\n private localFallbackOrEmpty(\n lang: string,\n moduleName: string,\n prefix: string,\n ): Observable<TranslationMap> {\n if (this.shouldFallbackToLocal) {\n return this.fetchLocalFallback(lang, moduleName, prefix);\n }\n return of({} as TranslationMap);\n }\n\n // ---------------------------------------------------------------------------\n // Private — local fallback\n // ---------------------------------------------------------------------------\n\n /**\n * Fetch translations from a local JSON file.\n * Nested JSON is automatically flattened to dot-notation keys.\n *\n * Path convention:\n * - Module with content: `{localAssetsPath}/{moduleName}/{lang}.json`\n * - Root/common module (empty alias): `{localAssetsPath}/{lang}.json`\n */\n private fetchLocalFallback(\n lang: string,\n moduleName: string,\n prefix: string,\n ): Observable<TranslationMap> {\n const path =\n prefix === ''\n ? `${this.localAssetsPath}/${lang}.json`\n : `${this.localAssetsPath}/${moduleName}/${lang}.json`;\n\n return this.http.get<Record<string, unknown>>(path).pipe(\n map((nested) => {\n const flat = flattenJson(nested);\n return this.shouldPrefixKeys ? this.prefixKeys(flat, prefix) : flat;\n }),\n tap((data) => this.populateCache(this.buildCacheKey(prefix, lang), data)),\n catchError(() => of({} as TranslationMap)),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Private — background revalidation\n // ---------------------------------------------------------------------------\n\n /**\n * Fire-and-forget API fetch that silently updates caches and emits on\n * `revalidated$` when the response differs from the currently cached data.\n */\n private revalidateFromApi(\n lang: string,\n moduleName: string,\n prefix: string,\n cacheKey: string,\n cachedData: TranslationMap,\n ): void {\n const fullLangCode = toFullLangCode(lang, this.shortToFullMapping);\n const url =\n `${this.config.uilmApiBaseUrl}/Key/GetUilmFile` +\n `?ProjectKey=${this.config.projectKey}` +\n `&ModuleName=${encodeURIComponent(moduleName)}` +\n `&Language=${encodeURIComponent(fullLangCode)}`;\n\n this.http\n .get<TranslationMap>(url, { headers: this.buildHeaders() })\n .pipe(\n map((data) => this.sanitizeApiResponse(data)),\n map((data) => (this.shouldPrefixKeys ? this.prefixKeys(data, prefix) : data)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (freshData) => {\n if (!this.shallowEqual(freshData, cachedData)) {\n this.populateCache(cacheKey, freshData);\n this.revalidated$.next({ lang, data: freshData });\n }\n },\n error: () => {\n /* silent — cached data is already served */\n },\n });\n }\n\n // ---------------------------------------------------------------------------\n // Private — utilities\n // ---------------------------------------------------------------------------\n\n private buildHeaders(): HttpHeaders {\n const headers: Record<string, string> = {\n 'x-blocks-key': this.config.projectKey,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n return new HttpHeaders(headers);\n }\n\n /** Ensure API response is a valid flat object. Returns empty map for malformed responses. */\n private sanitizeApiResponse(data: unknown): TranslationMap {\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n return {};\n }\n return data as TranslationMap;\n }\n\n /** Shallow key-by-key equality check for flat TranslationMaps. */\n private shallowEqual(a: TranslationMap, b: TranslationMap): boolean {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => a[key] === b[key]);\n }\n\n private prefixKeys(data: TranslationMap, prefix: string): TranslationMap {\n if (!prefix) return data;\n const prefixed: TranslationMap = {};\n const lowerPrefix = prefix.toLowerCase();\n for (const [key, value] of Object.entries(data)) {\n prefixed[`${lowerPrefix}.${key}`] = value;\n }\n return prefixed;\n }\n}\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\n\nimport { BLOCKS_LOCALIZATION_CONFIG } from './tokens';\nimport { BlocksLocalizationConfig } from './types';\nimport { buildReverseMapping } from './utils/lang-codes';\n\n/** Flat key → value translation map. */\nexport type TranslationMap = Record<string, string>;\n\n/**\n * Core reactive translation store.\n *\n * Holds translations per language, tracks the active language via signals,\n * and persists language preference to `localStorage`.\n *\n * @publicApi\n */\n@Injectable({ providedIn: 'root' })\nexport class UilmStore {\n private readonly config = inject<BlocksLocalizationConfig>(BLOCKS_LOCALIZATION_CONFIG);\n private readonly destroyRef = inject(DestroyRef);\n private readonly storageKey = this.config.langStorageKey ?? 'uilmLang';\n\n /** Internal translation maps: `lang → flat key-value pairs` */\n private readonly store = new Map<string, TranslationMap>();\n\n /** Toggled on every `setTranslation` call to trigger signal reactivity. */\n private readonly _version = signal(0);\n private versionCounter = 0;\n\n /** Active language short code. */\n readonly activeLang = signal<string>(this.loadPersistedLang());\n\n /**\n * When `true`, `translate()` returns the raw key instead of the translated value.\n * Toggled via `window.postMessage({ action: 'keymode', keymode: true/false })`.\n * Useful for testing with a browser extension.\n */\n readonly keyMode = signal(false);\n\n /** Read-only version signal — depend on this to react to translation changes. */\n readonly version = this._version.asReadonly();\n\n /** `true` when translations have been loaded for the active language. */\n readonly ready = computed(() => {\n this._version();\n return this.store.has(this.activeLang());\n });\n\n constructor() {\n this.listenForKeyModeToggle();\n }\n\n /**\n * Translate a key for the active language.\n * Supports interpolation: `{{ name }}` in values is replaced by `params.name`.\n *\n * Returns the raw key if no translation is found.\n */\n translate(key: string, params?: Record<string, unknown>): string {\n this._version(); // touch so computed signals re-evaluate\n\n // In key mode, always return the raw key for debugging/testing\n if (this.keyMode()) return key;\n\n const translations = this.store.get(this.activeLang());\n let value = translations?.[key];\n\n if (value == null) return key;\n\n if (params) {\n value = value.replace(/\\{\\{\\s*([\\w.]+)\\s*\\}\\}/g, (match, paramKey: string) => {\n const val = paramKey.split('.').reduce<unknown>((obj, k) => {\n if (obj != null && typeof obj === 'object' && !Array.isArray(obj)) {\n return (obj as Record<string, unknown>)[k];\n }\n return undefined;\n }, params);\n return val != null ? String(val) : match;\n });\n }\n\n return value;\n }\n\n /** Check if a translation key exists for the active language. */\n has(key: string): boolean {\n this._version();\n return this.store.get(this.activeLang())?.[key] != null;\n }\n\n /** Merge translations into the store for a given language. */\n setTranslation(data: TranslationMap, lang: string): void {\n const existing = this.store.get(lang) ?? {};\n this.store.set(lang, { ...existing, ...data });\n this.versionCounter = (this.versionCounter + 1) % 0x7fffffff;\n this._version.set(this.versionCounter);\n }\n\n /** Set active language and persist to `localStorage`. Ignores invalid language codes. */\n setActiveLang(lang: string): void {\n if (!this.config.availableLangs.includes(lang)) {\n console.warn(\n `[blocks-localization] \"${lang}\" is not in availableLangs [${this.config.availableLangs.join(', ')}]. Ignoring.`,\n );\n return;\n }\n this.activeLang.set(lang);\n this.persistLang(lang);\n }\n\n /** Get configured available languages. */\n getAvailableLangs(): string[] {\n return [...this.config.availableLangs];\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private getStorage(): Storage | null {\n try {\n const type = this.config.langStorage ?? 'localStorage';\n if (type === 'none') return null;\n return type === 'sessionStorage' ? sessionStorage : localStorage;\n } catch {\n return null;\n }\n }\n\n private loadPersistedLang(): string {\n try {\n const storage = this.getStorage();\n const stored = storage?.getItem(this.storageKey) ?? null;\n if (stored) {\n const reverse = this.config.localeMapping\n ? buildReverseMapping(this.config.localeMapping)\n : {};\n const shortCode = reverse[stored] ?? stored;\n if (this.config.availableLangs.includes(shortCode)) {\n return shortCode;\n }\n }\n } catch {\n // Storage unavailable (SSR, incognito restrictions, etc.)\n }\n return this.config.defaultLang;\n }\n\n private persistLang(lang: string): void {\n try {\n const storage = this.getStorage();\n if (!storage) return;\n const fullCode = this.config.localeMapping?.[lang] ?? lang;\n storage.setItem(this.storageKey, fullCode);\n } catch {\n // Storage unavailable\n }\n }\n\n /**\n * Listen for `window.postMessage` events to toggle key mode.\n *\n * Expected payload: `{ action: 'keymode', keymode: boolean }`\n *\n * Only messages from the same window and origin are accepted.\n * Toggling key mode bumps the version signal so all translated\n * values reactively update across the UI.\n */\n private listenForKeyModeToggle(): void {\n if (typeof window === 'undefined') return;\n\n const handler = (event: MessageEvent): void => {\n if (event.source !== window) return;\n if (event.origin !== window.location.origin) return;\n\n const { data } = event;\n if (!data || typeof data !== 'object') return;\n\n const { action, keymode } = data as { action?: string; keymode?: boolean };\n if (action === 'keymode' && typeof keymode === 'boolean') {\n const previous = this.keyMode();\n this.keyMode.set(keymode);\n\n if (previous !== keymode) {\n this.versionCounter = (this.versionCounter + 1) % 0x7fffffff;\n this._version.set(this.versionCounter);\n }\n }\n };\n\n window.addEventListener('message', handler);\n this.destroyRef.onDestroy(() => window.removeEventListener('message', handler));\n }\n}\n","import {\n DestroyRef,\n effect,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { forkJoin } from 'rxjs';\n\nimport { BLOCKS_LOCALIZATION_CONFIG } from './tokens';\nimport { BlocksLocalizationConfig, UilmModuleEntry } from './types';\nimport { UilmLoader } from './uilm-loader';\nimport { UilmStore } from './uilm-store';\n\n/**\n * Build an array of `fetchModuleTranslations` observables from module entries.\n * @internal\n */\nfunction buildRequests(loader: UilmLoader, modules: UilmModuleEntry[], lang: string) {\n return modules.map((m) =>\n typeof m === 'string'\n ? loader.fetchModuleTranslations(lang, m)\n : loader.fetchModuleTranslations(lang, m.module, m.alias),\n );\n}\n\n/**\n * Build an array of cache-only read observables from module entries.\n * @internal\n */\nfunction buildCacheRequests(loader: UilmLoader, modules: UilmModuleEntry[], lang: string) {\n return modules.map((m) =>\n typeof m === 'string'\n ? loader.loadFromCacheOnly(lang, m)\n : loader.loadFromCacheOnly(lang, m.module, m.alias),\n );\n}\n\n/**\n * Provides all UILM translation infrastructure for an Angular application.\n *\n * ## Strategies\n *\n * ### `'modular'` (default)\n * Preloads only the modules listed in `preloadModules` at startup.\n * Additional modules are lazily loaded per route via `provideUilmScope()`.\n * Shows empty placeholders while translations are loading.\n *\n * ### `'eager'`\n * All modules in `preloadModules` are fetched at startup (non-blocking).\n * Use `UilmLoadingScreenComponent` with `UilmStore.ready` to gate the UI\n * until translations are available. Route-level `provideUilmScope()` calls\n * become cache hits.\n *\n * @example\n * ```typescript\n * // Eager — all modules upfront with loading screen\n * provideBlocksLocalization({\n * strategy: 'eager',\n * preloadModules: [\n * { module: 'common', alias: '' },\n * 'dashboard',\n * { module: 'opportunity', alias: 'op' },\n * ],\n * // ...\n * })\n *\n * // app.component.html\n * // @if (!store.ready()) {\n * // <uilm-loading-screen />\n * // } @else {\n * // <router-outlet />\n * // }\n * ```\n *\n * @publicApi\n */\nexport function provideBlocksLocalization(config: BlocksLocalizationConfig) {\n const modules = config.preloadModules ?? [];\n\n return makeEnvironmentProviders([\n { provide: BLOCKS_LOCALIZATION_CONFIG, useValue: config },\n\n // -------------------------------------------------------------------------\n // Preload modules + language-change watcher\n // -------------------------------------------------------------------------\n ...(modules.length\n ? [\n provideEnvironmentInitializer(() => {\n const loader = inject(UilmLoader);\n const store = inject(UilmStore);\n const destroyRef = inject(DestroyRef);\n\n const loadForLang = (lang: string): void => {\n forkJoin(buildRequests(loader, modules, lang))\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((results) => {\n const merged = Object.assign({}, ...results);\n store.setTranslation(merged, lang);\n });\n };\n\n // Merge background revalidation updates into the store\n loader.revalidated$\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(({ lang, data }) => store.setTranslation(data, lang));\n\n // Hydrate from IndexedDB cache immediately (no metadata needed),\n // then let the normal metadata + API flow handle revalidation.\n if (config.revalidateInBackground && config.cacheStorage === 'indexeddb') {\n const lang = store.activeLang();\n forkJoin(buildCacheRequests(loader, modules, lang))\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((results) => {\n // Only hydrate if the store hasn't been populated yet\n // (avoids overwriting fresher API data that arrived first)\n if (store.ready()) return;\n const cached = results.filter(\n (r): r is NonNullable<typeof r> => r != null,\n );\n if (cached.length > 0) {\n store.setTranslation(Object.assign({}, ...cached), lang);\n }\n });\n }\n\n // Load for current language (metadata + API)\n loader\n .ensureMetadataLoaded()\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(() => loadForLang(store.activeLang()));\n\n // Re-load when language changes\n let previousLang = store.activeLang();\n effect(() => {\n const newLang = store.activeLang();\n if (newLang !== previousLang) {\n previousLang = newLang;\n loader\n .ensureMetadataLoaded()\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(() => loadForLang(newLang));\n }\n });\n }),\n ]\n : []),\n ]);\n}\n","import {\n DestroyRef,\n effect,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { forkJoin } from 'rxjs';\n\nimport { BLOCKS_LOCALIZATION_CONFIG } from './tokens';\nimport { BlocksLocalizationConfig, UilmModuleEntry } from './types';\nimport { UilmLoader } from './uilm-loader';\nimport { UilmStore } from './uilm-store';\n\nexport interface UilmScopeConfig {\n /**\n * UILM modules to load for this route.\n *\n * Each entry can be:\n * - A plain string (module name, used as-is for prefixing)\n * - An object `{ module: string, alias?: string }` to remap the prefix\n *\n * @example\n * ```typescript\n * provideUilmScope({\n * modules: [\n * 'dashboard',\n * { module: 'opportunity', alias: 'op' },\n * { module: 'backend', alias: 'be' },\n * ],\n * })\n * ```\n */\n modules: UilmModuleEntry[];\n}\n\nfunction normalizeEntries(modules: UilmModuleEntry[]): Array<{ module: string; alias?: string }> {\n return modules.map((m) => (typeof m === 'string' ? { module: m } : m));\n}\n\n/**\n * Route-level provider that lazily loads specific UILM modules on navigation.\n *\n * In `'eager'` strategy mode, translations are typically already cached\n * from the initial `APP_INITIALIZER` load. The loader's cache deduplication\n * ensures no redundant HTTP calls are made.\n *\n * Re-fetches automatically when the active language changes.\n * Subscriptions are auto-cleaned via `DestroyRef`.\n *\n * @publicApi\n */\nexport function provideUilmScope(config: UilmScopeConfig) {\n const entries = normalizeEntries(config.modules);\n\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => {\n const loader = inject(UilmLoader);\n const store = inject(UilmStore);\n const destroyRef = inject(DestroyRef);\n const globalConfig = inject<BlocksLocalizationConfig>(BLOCKS_LOCALIZATION_CONFIG);\n\n const loadForLang = (lang: string): void => {\n if (entries.length === 0) return;\n\n const requests = entries.map((e) =>\n loader.fetchModuleTranslations(lang, e.module, e.alias),\n );\n\n forkJoin(requests)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((results) => {\n const merged = Object.assign({}, ...results);\n store.setTranslation(merged, lang);\n });\n };\n\n // Merge background revalidation updates into the store\n loader.revalidated$\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(({ lang, data }) => store.setTranslation(data, lang));\n\n // Hydrate from IndexedDB cache immediately for instant rendering\n if (\n globalConfig.revalidateInBackground &&\n globalConfig.cacheStorage === 'indexeddb' &&\n entries.length > 0\n ) {\n const lang = store.activeLang();\n const cacheRequests = entries.map((e) =>\n loader.loadFromCacheOnly(lang, e.module, e.alias),\n );\n forkJoin(cacheRequests)\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((results) => {\n // Only hydrate if the store hasn't been populated yet\n // (avoids overwriting fresher API data that arrived first)\n if (store.ready()) return;\n const cached = results.filter(\n (r): r is NonNullable<typeof r> => r != null,\n );\n if (cached.length > 0) {\n store.setTranslation(Object.assign({}, ...cached), lang);\n }\n });\n }\n\n // In eager mode, skip the initial fetch — APP_INITIALIZER already loaded everything.\n // The loader cache will short-circuit anyway, but this avoids unnecessary forkJoin overhead.\n if (globalConfig.strategy !== 'eager') {\n loader\n .ensureMetadataLoaded()\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(() => loadForLang(store.activeLang()));\n }\n\n // Re-load when language changes (always needed — even in eager mode)\n let previousLang = store.activeLang();\n effect(() => {\n const newLang = store.activeLang();\n if (newLang !== previousLang) {\n previousLang = newLang;\n loader\n .ensureMetadataLoaded()\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe(() => loadForLang(newLang));\n }\n });\n }),\n ]);\n}\n","import { inject, Injectable, Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { UilmLanguage } from './types';\nimport { UilmLoader } from './uilm-loader';\nimport { UilmStore } from './uilm-store';\n\n/**\n * Headless language switching service.\n * Provides programmatic control over the active language.\n */\n@Injectable({ providedIn: 'root' })\nexport class BlocksLangSwitcher {\n private readonly store = inject(UilmStore);\n private readonly loader = inject(UilmLoader);\n\n /** Active language as a signal. */\n readonly activeLang: Signal<string> = this.store.activeLang;\n\n /** Get the currently active short language code. */\n getActiveLang(): string {\n return this.store.activeLang();\n }\n\n /** Get the list of configured available language codes. */\n getAvailableLangs(): string[] {\n return this.store.getAvailableLangs();\n }\n\n /**\n * Switch the active language.\n * @param lang Short language code (e.g. 'en', 'de')\n * @param reload Whether to reload the page after switching. Default: false\n */\n setActiveLang(lang: string, reload = false): void {\n this.store.setActiveLang(lang);\n if (reload && typeof window !== 'undefined') {\n window.location.reload();\n }\n }\n\n /** Fetch available languages from the UILM API. */\n getAvailableLanguagesFromApi(): Observable<UilmLanguage[]> {\n return this.loader.getAvailableLanguages();\n }\n\n /** Clear the translation cache. */\n clearCache(): void {\n this.loader.clearCache();\n }\n}\n","import {\n Directive,\n effect,\n EmbeddedViewRef,\n inject,\n input,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\n\nimport { UilmStore } from '../uilm-store';\n\n/**\n * Structural directive that provides a translation function to the template.\n * Re-renders when the active language or translations change.\n *\n * @example\n * ```html\n * <section *uilmTranslate=\"let t\">\n * <p>{{ t('dashboard.LABEL.TITLE') }}</p>\n * </section>\n * ```\n *\n * With scope (auto-prefixes keys):\n * ```html\n * <section *uilmTranslate=\"let t; scope: 'dashboard'\">\n * <p>{{ t('LABEL.TITLE') }}</p> <!-- resolves to dashboard.LABEL.TITLE -->\n * </section>\n * ```\n */\n@Directive({\n selector: '[uilmTranslate]',\n standalone: true,\n})\nexport class UilmTranslateDirective {\n private readonly store = inject(UilmStore);\n private readonly templateRef = inject(TemplateRef<UilmTranslateContext>);\n private readonly vcr = inject(ViewContainerRef);\n private viewRef: EmbeddedViewRef<UilmTranslateContext> | null = null;\n\n /** Optional scope prefix */\n readonly uilmTranslateScope = input<string>('');\n\n constructor() {\n effect(() => {\n this.store.activeLang();\n this.store.version();\n const isReady = this.store.ready();\n\n if (isReady) {\n this.ensureView();\n } else {\n this.vcr.clear();\n this.viewRef = null;\n }\n });\n }\n\n private ensureView(): void {\n const scope = this.uilmTranslateScope();\n\n const translateFn = (key: string, params?: Record<string, unknown>): string => {\n const resolve = (k: string): string | null =>\n this.store.has(k) ? this.store.translate(k, params) : null;\n\n const result = scope ? (resolve(`${scope}.${key}`) ?? resolve(key)) : resolve(key);\n\n return result ?? key;\n };\n\n if (this.viewRef) {\n // Update context in-place — preserves DOM, focus, scroll, animation state\n this.viewRef.context.$implicit = translateFn;\n this.viewRef.context.uilmTranslate = translateFn;\n this.viewRef.markForCheck();\n } else {\n this.viewRef = this.vcr.createEmbeddedView(this.templateRef, {\n $implicit: translateFn,\n uilmTranslate: translateFn,\n });\n }\n }\n\n static ngTemplateContextGuard(\n _dir: UilmTranslateDirective,\n _ctx: unknown,\n ): _ctx is UilmTranslateContext {\n return true;\n }\n}\n\ninterface UilmTranslateContext {\n $implicit: (key: string, params?: Record<string, unknown>) => string;\n uilmTranslate: (key: string, params?: Record<string, unknown>) => string;\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { UilmStore } from '../uilm-store';\n\n/**\n * Resolves a multilingual object to the value matching the current active language.\n *\n * @example\n * ```html\n * <!-- Given: { en: 'Hello', de: 'Hallo', fr: 'Bonjour' } -->\n * {{ item.name | multiLang }} <!-- outputs 'Hello' when lang is 'en' -->\n * ```\n */\n@Pipe({\n name: 'multiLang',\n standalone: true,\n pure: false,\n})\nexport class MultiLangPipe implements PipeTransform {\n private readonly store = inject(UilmStore);\n\n transform(value: Record<string, string> | string | null | undefined): string {\n if (!value || typeof value === 'string') {\n return (value as string) ?? '';\n }\n const lang = this.store.activeLang();\n const defaultLang = this.store.getAvailableLangs()[0];\n return value[lang] ?? (defaultLang ? value[defaultLang] : '') ?? '';\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { UilmStore } from '../uilm-store';\n\n/**\n * Impure pipe that translates a key using the UILM store.\n * Re-evaluates when the active language or translations change.\n *\n * @example\n * ```html\n * <p>{{ 'dashboard.LABEL.TITLE' | uilmTranslate }}</p>\n * <p>{{ 'LABEL.HELLO' | uilmTranslate: { name: userName } }}</p>\n * ```\n */\n@Pipe({\n name: 'uilmTranslate',\n standalone: true,\n pure: false,\n})\nexport class UilmTranslatePipe implements PipeTransform {\n private readonly store = inject(UilmStore);\n\n private lastKey = '';\n private lastLang = '';\n private lastVersion = -1;\n private lastParamsJson = '';\n private lastValue = '';\n\n transform(key: string, params?: Record<string, unknown>): string {\n const lang = this.store.activeLang();\n const version = this.store.version();\n\n if (!this.store.ready()) {\n return '';\n }\n\n const paramsJson = params ? JSON.stringify(params) : '';\n if (\n key === this.lastKey &&\n lang === this.lastLang &&\n version === this.lastVersion &&\n paramsJson === this.lastParamsJson\n ) {\n return this.lastValue;\n }\n\n this.lastKey = key;\n this.lastLang = lang;\n this.lastVersion = version;\n this.lastParamsJson = paramsJson;\n this.lastValue = this.store.has(key)\n ? this.store.translate(key, params)\n : key;\n return this.lastValue;\n }\n}\n","import { computed, inject, Injectable, Signal } from '@angular/core';\n\nimport { UilmStore } from './uilm-store';\n\n/**\n * Translation service for component classes.\n * Fully signal-based with sync helpers.\n *\n * @example\n * ```typescript\n * private readonly uilm = inject(UilmTranslateService);\n *\n * // Signal-based (reactive, updates on lang change + translation load)\n * title = this.uilm.t('dashboard.LABEL.TITLE');\n * // In template: {{ title() }}\n *\n * // Sync snapshot (does NOT react)\n * label = this.uilm.translate('dashboard.LABEL.TITLE');\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class UilmTranslateService {\n private readonly store = inject(UilmStore);\n\n /** Active language as a signal. */\n readonly activeLang: Signal<string> = this.store.activeLang;\n\n /**\n * Signal-based translation. Auto-updates on language change\n * and when new translations are loaded.\n */\n t(key: string, params?: Record<string, unknown>): Signal<string> {\n return computed(() => this.store.translate(key, params));\n }\n\n /** Synchronous translation snapshot. Does NOT react to changes. */\n translate(key: string, params?: Record<string, unknown>): string {\n return this.store.translate(key, params);\n }\n\n /** Current active language code. */\n getActiveLang(): string {\n return this.store.activeLang();\n }\n\n /** Set active language. */\n setActiveLang(lang: string): void {\n this.store.setActiveLang(lang);\n }\n\n /**\n * Signal-based batch translation. Reactive to lang and translation changes.\n */\n tMany(keys: string[], params?: Record<string, unknown>): Signal<Record<string, string>> {\n return computed(() => {\n const result: Record<string, string> = {};\n for (const key of keys) {\n result[key] = this.store.translate(key, params);\n }\n return result;\n });\n }\n\n /** Synchronous batch translation snapshot. */\n translateMany(keys: string[], params?: Record<string, unknown>): Record<string, string> {\n const result: Record<string, string> = {};\n for (const key of keys) {\n result[key] = this.store.translate(key, params);\n }\n return result;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, TemplateRef } from '@angular/core';\n\n@Component({\n selector: 'uilm-loading-screen',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"uilm-loading-screen\">\n @if (customTemplate()) {\n <ng-container *ngTemplateOutlet=\"customTemplate()!\" />\n } @else {\n <div class=\"uilm-loading-content\">\n <div class=\"uilm-loading-logo\">\n <svg\n width=\"44\"\n height=\"44\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" fill=\"#6366f1\" />\n <path\n d=\"M2 17l10 5 10-5\"\n stroke=\"#6366f1\"\n stroke-opacity=\"0.35\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M2 12l10 5 10-5\"\n stroke=\"#6366f1\"\n stroke-opacity=\"0.6\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <h2 class=\"uilm-loading-title\">{{ title() }}</h2>\n <p class=\"uilm-loading-description\">{{ description() }}</p>\n <div class=\"uilm-loading-bar\">\n <div class=\"uilm-loading-bar-fill\"></div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .uilm-loading-screen {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #fff;\n z-index: 9999;\n animation: uilm-fade-in 0.3s ease-out;\n }\n\n .uilm-loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n text-align: center;\n padding: 32px;\n }\n\n .uilm-loading-logo {\n display: flex;\n align-items: center;\n justify-content: center;\n animation: uilm-pulse 2s ease-in-out infinite;\n }\n\n .uilm-loading-title {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n color: #374151;\n letter-spacing: -0.01em;\n font-family:\n system-ui,\n -apple-system,\n sans-serif;\n }\n\n .uilm-loading-description {\n margin: 0;\n font-size: 1rem;\n color: #9ca3af;\n font-family:\n system-ui,\n -apple-system,\n sans-serif;\n }\n\n .uilm-loading-bar {\n width: 180px;\n height: 3px;\n background: rgba(0, 0, 0, 0.06);\n border-radius: 3px;\n overflow: hidden;\n margin-top: 4px;\n }\n\n .uilm-loading-bar-fill {\n height: 100%;\n width: 40%;\n background: #6366f1;\n border-radius: 3px;\n animation: uilm-slide 1.4s ease-in-out infinite;\n }\n\n @keyframes uilm-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes uilm-pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.04);\n opacity: 0.85;\n }\n }\n\n @keyframes uilm-slide {\n 0% {\n transform: translateX(-100%);\n }\n 50% {\n transform: translateX(350%);\n }\n 100% {\n transform: translateX(-100%);\n }\n }\n `,\n ],\n})\nexport class UilmLoadingScreenComponent {\n readonly title = input('Loading');\n readonly description = input('Loading translations...');\n\n /**\n * Optional custom template to replace the entire default loading UI.\n *\n * @example\n * ```html\n * <ng-template #customLoading>\n * <div class=\"my-loading\">\n * <img src=\"assets/logo.svg\" />\n * <p>Please wait...</p>\n * </div>\n * </ng-template>\n *\n * <uilm-loading-screen [customTemplate]=\"customLoading\" />\n * ```\n */\n readonly customTemplate = input<TemplateRef<unknown>>();\n}\n","/**\n * Creates an empty record with keys for each provided language.\n * Useful for initializing multilingual form models.\n *\n * @example\n * createI18nRecord(['en', 'de', 'fr']) // { en: '', de: '', fr: '' }\n */\nexport function createI18nRecord(langs: string[]): Record<string, string> {\n return langs.reduce<Record<string, string>>((acc, lang) => {\n acc[lang] = '';\n return acc;\n }, {});\n}\n","import { inject, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';\n\nimport { BLOCKS_LOCALIZATION_CONFIG } from '../lib/tokens';\nimport { BlocksLocalizationConfig } from '../lib/types';\nimport { UilmStore } from '../lib/uilm-store';\n\n/**\n * Provides a test-friendly translation setup with in-memory translations.\n * No HTTP calls are made.\n *\n * @example\n * ```typescript\n * TestBed.configureTestingModule({\n * providers: [\n * provideBlocksLocalizationTesting({\n * en: { 'dashboard.LABEL.HELLO': 'Hello', 'dashboard.LABEL.WORLD': 'World' },\n * de: { 'dashboard.LABEL.HELLO': 'Hallo', 'dashboard.LABEL.WORLD': 'Welt' },\n * }),\n * ],\n * });\n * ```\n */\nexport function provideBlocksLocalizationTesting(\n translations: Record<string, Record<string, string>> = { en: {} },\n config?: Partial<BlocksLocalizationConfig>,\n) {\n const langs = Object.keys(translations);\n const defaultLang = config?.defaultLang ?? langs[0] ?? 'en';\n\n const fullConfig: BlocksLocalizationConfig = {\n uilmApiBaseUrl: '',\n projectKey: '',\n availableLangs: langs,\n defaultLang,\n ...config,\n };\n\n return makeEnvironmentProviders([\n { provide: BLOCKS_LOCALIZATION_CONFIG, useValue: fullConfig },\n\n provideEnvironmentInitializer(() => {\n const store = inject(UilmStore);\n for (const [lang, data] of Object.entries(translations)) {\n store.setTranslation(data, lang);\n }\n // Ensure deterministic active language regardless of leftover localStorage\n store.setActiveLang(defaultLang);\n }),\n ]);\n}\n","// ---------------------------------------------------------------------------\n// Core configuration\n// ---------------------------------------------------------------------------\nexport { provideBlocksLocalization } from './lib/provide-blocks-localization';\nexport { BLOCKS_LOCALIZATION_CONFIG } from './lib/tokens';\nexport type {\n BlocksLocalizationConfig,\n UilmCacheStorage,\n UilmLangStorage,\n UilmLanguage,\n UilmLoadingStrategy,\n UilmModule,\n UilmModuleEntry,\n} from './lib/types';\n\n// ---------------------------------------------------------------------------\n// Core store & loader\n// ---------------------------------------------------------------------------\nexport { UilmIndexedDbCache } from './lib/uilm-indexeddb-cache';\nexport { UilmLoader } from './lib/uilm-loader';\nexport type { TranslationMap } from './lib/uilm-store';\nexport { UilmStore } from './lib/uilm-store';\n\n// ---------------------------------------------------------------------------\n// Route-level lazy module loading\n// ---------------------------------------------------------------------------\nexport type { UilmScopeConfig } from './lib/provide-uilm-scope';\nexport { provideUilmScope } from './lib/provide-uilm-scope';\n\n// ---------------------------------------------------------------------------\n// Language switching\n// ---------------------------------------------------------------------------\nexport { BlocksLangSwitcher } from './lib/lang-switcher';\n\n// ---------------------------------------------------------------------------\n// Template tools (directive, pipe, service)\n// ---------------------------------------------------------------------------\nexport { UilmTranslateDirective } from './lib/directives/uilm-translate.directive';\nexport { MultiLangPipe } from './lib/pipes/multi-lang.pipe';\nexport { UilmTranslatePipe } from './lib/pipes/uilm-translate.pipe';\nexport { UilmTranslateService } from './lib/uilm-translate.service';\n\n// ---------------------------------------------------------------------------\n// Components\n// ---------------------------------------------------------------------------\nexport { UilmLoadingScreenComponent } from './lib/components/uilm-loading-screen.component';\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\nexport { flattenJson } from './lib/utils/flatten-json';\nexport { createI18nRecord } from './lib/utils/i18n-record';\nexport { buildReverseMapping, toFullLangCode, toShortLangCode } from './lib/utils/lang-codes';\n\n// ---------------------------------------------------------------------------\n// Testing\n// ---------------------------------------------------------------------------\nexport { provideBlocksLocalizationTesting } from './testing/provide-blocks-localization-testing';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|