import type { JSX } from '../jsx-runtime.js'; import type { Accessor } from './signals.js'; export type MaybePromise = T | Promise; export type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated'; export interface AuthUser { id?: string; email?: string | null; name?: string | null; [key: string]: unknown; } export interface AuthSession { user: User; provider?: string; accessToken?: string; refreshToken?: string; expiresAt?: number; isNewUser?: boolean; [key: string]: unknown; } export interface AuthStorage { getSession: () => MaybePromise; setSession: (session: Session) => MaybePromise; clearSession: () => MaybePromise; } export interface AuthErrorOptions { code?: string; status?: number; recoverable?: boolean; cause?: unknown; } export declare class AuthError extends Error { code: string; status?: number; recoverable?: boolean; constructor(message: string, options?: AuthErrorOptions); } export interface ProviderContext< Session extends AuthSession = AuthSession, > { auth: AuthClient; provider: AuthProviderConfig; } export interface AuthProviderConfig< Session extends AuthSession = AuthSession, Input = unknown, > { id: string; name: string; type: 'credentials' | 'oauth' | string; authorize: ( input: Input, context: ProviderContext ) => MaybePromise; } export interface CredentialField { label?: string; type?: string; placeholder?: string; value?: string; [key: string]: unknown; } export interface CredentialsConfig< Session extends AuthSession = AuthSession, Input = Record, > { id?: string; name?: string; credentials?: Record; authorize: ( credentials: Input, context: ProviderContext ) => MaybePromise; } export interface GoogleInput { idToken?: string; [key: string]: unknown; } export interface GoogleConfig< Session extends AuthSession = AuthSession, Input extends GoogleInput = GoogleInput, > { id?: string; name?: string; getIdToken?: ( input: Input, context: ProviderContext ) => MaybePromise; authorize: ( input: Input & { idToken: string }, context: ProviderContext ) => MaybePromise; } export interface RefreshContext { session: Session; refreshToken: string; userId?: string; } export interface AuthConfig { providers?: AuthProviderConfig[]; storage?: AuthStorage; refresh?: ( context: RefreshContext ) => MaybePromise>; onSession?: (session: Session) => void; onSignOut?: (session: Session | null) => MaybePromise; onError?: (error: AuthError) => void; isRefreshErrorNonRecoverable?: (error: AuthError) => boolean; autoRefresh?: boolean; maxRefreshErrors?: number; retryRefreshAfterMs?: number; accessTokenExpiryFallbackMs?: number; accessTokenExpirySafetyBufferMs?: number; now?: () => number; } export interface GetSessionOptions { forceRefresh?: boolean; } export interface RefreshOptions { force?: boolean; } export interface AuthClient { data: Accessor; status: Accessor; error: Accessor; providers: Accessor[]>; initialize: () => Promise; getSession: (options?: GetSessionOptions) => Promise; signIn: (provider: string, input?: unknown) => Promise; signOut: () => Promise; refresh: (options?: RefreshOptions) => Promise; update: ( patch: | Partial | (( session: Session ) => MaybePromise | null | undefined>) ) => Promise; dispose: () => void; } export interface AuthProviderProps< Session extends AuthSession = AuthSession, > { client?: AuthClient; config?: AuthConfig; children?: | JSX.Element | ((auth: AuthClient) => JSX.Element); } export interface ProtectedRouteProps< Session extends AuthSession = AuthSession, > { client?: AuthClient; children?: JSX.Element | ((session: Session) => JSX.Element); fallback?: JSX.Element; loadingFallback?: JSX.Element; unauthenticatedFallback?: JSX.Element; redirectTo?: string | false; preserveCallback?: boolean; callbackParam?: string; replace?: boolean; basename?: string; } export interface LocalStorageAdapterOptions { key?: string; getStorage?: () => Storage | null; } export interface AccessTokenExpiryOptions { now?: () => number; fallbackMs?: number; safetyBufferMs?: number; } export declare function createAuth< Session extends AuthSession = AuthSession, >(config?: AuthConfig): AuthClient; export declare function Credentials< Session extends AuthSession = AuthSession, Input = Record, >( config: CredentialsConfig ): AuthProviderConfig; export declare function Google< Session extends AuthSession = AuthSession, Input extends GoogleInput = GoogleInput, >( config: GoogleConfig ): AuthProviderConfig; export declare function createMemoryStorage< Session extends AuthSession = AuthSession, >(initialSession?: Session | null): AuthStorage; export declare function createLocalStorageAdapter< Session extends AuthSession = AuthSession, >(options?: LocalStorageAdapterOptions): AuthStorage; export declare function AuthProvider< Session extends AuthSession = AuthSession, >(props: AuthProviderProps): any; export declare function ProtectedRoute< Session extends AuthSession = AuthSession, >(props: ProtectedRouteProps): any; export declare function useSession< Session extends AuthSession = AuthSession, >(): AuthClient; export declare const AuthContext: any; export declare const ACCESS_TOKEN_EXPIRY_FALLBACK_MS: number; export declare const ACCESS_TOKEN_EXPIRY_SAFETY_BUFFER_MS: number; export declare function decodeJwtPayload( token: string ): Record | null; export declare function getAccessTokenExpiry( accessToken: string, options?: AccessTokenExpiryOptions ): number;