UNPKG

ngx-better-auth

Version:

An **Angular 20+ wrapper for [Better Auth](https://github.com/better-auth/better-auth)**. Provides reactive session handling with **signals**, clean **DI provider setup** with **observables**, and modern **guards**.

1 lines 65.1 kB
{"version":3,"file":"ngx-better-auth.mjs","sources":["../../../src/lib/services/main.service.ts","../../../src/lib/services/auth.service.ts","../../../src/lib/services/session.service.ts","../../../src/lib/services/account.service.ts","../../../src/lib/utils/validate-plugin.ts","../../../src/lib/services/plugins/two-factor.service.ts","../../../src/lib/services/plugins/passkey.service.ts","../../../src/lib/services/plugins/generic-oauth.service.ts","../../../src/lib/services/plugins/email-otp.service.ts","../../../src/lib/services/plugins/one-tap.service.ts","../../../src/lib/services/plugins/magic-link.service.ts","../../../src/lib/utils/email.util.ts","../../../src/lib/services/plugins/username.service.ts","../../../src/lib/services/plugins/admin.service.ts","../../../src/lib/services/plugins/organization.service.ts","../../../src/lib/providers.ts","../../../src/lib/guards/auth-guard.utils.ts","../../../src/lib/guards/auth-guard.factory.ts","../../../src/lib/validators/username-available.validators.ts","../../../src/ngx-better-auth.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core'\nimport { BETTER_AUTH_CONFIG_TOKEN } from '../providers'\nimport { BetterFetchError, createAuthClient } from 'better-auth/client'\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MainService {\n private readonly config = inject(BETTER_AUTH_CONFIG_TOKEN)\n\n readonly authClient = createAuthClient({\n ...this.config,\n })\n\n readonly url = `${this.config.baseURL}${this.config.basePath || '/api/auth'}`\n\n mapData<T>(data: { data: T; error: BetterFetchError }): T {\n if (data.error) {\n throw data.error\n }\n return data.data\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core'\nimport { BetterFetchError } from 'better-auth/client'\nimport { defer, filter, first, map, Observable, shareReplay, switchMap } from 'rxjs'\nimport { MainService } from './main.service'\nimport { Provider, Session, User } from '../models'\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n private readonly mainService = inject(MainService)\n\n private readonly client = this.mainService.authClient\n\n /**\n * Current authenticated session\n */\n readonly session = signal<{ user: any; session: any } | null>(null)\n\n /**\n * Whether there is an active session\n */\n readonly isLoggedIn = computed(() => !!this.session()?.session)\n\n /**\n * Observable stream of the session state. Emits only when the session is resolved (not pending).\n * This is intended for guards and other async operations.\n */\n readonly sessionState$!: Observable<{ user: User; session: Session } | null>\n\n constructor() {\n this.session$()\n\n const useSession$ = new Observable<{\n data: { user: User; session: Session } | null\n error: BetterFetchError | null\n isPending: boolean\n }>((subscriber) => {\n this.client.useSession.subscribe((value) => subscriber.next(value as any))\n })\n\n this.sessionState$ = useSession$.pipe(\n filter((session) => !session.isPending),\n map((session) => {\n if (session.error) {\n return null\n }\n return session.data\n }),\n shareReplay(1),\n )\n }\n\n /**\n * Asynchronously checks if the user is authenticated.\n * Ideal for route guards.\n * @returns An Observable that emits true for an active session, and false otherwise.\n */\n isLoggedIn$(): Observable<boolean> {\n return this.sessionState$.pipe(map((session) => !!session?.session))\n }\n\n private session$() {\n this.client.useSession.subscribe((session) => {\n if (session.isPending) {\n this.session.set(null)\n return\n }\n if (session.error) {\n const error: BetterFetchError = session.error\n if (error.status !== 401) {\n console.error('Error fetching session:', error)\n }\n this.session.set(null)\n return\n }\n this.session.set(session.data)\n })\n }\n\n signInEmail(data: { email: string; password: string; rememberMe?: boolean }): Observable<{\n user: User\n session: Session\n }> {\n return defer(() => this.client.signIn.email(data)).pipe(\n switchMap(() => this.sessionState$.pipe(filter((s) => s !== null))),\n )\n }\n\n /**\n * Sign up a new user using email and password.\n *\n * Parameters username and displayUsername can be used if the username's plugin is enabled.\n * @param data\n */\n signUpEmail(data: {\n name: string\n email: string\n password: string\n username: string\n displayUsername?: string\n }): Observable<{\n user: User\n session: Session\n }> {\n return defer(() => this.client.signUp.email(data)).pipe(\n switchMap(() => this.sessionState$.pipe(filter((s) => s !== null))),\n )\n }\n\n signInProvider(data: {\n provider: Provider\n callbackURL?: string\n disableRedirect?: boolean\n errorCallbackURL?: string\n idToken?: string\n loginHint?: string\n newUserCallbackURL?: string\n requestSignUp?: boolean\n scopes?: string[]\n }): Observable<{\n user: User\n session: Session\n }> {\n return defer(() =>\n this.client.signIn.social({\n callbackURL: window.location.origin,\n ...(data as any),\n }),\n ).pipe(switchMap(() => this.sessionState$.pipe(filter((s) => s !== null))))\n }\n\n signOut(): Observable<null> {\n return defer(() => this.client.signOut()).pipe(switchMap(() => this.sessionState$.pipe(filter((s) => s === null))))\n }\n\n sendVerificationEmail(data: { email: string; callbackURL?: string }): Observable<{ status: boolean }> {\n return defer(() => this.client.sendVerificationEmail(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n requestPasswordReset(data: { email: string; redirectTo?: string }): Observable<{ status: boolean }> {\n return defer(() => this.client.requestPasswordReset(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n resetPassword(data: { newPassword: string; token: string }): Observable<{ status: boolean }> {\n return defer(() => this.client.resetPassword(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n changePassword(data: { currentPassword: string; newPassword: string; revokeOtherSessions?: boolean }): Observable<{\n token: string\n user: User\n }> {\n return defer(() => this.client.changePassword(data)).pipe(\n map((data) => this.mainService.mapData<{ token: string; user: User }>(data as any)),\n )\n }\n\n changeEmail(data: { newEmail: string; callbackURL?: string }): Observable<{ status: boolean }> {\n return defer(() => this.client.changeEmail(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n updateUser(\n data: Partial<{\n name: string\n image: string\n username: string\n displayUsername: string\n [key: string]: any\n }>,\n ): Observable<{ status: boolean }> {\n return defer(() => this.client.updateUser(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n deleteUser(data?: { callbackURL?: string; token?: string; password?: string }): Observable<null> {\n return defer(() => this.client.deleteUser(data)).pipe(\n switchMap(() => this.sessionState$.pipe(filter((s) => s === null))),\n first(),\n )\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, map, Observable } from 'rxjs'\nimport { MainService } from './main.service'\nimport { Session } from '../models'\n\n@Injectable({ providedIn: 'root' })\nexport class SessionService {\n private readonly mainService = inject(MainService)\n\n private readonly client = this.mainService.authClient\n\n listSessions(): Observable<Session[]> {\n return defer(() => this.client.listSessions()).pipe(map((data) => this.mainService.mapData<Session[]>(data as any)))\n }\n\n revokeSession(data: { token: string }): Observable<{ success: boolean }> {\n return defer(() => this.client.revokeSession(data)).pipe(\n map((data) => this.mainService.mapData<{ success: boolean }>(data as any)),\n )\n }\n\n revokeOtherSessions(): Observable<{ success: boolean }> {\n return defer(() => this.client.revokeOtherSessions()).pipe(\n map((data) => this.mainService.mapData<{ success: boolean }>(data as any)),\n )\n }\n\n revokeAllSessions(): Observable<{ success: boolean }> {\n return defer(() => this.client.revokeSessions()).pipe(\n map((data) => this.mainService.mapData<{ success: boolean }>(data as any)),\n )\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, map, Observable } from 'rxjs'\nimport { MainService } from './main.service'\nimport { Account, Provider } from '../models'\n\n@Injectable({ providedIn: 'root' })\nexport class AccountService {\n private readonly mainService = inject(MainService)\n\n private readonly client = this.mainService.authClient\n\n listAccounts(): Observable<Account[]> {\n return defer(() => this.client.listAccounts()).pipe(map((data) => this.mainService.mapData<Account[]>(data as any)))\n }\n\n linkSocial(data: {\n provider: Provider\n callbackURL?: string\n scopes?: string[]\n idToken?: {\n token: string\n nonce?: string\n accessToken?: string\n refreshToken?: string\n }\n }): Observable<{ url: string; redirect: boolean }> {\n return defer(() => this.client.linkSocial(data)).pipe(\n map((data) => this.mainService.mapData<{ url: string; redirect: boolean }>(data as any)),\n )\n }\n\n unlinkAccount(data: { providerId: Provider; accountId: string }): Observable<{ status: boolean }> {\n return defer(() => this.client.unlinkAccount(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n}\n","export function validatePlugin(client: any, property: string) {\n if (!client) {\n throw new Error('AuthClient is not initialized.')\n }\n\n if (!client[property]) {\n throw new Error(\n `Property '${property}' is not available on authClient. Please ensure the plugin providing this property is included in the plugins array.`,\n )\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, filter, first, map, Observable, switchMap } from 'rxjs'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport { MainService } from '../main.service'\nimport { AuthService } from '../auth.service'\nimport { Session, User } from '../../models'\n\n@Injectable({ providedIn: 'root' })\nexport class TwoFactorService {\n private readonly mainService = inject(MainService)\n private readonly authService = inject(AuthService)\n\n twoFactor: any\n\n constructor() {\n const client = this.mainService.authClient as { twoFactor?: any }\n validatePlugin(client, 'twoFactor')\n this.twoFactor = client.twoFactor\n }\n\n enable(data: { password: string; issuer?: string }): Observable<{ totpURI: string; backupCodes: string[] }> {\n return defer(() => this.twoFactor.enable(data)).pipe(\n map((data) =>\n this.mainService.mapData<{\n totpURI: string\n backupCodes: string[]\n }>(data as any),\n ),\n )\n }\n\n disable(data: { password: string }): Observable<{ status: boolean }> {\n return defer(() => this.twoFactor.disable(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n getTotpUri(data: { password: string }): Observable<{ totpURI: string }> {\n return defer(() => this.twoFactor.getTotpUri(data)).pipe(\n map((data) => this.mainService.mapData<{ totpURI: string }>(data as any)),\n )\n }\n\n verifyTotp(data: { code: string; trustDevice?: boolean }): Observable<{ status: boolean }> {\n return defer(() => this.twoFactor.verifyTotp(data)).pipe(\n switchMap(() => this.authService.sessionState$.pipe(filter((s) => s !== null))),\n first(),\n map(() => ({ status: true })),\n )\n }\n\n sendOtp(): Observable<{ status: boolean }> {\n return defer(() => this.twoFactor.sendOtp()).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n verifyOtp(data: { code: string; trustDevice?: boolean }): Observable<{ status: boolean }> {\n return defer(() => this.twoFactor.verifyOtp(data)).pipe(\n switchMap(() => this.authService.sessionState$.pipe(filter((s) => s !== null))),\n first(),\n map(() => ({ status: true })),\n )\n }\n\n generateBackupCodes(data: { password: string }): Observable<{ status: boolean; backupCodes: string[] }> {\n return defer(() => this.twoFactor.generateBackupCodes(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean; backupCodes: string[] }>(data as any)),\n )\n }\n\n verifyBackupCode(data: { code: string; disableSession?: boolean; trustDevice?: boolean }): Observable<{\n user: User\n session: Session\n }> {\n return defer(() => this.twoFactor.verifyBackupCode(data)).pipe(\n map((data) =>\n this.mainService.mapData<{\n user: User\n session: Session\n }>(data as any),\n ),\n )\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, map, Observable } from 'rxjs'\nimport { MainService } from '../main.service'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport type { Passkey } from 'better-auth/plugins/passkey'\n\n@Injectable({ providedIn: 'root' })\nexport class PasskeyService {\n private readonly mainService = inject(MainService)\n\n passkey: any\n\n constructor() {\n const client = this.mainService.authClient as { passkey?: any }\n validatePlugin(client, 'passkey')\n this.passkey = client.passkey\n }\n\n addPasskey(data: {\n name?: string\n authenticatorAttachment?: AuthenticatorAttachment\n }): Observable<{ passkey: Passkey }> {\n return defer(() => this.passkey.addPasskey(data)).pipe(\n map((data) => this.mainService.mapData<{ passkey: Passkey }>(data as any)),\n )\n }\n\n signIn(data: { email: string; autoFill?: boolean; callbackURL?: string }): Observable<unknown> {\n return defer(() => (this.mainService.authClient.signIn as any).passkey(data))\n }\n\n listUserPasskeys(): Observable<Passkey[]> {\n return defer(() => this.passkey.listUserPasskeys()).pipe(\n map((data) => this.mainService.mapData<Passkey[]>(data as any)),\n )\n }\n\n deletePasskey(data: { id: string }): Observable<{ status: boolean }> {\n return defer(() => this.passkey.deletePasskey(data)).pipe(\n map((data) => this.mainService.mapData<{ status: boolean }>(data as any)),\n )\n }\n\n updatePasskey(data: { id: string; name: string }): Observable<{ passkey: Passkey }> {\n return defer(() => this.passkey.updatePasskey(data)).pipe(\n map((data) => this.mainService.mapData<{ passkey: Passkey }>(data as any)),\n )\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, filter, switchMap } from 'rxjs'\nimport { MainService } from '../main.service'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport { AuthService } from '../auth.service'\n\n@Injectable({ providedIn: 'root' })\nexport class GenericOauthService {\n private readonly mainService = inject(MainService)\n private readonly authService = inject(AuthService)\n\n oauth: any\n\n constructor() {\n const client = this.mainService.authClient as { oauth2?: any }\n validatePlugin(client, 'oauth2')\n this.oauth = client.oauth2\n }\n\n signIn(data: {\n providerId: string\n callbackURL?: string\n errorCallbackURL?: string\n newUserCallbackURL?: string\n disableRedirect?: boolean\n scopes?: string[]\n requestSignUp?: boolean\n }) {\n return defer(() => (this.mainService.authClient.signIn as any).oauth2(data)).pipe(\n switchMap(() => this.authService.sessionState$.pipe(filter((s) => s !== null))),\n )\n }\n\n link(data: { providerId: string; callbackURL: string }) {\n return defer(() => this.oauth.link(data))\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, filter, switchMap } from 'rxjs'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport { MainService } from '../main.service'\nimport { AuthService } from '../auth.service'\n\n@Injectable({ providedIn: 'root' })\nexport class EmailOtpService {\n private readonly mainService = inject(MainService)\n private readonly authService = inject(AuthService)\n\n emailOtp: any\n\n constructor() {\n const client = this.mainService.authClient as { emailOtp?: any }\n validatePlugin(client, 'emailOtp')\n this.emailOtp = client.emailOtp\n }\n\n signInEmailOtp(data: { email: string; otp: string }) {\n return defer(() => (this.mainService.authClient.signIn as any).emailOtp(data)).pipe(\n switchMap(() => this.authService.sessionState$.pipe(filter((s) => s !== null))),\n )\n }\n\n sendVerificationOtp(data: { email: string; type: 'sign-in' | 'email-verification' | 'forget-password' }) {\n return defer(() => this.emailOtp.sendVerificationOtp(data))\n }\n\n checkVerificationOtp(data: {\n email: string\n type: 'sign-in' | 'email-verification' | 'forget-password'\n otp: string\n }) {\n return defer(() => this.emailOtp.checkVerificationOtp(data))\n }\n\n verifyEmail(data: { email: string; otp: string }) {\n return defer(() => this.emailOtp.verifyEmail(data))\n }\n\n resetPassword(data: { email: string; otp: string; password: string }) {\n return defer(() => this.emailOtp.resetPassword(data))\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer } from 'rxjs'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport { MainService } from '../main.service'\n\n@Injectable({ providedIn: 'root' })\nexport class OneTapService {\n private readonly mainService = inject(MainService)\n\n oneTap: any\n\n constructor() {\n const client = this.mainService.authClient as { oneTap?: any }\n validatePlugin(client, 'oneTap')\n this.oneTap = client.oneTap\n }\n\n signIn(data?: {\n fetchOptions?: {\n onSuccess: () => void\n }\n callbackURL?: string\n onPromptNotification?: (notification: any) => void\n }) {\n return defer(() => this.oneTap(data))\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer } from 'rxjs'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport { MainService } from '../main.service'\n\n@Injectable({ providedIn: 'root' })\nexport class MagicLinkService {\n private readonly mainService = inject(MainService)\n\n magicLink: any\n\n constructor() {\n const client = this.mainService.authClient as { magicLink?: any }\n validatePlugin(client, 'magicLink')\n this.magicLink = client.magicLink\n }\n\n signIn(data: {\n email: string\n name?: string\n callbackURL?: string\n newUserCallbackURL?: string\n errorCallbackURL?: string\n }) {\n return defer(() => (this.mainService.authClient.signIn as any).magicLink(data))\n }\n\n verify(data: { token: string; callbackURL?: string }) {\n return defer(() => this.magicLink.verify(data))\n }\n}\n","export function isEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, filter, map, Observable, switchMap } from 'rxjs'\nimport { MainService } from '../main.service'\nimport { AuthService } from '../auth.service'\nimport { isEmail } from '../../utils/email.util'\nimport { Session, User } from '../../models'\nimport { HttpClient } from '@angular/common/http'\n\n@Injectable({ providedIn: 'root' })\nexport class UsernameService {\n private readonly http = inject(HttpClient)\n\n private readonly mainService = inject(MainService)\n private readonly authService = inject(AuthService)\n\n username = this.mainService.authClient\n\n /**\n * pass either email or username to sign in. Needs username plugin enabled to use username.\n * @param data : { email?: string; username?: string; password: string; rememberMe?: boolean }\n */\n signIn(data: { login: string; password: string; rememberMe?: boolean }): Observable<{\n user: User\n session: Session\n }> {\n if (isEmail(data.login)) {\n return this.authService.signInEmail({ email: data.login, password: data.password, rememberMe: data.rememberMe })\n } else {\n return this.signInUsername({ username: data.login, password: data.password, rememberMe: data.rememberMe })\n }\n }\n\n signInUsername(data: { username: string; password: string; rememberMe?: boolean }): Observable<{\n user: User\n session: Session\n }> {\n return defer(() => (this.username as any).signIn.username(data)).pipe(\n switchMap(() => this.authService.sessionState$.pipe(filter((s) => s !== null))),\n )\n }\n\n isUsernameAvailable(data: { username: string }): Observable<boolean> {\n return this.http\n .post<{ available: boolean }>(`${this.mainService.url}/is-username-available`, data)\n .pipe(map((res) => res.available))\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, map, Observable } from 'rxjs'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport { MainService } from '../main.service'\nimport { Session, User } from '../../models'\n\n@Injectable({ providedIn: 'root' })\nexport class AdminService {\n private readonly mainService = inject(MainService)\n\n admin: any\n\n constructor() {\n const client = this.mainService.authClient as { admin?: any }\n validatePlugin(client, 'admin')\n this.admin = client.admin\n }\n\n setRole(data: { userId: string; role: string | string[] }): Observable<{ user: User }> {\n return defer(() => this.admin.setRole(data)).pipe(\n map((data) => this.mainService.mapData<{ user: User }>(data as any)),\n )\n }\n\n createUser(data: {\n email: string\n password: string\n name: string\n role?: string | string[]\n data?: Record<string, any>\n }): Observable<{ user: User }> {\n return defer(() => this.admin.createUser(data)).pipe(\n map((data) => this.mainService.mapData<{ user: User }>(data as any)),\n )\n }\n\n updateUser(data: { userId: string; data: Partial<User> }): Observable<{ user: User }> {\n return defer(() => this.admin.updateUser(data)).pipe(\n map((data: any) => this.mainService.mapData<{ user: User }>(data)),\n )\n }\n\n listUsers(data: {\n searchValue?: string\n searchField?: 'email' | 'name'\n searchOperator?: 'contains' | 'start_with' | 'end_with'\n limit?: number\n offset?: number\n sortBy?: string\n sortDirection?: 'asc' | 'desc'\n filterField?: string\n filterValue?: string | number | boolean\n filterOperator?: 'eq' | 'ne' | 'lt' | 'lte' | 'gt' | 'gte'\n }): Observable<{ users: User[]; total: number; limit: number; offset: number }> {\n return defer(() => this.admin.listUsers(data)).pipe(\n map((data: any) =>\n this.mainService.mapData<{ users: User[]; total: number; limit: number; offset: number }>(data as any),\n ),\n )\n }\n\n listUserSessions(data: { userId: string }): Observable<{ sessions: Session[] }> {\n return defer(() => this.admin.listUserSessions(data)).pipe(\n map((data: any) => this.mainService.mapData<{ sessions: Session[] }>(data)),\n )\n }\n\n unbanUser(data: { userId: string }): Observable<{ user: User }> {\n return defer(() => this.admin.unbanUser(data)).pipe(\n map((data: any) => this.mainService.mapData<{ user: User }>(data)),\n )\n }\n\n banUser(data: { userId: string; banReason?: string; banExpiresIn?: number }): Observable<{ user: User }> {\n return defer(() => this.admin.banUser(data)).pipe(\n map((data: any) => this.mainService.mapData<{ user: User }>(data)),\n )\n }\n\n impersonateUser(data: { userId: string }): Observable<{ session: Session; user: User }> {\n return defer(() => this.admin.impersonateUser(data)).pipe(\n map((data: any) => this.mainService.mapData<{ session: Session; user: User }>(data)),\n )\n }\n\n stopImpersonating(): Observable<unknown> {\n return defer(() => this.admin.stopImpersonating())\n }\n\n revokeUserSession(data: { sessionToken: string }): Observable<{ success: boolean }> {\n return defer(() => this.admin.revokeUserSession(data)).pipe(\n map((data: any) => this.mainService.mapData<{ success: boolean }>(data)),\n )\n }\n\n revokeUserSessions(data: { userId: string }): Observable<{ success: boolean }> {\n return defer(() => this.admin.revokeUserSessions(data)).pipe(\n map((data: any) => this.mainService.mapData<{ success: boolean }>(data)),\n )\n }\n\n removeUser(data: { userId: string }): Observable<{ success: boolean }> {\n return defer(() => this.admin.removeUser(data)).pipe(\n map((data: any) => this.mainService.mapData<{ success: boolean }>(data)),\n )\n }\n\n setUserPassword(data: { userId: string; newPassword: string }): Observable<{ success: boolean }> {\n return defer(() => this.admin.setUserPassword(data)).pipe(\n map((data: any) => this.mainService.mapData<{ success: boolean }>(data)),\n )\n }\n\n hasPermission(data: { userId?: string; permissions: Record<string, string[]> }) {\n return defer(() => this.admin.hasPermission(data))\n }\n\n checkRolePermission(data: { role: string; permissions: Record<string, string[]> }) {\n return defer(() => this.admin.checkRolePermission(data))\n }\n}\n","import { inject, Injectable } from '@angular/core'\nimport { defer, map, Observable } from 'rxjs'\nimport { validatePlugin } from '../../utils/validate-plugin'\nimport { MainService } from '../main.service'\nimport type { Organization, Member, Invitation } from 'better-auth/plugins/organization'\n\n@Injectable({ providedIn: 'root' })\nexport class OrganizationService {\n private readonly mainService = inject(MainService)\n\n organization: any\n\n constructor() {\n const client = this.mainService.authClient as { organization?: any }\n validatePlugin(client, 'organization')\n this.organization = client.organization\n }\n\n create(data: {\n name: string\n slug: string\n logo?: string\n metadata?: Record<string, any>\n keepCurrentActiveOrganization?: boolean\n }): Observable<Organization> {\n return defer(() => this.organization.create(data)).pipe(\n map((data) => this.mainService.mapData<Organization>(data as any)),\n )\n }\n\n checkSlug(data: { slug: string }): Observable<unknown> {\n return defer(() => this.organization.checkSlug(data))\n }\n\n list(): Observable<Organization[]> {\n return defer(() => this.organization.list()).pipe(\n map((data) => this.mainService.mapData<Organization[]>(data as any)),\n )\n }\n\n setActive(data: { organizationId?: string; organizationSlug?: string }): Observable<Organization> {\n return defer(() => this.organization.setActive(data)).pipe(\n map((data) => this.mainService.mapData<Organization>(data as any)),\n )\n }\n\n getFullOrganization(data: {\n organizationId?: string\n organizationSlug?: string\n membersLimit?: number\n }): Observable<Organization> {\n return defer(() => this.organization.getFullOrganization(data)).pipe(\n map((data) => this.mainService.mapData<Organization>(data as any)),\n )\n }\n\n update(data: {\n data: {\n name?: string\n slug?: string\n logo?: string\n metadata?: Record<string, any>\n }\n organizationId?: string\n }): Observable<Organization> {\n return defer(() => this.organization.update(data)).pipe(\n map((data) => this.mainService.mapData<Organization>(data as any)),\n )\n }\n\n delete(data: { organizationId: string }): Observable<void> {\n return defer(() => this.organization.delete(data)).pipe(map((data) => this.mainService.mapData<void>(data as any)))\n }\n\n inviteMember(data: {\n email: string\n role: string | string[]\n organizationId?: string\n resend?: boolean\n teamId?: string\n }): Observable<Invitation> {\n return defer(() => this.organization.inviteMember(data)).pipe(\n map((data) => this.mainService.mapData<Invitation>(data as any)),\n )\n }\n\n acceptInvitation(data: { invitationId: string }): Observable<{ invitation: Invitation; member: Member }> {\n return defer(() => this.organization.acceptInvitation(data)).pipe(\n map((data) => this.mainService.mapData<{ invitation: Invitation; member: Member }>(data as any)),\n )\n }\n\n cancelInvitation(data: { invitationId: string }): Observable<void> {\n return defer(() => this.organization.cancelInvitation(data)).pipe(\n map((data) => this.mainService.mapData<void>(data as any)),\n )\n }\n\n rejectInvitation(data: { invitationId: string }): Observable<{ invitation: Invitation; member: null }> {\n return defer(() => this.organization.rejectInvitation(data)).pipe(\n map((data) => this.mainService.mapData<{ invitation: Invitation; member: null }>(data as any)),\n )\n }\n\n getInvitation(data: { id: string }): Observable<\n {\n organizationName: string\n organizationSlug: string\n inviterEmail: string\n } & Invitation\n > {\n return defer(() => this.organization.getInvitation(data)).pipe(\n map((data) =>\n this.mainService.mapData<\n {\n organizationName: string\n organizationSlug: string\n inviterEmail: string\n } & Invitation\n >(data as any),\n ),\n )\n }\n\n listInvitations(data: { organizationId?: string }): Observable<Invitation[]> {\n return defer(() => this.organization.listInvitations(data)).pipe(\n map((data) => this.mainService.mapData<Invitation[]>(data as any)),\n )\n }\n\n listUserInvitations(): Observable<Invitation[]> {\n return defer(() => this.organization.listUserInvitations()).pipe(\n map((data) => this.mainService.mapData<Invitation[]>(data as any)),\n )\n }\n\n listMembers(\n data: {\n organizationId?: string\n limit?: number\n offset?: number\n sortBy?: string\n sortDirection?: 'asc' | 'desc'\n filterField?: string\n filterOperator?: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'contains'\n filterValue?: string\n } = {},\n ) {\n return defer(() => this.organization.listMembers(data))\n }\n\n removeMember(data: { memberIdOrEmail: string; organizationId?: string }): Observable<{ member: Member }> {\n return defer(() => this.organization.removeMember(data)).pipe(\n map((data) => this.mainService.mapData<{ member: Member }>(data as any)),\n )\n }\n\n updateMemberRoles(data: { memberId: string; role: string | string[]; organizationId?: string }) {\n return defer(() => this.organization.updateMemberRoles(data))\n }\n\n getActiveMember(): Observable<Member> {\n return defer(() => this.organization.getActiveMember()).pipe(\n map((data) => this.mainService.mapData<Member>(data as any)),\n )\n }\n\n leave(data: { organizationId?: string }): Observable<void> {\n return defer(() => this.organization.leave(data)).pipe(map((data) => this.mainService.mapData<void>(data as any)))\n }\n\n createTeam(data: { name: string; organizationId?: string }) {\n return defer(() => this.organization.createTeam(data))\n }\n\n listTeams(data: { organizationId?: string }) {\n return defer(() => this.organization.listTeams(data))\n }\n\n updateTeam(data: {\n teamId: string\n data: { name?: string; organizationId?: string; createdAt?: Date; updatedAt?: Date }\n }) {\n return defer(() => this.organization.updateTeam(data))\n }\n\n removeTeam(data: { teamId: string; organizationId?: string }) {\n return defer(() => this.organization.removeTeam(data))\n }\n\n setActiveTeam(data: { teamId?: string }) {\n return defer(() => this.organization.setActiveTeam(data))\n }\n\n listUsersTeams() {\n return defer(() => this.organization.listUsersTeams())\n }\n\n listTeamMembers(data: { teamId: string }) {\n return defer(() => this.organization.listTeamMembers(data))\n }\n\n addTeamMember(data: { teamId: string; userId: string }) {\n return defer(() => this.organization.addTeamMember(data))\n }\n\n removeTeamMember(data: { teamId: string; userId: string }) {\n return defer(() => this.organization.removeTeamMember(data))\n }\n}\n","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core'\nimport { type BetterAuthOptions } from 'better-auth'\nimport { AuthService } from './services'\n\nexport const BETTER_AUTH_CONFIG_TOKEN = new InjectionToken<BetterAuthOptions>('BETTER_AUTH_CONFIG')\n\nconst DEFAULT_CONFIG: Partial<BetterAuthOptions> = {}\n\nexport function provideBetterAuth(options: BetterAuthOptions): EnvironmentProviders {\n const config: BetterAuthOptions = { ...DEFAULT_CONFIG, ...options }\n\n // if baseURL is not a url, it might be because of a proxy in development\n if (!config.baseURL?.startsWith('http')) {\n config.baseURL = window.location.origin\n }\n\n return makeEnvironmentProviders([{ provide: BETTER_AUTH_CONFIG_TOKEN, useValue: config }, AuthService])\n}\n","import { inject } from '@angular/core'\nimport { Router, UrlTree } from '@angular/router'\nimport { AuthService } from '../services'\nimport { map, Observable } from 'rxjs'\n\n/**\n * Redirects unauthorized users to the specified commands (route).\n */\nexport function redirectUnauthorizedTo(commands: string[] = ['/login']): () => Observable<UrlTree | boolean> {\n return () => {\n const auth = inject(AuthService)\n const router = inject(Router)\n return auth.isLoggedIn$().pipe(map((isLoggedIn) => (isLoggedIn ? true : router.createUrlTree(commands))))\n }\n}\n\n/**\n * Redirects logged-in users to the specified commands (route).\n */\nexport function redirectLoggedInTo(commands: string[] = ['/']): () => Observable<UrlTree | boolean> {\n return () => {\n const auth = inject(AuthService)\n const router = inject(Router)\n return auth.isLoggedIn$().pipe(map((isLoggedIn) => (isLoggedIn ? router.createUrlTree(commands) : true)))\n }\n}\n\n/**\n * Allows access only to users with at least one of the specified roles.\n * Redirects unauthorized users to the specified commands (route).\n */\nexport function hasRole(\n requiredRoles: string[],\n redirectTo: string[] = ['/unauthorized'],\n): () => Observable<UrlTree | boolean> {\n return () => {\n const auth = inject(AuthService)\n const router = inject(Router)\n\n return auth.sessionState$.pipe(\n map((session) => {\n if (!session || !session.user) {\n return router.createUrlTree(redirectTo)\n }\n\n const role = (session?.user as any)?.['role']\n if (Array.isArray(role)) {\n if (role.some((r) => requiredRoles.includes(r))) {\n return true\n }\n } else if (typeof role === 'string') {\n if (requiredRoles.includes(role)) {\n return true\n }\n }\n\n return router.createUrlTree(redirectTo)\n }),\n )\n }\n}\n","import { CanActivateFn, UrlTree } from '@angular/router'\nimport { Observable } from 'rxjs'\n\nexport function canActivate(\n pipe: () => Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree,\n): {\n canActivate: [CanActivateFn]\n} {\n return {\n canActivate: [() => pipe()],\n }\n}\n","import { AbstractControl, AsyncValidatorFn } from '@angular/forms'\nimport { catchError, map, of, switchMap, timer } from 'rxjs'\nimport { UsernameService } from '../services'\n\nexport function usernameAvailableValidator(\n usernameService: UsernameService,\n initialUsername?: string,\n): AsyncValidatorFn {\n let lastValidationValue: string | null = null\n\n return (control: AbstractControl): any => {\n const username = control.value?.trim()\n\n if (!username || username === initialUsername) {\n lastValidationValue = null\n return of(null)\n }\n\n // If the value is the same as the last one we checked, don't check again\n if (username === lastValidationValue) {\n return of(null)\n }\n\n lastValidationValue = username\n\n return timer(500).pipe(\n switchMap(() => {\n const currentValue = control.value?.trim()\n\n // If the value has changed since the timer started, don't validate\n if (currentValue !== username) {\n return of(null)\n }\n\n if (!currentValue || currentValue === initialUsername) {\n return of(null)\n }\n\n return usernameService.isUsernameAvailable({ username: currentValue }).pipe(\n map((available) => (available ? null : { usernameTaken: true })),\n catchError(() => of(null)),\n )\n }),\n )\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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