@demokit-ai/auth 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +15 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -12,13 +12,27 @@ function AuthProvider({ children, provider }) {
|
|
|
12
12
|
const [session, setSession] = react.useState(null);
|
|
13
13
|
const [isLoading, setIsLoading] = react.useState(true);
|
|
14
14
|
react.useEffect(() => {
|
|
15
|
+
console.log("[AuthProvider] Initializing auth state...");
|
|
15
16
|
provider.getSession().then((session2) => {
|
|
17
|
+
console.log("[AuthProvider] Got session:", {
|
|
18
|
+
hasSession: !!session2,
|
|
19
|
+
userId: session2?.user?.id,
|
|
20
|
+
userEmail: session2?.user?.email
|
|
21
|
+
});
|
|
16
22
|
setSession(session2);
|
|
17
23
|
setUser(session2?.user ?? null);
|
|
24
|
+
}).catch((error) => {
|
|
25
|
+
console.error("[AuthProvider] Error getting session:", error);
|
|
18
26
|
}).finally(() => {
|
|
27
|
+
console.log("[AuthProvider] Setting isLoading to false");
|
|
19
28
|
setIsLoading(false);
|
|
20
29
|
});
|
|
21
|
-
const unsubscribe = provider.onAuthStateChange((
|
|
30
|
+
const unsubscribe = provider.onAuthStateChange((event, session2) => {
|
|
31
|
+
console.log("[AuthProvider] Auth state changed:", {
|
|
32
|
+
event,
|
|
33
|
+
hasSession: !!session2,
|
|
34
|
+
userId: session2?.user?.id
|
|
35
|
+
});
|
|
22
36
|
setSession(session2);
|
|
23
37
|
setUser(session2?.user ?? null);
|
|
24
38
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.tsx","../src/providers/supabase.ts","../src/providers/memory.ts"],"names":["createContext","useState","useEffect","session","useCallback","useMemo","jsx","useContext","createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from 'react'\nimport type {\n AuthProvider as IAuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n OAuthProvider,\n} from './types'\n\n/**\n * Context value provided by AuthProvider\n */\nexport interface AuthContextValue {\n /**\n * The current authenticated user, or null if not authenticated\n */\n user: AuthUser | null\n\n /**\n * The current session, or null if not authenticated\n */\n session: AuthSession | null\n\n /**\n * Whether the auth state is still loading\n */\n isLoading: boolean\n\n /**\n * Whether the user is authenticated\n */\n isAuthenticated: boolean\n\n /**\n * Sign in with email and password\n */\n signIn: (email: string, password: string) => Promise<AuthResult>\n\n /**\n * Sign up with email and password\n */\n signUp: (email: string, password: string, metadata?: Record<string, unknown>) => Promise<AuthResult>\n\n /**\n * Sign out the current user\n */\n signOut: () => Promise<void>\n\n /**\n * Sign in with an OAuth provider\n */\n signInWithOAuth: (provider: OAuthProvider, redirectTo?: string) => Promise<void>\n\n /**\n * Send a password reset email\n */\n resetPasswordForEmail: (email: string, redirectTo?: string) => Promise<void>\n}\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined)\n\nAuthContext.displayName = 'AuthContext'\n\n/**\n * Props for the AuthProvider component\n */\nexport interface AuthProviderProps {\n /**\n * Child components to render\n */\n children: ReactNode\n\n /**\n * The auth provider implementation to use\n */\n provider: IAuthProvider\n}\n\n/**\n * Provider component that manages authentication state\n *\n * @example\n * import { AuthProvider, createSupabaseAuthProvider } from '@demokit-ai/auth'\n *\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * function App() {\n * return (\n * <AuthProvider provider={authProvider}>\n * <YourApp />\n * </AuthProvider>\n * )\n * }\n */\nexport function AuthProvider({ children, provider }: AuthProviderProps) {\n const [user, setUser] = useState<AuthUser | null>(null)\n const [session, setSession] = useState<AuthSession | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n\n // Initialize auth state\n useEffect(() => {\n // Get initial session\n provider\n .getSession()\n .then((session) => {\n setSession(session)\n setUser(session?.user ?? null)\n })\n .finally(() => {\n setIsLoading(false)\n })\n\n // Subscribe to auth state changes\n const unsubscribe = provider.onAuthStateChange((_event, session) => {\n setSession(session)\n setUser(session?.user ?? null)\n })\n\n return unsubscribe\n }, [provider])\n\n const signIn = useCallback(\n async (email: string, password: string): Promise<AuthResult> => {\n return provider.signIn({ email, password })\n },\n [provider]\n )\n\n const signUp = useCallback(\n async (\n email: string,\n password: string,\n metadata?: Record<string, unknown>\n ): Promise<AuthResult> => {\n return provider.signUp({ email, password, metadata })\n },\n [provider]\n )\n\n const signOut = useCallback(async (): Promise<void> => {\n return provider.signOut()\n }, [provider])\n\n const signInWithOAuth = useCallback(\n async (providerName: OAuthProvider, redirectTo?: string): Promise<void> => {\n return provider.signInWithOAuth(providerName, redirectTo)\n },\n [provider]\n )\n\n const resetPasswordForEmail = useCallback(\n async (email: string, redirectTo?: string): Promise<void> => {\n return provider.resetPasswordForEmail(email, redirectTo)\n },\n [provider]\n )\n\n const value = useMemo<AuthContextValue>(\n () => ({\n user,\n session,\n isLoading,\n isAuthenticated: !!user,\n signIn,\n signUp,\n signOut,\n signInWithOAuth,\n resetPasswordForEmail,\n }),\n [user, session, isLoading, signIn, signUp, signOut, signInWithOAuth, resetPasswordForEmail]\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n\n/**\n * Hook to access authentication state and methods\n *\n * @throws Error if used outside of AuthProvider\n *\n * @example\n * function LoginButton() {\n * const { user, signIn, signOut, isLoading } = useAuth()\n *\n * if (isLoading) return <Loading />\n *\n * if (user) {\n * return <button onClick={signOut}>Sign Out</button>\n * }\n *\n * return <button onClick={() => signIn('user@example.com', 'password')}>Sign In</button>\n * }\n */\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext)\n\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider')\n }\n\n return context\n}\n\n/**\n * Hook to get the current user\n * Shorthand for useAuth().user\n */\nexport function useUser(): AuthUser | null {\n return useAuth().user\n}\n\n/**\n * Hook to get the current session\n * Shorthand for useAuth().session\n */\nexport function useSession(): AuthSession | null {\n return useAuth().session\n}\n\n/**\n * Hook to check if user is authenticated\n * Shorthand for useAuth().isAuthenticated\n */\nexport function useIsAuthenticated(): boolean {\n return useAuth().isAuthenticated\n}\n","import { createClient, type SupabaseClient, type User, type Session } from '@supabase/supabase-js'\nimport type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeEvent,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the Supabase auth provider\n */\nexport interface SupabaseAuthConfig {\n /**\n * Supabase project URL\n */\n supabaseUrl: string\n\n /**\n * Supabase anonymous/public key\n */\n supabaseAnonKey: string\n\n /**\n * Optional: existing Supabase client instance\n * If provided, supabaseUrl and supabaseAnonKey are ignored\n */\n client?: SupabaseClient\n}\n\n/**\n * Map Supabase user to AuthUser\n */\nfunction mapUser(user: User): AuthUser {\n return {\n id: user.id,\n email: user.email ?? null,\n name: user.user_metadata?.name ?? user.user_metadata?.full_name ?? null,\n avatarUrl: user.user_metadata?.avatar_url ?? null,\n metadata: user.user_metadata,\n }\n}\n\n/**\n * Map Supabase session to AuthSession\n */\nfunction mapSession(session: Session): AuthSession {\n return {\n accessToken: session.access_token,\n refreshToken: session.refresh_token,\n expiresAt: session.expires_at,\n user: mapUser(session.user),\n }\n}\n\n/**\n * Map Supabase auth event to AuthStateChangeEvent\n */\nfunction mapEvent(event: string): AuthStateChangeEvent {\n const eventMap: Record<string, AuthStateChangeEvent> = {\n SIGNED_IN: 'SIGNED_IN',\n SIGNED_OUT: 'SIGNED_OUT',\n TOKEN_REFRESHED: 'TOKEN_REFRESHED',\n USER_UPDATED: 'USER_UPDATED',\n PASSWORD_RECOVERY: 'PASSWORD_RECOVERY',\n INITIAL_SESSION: 'INITIAL_SESSION',\n }\n return eventMap[event] ?? 'SIGNED_IN'\n}\n\n/**\n * Create an auth provider using Supabase Auth\n *\n * @example\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * // Use in AuthProvider\n * <AuthProvider provider={authProvider}>\n * <App />\n * </AuthProvider>\n */\nexport function createSupabaseAuthProvider(config: SupabaseAuthConfig): AuthProvider {\n const supabase =\n config.client ?? createClient(config.supabaseUrl, config.supabaseAnonKey)\n\n return {\n async getSession(): Promise<AuthSession | null> {\n const {\n data: { session },\n error,\n } = await supabase.auth.getSession()\n\n if (error || !session) {\n return null\n }\n\n return mapSession(session)\n },\n\n async getUser(): Promise<AuthUser | null> {\n const {\n data: { user },\n error,\n } = await supabase.auth.getUser()\n\n if (error || !user) {\n return null\n }\n\n return mapUser(user)\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signInWithPassword({\n email,\n password,\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signUp({\n email,\n password,\n options: { data: metadata },\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signOut(): Promise<void> {\n await supabase.auth.signOut()\n },\n\n async signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void> {\n await supabase.auth.signInWithOAuth({\n provider,\n options: redirectTo ? { redirectTo } : undefined,\n })\n },\n\n async resetPasswordForEmail(email: string, redirectTo?: string): Promise<void> {\n await supabase.auth.resetPasswordForEmail(email, {\n redirectTo,\n })\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n const { error } = await supabase.auth.updateUser({\n password: newPassword,\n })\n\n if (error) {\n throw new Error(error.message)\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n const {\n data: { subscription },\n } = supabase.auth.onAuthStateChange((event, session) => {\n callback(mapEvent(event), session ? mapSession(session) : null)\n })\n\n return () => subscription.unsubscribe()\n },\n }\n}\n","import type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the memory auth provider\n */\nexport interface MemoryAuthConfig {\n /**\n * Pre-populated users for testing\n */\n users?: Map<string, { password: string; user: AuthUser }>\n\n /**\n * Initial session (for testing authenticated state)\n */\n initialSession?: AuthSession | null\n\n /**\n * Delay in ms to simulate network latency\n * @default 0\n */\n delay?: number\n}\n\n/**\n * Create an in-memory auth provider for testing\n *\n * This provider stores all data in memory and resets on page refresh.\n * Useful for unit tests and local development without a real auth backend.\n *\n * @example\n * const authProvider = createMemoryAuthProvider({\n * users: new Map([\n * ['test@example.com', {\n * password: 'password123',\n * user: { id: '1', email: 'test@example.com', name: 'Test User' }\n * }]\n * ])\n * })\n */\nexport function createMemoryAuthProvider(config: MemoryAuthConfig = {}): AuthProvider {\n const { users = new Map(), initialSession = null, delay = 0 } = config\n\n let currentSession: AuthSession | null = initialSession\n const listeners = new Set<AuthStateChangeCallback>()\n\n async function simulateDelay(): Promise<void> {\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n }\n\n function notifyListeners(\n event: 'SIGNED_IN' | 'SIGNED_OUT' | 'USER_UPDATED',\n session: AuthSession | null\n ): void {\n listeners.forEach((callback) => callback(event, session))\n }\n\n function generateToken(): string {\n return `mem_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`\n }\n\n return {\n async getSession(): Promise<AuthSession | null> {\n await simulateDelay()\n return currentSession\n },\n\n async getUser(): Promise<AuthUser | null> {\n await simulateDelay()\n return currentSession?.user ?? null\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n await simulateDelay()\n\n const userData = users.get(email)\n\n if (!userData) {\n return {\n user: null,\n session: null,\n error: { code: 'user_not_found', message: 'User not found' },\n }\n }\n\n if (userData.password !== password) {\n return {\n user: null,\n session: null,\n error: { code: 'invalid_credentials', message: 'Invalid password' },\n }\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: userData.user,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: userData.user, session, error: null }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n await simulateDelay()\n\n if (users.has(email)) {\n return {\n user: null,\n session: null,\n error: { code: 'user_exists', message: 'User already exists' },\n }\n }\n\n const newUser: AuthUser = {\n id: `user_${Date.now()}`,\n email,\n name: metadata?.name as string | undefined,\n avatarUrl: null,\n metadata,\n }\n\n users.set(email, { password, user: newUser })\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: newUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: newUser, session, error: null }\n },\n\n async signOut(): Promise<void> {\n await simulateDelay()\n currentSession = null\n notifyListeners('SIGNED_OUT', null)\n },\n\n async signInWithOAuth(_provider: OAuthProvider, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // In memory provider, OAuth is simulated by creating a mock user\n const mockUser: AuthUser = {\n id: `oauth_${Date.now()}`,\n email: 'oauth@example.com',\n name: 'OAuth User',\n avatarUrl: null,\n metadata: { provider: _provider },\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: mockUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n },\n\n async resetPasswordForEmail(_email: string, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // No-op in memory provider\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n await simulateDelay()\n\n if (!currentSession) {\n throw new Error('Not authenticated')\n }\n\n const email = currentSession.user.email\n if (!email) {\n throw new Error('User has no email')\n }\n\n const userData = users.get(email)\n if (userData) {\n users.set(email, { ...userData, password: newPassword })\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n listeners.add(callback)\n\n // Emit initial session event\n if (currentSession) {\n callback('INITIAL_SESSION', currentSession)\n }\n\n return () => {\n listeners.delete(callback)\n }\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx","../src/providers/supabase.ts","../src/providers/memory.ts"],"names":["createContext","useState","useEffect","session","useCallback","useMemo","jsx","useContext","createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from 'react'\nimport type {\n AuthProvider as IAuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n OAuthProvider,\n} from './types'\n\n/**\n * Context value provided by AuthProvider\n */\nexport interface AuthContextValue {\n /**\n * The current authenticated user, or null if not authenticated\n */\n user: AuthUser | null\n\n /**\n * The current session, or null if not authenticated\n */\n session: AuthSession | null\n\n /**\n * Whether the auth state is still loading\n */\n isLoading: boolean\n\n /**\n * Whether the user is authenticated\n */\n isAuthenticated: boolean\n\n /**\n * Sign in with email and password\n */\n signIn: (email: string, password: string) => Promise<AuthResult>\n\n /**\n * Sign up with email and password\n */\n signUp: (email: string, password: string, metadata?: Record<string, unknown>) => Promise<AuthResult>\n\n /**\n * Sign out the current user\n */\n signOut: () => Promise<void>\n\n /**\n * Sign in with an OAuth provider\n */\n signInWithOAuth: (provider: OAuthProvider, redirectTo?: string) => Promise<void>\n\n /**\n * Send a password reset email\n */\n resetPasswordForEmail: (email: string, redirectTo?: string) => Promise<void>\n}\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined)\n\nAuthContext.displayName = 'AuthContext'\n\n/**\n * Props for the AuthProvider component\n */\nexport interface AuthProviderProps {\n /**\n * Child components to render\n */\n children: ReactNode\n\n /**\n * The auth provider implementation to use\n */\n provider: IAuthProvider\n}\n\n/**\n * Provider component that manages authentication state\n *\n * @example\n * import { AuthProvider, createSupabaseAuthProvider } from '@demokit-ai/auth'\n *\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * function App() {\n * return (\n * <AuthProvider provider={authProvider}>\n * <YourApp />\n * </AuthProvider>\n * )\n * }\n */\nexport function AuthProvider({ children, provider }: AuthProviderProps) {\n const [user, setUser] = useState<AuthUser | null>(null)\n const [session, setSession] = useState<AuthSession | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n\n // Initialize auth state\n useEffect(() => {\n console.log('[AuthProvider] Initializing auth state...')\n\n // Get initial session\n provider\n .getSession()\n .then((session) => {\n console.log('[AuthProvider] Got session:', {\n hasSession: !!session,\n userId: session?.user?.id,\n userEmail: session?.user?.email,\n })\n setSession(session)\n setUser(session?.user ?? null)\n })\n .catch((error) => {\n console.error('[AuthProvider] Error getting session:', error)\n })\n .finally(() => {\n console.log('[AuthProvider] Setting isLoading to false')\n setIsLoading(false)\n })\n\n // Subscribe to auth state changes\n const unsubscribe = provider.onAuthStateChange((event, session) => {\n console.log('[AuthProvider] Auth state changed:', {\n event,\n hasSession: !!session,\n userId: session?.user?.id,\n })\n setSession(session)\n setUser(session?.user ?? null)\n })\n\n return unsubscribe\n }, [provider])\n\n const signIn = useCallback(\n async (email: string, password: string): Promise<AuthResult> => {\n return provider.signIn({ email, password })\n },\n [provider]\n )\n\n const signUp = useCallback(\n async (\n email: string,\n password: string,\n metadata?: Record<string, unknown>\n ): Promise<AuthResult> => {\n return provider.signUp({ email, password, metadata })\n },\n [provider]\n )\n\n const signOut = useCallback(async (): Promise<void> => {\n return provider.signOut()\n }, [provider])\n\n const signInWithOAuth = useCallback(\n async (providerName: OAuthProvider, redirectTo?: string): Promise<void> => {\n return provider.signInWithOAuth(providerName, redirectTo)\n },\n [provider]\n )\n\n const resetPasswordForEmail = useCallback(\n async (email: string, redirectTo?: string): Promise<void> => {\n return provider.resetPasswordForEmail(email, redirectTo)\n },\n [provider]\n )\n\n const value = useMemo<AuthContextValue>(\n () => ({\n user,\n session,\n isLoading,\n isAuthenticated: !!user,\n signIn,\n signUp,\n signOut,\n signInWithOAuth,\n resetPasswordForEmail,\n }),\n [user, session, isLoading, signIn, signUp, signOut, signInWithOAuth, resetPasswordForEmail]\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n\n/**\n * Hook to access authentication state and methods\n *\n * @throws Error if used outside of AuthProvider\n *\n * @example\n * function LoginButton() {\n * const { user, signIn, signOut, isLoading } = useAuth()\n *\n * if (isLoading) return <Loading />\n *\n * if (user) {\n * return <button onClick={signOut}>Sign Out</button>\n * }\n *\n * return <button onClick={() => signIn('user@example.com', 'password')}>Sign In</button>\n * }\n */\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext)\n\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider')\n }\n\n return context\n}\n\n/**\n * Hook to get the current user\n * Shorthand for useAuth().user\n */\nexport function useUser(): AuthUser | null {\n return useAuth().user\n}\n\n/**\n * Hook to get the current session\n * Shorthand for useAuth().session\n */\nexport function useSession(): AuthSession | null {\n return useAuth().session\n}\n\n/**\n * Hook to check if user is authenticated\n * Shorthand for useAuth().isAuthenticated\n */\nexport function useIsAuthenticated(): boolean {\n return useAuth().isAuthenticated\n}\n","import { createClient, type SupabaseClient, type User, type Session } from '@supabase/supabase-js'\nimport type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeEvent,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the Supabase auth provider\n */\nexport interface SupabaseAuthConfig {\n /**\n * Supabase project URL\n */\n supabaseUrl: string\n\n /**\n * Supabase anonymous/public key\n */\n supabaseAnonKey: string\n\n /**\n * Optional: existing Supabase client instance\n * If provided, supabaseUrl and supabaseAnonKey are ignored\n */\n client?: SupabaseClient\n}\n\n/**\n * Map Supabase user to AuthUser\n */\nfunction mapUser(user: User): AuthUser {\n return {\n id: user.id,\n email: user.email ?? null,\n name: user.user_metadata?.name ?? user.user_metadata?.full_name ?? null,\n avatarUrl: user.user_metadata?.avatar_url ?? null,\n metadata: user.user_metadata,\n }\n}\n\n/**\n * Map Supabase session to AuthSession\n */\nfunction mapSession(session: Session): AuthSession {\n return {\n accessToken: session.access_token,\n refreshToken: session.refresh_token,\n expiresAt: session.expires_at,\n user: mapUser(session.user),\n }\n}\n\n/**\n * Map Supabase auth event to AuthStateChangeEvent\n */\nfunction mapEvent(event: string): AuthStateChangeEvent {\n const eventMap: Record<string, AuthStateChangeEvent> = {\n SIGNED_IN: 'SIGNED_IN',\n SIGNED_OUT: 'SIGNED_OUT',\n TOKEN_REFRESHED: 'TOKEN_REFRESHED',\n USER_UPDATED: 'USER_UPDATED',\n PASSWORD_RECOVERY: 'PASSWORD_RECOVERY',\n INITIAL_SESSION: 'INITIAL_SESSION',\n }\n return eventMap[event] ?? 'SIGNED_IN'\n}\n\n/**\n * Create an auth provider using Supabase Auth\n *\n * @example\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * // Use in AuthProvider\n * <AuthProvider provider={authProvider}>\n * <App />\n * </AuthProvider>\n */\nexport function createSupabaseAuthProvider(config: SupabaseAuthConfig): AuthProvider {\n const supabase =\n config.client ?? createClient(config.supabaseUrl, config.supabaseAnonKey)\n\n return {\n async getSession(): Promise<AuthSession | null> {\n const {\n data: { session },\n error,\n } = await supabase.auth.getSession()\n\n if (error || !session) {\n return null\n }\n\n return mapSession(session)\n },\n\n async getUser(): Promise<AuthUser | null> {\n const {\n data: { user },\n error,\n } = await supabase.auth.getUser()\n\n if (error || !user) {\n return null\n }\n\n return mapUser(user)\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signInWithPassword({\n email,\n password,\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signUp({\n email,\n password,\n options: { data: metadata },\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signOut(): Promise<void> {\n await supabase.auth.signOut()\n },\n\n async signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void> {\n await supabase.auth.signInWithOAuth({\n provider,\n options: redirectTo ? { redirectTo } : undefined,\n })\n },\n\n async resetPasswordForEmail(email: string, redirectTo?: string): Promise<void> {\n await supabase.auth.resetPasswordForEmail(email, {\n redirectTo,\n })\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n const { error } = await supabase.auth.updateUser({\n password: newPassword,\n })\n\n if (error) {\n throw new Error(error.message)\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n const {\n data: { subscription },\n } = supabase.auth.onAuthStateChange((event, session) => {\n callback(mapEvent(event), session ? mapSession(session) : null)\n })\n\n return () => subscription.unsubscribe()\n },\n }\n}\n","import type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the memory auth provider\n */\nexport interface MemoryAuthConfig {\n /**\n * Pre-populated users for testing\n */\n users?: Map<string, { password: string; user: AuthUser }>\n\n /**\n * Initial session (for testing authenticated state)\n */\n initialSession?: AuthSession | null\n\n /**\n * Delay in ms to simulate network latency\n * @default 0\n */\n delay?: number\n}\n\n/**\n * Create an in-memory auth provider for testing\n *\n * This provider stores all data in memory and resets on page refresh.\n * Useful for unit tests and local development without a real auth backend.\n *\n * @example\n * const authProvider = createMemoryAuthProvider({\n * users: new Map([\n * ['test@example.com', {\n * password: 'password123',\n * user: { id: '1', email: 'test@example.com', name: 'Test User' }\n * }]\n * ])\n * })\n */\nexport function createMemoryAuthProvider(config: MemoryAuthConfig = {}): AuthProvider {\n const { users = new Map(), initialSession = null, delay = 0 } = config\n\n let currentSession: AuthSession | null = initialSession\n const listeners = new Set<AuthStateChangeCallback>()\n\n async function simulateDelay(): Promise<void> {\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n }\n\n function notifyListeners(\n event: 'SIGNED_IN' | 'SIGNED_OUT' | 'USER_UPDATED',\n session: AuthSession | null\n ): void {\n listeners.forEach((callback) => callback(event, session))\n }\n\n function generateToken(): string {\n return `mem_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`\n }\n\n return {\n async getSession(): Promise<AuthSession | null> {\n await simulateDelay()\n return currentSession\n },\n\n async getUser(): Promise<AuthUser | null> {\n await simulateDelay()\n return currentSession?.user ?? null\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n await simulateDelay()\n\n const userData = users.get(email)\n\n if (!userData) {\n return {\n user: null,\n session: null,\n error: { code: 'user_not_found', message: 'User not found' },\n }\n }\n\n if (userData.password !== password) {\n return {\n user: null,\n session: null,\n error: { code: 'invalid_credentials', message: 'Invalid password' },\n }\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: userData.user,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: userData.user, session, error: null }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n await simulateDelay()\n\n if (users.has(email)) {\n return {\n user: null,\n session: null,\n error: { code: 'user_exists', message: 'User already exists' },\n }\n }\n\n const newUser: AuthUser = {\n id: `user_${Date.now()}`,\n email,\n name: metadata?.name as string | undefined,\n avatarUrl: null,\n metadata,\n }\n\n users.set(email, { password, user: newUser })\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: newUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: newUser, session, error: null }\n },\n\n async signOut(): Promise<void> {\n await simulateDelay()\n currentSession = null\n notifyListeners('SIGNED_OUT', null)\n },\n\n async signInWithOAuth(_provider: OAuthProvider, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // In memory provider, OAuth is simulated by creating a mock user\n const mockUser: AuthUser = {\n id: `oauth_${Date.now()}`,\n email: 'oauth@example.com',\n name: 'OAuth User',\n avatarUrl: null,\n metadata: { provider: _provider },\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: mockUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n },\n\n async resetPasswordForEmail(_email: string, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // No-op in memory provider\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n await simulateDelay()\n\n if (!currentSession) {\n throw new Error('Not authenticated')\n }\n\n const email = currentSession.user.email\n if (!email) {\n throw new Error('User has no email')\n }\n\n const userData = users.get(email)\n if (userData) {\n users.set(email, { ...userData, password: newPassword })\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n listeners.add(callback)\n\n // Emit initial session event\n if (currentSession) {\n callback('INITIAL_SESSION', currentSession)\n }\n\n return () => {\n listeners.delete(callback)\n }\n },\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -10,13 +10,27 @@ function AuthProvider({ children, provider }) {
|
|
|
10
10
|
const [session, setSession] = useState(null);
|
|
11
11
|
const [isLoading, setIsLoading] = useState(true);
|
|
12
12
|
useEffect(() => {
|
|
13
|
+
console.log("[AuthProvider] Initializing auth state...");
|
|
13
14
|
provider.getSession().then((session2) => {
|
|
15
|
+
console.log("[AuthProvider] Got session:", {
|
|
16
|
+
hasSession: !!session2,
|
|
17
|
+
userId: session2?.user?.id,
|
|
18
|
+
userEmail: session2?.user?.email
|
|
19
|
+
});
|
|
14
20
|
setSession(session2);
|
|
15
21
|
setUser(session2?.user ?? null);
|
|
22
|
+
}).catch((error) => {
|
|
23
|
+
console.error("[AuthProvider] Error getting session:", error);
|
|
16
24
|
}).finally(() => {
|
|
25
|
+
console.log("[AuthProvider] Setting isLoading to false");
|
|
17
26
|
setIsLoading(false);
|
|
18
27
|
});
|
|
19
|
-
const unsubscribe = provider.onAuthStateChange((
|
|
28
|
+
const unsubscribe = provider.onAuthStateChange((event, session2) => {
|
|
29
|
+
console.log("[AuthProvider] Auth state changed:", {
|
|
30
|
+
event,
|
|
31
|
+
hasSession: !!session2,
|
|
32
|
+
userId: session2?.user?.id
|
|
33
|
+
});
|
|
20
34
|
setSession(session2);
|
|
21
35
|
setUser(session2?.user ?? null);
|
|
22
36
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.tsx","../src/providers/supabase.ts","../src/providers/memory.ts"],"names":["session"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from 'react'\nimport type {\n AuthProvider as IAuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n OAuthProvider,\n} from './types'\n\n/**\n * Context value provided by AuthProvider\n */\nexport interface AuthContextValue {\n /**\n * The current authenticated user, or null if not authenticated\n */\n user: AuthUser | null\n\n /**\n * The current session, or null if not authenticated\n */\n session: AuthSession | null\n\n /**\n * Whether the auth state is still loading\n */\n isLoading: boolean\n\n /**\n * Whether the user is authenticated\n */\n isAuthenticated: boolean\n\n /**\n * Sign in with email and password\n */\n signIn: (email: string, password: string) => Promise<AuthResult>\n\n /**\n * Sign up with email and password\n */\n signUp: (email: string, password: string, metadata?: Record<string, unknown>) => Promise<AuthResult>\n\n /**\n * Sign out the current user\n */\n signOut: () => Promise<void>\n\n /**\n * Sign in with an OAuth provider\n */\n signInWithOAuth: (provider: OAuthProvider, redirectTo?: string) => Promise<void>\n\n /**\n * Send a password reset email\n */\n resetPasswordForEmail: (email: string, redirectTo?: string) => Promise<void>\n}\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined)\n\nAuthContext.displayName = 'AuthContext'\n\n/**\n * Props for the AuthProvider component\n */\nexport interface AuthProviderProps {\n /**\n * Child components to render\n */\n children: ReactNode\n\n /**\n * The auth provider implementation to use\n */\n provider: IAuthProvider\n}\n\n/**\n * Provider component that manages authentication state\n *\n * @example\n * import { AuthProvider, createSupabaseAuthProvider } from '@demokit-ai/auth'\n *\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * function App() {\n * return (\n * <AuthProvider provider={authProvider}>\n * <YourApp />\n * </AuthProvider>\n * )\n * }\n */\nexport function AuthProvider({ children, provider }: AuthProviderProps) {\n const [user, setUser] = useState<AuthUser | null>(null)\n const [session, setSession] = useState<AuthSession | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n\n // Initialize auth state\n useEffect(() => {\n // Get initial session\n provider\n .getSession()\n .then((session) => {\n setSession(session)\n setUser(session?.user ?? null)\n })\n .finally(() => {\n setIsLoading(false)\n })\n\n // Subscribe to auth state changes\n const unsubscribe = provider.onAuthStateChange((_event, session) => {\n setSession(session)\n setUser(session?.user ?? null)\n })\n\n return unsubscribe\n }, [provider])\n\n const signIn = useCallback(\n async (email: string, password: string): Promise<AuthResult> => {\n return provider.signIn({ email, password })\n },\n [provider]\n )\n\n const signUp = useCallback(\n async (\n email: string,\n password: string,\n metadata?: Record<string, unknown>\n ): Promise<AuthResult> => {\n return provider.signUp({ email, password, metadata })\n },\n [provider]\n )\n\n const signOut = useCallback(async (): Promise<void> => {\n return provider.signOut()\n }, [provider])\n\n const signInWithOAuth = useCallback(\n async (providerName: OAuthProvider, redirectTo?: string): Promise<void> => {\n return provider.signInWithOAuth(providerName, redirectTo)\n },\n [provider]\n )\n\n const resetPasswordForEmail = useCallback(\n async (email: string, redirectTo?: string): Promise<void> => {\n return provider.resetPasswordForEmail(email, redirectTo)\n },\n [provider]\n )\n\n const value = useMemo<AuthContextValue>(\n () => ({\n user,\n session,\n isLoading,\n isAuthenticated: !!user,\n signIn,\n signUp,\n signOut,\n signInWithOAuth,\n resetPasswordForEmail,\n }),\n [user, session, isLoading, signIn, signUp, signOut, signInWithOAuth, resetPasswordForEmail]\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n\n/**\n * Hook to access authentication state and methods\n *\n * @throws Error if used outside of AuthProvider\n *\n * @example\n * function LoginButton() {\n * const { user, signIn, signOut, isLoading } = useAuth()\n *\n * if (isLoading) return <Loading />\n *\n * if (user) {\n * return <button onClick={signOut}>Sign Out</button>\n * }\n *\n * return <button onClick={() => signIn('user@example.com', 'password')}>Sign In</button>\n * }\n */\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext)\n\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider')\n }\n\n return context\n}\n\n/**\n * Hook to get the current user\n * Shorthand for useAuth().user\n */\nexport function useUser(): AuthUser | null {\n return useAuth().user\n}\n\n/**\n * Hook to get the current session\n * Shorthand for useAuth().session\n */\nexport function useSession(): AuthSession | null {\n return useAuth().session\n}\n\n/**\n * Hook to check if user is authenticated\n * Shorthand for useAuth().isAuthenticated\n */\nexport function useIsAuthenticated(): boolean {\n return useAuth().isAuthenticated\n}\n","import { createClient, type SupabaseClient, type User, type Session } from '@supabase/supabase-js'\nimport type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeEvent,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the Supabase auth provider\n */\nexport interface SupabaseAuthConfig {\n /**\n * Supabase project URL\n */\n supabaseUrl: string\n\n /**\n * Supabase anonymous/public key\n */\n supabaseAnonKey: string\n\n /**\n * Optional: existing Supabase client instance\n * If provided, supabaseUrl and supabaseAnonKey are ignored\n */\n client?: SupabaseClient\n}\n\n/**\n * Map Supabase user to AuthUser\n */\nfunction mapUser(user: User): AuthUser {\n return {\n id: user.id,\n email: user.email ?? null,\n name: user.user_metadata?.name ?? user.user_metadata?.full_name ?? null,\n avatarUrl: user.user_metadata?.avatar_url ?? null,\n metadata: user.user_metadata,\n }\n}\n\n/**\n * Map Supabase session to AuthSession\n */\nfunction mapSession(session: Session): AuthSession {\n return {\n accessToken: session.access_token,\n refreshToken: session.refresh_token,\n expiresAt: session.expires_at,\n user: mapUser(session.user),\n }\n}\n\n/**\n * Map Supabase auth event to AuthStateChangeEvent\n */\nfunction mapEvent(event: string): AuthStateChangeEvent {\n const eventMap: Record<string, AuthStateChangeEvent> = {\n SIGNED_IN: 'SIGNED_IN',\n SIGNED_OUT: 'SIGNED_OUT',\n TOKEN_REFRESHED: 'TOKEN_REFRESHED',\n USER_UPDATED: 'USER_UPDATED',\n PASSWORD_RECOVERY: 'PASSWORD_RECOVERY',\n INITIAL_SESSION: 'INITIAL_SESSION',\n }\n return eventMap[event] ?? 'SIGNED_IN'\n}\n\n/**\n * Create an auth provider using Supabase Auth\n *\n * @example\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * // Use in AuthProvider\n * <AuthProvider provider={authProvider}>\n * <App />\n * </AuthProvider>\n */\nexport function createSupabaseAuthProvider(config: SupabaseAuthConfig): AuthProvider {\n const supabase =\n config.client ?? createClient(config.supabaseUrl, config.supabaseAnonKey)\n\n return {\n async getSession(): Promise<AuthSession | null> {\n const {\n data: { session },\n error,\n } = await supabase.auth.getSession()\n\n if (error || !session) {\n return null\n }\n\n return mapSession(session)\n },\n\n async getUser(): Promise<AuthUser | null> {\n const {\n data: { user },\n error,\n } = await supabase.auth.getUser()\n\n if (error || !user) {\n return null\n }\n\n return mapUser(user)\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signInWithPassword({\n email,\n password,\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signUp({\n email,\n password,\n options: { data: metadata },\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signOut(): Promise<void> {\n await supabase.auth.signOut()\n },\n\n async signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void> {\n await supabase.auth.signInWithOAuth({\n provider,\n options: redirectTo ? { redirectTo } : undefined,\n })\n },\n\n async resetPasswordForEmail(email: string, redirectTo?: string): Promise<void> {\n await supabase.auth.resetPasswordForEmail(email, {\n redirectTo,\n })\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n const { error } = await supabase.auth.updateUser({\n password: newPassword,\n })\n\n if (error) {\n throw new Error(error.message)\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n const {\n data: { subscription },\n } = supabase.auth.onAuthStateChange((event, session) => {\n callback(mapEvent(event), session ? mapSession(session) : null)\n })\n\n return () => subscription.unsubscribe()\n },\n }\n}\n","import type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the memory auth provider\n */\nexport interface MemoryAuthConfig {\n /**\n * Pre-populated users for testing\n */\n users?: Map<string, { password: string; user: AuthUser }>\n\n /**\n * Initial session (for testing authenticated state)\n */\n initialSession?: AuthSession | null\n\n /**\n * Delay in ms to simulate network latency\n * @default 0\n */\n delay?: number\n}\n\n/**\n * Create an in-memory auth provider for testing\n *\n * This provider stores all data in memory and resets on page refresh.\n * Useful for unit tests and local development without a real auth backend.\n *\n * @example\n * const authProvider = createMemoryAuthProvider({\n * users: new Map([\n * ['test@example.com', {\n * password: 'password123',\n * user: { id: '1', email: 'test@example.com', name: 'Test User' }\n * }]\n * ])\n * })\n */\nexport function createMemoryAuthProvider(config: MemoryAuthConfig = {}): AuthProvider {\n const { users = new Map(), initialSession = null, delay = 0 } = config\n\n let currentSession: AuthSession | null = initialSession\n const listeners = new Set<AuthStateChangeCallback>()\n\n async function simulateDelay(): Promise<void> {\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n }\n\n function notifyListeners(\n event: 'SIGNED_IN' | 'SIGNED_OUT' | 'USER_UPDATED',\n session: AuthSession | null\n ): void {\n listeners.forEach((callback) => callback(event, session))\n }\n\n function generateToken(): string {\n return `mem_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`\n }\n\n return {\n async getSession(): Promise<AuthSession | null> {\n await simulateDelay()\n return currentSession\n },\n\n async getUser(): Promise<AuthUser | null> {\n await simulateDelay()\n return currentSession?.user ?? null\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n await simulateDelay()\n\n const userData = users.get(email)\n\n if (!userData) {\n return {\n user: null,\n session: null,\n error: { code: 'user_not_found', message: 'User not found' },\n }\n }\n\n if (userData.password !== password) {\n return {\n user: null,\n session: null,\n error: { code: 'invalid_credentials', message: 'Invalid password' },\n }\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: userData.user,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: userData.user, session, error: null }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n await simulateDelay()\n\n if (users.has(email)) {\n return {\n user: null,\n session: null,\n error: { code: 'user_exists', message: 'User already exists' },\n }\n }\n\n const newUser: AuthUser = {\n id: `user_${Date.now()}`,\n email,\n name: metadata?.name as string | undefined,\n avatarUrl: null,\n metadata,\n }\n\n users.set(email, { password, user: newUser })\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: newUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: newUser, session, error: null }\n },\n\n async signOut(): Promise<void> {\n await simulateDelay()\n currentSession = null\n notifyListeners('SIGNED_OUT', null)\n },\n\n async signInWithOAuth(_provider: OAuthProvider, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // In memory provider, OAuth is simulated by creating a mock user\n const mockUser: AuthUser = {\n id: `oauth_${Date.now()}`,\n email: 'oauth@example.com',\n name: 'OAuth User',\n avatarUrl: null,\n metadata: { provider: _provider },\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: mockUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n },\n\n async resetPasswordForEmail(_email: string, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // No-op in memory provider\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n await simulateDelay()\n\n if (!currentSession) {\n throw new Error('Not authenticated')\n }\n\n const email = currentSession.user.email\n if (!email) {\n throw new Error('User has no email')\n }\n\n const userData = users.get(email)\n if (userData) {\n users.set(email, { ...userData, password: newPassword })\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n listeners.add(callback)\n\n // Emit initial session event\n if (currentSession) {\n callback('INITIAL_SESSION', currentSession)\n }\n\n return () => {\n listeners.delete(callback)\n }\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx","../src/providers/supabase.ts","../src/providers/memory.ts"],"names":["session"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from 'react'\nimport type {\n AuthProvider as IAuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n OAuthProvider,\n} from './types'\n\n/**\n * Context value provided by AuthProvider\n */\nexport interface AuthContextValue {\n /**\n * The current authenticated user, or null if not authenticated\n */\n user: AuthUser | null\n\n /**\n * The current session, or null if not authenticated\n */\n session: AuthSession | null\n\n /**\n * Whether the auth state is still loading\n */\n isLoading: boolean\n\n /**\n * Whether the user is authenticated\n */\n isAuthenticated: boolean\n\n /**\n * Sign in with email and password\n */\n signIn: (email: string, password: string) => Promise<AuthResult>\n\n /**\n * Sign up with email and password\n */\n signUp: (email: string, password: string, metadata?: Record<string, unknown>) => Promise<AuthResult>\n\n /**\n * Sign out the current user\n */\n signOut: () => Promise<void>\n\n /**\n * Sign in with an OAuth provider\n */\n signInWithOAuth: (provider: OAuthProvider, redirectTo?: string) => Promise<void>\n\n /**\n * Send a password reset email\n */\n resetPasswordForEmail: (email: string, redirectTo?: string) => Promise<void>\n}\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined)\n\nAuthContext.displayName = 'AuthContext'\n\n/**\n * Props for the AuthProvider component\n */\nexport interface AuthProviderProps {\n /**\n * Child components to render\n */\n children: ReactNode\n\n /**\n * The auth provider implementation to use\n */\n provider: IAuthProvider\n}\n\n/**\n * Provider component that manages authentication state\n *\n * @example\n * import { AuthProvider, createSupabaseAuthProvider } from '@demokit-ai/auth'\n *\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * function App() {\n * return (\n * <AuthProvider provider={authProvider}>\n * <YourApp />\n * </AuthProvider>\n * )\n * }\n */\nexport function AuthProvider({ children, provider }: AuthProviderProps) {\n const [user, setUser] = useState<AuthUser | null>(null)\n const [session, setSession] = useState<AuthSession | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n\n // Initialize auth state\n useEffect(() => {\n console.log('[AuthProvider] Initializing auth state...')\n\n // Get initial session\n provider\n .getSession()\n .then((session) => {\n console.log('[AuthProvider] Got session:', {\n hasSession: !!session,\n userId: session?.user?.id,\n userEmail: session?.user?.email,\n })\n setSession(session)\n setUser(session?.user ?? null)\n })\n .catch((error) => {\n console.error('[AuthProvider] Error getting session:', error)\n })\n .finally(() => {\n console.log('[AuthProvider] Setting isLoading to false')\n setIsLoading(false)\n })\n\n // Subscribe to auth state changes\n const unsubscribe = provider.onAuthStateChange((event, session) => {\n console.log('[AuthProvider] Auth state changed:', {\n event,\n hasSession: !!session,\n userId: session?.user?.id,\n })\n setSession(session)\n setUser(session?.user ?? null)\n })\n\n return unsubscribe\n }, [provider])\n\n const signIn = useCallback(\n async (email: string, password: string): Promise<AuthResult> => {\n return provider.signIn({ email, password })\n },\n [provider]\n )\n\n const signUp = useCallback(\n async (\n email: string,\n password: string,\n metadata?: Record<string, unknown>\n ): Promise<AuthResult> => {\n return provider.signUp({ email, password, metadata })\n },\n [provider]\n )\n\n const signOut = useCallback(async (): Promise<void> => {\n return provider.signOut()\n }, [provider])\n\n const signInWithOAuth = useCallback(\n async (providerName: OAuthProvider, redirectTo?: string): Promise<void> => {\n return provider.signInWithOAuth(providerName, redirectTo)\n },\n [provider]\n )\n\n const resetPasswordForEmail = useCallback(\n async (email: string, redirectTo?: string): Promise<void> => {\n return provider.resetPasswordForEmail(email, redirectTo)\n },\n [provider]\n )\n\n const value = useMemo<AuthContextValue>(\n () => ({\n user,\n session,\n isLoading,\n isAuthenticated: !!user,\n signIn,\n signUp,\n signOut,\n signInWithOAuth,\n resetPasswordForEmail,\n }),\n [user, session, isLoading, signIn, signUp, signOut, signInWithOAuth, resetPasswordForEmail]\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n\n/**\n * Hook to access authentication state and methods\n *\n * @throws Error if used outside of AuthProvider\n *\n * @example\n * function LoginButton() {\n * const { user, signIn, signOut, isLoading } = useAuth()\n *\n * if (isLoading) return <Loading />\n *\n * if (user) {\n * return <button onClick={signOut}>Sign Out</button>\n * }\n *\n * return <button onClick={() => signIn('user@example.com', 'password')}>Sign In</button>\n * }\n */\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext)\n\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider')\n }\n\n return context\n}\n\n/**\n * Hook to get the current user\n * Shorthand for useAuth().user\n */\nexport function useUser(): AuthUser | null {\n return useAuth().user\n}\n\n/**\n * Hook to get the current session\n * Shorthand for useAuth().session\n */\nexport function useSession(): AuthSession | null {\n return useAuth().session\n}\n\n/**\n * Hook to check if user is authenticated\n * Shorthand for useAuth().isAuthenticated\n */\nexport function useIsAuthenticated(): boolean {\n return useAuth().isAuthenticated\n}\n","import { createClient, type SupabaseClient, type User, type Session } from '@supabase/supabase-js'\nimport type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeEvent,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the Supabase auth provider\n */\nexport interface SupabaseAuthConfig {\n /**\n * Supabase project URL\n */\n supabaseUrl: string\n\n /**\n * Supabase anonymous/public key\n */\n supabaseAnonKey: string\n\n /**\n * Optional: existing Supabase client instance\n * If provided, supabaseUrl and supabaseAnonKey are ignored\n */\n client?: SupabaseClient\n}\n\n/**\n * Map Supabase user to AuthUser\n */\nfunction mapUser(user: User): AuthUser {\n return {\n id: user.id,\n email: user.email ?? null,\n name: user.user_metadata?.name ?? user.user_metadata?.full_name ?? null,\n avatarUrl: user.user_metadata?.avatar_url ?? null,\n metadata: user.user_metadata,\n }\n}\n\n/**\n * Map Supabase session to AuthSession\n */\nfunction mapSession(session: Session): AuthSession {\n return {\n accessToken: session.access_token,\n refreshToken: session.refresh_token,\n expiresAt: session.expires_at,\n user: mapUser(session.user),\n }\n}\n\n/**\n * Map Supabase auth event to AuthStateChangeEvent\n */\nfunction mapEvent(event: string): AuthStateChangeEvent {\n const eventMap: Record<string, AuthStateChangeEvent> = {\n SIGNED_IN: 'SIGNED_IN',\n SIGNED_OUT: 'SIGNED_OUT',\n TOKEN_REFRESHED: 'TOKEN_REFRESHED',\n USER_UPDATED: 'USER_UPDATED',\n PASSWORD_RECOVERY: 'PASSWORD_RECOVERY',\n INITIAL_SESSION: 'INITIAL_SESSION',\n }\n return eventMap[event] ?? 'SIGNED_IN'\n}\n\n/**\n * Create an auth provider using Supabase Auth\n *\n * @example\n * const authProvider = createSupabaseAuthProvider({\n * supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL!,\n * supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n * })\n *\n * // Use in AuthProvider\n * <AuthProvider provider={authProvider}>\n * <App />\n * </AuthProvider>\n */\nexport function createSupabaseAuthProvider(config: SupabaseAuthConfig): AuthProvider {\n const supabase =\n config.client ?? createClient(config.supabaseUrl, config.supabaseAnonKey)\n\n return {\n async getSession(): Promise<AuthSession | null> {\n const {\n data: { session },\n error,\n } = await supabase.auth.getSession()\n\n if (error || !session) {\n return null\n }\n\n return mapSession(session)\n },\n\n async getUser(): Promise<AuthUser | null> {\n const {\n data: { user },\n error,\n } = await supabase.auth.getUser()\n\n if (error || !user) {\n return null\n }\n\n return mapUser(user)\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signInWithPassword({\n email,\n password,\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n const { data, error } = await supabase.auth.signUp({\n email,\n password,\n options: { data: metadata },\n })\n\n return {\n user: data.user ? mapUser(data.user) : null,\n session: data.session ? mapSession(data.session) : null,\n error: error ? { code: error.name, message: error.message } : null,\n }\n },\n\n async signOut(): Promise<void> {\n await supabase.auth.signOut()\n },\n\n async signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void> {\n await supabase.auth.signInWithOAuth({\n provider,\n options: redirectTo ? { redirectTo } : undefined,\n })\n },\n\n async resetPasswordForEmail(email: string, redirectTo?: string): Promise<void> {\n await supabase.auth.resetPasswordForEmail(email, {\n redirectTo,\n })\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n const { error } = await supabase.auth.updateUser({\n password: newPassword,\n })\n\n if (error) {\n throw new Error(error.message)\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n const {\n data: { subscription },\n } = supabase.auth.onAuthStateChange((event, session) => {\n callback(mapEvent(event), session ? mapSession(session) : null)\n })\n\n return () => subscription.unsubscribe()\n },\n }\n}\n","import type {\n AuthProvider,\n AuthUser,\n AuthSession,\n AuthResult,\n AuthStateChangeCallback,\n SignInOptions,\n SignUpOptions,\n OAuthProvider,\n} from '../types'\n\n/**\n * Configuration for the memory auth provider\n */\nexport interface MemoryAuthConfig {\n /**\n * Pre-populated users for testing\n */\n users?: Map<string, { password: string; user: AuthUser }>\n\n /**\n * Initial session (for testing authenticated state)\n */\n initialSession?: AuthSession | null\n\n /**\n * Delay in ms to simulate network latency\n * @default 0\n */\n delay?: number\n}\n\n/**\n * Create an in-memory auth provider for testing\n *\n * This provider stores all data in memory and resets on page refresh.\n * Useful for unit tests and local development without a real auth backend.\n *\n * @example\n * const authProvider = createMemoryAuthProvider({\n * users: new Map([\n * ['test@example.com', {\n * password: 'password123',\n * user: { id: '1', email: 'test@example.com', name: 'Test User' }\n * }]\n * ])\n * })\n */\nexport function createMemoryAuthProvider(config: MemoryAuthConfig = {}): AuthProvider {\n const { users = new Map(), initialSession = null, delay = 0 } = config\n\n let currentSession: AuthSession | null = initialSession\n const listeners = new Set<AuthStateChangeCallback>()\n\n async function simulateDelay(): Promise<void> {\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n }\n\n function notifyListeners(\n event: 'SIGNED_IN' | 'SIGNED_OUT' | 'USER_UPDATED',\n session: AuthSession | null\n ): void {\n listeners.forEach((callback) => callback(event, session))\n }\n\n function generateToken(): string {\n return `mem_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`\n }\n\n return {\n async getSession(): Promise<AuthSession | null> {\n await simulateDelay()\n return currentSession\n },\n\n async getUser(): Promise<AuthUser | null> {\n await simulateDelay()\n return currentSession?.user ?? null\n },\n\n async signIn({ email, password }: SignInOptions): Promise<AuthResult> {\n await simulateDelay()\n\n const userData = users.get(email)\n\n if (!userData) {\n return {\n user: null,\n session: null,\n error: { code: 'user_not_found', message: 'User not found' },\n }\n }\n\n if (userData.password !== password) {\n return {\n user: null,\n session: null,\n error: { code: 'invalid_credentials', message: 'Invalid password' },\n }\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: userData.user,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: userData.user, session, error: null }\n },\n\n async signUp({ email, password, metadata }: SignUpOptions): Promise<AuthResult> {\n await simulateDelay()\n\n if (users.has(email)) {\n return {\n user: null,\n session: null,\n error: { code: 'user_exists', message: 'User already exists' },\n }\n }\n\n const newUser: AuthUser = {\n id: `user_${Date.now()}`,\n email,\n name: metadata?.name as string | undefined,\n avatarUrl: null,\n metadata,\n }\n\n users.set(email, { password, user: newUser })\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: newUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n\n return { user: newUser, session, error: null }\n },\n\n async signOut(): Promise<void> {\n await simulateDelay()\n currentSession = null\n notifyListeners('SIGNED_OUT', null)\n },\n\n async signInWithOAuth(_provider: OAuthProvider, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // In memory provider, OAuth is simulated by creating a mock user\n const mockUser: AuthUser = {\n id: `oauth_${Date.now()}`,\n email: 'oauth@example.com',\n name: 'OAuth User',\n avatarUrl: null,\n metadata: { provider: _provider },\n }\n\n const session: AuthSession = {\n accessToken: generateToken(),\n refreshToken: generateToken(),\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user: mockUser,\n }\n\n currentSession = session\n notifyListeners('SIGNED_IN', session)\n },\n\n async resetPasswordForEmail(_email: string, _redirectTo?: string): Promise<void> {\n await simulateDelay()\n // No-op in memory provider\n },\n\n async updatePassword(newPassword: string): Promise<void> {\n await simulateDelay()\n\n if (!currentSession) {\n throw new Error('Not authenticated')\n }\n\n const email = currentSession.user.email\n if (!email) {\n throw new Error('User has no email')\n }\n\n const userData = users.get(email)\n if (userData) {\n users.set(email, { ...userData, password: newPassword })\n }\n },\n\n onAuthStateChange(callback: AuthStateChangeCallback): () => void {\n listeners.add(callback)\n\n // Emit initial session event\n if (currentSession) {\n callback('INITIAL_SESSION', currentSession)\n }\n\n return () => {\n listeners.delete(callback)\n }\n },\n }\n}\n"]}
|