{"version":3,"file":"ngx-translate-routes.mjs","sources":["../../../projects/ngx-translate-routes/src/lib/ngx-translate-routes.token.ts","../../../projects/ngx-translate-routes/src/lib/ngx-translate-routes.constants.ts","../../../projects/ngx-translate-routes/src/lib/ngx-translate-routes-global-storage.service.ts","../../../projects/ngx-translate-routes/src/lib/ngx-translate-routes-helper.service.ts","../../../projects/ngx-translate-routes/src/lib/ngx-translate-routes.service.ts","../../../projects/ngx-translate-routes/src/lib/ngx-translate-routes.module.ts","../../../projects/ngx-translate-routes/src/lib/ngx-translate-routes.providers.ts","../../../projects/ngx-translate-routes/src/public-api.ts","../../../projects/ngx-translate-routes/src/ngx-translate-routes.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\nimport { NgxTranslateRoutesConfig } from './ngx-translate-routes.interfaces'\n\nexport const NGX_TRANSLATE_ROUTES_CONFIG =\n  new InjectionToken<NgxTranslateRoutesConfig>('NGX_TRANSLATE_ROUTES_CONFIG')\n","export const lastRouteKey = 'lastLocationPath'\nexport const millisecondsInADay = 24 * 60 * 60 * 1000\n","import { Injectable, PLATFORM_ID, inject } from '@angular/core'\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common'\nimport { millisecondsInADay } from './ngx-translate-routes.constants'\nimport { NGX_TRANSLATE_ROUTES_CONFIG } from './ngx-translate-routes.token'\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NgxTranslateRoutesGlobalStorageService {\n  private readonly document = inject(DOCUMENT)\n  private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID))\n  private readonly config = inject(NGX_TRANSLATE_ROUTES_CONFIG)\n\n  setItem<T>(key: string, value: T): void {\n    if (this.isBrowser) {\n      if (this.config.cacheMethod === 'cookies') {\n        const date = new Date()\n        date.setTime(\n          date.getTime() +\n            (this.config.cookieExpirationDays || 30) * millisecondsInADay,\n        )\n        const expires = `expires=${date.toUTCString()}`\n        this.document.cookie = `${key}=${JSON.stringify(value)}; ${expires}; path=/`\n      } else {\n        localStorage.setItem(key, JSON.stringify(value))\n      }\n    }\n  }\n\n  getItem<T>(key: string): T | null {\n    if (this.isBrowser) {\n      if (this.config.cacheMethod === 'cookies') {\n        const matches = this.document.cookie.match(\n          new RegExp(\n            '(?:^|; )' +\n              key.replace(/([.$?*|{}()[]\\/+^])/g, '\\\\$1') +\n              '=([^;]*)',\n          ),\n        )\n        return matches\n          ? (JSON.parse(decodeURIComponent(matches[1])) as T)\n          : null\n      } else {\n        const item = localStorage.getItem(key)\n        return item ? (JSON.parse(item) as T) : null\n      }\n    }\n    return null\n  }\n\n  removeItem(key: string): void {\n    if (this.isBrowser) {\n      if (this.config.cacheMethod === 'cookies') {\n        this.document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`\n      } else {\n        localStorage.removeItem(key)\n      }\n    }\n  }\n}\n","import { Injectable, inject } from '@angular/core'\nimport { TranslateService } from '@ngx-translate/core'\nimport { Title } from '@angular/platform-browser'\nimport { ActivatedRoute, Params, Router } from '@angular/router'\nimport { Location } from '@angular/common'\nimport { firstValueFrom } from 'rxjs'\nimport { RoutePath } from './ngx-translate-routes.interfaces'\nimport { NGX_TRANSLATE_ROUTES_CONFIG } from './ngx-translate-routes.token'\nimport { lastRouteKey } from './ngx-translate-routes.constants'\nimport { NgxTranslateRoutesGlobalStorageService } from './ngx-translate-routes-global-storage.service'\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NgxTranslateRoutesHelperService {\n  private readonly translate = inject(TranslateService)\n  private readonly title = inject(Title)\n  private readonly activatedRoute = inject(ActivatedRoute)\n  private readonly config = inject(NGX_TRANSLATE_ROUTES_CONFIG)\n  private readonly location = inject(Location)\n  private readonly router = inject(Router)\n  private readonly globalStorageService = inject(\n    NgxTranslateRoutesGlobalStorageService,\n  )\n\n  async translateTitle(): Promise<void> {\n    const { skipTranslation, routeTitle, params } = this.getDeepestChildRoute()\n    let appTitle: string\n\n    if (skipTranslation) {\n      appTitle = routeTitle!\n    } else if (routeTitle) {\n      appTitle = await firstValueFrom(\n        this.translate.get(`${this.config.titlePrefix}.${routeTitle}`, params),\n      )\n    } else {\n      appTitle = this.title.getTitle()\n    }\n    this.title.setTitle(appTitle)\n  }\n\n  async translateRoute(): Promise<void> {\n    try {\n      const { skipTranslation } = this.getDeepestChildRoute()\n\n      if (skipTranslation) {\n        return\n      }\n\n      const {\n        routeTranslationStrategy,\n        routesUsingStrategy,\n        enableQueryParamsTranslate,\n        routeSuffixesWithQueryParams,\n        enableLanguageInPath,\n        includeDefaultLanguageInPath,\n      } = this.config\n\n      const urlTree = this.router.parseUrl(this.router.url)\n      const subPaths = urlTree?.root?.children['primary']?.segments?.map(\n        (segment) => segment.path,\n      )\n\n      if (!subPaths?.length) {\n        return\n      }\n\n      const queryParams = urlTree?.queryParams ?? {}\n      const isQueryParamsNeedsTranslation =\n        Object.keys(queryParams).length > 0 &&\n        enableQueryParamsTranslate &&\n        this.translate.currentLang !== this.translate.defaultLang\n      const translatedPaths = await Promise.all(\n        subPaths.map((subPath) => {\n          if (\n            routeTranslationStrategy &&\n            routesUsingStrategy?.includes(subPath)\n          ) {\n            return routeTranslationStrategy(subPath)\n          }\n          const pathKey = isQueryParamsNeedsTranslation\n            ? `${subPath}.${routeSuffixesWithQueryParams?.route}`\n            : subPath\n          return this.getTranslatedPath(pathKey)\n        }),\n      )\n\n      let routeUrl = translatedPaths.reduce(\n        (acc, translatedPath, index) =>\n          this.concatenateRouteUrl(\n            acc,\n            typeof translatedPath === 'string'\n              ? translatedPath\n              : translatedPath['root'],\n            subPaths[index],\n          ),\n        '',\n      )\n\n      if (\n        enableLanguageInPath &&\n        ((this.translate.currentLang !== this.translate.defaultLang &&\n          !includeDefaultLanguageInPath) ||\n          includeDefaultLanguageInPath)\n      ) {\n        routeUrl = !this.isLangInPath(this.router.url)\n          ? `/${this.translate.currentLang}${routeUrl}`\n          : routeUrl\n      }\n\n      const translatedQueryParams = isQueryParamsNeedsTranslation\n        ? await this.translateQueryParams(\n            queryParams,\n            subPaths[subPaths.length - 1],\n          )\n        : queryParams\n\n      this.updateLocationIfChanged(routeUrl, translatedQueryParams)\n    } catch (error) {\n      console.error('Error translating route:', error)\n    }\n  }\n\n  private getDeepestChildRoute(): {\n    skipTranslation: boolean\n    routeTitle?: string\n    params?: Params\n  } {\n    let child = this.activatedRoute.firstChild\n    while (child?.firstChild) {\n      child = child.firstChild\n    }\n    const { title: routeTitle, skipTranslation } = child?.snapshot.data || {}\n    const params = child?.snapshot.params\n    return { skipTranslation, routeTitle, params }\n  }\n\n  private async getTranslatedPath(subPath: string): Promise<string> {\n    return firstValueFrom(\n      this.translate.get(`${this.config.routePrefix}.${subPath}`),\n    )\n  }\n\n  private concatenateRouteUrl(\n    routeUrl: string,\n    translatePath: string,\n    subPath: string,\n  ): string {\n    const segmentToConcat = translatePath.startsWith(\n      this.config.routePrefix ?? '',\n    )\n      ? subPath\n      : translatePath\n    return subPath.length > 0 ? `${routeUrl}/${segmentToConcat}` : subPath\n  }\n\n  private async translateQueryParams(\n    queryParams: Params,\n    path: string,\n  ): Promise<Params> {\n    const translatedQueryParams: Params = {}\n    for (const key of Object.keys(queryParams)) {\n      const translatedKey = await this.getTranslatedPath(\n        `${path}.${this.config.routeSuffixesWithQueryParams?.params}.${key}`,\n      )\n      translatedQueryParams[translatedKey] = queryParams[key]\n    }\n    return translatedQueryParams\n  }\n\n  private updateLocationIfChanged(\n    newRouteUrl: string,\n    queryParams?: Params,\n  ): void {\n    const currentPathWithParams = this.router\n      .createUrlTree([], {\n        queryParams: this.router.parseUrl(this.location.path()).queryParams,\n      })\n      .toString()\n\n    const newPathWithParams = this.router\n      .createUrlTree([newRouteUrl], { queryParams })\n      .toString()\n\n    const translatedPaths: RoutePath[] =\n      this.globalStorageService.getItem(lastRouteKey) ?? []\n    const index = translatedPaths.findIndex(\n      (path) => path.originalPath === currentPathWithParams,\n    )\n\n    if (index !== -1) {\n      translatedPaths[index].translatedPath = newPathWithParams\n    } else {\n      translatedPaths.push({\n        originalPath: currentPathWithParams,\n        translatedPath: newPathWithParams,\n      })\n    }\n\n    this.location.replaceState(newPathWithParams)\n    this.globalStorageService.setItem(lastRouteKey, translatedPaths)\n  }\n\n  private isLangInPath(path: string): boolean {\n    const langRegex = /^\\/[a-z]{2}(-[A-Z]{2})?(\\/|$)/\n    return langRegex.test(path)\n  }\n}\n","import { Location } from '@angular/common'\nimport { DestroyRef, Injectable, inject } from '@angular/core'\nimport { TranslateService } from '@ngx-translate/core'\nimport { Router, NavigationEnd, NavigationStart } from '@angular/router'\nimport { filter, map, skip } from 'rxjs/operators'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport { RoutePath } from './ngx-translate-routes.interfaces'\nimport { NGX_TRANSLATE_ROUTES_CONFIG } from './ngx-translate-routes.token'\nimport { NgxTranslateRoutesHelperService } from './ngx-translate-routes-helper.service'\nimport { lastRouteKey } from './ngx-translate-routes.constants'\nimport { NgxTranslateRoutesGlobalStorageService } from './ngx-translate-routes-global-storage.service'\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NgxTranslateRoutesService {\n  private readonly translate = inject(TranslateService)\n  private readonly router = inject(Router)\n  private readonly location = inject(Location)\n  private readonly helperService = inject(NgxTranslateRoutesHelperService)\n  private readonly config = inject(NGX_TRANSLATE_ROUTES_CONFIG)\n  private readonly globalStorageService = inject(\n    NgxTranslateRoutesGlobalStorageService,\n  )\n  private readonly _destroyRef = inject(DestroyRef)\n\n  constructor() {\n    this.translate.onLangChange\n      .pipe(skip(1), takeUntilDestroyed(this._destroyRef))\n      .subscribe({\n        next: () => {\n          this.handleLanguageChange()\n        },\n      })\n  }\n\n  init(): void {\n    const lastRoute =\n      this.router.config?.findIndex((route) => route.path === '**') !== -1 &&\n      this.router.config?.pop()\n    this.router.events\n      .pipe(\n        filter((event) => event instanceof NavigationStart),\n        map((event) => event as NavigationStart),\n        takeUntilDestroyed(this._destroyRef),\n      )\n      .subscribe({\n        next: (event) => {\n          const item = this.globalStorageService.getItem(lastRouteKey)\n          if (\n            event.navigationTrigger === 'popstate' ||\n            (event.id === 1 && item)\n          ) {\n            const translatedPaths: RoutePath[] = this.getTranslatedPaths()\n            const lastTranslatedPath = translatedPaths.find(\n              (path) => path.translatedPath === event.url,\n            )\n\n            if (lastTranslatedPath) {\n              this.router.navigateByUrl(lastTranslatedPath.originalPath, {\n                skipLocationChange: true,\n              })\n            }\n\n            if (lastRoute) {\n              this.router.config.push(lastRoute)\n            }\n          }\n        },\n      })\n\n    this.router.events\n      .pipe(\n        filter((event) => event instanceof NavigationEnd),\n        takeUntilDestroyed(this._destroyRef),\n      )\n      .subscribe({\n        next: () => {\n          this.checkConfigValueAndMakeTranslations()\n        },\n      })\n  }\n\n  checkConfigValueAndMakeTranslations(): void {\n    this.config.enableTitleTranslate && this.helperService.translateTitle()\n    this.config.enableRouteTranslate && this.helperService.translateRoute()\n  }\n\n  private handleLanguageChange(): void {\n    const translatedPaths: RoutePath[] = this.getTranslatedPaths()\n    const lastTranslatedPath = translatedPaths.find(\n      (path) => path.translatedPath === this.location.path(),\n    )\n    if (lastTranslatedPath) {\n      this.location.replaceState(lastTranslatedPath.originalPath)\n      this.globalStorageService.removeItem(lastRouteKey)\n    }\n    this.checkConfigValueAndMakeTranslations()\n    if (this.config.onLanguageChange) {\n      this.config.onLanguageChange()\n    }\n  }\n\n  private getTranslatedPaths(): RoutePath[] {\n    return this.globalStorageService.getItem(lastRouteKey) ?? []\n  }\n}\n","import {\n  NgModule,\n  ModuleWithProviders,\n  SkipSelf,\n  Optional,\n  inject,\n} from '@angular/core'\nimport { CommonModule, TitleCasePipe } from '@angular/common'\nimport { TranslateModule } from '@ngx-translate/core'\nimport { NgxTranslateRoutesService } from './ngx-translate-routes.service'\nimport { NGX_TRANSLATE_ROUTES_CONFIG } from './ngx-translate-routes.token'\nimport { NgxTranslateRoutesConfig } from './ngx-translate-routes.interfaces'\n\n@NgModule({\n  imports: [CommonModule, TranslateModule.forChild()],\n  providers: [TitleCasePipe],\n})\nexport class NgxTranslateRoutesModule {\n  private readonly translateRoutesService = inject(NgxTranslateRoutesService)\n\n  constructor(@Optional() @SkipSelf() parentModule?: NgxTranslateRoutesModule) {\n    if (parentModule) {\n      throw new Error(\n        'NgxTranslateRoutesModule is already loaded. Import it in the AppModule only',\n      )\n    }\n    this.translateRoutesService.init()\n  }\n\n  static forRoot(\n    config?: NgxTranslateRoutesConfig,\n  ): ModuleWithProviders<NgxTranslateRoutesModule> {\n    return {\n      ngModule: NgxTranslateRoutesModule,\n      providers: [\n        {\n          provide: NGX_TRANSLATE_ROUTES_CONFIG,\n          useValue: {\n            enableRouteTranslate: config?.enableRouteTranslate ?? true,\n            enableTitleTranslate: config?.enableTitleTranslate ?? true,\n            enableQueryParamsTranslate:\n              config?.enableQueryParamsTranslate ?? false,\n            enableLanguageInPath: config?.enableLanguageInPath ?? false,\n            includeDefaultLanguageInPath:\n              config?.includeDefaultLanguageInPath ?? false,\n            routePrefix: config?.routePrefix ?? 'routes',\n            routeSuffixesWithQueryParams:\n              config?.routeSuffixesWithQueryParams ?? {\n                route: 'root',\n                params: 'params',\n              },\n            routesUsingStrategy: config?.routesUsingStrategy ?? [],\n            titlePrefix: config?.titlePrefix ?? 'titles',\n            cacheMethod: config?.cacheMethod ?? 'localStorage',\n            cookieExpirationDays: config?.cookieExpirationDays ?? 30,\n            onLanguageChange: config?.onLanguageChange ?? undefined,\n            routeTranslationStrategy:\n              config?.routeTranslationStrategy ?? undefined,\n          },\n        },\n      ],\n    }\n  }\n}\n","import {\n  APP_INITIALIZER,\n  EnvironmentProviders,\n  inject,\n  makeEnvironmentProviders,\n} from '@angular/core'\nimport { TitleCasePipe } from '@angular/common'\nimport { NGX_TRANSLATE_ROUTES_CONFIG } from './ngx-translate-routes.token'\nimport { NgxTranslateRoutesConfig } from './ngx-translate-routes.interfaces'\nimport { NgxTranslateRoutesService } from './ngx-translate-routes.service'\n\nexport function provideNgxTranslateRoutes(\n  config?: NgxTranslateRoutesConfig,\n): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: NGX_TRANSLATE_ROUTES_CONFIG,\n      useValue: {\n        enableRouteTranslate: config?.enableRouteTranslate ?? true,\n        enableTitleTranslate: config?.enableTitleTranslate ?? true,\n        enableQueryParamsTranslate: config?.enableQueryParamsTranslate ?? false,\n        enableLanguageInPath: config?.enableLanguageInPath ?? false,\n        includeDefaultLanguageInPath:\n          config?.includeDefaultLanguageInPath ?? false,\n        routePrefix: config?.routePrefix ?? 'routes',\n        routeSuffixesWithQueryParams: config?.routeSuffixesWithQueryParams ?? {\n          route: 'root',\n          params: 'params',\n        },\n        routesUsingStrategy: config?.routesUsingStrategy ?? [],\n        titlePrefix: config?.titlePrefix ?? 'titles',\n        cacheMethod: config?.cacheMethod ?? 'localStorage',\n        cookieExpirationDays: config?.cookieExpirationDays ?? 30,\n        onLanguageChange: config?.onLanguageChange ?? undefined,\n        routeTranslationStrategy: config?.routeTranslationStrategy ?? undefined,\n      },\n    },\n    TitleCasePipe,\n    {\n      provide: APP_INITIALIZER,\n      useFactory: () => () => {\n        const translateRoutesService = inject(NgxTranslateRoutesService)\n        translateRoutesService.init()\n      },\n      multi: true,\n    },\n  ])\n}\n","/*\n * Public API Surface of ngx-translate-routes\n */\n\nexport * from './lib/ngx-translate-routes.module'\nexport * from './lib/ngx-translate-routes.providers'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}