nuxt-supabase-team-auth
Version:
Drop-in Nuxt 3 module for team-based authentication with Supabase
130 lines (113 loc) • 4.06 kB
TypeScript
// Types - we'll use types from @nuxtjs/supabase composables
import type { DbProfile, DbTeam, DbTeamMember, DbImpersonationSession } from './database.types'
// Removed unused SupabaseClient type
// Re-export password policy types
export type { PasswordPolicy, PasswordValidationResult } from './password-policy'
// Social Provider Configuration Types
export interface SocialProviderConfig {
enabled: boolean
// Future fields for OAuth configuration
clientId?: string
redirectUrl?: string
scopes?: string[]
}
export interface SocialProvidersConfig {
google?: SocialProviderConfig
github?: SocialProviderConfig
// Future providers can be added here
apple?: SocialProviderConfig
microsoft?: SocialProviderConfig
facebook?: SocialProviderConfig
twitter?: SocialProviderConfig
}
export interface User {
id: string
email: string
user_metadata?: {
// Standard Supabase auth field for user's display name
name?: string
avatar_url?: string
}
}
// Use Supabase-generated types
export type Profile = DbProfile
export type Team = DbTeam
export type TeamMember = DbTeamMember
export type ImpersonationSession = DbImpersonationSession
export interface TeamAuthState {
currentUser: Ref<User | null>
currentTeam: Ref<Team | null>
currentRole: Ref<string | null>
isLoading: Ref<boolean>
isImpersonating: Ref<boolean>
impersonationExpiresAt: Ref<Date | null>
}
export interface SessionHealthResult {
isHealthy: boolean
issues: string[]
}
export interface ActiveTab {
tabId: string
timestamp: number
url: string
}
export interface TeamAuthMethods {
signUpWithTeam: (email: string, password: string, teamName: string) => Promise<void>
signIn: (email: string, password: string) => Promise<void>
signOut: () => Promise<void>
inviteMember: (email: string, role?: string) => Promise<void>
revokeInvite: (inviteId: string) => Promise<void>
resendInvite: (inviteId: string) => Promise<void>
promote: (userId: string) => Promise<void>
demote: (userId: string) => Promise<void>
transferOwnership: (userId: string) => Promise<void>
getProfile: () => Promise<Profile | null>
updateProfile: (updates: Partial<Profile>) => Promise<void>
renameTeam: (name: string) => Promise<void>
updateTeam: (updates: Partial<Team>) => Promise<void>
deleteTeam: () => Promise<void>
startImpersonation: (targetUserId: string, reason: string) => Promise<void>
stopImpersonation: () => Promise<void>
getAvatarFallback: (overrides?: { fullName?: string | null, email?: string | null }) => string
getTeamMembers: () => Promise<void>
updateMemberRole: (userId: string, role: string) => Promise<void>
removeMember: (userId: string) => Promise<void>
getTeamMemberProfile: (userId: string) => Promise<Profile | null>
updateTeamMemberProfile: (userId: string, updates: Partial<Profile>) => Promise<void>
// Session management utilities
sessionHealth: () => SessionHealthResult
triggerSessionRecovery: () => void
getActiveTabs: () => ActiveTab[]
isTabPrimary: boolean
}
export type TeamAuth = TeamAuthState & TeamAuthMethods
// UserButton Custom Menu Item Types
export interface CustomMenuItem {
/** Display text for the menu item */
label: string
/** Icon name (e.g., 'i-lucide-settings') */
icon?: string
/** Internal route to navigate to */
to?: string
/** External URL to navigate to */
href?: string
/** Link target (e.g., '_blank') */
target?: string
/** Custom click handler (overrides navigation) */
onSelect?: (event: Event) => void
/** Disable the menu item */
disabled?: boolean
/** Required role to show this item */
requiredRole?: 'member' | 'admin' | 'owner' | 'super_admin'
/** Add a separator after this item */
addSeparator?: boolean
}
// Module Configuration Types
export interface TeamAuthModuleConfig {
supabaseUrl?: string
supabaseKey?: string
debug?: boolean
redirectTo?: string
socialProviders?: SocialProvidersConfig
}
// Note: $teamAuthClient plugin types removed - now using @nuxtjs/supabase's useSupabaseClient()