{"version":3,"file":"analog-tools-auth-angular.mjs","sources":["../../../../packages/auth-angular/src/functions/user-transformer/fromKeycloak.ts","../../../../packages/auth-angular/src/functions/user-transformer/fromAuth0.ts","../../../../packages/auth-angular/src/functions/user-transformer/detectProvider.ts","../../../../packages/auth-angular/src/functions/utils/get-request-headers.ts","../../../../packages/auth-angular/src/auth.service.ts","../../../../packages/auth-angular/src/auth.provider.ts","../../../../packages/auth-angular/src/auth.guard.ts","../../../../packages/auth-angular/src/functions/login.ts","../../../../packages/auth-angular/src/functions/utils/merge-request.ts","../../../../packages/auth-angular/src/auth.interceptor.ts","../../../../packages/auth-angular/src/trpc/functions/createProxy.ts","../../../../packages/auth-angular/src/trpc/functions/createDefaultConfirmation.ts","../../../../packages/auth-angular/src/trpc/functions/wrapTrpcClientWithErrorHandling.ts","../../../../packages/auth-angular/src/trpc/trpc.injector.ts","../../../../packages/auth-angular/src/analog-tools-auth-angular.ts"],"sourcesContent":["import { AuthUser } from \"../../auth.service\";\n\nexport type KeycloakUserInfo = {\n  // Core Identity Properties\n  sub: string;              // Subject identifier (unique user ID)\n  preferred_username: string;  // Username\n  name: string;             // Full name\n  given_name: string;       // First name\n  family_name: string;      // Last name\n  email: string;            // Email address\n  email_verified: boolean;  // Whether email has been verified\n  \n  // Access Control Properties\n  realm_access: {\n    roles: string[]         // Realm-level roles assigned to user\n  };\n  resource_access: {        // Client-specific roles\n    [clientId: string]: {\n      roles: string[]\n    }\n  };\n  \n  // Additional Metadata\n  groups: string[];         // Groups the user belongs to\n  scope: string;            // OAuth scopes granted\n  sid: string;              // Session ID\n  acr: string;              // Authentication context class reference\n  iat: number;              // Issued at timestamp\n  exp: number;              // Expiration timestamp\n  auth_time: number;        // Time when authentication occurred\n}\n\n\nexport function fromKeycloak (keycloakUser: KeycloakUserInfo): AuthUser {\n  return {\n    username: keycloakUser.preferred_username,\n    fullName: keycloakUser.name,\n    givenName: keycloakUser.given_name,\n    familyName: keycloakUser.family_name,\n    picture: undefined,\n    email: keycloakUser.email,\n    emailVerified: keycloakUser.email_verified,\n    locale: undefined, // Locale is not provided in Keycloak user info\n    lastLogin: new Date().toISOString(), // Assuming last login is now\n    updatedAt: undefined, // Assuming updated at is now\n    createdAt: undefined, // Assuming created at is now\n    auth_id: keycloakUser.sub, // Using sub as auth_id\n  };\n}","import { AuthUser } from \"../../auth.service\";\n\nexport type Auth0UserInfo = {\n  // Core Identity Properties\n  sub: string;              // Subject identifier (unique user ID)\n  nickname: string;         // User nickname\n  name: string;             // Full name\n  given_name?: string;      // First name\n  family_name?: string;     // Last name\n  email?: string;           // Email address\n  email_verified?: boolean; // Whether email has been verified\n  picture?: string;         // URL to user's profile picture\n  locale?: string;          // User's locale\n  \n  // Auth0 Specific Properties\n  updated_at?: string;      // Last update timestamp\n  created_at?: string;      // Creation timestamp\n  last_login?: string;      // Last login timestamp\n  \n  // Access Control Properties\n  roles?: string[];         // User roles (if using Auth0 RBAC)\n  permissions?: string[];   // User permissions (if using Auth0 RBAC)\n  \n  // Additional Metadata\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  user_metadata?: Record<string, any>;  // User editable metadata\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  app_metadata?: Record<string, any>;   // Application metadata (controlled by apps/APIs)\n  \n  // Standard OIDC properties\n  iss?: string;             // Issuer\n  aud?: string;             // Audience\n  iat?: number;             // Issued at timestamp\n  exp?: number;             // Expiration timestamp\n}\n\n/**\n * Transforms an Auth0 user object into the application's AuthUser format\n * @param auth0User - The user object from Auth0\n * @returns A standardized AuthUser object\n */\nexport function fromAuth0(auth0User: Auth0UserInfo): AuthUser {\n  return {\n    username: auth0User.nickname || auth0User.email || '',\n    fullName: auth0User.name || '',\n    givenName: auth0User.given_name || '',\n    familyName: auth0User.family_name || '',\n    picture: auth0User.picture,\n    email: auth0User.email,\n    emailVerified: auth0User.email_verified,\n    locale: auth0User.locale,\n    lastLogin: auth0User.last_login,\n    updatedAt: auth0User.updated_at,\n    createdAt: auth0User.created_at,\n    auth_id: auth0User.sub,\n    // If roles are stored directly or in app_metadata\n    roles: auth0User.roles || auth0User.app_metadata?.[\"roles\"],\n  };\n}\n","import { AuthUser } from '../../auth.service';\nimport { Auth0UserInfo, fromAuth0 } from './fromAuth0';\nimport { fromKeycloak, KeycloakUserInfo } from './fromKeycloak';\n\n/**\n * Provider type for identity providers\n */\nexport type IdentityProvider = 'keycloak' | 'auth0' | 'unknown';\n\n/**\n * Generic user info type that can represent data from any provider\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type GenericUserInfo = Record<string, any>;\n\n/**\n * Detects the identity provider based on user data structure\n * @param userInfo - User information object from the provider\n * @returns The detected identity provider type\n */\nexport function detectProvider(userInfo: GenericUserInfo): IdentityProvider {\n  if (!userInfo) {\n    return 'unknown';\n  }\n\n  // Check for Keycloak-specific properties\n  if (userInfo['realm_access'] || userInfo['resource_access']) {\n    return 'keycloak';\n  }\n\n  // Check for Auth0-specific properties\n  if (\n    userInfo['nickname'] !== undefined ||\n    userInfo['user_metadata'] !== undefined ||\n    userInfo['app_metadata'] !== undefined\n  ) {\n    return 'auth0';\n  }\n\n  // If we can't determine the provider, check for common patterns\n  // Auth0 typically includes an issuer URL with \"auth0.com\"\n  if (\n    userInfo['iss'] &&\n    typeof userInfo['iss'] === 'string' &&\n    userInfo['iss'].includes('auth0.com')\n  ) {\n    return 'auth0';\n  }\n\n  // Keycloak typically includes an issuer URL with \"auth/realms\"\n  if (\n    userInfo['iss'] &&\n    typeof userInfo['iss'] === 'string' &&\n    userInfo['iss'].includes('/auth/realms')\n  ) {\n    return 'keycloak';\n  }\n\n  // If we still can't determine, return unknown\n  return 'unknown';\n}\n\n/**\n * Transforms user data from any supported identity provider into the application's AuthUser format\n * @param userInfo - User information object from the provider\n * @returns A standardized AuthUser object\n */\nexport function transformUserFromProvider(userInfo: GenericUserInfo): AuthUser {\n  const provider = detectProvider(userInfo);\n\n  switch (provider) {\n    case 'keycloak':\n      return fromKeycloak(userInfo as KeycloakUserInfo);\n    case 'auth0':\n      return fromAuth0(userInfo as Auth0UserInfo);\n    case 'unknown':\n    default:\n      // Fallback transformation for unknown providers\n      // This provides a basic mapping that should work with most standard OIDC providers\n      return {\n        username:\n          userInfo['preferred_username'] ||\n          userInfo['nickname'] ||\n          userInfo['email'] ||\n          userInfo['sub'] ||\n          '',\n        fullName: userInfo['name'] || '',\n        givenName: userInfo['given_name'] || '',\n        familyName: userInfo['family_name'] || '',\n        picture: userInfo['picture'],\n        email: userInfo['email'],\n        emailVerified: userInfo['email_verified'],\n        locale: userInfo['locale'],\n        lastLogin: userInfo['last_login'] || new Date().toISOString(),\n        updatedAt: userInfo['updated_at'],\n        createdAt: userInfo['created_at'],\n        auth_id: userInfo['sub'],\n        roles: userInfo['roles'] || [],\n      };\n  }\n}\n","import { HttpHeaders } from '@angular/common/http';\nimport { ServerRequest } from '@analogjs/router/tokens';\n\nexport function getRequestHeaders(\n  serverRequest: ServerRequest | null,\n  originalHeaderValues?: { [key: string]: string | null | undefined }\n) {\n  let headers = new HttpHeaders();\n  headers = headers.set('fetch', 'true');\n\n  if (originalHeaderValues) {\n    Object.entries(originalHeaderValues).forEach(([key, value]) => {\n      if (value !== null && value !== undefined) {\n        headers = headers.set(key, value);\n      }\n    });\n  }\n\n  if (serverRequest) {\n    Object.entries(serverRequest.headers).forEach(([key, value]) => {\n      if (value !== null && value !== undefined && typeof value === 'string') {\n        headers = headers.set(key, value);\n      }\n    });\n  }\n  return headers;\n}\n","import {\n  DOCUMENT,\n  computed,\n  EffectRef,\n  effect,\n  inject,\n  Injectable,\n  Injector,\n  makeStateKey,\n  OnDestroy,\n  PLATFORM_ID,\n  runInInjectionContext,\n  signal,\n  TransferState,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { httpResource } from '@angular/common/http';\nimport {\n  GenericUserInfo,\n  transformUserFromProvider,\n} from './functions/user-transformer';\nimport { getRequestHeaders } from './functions/utils/get-request-headers';\nimport { injectRequest } from '@analogjs/router/tokens';\n\nexport interface AuthUser {\n  username: string;\n  fullName: string;\n  givenName: string;\n  familyName: string;\n  picture?: string;\n  email?: string;\n  emailVerified?: boolean;\n  locale?: string;\n  lastLogin?: string;\n  updatedAt?: string;\n  createdAt?: string;\n  auth_id?: string;\n  roles?: string[];\n}\n\nconst MAX_USER_RELOAD_ATTEMPTS = 3;\n\ntype AuthTransferSnapshot = {\n  authenticated: boolean;\n  user: AuthUser | null;\n};\n\nexport const AUTH_TRANSFER_STATE_KEY = makeStateKey<AuthTransferSnapshot | null>(\n  'analog-tools.auth.snapshot'\n);\n\n/**\n * Auth service for BFF (Backend for Frontend) authentication pattern\n * Uses server-side sessions with Auth0 instead of client-side tokens\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService implements OnDestroy {\n  private router = inject(Router);\n  private platformId = inject(PLATFORM_ID);\n  private document = inject(DOCUMENT);\n  private injector = inject(Injector);\n  private transferState = inject(TransferState);\n  private checkAuthInterval: ReturnType<typeof setInterval> | null = null;\n  private userReloadEffect: EffectRef | null = null;\n  private userReloadTimeout: ReturnType<typeof setTimeout> | null = null;\n  private userReloadAttempts = 0;\n  private hasRevalidatedBrowserAuth = false;\n  private providedServerRequest = signal<ReturnType<typeof injectRequest>>(null);\n  private transferredSnapshot = this.consumeTransferredSnapshot();\n\n  private isSettledResourceStatus(status: string): boolean {\n    return status === 'resolved' || status === 'local' || status === 'error';\n  }\n\n  private consumeTransferredSnapshot(): AuthTransferSnapshot | null {\n    if (!isPlatformBrowser(this.platformId)) {\n      return null;\n    }\n\n    if (!this.transferState.hasKey(AUTH_TRANSFER_STATE_KEY)) {\n      return null;\n    }\n\n    const snapshot = this.transferState.get(AUTH_TRANSFER_STATE_KEY, null);\n    this.transferState.remove(AUTH_TRANSFER_STATE_KEY);\n\n    return snapshot;\n  }\n\n  setServerRequest(serverRequest: ReturnType<typeof injectRequest>): void {\n    if (serverRequest) {\n      this.providedServerRequest.set(serverRequest);\n    }\n  }\n\n  private resolveRequestHeaders(\n    originalHeaderValues?: { [key: string]: string | null | undefined }\n  ) {\n    const providedServerRequest = this.providedServerRequest();\n\n    if (providedServerRequest) {\n      return getRequestHeaders(providedServerRequest, originalHeaderValues);\n    }\n\n    return runInInjectionContext(this.injector, () => {\n      return getRequestHeaders(injectRequest(), originalHeaderValues);\n    });\n  }\n\n  // Auth state - order matters: isAuthenticatedResource and isAuthenticated must be defined first\n  readonly isAuthenticatedResource = httpResource<boolean>(\n    () => {\n      return {\n        url: '/api/auth/authenticated',\n        method: 'GET',\n        headers: this.resolveRequestHeaders({\n          accept: 'application/json',\n        }),\n        withCredentials: true,\n      };\n    },\n    {\n      defaultValue: this.transferredSnapshot?.authenticated ?? false,\n      parse: (value: unknown) => {\n        return (value as { authenticated: boolean }).authenticated;\n      },\n    }\n  );\n\n  readonly isAuthenticated = this.isAuthenticatedResource.asReadonly().value;\n\n  readonly isAuthenticationResolved = computed(() => {\n    const status = this.isAuthenticatedResource.status();\n\n    return this.isSettledResourceStatus(status);\n  });\n\n  readonly isAuthenticationLoading = computed(() => {\n    const status = this.isAuthenticatedResource.status();\n\n    return !this.isSettledResourceStatus(status);\n  });\n\n  readonly userResource = httpResource<AuthUser | null>(\n    () => {\n      if (!this.isAuthenticated()) {\n        return undefined;\n      }\n      return {\n        url: '/api/auth/user',\n        method: 'GET',\n        headers: this.resolveRequestHeaders({\n          accept: 'application/json',\n        }),\n        withCredentials: true,\n      };\n    },\n    {\n      defaultValue: this.transferredSnapshot?.user ?? null,\n      parse: (raw: unknown) => {\n        return transformUserFromProvider(raw as GenericUserInfo);\n      },\n    }\n  );\n\n  readonly user = this.userResource.asReadonly().value;\n\n  constructor() {\n    if (isPlatformServer(this.platformId)) {\n      effect(\n        () => {\n          if (!this.isAuthenticationResolved()) {\n            return;\n          }\n\n          if (\n            this.isAuthenticated() &&\n            !this.isSettledResourceStatus(this.userResource.status())\n          ) {\n            return;\n          }\n\n          this.transferState.set(AUTH_TRANSFER_STATE_KEY, {\n            authenticated: this.isAuthenticated(),\n            user: this.userResource.value(),\n          });\n        },\n        { injector: this.injector }\n      );\n    }\n\n    if (isPlatformBrowser(this.platformId)) {\n      queueMicrotask(() => {\n        if (\n          !this.hasRevalidatedBrowserAuth &&\n          this.isAuthenticationResolved() &&\n          !this.isAuthenticated()\n        ) {\n          this.hasRevalidatedBrowserAuth = true;\n          this.isAuthenticatedResource.reload();\n        }\n      });\n\n      this.userReloadEffect = effect(\n        () => {\n          const isAuthenticated = this.isAuthenticated();\n          const user = this.userResource.value();\n          const status = this.userResource.status();\n\n          if (!isAuthenticated || user !== null) {\n            this.clearUserReloadRetry();\n            return;\n          }\n\n          if (\n            this.userReloadAttempts < MAX_USER_RELOAD_ATTEMPTS &&\n            this.isSettledResourceStatus(status)\n          ) {\n            this.userReloadAttempts += 1;\n            this.userResource.reload();\n            this.scheduleUserReloadRetry();\n          }\n        },\n        { injector: this.injector }\n      );\n\n      // Set up periodic check for authentication status\n      this.checkAuthInterval = setInterval(() => {\n        this.isAuthenticatedResource.reload();\n      }, 5 * 60 * 1000); // Check every 5 minutes\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.checkAuthInterval) {\n      clearInterval(this.checkAuthInterval);\n    }\n    this.clearUserReloadRetry();\n    this.userReloadEffect?.destroy();\n  }\n\n  private clearUserReloadRetry(): void {\n    this.userReloadAttempts = 0;\n\n    if (this.userReloadTimeout) {\n      clearTimeout(this.userReloadTimeout);\n      this.userReloadTimeout = null;\n    }\n  }\n\n  private scheduleUserReloadRetry(): void {\n    if (\n      this.userReloadTimeout ||\n      this.userReloadAttempts >= MAX_USER_RELOAD_ATTEMPTS\n    ) {\n      return;\n    }\n\n    this.userReloadTimeout = setTimeout(() => {\n      this.userReloadTimeout = null;\n\n      if (this.isAuthenticated() && this.userResource.value() === null) {\n        this.userResource.reload();\n        this.scheduleUserReloadRetry();\n      }\n    }, 1000);\n  }\n\n  waitForAuthentication(): Promise<boolean> {\n    if (!isPlatformBrowser(this.platformId) || this.isAuthenticationResolved()) {\n      return Promise.resolve(this.isAuthenticated());\n    }\n\n    return new Promise<boolean>((resolve) => {\n      const watcher = effect(\n        () => {\n          if (this.isAuthenticationResolved()) {\n            resolve(this.isAuthenticated());\n            queueMicrotask(() => watcher.destroy());\n          }\n        },\n        { injector: this.injector }\n      );\n    });\n  }\n\n  /**\n   * Login the user by redirecting to the login endpoint\n   * @param targetUrl Optional URL to redirect to after login\n   */\n  login(targetUrl?: string): void {\n    if (isPlatformBrowser(this.platformId)) {\n      const redirectUri = targetUrl || this.router.url;\n      this.document.location.href = `/api/auth/login?redirect_uri=${encodeURIComponent(\n        redirectUri\n      )}`;\n    }\n  }\n\n  /**\n   * Logout the user by redirecting to the logout endpoint\n   */\n  logout(): void {\n    if (isPlatformBrowser(this.platformId)) {\n      try {\n        const logoutUrl = `/api/auth/logout?redirect_uri=${encodeURIComponent(\n          '/'\n        )}`;\n        // Clear local state before redirect\n        this.userResource.set(null);\n        if (this.checkAuthInterval) {\n          clearInterval(this.checkAuthInterval);\n        }\n        this.document.location.href = logoutUrl;\n      } catch (error) {\n        console.error('Logout failed:', error);\n        // Implement fallback logout mechanism\n      }\n    }\n  }\n\n  /**\n   * Check if user has the required roles\n   * @param roles Array of roles to check\n   */\n  hasRoles(roles: string[]): boolean {\n    const user = this.userResource.value();\n    if (!user || !user.roles) return false;\n\n    return roles.some((role) => user.roles?.lastIndexOf(role) !== -1);\n  }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { AuthService } from './auth.service';\n\nexport function provideAuthClient(): EnvironmentProviders {\n  return makeEnvironmentProviders([AuthService]);\n}\n","import { CanActivateFn, Router } from '@angular/router';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { AuthService } from './auth.service';\n\n/**\n * Auth guard that checks if the user is authenticated\n */\nexport const authGuard: CanActivateFn = (route, state) => {\n  const authService = inject(AuthService);\n  const platformId = inject(PLATFORM_ID);\n\n  if (isPlatformServer(platformId)) {\n    return true;\n  }\n\n  return authService\n    .waitForAuthentication()\n    .then((isAuthenticated) => {\n      if (isAuthenticated) {\n        // User is authenticated, allow access\n        return true;\n      }\n\n      // User is not authenticated, redirect to login\n      authService.login(state.url);\n      return false;\n    })\n    .catch(() => false);\n};\n\n/**\n * Role-based guard that checks if the user has the required roles\n */\nexport const roleGuard: CanActivateFn = (route, state) => {\n  const authService = inject(AuthService);\n  const router = inject(Router);\n  const platformId = inject(PLATFORM_ID);\n\n  if (isPlatformServer(platformId)) {\n    return true;\n  }\n\n  // Get required roles from route data\n  const requiredRoles = route.data?.['roles'] as string[] | undefined;\n\n  if (!requiredRoles || requiredRoles.length === 0) {\n    // No specific roles required\n    return true;\n  }\n\n  return authService\n    .waitForAuthentication()\n    .then((isAuthenticated) => {\n      if (!isAuthenticated) {\n        authService.login(state.url);\n        return false;\n      }\n\n      // Check if user has any of the required roles\n      if (authService.hasRoles(requiredRoles)) {\n        return true;\n      }\n\n      // User doesn't have required roles, redirect to access denied\n      router.navigate(['/access-denied']);\n      return false;\n    })\n    .catch(() => false);\n};\n","export function redirect(uri: string) {\n  document.location.href = uri;\n}\n\nexport function login(redirectUri?: string) {\n  const url = document.location.origin + (redirectUri || '');\n  redirect(`/api/auth/login?redirect_uri=${encodeURIComponent(url)}`);\n}\n","import { HttpHeaders, HttpRequest } from '@angular/common/http';\nimport { ServerRequest } from '@analogjs/router/tokens';\n\nexport function mergeRequest(\n  originalRequest: HttpRequest<unknown>,\n  serverRequest: ServerRequest | null\n) {\n  let modifiedReq;\n\n  if (serverRequest) {\n    let headers = new HttpHeaders();\n    Object.entries(serverRequest.headers).forEach(([key, value]) => {\n      if (value !== null && value !== undefined && typeof value === 'string') {\n        headers = headers.set(key, value);\n      }\n    });\n    headers = headers.set('fetch', 'true');\n\n    modifiedReq = originalRequest.clone({\n      headers: headers,\n      withCredentials: true,\n    });\n  } else {\n    modifiedReq = originalRequest.clone({\n      headers: originalRequest.headers.set('fetch', 'true'),\n      withCredentials: true,\n    });\n  }\n\n  return modifiedReq;\n}\n","import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { catchError, EMPTY } from 'rxjs';\nimport { login } from './functions/login';\nimport { injectRequest } from '@analogjs/router/tokens';\nimport { mergeRequest } from './functions/utils/merge-request';\n\n/**\n * HTTP interceptor that:\n * 1. Adds a fetch=true header to indicate fresh data requests\n * 2. Redirects to login page when an API returns a 401 Unauthorized response\n *\n * This handles cases where a session has expired on the server-side.\n */\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n  const isAuthEndpoint = req.url.includes('/api/auth/');\n\n  const platformId = inject(PLATFORM_ID);\n\n  // Clone the request and add the fetch=true header\n  const request = injectRequest();\n\n  const modifiedReq = mergeRequest(req, request);\n\n  // Auth endpoints still need the current SSR request context (cookies/headers),\n  // but should not trigger the interceptor's 401 redirect handling.\n  if (isAuthEndpoint) {\n    return next(modifiedReq);\n  }\n\n  // Use the modified request with the added header\n  return next(modifiedReq).pipe(\n    catchError((error: unknown) => {\n      // Only handle HttpErrorResponse with 401 status\n      if (error instanceof HttpErrorResponse && error.status === 401) {\n        if (isPlatformBrowser(platformId)) {\n          const currentUrl = window.location.pathname + window.location.search;\n          login(currentUrl);\n        }\n        // Return EMPTY to suppress the error — httpResource will use defaultValue\n        return EMPTY;\n      }\n\n      // For other errors, rethrow\n      throw error;\n    })\n  );\n};\n\n/**\n * Provider for the auth interceptor\n */\nexport const provideAuthInterceptor = () => ({\n  provide: 'HTTP_INTERCEPTORS',\n  useValue: authInterceptor,\n  multi: true,\n});\n","import { Observable, catchError, throwError } from \"rxjs\";\nimport { ProcedureMethod, TRPCErrorData } from \"../types/trpc\";\nimport { TRPCClientError } from '@trpc/client';\nimport { AnyRouter } from '@trpc/server';\n\nexport function proxyClient<Router extends AnyRouter>(\n  client: Record<string, unknown>,\n  errorHandler: (errorData: TRPCErrorData | undefined) => boolean,\n) {\n  return new Proxy(client, {\n    get(target, prop) {\n      return new Proxy(\n        target[prop as keyof typeof target] as Record<string, unknown>,\n        {\n          get(target, prop) {\n            return proxyProcedure<Router>(\n              target[prop as keyof typeof target] as Record<string, unknown>,\n              errorHandler,\n            );\n          },\n        },\n      );\n    },\n  });\n}\n\nfunction proxyProcedure<Router extends AnyRouter>(\n  procedure: Record<string, unknown>,\n  errorHandler: (errorData: TRPCErrorData | undefined) => boolean,\n) {\n  return new Proxy(procedure, {\n    get(procedureTarget, procedureProp) {\n      const procedureMethod =\n        procedureTarget[procedureProp as keyof typeof procedureTarget];\n\n      // Only intercept query and mutate methods\n      if (procedureProp !== 'query' && procedureProp !== 'mutate') {\n        return procedureMethod;\n      }\n\n      // Return a wrapped version of the method that catches errors\n      return function (...args: unknown[]) {\n        const method = procedureMethod as ProcedureMethod;\n        const result = method(...args);\n\n        // If the result is an Observable (for Angular), add error handling\n        if (result instanceof Observable) {\n          return result.pipe(\n            catchError((error) => {\n              // Check if it's a TRPC client error with UNAUTHORIZED code\n              if (error instanceof TRPCClientError) {\n                const trpcError = error as TRPCClientError<Router>;\n                const errorData = trpcError.data as TRPCErrorData | undefined;\n\n                if(errorHandler(errorData)) {\n                  // Handle the error and prevent it from propagating\n                  return new Observable<never>((subscriber) => {\n                    subscriber.complete();\n                  });\n                }\n              }\n\n              // Always rethrow the error for other error handlers\n              return throwError(() => error);\n            }),\n          );\n        }\n\n        return result;\n      };\n    },\n  });\n}","import { TRPCErrorData } from '../types/trpc';\n\nfunction confirmDialog(msg:string) {\n    return new Promise(function (resolve, reject) {\n      try {\n        if (!window?.confirm) {\n          console.error(\"confirm is not available\");\n          return reject(false);\n        }\n        const confirmed = confirm(msg);\n\n        return confirmed ? resolve(true) : reject(false);\n      } catch {\n        return reject(\"Error showing confirmation dialog\");\n      }\n    });\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function createDefaultConfirmation(_: TRPCErrorData | undefined): boolean {\n  confirmDialog(\"Session expired. Do you want to refresh the page?\").then(() => {\n      window.location.href = '/';\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n  }).catch(() => {});\n  return true;\n}\n","import { TRPCErrorData } from \"../types/trpc\";\nimport { proxyClient } from \"./createProxy\";\nimport { createDefaultConfirmation } from './createDefaultConfirmation';\n\n/**\n * Wraps a TRPC client with error handling for auth errors\n * @param client The original TRPC client\n * @param errorHandler A function to handle errors. if returns true, the error is handled and catched\n * @returns A wrapped TRPC client with error handling\n */\nexport function wrapTrpcClientWithErrorHandling<T>(\n  client: Record<string, unknown>,\n  errorHandler?: (errorData: TRPCErrorData | undefined) => boolean,\n): T {\n  // Create a proxy that intercepts all client calls\n  return proxyClient(\n    client,\n    errorHandler ?? createDefaultConfirmation,\n  ) as unknown as T;\n}\n","import { ServerRequest } from '@analogjs/router/tokens';\nimport { wrapTrpcClientWithErrorHandling } from './functions/wrapTrpcClientWithErrorHandling';\nimport { HTTPHeaders } from '@trpc/client';\nimport { WritableSignal } from '@angular/core';\n\nexport function createTrpcClientWithAuth<T>(\n  trpcClient: T,\n  request: ServerRequest | null,\n  TrpcHeaders: WritableSignal<HTTPHeaders>\n) {\n  // Add request headers including cookies for auth\n  TrpcHeaders.update((headers) => ({\n    ...headers,\n    fetch: 'true',\n    cookie: request?.headers.cookie,\n  }));\n\n  // Wrap the client to add error handling\n  return wrapTrpcClientWithErrorHandling<typeof trpcClient>(\n    trpcClient as Record<string, unknown>\n  );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}