{"version":3,"file":"edsis-angular-module-auth.mjs","sources":["../../../library/angular/module/auth/auth.config.ts","../../../library/angular/module/auth/auth-messages.ts","../../../library/angular/module/auth/native/native-google-auth.adapter.ts","../../../library/angular/module/auth/auth.service.ts","../../../library/angular/module/auth/interceptor/auth.interceptor.ts","../../../library/angular/module/auth/health/auth-health.service.ts","../../../library/angular/module/auth/native/native-google-auth.service.ts","../../../library/angular/module/auth/auth.providers.ts","../../../library/angular/module/auth/guard/auth.guards.ts","../../../library/angular/module/auth/oauth/google-gateway.utils.ts","../../../library/angular/module/auth/oauth/google-oauth.utils.ts","../../../library/angular/module/auth/oauth/google-gateway-auth.service.ts","../../../library/angular/module/auth/pages/auth-shell/auth-shell.page.ts","../../../library/angular/module/auth/pages/auth-page.utils.ts","../../../library/angular/module/auth/pages/google-callback/google-callback.page.ts","../../../library/angular/module/auth/pages/login/login.page.ts","../../../library/angular/module/auth/pages/logout/logout.page.ts","../../../library/angular/module/auth/pages/verify/verify.page.ts","../../../library/angular/module/auth/pages/auth.routes.ts","../../../library/angular/module/auth/edsis-angular-module-auth.ts"],"sourcesContent":["import type { HttpInterceptorFn } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport type { EdsisAuthMessagesOverride } from './auth-messages';\n\nconst DEFAULT_LOGIN_PATH = '/login' as const;\nconst DEFAULT_LOGOUT_PATH = '/logout' as const;\nconst DEFAULT_VERIFY_PATH = '/verify' as const;\nconst DEFAULT_AUTHENTICATED_HOME_PATH = '/dashboard' as const;\nconst DEFAULT_HEALTH_CHECK_TIMEOUT_MS = 4000;\n\nexport const GOOGLE_AUTH_GATEWAY_DEFAULT_START_ENDPOINT = '/v1/auth/google/start' as const;\nexport const GOOGLE_AUTH_GATEWAY_DEFAULT_HANDOFF_ENDPOINT = '/v1/auth/google/handoff' as const;\n\n/**\n * Path route callback Google di dalam `authRoutes`; juga menjadi sumber\n * derivasi `redirectUri` (`${appUrl}/auth/google/callback`), sehingga URL yang\n * didaftarkan di Google Cloud Console selalu konsisten dengan route library.\n */\nexport const GOOGLE_OAUTH_CALLBACK_ROUTE_PATH = 'auth/google/callback' as const;\n\n/**\n * Health-check backend auth di halaman login (opt-in).\n * Sehat = HTTP 2xx dalam `timeoutMs`; body respons tidak diparse.\n */\nexport interface EdsisAuthHealthCheckConfig {\n  /** Default `false` — tanpa flag, perilaku login tidak berubah. */\n  enabled?: boolean;\n  /** Default `${apiUrl}/health`. */\n  url?: string;\n  /** Default 4000. */\n  timeoutMs?: number;\n}\n\n/**\n * Google Sign-In dengan authorization-code flow. Exchange code dilakukan\n * backend (`POST {apiUrl}/v1/auth/google`) sehingga client secret tidak pernah\n * menyentuh frontend.\n */\nexport interface EdsisAuthGoogleDirectOauthConfig {\n  /** Optional for backward compatibility; omitting it selects direct mode. */\n  mode?: 'direct';\n  /**\n   * OAuth 2.0 client ID dari Google Cloud Console. String kosong dianggap\n   * tidak dikonfigurasi (tombol Google tetap placeholder), sehingga aman\n   * meneruskan nilai environment yang di-inject build-time apa adanya.\n   */\n  clientId: string;\n}\n\nexport interface EdsisAuthGoogleGatewayEndpointsConfig {\n  /**\n   * Base URL Auth Gateway. Default `apiUrl`; jika diisi, origin-nya wajib\n   * sama dengan `apiUrl` agar seluruh cookie/session auth tetap satu origin.\n   */\n  baseUrl?: string;\n  /** Default `/v1/auth/google/start`; harus path relatif terhadap `baseUrl`. */\n  startEndpoint?: string;\n  /** Default `/v1/auth/google/handoff`; harus path relatif terhadap `baseUrl`. */\n  handoffEndpoint?: string;\n}\n\n/**\n * Google Sign-In terpusat untuk MFE. Gateway memiliki konfigurasi Google dan\n * refresh cookie; MFE hanya memiliki ID allowlist dan PKCE verifier sekali pakai.\n */\nexport interface EdsisAuthGoogleGatewayOauthConfig {\n  mode: 'gateway';\n  /** ID lower-kebab-case yang terdaftar bersama return URL pada Auth Gateway. */\n  mfeId: string;\n  /** Optional jika Gateway memakai base URL dan endpoint auth standar dari `apiUrl`. */\n  gateway?: EdsisAuthGoogleGatewayEndpointsConfig;\n}\n\n/** `{ clientId }` lama tetap memilih direct mode tanpa perubahan konsumer. */\nexport type EdsisAuthGoogleOauthConfig =\n  EdsisAuthGoogleDirectOauthConfig | EdsisAuthGoogleGatewayOauthConfig;\n\nexport interface EdsisAuthNativeGoogleConfig {\n  /** Default `true` saat blok konfigurasi ini diberikan. */\n  enabled?: boolean;\n  /** Harus path same-origin. Default `/api`. */\n  apiUrl?: `/${string}`;\n}\n\nexport interface EdsisAuthOauthConfig {\n  google?: EdsisAuthGoogleOauthConfig;\n  nativeGoogle?: EdsisAuthNativeGoogleConfig;\n}\n\nexport interface EdsisAuthConfig {\n  apiUrl: string;\n  appUrl: string;\n  loginPath?: string;\n  logoutPath?: string;\n  verifyPath?: string;\n  authenticatedHomePath?: string;\n  guestHomePath?: string;\n  /** Override teks UI halaman auth (i18n/branding). */\n  messages?: EdsisAuthMessagesOverride;\n  /**\n   * Interceptor tambahan dari aplikasi (mis. `layoutLoadingInterceptor` dari\n   * `@edsis/theme/layout`), dijalankan setelah interceptor auth Edsis.\n   */\n  httpInterceptors?: readonly HttpInterceptorFn[];\n  healthCheck?: EdsisAuthHealthCheckConfig;\n  /**\n   * Provider OAuth di halaman login (saat ini hanya Google). Callback direct\n   * maupun Gateway tidak dikonfigurasi konsumer; library menurunkannya dari\n   * `appUrl` sebagai `${appUrl}/auth/google/callback`.\n   */\n  oauth?: EdsisAuthOauthConfig;\n}\n\nexport interface ResolvedEdsisAuthHealthCheck {\n  enabled: boolean;\n  url: string;\n  timeoutMs: number;\n}\n\nexport interface ResolvedEdsisAuthGoogleDirectOauth {\n  mode: 'direct';\n  clientId: string;\n  /** Diturunkan dari `appUrl`: `${appUrl}/auth/google/callback`. */\n  redirectUri: string;\n}\n\nexport interface ResolvedEdsisAuthGoogleGatewayOauth {\n  mode: 'gateway';\n  mfeId: string;\n  /** Callback MFE exact yang didaftarkan pada allowlist Gateway. */\n  returnUrl: string;\n  gateway: {\n    baseUrl: string;\n    startUrl: string;\n    handoffUrl: string;\n  };\n}\n\nexport type ResolvedEdsisAuthGoogleOauth =\n  ResolvedEdsisAuthGoogleDirectOauth | ResolvedEdsisAuthGoogleGatewayOauth;\n\nexport interface ResolvedEdsisAuthOauth {\n  /** `null` saat Google Sign-In tidak dikonfigurasi (perilaku placeholder lama). */\n  google: ResolvedEdsisAuthGoogleOauth | null;\n  /** Flow native tablet; selalu memakai endpoint same-origin. */\n  nativeGoogle: { readonly apiUrl: `/${string}` } | null;\n}\n\nexport interface ResolvedEdsisAuthConfig {\n  apiUrl: string;\n  appUrl: string;\n  loginPath: `/${string}`;\n  logoutPath: `/${string}`;\n  verifyPath: `/${string}`;\n  authenticatedHomePath: `/${string}`;\n  guestHomePath: `/${string}`;\n  healthCheck: ResolvedEdsisAuthHealthCheck;\n  oauth: ResolvedEdsisAuthOauth;\n}\n\nexport const EDSIS_AUTH_CONFIG = new InjectionToken<ResolvedEdsisAuthConfig>('EDSIS_AUTH_CONFIG');\n\nexport function resolveEdsisAuthConfig(config: EdsisAuthConfig): ResolvedEdsisAuthConfig {\n  const loginPath = normalizePath(config.loginPath, DEFAULT_LOGIN_PATH);\n  const apiUrl = normalizeAbsoluteUrl(config.apiUrl, 'apiUrl');\n  const appUrl = normalizeAbsoluteUrl(config.appUrl, 'appUrl');\n\n  return {\n    apiUrl,\n    appUrl,\n    loginPath,\n    logoutPath: normalizePath(config.logoutPath, DEFAULT_LOGOUT_PATH),\n    verifyPath: normalizePath(config.verifyPath, DEFAULT_VERIFY_PATH),\n    authenticatedHomePath: normalizePath(\n      config.authenticatedHomePath,\n      DEFAULT_AUTHENTICATED_HOME_PATH,\n    ),\n    guestHomePath: normalizePath(config.guestHomePath, loginPath),\n    healthCheck: {\n      enabled: config.healthCheck?.enabled ?? false,\n      url: config.healthCheck?.url ?? `${apiUrl.replace(/\\/+$/, '')}/health`,\n      timeoutMs: config.healthCheck?.timeoutMs ?? DEFAULT_HEALTH_CHECK_TIMEOUT_MS,\n    },\n    oauth: {\n      google: resolveGoogleOauth(config.oauth?.google, appUrl, apiUrl),\n      nativeGoogle:\n        config.oauth?.nativeGoogle && config.oauth.nativeGoogle.enabled !== false\n          ? { apiUrl: normalizeSameOriginPath(config.oauth.nativeGoogle.apiUrl ?? '/api') }\n          : null,\n    },\n  };\n}\n\nfunction resolveGoogleOauth(\n  config: EdsisAuthGoogleOauthConfig | undefined,\n  appUrl: string,\n  apiUrl: string,\n): ResolvedEdsisAuthGoogleOauth | null {\n  if (!config) {\n    return null;\n  }\n\n  const callbackUrl = `${appUrl}/${GOOGLE_OAUTH_CALLBACK_ROUTE_PATH}`;\n\n  if (config.mode === 'gateway') {\n    const mfeId = config.mfeId.trim();\n\n    if (mfeId.length > 64 || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(mfeId)) {\n      throw new Error(\n        'Edsis Google Auth Gateway requires a lower-kebab-case mfeId of at most 64 characters.',\n      );\n    }\n\n    const baseUrl = normalizeGatewayBaseUrl(config.gateway?.baseUrl ?? apiUrl, apiUrl);\n    const startEndpoint = normalizeGatewayEndpoint(\n      config.gateway?.startEndpoint ?? GOOGLE_AUTH_GATEWAY_DEFAULT_START_ENDPOINT,\n      'startEndpoint',\n    );\n    const handoffEndpoint = normalizeGatewayEndpoint(\n      config.gateway?.handoffEndpoint ?? GOOGLE_AUTH_GATEWAY_DEFAULT_HANDOFF_ENDPOINT,\n      'handoffEndpoint',\n    );\n\n    return {\n      mode: 'gateway',\n      mfeId,\n      returnUrl: callbackUrl,\n      gateway: {\n        baseUrl,\n        startUrl: joinGatewayUrl(baseUrl, startEndpoint),\n        handoffUrl: joinGatewayUrl(baseUrl, handoffEndpoint),\n      },\n    };\n  }\n\n  const clientId = config.clientId.trim();\n\n  return clientId\n    ? {\n        mode: 'direct',\n        clientId,\n        redirectUri: callbackUrl,\n      }\n    : null;\n}\n\nfunction normalizeGatewayBaseUrl(value: string, apiUrl: string): string {\n  const baseUrl = normalizeAbsoluteUrl(value, 'Google Auth Gateway baseUrl');\n  const parsed = new URL(baseUrl);\n  const apiOrigin = new URL(apiUrl).origin;\n  const isLoopback = ['localhost', '127.0.0.1', '[::1]'].includes(parsed.hostname);\n  const hasAllowedProtocol =\n    parsed.protocol === 'https:' || (parsed.protocol === 'http:' && isLoopback);\n\n  if (!hasAllowedProtocol || parsed.username || parsed.password || parsed.search || parsed.hash) {\n    throw new Error(\n      'Edsis Google Auth Gateway baseUrl must use HTTPS (HTTP is allowed only for loopback development) without credentials, query, or hash.',\n    );\n  }\n\n  if (parsed.origin !== apiOrigin) {\n    throw new Error(\n      'Edsis Google Auth Gateway baseUrl must use the same origin (scheme, host, and port) as apiUrl so the refresh-cookie session cannot split across origins.',\n    );\n  }\n\n  return baseUrl;\n}\n\nfunction normalizeGatewayEndpoint(value: string, label: string): `/${string}` {\n  const endpoint = value.trim();\n  const segments = endpoint.split('/').slice(1);\n\n  if (\n    !endpoint.startsWith('/') ||\n    endpoint.startsWith('//') ||\n    endpoint.includes('?') ||\n    endpoint.includes('#') ||\n    segments.length === 0 ||\n    segments.some(\n      (segment) => !/^[A-Za-z0-9._~-]+$/u.test(segment) || segment === '.' || segment === '..',\n    )\n  ) {\n    throw new Error(`Edsis Google Auth Gateway ${label} must be a root-relative path.`);\n  }\n\n  return endpoint as `/${string}`;\n}\n\nfunction joinGatewayUrl(baseUrl: string, endpoint: `/${string}`): string {\n  return `${baseUrl}/${endpoint.replace(/^\\/+/, '')}`;\n}\n\nfunction normalizeSameOriginPath(value: string): `/${string}` {\n  const normalizedValue = value.trim().replace(/\\/+$/u, '');\n\n  if (\n    !normalizedValue.startsWith('/') ||\n    normalizedValue.startsWith('//') ||\n    normalizedValue.includes('?') ||\n    normalizedValue.includes('#')\n  ) {\n    throw new Error('Edsis native Google auth requires a same-origin apiUrl path.');\n  }\n\n  return (normalizedValue || '/') as `/${string}`;\n}\n\nfunction normalizeAbsoluteUrl(value: string, label: string): string {\n  const normalizedValue = value.trim();\n\n  if (!normalizedValue) {\n    throw new Error(`Edsis auth requires a non-empty ${label}.`);\n  }\n\n  const normalizedUrl = new URL(normalizedValue);\n  return normalizedUrl.toString().replace(/\\/$/, '');\n}\n\nfunction normalizePath(value: string | undefined, fallback: `/${string}`): `/${string}` {\n  const normalizedValue = value?.trim();\n\n  if (!normalizedValue) {\n    return fallback;\n  }\n\n  return (\n    normalizedValue.startsWith('/') ? normalizedValue : `/${normalizedValue}`\n  ) as `/${string}`;\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Seluruh teks yang tampil di halaman auth (login, logout, verify).\n * Override sebagian/seluruhnya lewat `provideEdsisAuth({ messages: ... })`\n * untuk deployment berbahasa lain atau branding berbeda.\n */\nexport interface EdsisAuthMessages {\n  readonly brand: {\n    /** Teks singkat di kotak logo (mis. inisial produk). */\n    readonly mark: string;\n  };\n  readonly login: {\n    readonly title: string;\n    readonly intro: string;\n    readonly badge: string;\n    readonly emailPlaceholder: string;\n    readonly submit: string;\n    readonly submitting: string;\n    readonly emailRequired: string;\n    readonly emailInvalid: string;\n    readonly magicLinkSent: string;\n    readonly magicLinkFailed: string;\n    readonly oauthComingSoon: string;\n    readonly oauthGoogleAria: string;\n    readonly oauthMicrosoftAria: string;\n    readonly oauthAppleAria: string;\n    readonly healthUnavailableTitle: string;\n    readonly healthUnavailableBody: string;\n    readonly healthRetry: string;\n    readonly healthChecking: string;\n  };\n  readonly google: {\n    readonly title: string;\n    readonly intro: string;\n    readonly badge: string;\n    /** Aria tombol Google di halaman login saat sign-in aktif (config terisi). */\n    readonly signInAria: string;\n    /** Status di halaman login selama full-page redirect ke Google berlangsung. */\n    readonly googleRedirecting: string;\n    readonly gatewayStartFailed: string;\n    readonly gatewayHandoffInProgress: string;\n    readonly gatewaySessionMissing: string;\n    readonly nativeSignInInProgress: string;\n    readonly nativeSignInUnavailable: string;\n    readonly nativeSignInFailed: string;\n    readonly googleExchangeInProgress: string;\n    readonly exchangeInProgressAria: string;\n    readonly googleStateMismatch: string;\n    readonly googleAccessDenied: string;\n    /** Error generik callback; juga fallback saat backend tidak mengirim pesan. */\n    readonly googleCallbackError: string;\n    readonly googleRetry: string;\n    readonly missingAccessToken: string;\n    readonly successRedirect: string;\n    readonly openDashboard: string;\n  };\n  readonly logout: {\n    readonly title: string;\n    readonly intro: string;\n    readonly badge: string;\n    readonly pending: string;\n    readonly pendingAria: string;\n    readonly success: string;\n    readonly failed: string;\n    readonly failedNote: string;\n    readonly backToLogin: string;\n    readonly openDashboard: string;\n  };\n  readonly verify: {\n    readonly title: string;\n    readonly intro: string;\n    readonly badge: string;\n    readonly pending: string;\n    readonly pendingAria: string;\n    readonly tokenMissing: string;\n    readonly invalidOrExpired: string;\n    readonly successRedirect: string;\n    readonly missingAccessToken: string;\n    readonly requestNewLink: string;\n    readonly openDashboard: string;\n  };\n}\n\nexport const DEFAULT_EDSIS_AUTH_MESSAGES: EdsisAuthMessages = {\n  brand: {\n    mark: 'ETOS',\n  },\n  login: {\n    title: 'Etos Account Center',\n    intro:\n      'Masukkan email yang terdaftar. Kami akan mengirimkan tautan verifikasi untuk masuk ke aplikasi.',\n    badge: 'LOGIN',\n    emailPlaceholder: 'your@email.com',\n    submit: 'Kirim',\n    submitting: 'Mengirim...',\n    emailRequired: 'Email wajib diisi.',\n    emailInvalid: 'Gunakan format email yang valid dengan panjang maksimal 255 karakter.',\n    magicLinkSent: 'Magic link berhasil dikirim.',\n    magicLinkFailed: 'Gagal mengirim magic link.',\n    oauthComingSoon: 'Segera hadir',\n    oauthGoogleAria: 'Login dengan Google segera hadir',\n    oauthMicrosoftAria: 'Login dengan Microsoft segera hadir',\n    oauthAppleAria: 'Login dengan Apple segera hadir',\n    healthUnavailableTitle: 'Layanan sedang tidak tersedia',\n    healthUnavailableBody: 'Kami tidak dapat menghubungi server autentikasi. Silakan coba lagi.',\n    healthRetry: 'Coba lagi',\n    healthChecking: 'Memeriksa ketersediaan layanan…',\n  },\n  google: {\n    title: 'Menyelesaikan Google Sign-In.',\n    intro:\n      'Kode otorisasi dari Google ditukar menjadi sesi oleh backend, sesi refresh cookie dibentuk, lalu access token hanya disimpan di memori aplikasi.',\n    badge: 'GOOGLE',\n    signInAria: 'Login dengan Google',\n    googleRedirecting: 'Mengarahkan ke Google...',\n    gatewayStartFailed: 'Gagal memulai login melalui Auth Gateway. Silakan coba lagi.',\n    gatewayHandoffInProgress: 'Menyelesaikan sesi Google melalui Auth Gateway...',\n    gatewaySessionMissing:\n      'Sesi keamanan Auth Gateway tidak ditemukan atau sudah kedaluwarsa. Silakan ulangi login dari awal.',\n    nativeSignInInProgress: 'Menyelesaikan login Google di perangkat...',\n    nativeSignInUnavailable:\n      'Google Sign-In native tidak tersedia pada perangkat ini. Perbarui aplikasi atau hubungi administrator.',\n    nativeSignInFailed: 'Login Google pada perangkat gagal diproses.',\n    googleExchangeInProgress: 'Menukar kode otorisasi Google...',\n    exchangeInProgressAria: 'Menukar kode otorisasi Google',\n    googleStateMismatch:\n      'Verifikasi keamanan gagal: state OAuth tidak cocok atau hilang. Silakan ulangi login dari awal.',\n    googleAccessDenied: 'Login Google dibatalkan. Silakan coba lagi jika ini tidak disengaja.',\n    googleCallbackError: 'Login Google gagal diproses.',\n    googleRetry: 'Kembali ke login',\n    missingAccessToken:\n      'Login Google berhasil, tetapi access token tidak ditemukan di respons backend.',\n    successRedirect: 'Login Google berhasil. Mengarahkan ke dashboard...',\n    openDashboard: 'Buka dashboard',\n  },\n  logout: {\n    title: 'Mengakhiri sesi Edsis.',\n    intro:\n      'Halaman ini membersihkan sesi lokal lalu memanggil endpoint logout untuk merevoke refresh-token cookie pada backend.',\n    badge: 'LOGOUT',\n    pending: 'Mengakhiri sesi...',\n    pendingAria: 'Mengakhiri sesi',\n    success: 'Sesi berhasil diakhiri.',\n    failed: 'Sesi lokal sudah dihapus, tetapi request logout gagal.',\n    failedNote: 'Backend tidak mengonfirmasi logout, tetapi sesi lokal sudah dihapus.',\n    backToLogin: 'Kembali ke login',\n    openDashboard: 'Buka dashboard',\n  },\n  verify: {\n    title: 'Memverifikasi magic link.',\n    intro:\n      'Token akan dikonsumsi satu kali, sesi refresh cookie dibentuk di backend, lalu access token disimpan secara lokal untuk aplikasi.',\n    badge: 'VERIFY',\n    pending: 'Memverifikasi magic link...',\n    pendingAria: 'Memverifikasi magic link',\n    tokenMissing: 'Token magic link tidak ditemukan pada URL yang dibuka.',\n    invalidOrExpired: 'Magic link tidak valid atau sudah kedaluwarsa.',\n    successRedirect: 'Verifikasi berhasil. Mengarahkan ke dashboard...',\n    missingAccessToken:\n      'Verifikasi berhasil, tetapi access token tidak ditemukan di respons backend.',\n    requestNewLink: 'Minta link baru',\n    openDashboard: 'Buka dashboard',\n  },\n};\n\n/** Override per-bagian; field yang tidak diisi memakai default. */\nexport type EdsisAuthMessagesOverride = {\n  readonly [K in keyof EdsisAuthMessages]?: Partial<EdsisAuthMessages[K]>;\n};\n\nexport const EDSIS_AUTH_MESSAGES = new InjectionToken<EdsisAuthMessages>('EDSIS_AUTH_MESSAGES', {\n  factory: () => DEFAULT_EDSIS_AUTH_MESSAGES,\n});\n\nexport function mergeEdsisAuthMessages(override?: EdsisAuthMessagesOverride): EdsisAuthMessages {\n  if (!override) {\n    return DEFAULT_EDSIS_AUTH_MESSAGES;\n  }\n\n  return {\n    brand: { ...DEFAULT_EDSIS_AUTH_MESSAGES.brand, ...override.brand },\n    login: { ...DEFAULT_EDSIS_AUTH_MESSAGES.login, ...override.login },\n    google: { ...DEFAULT_EDSIS_AUTH_MESSAGES.google, ...override.google },\n    logout: { ...DEFAULT_EDSIS_AUTH_MESSAGES.logout, ...override.logout },\n    verify: { ...DEFAULT_EDSIS_AUTH_MESSAGES.verify, ...override.verify },\n  };\n}\n","import { Injectable, InjectionToken } from '@angular/core';\n\nexport type NativeGooglePlatform = 'ios' | 'android';\n\nexport interface NativeGoogleSignInResult {\n  readonly platform: NativeGooglePlatform;\n  readonly idToken: string;\n  readonly clientInstanceId: string;\n}\n\nexport interface EdsisNativeGoogleAuthAdapter {\n  signInWithGoogle(input: { readonly nonce: string }): Promise<NativeGoogleSignInResult>;\n  signOutFromGoogle(): Promise<void>;\n}\n\nexport const EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER = new InjectionToken<EdsisNativeGoogleAuthAdapter>(\n  'EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER',\n);\n\n@Injectable()\nexport class TauriNativeGoogleAuthAdapter implements EdsisNativeGoogleAuthAdapter {\n  async signInWithGoogle(input: { readonly nonce: string }): Promise<NativeGoogleSignInResult> {\n    const { invoke } = await import('@tauri-apps/api/core');\n    const response = await invoke<unknown>('plugin:edsis-google-auth|sign_in', {\n      nonce: input.nonce,\n    });\n\n    if (!isNativeGoogleSignInResult(response)) {\n      throw new Error('Native Google Sign-In returned an invalid response.');\n    }\n\n    return response;\n  }\n\n  async signOutFromGoogle(): Promise<void> {\n    const { invoke } = await import('@tauri-apps/api/core');\n    await invoke('plugin:edsis-google-auth|sign_out');\n  }\n}\n\nexport function isNativeGoogleSignInResult(value: unknown): value is NativeGoogleSignInResult {\n  if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n    return false;\n  }\n\n  const result = value as Record<string, unknown>;\n  return (\n    (result['platform'] === 'ios' || result['platform'] === 'android') &&\n    typeof result['idToken'] === 'string' &&\n    result['idToken'].trim().length > 0 &&\n    typeof result['clientInstanceId'] === 'string' &&\n    result['clientInstanceId'].trim().length > 0\n  );\n}\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport type {\n  AuthTokenResponse,\n  PersistentAuthSessionResponse,\n  PersistentAuthUser,\n} from '@edsis/sdk/auth';\nimport { RuntimeContextService, setNativeNotificationBadge } from '@edsis/angular/services/runtime';\nimport { firstValueFrom } from 'rxjs';\n\nimport { EDSIS_AUTH_CONFIG } from './auth.config';\nimport { EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER } from './native/native-google-auth.adapter';\n\nexport interface AuthUser extends PersistentAuthUser {\n  readonly role?: string;\n}\n\n/** Native desktop features are optional; browser consumers have no bridge. */\nexport async function setAuthNotificationBadge(unreadCount: number): Promise<void> {\n  await setNativeNotificationBadge(unreadCount);\n}\n\ninterface LegacyAuthTokenData {\n  access_token?: unknown;\n  user?: AuthUser;\n}\n\ninterface LegacyAuthTokenPayload extends Omit<AuthTokenResponse, 'data'> {\n  access_token?: unknown;\n  data?: LegacyAuthTokenData;\n  user?: AuthUser;\n}\n\ntype AuthTokenPayload = PersistentAuthSessionResponse | LegacyAuthTokenPayload;\n\n/**\n * Cookie-backed authentication state. The access token intentionally exists\n * only in this service instance; the long-lived refresh token is an HttpOnly\n * cookie owned by the server.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n  private readonly http = inject(HttpClient);\n  private readonly config = inject(EDSIS_AUTH_CONFIG);\n  private readonly router = inject(Router, { optional: true });\n  private readonly runtime = inject(RuntimeContextService, { optional: true });\n  private readonly nativeGoogleAdapter = inject(EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER, {\n    optional: true,\n  });\n  private readonly accessTokenState = signal('');\n  private readonly userState = signal<AuthUser | null>(null);\n  private refreshInFlight: Promise<boolean> | null = null;\n  private initialization: Promise<void> | null = null;\n\n  readonly accessToken = this.accessTokenState.asReadonly();\n  readonly user = this.userState.asReadonly();\n  readonly isAuthenticated = computed(() => Boolean(this.accessTokenState()));\n\n  get apiUrl(): string {\n    return this.config.apiUrl.replace(/\\/+$/u, '');\n  }\n\n  get sessionApiUrl(): string {\n    const nativeApiUrl = this.config.oauth.nativeGoogle?.apiUrl;\n    if (this.runtime?.isTabletShell() === true && nativeApiUrl) {\n      return nativeApiUrl.replace(/\\/+$/u, '');\n    }\n\n    const google = this.config.oauth.google;\n    return google?.mode === 'gateway' ? google.gateway.baseUrl : this.apiUrl;\n  }\n\n  /** Restores an existing cookie session. A missing/expired cookie is normal. */\n  initialize(): Promise<void> {\n    this.initialization ??= this.restoreSession();\n    return this.initialization;\n  }\n\n  private async restoreSession(): Promise<void> {\n    // Runtime selection must settle before choosing the cookie origin. Angular\n    // app initializers run concurrently, so auth cannot rely on provider order.\n    if (this.runtime) {\n      await this.runtime.initialize();\n    }\n    if (await this.refresh()) {\n      try {\n        await this.loadCurrentUser();\n      } catch (error: unknown) {\n        // The interceptor has already attempted one cookie refresh. If it\n        // ultimately produced 401, startup remains an anonymous state rather\n        // than a rejected app initializer.\n        if (error instanceof HttpErrorResponse && error.status === 401) {\n          this.clearSession();\n          return;\n        }\n\n        throw error;\n      }\n    }\n  }\n\n  /** One shared refresh operation for initializer and concurrent 401 retries. */\n  refresh(): Promise<boolean> {\n    if (this.refreshInFlight) {\n      return this.refreshInFlight;\n    }\n\n    this.refreshInFlight = firstValueFrom(\n      this.http.post<PersistentAuthSessionResponse>(`${this.sessionApiUrl}/v1/auth/refresh`, null, {\n        withCredentials: true,\n      }),\n    )\n      .then((response) => {\n        this.applyTokenResponse(response);\n        return Boolean(this.accessTokenState());\n      })\n      .catch((error: unknown) => {\n        this.clearSession();\n        // A 401 on startup is an expected anonymous state, not an application error.\n        if (!(error instanceof HttpErrorResponse) || error.status !== 401) {\n          throw error;\n        }\n        return false;\n      })\n      .finally(() => {\n        this.refreshInFlight = null;\n      });\n\n    return this.refreshInFlight;\n  }\n\n  async loadCurrentUser(): Promise<AuthUser | null> {\n    const token = this.accessTokenState();\n    if (!token) {\n      return null;\n    }\n\n    const response = await firstValueFrom(\n      this.http.get<PersistentAuthUser>(`${this.sessionApiUrl}/v1/auth/me`, {\n        withCredentials: true,\n        headers: { Authorization: `Bearer ${token}` },\n      }),\n    );\n    const user = response as AuthUser;\n    this.userState.set(user);\n    return user;\n  }\n\n  async logout(): Promise<void> {\n    try {\n      await firstValueFrom(\n        this.http.post(`${this.sessionApiUrl}/v1/auth/logout`, null, { withCredentials: true }),\n      );\n    } finally {\n      this.clearSession();\n      await this.clearNativeGoogleSession();\n    }\n  }\n\n  clearSession(): void {\n    this.accessTokenState.set('');\n    this.userState.set(null);\n  }\n\n  /** Allows existing OAuth exchanges to establish the same memory-only state. */\n  acceptTokenResponse(response: unknown): void {\n    if (response && typeof response === 'object') {\n      this.applyTokenResponse(response as AuthTokenPayload);\n    }\n  }\n\n  redirectToLogin(): void {\n    this.clearSession();\n    void this.router?.navigateByUrl(this.config.guestHomePath, { replaceUrl: true });\n  }\n\n  private applyTokenResponse(response: AuthTokenPayload): void {\n    const isPersistentResponse = 'accessToken' in response;\n    const token = isPersistentResponse\n      ? response.accessToken\n      : (response.access_token ?? response.data?.access_token);\n    this.accessTokenState.set(typeof token === 'string' ? token : '');\n    const user = isPersistentResponse ? response.user : (response.user ?? response.data?.user);\n    if (user) {\n      this.userState.set(user);\n    }\n  }\n\n  private async clearNativeGoogleSession(): Promise<void> {\n    if (\n      !this.nativeGoogleAdapter ||\n      this.runtime?.isTabletShell() !== true ||\n      !this.runtime.supports('google-native-sign-in')\n    ) {\n      return;\n    }\n\n    try {\n      await this.nativeGoogleAdapter.signOutFromGoogle();\n    } catch {\n      // Backend logout and memory cleanup remain authoritative. A native SDK\n      // sign-out failure must not restore or persist the application session.\n    }\n  }\n}\n","import {\n  HttpContextToken,\n  HttpErrorResponse,\n  type HttpHandlerFn,\n  type HttpInterceptorFn,\n  type HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { from, throwError } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\n\nimport { AuthService } from '../auth.service';\n\nexport const EDSIS_SKIP_AUTH = new HttpContextToken<boolean>(() => false);\nconst EDSIS_AUTH_RETRY = new HttpContextToken<boolean>(() => false);\nconst AUTH_ENDPOINTS = new Set(['/v1/auth/login', '/v1/auth/refresh', '/v1/auth/logout']);\n\nfunction apiPath(url: string, apiUrl: string): string | null {\n  // A consumer may use Angular's same-origin dev/prod proxy (`/api/...`) even\n  // when `apiUrl` names the upstream origin. Such relative URLs are API calls.\n  if (url.startsWith('/')) {\n    const path = url.split(/[?#]/, 1)[0] ?? url;\n    return path === '/api' || path.startsWith('/api/') ? path : null;\n  }\n\n  try {\n    const resolved = new URL(url);\n    const api = new URL(apiUrl);\n    if (resolved.origin !== api.origin) return null;\n\n    const apiBasePath = api.pathname.replace(/\\/+$/u, '') || '/';\n    if (\n      apiBasePath !== '/' &&\n      resolved.pathname !== apiBasePath &&\n      !resolved.pathname.startsWith(`${apiBasePath}/`)\n    ) {\n      return null;\n    }\n\n    return resolved.pathname;\n  } catch {\n    return null;\n  }\n}\n\nfunction isApiRequest(url: string, apiUrl: string): boolean {\n  return apiPath(url, apiUrl) !== null;\n}\n\nfunction authorize(\n  request: HttpRequest<unknown>,\n  token: string,\n  retry = false,\n): HttpRequest<unknown> {\n  return request.clone({\n    withCredentials: true,\n    context: retry ? request.context.set(EDSIS_AUTH_RETRY, true) : request.context,\n    setHeaders: token ? { Authorization: `Bearer ${token}` } : {},\n  });\n}\n\nexport const edsisAuthInterceptor: HttpInterceptorFn = (request, next) => {\n  const auth = inject(AuthService);\n  if (request.context.get(EDSIS_SKIP_AUTH) || !isApiRequest(request.url, auth.apiUrl)) {\n    return next(request);\n  }\n\n  const path = apiPath(request.url, auth.apiUrl);\n  const normalizedAuthPath = path?.startsWith('/api/') ? path.slice(4) : path;\n  const isAuthEndpoint =\n    AUTH_ENDPOINTS.has(normalizedAuthPath ?? '') || normalizedAuthPath?.startsWith('/v1/auth/');\n  const prepared = authorize(request, isAuthEndpoint ? '' : auth.accessToken());\n  if (isAuthEndpoint) {\n    return next(prepared);\n  }\n\n  return next(prepared).pipe(\n    catchError((error: unknown) => {\n      if (\n        !(error instanceof HttpErrorResponse) ||\n        error.status !== 401 ||\n        request.context.get(EDSIS_AUTH_RETRY)\n      ) {\n        return throwError(() => error);\n      }\n\n      return from(auth.refresh()).pipe(\n        switchMap((refreshed) => {\n          if (!refreshed) {\n            return throwError(() => error);\n          }\n          return next(authorize(request, auth.accessToken(), true));\n        }),\n        catchError(() => {\n          auth.redirectToLogin();\n          return throwError(() => error);\n        }),\n      );\n    }),\n  );\n};\n","import { HttpClient, HttpContext } from '@angular/common/http';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { firstValueFrom, timeout } from 'rxjs';\n\nimport { EDSIS_AUTH_CONFIG } from '../auth.config';\nimport { EDSIS_SKIP_AUTH } from '../interceptor';\n\nexport type AuthHealthStatus = 'idle' | 'checking' | 'healthy' | 'unhealthy';\n\n/**\n * Health-check backend auth untuk `AuthLoginPage` (internal, di-provide oleh\n * `provideEdsisAuth`). Sehat = HTTP 2xx dalam `timeoutMs`; body tidak diparse.\n * Tanpa polling — hanya on-load, pre-submit, dan Retry manual.\n */\n@Injectable()\nexport class AuthHealthService {\n  private readonly http = inject(HttpClient);\n  private readonly config = inject(EDSIS_AUTH_CONFIG);\n\n  private readonly _status = signal<AuthHealthStatus>('idle');\n  readonly status = this._status.asReadonly();\n  readonly isChecking = computed(() => this._status() === 'checking');\n  readonly isUnhealthy = computed(() => this._status() === 'unhealthy');\n\n  private inFlight = false;\n\n  /** true jika sehat ATAU health-check dimatikan. Tak pernah throw. */\n  async check(): Promise<boolean> {\n    const healthCheck = this.config.healthCheck;\n\n    if (!healthCheck.enabled) {\n      this._status.set('healthy');\n      return true;\n    }\n\n    if (this.inFlight) {\n      return this._status() === 'healthy';\n    }\n\n    this.inFlight = true;\n    this._status.set('checking');\n\n    try {\n      await firstValueFrom(\n        this.http\n          .get(healthCheck.url, {\n            observe: 'response',\n            context: new HttpContext().set(EDSIS_SKIP_AUTH, true),\n          })\n          .pipe(timeout(healthCheck.timeoutMs)),\n      );\n      this._status.set('healthy');\n      return true;\n    } catch {\n      this._status.set('unhealthy');\n      return false;\n    } finally {\n      this.inFlight = false;\n    }\n  }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, computed, inject } from '@angular/core';\nimport { RuntimeContextService, type EdsisRuntimePlatform } from '@edsis/angular/services/runtime';\nimport type {\n  AuthGoogleNativeChallengeData,\n  AuthGoogleNativeChallengeRequest,\n  AuthGoogleNativeChallengeResponse,\n  AuthGoogleNativeSignInRequest,\n  AuthTokenResponse,\n} from '@edsis/sdk/auth';\nimport { firstValueFrom } from 'rxjs';\n\nimport { EDSIS_AUTH_CONFIG } from '../auth.config';\nimport { AuthService } from '../auth.service';\nimport {\n  EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER,\n  type NativeGooglePlatform,\n  type NativeGoogleSignInResult,\n} from './native-google-auth.adapter';\n\n@Injectable()\nexport class NativeGoogleAuthService {\n  private readonly http = inject(HttpClient);\n  private readonly auth = inject(AuthService);\n  private readonly config = inject(EDSIS_AUTH_CONFIG);\n  private readonly runtime = inject(RuntimeContextService, { optional: true });\n  private readonly adapter = inject(EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER);\n\n  readonly requiresNativeGoogle = computed(() => this.runtime?.isTabletShell() === true);\n  readonly isAvailable = computed(() => {\n    const runtime = this.runtime;\n\n    return (\n      this.config.oauth.nativeGoogle !== null &&\n      runtime?.isTabletShell() === true &&\n      toNativePlatform(runtime.context().platform) !== null &&\n      runtime.supports('google-native-sign-in')\n    );\n  });\n\n  async signIn(): Promise<void> {\n    const nativeConfig = this.config.oauth.nativeGoogle;\n    const platform = toNativePlatform(this.runtime?.context().platform);\n\n    if (!nativeConfig || !platform || !this.isAvailable()) {\n      throw new Error('Native Google Sign-In is not available in this runtime.');\n    }\n\n    const challengeResponse = await firstValueFrom(\n      this.http.post<AuthGoogleNativeChallengeResponse>(\n        `${nativeConfig.apiUrl}/v1/auth/google/native/challenge`,\n        { platform, deviceType: 'tablet' } satisfies AuthGoogleNativeChallengeRequest,\n        { withCredentials: true },\n      ),\n    );\n    const challenge = parseChallenge(challengeResponse);\n    const response = await this.exchangeNativeToken(nativeConfig.apiUrl, platform, challenge);\n\n    this.auth.acceptTokenResponse(response);\n    if (!this.auth.isAuthenticated()) {\n      throw new Error('Native Google Sign-In response did not contain an access token.');\n    }\n\n    try {\n      await this.auth.loadCurrentUser();\n    } catch (error: unknown) {\n      this.auth.clearSession();\n      throw error;\n    }\n  }\n\n  private async exchangeNativeToken(\n    apiUrl: string,\n    platform: NativeGooglePlatform,\n    challenge: AuthGoogleNativeChallengeData,\n  ): Promise<AuthTokenResponse> {\n    let nativeResult: NativeGoogleSignInResult | null = await this.adapter.signInWithGoogle({\n      nonce: challenge.nonce,\n    });\n\n    if (nativeResult.platform !== platform) {\n      throw new Error('Native Google Sign-In platform does not match the runtime.');\n    }\n\n    const clientInstanceId = nativeResult.clientInstanceId;\n    let idToken = nativeResult.idToken;\n    nativeResult = null;\n\n    try {\n      return await firstValueFrom(\n        this.http.post<AuthTokenResponse>(\n          `${apiUrl}/v1/auth/google/native`,\n          {\n            platform,\n            idToken,\n            challengeId: challenge.challengeId,\n            clientInstanceId,\n            deviceType: 'tablet',\n          } satisfies AuthGoogleNativeSignInRequest,\n          { withCredentials: true },\n        ),\n      );\n    } finally {\n      // Strings cannot be zeroized in JavaScript, but dropping both local\n      // references immediately after the HTTPS exchange keeps the ID token\n      // outside application state and shortens its lifetime in the WebView.\n      idToken = '';\n    }\n  }\n}\n\nfunction toNativePlatform(platform: EdsisRuntimePlatform | undefined): NativeGooglePlatform | null {\n  return platform === 'ios' || platform === 'android' ? platform : null;\n}\n\nfunction parseChallenge(value: AuthGoogleNativeChallengeResponse): AuthGoogleNativeChallengeData {\n  if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n    throw new Error('Native Google challenge returned an invalid response.');\n  }\n\n  const challenge: unknown = value.data;\n  if (typeof challenge !== 'object' || challenge === null || Array.isArray(challenge)) {\n    throw new Error('Native Google challenge returned an invalid response.');\n  }\n\n  const challengeRecord = challenge as Record<string, unknown>;\n  const challengeId = challengeRecord['challengeId'];\n  const nonce = challengeRecord['nonce'];\n\n  if (\n    typeof challengeId !== 'string' ||\n    !challengeId.trim() ||\n    typeof nonce !== 'string' ||\n    !nonce.trim()\n  ) {\n    throw new Error('Native Google challenge returned an invalid response.');\n  }\n\n  return { challengeId, nonce };\n}\n","import { DOCUMENT } from '@angular/common';\nimport { provideHttpClient, withFetch, withInterceptors } from '@angular/common/http';\nimport {\n  inject,\n  makeEnvironmentProviders,\n  provideAppInitializer,\n  type EnvironmentProviders,\n} from '@angular/core';\nimport { provideApiConfiguration } from '@edsis/sdk/shared';\n\nimport { EDSIS_AUTH_CONFIG, resolveEdsisAuthConfig, type EdsisAuthConfig } from './auth.config';\nimport { EDSIS_AUTH_MESSAGES, mergeEdsisAuthMessages } from './auth-messages';\nimport { AuthService } from './auth.service';\nimport { AuthHealthService } from './health';\nimport { edsisAuthInterceptor } from './interceptor';\nimport {\n  EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER,\n  NativeGoogleAuthService,\n  TauriNativeGoogleAuthAdapter,\n} from './native';\n\nexport function provideEdsisAuth(config: EdsisAuthConfig): EnvironmentProviders {\n  const resolvedConfig = resolveEdsisAuthConfig(config);\n\n  return makeEnvironmentProviders([\n    provideApiConfiguration(resolvedConfig.apiUrl),\n    provideHttpClient(\n      withFetch(),\n      withInterceptors([edsisAuthInterceptor, ...(config.httpInterceptors ?? [])]),\n    ),\n    // Completes before initial navigation, therefore guards see restored state.\n    provideAppInitializer(() => inject(AuthService).initialize()),\n    {\n      provide: EDSIS_AUTH_CONFIG,\n      useValue: resolvedConfig,\n    },\n    {\n      provide: EDSIS_AUTH_MESSAGES,\n      useValue: mergeEdsisAuthMessages(config.messages),\n    },\n    AuthHealthService,\n    NativeGoogleAuthService,\n    TauriNativeGoogleAuthAdapter,\n    {\n      provide: EDSIS_NATIVE_GOOGLE_AUTH_ADAPTER,\n      useExisting: TauriNativeGoogleAuthAdapter,\n    },\n  ]);\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\n\nimport { EDSIS_AUTH_CONFIG } from '../auth.config';\nimport { AuthService } from '../auth.service';\n\nexport const authenticatedGuard: CanActivateFn = async () => {\n  const router = inject(Router);\n  const authConfig = inject(EDSIS_AUTH_CONFIG);\n  const auth = inject(AuthService);\n\n  if (auth.isAuthenticated()) {\n    return true;\n  }\n\n  return router.parseUrl(authConfig.guestHomePath);\n};\n\nexport const homeRedirectGuard: CanActivateFn = async () => {\n  const router = inject(Router);\n  const authConfig = inject(EDSIS_AUTH_CONFIG);\n  const auth = inject(AuthService);\n\n  return router.parseUrl(\n    auth.isAuthenticated() ? authConfig.authenticatedHomePath : authConfig.guestHomePath,\n  );\n};\n\nexport const guestOnlyGuard: CanActivateFn = async () => {\n  const router = inject(Router);\n  const authConfig = inject(EDSIS_AUTH_CONFIG);\n  const auth = inject(AuthService);\n\n  if (!auth.isAuthenticated()) {\n    return true;\n  }\n\n  return router.parseUrl(authConfig.authenticatedHomePath);\n};\n","export const GOOGLE_GATEWAY_SESSION_STORAGE_KEY = 'auth-google-gateway-session';\nexport const GOOGLE_GATEWAY_SESSION_VERSION = 1 as const;\n\nconst PKCE_RANDOM_BYTE_LENGTH = 32;\nconst PKCE_VERIFIER_PATTERN = /^[A-Za-z0-9._~-]{43,128}$/u;\n\nexport interface GoogleGatewaySession {\n  readonly version: typeof GOOGLE_GATEWAY_SESSION_VERSION;\n  readonly mfeId: string;\n  readonly returnUrl: string;\n  readonly codeVerifier: string;\n  readonly expiresAt: number;\n}\n\nexport interface GoogleGatewaySessionExpectation {\n  readonly mfeId: string;\n  readonly returnUrl: string;\n  readonly now?: number;\n}\n\n/** RFC 7636 verifier with 256 bits of entropy and no persisted token material. */\nexport function createGooglePkceVerifier(windowRef: Window): string {\n  const randomBytes = windowRef.crypto.getRandomValues(new Uint8Array(PKCE_RANDOM_BYTE_LENGTH));\n  return encodeBase64Url(windowRef, randomBytes);\n}\n\n/** RFC 7636 S256 challenge for the verifier retained in the one-time session. */\nexport async function createGooglePkceChallenge(\n  windowRef: Window,\n  codeVerifier: string,\n): Promise<string> {\n  if (!PKCE_VERIFIER_PATTERN.test(codeVerifier)) {\n    throw new Error('Google Auth Gateway PKCE verifier must contain 43-128 RFC 7636 characters.');\n  }\n\n  const digest = await windowRef.crypto.subtle.digest(\n    'SHA-256',\n    new TextEncoder().encode(codeVerifier),\n  );\n\n  return encodeBase64Url(windowRef, new Uint8Array(digest));\n}\n\n/** Stores only the verifier and short-lived correlation metadata. */\nexport function storeGoogleGatewaySession(\n  documentRef: Document,\n  session: GoogleGatewaySession,\n): void {\n  try {\n    const storage = documentRef.defaultView?.sessionStorage;\n\n    if (!storage) {\n      throw new Error('sessionStorage is unavailable.');\n    }\n\n    storage.setItem(GOOGLE_GATEWAY_SESSION_STORAGE_KEY, JSON.stringify(session));\n  } catch {\n    throw new Error('Google Auth Gateway cannot retain its one-time PKCE session.');\n  }\n}\n\nexport function clearGoogleGatewaySession(documentRef: Document): void {\n  try {\n    documentRef.defaultView?.sessionStorage?.removeItem(GOOGLE_GATEWAY_SESSION_STORAGE_KEY);\n  } catch {\n    // Storage-disabled browsers are treated as having no resumable PKCE session.\n  }\n}\n\n/**\n * Consumes the PKCE session exactly once. Malformed, expired, or cross-MFE\n * records fail closed after removal so they cannot be replayed.\n */\nexport function consumeGoogleGatewaySession(\n  documentRef: Document,\n  expected: GoogleGatewaySessionExpectation,\n): GoogleGatewaySession | null {\n  let storage: Storage | null = null;\n  let serialized: string | null = null;\n\n  try {\n    storage = documentRef.defaultView?.sessionStorage ?? null;\n    serialized = storage?.getItem(GOOGLE_GATEWAY_SESSION_STORAGE_KEY) ?? null;\n  } catch {\n    return null;\n  } finally {\n    try {\n      storage?.removeItem(GOOGLE_GATEWAY_SESSION_STORAGE_KEY);\n    } catch {\n      // Best-effort removal; the callback still fails closed below.\n    }\n  }\n\n  if (!serialized) {\n    return null;\n  }\n\n  try {\n    const value: unknown = JSON.parse(serialized);\n\n    if (!isGoogleGatewaySession(value)) {\n      return null;\n    }\n\n    const now = expected.now ?? Date.now();\n    if (\n      value.mfeId !== expected.mfeId ||\n      value.returnUrl !== expected.returnUrl ||\n      value.expiresAt <= now\n    ) {\n      return null;\n    }\n\n    return value;\n  } catch {\n    return null;\n  }\n}\n\nfunction isGoogleGatewaySession(value: unknown): value is GoogleGatewaySession {\n  if (!value || typeof value !== 'object') {\n    return false;\n  }\n\n  const record = value as Record<string, unknown>;\n\n  return (\n    record['version'] === GOOGLE_GATEWAY_SESSION_VERSION &&\n    typeof record['mfeId'] === 'string' &&\n    typeof record['returnUrl'] === 'string' &&\n    typeof record['codeVerifier'] === 'string' &&\n    PKCE_VERIFIER_PATTERN.test(record['codeVerifier']) &&\n    typeof record['expiresAt'] === 'number' &&\n    Number.isSafeInteger(record['expiresAt'])\n  );\n}\n\nfunction encodeBase64Url(windowRef: Window, bytes: Uint8Array): string {\n  const binary = Array.from(bytes, (byte) => String.fromCharCode(byte)).join('');\n\n  return windowRef.btoa(binary).replace(/\\+/gu, '-').replace(/\\//gu, '_').replace(/=+$/gu, '');\n}\n","export const GOOGLE_OAUTH_STATE_STORAGE_KEY = 'auth-google-state';\nexport const GOOGLE_OAUTH_AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/v2/auth';\nconst GOOGLE_OAUTH_SCOPE = 'openid email profile';\nconst GOOGLE_OAUTH_STATE_BYTE_LENGTH = 16;\n\nexport interface GoogleAuthorizeUrlOptions {\n  clientId: string;\n  redirectUri: string;\n  state: string;\n}\n\n/** Nilai `state` acak berbasis crypto (anti-CSRF untuk round-trip OAuth). */\nexport function createGoogleOauthState(windowRef: Window): string {\n  const randomBytes = windowRef.crypto.getRandomValues(\n    new Uint8Array(GOOGLE_OAUTH_STATE_BYTE_LENGTH),\n  );\n\n  return Array.from(randomBytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\nexport function buildGoogleAuthorizeUrl(options: GoogleAuthorizeUrlOptions): string {\n  const authorizeUrl = new URL(GOOGLE_OAUTH_AUTHORIZE_URL);\n\n  authorizeUrl.searchParams.set('client_id', options.clientId);\n  authorizeUrl.searchParams.set('redirect_uri', options.redirectUri);\n  authorizeUrl.searchParams.set('response_type', 'code');\n  authorizeUrl.searchParams.set('scope', GOOGLE_OAUTH_SCOPE);\n  authorizeUrl.searchParams.set('state', options.state);\n\n  return authorizeUrl.toString();\n}\n\nexport function storeGoogleOauthState(documentRef: Document, state: string): void {\n  documentRef.defaultView?.sessionStorage?.setItem(GOOGLE_OAUTH_STATE_STORAGE_KEY, state);\n}\n\n/**\n * Baca lalu hapus state dari sessionStorage. State sekali pakai: dikonsumsi di\n * semua cabang callback agar tidak bocor ke percobaan login berikutnya.\n */\nexport function consumeGoogleOauthState(documentRef: Document): string {\n  const sessionStorageRef = documentRef.defaultView?.sessionStorage;\n  const state = sessionStorageRef?.getItem(GOOGLE_OAUTH_STATE_STORAGE_KEY)?.trim() ?? '';\n\n  sessionStorageRef?.removeItem(GOOGLE_OAUTH_STATE_STORAGE_KEY);\n\n  return state;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { HttpClient, HttpContext } from '@angular/common/http';\nimport { Service, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { EDSIS_AUTH_CONFIG, type ResolvedEdsisAuthGoogleGatewayOauth } from '../auth.config';\nimport { EDSIS_SKIP_AUTH } from '../interceptor';\nimport {\n  clearGoogleGatewaySession,\n  consumeGoogleGatewaySession,\n  createGooglePkceChallenge,\n  createGooglePkceVerifier,\n  storeGoogleGatewaySession,\n  type GoogleGatewaySession,\n} from './google-gateway.utils';\nimport { GOOGLE_OAUTH_AUTHORIZE_URL } from './google-oauth.utils';\n\ninterface GoogleGatewayStartData {\n  readonly authorizationUrl: string;\n  readonly expiresInSeconds: number;\n}\n\nconst MAX_GATEWAY_SESSION_LIFETIME_SECONDS = 600;\n\n/** HTTP client for the central Google Auth Gateway mode. */\n@Service()\nexport class GoogleGatewayAuthService {\n  private readonly config = inject(EDSIS_AUTH_CONFIG);\n  private readonly documentRef = inject<Document>(DOCUMENT);\n  private readonly http = inject(HttpClient);\n\n  async start(): Promise<string> {\n    const gateway = this.requireGatewayConfig();\n    const windowRef = this.requireWindow();\n\n    clearGoogleGatewaySession(this.documentRef);\n\n    const codeVerifier = createGooglePkceVerifier(windowRef);\n    const codeChallenge = await createGooglePkceChallenge(windowRef, codeVerifier);\n    const response = await firstValueFrom(\n      this.http.post<unknown>(\n        gateway.gateway.startUrl,\n        {\n          mfeId: gateway.mfeId,\n          returnUrl: gateway.returnUrl,\n          codeChallenge,\n          codeChallengeMethod: 'S256',\n        },\n        { context: skipAuthContext() },\n      ),\n    );\n    const start = parseStartResponse(response);\n\n    storeGoogleGatewaySession(this.documentRef, {\n      version: 1,\n      mfeId: gateway.mfeId,\n      returnUrl: gateway.returnUrl,\n      codeVerifier,\n      expiresAt: Date.now() + start.expiresInSeconds * 1000,\n    });\n\n    return start.authorizationUrl;\n  }\n\n  consumeSession(): GoogleGatewaySession | null {\n    const gateway = this.requireGatewayConfig();\n\n    return consumeGoogleGatewaySession(this.documentRef, {\n      mfeId: gateway.mfeId,\n      returnUrl: gateway.returnUrl,\n    });\n  }\n\n  exchangeHandoff(handoffCode: string, session: GoogleGatewaySession): Promise<unknown> {\n    const gateway = this.requireGatewayConfig();\n    const normalizedHandoffCode = handoffCode.trim();\n\n    if (!normalizedHandoffCode) {\n      throw new Error('Google Auth Gateway callback is missing its handoff code.');\n    }\n\n    if (\n      session.mfeId !== gateway.mfeId ||\n      session.returnUrl !== gateway.returnUrl ||\n      session.expiresAt <= Date.now()\n    ) {\n      throw new Error('Google Auth Gateway session is invalid or expired for this MFE.');\n    }\n\n    return firstValueFrom(\n      this.http.post<unknown>(\n        gateway.gateway.handoffUrl,\n        {\n          mfeId: gateway.mfeId,\n          returnUrl: gateway.returnUrl,\n          handoffCode: normalizedHandoffCode,\n          codeVerifier: session.codeVerifier,\n        },\n        {\n          context: skipAuthContext(),\n          withCredentials: true,\n        },\n      ),\n    );\n  }\n\n  private requireGatewayConfig(): ResolvedEdsisAuthGoogleGatewayOauth {\n    const google = this.config.oauth.google;\n\n    if (google?.mode !== 'gateway') {\n      throw new Error('Google Auth Gateway mode is not configured.');\n    }\n\n    return google;\n  }\n\n  private requireWindow(): Window {\n    const windowRef = this.documentRef.defaultView;\n\n    if (!windowRef) {\n      throw new Error('Google Auth Gateway requires a browser window.');\n    }\n\n    return windowRef;\n  }\n}\n\nfunction parseStartResponse(response: unknown): GoogleGatewayStartData {\n  if (!response || typeof response !== 'object') {\n    throw new Error('Google Auth Gateway returned an invalid start response.');\n  }\n\n  const envelope = response as Record<string, unknown>;\n  const data = envelope['data'];\n\n  if (!data || typeof data !== 'object') {\n    throw new Error('Google Auth Gateway start response is missing data.');\n  }\n\n  const record = data as Record<string, unknown>;\n  const authorizationUrl = record['authorizationUrl'];\n  const expiresInSeconds = record['expiresInSeconds'];\n\n  if (typeof authorizationUrl !== 'string' || !isTrustedGoogleAuthorizationUrl(authorizationUrl)) {\n    throw new Error('Google Auth Gateway returned an invalid authorization URL.');\n  }\n\n  if (\n    typeof expiresInSeconds !== 'number' ||\n    !Number.isSafeInteger(expiresInSeconds) ||\n    expiresInSeconds <= 0 ||\n    expiresInSeconds > MAX_GATEWAY_SESSION_LIFETIME_SECONDS\n  ) {\n    throw new Error('Google Auth Gateway returned an invalid session lifetime.');\n  }\n\n  return { authorizationUrl, expiresInSeconds };\n}\n\nfunction isTrustedGoogleAuthorizationUrl(value: string): boolean {\n  try {\n    const authorizationUrl = new URL(value);\n    const trustedUrl = new URL(GOOGLE_OAUTH_AUTHORIZE_URL);\n\n    return (\n      authorizationUrl.origin === trustedUrl.origin &&\n      authorizationUrl.pathname === trustedUrl.pathname &&\n      !authorizationUrl.username &&\n      !authorizationUrl.password\n    );\n  } catch {\n    return false;\n  }\n}\n\nfunction skipAuthContext(): HttpContext {\n  return new HttpContext().set(EDSIS_SKIP_AUTH, true);\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport {\n  NativeHostService,\n  RuntimeContextService,\n  type EdsisWindowControlAction,\n} from '@edsis/angular/services/runtime';\nimport {\n  LayoutComponent,\n  DesktopAppBarComponent,\n  LayoutFluidComponent,\n  LayoutService,\n  type DesktopAppBarPlatform,\n} from '@edsis/theme/layout';\n\n@Component({\n  selector: 'edsis-auth-shell-page',\n  imports: [RouterOutlet, LayoutComponent, DesktopAppBarComponent, LayoutFluidComponent],\n  host: {\n    class: 'contents',\n  },\n  template: `\n    @if (isDesktopAppearance()) {\n      <DesktopAppBar\n        [platform]=\"desktopAppBarPlatform()\"\n        (windowControlRequested)=\"onDesktopWindowControlRequested($event)\"\n        (windowDragRequested)=\"onDesktopWindowDragRequested()\"\n      />\n    }\n\n    <Layout surface=\"grid\" width=\"fluid\">\n      <LayoutFluid>\n        <div class=\"w-full max-w-xl\">\n          <router-outlet />\n        </div>\n      </LayoutFluid>\n    </Layout>\n  `,\n})\nexport class AuthShellPage {\n  private readonly runtimeContext = inject(RuntimeContextService, { optional: true });\n  private readonly nativeHost = inject(NativeHostService, { optional: true });\n\n  protected readonly layout = inject(LayoutService);\n  protected readonly isDesktopAppearance = computed(() => this.layout.appearance() === 'desktop');\n  protected readonly desktopAppBarPlatform = computed<DesktopAppBarPlatform | null | undefined>(\n    () => {\n      const context = this.runtimeContext?.context();\n      if (!context || context.host === 'browser') {\n        return undefined;\n      }\n\n      return context.deviceType === 'macos' || context.deviceType === 'windows'\n        ? context.deviceType\n        : null;\n    },\n  );\n\n  protected onDesktopWindowControlRequested(action: EdsisWindowControlAction): void {\n    const nativeHost = this.nativeHost;\n    if (!nativeHost?.supports('window-controls')) {\n      return;\n    }\n\n    void nativeHost.emitWindowControl(action).catch((error: unknown) => {\n      console.error(`Failed to run window control: ${action}`, error);\n    });\n  }\n\n  protected onDesktopWindowDragRequested(): void {\n    const nativeHost = this.nativeHost;\n    if (!nativeHost?.supports('window-controls')) {\n      return;\n    }\n\n    void nativeHost.startDragging().catch((error: unknown) => {\n      console.error('Failed to start window dragging', error);\n    });\n  }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\ninterface MessageCarrier {\n  message?: unknown;\n}\n\nexport function extractMagicToken(\n  queryToken: string | null,\n  fragment: string | null,\n): string | null {\n  const tokenFromQuery = normalizeText(queryToken);\n\n  if (tokenFromQuery) {\n    return tokenFromQuery;\n  }\n\n  const normalizedFragment = normalizeText(\n    fragment?.startsWith('#') ? fragment.slice(1) : fragment,\n  );\n\n  if (!normalizedFragment) {\n    return null;\n  }\n\n  const fragmentParams = new URLSearchParams(normalizedFragment);\n  const tokenFromFragment =\n    normalizeText(fragmentParams.get('token')) ??\n    normalizeText(fragmentParams.get('magic_token')) ??\n    normalizeText(fragmentParams.get('value'));\n\n  if (tokenFromFragment) {\n    return tokenFromFragment;\n  }\n\n  return normalizedFragment.includes('=') ? null : normalizedFragment;\n}\n\nexport function getResponseMessage(response: unknown, fallback: string): string {\n  if (!hasMessage(response)) {\n    return fallback;\n  }\n\n  return normalizeText(response.message) ?? fallback;\n}\n\n/**\n * Pesan error dari body respons backend saja. Berbeda dengan `getErrorMessage`,\n * `HttpErrorResponse.message` sintetis (\"Http failure response for ...\") tidak\n * pernah dipakai, sehingga tanpa pesan backend selalu jatuh ke fallback ramah.\n */\nexport function getBackendErrorMessage(error: unknown, fallback: string): string {\n  if (!(error instanceof HttpErrorResponse)) {\n    return fallback;\n  }\n\n  const errorBody = error.error;\n\n  if (typeof errorBody === 'string') {\n    return normalizeText(errorBody) ?? fallback;\n  }\n\n  if (hasMessage(errorBody)) {\n    return normalizeText(errorBody.message) ?? fallback;\n  }\n\n  return fallback;\n}\n\nexport function getErrorMessage(error: unknown, fallback: string): string {\n  if (error instanceof HttpErrorResponse) {\n    const errorBody = error.error;\n\n    if (typeof errorBody === 'string') {\n      return normalizeText(errorBody) ?? fallback;\n    }\n\n    if (hasMessage(errorBody)) {\n      return normalizeText(errorBody.message) ?? fallback;\n    }\n\n    return normalizeText(error.message) ?? fallback;\n  }\n\n  if (error instanceof Error) {\n    return normalizeText(error.message) ?? fallback;\n  }\n\n  return fallback;\n}\n\nfunction hasMessage(value: unknown): value is MessageCarrier {\n  return typeof value === 'object' && value !== null && 'message' in value;\n}\n\nfunction normalizeText(value: unknown): string | null {\n  if (typeof value !== 'string') {\n    return null;\n  }\n\n  const normalizedValue = value.trim();\n  return normalizedValue.length > 0 ? normalizedValue : null;\n}\n","import { DOCUMENT, Location } from '@angular/common';\nimport {\n  Component,\n  DestroyRef,\n  ElementRef,\n  Injector,\n  afterNextRender,\n  effect,\n  inject,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { AuthSessionService } from '@edsis/sdk/auth';\nimport { AlertComponent, AlertDescriptionComponent } from '@edsis/component/alert';\nimport { AspectRatioComponent } from '@edsis/component/aspect-ratio';\nimport { ButtonComponent } from '@edsis/component/button';\nimport {\n  CardActionComponent,\n  CardComponent,\n  CardContentComponent,\n  CardDescriptionComponent,\n  CardFooterComponent,\n  CardHeaderComponent,\n  CardTitleComponent,\n} from '@edsis/component/card';\nimport { SpinnerComponent } from '@edsis/component/spinner';\n\nimport { EDSIS_AUTH_CONFIG, GOOGLE_OAUTH_CALLBACK_ROUTE_PATH } from '../../auth.config';\nimport { EDSIS_AUTH_MESSAGES } from '../../auth-messages';\nimport { AuthService } from '../../auth.service';\nimport {\n  clearGoogleGatewaySession,\n  consumeGoogleOauthState,\n  GoogleGatewayAuthService,\n  type GoogleGatewaySession,\n} from '../../oauth';\nimport { getBackendErrorMessage, getResponseMessage } from '../auth-page.utils';\n\n@Component({\n  selector: 'AuthGoogleCallbackPage',\n  imports: [\n    RouterLink,\n    AlertComponent,\n    AlertDescriptionComponent,\n    AspectRatioComponent,\n    ButtonComponent,\n    CardActionComponent,\n    CardComponent,\n    CardContentComponent,\n    CardDescriptionComponent,\n    CardFooterComponent,\n    CardHeaderComponent,\n    CardTitleComponent,\n    SpinnerComponent,\n  ],\n  host: {\n    class: 'block',\n  },\n  template: `\n    <Card\n      class=\"w-full overflow-hidden rounded-none border-border/80 bg-card/95 shadow-2xl backdrop-blur-sm\"\n    >\n      <CardHeader\n        class=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-x-4 gap-y-3 border-b border-border/60 bg-muted/15 pb-4 sm:pb-5\"\n      >\n        <div class=\"w-16 shrink-0 sm:w-20\">\n          <AspectRatio [ratio]=\"3 / 2\" class=\"overflow-hidden rounded-none bg-primary\">\n            <div\n              class=\"flex h-full w-full items-center justify-center px-1 text-[1.25rem] leading-none tracking-[-0.08em] text-primary-foreground sm:text-[1.55rem]\"\n              style=\"font-family: 'Arial Black', Arial, sans-serif;\"\n            >\n              {{ messages.brand.mark }}\n            </div>\n          </AspectRatio>\n        </div>\n        <div class=\"min-w-0 space-y-0.5 pt-0.5 sm:pt-1\">\n          <CardTitle class=\"text-xl leading-tight sm:text-2xl\">{{\n            messages.google.title\n          }}</CardTitle>\n          <p CardDescription class=\"max-w-xl leading-6\">\n            {{ messages.google.intro }}\n          </p>\n        </div>\n        <CardAction\n          class=\"col-start-3 row-span-1 mt-0! pt-0.5 text-xs font-medium uppercase tracking-[0.24em] text-muted-foreground sm:pt-1 sm:text-sm\"\n        >\n          {{ messages.google.badge }}\n        </CardAction>\n      </CardHeader>\n\n      <CardContent class=\"space-y-4 pt-6 sm:pt-7\">\n        <Alert\n          [variant]=\"state() === 'error' ? 'destructive' : 'default'\"\n          class=\"bg-background/70 shadow-sm\"\n        >\n          @if (state() === 'pending') {\n            <Spinner class=\"mt-0.5 size-4\" [aria-label]=\"messages.google.exchangeInProgressAria\" />\n          }\n\n          <AlertDescription>\n            {{ message() }}\n          </AlertDescription>\n        </Alert>\n      </CardContent>\n\n      @if (state() !== 'pending') {\n        <CardFooter class=\"flex flex-wrap gap-3 border-t border-border/60 bg-muted/10 pt-4 sm:pt-5\">\n          @if (state() === 'error') {\n            <a #retryLink Button [routerLink]=\"loginPath\" variant=\"default\">\n              {{ messages.google.googleRetry }}\n            </a>\n          }\n          <a\n            Button\n            [routerLink]=\"authenticatedHomePath\"\n            [variant]=\"state() === 'error' ? 'outline' : 'default'\"\n          >\n            {{ messages.google.openDashboard }}\n          </a>\n        </CardFooter>\n      }\n    </Card>\n  `,\n})\nexport class AuthGoogleCallbackPage {\n  private readonly documentRef = inject<Document>(DOCUMENT);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly injector = inject(Injector);\n  private readonly route = inject(ActivatedRoute);\n  private readonly router = inject(Router);\n  private readonly location = inject(Location);\n  private readonly authSessionService = inject(AuthSessionService);\n  private readonly authService = inject(AuthService);\n  private readonly authConfig = inject(EDSIS_AUTH_CONFIG);\n  private readonly googleGateway = inject(GoogleGatewayAuthService);\n  protected readonly messages = inject(EDSIS_AUTH_MESSAGES);\n\n  protected readonly loginPath = this.authConfig.loginPath;\n  protected readonly authenticatedHomePath = this.authConfig.authenticatedHomePath;\n  protected readonly state = signal<'pending' | 'success' | 'error'>('pending');\n  protected readonly message = signal(this.messages.google.googleExchangeInProgress);\n  // `a[Button]` adalah komponen, jadi tanpa `read` query template-ref ini\n  // mengembalikan instance ButtonComponent — bukan elemen anchor-nya.\n  private readonly retryLink = viewChild('retryLink', { read: ElementRef });\n\n  constructor() {\n    effect(() => {\n      if (this.state() !== 'error') {\n        return;\n      }\n\n      afterNextRender(() => this.retryLink()?.nativeElement.focus(), { injector: this.injector });\n    });\n\n    this.handleCallback();\n  }\n\n  private handleCallback(): void {\n    const queryParams = this.route.snapshot.queryParamMap;\n    const oauthError = queryParams.get('error')?.trim() ?? '';\n    const code = queryParams.get('code')?.trim() ?? '';\n    const returnedState = queryParams.get('state')?.trim() ?? '';\n    const handoffCode = queryParams.get('handoffCode')?.trim() ?? '';\n    const googleOauth = this.authConfig.oauth.google;\n\n    this.clearCallbackParamsFromAddressBar();\n\n    if (!googleOauth) {\n      consumeGoogleOauthState(this.documentRef);\n      clearGoogleGatewaySession(this.documentRef);\n      this.fail(this.messages.google.googleCallbackError);\n      return;\n    }\n\n    if (googleOauth.mode === 'gateway') {\n      consumeGoogleOauthState(this.documentRef);\n      // Konsumsi verifier sebelum bercabang; callback error dan replay tidak\n      // boleh menyisakan sesi PKCE yang dapat dipakai kembali.\n      const gatewaySession = this.googleGateway.consumeSession();\n\n      if (oauthError) {\n        this.fail(this.callbackErrorMessage(oauthError));\n        return;\n      }\n\n      if (!gatewaySession) {\n        this.fail(this.messages.google.gatewaySessionMissing);\n        return;\n      }\n\n      if (!handoffCode) {\n        this.fail(this.messages.google.googleCallbackError);\n        return;\n      }\n\n      void this.exchangeGatewayHandoff(handoffCode, gatewaySession);\n      return;\n    }\n\n    clearGoogleGatewaySession(this.documentRef);\n    // Direct-mode state dikonsumsi (dibaca + dihapus) sebelum bercabang supaya\n    // bersih di semua cabang, termasuk error dari Google.\n    const storedState = consumeGoogleOauthState(this.documentRef);\n\n    if (oauthError) {\n      this.fail(this.callbackErrorMessage(oauthError));\n      return;\n    }\n\n    if (!returnedState || !storedState || returnedState !== storedState) {\n      this.fail(this.messages.google.googleStateMismatch);\n      return;\n    }\n\n    if (!code) {\n      this.fail(this.messages.google.googleCallbackError);\n      return;\n    }\n\n    this.exchangeDirectCode(code);\n  }\n\n  private clearCallbackParamsFromAddressBar(): void {\n    this.location.replaceState(`/${GOOGLE_OAUTH_CALLBACK_ROUTE_PATH}`);\n  }\n\n  private exchangeDirectCode(code: string): void {\n    const googleOauth = this.authConfig.oauth.google;\n\n    if (!googleOauth || googleOauth.mode !== 'direct') {\n      this.fail(this.messages.google.googleCallbackError);\n      return;\n    }\n\n    this.state.set('pending');\n    this.message.set(this.messages.google.googleExchangeInProgress);\n\n    // Exchange lewat method SDK hasil generate (konsisten dengan\n    // verifyMagicLink/refreshAuthToken); path /v1/auth/google membuat\n    // edsisAuthInterceptor otomatis memasang cookie credentials.\n    this.authSessionService\n      .exchangeGoogleCode({\n        body: { code, redirectUri: googleOauth.redirectUri },\n      })\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe({\n        next: (response) => this.complete(response),\n        error: (error: unknown) => {\n          this.fail(getBackendErrorMessage(error, this.messages.google.googleCallbackError));\n        },\n      });\n  }\n\n  private async exchangeGatewayHandoff(\n    handoffCode: string,\n    session: GoogleGatewaySession,\n  ): Promise<void> {\n    this.state.set('pending');\n    this.message.set(this.messages.google.gatewayHandoffInProgress);\n\n    try {\n      const response = await this.googleGateway.exchangeHandoff(handoffCode, session);\n      this.complete(response);\n    } catch (error: unknown) {\n      this.fail(getBackendErrorMessage(error, this.messages.google.googleCallbackError));\n    }\n  }\n\n  private complete(response: unknown): void {\n    this.authService.acceptTokenResponse(response);\n\n    if (!this.authService.isAuthenticated()) {\n      this.fail(this.messages.google.missingAccessToken);\n      return;\n    }\n\n    this.state.set('success');\n    this.message.set(getResponseMessage(response, this.messages.google.successRedirect));\n    void this.router.navigateByUrl(this.authenticatedHomePath, { replaceUrl: true });\n  }\n\n  private callbackErrorMessage(error: string): string {\n    return error === 'access_denied'\n      ? this.messages.google.googleAccessDenied\n      : this.messages.google.googleCallbackError;\n  }\n\n  private fail(message: string): void {\n    this.state.set('error');\n    this.message.set(message);\n  }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n  Component,\n  DestroyRef,\n  ElementRef,\n  Injector,\n  afterNextRender,\n  computed,\n  effect,\n  inject,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { AuthMagicLinkService } from '@edsis/sdk/auth';\nimport { AspectRatioComponent } from '@edsis/component/aspect-ratio';\nimport { ButtonComponent } from '@edsis/component/button';\nimport {\n  CardActionComponent,\n  CardComponent,\n  CardContentComponent,\n  CardDescriptionComponent,\n  CardHeaderComponent,\n  CardTitleComponent,\n} from '@edsis/component/card';\nimport {\n  InputGroupAddonComponent,\n  InputGroupButtonComponent,\n  InputGroupComponent,\n  InputGroupInputComponent,\n} from '@edsis/component/input-group';\nimport { LabelComponent } from '@edsis/component/label';\nimport { SeparatorComponent } from '@edsis/component/separator';\nimport { finalize, startWith } from 'rxjs';\n\nimport { EDSIS_AUTH_CONFIG } from '../../auth.config';\nimport { EDSIS_AUTH_MESSAGES } from '../../auth-messages';\nimport { AuthHealthService } from '../../health';\nimport { NativeGoogleAuthService } from '../../native';\nimport {\n  buildGoogleAuthorizeUrl,\n  createGoogleOauthState,\n  GoogleGatewayAuthService,\n  storeGoogleOauthState,\n} from '../../oauth';\nimport { getBackendErrorMessage, getErrorMessage, getResponseMessage } from '../auth-page.utils';\n\n@Component({\n  selector: 'edsis-auth-login-page',\n  imports: [\n    ReactiveFormsModule,\n    AspectRatioComponent,\n    ButtonComponent,\n    CardActionComponent,\n    CardComponent,\n    CardContentComponent,\n    CardDescriptionComponent,\n    CardHeaderComponent,\n    CardTitleComponent,\n    InputGroupAddonComponent,\n    InputGroupButtonComponent,\n    InputGroupComponent,\n    InputGroupInputComponent,\n    LabelComponent,\n    SeparatorComponent,\n  ],\n  host: {\n    class: 'block',\n  },\n  template: `\n    <Card\n      class=\"w-full overflow-hidden rounded-none border-border/80 bg-card/95 shadow-2xl backdrop-blur-sm\"\n    >\n      <CardHeader\n        class=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-x-4 gap-y-3 border-b border-border/60 bg-muted/15 pb-4 sm:pb-5\"\n      >\n        <div class=\"w-16 shrink-0 sm:w-20\">\n          <AspectRatio [ratio]=\"3 / 2\" class=\"overflow-hidden rounded-none bg-primary\">\n            <div\n              class=\"flex h-full w-full items-center justify-center px-1 text-[1.25rem] leading-none tracking-[-0.08em] text-primary-foreground sm:text-[1.55rem]\"\n              style=\"font-family: 'Arial Black', Arial, sans-serif;\"\n            >\n              {{ messages.brand.mark }}\n            </div>\n          </AspectRatio>\n        </div>\n        <div class=\"min-w-0 space-y-0.5 pt-0.5 sm:pt-1\">\n          <CardTitle class=\"text-xl leading-tight sm:text-2xl\">{{\n            messages.login.title\n          }}</CardTitle>\n          <p CardDescription class=\"max-w-xl leading-6\">\n            {{ messages.login.intro }}\n          </p>\n        </div>\n        <CardAction\n          class=\"col-start-3 row-span-1 mt-0! pt-0.5 text-xs font-medium uppercase tracking-[0.24em] text-muted-foreground sm:pt-1 sm:text-sm\"\n        >\n          {{ messages.login.badge }}\n        </CardAction>\n      </CardHeader>\n\n      <CardContent class=\"pt-4 sm:pt-5\">\n        @if (health.isUnhealthy()) {\n          <div\n            [id]=\"healthBannerId\"\n            role=\"alert\"\n            aria-live=\"assertive\"\n            class=\"mb-5 space-y-1 rounded-none border border-destructive bg-destructive/10 p-4 text-destructive\"\n          >\n            <p class=\"font-medium\">{{ messages.login.healthUnavailableTitle }}</p>\n            <p class=\"text-sm\">{{ messages.login.healthUnavailableBody }}</p>\n            <button\n              #healthRetryButton\n              Button\n              type=\"button\"\n              variant=\"outline\"\n              size=\"sm\"\n              class=\"mt-2 border-destructive/50 text-destructive hover:bg-destructive/10 hover:text-destructive\"\n              [disabled]=\"health.isChecking()\"\n              (click)=\"retryHealth()\"\n            >\n              {{ health.isChecking() ? messages.login.healthChecking : messages.login.healthRetry }}\n            </button>\n          </div>\n        }\n\n        <form class=\"space-y-6\" [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n          <div class=\"space-y-3\">\n            <label Label for=\"email\" class=\"sr-only\">Alamat email</label>\n            <InputGroup [class]=\"emailFieldClasses()\">\n              <InputGroupAddon\n                aria-hidden=\"true\"\n                class=\"min-h-12 px-4 bg-transparent text-primary [&_svg]:size-6!\"\n              >\n                <svg\n                  viewBox=\"0 0 24 24\"\n                  class=\"fill-none stroke-current\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                >\n                  <path d=\"M4 7.5h16\" />\n                  <path\n                    d=\"M5 6h14a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1Z\"\n                  />\n                  <path d=\"m5 8 7 5 7-5\" />\n                </svg>\n              </InputGroupAddon>\n\n              <input\n                InputGroupInput\n                class=\"h-12! px-4! text-base!\"\n                id=\"email\"\n                type=\"email\"\n                inputmode=\"email\"\n                autocomplete=\"email\"\n                [attr.aria-describedby]=\"feedbackMessage() ? emailFeedbackId : null\"\n                [attr.aria-invalid]=\"fieldTone() === 'error' ? 'true' : null\"\n                formControlName=\"email\"\n                [placeholder]=\"messages.login.emailPlaceholder\"\n              />\n\n              <button\n                InputGroupButton\n                type=\"submit\"\n                variant=\"default\"\n                size=\"sm\"\n                [disabled]=\"\n                  form.invalid || isSubmitting() || health.isChecking() || health.isUnhealthy()\n                \"\n                [attr.aria-describedby]=\"health.isUnhealthy() ? healthBannerId : null\"\n                class=\"order-30 h-12! min-w-24 rounded-none px-5 text-sm font-medium\"\n              >\n                {{ isSubmitting() ? messages.login.submitting : messages.login.submit }}\n              </button>\n            </InputGroup>\n\n            @if (feedbackMessage(); as feedback) {\n              <p\n                [id]=\"emailFeedbackId\"\n                class=\"text-sm\"\n                [class.text-destructive]=\"feedbackTone() === 'error'\"\n                [class.text-emerald-700]=\"feedbackTone() === 'success'\"\n                [attr.role]=\"feedbackTone() === 'error' ? 'alert' : 'status'\"\n                [attr.aria-live]=\"feedbackTone() === 'error' ? 'assertive' : 'polite'\"\n              >\n                {{ feedback }}\n              </p>\n            }\n          </div>\n\n          <div class=\"grid grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-3 pt-2\">\n            <Separator class=\"w-full\" />\n            <span\n              class=\"min-w-14 text-center text-sm font-medium uppercase tracking-[0.18em] text-muted-foreground\"\n            >\n              Atau\n            </span>\n            <Separator class=\"w-full\" />\n          </div>\n\n          <div class=\"grid gap-3 pt-2 sm:grid-cols-3\">\n            <button\n              Button\n              type=\"button\"\n              variant=\"outline\"\n              size=\"lg\"\n              [disabled]=\"!googleSignInAvailable() || isGoogleRedirecting()\"\n              [attr.aria-label]=\"\n                googleSignInAvailable()\n                  ? messages.google.signInAria\n                  : requiresNativeGoogle()\n                    ? messages.google.nativeSignInUnavailable\n                    : messages.login.oauthGoogleAria\n              \"\n              [attr.title]=\"\n                googleSignInAvailable()\n                  ? null\n                  : requiresNativeGoogle()\n                    ? messages.google.nativeSignInUnavailable\n                    : messages.login.oauthComingSoon\n              \"\n              (click)=\"signInWithGoogle()\"\n              class=\"h-12 gap-3 text-[0.74rem] font-medium uppercase tracking-[0.16em]\"\n            >\n              <span\n                class=\"inline-flex size-6 shrink-0 items-center justify-center\"\n                aria-hidden=\"true\"\n              >\n                <svg viewBox=\"0 0 24 24\" class=\"size-5\" xmlns=\"http://www.w3.org/2000/svg\">\n                  <path\n                    fill=\"#EA4335\"\n                    d=\"M12.24 10.285v3.965h5.514c-.24 1.285-.96 2.374-2.045 3.105l3.305 2.565c1.925-1.775 3.03-4.39 3.03-7.49 0-.73-.065-1.43-.185-2.145z\"\n                  />\n                  <path\n                    fill=\"#34A853\"\n                    d=\"M12 22c2.7 0 4.965-.895 6.62-2.425l-3.305-2.565c-.915.615-2.085.985-3.315.985-2.545 0-4.7-1.72-5.47-4.03H3.115v2.53A9.996 9.996 0 0 0 12 22\"\n                  />\n                  <path\n                    fill=\"#4A90E2\"\n                    d=\"M6.53 13.965A5.996 5.996 0 0 1 6.24 12c0-.68.115-1.34.29-1.965v-2.53H3.115A9.996 9.996 0 0 0 2 12c0 1.61.385 3.135 1.115 4.495z\"\n                  />\n                  <path\n                    fill=\"#FBBC05\"\n                    d=\"M12 6.005c1.47 0 2.79.505 3.83 1.495l2.87-2.87C16.96 3.01 14.695 2 12 2a9.996 9.996 0 0 0-8.885 5.505l3.415 2.53c.77-2.31 2.925-4.03 5.47-4.03\"\n                  />\n                </svg>\n              </span>\n              {{ isGoogleRedirecting() ? googleProgressMessage() : 'Google' }}\n            </button>\n            <button\n              Button\n              type=\"button\"\n              variant=\"outline\"\n              size=\"lg\"\n              disabled\n              [attr.aria-label]=\"messages.login.oauthMicrosoftAria\"\n              [attr.title]=\"messages.login.oauthComingSoon\"\n              class=\"h-12 gap-3 text-[0.74rem] font-medium uppercase tracking-[0.16em]\"\n            >\n              <span\n                class=\"inline-flex size-6 shrink-0 items-center justify-center\"\n                aria-hidden=\"true\"\n              >\n                <svg viewBox=\"0 0 24 24\" class=\"size-5\" xmlns=\"http://www.w3.org/2000/svg\">\n                  <path fill=\"#F25022\" d=\"M2 2h9.5v9.5H2z\" />\n                  <path fill=\"#7FBA00\" d=\"M12.5 2H22v9.5h-9.5z\" />\n                  <path fill=\"#00A4EF\" d=\"M2 12.5h9.5V22H2z\" />\n                  <path fill=\"#FFB900\" d=\"M12.5 12.5H22V22h-9.5z\" />\n                </svg>\n              </span>\n              Microsoft\n            </button>\n            <button\n              Button\n              type=\"button\"\n              variant=\"outline\"\n              size=\"lg\"\n              disabled\n              [attr.aria-label]=\"messages.login.oauthAppleAria\"\n              [attr.title]=\"messages.login.oauthComingSoon\"\n              class=\"h-12 gap-3 text-[0.74rem] font-medium uppercase tracking-[0.16em]\"\n            >\n              <span\n                class=\"inline-flex size-6 shrink-0 items-center justify-center\"\n                aria-hidden=\"true\"\n              >\n                <svg\n                  viewBox=\"0 0 24 24\"\n                  class=\"size-5 fill-current\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                >\n                  <path\n                    d=\"M15.482 2c.13 1.25-.31 2.19-.84 2.81-.55.65-1.47 1.15-2.39 1.08-.12-1.21.38-2.17.92-2.79.6-.68 1.61-1.17 2.31-1.1Zm3.94 16.85c-.41.94-.91 1.8-1.54 2.59-.86 1.07-1.57 1.8-2.39 1.8-.59 0-.99-.17-1.44-.36-.47-.2-.95-.4-1.63-.4-.71 0-1.22.2-1.7.4-.46.19-.85.35-1.38.37-.79.03-1.55-.8-2.42-1.87-1.86-2.28-3.3-6.43-1.38-9.77.96-1.66 2.68-2.72 4.55-2.75.71-.01 1.39.21 1.98.41.45.15.86.29 1.19.29.3 0 .73-.15 1.19-.31.68-.23 1.46-.49 2.28-.42 1.14.09 2.17.55 2.98 1.38-2.66 1.45-2.23 5.2.71 6.54Z\"\n                  />\n                </svg>\n              </span>\n              Apple\n            </button>\n          </div>\n\n          @if (isGoogleRedirecting()) {\n            <p class=\"sr-only\" role=\"status\" aria-live=\"polite\">\n              {{ googleProgressMessage() }}\n            </p>\n          }\n\n          @if (googleFeedbackMessage(); as googleError) {\n            <p class=\"text-sm text-destructive\" role=\"alert\" aria-live=\"assertive\">\n              {{ googleError }}\n            </p>\n          }\n        </form>\n      </CardContent>\n    </Card>\n  `,\n})\nexport class AuthLoginPage {\n  private readonly documentRef = inject<Document>(DOCUMENT);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly formBuilder = inject(FormBuilder);\n  private readonly injector = inject(Injector);\n  private readonly authMagicLinkService = inject(AuthMagicLinkService);\n  private readonly authConfig = inject(EDSIS_AUTH_CONFIG);\n  private readonly googleGateway = inject(GoogleGatewayAuthService);\n  private readonly nativeGoogle = inject(NativeGoogleAuthService, { optional: true });\n  private readonly router = inject(Router, { optional: true });\n  protected readonly messages = inject(EDSIS_AUTH_MESSAGES);\n  protected readonly health = inject(AuthHealthService);\n  protected readonly googleOauth = this.authConfig.oauth.google;\n  protected readonly isGoogleRedirecting = signal(false);\n  protected readonly googleErrorMessage = signal<string | null>(null);\n  protected readonly requiresNativeGoogle = computed(\n    () => this.nativeGoogle?.requiresNativeGoogle() === true,\n  );\n  protected readonly isNativeGoogle = computed(() => this.nativeGoogle?.isAvailable() === true);\n  protected readonly googleSignInAvailable = computed(\n    () => this.isNativeGoogle() || (!this.requiresNativeGoogle() && this.googleOauth !== null),\n  );\n  protected readonly googleFeedbackMessage = computed(\n    () =>\n      this.googleErrorMessage() ??\n      (this.requiresNativeGoogle() && !this.isNativeGoogle()\n        ? this.messages.google.nativeSignInUnavailable\n        : null),\n  );\n  protected readonly googleProgressMessage = computed(() =>\n    this.isNativeGoogle()\n      ? this.messages.google.nativeSignInInProgress\n      : this.messages.google.googleRedirecting,\n  );\n\n  protected readonly form = this.formBuilder.nonNullable.group({\n    email: ['', [Validators.required, Validators.email, Validators.maxLength(255)]],\n  });\n  protected readonly isSubmitting = signal(false);\n  protected readonly responseMessage = signal<string | null>(null);\n  protected readonly errorMessage = signal<string | null>(null);\n  protected readonly emailControl = this.form.controls.email;\n  protected readonly emailFeedbackId = 'email-feedback';\n  protected readonly healthBannerId = 'auth-health-banner';\n  // `button[Button]` adalah komponen, jadi tanpa `read` query template-ref ini\n  // mengembalikan instance ButtonComponent — bukan elemen button-nya.\n  private readonly retryButton = viewChild('healthRetryButton', { read: ElementRef });\n  private readonly emailControlState = toSignal(this.emailControl.events.pipe(startWith(null)), {\n    initialValue: null,\n  });\n\n  constructor() {\n    // On-load health check: non-blocking, no-op saat healthCheck.enabled=false.\n    void this.health.check();\n\n    effect(() => {\n      if (this.health.status() !== 'unhealthy') {\n        return;\n      }\n\n      afterNextRender(() => this.retryButton()?.nativeElement.focus(), { injector: this.injector });\n    });\n  }\n\n  protected readonly hasInlineError = computed(() => {\n    this.emailControlState();\n    return this.emailControl.invalid && (this.emailControl.dirty || this.emailControl.touched);\n  });\n\n  protected readonly inlineErrorMessage = computed(() => {\n    // Depend on the control events directly: `hasInlineError` stays `true`\n    // while the error kind changes (e.g. format → required), and a memoized\n    // boolean alone would leave a stale message on screen.\n    this.emailControlState();\n\n    if (!this.hasInlineError()) {\n      return null;\n    }\n\n    return this.emailControl.hasError('required')\n      ? this.messages.login.emailRequired\n      : this.messages.login.emailInvalid;\n  });\n\n  protected readonly feedbackMessage = computed(\n    () => this.inlineErrorMessage() ?? this.responseMessage() ?? this.errorMessage(),\n  );\n\n  protected readonly feedbackTone = computed<'error' | 'success' | null>(() => {\n    if (this.inlineErrorMessage() || this.errorMessage()) {\n      return 'error';\n    }\n\n    if (this.responseMessage()) {\n      return 'success';\n    }\n\n    return null;\n  });\n\n  protected readonly fieldTone = computed<'idle' | 'error' | 'success'>(() => {\n    if (this.hasInlineError() || this.errorMessage()) {\n      return 'error';\n    }\n\n    if (this.responseMessage()) {\n      return 'success';\n    }\n\n    return 'idle';\n  });\n\n  protected readonly emailFieldClasses = computed(() => {\n    const baseClasses =\n      'flex-nowrap bg-background/70 shadow-sm [&>[data-slot=input-group-control]]:h-12! [&>[data-slot=input-group-control]]:px-4! [&>[data-slot=input-group-control]]:text-base!';\n\n    switch (this.fieldTone()) {\n      case 'error':\n        return `${baseClasses} border-destructive focus-within:border-destructive focus-within:ring-destructive/20`;\n      case 'success':\n        return `${baseClasses} border-emerald-500 focus-within:border-emerald-500 focus-within:ring-emerald-500/20`;\n      default:\n        return baseClasses;\n    }\n  });\n\n  protected retryHealth(): void {\n    void this.health.check();\n  }\n\n  protected signInWithGoogle(): void {\n    if (this.isGoogleRedirecting()) {\n      return;\n    }\n\n    if (this.requiresNativeGoogle()) {\n      if (this.isNativeGoogle()) {\n        void this.signInWithNativeGoogle();\n      } else {\n        this.googleErrorMessage.set(this.messages.google.nativeSignInUnavailable);\n      }\n      return;\n    }\n\n    if (!this.googleSignInAvailable()) return;\n\n    const googleOauth = this.googleOauth;\n    const windowRef = this.documentRef.defaultView;\n    if (!googleOauth || !windowRef) return;\n\n    if (googleOauth.mode === 'gateway') {\n      void this.signInWithGatewayGoogle();\n      return;\n    }\n\n    this.isGoogleRedirecting.set(true);\n    this.googleErrorMessage.set(null);\n\n    const state = createGoogleOauthState(windowRef);\n    storeGoogleOauthState(this.documentRef, state);\n\n    this.redirectTo(\n      buildGoogleAuthorizeUrl({\n        clientId: googleOauth.clientId,\n        redirectUri: googleOauth.redirectUri,\n        state,\n      }),\n    );\n  }\n\n  private async signInWithGatewayGoogle(): Promise<void> {\n    this.isGoogleRedirecting.set(true);\n    this.googleErrorMessage.set(null);\n\n    try {\n      const authorizationUrl = await this.googleGateway.start();\n      this.redirectTo(authorizationUrl);\n    } catch (error: unknown) {\n      this.googleErrorMessage.set(\n        getBackendErrorMessage(error, this.messages.google.gatewayStartFailed),\n      );\n      this.isGoogleRedirecting.set(false);\n    }\n  }\n\n  private async signInWithNativeGoogle(): Promise<void> {\n    if (!this.nativeGoogle) return;\n\n    this.isGoogleRedirecting.set(true);\n    this.googleErrorMessage.set(null);\n\n    try {\n      await this.nativeGoogle.signIn();\n      await this.router?.navigateByUrl(this.authConfig.authenticatedHomePath, {\n        replaceUrl: true,\n      });\n    } catch {\n      this.googleErrorMessage.set(this.messages.google.nativeSignInFailed);\n    } finally {\n      this.isGoogleRedirecting.set(false);\n    }\n  }\n\n  // Full-page redirect keluar dari SPA (bukan Router). Method terpisah karena\n  // jsdom tidak mengizinkan stub pada location.assign.\n  protected redirectTo(url: string): void {\n    this.documentRef.defaultView?.location.assign(url);\n  }\n\n  protected async submit(): Promise<void> {\n    if (this.form.invalid) {\n      this.form.markAllAsTouched();\n      return;\n    }\n\n    // Pre-submit re-check: backend bisa mati setelah halaman dimuat.\n    if (!(await this.health.check())) {\n      return;\n    }\n\n    this.isSubmitting.set(true);\n    this.responseMessage.set(null);\n    this.errorMessage.set(null);\n\n    const email = this.emailControl.getRawValue().trim().toLowerCase();\n    this.emailControl.setValue(email);\n\n    this.authMagicLinkService\n      .requestMagicLoginLink({\n        body: {\n          email,\n          frontend_url: new URL(this.authConfig.appUrl).origin,\n        },\n      })\n      .pipe(\n        takeUntilDestroyed(this.destroyRef),\n        finalize(() => this.isSubmitting.set(false)),\n      )\n      .subscribe({\n        next: (response) => {\n          this.responseMessage.set(getResponseMessage(response, this.messages.login.magicLinkSent));\n        },\n        error: (error: unknown) => {\n          this.errorMessage.set(getErrorMessage(error, this.messages.login.magicLinkFailed));\n        },\n      });\n  }\n}\n","import { Component, DestroyRef, OnInit, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router, RouterLink } from '@angular/router';\nimport { AlertComponent, AlertDescriptionComponent } from '@edsis/component/alert';\nimport { AspectRatioComponent } from '@edsis/component/aspect-ratio';\nimport { ButtonComponent } from '@edsis/component/button';\nimport {\n  CardActionComponent,\n  CardComponent,\n  CardContentComponent,\n  CardDescriptionComponent,\n  CardFooterComponent,\n  CardHeaderComponent,\n  CardTitleComponent,\n} from '@edsis/component/card';\nimport { SpinnerComponent } from '@edsis/component/spinner';\nimport { finalize, from } from 'rxjs';\n\nimport { EDSIS_AUTH_CONFIG } from '../../auth.config';\nimport { EDSIS_AUTH_MESSAGES } from '../../auth-messages';\nimport { AuthService } from '../../auth.service';\nimport { getErrorMessage, getResponseMessage } from '../auth-page.utils';\n\n@Component({\n  selector: 'edsis-auth-logout-page',\n  imports: [\n    RouterLink,\n    AlertComponent,\n    AlertDescriptionComponent,\n    AspectRatioComponent,\n    ButtonComponent,\n    CardActionComponent,\n    CardComponent,\n    CardContentComponent,\n    CardDescriptionComponent,\n    CardFooterComponent,\n    CardHeaderComponent,\n    CardTitleComponent,\n    SpinnerComponent,\n  ],\n  host: {\n    class: 'block',\n  },\n  template: `\n    <Card\n      class=\"w-full overflow-hidden rounded-none border-border/80 bg-card/95 shadow-2xl backdrop-blur-sm\"\n    >\n      <CardHeader\n        class=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-x-4 gap-y-3 border-b border-border/60 bg-muted/15 pb-4 sm:pb-5\"\n      >\n        <div class=\"w-16 shrink-0 sm:w-20\">\n          <AspectRatio [ratio]=\"3 / 2\" class=\"overflow-hidden rounded-none bg-primary\">\n            <div\n              class=\"flex h-full w-full items-center justify-center px-1 text-[1.25rem] leading-none tracking-[-0.08em] text-primary-foreground sm:text-[1.55rem]\"\n              style=\"font-family: 'Arial Black', Arial, sans-serif;\"\n            >\n              {{ messages.brand.mark }}\n            </div>\n          </AspectRatio>\n        </div>\n        <div class=\"min-w-0 space-y-0.5 pt-0.5 sm:pt-1\">\n          <CardTitle class=\"text-xl leading-tight sm:text-2xl\">{{\n            messages.logout.title\n          }}</CardTitle>\n          <p CardDescription class=\"max-w-xl leading-6\">\n            {{ messages.logout.intro }}\n          </p>\n        </div>\n        <CardAction\n          class=\"col-start-3 row-span-1 mt-0! pt-0.5 text-xs font-medium uppercase tracking-[0.24em] text-muted-foreground sm:pt-1 sm:text-sm\"\n        >\n          {{ messages.logout.badge }}\n        </CardAction>\n      </CardHeader>\n\n      <CardContent class=\"space-y-4 pt-6 sm:pt-7\">\n        <Alert\n          [variant]=\"state() === 'error' ? 'destructive' : 'default'\"\n          class=\"bg-background/70 shadow-sm\"\n        >\n          @if (state() === 'pending') {\n            <Spinner class=\"mt-0.5 size-4\" [attr.aria-label]=\"messages.logout.pendingAria\" />\n          }\n\n          <AlertDescription>\n            {{ message() }}\n          </AlertDescription>\n        </Alert>\n\n        @if (state() === 'error') {\n          <Alert variant=\"destructive\" class=\"shadow-sm\">\n            <AlertDescription>\n              {{ messages.logout.failedNote }}\n            </AlertDescription>\n          </Alert>\n        }\n      </CardContent>\n\n      <CardFooter class=\"flex flex-wrap gap-3 border-t border-border/60 bg-muted/10 pt-4 sm:pt-5\">\n        <a Button [routerLink]=\"guestHomePath\" variant=\"default\">\n          {{ messages.logout.backToLogin }}\n        </a>\n        <a Button [routerLink]=\"authenticatedHomePath\" variant=\"outline\">\n          {{ messages.logout.openDashboard }}\n        </a>\n      </CardFooter>\n    </Card>\n  `,\n})\nexport class AuthLogoutPage implements OnInit {\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly router = inject(Router);\n  private readonly authService = inject(AuthService);\n  private readonly authConfig = inject(EDSIS_AUTH_CONFIG);\n  protected readonly messages = inject(EDSIS_AUTH_MESSAGES);\n\n  protected readonly guestHomePath = this.authConfig.guestHomePath;\n  protected readonly authenticatedHomePath = this.authConfig.authenticatedHomePath;\n  protected readonly state = signal<'pending' | 'success' | 'error'>('pending');\n  protected readonly message = signal(this.messages.logout.pending);\n\n  ngOnInit(): void {\n    from(this.authService.logout())\n      .pipe(\n        takeUntilDestroyed(this.destroyRef),\n        finalize(() => {\n          if (this.state() === 'pending') {\n            this.state.set('success');\n          }\n        }),\n      )\n      .subscribe({\n        next: () => {\n          this.state.set('success');\n          this.message.set(this.messages.logout.success);\n          void this.router.navigateByUrl(this.guestHomePath, { replaceUrl: true });\n        },\n        error: (error: unknown) => {\n          this.state.set('error');\n          this.message.set(getErrorMessage(error, this.messages.logout.failed));\n        },\n      });\n  }\n}\n","import { DOCUMENT, Location } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { AuthMagicLinkService } from '@edsis/sdk/auth';\nimport { AlertComponent, AlertDescriptionComponent } from '@edsis/component/alert';\nimport { AspectRatioComponent } from '@edsis/component/aspect-ratio';\nimport { ButtonComponent } from '@edsis/component/button';\nimport {\n  CardActionComponent,\n  CardComponent,\n  CardContentComponent,\n  CardDescriptionComponent,\n  CardFooterComponent,\n  CardHeaderComponent,\n  CardTitleComponent,\n} from '@edsis/component/card';\nimport { SpinnerComponent } from '@edsis/component/spinner';\nimport { Subscription } from 'rxjs';\n\nimport { EDSIS_AUTH_CONFIG } from '../../auth.config';\nimport { EDSIS_AUTH_MESSAGES } from '../../auth-messages';\nimport { AuthService } from '../../auth.service';\nimport { extractMagicToken, getErrorMessage, getResponseMessage } from '../auth-page.utils';\n\n@Component({\n  selector: 'edsis-auth-verify-page',\n  imports: [\n    RouterLink,\n    AlertComponent,\n    AlertDescriptionComponent,\n    AspectRatioComponent,\n    ButtonComponent,\n    CardActionComponent,\n    CardComponent,\n    CardContentComponent,\n    CardDescriptionComponent,\n    CardFooterComponent,\n    CardHeaderComponent,\n    CardTitleComponent,\n    SpinnerComponent,\n  ],\n  host: {\n    class: 'block',\n  },\n  template: `\n    <Card\n      class=\"w-full overflow-hidden rounded-none border-border/80 bg-card/95 shadow-2xl backdrop-blur-sm\"\n    >\n      <CardHeader\n        class=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-x-4 gap-y-3 border-b border-border/60 bg-muted/15 pb-4 sm:pb-5\"\n      >\n        <div class=\"w-16 shrink-0 sm:w-20\">\n          <AspectRatio [ratio]=\"3 / 2\" class=\"overflow-hidden rounded-none bg-primary\">\n            <div\n              class=\"flex h-full w-full items-center justify-center px-1 text-[1.25rem] leading-none tracking-[-0.08em] text-primary-foreground sm:text-[1.55rem]\"\n              style=\"font-family: 'Arial Black', Arial, sans-serif;\"\n            >\n              {{ messages.brand.mark }}\n            </div>\n          </AspectRatio>\n        </div>\n        <div class=\"min-w-0 space-y-0.5 pt-0.5 sm:pt-1\">\n          <CardTitle class=\"text-xl leading-tight sm:text-2xl\">{{\n            messages.verify.title\n          }}</CardTitle>\n          <p CardDescription class=\"max-w-xl leading-6\">\n            {{ messages.verify.intro }}\n          </p>\n        </div>\n        <CardAction\n          class=\"col-start-3 row-span-1 mt-0! pt-0.5 text-xs font-medium uppercase tracking-[0.24em] text-muted-foreground sm:pt-1 sm:text-sm\"\n        >\n          {{ messages.verify.badge }}\n        </CardAction>\n      </CardHeader>\n\n      <CardContent class=\"space-y-4 pt-6 sm:pt-7\">\n        <Alert\n          [variant]=\"state() === 'error' ? 'destructive' : 'default'\"\n          class=\"bg-background/70 shadow-sm\"\n        >\n          @if (state() === 'pending') {\n            <Spinner class=\"mt-0.5 size-4\" [attr.aria-label]=\"messages.verify.pendingAria\" />\n          }\n\n          <AlertDescription>\n            {{ message() }}\n          </AlertDescription>\n        </Alert>\n\n        @if (state() === 'error') {\n          <Alert variant=\"destructive\" class=\"shadow-sm\">\n            <AlertDescription>\n              Pastikan Anda membuka link terbaru dari email dan token belum pernah dipakai\n              sebelumnya.\n            </AlertDescription>\n          </Alert>\n        }\n      </CardContent>\n\n      <CardFooter class=\"flex flex-wrap gap-3 border-t border-border/60 bg-muted/10 pt-4 sm:pt-5\">\n        <a Button [routerLink]=\"guestHomePath\" variant=\"outline\">\n          {{ messages.verify.requestNewLink }}\n        </a>\n        <a Button [routerLink]=\"authenticatedHomePath\" variant=\"default\">\n          {{ messages.verify.openDashboard }}\n        </a>\n      </CardFooter>\n    </Card>\n  `,\n})\nexport class AuthVerifyPage {\n  private readonly documentRef = inject<Document>(DOCUMENT);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly route = inject(ActivatedRoute);\n  private readonly router = inject(Router);\n  private readonly location = inject(Location);\n  private readonly authMagicLinkService = inject(AuthMagicLinkService);\n  private readonly authConfig = inject(EDSIS_AUTH_CONFIG);\n  private readonly authService = inject(AuthService);\n  protected readonly messages = inject(EDSIS_AUTH_MESSAGES);\n  private readonly queryParamMap = toSignal(this.route.queryParamMap, {\n    initialValue: this.route.snapshot.queryParamMap,\n  });\n  private readonly fragment = toSignal(this.route.fragment, {\n    initialValue: this.route.snapshot.fragment,\n  });\n  private handledToken: string | null | undefined = undefined;\n  private verifySubscription: Subscription | null = null;\n\n  protected readonly guestHomePath = this.authConfig.guestHomePath;\n  protected readonly authenticatedHomePath = this.authConfig.authenticatedHomePath;\n  protected readonly state = signal<'pending' | 'success' | 'error'>('pending');\n  protected readonly message = signal(this.messages.verify.pending);\n  protected readonly token = input<string | null | undefined>(undefined);\n\n  constructor() {\n    this.destroyRef.onDestroy(() => this.verifySubscription?.unsubscribe());\n\n    effect(() => {\n      const token = extractMagicToken(\n        this.token() ?? this.queryParamMap().get('token'),\n        this.fragment(),\n      );\n\n      if (!token) {\n        if (this.handledToken === null) {\n          return;\n        }\n\n        this.handledToken = null;\n        this.clearTokenFromAddressBar();\n        this.state.set('error');\n        this.message.set(this.messages.verify.tokenMissing);\n        return;\n      }\n\n      if (token === this.handledToken) {\n        return;\n      }\n\n      this.handledToken = token;\n      this.clearTokenFromAddressBar();\n      this.state.set('pending');\n      this.message.set(this.messages.verify.pending);\n      this.verify(token);\n    });\n  }\n\n  private clearTokenFromAddressBar(): void {\n    this.location.replaceState(this.authConfig.verifyPath);\n  }\n\n  private verify(token: string): void {\n    this.verifySubscription?.unsubscribe();\n    this.verifySubscription = this.authMagicLinkService\n      .verifyMagicLink({\n        body: {\n          token,\n          device_type: 'web',\n        },\n      })\n      .subscribe({\n        next: (response) => {\n          this.authService.acceptTokenResponse(response);\n\n          if (!this.authService.isAuthenticated()) {\n            this.state.set('error');\n            this.message.set(this.messages.verify.missingAccessToken);\n            return;\n          }\n\n          this.state.set('success');\n          this.message.set(getResponseMessage(response, this.messages.verify.successRedirect));\n          void this.router.navigateByUrl(this.authenticatedHomePath, { replaceUrl: true });\n        },\n        error: (error: unknown) => {\n          this.state.set('error');\n          this.message.set(getErrorMessage(error, this.messages.verify.invalidOrExpired));\n        },\n      });\n  }\n}\n","import type { Routes } from '@angular/router';\n\nimport { GOOGLE_OAUTH_CALLBACK_ROUTE_PATH } from '../auth.config';\nimport { guestOnlyGuard } from '../guard';\nimport { AuthShellPage } from './auth-shell/auth-shell.page';\nimport { AuthGoogleCallbackPage } from './google-callback/google-callback.page';\nimport { AuthLoginPage } from './login/login.page';\nimport { AuthLogoutPage } from './logout/logout.page';\nimport { AuthVerifyPage } from './verify/verify.page';\n\nexport const authRoutes: Routes = [\n  {\n    path: '',\n    component: AuthShellPage,\n    children: [\n      {\n        path: 'login',\n        title: 'Login',\n        canActivate: [guestOnlyGuard],\n        component: AuthLoginPage,\n      },\n      {\n        path: GOOGLE_OAUTH_CALLBACK_ROUTE_PATH,\n        title: 'Google Sign-In',\n        canActivate: [guestOnlyGuard],\n        component: AuthGoogleCallbackPage,\n      },\n      {\n        path: 'logout',\n        title: 'Logout',\n        component: AuthLogoutPage,\n      },\n      {\n        path: 'verify',\n        title: 'Verify',\n        canActivate: [guestOnlyGuard],\n        component: AuthVerifyPage,\n      },\n    ],\n  },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}