{"version":3,"file":"onecx-angular-utils-guards.mjs","sources":["../../../../libs/angular-utils/guards/src/declarations.ts","../../../../libs/angular-utils/guards/src/utils/logger.utils.ts","../../../../libs/angular-utils/guards/src/utils/guards-utils.utils.ts","../../../../libs/angular-utils/guards/src/model/guard-navigation.model.ts","../../../../libs/angular-utils/guards/src/services/guards-navigation-controller.service.ts","../../../../libs/angular-utils/guards/src/services/guards-gatherer.service.ts","../../../../libs/angular-utils/guards/src/utils/activate-guards-wrapper.utils.ts","../../../../libs/angular-utils/guards/src/utils/deactivate-guards-wrapper.utils.ts","../../../../libs/angular-utils/guards/src/utils/wrap-guards.utils.ts","../../../../libs/angular-utils/guards/onecx-angular-utils-guards.ts"],"sourcesContent":["declare global {\n  interface Window {\n    '@onecx/angular-utils': {\n      guards?: {\n        debug?: boolean\n      }\n    }\n  }\n}\n\nwindow['@onecx/angular-utils'] ??= {}\nwindow['@onecx/angular-utils'].guards ??= {}\n\nexport default globalThis\n","// This file is not planned to be in the index.ts so it is private to this lib\nimport { createLoggerFactory } from '@onecx/accelerator'\n\nexport const createLogger = createLoggerFactory('@onecx/angular-utils:guards')\n","import { ActivatedRouteSnapshot, GuardResult, MaybeAsync, RedirectCommand, UrlTree } from '@angular/router'\nimport { isObservable, lastValueFrom } from 'rxjs'\nimport '../declarations'\nimport { createLogger } from './logger.utils'\n\nwindow['@onecx/angular-utils'] = window['@onecx/angular-utils'] || {}\n\n/**\n * Logs debug information for Guards.\n * It checks if the debug mode is enabled and logs the provided arguments.\n * This is useful for debugging guard checks and navigation state.\n * @param args - the arguments to log\n */\nexport function logGuardsDebug(...args: any[]): void {\n  createLogger('guards-utils').debug('Guards:', ...args)\n}\n\n/**\n * Execute router sync operation.\n * Immediately returns true to indicate that the operation was successful.\n */\nexport function executeRouterSyncGuard(): boolean {\n  logGuardsDebug('Was RouterSync, returning true.')\n\n  // Important to return true because it was already agreed to perform navigation in the application\n  return true\n}\n\n/**\n * Returns false if any guard returned false.\n * Returns UrTree or RedirectCommand if any guard returned this value type (the first value is returned).\n * Else it returns true.\n */\nexport function combineToGuardResult(results: GuardResult[]): GuardResult {\n  if (results.some((result) => result === false)) {\n    return false\n  }\n\n  // Check for UrlTree or RedirectCommand\n  // If any guard returned this, we need to return it to perform the redirection\n  // We return the first one found\n  const redirectResult = results.find((result) => result instanceof UrlTree || result instanceof RedirectCommand)\n  if (redirectResult) {\n    return redirectResult\n  }\n\n  return true\n}\n\n/**\n * Returns false if any guard returned false.\n * Else it returns true.\n */\nexport function combineToBoolean(results: GuardResult[]): boolean {\n  if (results.some((result) => result === false)) {\n    return false\n  }\n\n  return true\n}\n\n/**\n * Resolves MaybeAsync to Promise.\n * @param maybeAsync - the value to resolve\n * @returns Promise<GuardResult>\n */\nexport function resolveToPromise(maybeAsync: MaybeAsync<GuardResult>): Promise<GuardResult> {\n  if (maybeAsync instanceof Promise) {\n    return maybeAsync\n  } else if (isObservable(maybeAsync)) {\n    return lastValueFrom(maybeAsync)\n  }\n\n  return Promise.resolve(maybeAsync)\n}\n\n/**\n * Gets the URL from the ActivatedRouteSnapshot.\n * @param route - the route to get URL from\n * @returns string - the URL of the route\n */\nexport function getUrlFromSnapshot(route: ActivatedRouteSnapshot): string {\n  const segments: string[] = []\n\n  let currentRoute: ActivatedRouteSnapshot | null = route\n  while (currentRoute) {\n    segments.unshift(...currentRoute.url.map((segment) => segment.path))\n    currentRoute = currentRoute.parent\n  }\n\n  return segments.join('/')\n}\n","/**\n * Scattered guards navigation state model.\n * Used to check if the guard checks are requested in the navigation state by different application.\n * This is used to perform guard checks without navigating.\n */\nexport interface GuardsNavigationState {\n  [IS_ROUTER_SYNC]?: boolean\n  [IS_INITIAL_ROUTER_SYNC]?: boolean\n  [GUARD_CHECK]?: boolean\n  [GUARD_CHECK_PROMISE]?: GuardCheckPromise\n}\n\nexport type GuardCheckPromise = Promise<boolean>\n\n/**\n * Indicates that the router is in sync mode.\n */\nexport const IS_ROUTER_SYNC = 'isRouterSync'\n\n/**\n * Indicates that the router is in initial sync mode.\n */\nexport const IS_INITIAL_ROUTER_SYNC = 'isInitialRouterSync'\n\n/**\n * Indicates that the guard check is requested.\n */\nexport const GUARD_CHECK = 'guardCheck'\n\n/**\n * Indicates that the guard check promise was requested by this application.\n * This is used to wait for the external guard checks to be completed before proceeding with the navigation.\n */\nexport const GUARD_CHECK_PROMISE = 'guardCheckPromise'\n\nexport enum GUARD_MODE {\n  INITIAL_ROUTER_SYNC = 'initialRouterSync',\n  ROUTER_SYNC = 'routerSync',\n  GUARD_CHECK = 'guardCheck',\n  NAVIGATION_REQUESTED = 'navigationRequested',\n}\n","import { Injectable } from '@angular/core'\nimport {\n  GUARD_CHECK,\n  GUARD_CHECK_PROMISE,\n  GUARD_MODE,\n  GuardCheckPromise,\n  GuardsNavigationState,\n  IS_INITIAL_ROUTER_SYNC,\n  IS_ROUTER_SYNC,\n} from '../model/guard-navigation.model'\n\n/**\n * GuardsNavigationController is a service that manages the navigation state for guards.\n */\n@Injectable({ providedIn: 'any' })\nexport class GuardsNavigationStateController {\n  /**\n   * Retrieves the current mode of the guards navigation state.\n   * @param guardsNavigationState - the GuardsNavigationState to check\n   * @returns GUARD_MODE indicating the current mode of the guards navigation state\n   */\n  getMode(guardsNavigationState: GuardsNavigationState): GUARD_MODE {\n    if (guardsNavigationState[IS_INITIAL_ROUTER_SYNC]) {\n      return GUARD_MODE.INITIAL_ROUTER_SYNC\n    }\n\n    if (guardsNavigationState[IS_ROUTER_SYNC]) {\n      return GUARD_MODE.ROUTER_SYNC\n    }\n\n    if (guardsNavigationState[GUARD_CHECK]) {\n      return GUARD_MODE.GUARD_CHECK\n    }\n\n    return GUARD_MODE.NAVIGATION_REQUESTED\n  }\n\n  /**\n   * Creates an initial router sync state for guards navigation.\n   * @param guardsNavigationState - optional GuardsNavigationState to modify\n   * @returns GuardsNavigationState with initial router sync state\n   */\n  createInitialRouterSyncState(guardsNavigationState?: GuardsNavigationState): GuardsNavigationState {\n    if (guardsNavigationState) {\n      guardsNavigationState[IS_ROUTER_SYNC] = true\n      guardsNavigationState[IS_INITIAL_ROUTER_SYNC] = true\n      return guardsNavigationState\n    }\n\n    return {\n      [IS_ROUTER_SYNC]: true,\n      [IS_INITIAL_ROUTER_SYNC]: true,\n    }\n  }\n\n  /**\n   * Creates a router sync state for guards navigation.\n   * @param guardsNavigationState - optional GuardsNavigationState to modify\n   * @returns GuardsNavigationState with router sync state\n   */\n  createGuardCheckState(guardsNavigationState?: GuardsNavigationState): GuardsNavigationState {\n    if (guardsNavigationState) {\n      guardsNavigationState[GUARD_CHECK] = true\n      return guardsNavigationState\n    }\n\n    return { [GUARD_CHECK]: true }\n  }\n\n  /**\n   * Creates a navigation requested state for guards navigation.\n   * @param guardsCheckPromise - the promise to resolve guard checks\n   * @param guardsNavigationState - optional GuardsNavigationState to modify\n   * @returns GuardsNavigationState with navigation requested state\n   */\n  createNavigationRequestedState(\n    guardsCheckPromise: GuardCheckPromise,\n    guardsNavigationState?: GuardsNavigationState\n  ): GuardsNavigationState {\n    if (guardsNavigationState) {\n      guardsNavigationState[GUARD_CHECK_PROMISE] = guardsCheckPromise\n      return guardsNavigationState\n    }\n\n    return { [GUARD_CHECK_PROMISE]: guardsCheckPromise }\n  }\n\n  /**\n   * Retrieves the GuardCheckPromise from the provided GuardsNavigationState.\n   * @param state - the GuardsNavigationState to check\n   * @returns GuardCheckPromise if it exists, undefined otherwise\n   */\n  getGuardCheckPromise(state: GuardsNavigationState): GuardCheckPromise | undefined {\n    return state[GUARD_CHECK_PROMISE]\n  }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core'\nimport { Router } from '@angular/router'\nimport { Gatherer } from '@onecx/accelerator'\nimport { GuardsNavigationStateController } from './guards-navigation-controller.service'\nimport { logGuardsDebug } from '../utils/guards-utils.utils'\n\n/**\n * Request for performing guard checks.\n * It contains the URL of the route for which the guard checks are requested.\n */\nexport type GuardResultRequest = {\n  url: string\n}\n\n/**\n * Response for the guard checks.\n * It indicates whether the guard checks were successful or not.\n */\nexport type GuardResultResponse = boolean\n\nexport const GUARDS_GATHERER_NAME = 'GuardGatherer'\n\n/**\n * GuardsGatherer is used to gather results of navigation guards.\n * It allows to perform guard checks of the application.\n * GuardsGatherer adds information in the navigation state to request guard checks.\n * It is expected that guards wrappers will use this information to perform checks and respond if checks are not successful. Otherwise, it will proceed with the navigation and navigation will be rejected on GuardsCheckEnd and results will be reported.\n * It uses a Gatherer to manage the requests and responses.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class GuardsGatherer implements OnDestroy {\n  private guardsGatherer: Gatherer<GuardResultRequest, GuardResultResponse> | undefined\n  private guardsChecks: Map<string, (value: GuardResultResponse) => void> | undefined\n  private readonly guardsNavigationStateController = inject(GuardsNavigationStateController)\n  private readonly router: Router = inject(Router)\n\n  ngOnDestroy(): void {\n    this.guardsGatherer?.destroy()\n  }\n\n  /**\n   * Schedules a request to gather guard results.\n   * @param request - the request to gather guard results\n   * @returns Promise that resolves with the response of the guard results.\n   */\n  gather(request: GuardResultRequest) {\n    if (this.guardsGatherer === undefined) {\n      this.throwNotActiveError()\n    }\n    request.url = this.normalizeUrl(request.url)\n    return this.guardsGatherer.gather(request)\n  }\n\n  /**\n   * Resolves the guard results for a specific route.\n   * @param routeUrl - the URL of the route for which the guard results are resolved\n   * @param response - the response of the guard result\n   */\n  resolveRoute(routeUrl: string, response: GuardResultResponse) {\n    if (this.guardsChecks === undefined) {\n      this.throwNotActiveError()\n    }\n    const url = this.normalizeUrl(routeUrl)\n    const resolve = this.guardsChecks.get(url)\n    if (resolve) {\n      resolve(response)\n    }\n    this.guardsChecks.delete(url)\n  }\n\n  /**\n   * Activates the GuardsGatherer service.\n   * It initializes the Gatherer and sets up the callback to execute guard checks.\n   */\n  activate(): void {\n    this.guardsGatherer = new Gatherer(GUARDS_GATHERER_NAME, 1, (request) => this.executeGuardsCallback(request))\n    this.guardsChecks = new Map()\n  }\n\n  /**\n   * Deactivates the GuardsGatherer service.\n   * It destroys the Gatherer and clears the checks.\n   */\n  deactivate(): void {\n    this.guardsGatherer?.destroy()\n    delete this.guardsChecks\n  }\n\n  private executeGuardsCallback(request: GuardResultRequest): Promise<GuardResultResponse> {\n    logGuardsDebug('Executing callback for request:', request)\n    const routeUrl = request.url\n\n    // Fake navigation to request guard check\n    this.router.navigateByUrl(routeUrl, {\n      state: this.guardsNavigationStateController.createGuardCheckState(),\n      // Important, force navigation\n      // to ensure that we are checking guards\n      // even if the route is already active.\n      onSameUrlNavigation: 'reload',\n    })\n\n    let resolve: (value: GuardResultResponse) => void\n    return new Promise<GuardResultResponse>((r) => {\n      resolve = r\n      if (this.guardsChecks === undefined) {\n        this.throwNotActiveError()\n      }\n      this.guardsChecks.set(routeUrl, resolve)\n    })\n  }\n\n  private normalizeUrl(url: string): string {\n    let result = url\n    result = result.startsWith('/') ? result : `/${result}`\n    result = result.endsWith('/') ? result.slice(0, -1) : result\n    return result\n  }\n\n  private throwNotActiveError(): never {\n    throw new Error('Guards gatherer is not active')\n  }\n}\n","import { inject, Injectable, Injector, Type } from '@angular/core'\nimport {\n  ActivatedRouteSnapshot,\n  CanActivate,\n  CanActivateFn,\n  GuardResult,\n  MaybeAsync,\n  Router,\n  RouterStateSnapshot,\n} from '@angular/router'\nimport { GuardsGatherer } from '../services/guards-gatherer.service'\nimport { GuardsNavigationStateController } from '../services/guards-navigation-controller.service'\nimport { GUARD_MODE, GuardsNavigationState } from '../model/guard-navigation.model'\nimport {\n  combineToBoolean,\n  combineToGuardResult,\n  executeRouterSyncGuard,\n  getUrlFromSnapshot,\n  logGuardsDebug,\n  resolveToPromise,\n} from './guards-utils.utils'\nimport { createLogger } from './logger.utils'\n\n/**\n * Wrapper for canActivate guards that handles the navigation state and executes guards accordingly.\n *\n * It performs the activation checks in different scenarios based on the navigation state.\n */\n@Injectable({ providedIn: 'root' })\nexport class ActivateGuardsWrapper {\n  private readonly injector = inject(Injector)\n  private readonly guardsGatherer = inject(GuardsGatherer)\n  protected router = inject(Router)\n  private readonly guardsNavigationStateController = inject(GuardsNavigationStateController)\n\n  canActivate(\n    route: ActivatedRouteSnapshot,\n    state: RouterStateSnapshot,\n    guards: Array<CanActivateFn | Type<CanActivate>>\n  ): MaybeAsync<GuardResult> {\n    const logger = createLogger('ActivateGuardsWrapper')\n    const guardsNavigationState = this.router.getCurrentNavigation()?.extras.state ?? ({} as GuardsNavigationState)\n    const futureUrl = getUrlFromSnapshot(route)\n\n    switch (this.guardsNavigationStateController.getMode(guardsNavigationState)) {\n      // We need to let guards run if this is initial router sync\n      // If navigation cannot be performed, a new event for window.history will be emitted with navigationId === -1\n      // This will be handled by the Shell\n      // Additionally, during GuardsCheckEnd, the results will be reported so Shell can decide what to do\n      case GUARD_MODE.INITIAL_ROUTER_SYNC:\n        return this.executeActivateGuards(logger, route, state, guards, combineToBoolean)\n      case GUARD_MODE.ROUTER_SYNC:\n        return this.executeActivateGuards(logger, route, state, guards, combineToBoolean).then(() =>\n          executeRouterSyncGuard()\n        )\n      case GUARD_MODE.GUARD_CHECK:\n        return this.executeActivateGuards(logger, route, state, guards, combineToBoolean).then((result) => {\n          if (result === false) {\n            logGuardsDebug('GuardCheck - Route is guarded for activation, resolving false.')\n            this.guardsGatherer.resolveRoute(futureUrl, false)\n          }\n\n          return result\n        })\n      case GUARD_MODE.NAVIGATION_REQUESTED: {\n        //Wait until we received info from others\n        let checkStartPromise = this.guardsNavigationStateController.getGuardCheckPromise(guardsNavigationState)\n        if (!checkStartPromise) {\n          logger.warn('No guard check promise found in guards navigation state, returning true.')\n          checkStartPromise = Promise.resolve(true)\n        }\n        return checkStartPromise.then((result) => {\n          if (result === false) {\n            logger.warn(\n              `Cannot route to ${futureUrl} because ${state.url} deactivation is guarded or ${futureUrl} activation its guarded.`\n            )\n            return false\n          }\n          return this.executeActivateGuards(logger, route, state, guards, combineToGuardResult)\n        })\n      }\n    }\n  }\n\n  private executeActivateGuards<T extends boolean | GuardResult>(\n    logger: ReturnType<typeof createLogger>,\n    route: ActivatedRouteSnapshot,\n    state: RouterStateSnapshot,\n    guards: Array<CanActivateFn | Type<CanActivate>>,\n    combineFn: (results: GuardResult[]) => T\n  ): Promise<T> {\n    if (!route.routeConfig) {\n      logger.warn('No route configuration found for canActivate guard.')\n      logGuardsDebug('No route configuration found for canActivate guard.')\n      return Promise.resolve(true as T)\n    }\n\n    const canActivateFunctions = guards.map((guard) => this.mapActivateGuardToFunctionReturningPromise(guard))\n\n    const canActivateResults = Promise.all(\n      canActivateFunctions.map((fn) => {\n        try {\n          return fn(route, state)\n        } catch {\n          logger.warn('Guard does not implement canActivate:', fn)\n          return Promise.resolve(true) // Default to true if guard does not implement canActivate\n        }\n      })\n    )\n    return canActivateResults.then((results) => combineFn(results))\n  }\n  private mapActivateGuardToFunctionReturningPromise(\n    guard: Type<CanActivate> | CanActivateFn\n  ): (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Promise<GuardResult> {\n    if (this.isCanActivateClassBasedGuard(guard)) {\n      // guard for CanActivate is not a guard instance but class definition\n      const guardInstance = this.injector.get(guard)\n      return (route, state) => resolveToPromise(guardInstance.canActivate(route, state))\n    }\n\n    return (route, state) => resolveToPromise(guard(route, state))\n  }\n\n  private isCanActivateClassBasedGuard(guard: Type<CanActivate> | CanActivateFn): guard is Type<CanActivate> {\n    return typeof guard === 'function' && guard.prototype && 'canActivate' in guard.prototype\n  }\n}\n","import { inject, Injectable, Injector, Type } from '@angular/core'\nimport {\n  ActivatedRouteSnapshot,\n  CanDeactivate,\n  CanDeactivateFn,\n  GuardResult,\n  MaybeAsync,\n  Router,\n  RouterStateSnapshot,\n} from '@angular/router'\nimport { GuardsGatherer } from '../services/guards-gatherer.service'\nimport { GuardsNavigationStateController } from '../services/guards-navigation-controller.service'\nimport { GUARD_MODE, GuardsNavigationState } from '../model/guard-navigation.model'\nimport {\n  combineToBoolean,\n  combineToGuardResult,\n  executeRouterSyncGuard,\n  logGuardsDebug,\n  resolveToPromise,\n} from './guards-utils.utils'\nimport { createLogger } from './logger.utils'\n\n/**\n * Wrapper for canDeactivate guards that handles the navigation state and executes guards accordingly.\n *\n * It performs the deactivation checks in different scenarios based on the navigation state\n */\n@Injectable({ providedIn: 'root' })\nexport class DeactivateGuardsWrapper {\n  private readonly injector = inject(Injector)\n  private readonly guardsGatherer = inject(GuardsGatherer)\n  protected router = inject(Router)\n  private readonly guardsNavigationStateController = inject(GuardsNavigationStateController)\n\n  canDeactivate(\n    component: any,\n    currentRoute: ActivatedRouteSnapshot,\n    currentState: RouterStateSnapshot,\n    nextState: RouterStateSnapshot,\n    guards: Array<CanDeactivateFn<any> | Type<CanDeactivate<any>>>\n  ): MaybeAsync<GuardResult> {\n    const logger = createLogger('DeactivateGuardsWrapper')\n    const guardsNavigationState = (this.router.getCurrentNavigation()?.extras.state ?? {}) as GuardsNavigationState\n    const futureUrl = nextState.url\n\n    switch (this.guardsNavigationStateController.getMode(guardsNavigationState)) {\n      case GUARD_MODE.INITIAL_ROUTER_SYNC:\n        return this.executeDeactivateGuards(\n          logger,\n          component,\n          currentRoute,\n          currentState,\n          nextState,\n          guards,\n          combineToBoolean\n        )\n      case GUARD_MODE.ROUTER_SYNC:\n        return this.executeDeactivateGuards(\n          logger,\n          component,\n          currentRoute,\n          currentState,\n          nextState,\n          guards,\n          combineToBoolean\n        ).then(() => executeRouterSyncGuard())\n      case GUARD_MODE.GUARD_CHECK:\n        return this.executeDeactivateGuards(\n          logger,\n          component,\n          currentRoute,\n          currentState,\n          nextState,\n          guards,\n          combineToBoolean\n        ).then((result) => {\n          if (result === false) {\n            logGuardsDebug('GuardCheck - Route is guarded for deactivation, resolving false.')\n            this.guardsGatherer.resolveRoute(futureUrl, false)\n          }\n\n          return result\n        })\n      case GUARD_MODE.NAVIGATION_REQUESTED: {\n        //Wait until we received info from others\n        let checkStartPromise = this.guardsNavigationStateController.getGuardCheckPromise(guardsNavigationState)\n        if (!checkStartPromise) {\n          logger.warn('No guard check promise found in guards navigation state, returning true.')\n          checkStartPromise = Promise.resolve(true)\n        }\n        return checkStartPromise.then((result) => {\n          if (result === false) {\n            logger.warn(\n              `Cannot route to ${futureUrl} because ${currentState.url} deactivation is guarded or ${futureUrl} activation its guarded.`\n            )\n            return false\n          }\n          return this.executeDeactivateGuards(\n            logger,\n            component,\n            currentRoute,\n            currentState,\n            nextState,\n            guards,\n            combineToGuardResult\n          )\n        })\n      }\n    }\n  }\n\n  private executeDeactivateGuards<T extends boolean | GuardResult>(\n    logger: ReturnType<typeof createLogger>,\n    component: any,\n    currentRoute: ActivatedRouteSnapshot,\n    currentState: RouterStateSnapshot,\n    nextState: RouterStateSnapshot,\n    guards: Array<CanDeactivateFn<any> | Type<CanDeactivate<any>>>,\n    combineFn: (results: GuardResult[]) => T\n  ) {\n    if (!currentRoute.routeConfig) {\n      logGuardsDebug('No route configuration found for canActivate guard.')\n      return Promise.resolve(true as T)\n    }\n\n    const canDeactivateFunctions = guards.map((guard) => this.mapDeactivateGuardToFunctionReturningPromise(guard))\n\n    const canDeactivateResults = Promise.all(\n      canDeactivateFunctions.map((fn) => {\n        try {\n          return fn(component, currentRoute, currentState, nextState)\n        } catch {\n          logger.warn('Guard does not implement canDeactivate:', fn)\n          return Promise.resolve(true) // Default to true if guard does not implement canDeactivate\n        }\n      })\n    )\n    return canDeactivateResults.then((results) => combineFn(results))\n  }\n\n  private mapDeactivateGuardToFunctionReturningPromise(\n    guard: Type<CanDeactivate<any>> | CanDeactivateFn<any>\n  ): (\n    component: any,\n    currentRoute: ActivatedRouteSnapshot,\n    currentState: RouterStateSnapshot,\n    nextState: RouterStateSnapshot\n  ) => Promise<GuardResult> {\n    if (this.isCanDeactivateClassBasedGuard(guard)) {\n      // guard for CanDeactivate is not a guard instance but class definition\n      const guardInstance = this.injector.get(guard)\n      return (component, currentRoute, currentState, nextState) =>\n        resolveToPromise(guardInstance.canDeactivate(component, currentRoute, currentState, nextState))\n    }\n\n    return (component, currentRoute, currentState, nextState) =>\n      resolveToPromise(guard(component, currentRoute, currentState, nextState))\n  }\n\n  private isCanDeactivateClassBasedGuard(\n    guard: Type<CanDeactivate<any>> | CanDeactivateFn<any>\n  ): guard is Type<CanDeactivate<any>> {\n    return typeof guard === 'function' && guard.prototype && 'canDeactivate' in guard.prototype\n  }\n}\n","import { AbstractType, inject, Type } from '@angular/core'\nimport { CanActivate, CanActivateFn, CanDeactivate, CanDeactivateFn, Route } from '@angular/router'\nimport { ActivateGuardsWrapper } from './activate-guards-wrapper.utils'\nimport { DeactivateGuardsWrapper } from './deactivate-guards-wrapper.utils'\nimport { logGuardsDebug } from './guards-utils.utils'\n\n/**\n * Extended Route interface to hold original guards.\n * This interface extends the Angular Route interface to include lists for original guards.\n */\nexport interface OnecxRoute extends Route {\n  canActivateGuardList?: Array<CanActivateFn | Type<CanActivate>>\n  canDeactivateGuardList?: Array<CanDeactivateFn<any> | Type<CanDeactivate<any>>>\n  canActivateChildGuardList?: Array<CanActivateFn | Type<CanActivate>>\n}\n\n// Create a unique symbol to tag wrapped guards\nexport const WRAPPED_GUARD_TAG = Symbol('WrappedGuard')\n\n/**\n * Wraps the guards for a given route.\n * This function will wrap CanActivate, CanDeactivate and CanActivateChild guards and force the route to always run guards and resolvers.\n * It ensures that in a multi-router environment, the guards are properly executed.\n * @param route - The route to wrap guards for.\n */\nexport function wrapGuards(route: Route) {\n  logGuardsDebug('wrapGuards', route)\n  saveOriginalGuards(route as OnecxRoute)\n  wrapActivateGuards(route)\n  wrapDeactivateGuards(route)\n  wrapActivateChildGuards(route)\n\n  // Important, this will ensure that guards are always run\n  // even if the route is already active.\n  forceGuardRun(route)\n\n  if (route.children) {\n    route.children.forEach((childRoute) => wrapGuards(childRoute))\n  }\n}\n\nfunction wrapActivateGuards(route: Route): void {\n  if (isWrappingRequired(route.canActivate)) {\n    logGuardsDebug('Wrapping activate guards for route', route)\n    route.canActivate = [createActivateWrapper(route)]\n  }\n}\n\nfunction wrapDeactivateGuards(route: Route): void {\n  if (isWrappingRequired(route.canDeactivate)) {\n    logGuardsDebug('Wrapping deactivate guards for route', route)\n    route.canDeactivate = [createDeactivateWrapper(route)]\n  }\n}\n\nfunction wrapActivateChildGuards(route: Route): void {\n  if (isWrappingRequired(route.canActivateChild)) {\n    logGuardsDebug('Wrapping activate child guards for route', route)\n    route.canActivateChild = [createActivateChildWrapper(route)]\n  }\n}\n\n/**\n * Force the route to always run guards and resolvers.\n */\nfunction forceGuardRun(route: Route) {\n  route.runGuardsAndResolvers = 'always'\n}\n\n/**\n * Saves the state of the guards for the route.\n * This function saves the canActivate, canDeactivate, and canActivateChild guards to their respective lists.\n * @param route - The route to save the guard state for.\n */\nfunction saveOriginalGuards(route: OnecxRoute) {\n  saveCanActivateGuards(route)\n  saveCanDeactivateGuards(route)\n  saveCanActivateChildGuards(route)\n}\n\n/**\n * Checks if wrapping is required for the guards.\n * If the guards array has only one guard and it is already wrapped, no wrapping is needed.\n * @param guards - The array of guards to check.\n * @returns True if wrapping is required, false otherwise.\n */\nfunction isWrappingRequired(guards: Array<any> | undefined): boolean {\n  if (guards && guards.length === 1 && isGuardsWrapped(guards)) {\n    return false\n  }\n\n  return true\n}\n\n/**\n * Helper function to check if guards are already wrapped.\n * Checks for a unique tag added to wrapped guards.\n * @param guards - The array of guards to check.\n * @returns True if the guards are wrapped, false otherwise.\n */\nfunction isGuardsWrapped(guards: Array<any>): boolean {\n  return guards.some((guard) => isWrapper(guard))\n}\n\n/**\n * Checks if a guard is a wrapper.\n * A guard is considered a wrapper if it has the unique WRAPPED_GUARD_TAG symbol.\n * @param guard - The guard to check.\n * @returns True if the guard is a wrapper, false otherwise.\n */\nfunction isWrapper(guard: any): boolean {\n  return guard && (guard as any)[WRAPPED_GUARD_TAG] === true\n}\n\n/**\n * Creates a wrapper for CanActivate guards.\n * Adds a unique tag to the wrapped guard for identification.\n * @param guards - The array of CanActivate guards to wrap.\n * @returns A CanActivateFn that wraps the provided guards.\n */\nfunction createActivateWrapper(routeToWrap: OnecxRoute): CanActivateFn {\n  const wrappedGuard: CanActivateFn = (route, state) => {\n    return inject(ActivateGuardsWrapper).canActivate(route, state, routeToWrap.canActivateGuardList || [])\n  }\n\n  // Tag the wrapped guard with the unique symbol\n  ;(wrappedGuard as any)[WRAPPED_GUARD_TAG] = true\n\n  return wrappedGuard\n}\n\n/**\n * Creates a wrapper for CanDeactivate guards.\n * @param guards - The array of CanDeactivate guards to wrap.\n * @returns A CanDeactivateFn that wraps the provided guards.\n */\nfunction createDeactivateWrapper(routeToWrap: OnecxRoute): CanDeactivateFn<any> {\n  const wrappedGuard: CanDeactivateFn<any> = (component, currentRoute, currentState, nextState) => {\n    return inject(DeactivateGuardsWrapper).canDeactivate(\n      component,\n      currentRoute,\n      currentState,\n      nextState,\n      routeToWrap.canDeactivateGuardList || []\n    )\n  }\n\n  // Tag the wrapped guard with the unique symbol\n  ;(wrappedGuard as any)[WRAPPED_GUARD_TAG] = true\n\n  return wrappedGuard\n}\n\n/**\n * Creates a wrapper for CanActivateChild guards.\n * Adds a unique tag to the wrapped guard for identification.\n * @param guards - The array of CanActivateChild guards to wrap.\n * @returns A CanActivateFn that wraps the provided guards.\n */\nfunction createActivateChildWrapper(routeToWrap: OnecxRoute): CanActivateFn {\n  const wrappedGuard: CanActivateFn = (route, state) => {\n    return inject(ActivateGuardsWrapper).canActivate(route, state, routeToWrap.canActivateChildGuardList || [])\n  }\n\n  // Tag the wrapped guard with the unique symbol\n  ;(wrappedGuard as any)[WRAPPED_GUARD_TAG] = true\n\n  return wrappedGuard\n}\n\n/**\n * Saves the canActivate guards to the route's canActivateGuardList.\n * @param route - The route to save the canActivate guards for.\n */\nfunction saveCanActivateGuards(route: OnecxRoute): void {\n  route.canActivateGuardList ??= []\n\n  if (route.canActivate) {\n    route.canActivateGuardList = route.canActivateGuardList.concat(\n      route.canActivate.filter(\n        (guard): guard is CanActivateFn | Type<CanActivate> =>\n          // Filter out deprecated string guards and non-function types\n          typeof guard === 'function' &&\n          !isWrapper(guard) &&\n          !isSaved<CanActivateFn | Type<CanActivate> | AbstractType<any>>(route.canActivateGuardList!, guard)\n      )\n    )\n  }\n}\n\n/**\n * Saves the canActivateChild guards to the route's canActivateChildGuardList.\n * @param route - The route to save the canActivateChild guards for.\n */\nfunction saveCanDeactivateGuards(route: OnecxRoute): void {\n  route.canDeactivateGuardList ??= []\n\n  if (route.canDeactivate) {\n    route.canDeactivateGuardList = route.canDeactivateGuardList.concat(\n      route.canDeactivate.filter(\n        (guard): guard is CanDeactivateFn<any> | Type<CanDeactivate<any>> =>\n          // Filter out deprecated string guards and non-function types\n          typeof guard === 'function' &&\n          !isWrapper(guard) &&\n          !isSaved<CanDeactivateFn<any> | Type<CanDeactivate<any>> | AbstractType<any>>(\n            route.canDeactivateGuardList!,\n            guard\n          )\n      )\n    )\n  }\n}\n\n/**\n * Saves the canActivateChild guards to the route's canActivateChildGuardList.\n * @param route - The route to save the canActivateChild guards for.\n */\nfunction saveCanActivateChildGuards(route: OnecxRoute): void {\n  route.canActivateChildGuardList ??= []\n\n  if (route.canActivateChild) {\n    route.canActivateChildGuardList = route.canActivateChildGuardList.concat(\n      route.canActivateChild.filter(\n        (guard): guard is CanActivateFn | Type<CanActivate> =>\n          // Filter out deprecated string guards and non-function types\n          typeof guard === 'function' &&\n          !isWrapper(guard) &&\n          !isSaved<CanActivateFn | Type<CanActivate> | AbstractType<any>>(route.canActivateChildGuardList!, guard)\n      )\n    )\n  }\n}\n\nfunction isSaved<T>(list: Array<T>, guard: T) {\n  return list.some((item) => item === guard)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}