@ngx-addons/omni-auth-core
Version:
Core library for authentication in Angular applications.
1 lines • 23.6 kB
Source Map (JSON)
{"version":3,"file":"ngx-addons-omni-auth-core.mjs","sources":["../../../projects/omni-auth-core/src/lib/error/action-error-collector.service.ts","../../../projects/omni-auth-core/src/lib/error/error-message.pipe.ts","../../../projects/omni-auth-core/src/lib/error/auth-error.ts","../../../projects/omni-auth-core/src/lib/error/runtime-error.ts","../../../projects/omni-auth-core/src/lib/error/flow-error.ts","../../../projects/omni-auth-core/src/lib/config/patterns.ts","../../../projects/omni-auth-core/src/lib/auth.interface.ts","../../../projects/omni-auth-core/src/configure-auth.ts","../../../projects/omni-auth-core/src/lib/config/default-content.config.ts","../../../projects/omni-auth-core/src/lib/auth-guard.ts","../../../projects/omni-auth-core/src/lib/routing/auth-route.service.ts","../../../projects/omni-auth-core/src/ngx-addons-omni-auth-core.ts"],"sourcesContent":["import {Injectable, Signal, signal} from '@angular/core';\nimport {FlowError} from './flow-error';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ActionErrorCollectorService {\n readonly #currentError = signal<FlowError | null>(null);\n\n readonly currentError: Signal<FlowError | null> = this.#currentError;\n\n reset() {\n this.#currentError.set(null)\n }\n\n handle(error: FlowError) {\n this.#currentError.set(error);\n }\n}\n","import {computed, inject, Pipe, PipeTransform, Signal} from '@angular/core';\nimport {ActionErrorCollectorService} from '../error/action-error-collector.service';\nimport {FlowError} from '../error/flow-error';\nimport {ContentConfig} from './../config/default-content.config';\n\n@Pipe({name: 'errorMessage', standalone: true})\nexport class ErrorMessagePipe implements PipeTransform {\n #collector = inject(ActionErrorCollectorService);\n\n transform(source: FlowError['source'], messages: ContentConfig['errors']): Signal<string | null> {\n return computed(() => {\n const error = this.#collector.currentError();\n\n if (!error) {\n return null;\n }\n\n if (error.source !== source) {\n return null;\n }\n\n if (error.silent) {\n return null;\n }\n\n return messages[error.code] ?? messages.unknown;\n })\n }\n}\n","export class OmniAuthError {\n constructor(public error: Error | unknown) {}\n\n getErrorMessage(): string {\n return this.error instanceof Error ? this.error.message : 'Unknown error';\n }\n}\n","import {OmniAuthError} from \"./auth-error\";\n\nexport class RuntimeError extends OmniAuthError {\n constructor(\n public override error: Error | unknown,\n public possibleSolution?: string,\n ) {\n super(error);\n }\n}\n","import { OmniAuthError } from './auth-error';\n\nexport type ActionErrorCode =\n | 'unknown'\n | 'signInWithRedirectFailure'\n | 'userDoesNotExist'\n | 'alreadySignedIn'\n | 'incorrectUsernameOrPassword'\n | 'usernameNotFound'\n | 'invalidConfiguration'\n | 'cancelledFlow'\n | 'invalidCode';\n\nexport class FlowError extends OmniAuthError {\n constructor(\n public source:\n | 'signIn'\n | 'signInWithProvider'\n | 'forgotPassword'\n | 'signUp'\n | 'confirmSignUp'\n | 'resendSignUpCode'\n | 'confirmForgotPassword'\n | 'signOut',\n public code: ActionErrorCode,\n public override error: Error | unknown,\n public silent = false,\n ) {\n super(error);\n }\n}\n","/**\n * Defines common patterns used for validation in the OmniAuth Core library.\n *\n * These patterns are used for validating passwords and email addresses.\n */\nexport const passwordPattern =\n /^(?!\\s+)(?!.*\\s+$)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[$^*.[\\]{}()?\"!@#%&/\\\\,><':;|_~`=+\\- ])[A-Za-z0-9$^*.[\\]{}()?\"!@#%&/\\\\,><':;|_~`=+\\- ]{8,256}$/;\n\nexport const emailPattern =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|.(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n","import {ResourceRef, Signal} from '@angular/core';\nimport {FlowError} from './error/flow-error';\nimport {OmniAuthError} from './error/auth-error';\n\nexport const isError = (response: OmniAuthError | void) => {\n return response instanceof OmniAuthError;\n};\n\nexport type CustomSignInProviderKey = string;\nexport type SocialSignInProviderKey = 'google' | 'facebook' | 'apple' | 'github' | 'microsoft';\nexport type SignInProviderKey = CustomSignInProviderKey | SocialSignInProviderKey;\n\nexport type AuthState = {\n state: 'unknown' | 'authenticated' | 'unauthenticated' | 'error';\n user?: {\n displayName?: string;\n email?: string;\n name?: string;\n phone?: string;\n verified: boolean;\n };\n error?: OmniAuthError;\n}\n\nexport abstract class OmniAuthService {\n abstract authState: ResourceRef<AuthState>;\n\n abstract currentUser: Signal<AuthState['user']>;\n\n abstract getToken: () => Promise<string | null>;\n\n abstract signOut(fromAllDevices?: boolean): Promise<void | FlowError>;\n\n abstract resendSignUpCode(params: {\n email: string;\n }): Promise<void | FlowError>;\n\n abstract signUp(params: {\n email: string;\n password: string;\n name: string;\n attributes?: Record<string, string | boolean>;\n }): Promise<void | FlowError>;\n\n abstract confirmSignUp(params: {\n email: string;\n code: string;\n }): Promise<void | FlowError>;\n\n abstract signIn(params: {\n email: string;\n password: string;\n }): Promise<void | FlowError>;\n\n abstract forgotPassword(params: {\n email: string;\n }): Promise<void | FlowError>;\n\n abstract confirmForgotPassword(params: {\n email: string;\n code: string;\n newPassword: string;\n }): Promise<void | FlowError>;\n\n abstract signInWithProvider(providerKey: SocialSignInProviderKey | CustomSignInProviderKey): Promise<void | FlowError>;\n}\n","import { inject, InjectionToken, Provider, Type } from '@angular/core';\nimport { OmniAuthService } from './lib/auth.interface';\nimport { HttpInterceptorFn } from '@angular/common/http';\nimport { from, switchMap } from 'rxjs';\n\nexport type AuthConfig = {\n /** @description Authentication service class */\n authService: Type<OmniAuthService>;\n bearerAuthentication?: {\n /**\n * @description List of endpoints that do not require authentication, can be RegExp or string.\n * In case of empty array, all endpoints will require authentication.\n * */\n whitelistedEndpoints: (RegExp | string)[];\n /** @description Authentication token header name, default is 'Authorization' */\n headerName?: string;\n /** @description Authentication token suffix, default is \"Bearer \" */\n headerValuePrefix?: string;\n };\n routing?: {\n /** @description The route to redirect to after successful login */\n secured: string[];\n /** @description The route to redirect to after logout */\n guest: string[];\n };\n validation?: {\n /** @description Email validation pattern, used in sign out / sign in method */\n emailPattern?: RegExp;\n /** @description Password validation pattern, used in sign out / sign in method */\n passwordPattern?: RegExp;\n };\n};\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('AUTH_CONFIG');\n\nexport const configureAuth = (params: AuthConfig): Provider[] => {\n return [\n {\n provide: OmniAuthService,\n useClass: params.authService,\n },\n {\n provide: AUTH_CONFIG,\n useValue: params,\n },\n ];\n};\n\nexport const jwtInterceptor: HttpInterceptorFn = (request, next) => {\n const config = inject<AuthConfig>(AUTH_CONFIG);\n const authService = inject(OmniAuthService);\n\n const bearerConfig = config.bearerAuthentication;\n\n if (bearerConfig?.whitelistedEndpoints?.length) {\n const whiteListed = bearerConfig?.whitelistedEndpoints.find((url) => {\n if (url instanceof RegExp) {\n return url.test(request.url);\n }\n return request.url.includes(url);\n });\n\n if (!whiteListed) {\n return next(request.clone());\n }\n }\n\n const token$ = from(authService.getToken());\n\n return token$.pipe(\n switchMap((token) => {\n if (!token) {\n return next(request.clone());\n }\n\n let headers = request.headers;\n\n headers = headers.append(\n bearerConfig?.headerName ?? 'Authorization',\n `${bearerConfig?.headerValuePrefix ?? 'Bearer '}${token}`,\n );\n\n const newReq = request.clone({ headers });\n\n return next(newReq);\n }),\n );\n};\n","export const defaultContent = {\n loggedIn: {\n welcomeMessage: 'Welcome back, {{displayName}}!',\n welcomeMessageNoDisplayName: 'Welcome back!',\n },\n common: {\n emailLabel: 'Email',\n passwordLabel: 'Password',\n nameLabel: 'Name',\n\n nameErrorRequiredText: 'Name is required',\n nameErrorMinLengthText: 'Name needs to be at least 2 characters long',\n namePlaceholder: 'Joe Doe',\n\n emailErrorRequiredText: 'Email is required',\n emailErrorPatternText: 'Email is invalid',\n emailPlaceholder: 'joe.doe@example.com',\n\n passwordErrorRequiredText: 'Password is required',\n passwordErrorMinLengthText:\n 'Password needs to be at least 8 characters long',\n passwordPatternText:\n 'Password must contain at least 8 characters, one uppercase letter,' +\n ' one lowercase letter, one number and one special character',\n passwordPlaceholder: '********',\n\n codeLabel: 'Code',\n codeErrorRequiredText: 'Code is required',\n codePlaceholder: '000000',\n\n backToSignInLabel: 'Back to login',\n\n icons: {\n back: 'chevron_backward',\n email: 'email',\n },\n },\n signIn: {\n title: 'Login',\n errorSubmitMessage: 'Error while signing in',\n submitLabel: 'Login',\n forgetPassword: 'I forgot my password',\n },\n signUp: {\n title: 'Register',\n errorSubmitMessage: 'Error while signing up',\n submitLabel: 'Create account',\n termsAndConditionsText: 'By continuing, you agree to our',\n termsAndConditionsLinkText: 'Terms and Conditions',\n },\n confirmationSignUp: {\n subTitle: 'Confirm your e-mail address',\n paragraph:\n 'A confirmation e-mail has been sent.\\n' +\n 'Check your inbox and write the code below to confirm your e-mail address.',\n errorSubmitMessage: 'Error while signing up',\n submitLabel: 'Verify',\n resendLabel: 'Resend code',\n errorResendMessage: 'Error while resending code',\n },\n resetPassword: {\n title: 'Confirmation code',\n sendCodeMessage:\n 'Enter the e-mail address you used to sign up, we will send you a code to reset your password.',\n providePasswordMessage: 'Enter code and new password',\n repeatPassword: 'Repeat password',\n errorSubmitMessage: 'Error while resetting password',\n errorSendCodeMessage: 'Error while sending code',\n sendCodeLabel: 'Send code',\n submitLabel: 'Reset password',\n },\n socialButtons: {\n orLine: 'or use one of these options',\n signInWithGoogle: 'Sign in with Google',\n signInWithApple: 'Sign in with Apple',\n signInWithFacebook: 'Sign in with Facebook',\n\n },\n errors: {\n invalidCode: 'Provided code is invalid',\n usernameNotFound: 'Username not found',\n incorrectUsernameOrPassword: 'Password or email is incorrect',\n userDoesNotExist: 'User does not exist',\n alreadySignedIn: 'You are already signed in',\n signInWithRedirectFailure: 'Sign in using external provider failed',\n invalidConfiguration: 'Missing or invalid configuration, see console for details',\n cancelledFlow: 'Flow was cancelled by user',\n unknown: 'An unknown error occurred',\n },\n};\n\nexport type ContentConfig = typeof defaultContent;\n","import {\n ActivatedRouteSnapshot,\n CanActivateFn,\n createUrlTreeFromSnapshot,\n} from '@angular/router';\nimport { inject } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { map, skipWhile, take } from 'rxjs';\nimport { OmniAuthService } from './auth.interface';\nimport { AUTH_CONFIG, AuthConfig } from '../configure-auth';\n\n/**\n * @description Guard that checks if the user is authenticated user otherwise redirects to the specified route.\n * @param config\n */\nexport const onlyAuthenticated: (config?: {\n /**\n * @description The route to redirect if someone is not authenticated. If not provided, will use the default from the AuthConfig.\n */\n redirectTo?: string[];\n}) => CanActivateFn = (config) => (route: ActivatedRouteSnapshot) => {\n const authService = inject(OmniAuthService);\n const libConfig = inject<AuthConfig>(AUTH_CONFIG);\n\n const loading$ = toObservable(authService.authState.isLoading);\n\n console.log('Checking authentication state...');\n\n return loading$.pipe(\n skipWhile((loading) => loading),\n map(() => {\n const authenticated = authService.authState.value().state === 'authenticated';\n if (!authenticated) {\n console.log('User is not authenticated, redirecting...', config?.redirectTo ?? libConfig.routing?.guest ?? ['/']);\n return createUrlTreeFromSnapshot(\n route,\n config?.redirectTo ?? libConfig.routing?.guest ?? ['/'],\n );\n }\n\n console.log('User is authenticated, allowing access to the route');\n\n return true;\n }),\n take(1),\n );\n};\n\n/**\n * @description Guard that checks if the user is not authenticated otherwise redirects to the specified route.\n * @param config\n */\nexport const onlyGuest: (config?: {\n /**\n * @description The route to in case of unauthenticated user. If not provided, will use the default from the AuthConfig.\n */\n redirectTo?: string[];\n}) => CanActivateFn = (config) => {\n return (route: ActivatedRouteSnapshot) => {\n const authService = inject(OmniAuthService);\n const libConfig = inject<AuthConfig>(AUTH_CONFIG);\n\n const loading$ = toObservable(authService.authState.isLoading);\n return loading$.pipe(\n skipWhile((loading) => loading),\n map(() => {\n const authenticated = authService.authState.value().state === 'authenticated';\n\n if (authenticated) {\n return createUrlTreeFromSnapshot(\n route,\n config?.redirectTo ?? libConfig.routing?.secured ?? ['/'],\n );\n }\n\n return true;\n }),\n take(1),\n );\n };\n};\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AUTH_CONFIG, AuthConfig } from '../../configure-auth';\n\ntype AuthStep =\n | 'login'\n | 'register'\n | 'reset_password'\n | 'confirm_reset_password'\n | 'confirm_sign_up';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthRouteService {\n #router = inject(Router);\n #env = inject<AuthConfig>(AUTH_CONFIG);\n\n readonly currentStep = signal<AuthStep>('login');\n\n readonly currentEmail = signal<string | null>(null);\n\n nextStep(state: AuthStep, details: { email?: string } = {}) {\n this.currentStep.set(state);\n\n this.currentEmail.set(details.email ?? null);\n }\n\n navigateToGuestPage(rememberPage = false) {\n // todo - implement rememberPage logic\n if (!this.#env.routing?.guest) {\n return;\n }\n\n return this.#router.navigate(this.#env.routing.guest);\n }\n\n navigateToSecuredPage() {\n if (!this.#env.routing?.secured) {\n return;\n }\n\n return this.#router.navigate(this.#env.routing.secured);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}