{"version":3,"file":"ngwr-i18n.mjs","sources":["../../../projects/lib/i18n/i18n-config.ts","../../../projects/lib/i18n/i18n-loader.ts","../../../projects/lib/i18n/i18n.ts","../../../projects/lib/i18n/t.pipe.ts","../../../projects/lib/i18n/t.directive.ts","../../../projects/lib/i18n/loaders/static-loader.ts","../../../projects/lib/i18n/loaders/http-loader.ts","../../../projects/lib/i18n/provide-wr-i18n.ts","../../../projects/lib/i18n/util.ts","../../../projects/lib/i18n/ngwr-i18n.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/** Translation catalog — flat or nested record of strings. */\nexport interface WrI18nCatalog {\n  readonly [key: string]: string | WrI18nCatalog;\n}\n\n/** Parameters passed to interpolation — coerced to strings via `String(v)`. */\nexport type WrI18nParams = Readonly<Record<string, unknown>>;\n\n/** Hook called once on every key that resolves to nothing. */\nexport type WrI18nMissingHandler = (key: string, locale: string) => string;\n\n/** User-facing config for {@link provideWrI18n}. */\nexport interface WrI18nConfig {\n  /** BCP-47 tag used until the user calls `setLocale`. @default 'en' */\n  readonly defaultLocale?: string;\n\n  /** Whitelisted locales — `setLocale` ignores anything outside this list. */\n  readonly availableLocales?: readonly string[];\n\n  /**\n   * Storage key for persisting the active locale (via `WrStorage`).\n   * Set to `null` to disable persistence. @default 'wr:i18n:locale'\n   */\n  readonly storageKey?: string | null;\n\n  /** Called when a key is missing. Default returns the key itself. */\n  readonly missingHandler?: WrI18nMissingHandler;\n}\n\n/** Resolved config — every field non-optional. @internal */\nexport interface WrI18nConfigResolved {\n  readonly defaultLocale: string;\n  readonly availableLocales: readonly string[];\n  readonly storageKey: string | null;\n  readonly missingHandler: WrI18nMissingHandler;\n}\n\nexport const DEFAULT_WR_I18N_CONFIG: WrI18nConfigResolved = {\n  defaultLocale: 'en',\n  availableLocales: ['en'],\n  storageKey: 'wr:i18n:locale',\n  missingHandler: key => key,\n};\n\nexport const WR_I18N_CONFIG = new InjectionToken<WrI18nConfigResolved>('WR_I18N_CONFIG', {\n  factory: () => DEFAULT_WR_I18N_CONFIG,\n});\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport { type Observable } from 'rxjs';\n\nimport { type WrI18nCatalog } from './i18n-config';\n\n/**\n * Loads a catalog for a `(locale, scope)` pair. `scope` is `null` for the\n * root catalog. Implementations may return the catalog synchronously\n * (via `of(...)`) for static catalogs or asynchronously (via HTTP) for\n * lazy fetches.\n */\nexport interface WrI18nLoader {\n  load(locale: string, scope: string | null): Observable<WrI18nCatalog>;\n}\n\nexport const WR_I18N_LOADER = new InjectionToken<WrI18nLoader>('WR_I18N_LOADER');\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Service, type Signal, computed, effect, inject, signal } from '@angular/core';\n\nimport { type Observable, firstValueFrom } from 'rxjs';\n\nimport { WrStorage } from 'ngwr/storage';\n\nimport { WR_I18N_CONFIG, type WrI18nCatalog, type WrI18nParams } from './i18n-config';\nimport { WR_I18N_LOADER } from './i18n-loader';\n\n/** Cache key shape: `<locale>::<scope|''>`. @internal */\nfunction cacheKey(locale: string, scope: string | null): string {\n  return `${locale}::${scope ?? ''}`;\n}\n\n/** Walk a dotted path through a catalog tree. Returns string | null. @internal */\nfunction walk(cat: WrI18nCatalog | null, key: string): string | null {\n  if (!cat) return null;\n  let node: string | WrI18nCatalog | undefined = cat;\n  for (const part of key.split('.')) {\n    if (node === undefined || typeof node === 'string') return null;\n    node = node[part];\n  }\n  return typeof node === 'string' ? node : null;\n}\n\n/**\n * `{{name}}` interpolation. Missing params resolve to `''`. Exported so\n * helpers in `util.ts` can interpolate the fallback template when no\n * `WrI18n` provider is wired up.\n *\n * @internal\n */\nexport function wrInterpolate(template: string, params: WrI18nParams | undefined): string {\n  if (!params) return template;\n  return template.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (_match, name: string) => {\n    const v = params[name];\n    if (v === undefined || v === null) return '';\n    if (typeof v === 'string') return v;\n    if (typeof v === 'number' || typeof v === 'boolean') return String(v);\n    try {\n      return JSON.stringify(v);\n    } catch {\n      return '';\n    }\n  });\n}\n\n/**\n * Reactive i18n service. Holds:\n *\n * - the active locale as a `Signal<string>`\n * - per-`(locale, scope)` catalogs in a `Map` (loaded once, then cached)\n * - a per-locale signal counter so every `translate()` reading the signal\n *   re-evaluates the moment a new catalog finishes loading\n *\n * Translations are looked up scope-first, then root. `t('forms.save', { ... })`\n * with `scope: 'forms'` will try the scoped catalog before falling back to\n * `forms.save` in the root catalog — useful for per-feature overrides.\n *\n * @example\n * ```ts\n * const i18n = inject(WrI18n);\n * i18n.use('ru');                                  // switch locale\n * i18n.t('cart.checkout');                         // → 'Оформить заказ'\n * i18n.t('greeting', { name: 'Ada' });             // → 'Hello, Ada!'\n *\n * effect(() => console.log(i18n.translate('hi')())); // re-runs on locale change\n * ```\n *\n * @see https://ngwr.dev/services/i18n\n */\n@Service()\nexport class WrI18n {\n  private readonly config = inject(WR_I18N_CONFIG);\n  private readonly loader = inject(WR_I18N_LOADER);\n  private readonly storage = inject(WrStorage);\n\n  /** Per-(locale,scope) catalogs, populated by `loadCatalog`. @internal */\n  private readonly catalogs = new Map<string, WrI18nCatalog>();\n\n  /** Bumped after each catalog write so reactive translates recompute. @internal */\n  private readonly revision = signal(0);\n\n  /** In-flight load promises — dedupes parallel `t()` callers. @internal */\n  private readonly inflight = new Map<string, Promise<WrI18nCatalog>>();\n\n  /** Registered scopes — auto-loaded whenever the locale changes. @internal */\n  private readonly scopes = new Set<string>();\n\n  /** Active locale. Writes go through `use()` so storage stays in sync. */\n  private readonly _locale = signal<string>(this.initialLocale());\n  readonly locale: Signal<string> = this._locale.asReadonly();\n\n  constructor() {\n    // Eagerly load the root catalog + every registered scope for the\n    // current locale. Subsequent locale changes refire the same effect.\n    effect(() => {\n      const lc = this._locale();\n      void this.loadCatalog(lc, null);\n      for (const sc of this.scopes) void this.loadCatalog(lc, sc);\n    });\n  }\n\n  // Locale\n\n  /** Switch active locale. Ignored when not whitelisted. */\n  use(locale: string): void {\n    if (!this.config.availableLocales.includes(locale)) return;\n    this._locale.set(locale);\n    if (this.config.storageKey) this.storage.set(this.config.storageKey, locale);\n  }\n\n  /** Available locales — pass-through from config. */\n  available(): readonly string[] {\n    return this.config.availableLocales;\n  }\n\n  // Scopes\n\n  /**\n   * Register a scope so its catalog loads alongside the root one. Idempotent.\n   * Returns a promise resolving once the current locale's scope catalog is in\n   * the cache — handy for feature `canActivate` guards.\n   */\n  registerScope(scope: string): Promise<WrI18nCatalog> {\n    this.scopes.add(scope);\n    return this.loadCatalog(this._locale(), scope);\n  }\n\n  // Translate\n\n  /**\n   * Eager translate — returns the current value or the missing-handler\n   * fallback. Does NOT auto-load missing catalogs; combine with the\n   * reactive `translate(...)` if you want load-on-demand.\n   */\n  t(key: string, params?: WrI18nParams, scope?: string): string {\n    // Read revision so callers inside computed/effect re-run on updates.\n    this.revision();\n    const lc = this._locale();\n\n    let hit = scope ? walk(this.catalogs.get(cacheKey(lc, scope)) ?? null, key) : null;\n    hit ??= walk(this.catalogs.get(cacheKey(lc, null)) ?? null, key);\n\n    if (hit === null) {\n      // Fire a background load so a future read can resolve it.\n      void this.loadCatalog(lc, scope ?? null);\n      return this.config.missingHandler(key, lc);\n    }\n    return wrInterpolate(hit, params);\n  }\n\n  /** Reactive translate — re-evaluates on locale or catalog updates. */\n  translate(key: string, params?: WrI18nParams, scope?: string): Signal<string> {\n    return computed(() => this.t(key, params, scope));\n  }\n\n  // Internals\n\n  private initialLocale(): string {\n    if (this.config.storageKey) {\n      const saved = this.storage.get<string>(this.config.storageKey);\n      if (saved && this.config.availableLocales.includes(saved)) return saved;\n    }\n    return this.config.defaultLocale;\n  }\n\n  private loadCatalog(locale: string, scope: string | null): Promise<WrI18nCatalog> {\n    const ck = cacheKey(locale, scope);\n    const cached = this.catalogs.get(ck);\n    if (cached) return Promise.resolve(cached);\n\n    const pending = this.inflight.get(ck);\n    if (pending) return pending;\n\n    const stream: Observable<WrI18nCatalog> = this.loader.load(locale, scope);\n    const promise = firstValueFrom(stream)\n      .then(catalog => {\n        this.catalogs.set(ck, catalog);\n        this.revision.update(v => v + 1);\n        return catalog;\n      })\n      .catch((err: unknown) => {\n        // eslint-disable-next-line no-console -- intentional diagnostic for missing catalog\n        console.warn(`[ngwr/i18n] failed to load (${locale}, ${scope ?? 'root'})`, err);\n        const empty: WrI18nCatalog = {};\n        this.catalogs.set(ck, empty);\n        return empty;\n      })\n      .finally(() => {\n        this.inflight.delete(ck);\n      });\n\n    this.inflight.set(ck, promise);\n    return promise;\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Pipe, type PipeTransform, inject } from '@angular/core';\n\nimport { WrI18n } from './i18n';\nimport { type WrI18nParams } from './i18n-config';\n\n/**\n * Translate a key. Impure — re-evaluates on every CD so locale switches\n * and catalog loads propagate without a manual refresh.\n *\n * @example\n * ```html\n * <h1>{{ 'home.title' | wrT }}</h1>\n * <p>{{ 'greeting' | wrT: { name: user().name } }}</p>\n * <button>{{ 'forms.save' | wrT: null : 'checkout' }}</button>\n * ```\n */\n// eslint-disable-next-line @angular-eslint/no-pipe-impure -- intentional: locale + catalog updates must propagate even when args are stable\n@Pipe({ name: 'wrT', pure: false })\nexport class WrTPipe implements PipeTransform {\n  private readonly i18n = inject(WrI18n);\n\n  transform(key: string, params?: WrI18nParams | null, scope?: string): string {\n    return this.i18n.t(key, params ?? undefined, scope);\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directive, ElementRef, computed, effect, inject, input } from '@angular/core';\n\nimport { WrI18n } from './i18n';\nimport { type WrI18nParams } from './i18n-config';\n\n/**\n * Attribute directive that sets `textContent` of its host to the translation\n * of the bound key. Reactive — re-renders on locale + catalog changes.\n *\n * @example\n * ```html\n * <span [wrT]=\"'home.title'\"></span>\n * <span [wrT]=\"'greeting'\" [wrTParams]=\"{ name: user().name }\"></span>\n * <span [wrT]=\"'forms.save'\" wrTScope=\"checkout\"></span>\n * ```\n */\n@Directive({\n  selector: '[wrT]',\n})\nexport class WrTDirective {\n  /** Translation key. Required. */\n  readonly wrT = input.required<string>();\n\n  /** Interpolation params for `{{name}}` tokens. */\n  readonly wrTParams = input<WrI18nParams | null>(null);\n\n  /** Optional scope — scoped lookup first, then root fallback. */\n  readonly wrTScope = input<string | null>(null);\n\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly i18n = inject(WrI18n);\n\n  private readonly text = computed(() =>\n    this.i18n.t(this.wrT(), this.wrTParams() ?? undefined, this.wrTScope() ?? undefined)\n  );\n\n  constructor() {\n    effect(() => {\n      this.host.nativeElement.textContent = this.text();\n    });\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type Observable, of } from 'rxjs';\n\nimport { type WrI18nCatalog } from '../i18n-config';\nimport { type WrI18nLoader } from '../i18n-loader';\n\n/** Root catalogs keyed by locale: `{ en: catalog, ru: catalog, … }`. */\nexport type WrI18nStaticCatalogs = Readonly<Record<string, WrI18nCatalog>>;\n\n/** Per-scope catalogs: `{ checkout: { en: catalog, ru: catalog }, … }`. */\nexport type WrI18nStaticScopedCatalogs = Readonly<Record<string, WrI18nStaticCatalogs>>;\n\n/**\n * Loader for catalogs already in memory (imported from JSON or generated).\n *\n * - Pass `catalogs` for the root catalog of every locale.\n * - Pass `scopes` if you ship per-feature catalogs the loader should serve\n *   to `WrI18n.registerScope(name)` calls.\n *\n * Missing locale or scope resolves to `{}` — the missing-key handler then\n * decides what to render.\n */\nexport class WrI18nStaticLoader implements WrI18nLoader {\n  constructor(\n    private readonly catalogs: WrI18nStaticCatalogs,\n    private readonly scopes: WrI18nStaticScopedCatalogs = {}\n  ) {}\n\n  load(locale: string, scope: string | null): Observable<WrI18nCatalog> {\n    if (scope === null) return of(this.catalogs[locale] ?? {});\n    return of(this.scopes[scope]?.[locale] ?? {});\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { HttpClient } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { type Observable, catchError, of } from 'rxjs';\n\nimport { type WrI18nCatalog } from '../i18n-config';\nimport { type WrI18nLoader } from '../i18n-loader';\n\n/** Configuration for {@link WrI18nHttpLoader}. */\nexport interface WrI18nHttpLoaderConfig {\n  /**\n   * URL template. Tokens:\n   * - `{locale}` — required, BCP-47 tag (e.g. `en`).\n   * - `{scope}` — optional, scope name. Use the `rootPath` if you need a\n   *   different path entirely for the root catalog.\n   *\n   * @example\n   * ```ts\n   * { path: '/assets/i18n/{locale}.json' }                  // root only\n   * { path: '/assets/i18n/{scope}/{locale}.json',\n   *   rootPath: '/assets/i18n/{locale}.json' }              // root + scopes\n   * ```\n   */\n  readonly path: string;\n  /** Path template for the root catalog. Defaults to `path`. */\n  readonly rootPath?: string;\n}\n\n/**\n * Loader that fetches catalogs via `HttpClient`. Failures resolve to `{}`\n * (logged once at the service layer) so a missing file never throws into\n * user code.\n */\nexport class WrI18nHttpLoader implements WrI18nLoader {\n  private readonly http = inject(HttpClient);\n\n  constructor(private readonly config: WrI18nHttpLoaderConfig) {}\n\n  load(locale: string, scope: string | null): Observable<WrI18nCatalog> {\n    const template = scope === null ? (this.config.rootPath ?? this.config.path) : this.config.path;\n    const url = template.replace('{locale}', locale).replace('{scope}', scope ?? '');\n    return this.http.get<WrI18nCatalog>(url).pipe(catchError(() => of<WrI18nCatalog>({})));\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type EnvironmentProviders, type Provider, makeEnvironmentProviders } from '@angular/core';\n\nimport { DEFAULT_WR_I18N_CONFIG, WR_I18N_CONFIG, type WrI18nConfig, type WrI18nConfigResolved } from './i18n-config';\nimport { WR_I18N_LOADER, type WrI18nLoader } from './i18n-loader';\nimport { WrI18nHttpLoader, type WrI18nHttpLoaderConfig } from './loaders/http-loader';\nimport {\n  WrI18nStaticLoader,\n  type WrI18nStaticCatalogs,\n  type WrI18nStaticScopedCatalogs,\n} from './loaders/static-loader';\n\n/**\n * Configure {@link WrI18n}. Either pass a `loader` directly, or use the\n * `provideWrI18nHttpLoader` / `provideWrI18nStaticLoader` helpers in the\n * same providers array.\n */\nexport interface ProvideWrI18nOptions extends WrI18nConfig {\n  readonly loader?: WrI18nLoader;\n}\n\nexport function provideWrI18n(options: ProvideWrI18nOptions = {}): EnvironmentProviders {\n  const { loader, ...config } = options;\n  const merged: WrI18nConfigResolved = { ...DEFAULT_WR_I18N_CONFIG, ...config };\n\n  const providers: Provider[] = [{ provide: WR_I18N_CONFIG, useValue: merged }];\n  if (loader) providers.push({ provide: WR_I18N_LOADER, useValue: loader });\n\n  return makeEnvironmentProviders(providers);\n}\n\n/**\n * Provide a static loader — catalogs already in memory.\n *\n * @param catalogs Root catalogs keyed by locale.\n * @param scopes Optional per-scope catalogs served to `registerScope(name)`.\n */\nexport function provideWrI18nStaticLoader(\n  catalogs: WrI18nStaticCatalogs,\n  scopes?: WrI18nStaticScopedCatalogs\n): Provider {\n  return { provide: WR_I18N_LOADER, useValue: new WrI18nStaticLoader(catalogs, scopes) };\n}\n\n/** Provide an HTTP loader — catalogs fetched from URLs. Requires `provideHttpClient`. */\nexport function provideWrI18nHttpLoader(config: WrI18nHttpLoaderConfig): Provider {\n  return { provide: WR_I18N_LOADER, useFactory: () => new WrI18nHttpLoader(config) };\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type Signal, computed, inject, signal } from '@angular/core';\n\nimport { WrI18n, wrInterpolate } from './i18n';\nimport type { WrI18nParams } from './i18n-config';\n\n/**\n * Helper for component default text. Returns a reactive string that:\n *\n * 1. Prefers the consumer's override (an `input<string | null>()` value).\n * 2. Falls back to the i18n catalog under `key` — re-renders on locale\n *    change so a switcher updates the DOM live.\n * 3. Falls back to `fallback` when no `WrI18n` is provided OR the catalog\n *    is missing the key.\n *\n * Components don't need a hard dependency on `provideWrI18n` — without it,\n * the fallback is returned and everything still works.\n *\n * @example\n * ```ts\n * readonly emptyText = input<string | null>(null);\n * protected readonly empty = useI18nText(this.emptyText, 'table.empty', 'No data');\n *\n * // In template:  <div>{{ empty() }}</div>\n * ```\n */\nexport function useI18nText(binding: Signal<string | null | undefined>, key: string, fallback: string): Signal<string> {\n  const i18n = inject(WrI18n, { optional: true });\n  if (!i18n) {\n    return computed(() => {\n      const v = binding();\n      return v ?? fallback;\n    });\n  }\n\n  return computed(() => {\n    const v = binding();\n    if (v !== null && v !== undefined && v !== '') return v;\n    const translated = i18n.t(key);\n    // Default missing handler returns the key itself — treat that as \"missing\"\n    // and use our explicit fallback.\n    return translated === key ? fallback : translated;\n  });\n}\n\n/**\n * Like {@link useI18nText} but takes a literal value (not a Signal) — for\n * computed `aria-label`s that already mix a static piece with a dynamic\n * value. Returns the resolved string once, at injection time.\n */\nexport function readI18nText(key: string, fallback: string): string {\n  const i18n = inject(WrI18n, { optional: true });\n  if (!i18n) return fallback;\n  const v = i18n.t(key);\n  return v === key ? fallback : v;\n}\n\n/** Tiny shim — useful when the caller doesn't have an `input` to forward. */\nexport function nullSignal(): Signal<null> {\n  return signal(null).asReadonly();\n}\n\n/**\n * Build a per-call formatter for parametrized labels (e.g. ARIA labels\n * that interpolate a per-row value: `\"Remove {{label}}\"`). Returns a\n * function the template calls with the params for the current item.\n *\n * The returned function:\n * - Re-resolves the i18n catalog on every call (live locale switches just\n *   work — re-rendered templates pick up new strings).\n * - Falls back to the literal `fallback` template with the same\n *   `{{name}}` syntax when no `WrI18n` provider is present, or when the\n *   key is missing.\n *\n * Use this for labels that vary per row. For static labels, prefer\n * {@link useI18nText} or {@link readI18nText}.\n *\n * @example\n * ```ts\n * protected readonly removeChipLabel = useI18nFormatter('select.removeItem', 'Remove {{label}}');\n *\n * // In template:\n * // [attr.aria-label]=\"removeChipLabel({ label: chip.label })\"\n * ```\n */\nexport function useI18nFormatter(key: string, fallback: string): (params?: WrI18nParams) => string {\n  const i18n = inject(WrI18n, { optional: true });\n  if (!i18n) {\n    return (params?: WrI18nParams) => wrInterpolate(fallback, params);\n  }\n  return (params?: WrI18nParams) => {\n    const v = i18n.t(key, params);\n    return v === key ? wrInterpolate(fallback, params) : v;\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}