{"version":3,"file":"ng-dynamic-mf-translate.mjs","sources":["../../projects/ng-dynamic-mf/translate/src/translation-resolver.type.ts","../../projects/ng-dynamic-mf/translate/src/dynamic-translations.service.ts","../../projects/ng-dynamic-mf/translate/src/ng-dynamic-mf-translate.ts"],"sourcesContent":["import { TranslationType } from './translations.type';\r\n\r\n/**\r\n * An asset resolver is a function that returns the path to a translation file.\r\n * Internally, the path is resolved using this library's resouceMapper logic, so it can work with module federation.\r\n */\r\nexport type AssetResolver = {\r\n  moduleName: string;\r\n  path: string;\r\n};\r\n\r\nexport function isAssetResolver(resolver: TranslationResolver): resolver is AssetResolver {\r\n  return (resolver as AssetResolver).moduleName !== undefined;\r\n}\r\n\r\n/**\r\n * A translation resolver can be a translation object, a function that returns a translation object,\r\n * a promise that resolves to a translation object, a function that returns a promise that resolves to a translation object,\r\n * or an asset resolver.\r\n */\r\nexport type TranslationResolver =\r\n  | TranslationType\r\n  | (() => TranslationType)\r\n  | Promise<TranslationType>\r\n  | (() => Promise<TranslationType>)\r\n  | AssetResolver;\r\n\r\nexport type TranslationResolverMultiLocale = { [locale: string]: TranslationResolver };\r\n\r\nexport type TranslationResolverSet = {\r\n  [key: string]: TranslationResolverMultiLocale;\r\n};\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { resourceMapper } from 'ng-dynamic-mf';\r\nimport {\r\n  BehaviorSubject,\r\n  combineLatest,\r\n  distinctUntilChanged,\r\n  filter,\r\n  firstValueFrom,\r\n  map,\r\n  Observable,\r\n  startWith,\r\n} from 'rxjs';\r\n\r\nimport {\r\n  isAssetResolver,\r\n  TranslationResolver,\r\n  TranslationResolverMultiLocale,\r\n  TranslationResolverSet,\r\n} from './translation-resolver.type';\r\nimport { TranslationType } from './translations.type';\r\n\r\ntype TranslationResolverState = {\r\n  resolver: TranslationResolver;\r\n  key: string;\r\n  loadedTranslations: TranslationType | null;\r\n};\r\n\r\ntype TranslationStore = {\r\n  [locale: string]: TranslationResolverState[];\r\n};\r\n\r\n/**\r\n * This service is used to dynamically load translations from different modules.\r\n * It uses @ngx-translate/core internally, so make sure you have it installed and\r\n * the TranslateModule is imported correctly.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class DynamicTranslationService {\r\n  private readonly _translateService = inject(TranslateService);\r\n  private readonly _translationsInvalidated = new BehaviorSubject<boolean>(false);\r\n  private readonly _translationsUpdated = new BehaviorSubject<void>(undefined);\r\n  private readonly _translationStore: TranslationStore = {};\r\n  private _locale =\r\n    this._translateService.currentLang || this._translateService.defaultLang || 'en';\r\n  private _debugMode = false;\r\n\r\n  constructor() {\r\n    this._translateService.onLangChange.subscribe(e => {\r\n      if (this._locale === e.lang) {\r\n        return;\r\n      }\r\n      this._locale = e.lang;\r\n      this.invalidateTranslations();\r\n    });\r\n\r\n    this._translationsInvalidated.pipe(filter(x => x)).subscribe(() => {\r\n      this.loadTranslations();\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Sets the debug mode. In debug mode, the translation values are replaced with their keys.\r\n   * @param debugMode Whether to enable debug mode\r\n   */\r\n  public setDebugMode(debugMode: boolean) {\r\n    this._debugMode = debugMode;\r\n    this.invalidateTranslations();\r\n  }\r\n\r\n  /**\r\n   * Registers a resolver for translations for a specific locale.\r\n   * @param translationSetIdentifier The identifier of the translations (e.g. the name of the module)\r\n   * @param locale The locale of the translations\r\n   * @param translationResolver The resolver for the translations\r\n   */\r\n  public registerTranslationSetForLocale(\r\n    translationSetIdentifier: string,\r\n    locale: string,\r\n    translationResolver: TranslationResolver\r\n  ) {\r\n    this.registerSingleTranslation(translationSetIdentifier, locale, translationResolver);\r\n    this.invalidateTranslations();\r\n  }\r\n\r\n  /**\r\n   * Registers resolvers for translations for multiple locales.\r\n   * @param translationSetIdentifier The identifier of the translations (e.g. the name of the module)\r\n   * @param translationResolvers The resolvers for the translations\r\n   */\r\n  public registerTranslationSet(\r\n    translationSetIdentifier: string,\r\n    translationResolvers: TranslationResolverMultiLocale\r\n  ) {\r\n    this.doRegisterTranslationSet(translationSetIdentifier, translationResolvers);\r\n    this.invalidateTranslations();\r\n  }\r\n\r\n  /**\r\n   * Registers multiple translation resolvers for multiple locales.\r\n   * @param set The set of resolvers for the translations\r\n   */\r\n  public registerMultipleTranslationSets(set: TranslationResolverSet) {\r\n    Object.keys(set).forEach(translationSetKey => {\r\n      this.doRegisterTranslationSet(translationSetKey, set[translationSetKey]);\r\n    });\r\n    this.invalidateTranslations();\r\n  }\r\n\r\n  private doRegisterTranslationSet(\r\n    translationSetIdentifier: string,\r\n    translationResolvers: TranslationResolverMultiLocale\r\n  ) {\r\n    Object.keys(translationResolvers).forEach(locale => {\r\n      this.registerSingleTranslation(\r\n        translationSetIdentifier,\r\n        locale,\r\n        translationResolvers[locale]\r\n      );\r\n    });\r\n  }\r\n\r\n  private registerSingleTranslation(\r\n    translationSetIdentifier: string,\r\n    locale: string,\r\n    translationResolver: TranslationResolver\r\n  ) {\r\n    const translationResolvers = this._translationStore[locale] || [];\r\n    const existing = translationResolvers.find(r => r.key === translationSetIdentifier);\r\n\r\n    if (existing) {\r\n      existing.resolver = translationResolver;\r\n      existing.loadedTranslations = null;\r\n    } else {\r\n      translationResolvers.push({\r\n        resolver: translationResolver,\r\n        key: translationSetIdentifier,\r\n        loadedTranslations: null,\r\n      });\r\n      this._translationStore[locale] ??= translationResolvers;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes a translation set for a specific locale.\r\n   * @param translationSetIdentifier The identifier of the translations (e.g. the name of the module)\r\n   * @param locale The locale of the translations. If not specified, the translations will be removed for all locales.\r\n   */\r\n  public removeTranslation(translationSetIdentifier: string, locale?: string) {\r\n    if (!locale) {\r\n      Object.keys(this._translationStore).forEach(l => {\r\n        this.doRemoveTranslation(translationSetIdentifier, l);\r\n      });\r\n    } else {\r\n      this.doRemoveTranslation(translationSetIdentifier, locale);\r\n    }\r\n    this.invalidateTranslations();\r\n  }\r\n\r\n  /**\r\n   * Asynchronously checks if a translation set is loaded for the current locale.\r\n   * @param translationSetIdentifier The identifier of the translations (e.g. the name of the module)\r\n   * @returns Observable that emits true if the translation set is loaded, false otherwise\r\n   */\r\n  public isTranslationSetLoaded(translationSetIdentifier: string): Observable<boolean> {\r\n    return combineLatest([\r\n      this._translateService.onLangChange.pipe(startWith(undefined)),\r\n      this._translationsUpdated,\r\n    ]).pipe(\r\n      map(() => this.isTranslationSetLoadedSync(translationSetIdentifier)),\r\n      distinctUntilChanged()\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Resolves if a translation set is loaded for the current locale.\r\n   * @param translationSetIdentifier The identifier of the translations (e.g. the name of the module)\r\n   * @returns Promise that resolves if the translation set is loaded, never rejects (use isTranslationSetLoaded() to check if the translation set is loaded)\r\n   */\r\n  public async ensureTranslationSetIsLoaded(translationSetIdentifier: string): Promise<void> {\r\n    await firstValueFrom(\r\n      this.isTranslationSetLoaded(translationSetIdentifier).pipe(filter(loaded => loaded))\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Checks if a translation set is loaded for the current locale.\r\n   * @param translationSetIdentifier The identifier of the translations (e.g. the name of the module)\r\n   * @returns true if the translation set is loaded, false otherwise\r\n   */\r\n  public isTranslationSetLoadedSync(translationSetIdentifier: string): boolean {\r\n    if (!this._locale) {\r\n      return false;\r\n    }\r\n    const set = this._translationStore[this._locale!];\r\n    if (!set) {\r\n      return false;\r\n    }\r\n    return set.some(r => r.key === translationSetIdentifier && !!r.loadedTranslations);\r\n  }\r\n\r\n  private doRemoveTranslation(translationSetIdentifier: string, locale: string) {\r\n    const translationResolvers = this._translationStore[locale] ?? [];\r\n    const index = translationResolvers.findIndex(r => r.key === translationSetIdentifier);\r\n    if (index !== -1) {\r\n      translationResolvers.splice(index, 1);\r\n    }\r\n  }\r\n\r\n  private invalidateTranslations() {\r\n    this._translationsInvalidated.next(true);\r\n  }\r\n\r\n  private async loadTranslations() {\r\n    const locale = this._locale;\r\n    if (!locale) {\r\n      return;\r\n    }\r\n    const translationResolvers = this._translationStore[locale] ?? [];\r\n    await this.resolveTranslations(translationResolvers);\r\n    const loadedTranslations = this.mergeLoadedTranslations(translationResolvers);\r\n    this._translateService.setTranslation(locale, loadedTranslations, true);\r\n    if (this._locale) {\r\n      this._translateService.use(this._locale);\r\n    }\r\n    this._translationsUpdated.next();\r\n  }\r\n\r\n  private async resolveTranslations(translationResolvers: TranslationResolverState[]) {\r\n    const promises = translationResolvers.map(async translationResolver => {\r\n      if (translationResolver.loadedTranslations) {\r\n        return;\r\n      }\r\n      const loadedTranslations = await this.resolveTranslation(translationResolver.resolver);\r\n      translationResolver.loadedTranslations = loadedTranslations;\r\n    });\r\n    await Promise.all(promises);\r\n  }\r\n\r\n  private mergeLoadedTranslations(\r\n    translationResolvers: TranslationResolverState[]\r\n  ): TranslationType {\r\n    const translations: TranslationType = {};\r\n    translationResolvers.forEach(translationResolver => {\r\n      if (!translationResolver.loadedTranslations) {\r\n        return;\r\n      }\r\n      if (this._debugMode) {\r\n        const debugTranslations = this.putTranslationsIntoDebugMode(\r\n          translationResolver.loadedTranslations\r\n        );\r\n        Object.assign(translations, debugTranslations);\r\n      } else {\r\n        Object.assign(translations, translationResolver.loadedTranslations);\r\n      }\r\n    });\r\n    return translations;\r\n  }\r\n\r\n  private async resolveTranslation(\r\n    translationResolver: TranslationResolver\r\n  ): Promise<TranslationType> {\r\n    let promiseResolver: Promise<TranslationType>;\r\n    // check if translationResolver is a promise\r\n    if (translationResolver instanceof Promise) {\r\n      promiseResolver = translationResolver;\r\n    } else if (typeof translationResolver === 'function') {\r\n      const fnResult = translationResolver();\r\n      if (fnResult instanceof Promise) {\r\n        promiseResolver = fnResult;\r\n      } else {\r\n        promiseResolver = Promise.resolve(fnResult);\r\n      }\r\n    } else if (isAssetResolver(translationResolver)) {\r\n      promiseResolver = this.loadLocaleFromAssetPath(\r\n        translationResolver.moduleName,\r\n        translationResolver.path\r\n      );\r\n    } else {\r\n      promiseResolver = Promise.resolve(translationResolver);\r\n    }\r\n    const loadedTranslations = await promiseResolver;\r\n    return loadedTranslations;\r\n  }\r\n\r\n  private async loadLocaleFromAssetPath(\r\n    moduleName: string,\r\n    path: string\r\n  ): Promise<TranslationType> {\r\n    const resourceUrl = resourceMapper(moduleName, path);\r\n\r\n    const response = await fetch(resourceUrl);\r\n    const content = (await response.json()) as TranslationType;\r\n    return content;\r\n  }\r\n\r\n  private putTranslationsIntoDebugMode(\r\n    translations: TranslationType,\r\n    prefix = ''\r\n  ): TranslationType {\r\n    const debugTranslations: TranslationType = {};\r\n    Object.keys(translations).forEach(key => {\r\n      const value = translations[key];\r\n      if (typeof value === 'string') {\r\n        debugTranslations[key] = `${prefix}${key}`;\r\n      } else {\r\n        debugTranslations[key] = this.putTranslationsIntoDebugMode(value, `${prefix}${key}.`);\r\n      }\r\n    });\r\n    return debugTranslations;\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}