{"version":3,"file":"acontplus-ng-auth.mjs","sources":["../../../../packages/ng-auth/src/lib/domain/repositories/auth-repository.ts","../../../../packages/ng-auth/src/lib/repositories/auth-token-repository-impl.ts","../../../../packages/ng-auth/src/lib/ui/stores/auth-store.ts","../../../../packages/ng-auth/src/lib/services/auth-url-redirect.ts","../../../../packages/ng-auth/src/lib/application/use-cases/login-use-case.ts","../../../../packages/ng-auth/src/lib/application/use-cases/register-use-case.ts","../../../../packages/ng-auth/src/lib/application/use-cases/refresh-token-use-case.ts","../../../../packages/ng-auth/src/lib/application/use-cases/logout-use-case.ts","../../../../packages/ng-auth/src/lib/application/use-cases/index.ts","../../../../packages/ng-auth/src/lib/application/index.ts","../../../../packages/ng-auth/src/lib/data/repositories/auth-http-repository.ts","../../../../packages/ng-auth/src/lib/data/repositories/index.ts","../../../../packages/ng-auth/src/lib/data/index.ts","../../../../packages/ng-auth/src/lib/domain/models/auth.ts","../../../../packages/ng-auth/src/lib/domain/models/index.ts","../../../../packages/ng-auth/src/lib/domain/repositories/index.ts","../../../../packages/ng-auth/src/lib/guards/auth-guard.ts","../../../../packages/ng-auth/src/lib/interceptors/auth-redirect-interceptor.ts","../../../../packages/ng-auth/src/lib/services/csrf-api.ts","../../../../packages/ng-auth/src/lib/interceptors/csrf-interceptor.ts","../../../../packages/ng-auth/src/lib/providers/auth-providers.ts","../../../../packages/ng-auth/src/lib/providers/index.ts","../../../../packages/ng-auth/src/lib/ui/stores/index.ts","../../../../packages/ng-auth/src/lib/ui/login/login.ts","../../../../packages/ng-auth/src/lib/ui/login/login.html","../../../../packages/ng-auth/src/lib/ui/login/index.ts","../../../../packages/ng-auth/src/lib/ui/index.ts","../../../../packages/ng-auth/src/acontplus-ng-auth.ts"],"sourcesContent":["// src/lib/domain/repositories/auth.base-repository.ts\nimport { Observable } from 'rxjs';\nimport { LoginRequest, RegisterRequest, RefreshTokenRequest } from '../models/auth';\nimport { AuthTokens } from '@acontplus/core';\n\nexport abstract class AuthRepository {\n  abstract login(request: LoginRequest): Observable<AuthTokens>;\n  abstract register(request: RegisterRequest): Observable<AuthTokens>;\n  abstract refreshToken(request: RefreshTokenRequest): Observable<AuthTokens>;\n  abstract logout(email: string, refreshToken: string): Observable<void>;\n}\n","import { Injectable, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { jwtDecode } from 'jwt-decode';\nimport { AuthTokens, UserData } from '@acontplus/core';\nimport { AuthTokenRepository, ENVIRONMENT } from '@acontplus/ng-config';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AuthTokenRepositoryImpl implements AuthTokenRepository {\n  private environment = inject(ENVIRONMENT);\n  private platformId = inject(PLATFORM_ID);\n\n  saveTokens(tokens: AuthTokens, rememberMe = false): void {\n    if (isPlatformBrowser(this.platformId)) {\n      this.setToken(tokens.token, rememberMe);\n      this.setRefreshToken(tokens.refreshToken, rememberMe);\n    }\n  }\n\n  getToken(): string | null {\n    if (!isPlatformBrowser(this.platformId)) {\n      return null;\n    }\n    return (\n      localStorage.getItem(this.environment.tokenKey) ||\n      sessionStorage.getItem(this.environment.tokenKey)\n    );\n  }\n\n  getRefreshToken(): string | null {\n    if (!isPlatformBrowser(this.platformId)) {\n      return null;\n    }\n    return (\n      localStorage.getItem(this.environment.refreshTokenKey) ||\n      sessionStorage.getItem(this.environment.refreshTokenKey)\n    );\n  }\n\n  setToken(token: string, rememberMe = false): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n    if (rememberMe) {\n      localStorage.setItem(this.environment.tokenKey, token);\n      // Clear from sessionStorage to avoid conflicts\n      sessionStorage.removeItem(this.environment.tokenKey);\n    } else {\n      sessionStorage.setItem(this.environment.tokenKey, token);\n      // Clear from localStorage to avoid conflicts\n      localStorage.removeItem(this.environment.tokenKey);\n    }\n  }\n\n  setRefreshToken(refreshToken: string, rememberMe = false): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n    if (rememberMe) {\n      localStorage.setItem(this.environment.refreshTokenKey, refreshToken);\n      // Clear from sessionStorage to avoid conflicts\n      sessionStorage.removeItem(this.environment.refreshTokenKey);\n    } else {\n      sessionStorage.setItem(this.environment.refreshTokenKey, refreshToken);\n      // Clear from localStorage to avoid conflicts\n      localStorage.removeItem(this.environment.refreshTokenKey);\n    }\n  }\n\n  clearTokens(): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n    localStorage.removeItem(this.environment.tokenKey);\n    localStorage.removeItem(this.environment.refreshTokenKey);\n    sessionStorage.removeItem(this.environment.tokenKey);\n    sessionStorage.removeItem(this.environment.refreshTokenKey);\n  }\n\n  isAuthenticated(): boolean {\n    const accessToken = this.getToken();\n\n    if (!accessToken) {\n      return false;\n    }\n\n    try {\n      const decodedAccessToken = jwtDecode(accessToken);\n      const accessExpiration = Number(decodedAccessToken.exp);\n      const currentTimeUTC = Math.floor(Date.now() / 1000);\n\n      return accessExpiration > currentTimeUTC;\n    } catch {\n      return false;\n    }\n  }\n\n  needsRefresh(): boolean {\n    const accessToken = this.getToken();\n    if (!accessToken) {\n      return false;\n    }\n\n    try {\n      const decodedToken = jwtDecode(accessToken);\n      const expiration = Number(decodedToken.exp);\n      const currentTimeUTC = Math.floor(Date.now() / 1000);\n      const timeUntilExpiry = expiration - currentTimeUTC;\n\n      return timeUntilExpiry <= 300; // 5 minutes\n    } catch {\n      return false;\n    }\n  }\n\n  getTokenPayload(): unknown {\n    const token = this.getToken();\n    if (!token) return null;\n\n    try {\n      return jwtDecode(token);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Determines if tokens are stored persistently (localStorage) vs session (sessionStorage)\n   */\n  isRememberMeEnabled(): boolean {\n    if (!isPlatformBrowser(this.platformId)) {\n      return false;\n    }\n\n    // Check if tokens exist in localStorage (persistent storage)\n    const tokenInLocalStorage = localStorage.getItem(this.environment.tokenKey);\n    const refreshTokenInLocalStorage = localStorage.getItem(this.environment.refreshTokenKey);\n\n    return !!(tokenInLocalStorage || refreshTokenInLocalStorage);\n  }\n\n  getUserData(): UserData | null {\n    const token = this.getToken();\n    if (!token) {\n      return null;\n    }\n\n    try {\n      const decodedToken = jwtDecode<Record<string, unknown>>(token);\n\n      const email =\n        decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] ??\n        decodedToken['email'] ??\n        decodedToken['sub'] ??\n        decodedToken['user_id'];\n\n      const displayName =\n        decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname'] ??\n        decodedToken['displayName'] ??\n        decodedToken['display_name'] ??\n        decodedToken['name'] ??\n        decodedToken['given_name'];\n\n      const name = decodedToken['name'] ?? displayName;\n\n      if (!email) {\n        return null;\n      }\n\n      const userData: UserData = {\n        email: email.toString(),\n        displayName: displayName?.toString() ?? 'Unknown User',\n        name: name?.toString(),\n        roles: this.extractArrayField(decodedToken, ['roles', 'role']),\n        permissions: this.extractArrayField(decodedToken, ['permissions', 'perms']),\n        tenantId:\n          decodedToken['tenantId']?.toString() ??\n          decodedToken['tenant_id']?.toString() ??\n          decodedToken['tenant']?.toString(),\n        companyId:\n          decodedToken['companyId']?.toString() ??\n          decodedToken['company_id']?.toString() ??\n          decodedToken['organizationId']?.toString() ??\n          decodedToken['org_id']?.toString(),\n        locale: decodedToken['locale']?.toString(),\n        timezone: decodedToken['timezone']?.toString() ?? decodedToken['tz']?.toString(),\n      };\n\n      return userData;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Extract array field from decoded token, trying multiple possible field names\n   */\n  private extractArrayField(\n    decodedToken: Record<string, unknown>,\n    fieldNames: string[],\n  ): string[] | undefined {\n    for (const fieldName of fieldNames) {\n      const value = decodedToken[fieldName];\n      if (Array.isArray(value)) {\n        return value.map((v) => v.toString());\n      }\n      if (typeof value === 'string') {\n        // Handle comma-separated string values\n        return value\n          .split(',')\n          .map((v) => v.trim())\n          .filter((v) => v.length > 0);\n      }\n    }\n    return undefined;\n  }\n}\n","// src/lib/presentation/stores/auth-store.ts\nimport { Injectable, inject, signal, OnDestroy, NgZone } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of, tap, catchError } from 'rxjs';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport { AuthTokenRepositoryImpl } from '../../repositories/auth-token-repository-impl';\nimport { AuthTokens, UserData, DecodedToken } from '@acontplus/core';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AuthStore implements OnDestroy {\n  private readonly authRepository = inject(AuthRepository);\n  private readonly tokenRepository = inject(AuthTokenRepositoryImpl);\n  private readonly router = inject(Router);\n  private readonly ngZone = inject(NgZone);\n\n  // Authentication state signals\n  private readonly _isAuthenticated = signal<boolean>(false);\n  private readonly _isLoading = signal<boolean>(false);\n  private readonly _user = signal<UserData | null>(null);\n\n  // Public readonly signals\n  readonly isAuthenticated = this._isAuthenticated.asReadonly();\n  readonly isLoading = this._isLoading.asReadonly();\n  readonly user = this._user.asReadonly();\n\n  // Private refresh token timeout (instead of interval)\n  private refreshTokenTimeout?: number;\n  private refreshInProgress$?: Observable<AuthTokens | null>;\n\n  constructor() {\n    this.initializeAuthentication();\n  }\n\n  /**\n   * Initialize authentication state on app startup\n   */\n  private initializeAuthentication(): void {\n    this._isLoading.set(true);\n\n    try {\n      const isAuthenticated = this.tokenRepository.isAuthenticated();\n      this._isAuthenticated.set(isAuthenticated);\n\n      if (isAuthenticated) {\n        const userData = this.tokenRepository.getUserData();\n        this._user.set(userData);\n        this.scheduleTokenRefresh();\n      }\n    } catch {\n      this.logout();\n    } finally {\n      this._isLoading.set(false);\n    }\n  }\n\n  /**\n   * Schedule token refresh based on actual expiration time\n   */\n  private scheduleTokenRefresh(): void {\n    const accessToken = this.tokenRepository.getToken();\n    if (!accessToken) {\n      return;\n    }\n\n    try {\n      const decodedToken = this.decodeToken(accessToken);\n      const currentTime = Math.floor(Date.now() / 1000);\n      const timeUntilExpiry = decodedToken.exp - currentTime;\n\n      // Refresh 5 minutes before expiry (300 seconds)\n      const refreshTime = Math.max((timeUntilExpiry - 300) * 1000, 1000);\n\n      // Clear any existing timeout\n      if (this.refreshTokenTimeout) {\n        clearTimeout(this.refreshTokenTimeout);\n      }\n\n      this.ngZone.runOutsideAngular(() => {\n        this.refreshTokenTimeout = window.setTimeout(() => {\n          this.ngZone.run(() => {\n            // Check if refresh is still needed before executing\n            if (this.tokenRepository.needsRefresh()) {\n              this.refreshToken().subscribe();\n            }\n          });\n        }, refreshTime);\n      });\n    } catch {\n      // Silent fail - token might be invalid\n    }\n  }\n\n  /**\n   * Stop token refresh timer\n   */\n  private stopTokenRefreshTimer(): void {\n    if (this.refreshTokenTimeout) {\n      clearTimeout(this.refreshTokenTimeout);\n      this.refreshTokenTimeout = undefined;\n    }\n  }\n\n  /**\n   * Refresh authentication tokens\n   */\n  refreshToken(): Observable<AuthTokens | null> {\n    // Return existing refresh request if one is in progress\n    if (this.refreshInProgress$) {\n      return this.refreshInProgress$;\n    }\n\n    const userData = this.tokenRepository.getUserData();\n    const refreshToken = this.tokenRepository.getRefreshToken();\n\n    if (!userData?.email || !refreshToken) {\n      this.logout();\n      return of(null);\n    }\n\n    this.refreshInProgress$ = this.authRepository\n      .refreshToken({\n        email: userData.email,\n        refreshToken,\n      })\n      .pipe(\n        tap((tokens) => {\n          // Preserve the rememberMe preference from the current token storage\n          const rememberMe = this.tokenRepository.isRememberMeEnabled();\n          this.setAuthenticated(tokens, rememberMe);\n        }),\n        catchError(() => {\n          this.logout();\n          return of(null);\n        }),\n        tap({\n          complete: () => {\n            this.refreshInProgress$ = undefined;\n          },\n          error: () => {\n            this.refreshInProgress$ = undefined;\n          },\n        }),\n      );\n\n    return this.refreshInProgress$;\n  }\n\n  /**\n   * Set authentication state after successful login\n   */\n  setAuthenticated(tokens: AuthTokens, rememberMe = false): void {\n    this.tokenRepository.saveTokens(tokens, rememberMe);\n    this._isAuthenticated.set(true);\n    const userData = this.tokenRepository.getUserData();\n    this._user.set(userData);\n    this.scheduleTokenRefresh();\n  }\n\n  /**\n   * Logout user and clear all authentication data\n   */\n  logout(): void {\n    const user = this._user();\n    if (user) {\n      // Call server-side logout first\n      this.authRepository.logout(user.email, '').subscribe({\n        next: () => {\n          // Server logout successful, clear client-side data\n          this.performClientLogout();\n        },\n        error: () => {\n          // Server logout failed, still clear client-side data for security\n          this.performClientLogout();\n        },\n      });\n    } else {\n      // No user data, just clear client-side data\n      this.performClientLogout();\n    }\n  }\n\n  /**\n   * Perform client-side logout operations\n   */\n  private performClientLogout(): void {\n    this.stopTokenRefreshTimer();\n    this.tokenRepository.clearTokens();\n    this._isAuthenticated.set(false);\n    this._user.set(null);\n\n    // Navigate to login page\n    this.router.navigate(['/auth']);\n  }\n\n  /**\n   * Check if user is authenticated\n   */\n  checkAuthentication(): boolean {\n    const isAuthenticated = this.tokenRepository.isAuthenticated();\n    this._isAuthenticated.set(isAuthenticated);\n\n    if (!isAuthenticated) {\n      this.logout();\n    }\n\n    return isAuthenticated;\n  }\n\n  /**\n   * Decode JWT token\n   */\n  private decodeToken(token: string): DecodedToken {\n    try {\n      const base64Url = token.split('.')[1];\n      const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n      const jsonPayload = decodeURIComponent(\n        atob(base64)\n          .split('')\n          .map((c) => {\n            return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`;\n          })\n          .join(''),\n      );\n      return JSON.parse(jsonPayload);\n    } catch {\n      throw new Error('Invalid token format');\n    }\n  }\n\n  /**\n   * Cleanup on store destruction\n   */\n  ngOnDestroy(): void {\n    this.stopTokenRefreshTimer();\n  }\n}\n","import { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n/**\n * Service to manage URL redirection after authentication\n * Stores the intended URL when session is lost and redirects to it after successful login\n * SSR-compatible by checking platform before accessing sessionStorage\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class AuthUrlRedirect {\n  private readonly REDIRECT_URL_KEY = 'acp_redirect_url';\n  private readonly EXCLUDED_ROUTES = [\n    '/login',\n    '/auth',\n    '/register',\n    '/forgot-password',\n    '/reset-password',\n  ];\n\n  private readonly router = inject(Router);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly document = inject(DOCUMENT);\n\n  /**\n   * Stores the current URL for later redirection\n   * @param url - The URL to store (defaults to current URL)\n   */\n  storeIntendedUrl(url?: string): void {\n    // Only store in browser environment\n    if (!this.isBrowser()) {\n      return;\n    }\n\n    const urlToStore = url || this.router.url;\n\n    // Don't store authentication-related routes\n    if (this.isExcludedRoute(urlToStore)) {\n      return;\n    }\n\n    // Don't store URLs with query parameters that might contain sensitive data\n    const urlWithoutParams = urlToStore.split('?')[0];\n    this.getSessionStorage()?.setItem(this.REDIRECT_URL_KEY, urlWithoutParams);\n  }\n\n  /**\n   * Gets the stored intended URL\n   * @returns The stored URL or null if none exists\n   */\n  getIntendedUrl(): string | null {\n    if (!this.isBrowser()) {\n      return null;\n    }\n    return this.getSessionStorage()?.getItem(this.REDIRECT_URL_KEY) || null;\n  }\n\n  /**\n   * Redirects to the stored URL and clears it from storage\n   * @param defaultRoute - The default route to navigate to if no URL is stored\n   */\n  redirectToIntendedUrl(defaultRoute = '/'): void {\n    const intendedUrl = this.getIntendedUrl();\n\n    if (intendedUrl && !this.isExcludedRoute(intendedUrl)) {\n      this.clearIntendedUrl();\n      this.router.navigateByUrl(intendedUrl);\n    } else {\n      this.router.navigate([defaultRoute]);\n    }\n  }\n\n  /**\n   * Clears the stored intended URL\n   */\n  clearIntendedUrl(): void {\n    if (!this.isBrowser()) {\n      return;\n    }\n    this.getSessionStorage()?.removeItem(this.REDIRECT_URL_KEY);\n  }\n\n  /**\n   * Checks if a URL should be excluded from redirection\n   * @param url - The URL to check\n   * @returns True if the URL should be excluded\n   */\n  private isExcludedRoute(url: string): boolean {\n    return this.EXCLUDED_ROUTES.some((route) => url.includes(route));\n  }\n\n  /**\n   * Stores the current URL if it's not an excluded route\n   * Useful for guards and interceptors\n   */\n  storeCurrentUrlIfAllowed(): void {\n    const currentUrl = this.router.url;\n    if (!this.isExcludedRoute(currentUrl)) {\n      this.storeIntendedUrl(currentUrl);\n    }\n  }\n\n  /**\n   * Checks if we're running in a browser environment\n   * @returns True if running in browser, false if SSR\n   */\n  private isBrowser(): boolean {\n    return isPlatformBrowser(this.platformId);\n  }\n\n  /**\n   * Safely gets sessionStorage reference\n   * @returns sessionStorage object or null if not available\n   */\n  private getSessionStorage(): Storage | null {\n    if (!this.isBrowser()) {\n      return null;\n    }\n    try {\n      return this.document.defaultView?.sessionStorage || null;\n    } catch {\n      // Handle cases where sessionStorage might be disabled\n      return null;\n    }\n  }\n}\n","// src/lib/application/use-cases/login-use-case.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, tap } from 'rxjs';\nimport { BaseUseCase } from '@acontplus/ng-infrastructure';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport { LoginRequest } from '../../domain/models/auth';\nimport { AuthTokens } from '@acontplus/core';\nimport { AuthStore } from '../../ui/stores/auth-store';\nimport { AuthUrlRedirect } from '../../services/auth-url-redirect';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class LoginUseCase extends BaseUseCase<LoginRequest, AuthTokens> {\n  private readonly authRepository = inject(AuthRepository);\n  private readonly authStore = inject(AuthStore);\n  private readonly router = inject(Router);\n  private readonly urlRedirectService = inject(AuthUrlRedirect);\n\n  execute(request: LoginRequest): Observable<AuthTokens> {\n    return this.authRepository.login(request).pipe(\n      tap((tokens) => {\n        // Set authentication state with rememberMe preference\n        this.authStore.setAuthenticated(tokens, request.rememberMe ?? false);\n\n        // Redirect to intended URL or default route\n        this.urlRedirectService.redirectToIntendedUrl('/');\n      }),\n    );\n  }\n}\n","// src/lib/application/use-cases/register-use-case.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, tap } from 'rxjs';\nimport { BaseUseCase } from '@acontplus/ng-infrastructure';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport { RegisterRequest } from '../../domain/models/auth';\nimport { AuthTokens } from '@acontplus/core';\nimport { AuthStore } from '../../ui/stores/auth-store';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class RegisterUseCase extends BaseUseCase<RegisterRequest, AuthTokens> {\n  private readonly authRepository = inject(AuthRepository);\n  private readonly authStore = inject(AuthStore);\n  private readonly router = inject(Router);\n\n  execute(request: RegisterRequest): Observable<AuthTokens> {\n    return this.authRepository.register(request).pipe(\n      tap((tokens) => {\n        // Set authentication state\n        this.authStore.setAuthenticated(tokens);\n\n        // Navigate to main page\n        this.router.navigate(['/']);\n      }),\n    );\n  }\n}\n","// src/lib/application/use-cases/refresh-token-use-case.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, throwError, catchError, tap } from 'rxjs';\nimport { BaseUseCase } from '@acontplus/ng-infrastructure';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport { AuthTokenRepositoryImpl } from '../../repositories/auth-token-repository-impl';\nimport { AuthTokens } from '@acontplus/core';\nimport { AuthStore } from '../../ui/stores/auth-store';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class RefreshTokenUseCase extends BaseUseCase<void, AuthTokens> {\n  private readonly authRepository = inject(AuthRepository);\n  private readonly tokenRepository = inject(AuthTokenRepositoryImpl);\n  private readonly authStore = inject(AuthStore);\n\n  execute(): Observable<AuthTokens> {\n    const userData = this.tokenRepository.getUserData();\n    const refreshToken = this.tokenRepository.getRefreshToken();\n\n    if (!userData?.email || !refreshToken || refreshToken.trim().length === 0) {\n      const error = new Error('No refresh token or email available');\n      return throwError(() => error);\n    }\n\n    return this.authRepository\n      .refreshToken({\n        email: userData.email,\n        refreshToken,\n      })\n      .pipe(\n        tap((tokens) => {\n          // Preserve the rememberMe preference from the current token storage\n          const rememberMe = this.tokenRepository.isRememberMeEnabled();\n          // Update authentication state\n          this.authStore.setAuthenticated(tokens, rememberMe);\n        }),\n        catchError((error) => {\n          // Don't logout here, let the interceptor handle it\n          return throwError(() => error);\n        }),\n      );\n  }\n}\n","// src/lib/application/use-cases/logout-use-case.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, of, tap } from 'rxjs';\nimport { BaseUseCase } from '@acontplus/ng-infrastructure';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport { AuthTokenRepositoryImpl } from '../../repositories/auth-token-repository-impl';\nimport { AuthStore } from '../../ui/stores/auth-store';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class LogoutUseCase extends BaseUseCase<void, void> {\n  private readonly authRepository = inject(AuthRepository);\n  private readonly tokenRepository = inject(AuthTokenRepositoryImpl);\n  private readonly authStore = inject(AuthStore);\n\n  execute(): Observable<void> {\n    const userData = this.tokenRepository.getUserData();\n    const refreshToken = this.tokenRepository.getRefreshToken();\n\n    if (userData?.email && refreshToken && refreshToken.length > 0) {\n      return this.authRepository\n        .logout(userData.email, refreshToken)\n        .pipe(tap(() => this.cleanup()));\n    }\n\n    this.cleanup();\n    return of(void 0);\n  }\n\n  private cleanup(): void {\n    // Use auth store for centralized logout\n    this.authStore.logout();\n  }\n}\n","// src/lib/application/use-cases/index.ts\nexport * from './login-use-case';\nexport * from './register-use-case';\nexport * from './refresh-token-use-case';\nexport * from './logout-use-case';\n","// src/lib/application/index.ts\nexport * from './use-cases';\n","// src/lib/data/repositories/auth-http.base-repository.ts\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport { LoginRequest, RegisterRequest, RefreshTokenRequest } from '../../domain/models/auth';\nimport { AuthTokens } from '@acontplus/core';\nimport { AUTH_API } from '@acontplus/ng-config';\n\nfunction getDeviceInfo(): string {\n  return `${navigator.platform ?? 'Unknown'} - ${navigator.userAgent}`;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AuthHttpRepository extends AuthRepository {\n  private readonly http = inject(HttpClient);\n  private readonly URL = `${AUTH_API.AUTH}`;\n\n  login(request: LoginRequest): Observable<AuthTokens> {\n    return this.http.post<AuthTokens>(`${this.URL}login`, request, {\n      headers: {\n        'Device-Info': getDeviceInfo(),\n      },\n      withCredentials: true,\n    });\n  }\n\n  register(request: RegisterRequest): Observable<AuthTokens> {\n    return this.http.post<AuthTokens>(`${this.URL}register`, request, {\n      headers: {\n        'Device-Info': getDeviceInfo(),\n      },\n      withCredentials: true,\n    });\n  }\n\n  refreshToken(request: RefreshTokenRequest): Observable<AuthTokens> {\n    return this.http.post<AuthTokens>(`${this.URL}refresh`, request, {\n      headers: {\n        'Device-Info': getDeviceInfo(),\n      },\n      withCredentials: true,\n    });\n  }\n\n  logout(email: string, refreshToken: string): Observable<void> {\n    return this.http.post<void>(\n      `${this.URL}logout`,\n      { email, refreshToken: refreshToken || undefined },\n      {\n        headers: {},\n        withCredentials: true, // Ensure cookies are sent\n      },\n    );\n  }\n}\n","// src/lib/data/repositories/index.ts\nexport * from './auth-http-repository';\n","// src/lib/data/index.ts\nexport * from './repositories';\n","// src/lib/domain/repositories/auth.ts\n\nexport interface LoginRequest {\n  email: string;\n  password: string;\n  rememberMe?: boolean;\n}\n\nexport interface RegisterRequest {\n  email: string;\n  displayName: string;\n  password: string;\n}\n\nexport interface RefreshTokenRequest {\n  email: string;\n  refreshToken: string;\n}\n","// src/lib/domain/repositories/index.ts\nexport * from './auth';\n","// src/lib/domain/repositories/index.ts\nexport * from './auth-repository';\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthUrlRedirect } from '../services/auth-url-redirect';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\n\nexport const authGuard: CanActivateFn = (_route, state) => {\n  const tokenRepository = inject(AuthTokenRepositoryImpl);\n  const router = inject(Router);\n  const urlRedirectService = inject(AuthUrlRedirect);\n  const environment = inject(ENVIRONMENT);\n\n  if (tokenRepository.isAuthenticated()) {\n    return true;\n  }\n\n  // Store the current URL for redirection after login\n  urlRedirectService.storeIntendedUrl(state.url);\n\n  // Redirect to login page (configurable via environment)\n  router.navigate([`/${environment.loginRoute}`]);\n  return false;\n};\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { catchError } from 'rxjs/operators';\nimport { throwError } from 'rxjs';\nimport { AuthUrlRedirect } from '../services/auth-url-redirect';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\n\n/**\n * Interceptor that handles authentication errors and manages URL redirection\n * Captures the current URL when a 401 error occurs and redirects to login\n */\nexport const authRedirectInterceptor: HttpInterceptorFn = (req, next) => {\n  const router = inject(Router);\n  const urlRedirectService = inject(AuthUrlRedirect);\n  const tokenRepository = inject(AuthTokenRepositoryImpl);\n  const environment = inject(ENVIRONMENT);\n\n  return next(req).pipe(\n    catchError((error: HttpErrorResponse) => {\n      // Handle 401 Unauthorized errors\n      if (error.status === 401) {\n        // Only store and redirect if user was previously authenticated\n        // This prevents redirect loops and handles session expiry scenarios\n        if (tokenRepository.isAuthenticated()) {\n          // Store the current URL for redirection after re-authentication\n          urlRedirectService.storeCurrentUrlIfAllowed();\n\n          // Navigate to login page\n          router.navigate([`/${environment.loginRoute}`]);\n        }\n      }\n\n      // Re-throw the error so other error handlers can process it\n      return throwError(() => error);\n    }),\n  );\n};\n","// src/lib/services/csrf-api.ts\nimport { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom, map } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class CsrfApi {\n  private http = inject(HttpClient);\n  private csrfToken: string | null = null;\n\n  /**\n   * Get CSRF token, fetching it if not available\n   */\n  async getCsrfToken(): Promise<string> {\n    if (this.csrfToken) {\n      return this.csrfToken;\n    }\n\n    try {\n      this.csrfToken = await firstValueFrom(\n        this.http\n          .get<{ csrfToken: string }>('csrf-token')\n          .pipe(map((response) => response.csrfToken)),\n      );\n\n      return this.csrfToken || '';\n    } catch {\n      // If CSRF endpoint fails, return empty token\n      // Server should handle missing CSRF tokens appropriately\n      return '';\n    }\n  }\n\n  /**\n   * Clear stored CSRF token (useful on logout)\n   */\n  clearCsrfToken(): void {\n    this.csrfToken = null;\n  }\n}\n","import { HttpInterceptorFn, HttpRequest, HttpContextToken } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { from } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { CsrfApi } from '../services/csrf-api';\n\n// A token to use with HttpContext for skipping CSRF token addition on specific requests.\nexport const SKIP_CSRF = new HttpContextToken<boolean>(() => false);\n\n/**\n * HTTP interceptor that automatically adds CSRF tokens to state-changing requests\n * Only applies to requests to the same origin to avoid leaking tokens to external APIs\n */\nexport const csrfInterceptor: HttpInterceptorFn = (req, next) => {\n  const csrfService = inject(CsrfApi);\n\n  // Check if CSRF should be skipped for this request\n  const skipCsrf = req.context.get(SKIP_CSRF);\n  if (skipCsrf) {\n    return next(req);\n  }\n\n  // Only add CSRF token to state-changing requests (POST, PUT, PATCH, DELETE)\n  const isStateChangingMethod = ['POST', 'PUT', 'PATCH', 'DELETE'].includes(\n    req.method.toUpperCase(),\n  );\n\n  // Only add CSRF token to same-origin requests\n  const isSameOrigin = isRequestToSameOrigin(req);\n\n  if (isStateChangingMethod && isSameOrigin) {\n    return from(csrfService.getCsrfToken()).pipe(\n      switchMap((csrfToken) => {\n        const modifiedReq = req.clone({\n          setHeaders: {\n            'X-CSRF-Token': csrfToken,\n          },\n        });\n        return next(modifiedReq);\n      }),\n    );\n  }\n\n  // For non-state-changing requests or external requests, proceed without modification\n  return next(req);\n};\n\n/**\n * Checks if the request is going to the same origin as the current application\n */\nfunction isRequestToSameOrigin(req: HttpRequest<unknown>): boolean {\n  try {\n    const requestUrl = new URL(req.url, window.location.origin);\n    return requestUrl.origin === window.location.origin;\n  } catch {\n    // If URL parsing fails, assume it's not same origin for security\n    return false;\n  }\n}\n","import { Provider } from '@angular/core';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthRepository } from '../domain/repositories/auth-repository';\nimport { AuthHttpRepository } from '../data/repositories/auth-http-repository';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\n\nexport const authProviders: Provider[] = [\n  {\n    provide: AuthRepository,\n    useClass: AuthHttpRepository,\n  },\n  {\n    provide: AUTH_TOKEN,\n    useClass: AuthTokenRepositoryImpl,\n  },\n];\n","// src/lib/providers/index.ts\nexport * from './auth-providers';\n","// src/lib/presentation/stores/index.ts\nexport * from './auth-store';\n","// src/lib/presentation/components/login/login.ts\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  inject,\n  input,\n  signal,\n  computed,\n  OnInit,\n  TemplateRef,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  FormGroup,\n  FormBuilder,\n  Validators,\n  ReactiveFormsModule,\n  AbstractControl,\n} from '@angular/forms';\nimport {\n  MatCard,\n  MatCardContent,\n  MatCardFooter,\n  MatCardHeader,\n  MatCardTitle,\n} from '@angular/material/card';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatAnchor, MatButton } from '@angular/material/button';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { AuthStore } from '../stores/auth-store';\nimport { LoginUseCase } from '../../application/use-cases/login-use-case';\nimport { RegisterUseCase } from '../../application/use-cases/register-use-case';\nimport { LoggingService } from '@acontplus/ng-infrastructure';\n\n@Component({\n  selector: 'acp-login',\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatCard,\n    MatCardHeader,\n    MatLabel,\n    MatCardTitle,\n    MatCardContent,\n    MatFormField,\n    MatInput,\n    MatIcon,\n    MatButton,\n    MatCardFooter,\n    MatAnchor,\n    MatCheckbox,\n  ],\n  templateUrl: './login.html',\n  styleUrls: ['./login.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class Login implements OnInit {\n  title = input<string>('Login');\n  showRegisterButton = input<boolean>(true);\n  showRememberMe = input<boolean>(true);\n\n  // Additional form controls that can be passed from parent components\n  additionalSigninControls = input<Record<string, AbstractControl>>({});\n  additionalSignupControls = input<Record<string, AbstractControl>>({});\n\n  // Additional field templates\n  additionalSigninFields = input<TemplateRef<unknown> | null>(null);\n  additionalSignupFields = input<TemplateRef<unknown> | null>(null);\n\n  // Footer content template\n  footerContent = input<TemplateRef<unknown> | null>(null);\n\n  // Computed signal to check if footer content exists\n  hasFooterContent = computed(() => this.footerContent() !== null);\n\n  private readonly fb = inject(FormBuilder);\n  private readonly authStore = inject(AuthStore);\n  private readonly loginUseCase = inject(LoginUseCase);\n  private readonly registerUseCase = inject(RegisterUseCase);\n  private readonly loggingService = inject(LoggingService);\n\n  // Angular 20+ signals\n  isLoginMode = signal(true);\n  isLoading = signal(false);\n  errorMessage = signal<string | null>(null);\n\n  signinForm: FormGroup;\n  signupForm: FormGroup;\n\n  constructor() {\n    this.signinForm = this.fb.group({\n      email: ['', [Validators.required, Validators.email]],\n      password: ['', Validators.required],\n      rememberMe: [false], // Default to false (unchecked)\n    });\n\n    this.signupForm = this.fb.group({\n      displayName: ['', Validators.required],\n      email: ['', [Validators.required, Validators.email]],\n      password: ['', [Validators.required, Validators.minLength(6)]],\n    });\n  }\n\n  ngOnInit(): void {\n    // Handle rememberMe control based on showRememberMe input\n    if (!this.showRememberMe()) {\n      // Remove rememberMe control if not needed\n      this.signinForm.removeControl('rememberMe');\n    }\n\n    // Add additional controls to signin form\n    Object.entries(this.additionalSigninControls()).forEach(([key, control]) => {\n      this.signinForm.addControl(key, control);\n    });\n\n    // Add additional controls to signup form\n    Object.entries(this.additionalSignupControls()).forEach(([key, control]) => {\n      this.signupForm.addControl(key, control);\n    });\n  }\n\n  switchMode(): void {\n    this.isLoginMode.set(!this.isLoginMode());\n    this.errorMessage.set(null);\n  }\n\n  signIn(): void {\n    if (this.signinForm.valid) {\n      this.isLoading.set(true);\n      this.errorMessage.set(null);\n\n      // Prepare login request with rememberMe handling\n      const loginRequest = {\n        ...this.signinForm.value,\n        // If showRememberMe is false, default rememberMe to false\n        rememberMe: this.showRememberMe() ? (this.signinForm.value.rememberMe ?? false) : false,\n      };\n\n      this.loginUseCase.execute(loginRequest).subscribe({\n        next: () => {\n          this.isLoading.set(false);\n        },\n        error: (error) => {\n          this.isLoading.set(false);\n          this.errorMessage.set('Error al iniciar sesión. Verifique sus credenciales.');\n          this.loggingService.error('Login failed', { error });\n        },\n      });\n    }\n  }\n\n  registerUser(): void {\n    if (this.signupForm.valid) {\n      this.isLoading.set(true);\n      this.errorMessage.set(null);\n\n      this.registerUseCase.execute(this.signupForm.value).subscribe({\n        next: () => {\n          this.isLoading.set(false);\n          this.signupForm.reset();\n          this.isLoginMode.set(true);\n        },\n        error: (error) => {\n          this.isLoading.set(false);\n          this.errorMessage.set('Error al registrar usuario. Intente nuevamente.');\n          this.loggingService.error('Register error', { error });\n        },\n      });\n    }\n  }\n}\n","<mat-card class=\"mat-elevation-z8 p-4 rounded\">\n  <mat-card-header>\n    <mat-card-title class=\"text-center\">{{ title() }}</mat-card-title>\n  </mat-card-header>\n  <mat-card-content>\n    @if (isLoginMode()) {\n      <form [formGroup]=\"signinForm\" (ngSubmit)=\"signIn()\" class=\"d-flex flex-column gap-3\">\n        <mat-form-field class=\"w-100\">\n          <mat-label>Usuario</mat-label>\n          <input matInput type=\"text\" placeholder=\"Ingrese su usuario\" formControlName=\"email\" />\n        </mat-form-field>\n\n        <mat-form-field class=\"w-100\">\n          <mat-label>Contraseña</mat-label>\n          <input\n            matInput\n            type=\"password\"\n            placeholder=\"Ingrese su contraseña\"\n            formControlName=\"password\"\n            autocomplete=\"current-password\"\n          />\n        </mat-form-field>\n\n        <!-- Remember Me checkbox - conditional -->\n        @if (showRememberMe()) {\n          <div class=\"d-flex align-items-center mt-2\">\n            <mat-checkbox formControlName=\"rememberMe\"> Recordarme </mat-checkbox>\n          </div>\n        }\n\n        <!-- Additional signin fields -->\n        <ng-container *ngTemplateOutlet=\"additionalSigninFields()\"></ng-container>\n\n        <div class=\"d-flex justify-content-center mt-3\">\n          <button\n            mat-raised-button\n            color=\"primary\"\n            [disabled]=\"!signinForm.valid || isLoading()\"\n            type=\"submit\"\n            class=\"w-100\"\n          >\n            @if (isLoading()) {\n              Ingresando...\n            } @else {\n              <ng-container>Ingresar <mat-icon>login</mat-icon></ng-container>\n            }\n          </button>\n        </div>\n\n        <div class=\"text-center mt-2\">\n          @if (showRegisterButton()) {\n            <button mat-button type=\"button\" (click)=\"switchMode()\">\n              ¿No tienes cuenta? Regístrate\n            </button>\n          }\n        </div>\n      </form>\n    } @else {\n      <form [formGroup]=\"signupForm\" (ngSubmit)=\"registerUser()\" class=\"d-flex flex-column gap-3\">\n        <mat-form-field class=\"w-100\">\n          <mat-label>Nombre</mat-label>\n          <input\n            matInput\n            type=\"text\"\n            placeholder=\"Ingrese su nombre\"\n            formControlName=\"displayName\"\n          />\n        </mat-form-field>\n\n        <mat-form-field class=\"w-100\">\n          <mat-label>Email</mat-label>\n          <input matInput type=\"email\" placeholder=\"Ingrese su email\" formControlName=\"email\" />\n        </mat-form-field>\n\n        <mat-form-field class=\"w-100\">\n          <mat-label>Contraseña</mat-label>\n          <input\n            matInput\n            type=\"password\"\n            placeholder=\"Ingrese su contraseña\"\n            formControlName=\"password\"\n            autocomplete=\"new-password\"\n          />\n        </mat-form-field>\n\n        <!-- Additional signup fields -->\n        <ng-container *ngTemplateOutlet=\"additionalSignupFields()\"></ng-container>\n\n        <div class=\"d-flex justify-content-center mt-3\">\n          <button\n            mat-raised-button\n            color=\"primary\"\n            [disabled]=\"!signupForm.valid || isLoading()\"\n            type=\"submit\"\n            class=\"w-100\"\n          >\n            @if (isLoading()) {\n              Registrando...\n            } @else {\n              <ng-container>Registrarse <mat-icon>person_add</mat-icon></ng-container>\n            }\n          </button>\n        </div>\n\n        <div class=\"text-center mt-2\">\n          <button mat-button type=\"button\" (click)=\"switchMode()\">\n            ¿Ya tienes cuenta? Inicia sesión\n          </button>\n        </div>\n      </form>\n    }\n    @if (errorMessage()) {\n      <div class=\"alert alert-danger mt-3\" role=\"alert\">{{ errorMessage() }}</div>\n    }\n  </mat-card-content>\n  @if (hasFooterContent()) {\n    <mat-card-footer>\n      <ng-container *ngTemplateOutlet=\"footerContent()\"></ng-container>\n    </mat-card-footer>\n  }\n</mat-card>\n","// src/lib/presentation/components/index.ts\nexport { Login } from './login';\n","// src/lib/presentation/index.ts\nexport * from './stores';\nexport * from './login';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError"],"mappings":"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"}