@first-line/firstline-angular
Version:
Firstline SDK for Angular Single Page Applications (SPA)
1 lines • 40.4 kB
Source Map (JSON)
{"version":3,"file":"first-line-firstline-angular.mjs","sources":["../../../src/lib/client.ts","../../../src/lib/state.ts","../../../src/lib/service.ts","../../../src/lib/config.ts","../../../src/lib/guard.ts","../../../src/lib/module.ts","../../../src/lib/interceptor.ts","../../../src/lib/provide.ts","../../../src/lib/functional.ts","../../../src/first-line-firstline-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport {\r\n FirstlineClient,\r\n FirstlineClientOptions,\r\n ExchangeCodeResponse,\r\n} from \"@first-line/firstline-spa-js\";\r\n\r\nimport { AuthClientConfig } from './config';\r\n\r\nexport class Client extends FirstlineClient {\r\n tokens: null | ExchangeCodeResponse;\r\n\r\n constructor(options: FirstlineClientOptions) {\r\n super(options);\r\n this.tokens = null;\r\n }\r\n\r\n async getTokens() {\r\n if (!this.tokens) {\r\n this.tokens = await this.doExchangeOrRefresh();\r\n }\r\n return this.tokens;\r\n }\r\n\r\n async getAccessToken() {\r\n const tokens = await this.getTokens();\r\n return tokens ? tokens.access_token : null;\r\n }\r\n\r\n override async getUser() {\r\n const tokens = await this.getTokens();\r\n return super.getUser(tokens);\r\n }\r\n\r\n async isAuthenticated() {\r\n const user = await this.getUser();\r\n return Boolean(user);\r\n }\r\n\r\n};\r\n\r\nexport class ClientFactory {\r\n static createClient(configFactory: AuthClientConfig): Client {\r\n const config = configFactory.get();\r\n\r\n if (!config) {\r\n throw new Error(\r\n 'Configuration must be specified either through AuthModule.forRoot or through AuthClientConfig.set'\r\n );\r\n }\r\n\r\n return new Client(config);\r\n }\r\n}\r\n\r\nexport const ClientService = new InjectionToken<Client>(\r\n 'firstline.client'\r\n);\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n defer,\r\n merge,\r\n of,\r\n ReplaySubject,\r\n Subject,\r\n} from 'rxjs';\r\nimport {\r\n concatMap,\r\n distinctUntilChanged,\r\n filter,\r\n mergeMap,\r\n scan,\r\n shareReplay,\r\n switchMap,\r\n} from 'rxjs/operators';\r\n\r\nimport { Client, ClientService } from './client';\r\n\r\n/**\r\n * Tracks the Authentication State for the SDK\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthState {\r\n private isLoadingSubject$ = new BehaviorSubject<boolean>(true);\r\n private refresh$ = new Subject<void>();\r\n private accessToken$ = new ReplaySubject<string>(1);\r\n private errorSubject$ = new ReplaySubject<Error>(1);\r\n\r\n /**\r\n * Emits boolean values indicating the loading state of the SDK.\r\n */\r\n public readonly isLoading$ = this.isLoadingSubject$.asObservable();\r\n\r\n /**\r\n * Trigger used to pull User information from the Client.\r\n * Triggers when the access token has changed.\r\n */\r\n private accessTokenTrigger$ = this.accessToken$.pipe(\r\n scan(\r\n (\r\n acc: { current: string | null; previous: string | null },\r\n current: string | null\r\n ) => ({\r\n previous: acc.current,\r\n current,\r\n }),\r\n { current: null, previous: null }\r\n ),\r\n filter(({ previous, current }) => previous !== current)\r\n );\r\n\r\n /**\r\n * Trigger used to pull User information from the Client.\r\n * Triggers when an event occurs that needs to retrigger the User Profile information.\r\n * Events: Login, Access Token change and Logout\r\n */\r\n private readonly isAuthenticatedTrigger$ = this.isLoading$.pipe(\r\n filter((loading) => !loading),\r\n distinctUntilChanged(),\r\n switchMap(() =>\r\n // To track the value of isAuthenticated over time, we need to merge:\r\n // - the current value\r\n // - the value whenever the access token changes. (this should always be true of there is an access token\r\n // but it is safer to pass this through this.client.isAuthenticated() nevertheless)\r\n // - the value whenever refreshState$ emits\r\n merge(\r\n defer(() => this.client.isAuthenticated()),\r\n this.accessTokenTrigger$.pipe(\r\n mergeMap(() => this.client.isAuthenticated())\r\n ),\r\n this.refresh$.pipe(mergeMap(() => this.client.isAuthenticated()))\r\n )\r\n )\r\n );\r\n\r\n /**\r\n * Emits boolean values indicating the authentication state of the user. If `true`, it means a user has authenticated.\r\n * This depends on the value of `isLoading$`, so there is no need to manually check the loading state of the SDK.\r\n */\r\n readonly isAuthenticated$ = this.isAuthenticatedTrigger$.pipe(\r\n distinctUntilChanged(),\r\n shareReplay(1)\r\n );\r\n\r\n /**\r\n * Emits details about the authenticated user, or null if not authenticated.\r\n */\r\n readonly user$ = this.isAuthenticatedTrigger$.pipe(\r\n concatMap((authenticated) =>\r\n authenticated ? this.client.getUser(): of(null)\r\n ),\r\n distinctUntilChanged()\r\n );\r\n\r\n /**\r\n * Emits errors that occur.\r\n */\r\n public readonly error$ = this.errorSubject$.asObservable();\r\n\r\n constructor(@Inject(ClientService) private client: Client) {}\r\n\r\n /**\r\n * Update the isLoading state using the provided value\r\n *\r\n * @param isLoading The new value for isLoading\r\n */\r\n public setIsLoading(isLoading: boolean): void {\r\n this.isLoadingSubject$.next(isLoading);\r\n }\r\n\r\n /**\r\n * Refresh the state to ensure the `isAuthenticated` and `user$`\r\n * reflect the most up-to-date values from Client.\r\n */\r\n public refresh(): void {\r\n this.refresh$.next();\r\n }\r\n\r\n /**\r\n * Update the access token, doing so will also refresh the state.\r\n *\r\n * @param accessToken The new Access Token\r\n */\r\n public setAccessToken(accessToken: string): void {\r\n this.accessToken$.next(accessToken);\r\n }\r\n\r\n /**\r\n * Emits the error in the `error$` observable.\r\n *\r\n * @param error The new error\r\n */\r\n public setError(error: any): void {\r\n this.errorSubject$.next(error);\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Inject } from '@angular/core'; // do not remove Inject import!!\r\nimport { LoginRedirectOptions as LoginRedirectOptionsSPA } from \"@first-line/firstline-spa-js\";\r\nimport {\r\n of,\r\n from,\r\n Subject,\r\n Observable,\r\n ReplaySubject,\r\n throwError,\r\n} from 'rxjs';\r\nimport {\r\n concatMap,\r\n tap,\r\n catchError\r\n} from 'rxjs/operators';\r\n\r\nimport { Client, ClientService } from './client'; // do not remove ClientService import!!\r\nimport { AppState } from './config';\r\nimport { AuthState } from './state';\r\n\r\nexport interface LoginWithRedirectOptions extends LoginRedirectOptionsSPA { };\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService<TAppState extends AppState = AppState>\r\n implements OnDestroy {\r\n private appStateSubject$ = new ReplaySubject<TAppState>(1);\r\n\r\n // https://stackoverflow.com/a/41177163\r\n private ngUnsubscribe$ = new Subject<void>();\r\n /**\r\n * Emits boolean values indicating the loading state of the SDK.\r\n */\r\n readonly isLoading$ = this.authState.isLoading$;\r\n\r\n /**\r\n * Emits boolean values indicating the authentication state of the user. If `true`, it means a user has authenticated.\r\n * This depends on the value of `isLoading$`, so there is no need to manually check the loading state of the SDK.\r\n */\r\n readonly isAuthenticated$ = this.authState.isAuthenticated$;\r\n\r\n /**\r\n * Emits details about the authenticated user, or null if not authenticated.\r\n */\r\n readonly user$ = this.authState.user$;\r\n\r\n /**\r\n * Emits errors that occur during login, or when checking for an active session on startup.\r\n */\r\n readonly error$ = this.authState.error$;\r\n\r\n /**\r\n * Emits the value (if any) that was passed to the `loginWithRedirect` method call\r\n * but only **after** `handleRedirectCallback` is first called\r\n */\r\n readonly appState$ = this.appStateSubject$.asObservable();\r\n\r\n constructor(\r\n @Inject(ClientService) private client: Client,\r\n private authState: AuthState\r\n ) {\r\n this.client.getAccessToken()\r\n .then()\r\n .catch(e => undefined)\r\n .finally(() => this.authState.setIsLoading(false));\r\n }\r\n\r\n /**\r\n * Called when the service is destroyed\r\n */\r\n ngOnDestroy(): void {\r\n // https://stackoverflow.com/a/41177163\r\n this.ngUnsubscribe$.next();\r\n this.ngUnsubscribe$.complete();\r\n }\r\n\r\n /**\r\n * ```js\r\n * loginWithRedirect(options);\r\n * ```\r\n *\r\n * Performs a login via redirect\r\n */\r\n loginWithRedirect(\r\n options?: LoginWithRedirectOptions\r\n ): Observable<void> {\r\n return from(this.client.loginRedirect(options));\r\n }\r\n\r\n /**\r\n * ```js\r\n * logout();\r\n * ```\r\n *\r\n * Clears the application session and signes out the user.\r\n */\r\n\r\n logout(): Observable<void> {\r\n return from(this.client.logout());\r\n }\r\n\r\n /**\r\n * ```js\r\n * getAccessToken().subscribe(token => ...)\r\n * ```\r\n *\r\n * If there's a valid token stored, return it. Otherwise, opens an\r\n * iframe with the `/authorize` URL using the parameters provided\r\n * as arguments. Random and secure `state` and `nonce` parameters\r\n * will be auto-generated. If the response is successful, results\r\n * will be valid according to their expiration times.\r\n *\r\n */\r\n getAccessToken(): Observable<string | null> {\r\n return of(this.client).pipe(\r\n concatMap(client => client.getAccessToken()),\r\n tap((access_token) => {\r\n if (access_token)\r\n return this.authState.setAccessToken(access_token);\r\n }),\r\n catchError((error) => {\r\n this.authState.setError(error);\r\n this.authState.refresh();\r\n return throwError(error);\r\n })\r\n );\r\n }\r\n}\r\n","import { InjectionToken, Injectable, Optional, Inject } from '@angular/core';\r\nimport { FirstlineClientOptions } from \"@first-line/firstline-spa-js\"\r\n\r\n/**\r\n * Defines a common set of HTTP methods.\r\n */\r\nexport const enum HttpMethod {\r\n Get = 'GET',\r\n Post = 'POST',\r\n Put = 'PUT',\r\n Patch = 'PATCH',\r\n Delete = 'DELETE',\r\n Head = 'HEAD',\r\n}\r\n\r\nexport interface GetTokenOptions { };\r\n\r\n/**\r\n * Defines the type for a route config entry. Can either be:\r\n *\r\n * - an object of type HttpInterceptorRouteConfig\r\n * - a string\r\n */\r\nexport type ApiRouteDefinition = HttpInterceptorRouteConfig | string;\r\n\r\n/**\r\n * A custom type guard to help identify route definitions that are actually HttpInterceptorRouteConfig types.\r\n *\r\n * @param def The route definition type\r\n */\r\nexport function isHttpInterceptorRouteConfig(\r\n def: ApiRouteDefinition\r\n): def is HttpInterceptorRouteConfig {\r\n return typeof def !== 'string';\r\n}\r\n\r\n/**\r\n * Configuration for the HttpInterceptor\r\n */\r\nexport interface HttpInterceptorConfig {\r\n allowedList: ApiRouteDefinition[];\r\n}\r\n\r\n/**\r\n * Configuration for a single interceptor route\r\n */\r\nexport interface HttpInterceptorRouteConfig {\r\n /**\r\n * The URL to test, by supplying the URL to match.\r\n * If `test` is a match for the current request path from the HTTP client, then\r\n * an access token is attached to the request in the\r\n * [\"Authorization\" header](https://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-20#section-2.1).\r\n *\r\n * If the test does not pass, the request proceeds without the access token attached.\r\n *\r\n * A wildcard character can be used to match only the start of the URL.\r\n *\r\n * @usagenotes\r\n *\r\n * '/api' - exactly match the route /api\r\n * '/api/*' - match any route that starts with /api/\r\n */\r\n uri?: string;\r\n\r\n /**\r\n * A function that will be called with the HttpRequest.url value, allowing you to do\r\n * any kind of flexible matching.\r\n *\r\n * If this function returns true, then\r\n * an access token is attached to the request in the\r\n * [\"Authorization\" header](https://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-20#section-2.1).\r\n *\r\n * If it returns false, the request proceeds without the access token attached.\r\n */\r\n uriMatcher?: (uri: string) => boolean;\r\n\r\n /**\r\n * The options that are passed to the SDK when retrieving the\r\n * access token to attach to the outgoing request.\r\n */\r\n tokenOptions?: GetTokenOptions;\r\n\r\n /**\r\n * The HTTP method to match on. If specified, the HTTP method of\r\n * the outgoing request will be checked against this. If there is no match, the\r\n * Authorization header is not attached.\r\n *\r\n * The HTTP method name is case-sensitive.\r\n */\r\n httpMethod?: HttpMethod | string;\r\n\r\n /**\r\n * Allow the HTTP call to be executed anonymously, when no token is available.\r\n *\r\n * When omitted (or set to false), calls that match the configuration will fail when no token is available.\r\n */\r\n allowAnonymous?: boolean;\r\n}\r\n\r\n/**\r\n * Configuration for the authentication service\r\n */\r\nexport interface AuthConfig extends FirstlineClientOptions {\r\n /**\r\n * Configuration for the built-in Http Interceptor, used for\r\n * automatically attaching access tokens.\r\n */\r\n httpInterceptor?: HttpInterceptorConfig;\r\n}\r\n\r\n/**\r\n * Angular specific state to be stored before redirect\r\n */\r\nexport interface AppState {\r\n\r\n /**\r\n * Any custom parameter to be stored in appState\r\n */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Injection token for accessing configuration.\r\n *\r\n * @usageNotes\r\n *\r\n * Use the `Inject` decorator to access the configuration from a service or component:\r\n *\r\n * ```\r\n * class MyService(@Inject(AuthConfigService) config: AuthConfig) {}\r\n * ```\r\n */\r\nexport const AuthConfigService = new InjectionToken<AuthConfig>(\r\n 'firstline.config'\r\n);\r\n\r\n/**\r\n * Gets and sets configuration for the internal client. This can be\r\n * used to provide configuration outside of using AuthModule.forRoot, i.e. from\r\n * a factory provided by APP_INITIALIZER.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthClientConfig {\r\n private config?: AuthConfig;\r\n\r\n constructor(@Optional() @Inject(AuthConfigService) config?: AuthConfig) {\r\n if (config) {\r\n this.set(config);\r\n }\r\n }\r\n\r\n /**\r\n * Sets configuration to be read by other consumers of the service (see usage notes)\r\n *\r\n * @param config The configuration to set\r\n */\r\n set(config: AuthConfig): void {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Gets the config that has been set by other consumers of the service\r\n */\r\n get(): AuthConfig {\r\n return this.config as AuthConfig;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n ActivatedRouteSnapshot,\r\n RouterStateSnapshot,\r\n CanActivate,\r\n CanLoad,\r\n Route,\r\n UrlSegment,\r\n CanActivateChild,\r\n} from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\nimport { tap, take } from 'rxjs/operators';\r\n\r\nimport { AuthService } from './service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthGuard implements CanActivate, CanLoad, CanActivateChild {\r\n constructor(private auth: AuthService) {}\r\n\r\n canLoad(route: Route, segments: UrlSegment[]): Observable<boolean> {\r\n return this.auth.isAuthenticated$.pipe(take(1));\r\n }\r\n\r\n canActivate(\r\n next: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): Observable<boolean> {\r\n return this.redirectIfUnauthenticated(state);\r\n }\r\n\r\n canActivateChild(\r\n childRoute: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): Observable<boolean> {\r\n return this.redirectIfUnauthenticated(state);\r\n }\r\n\r\n private redirectIfUnauthenticated(\r\n state: RouterStateSnapshot\r\n ): Observable<boolean> {\r\n return this.auth.isAuthenticated$.pipe(\r\n tap((loggedIn) => {\r\n if (!loggedIn) {\r\n this.auth.loginWithRedirect({ redirect_uri: state.url });\r\n }\r\n })\r\n );\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { AuthService } from './service';\r\nimport { AuthConfig, AuthConfigService, AuthClientConfig } from './config';\r\nimport { ClientService, ClientFactory } from './client';\r\nimport { AuthGuard } from './guard';\r\n\r\n\r\n@NgModule()\r\nexport class AuthModule {\r\n /**\r\n * Initialize the authentication module system. Configuration can either be specified here,\r\n * or by calling AuthClientConfig.set (perhaps from an APP_INITIALIZER factory function).\r\n *\r\n * @param config The optional configuration for the SDK.\r\n */\r\n static forRoot(config?: AuthConfig): ModuleWithProviders<AuthModule> {\r\n return {\r\n ngModule: AuthModule,\r\n providers: [\r\n AuthService,\r\n AuthGuard,\r\n {\r\n provide: AuthConfigService,\r\n useValue: config,\r\n },\r\n {\r\n provide: ClientService,\r\n useFactory: ClientFactory.createClient,\r\n deps: [AuthClientConfig],\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import {\r\n HttpInterceptor,\r\n HttpRequest,\r\n HttpHandler,\r\n HttpEvent,\r\n} from '@angular/common/http';\r\nimport { Observable, from, of, iif, throwError } from 'rxjs';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport {\r\n switchMap,\r\n first,\r\n concatMap,\r\n catchError,\r\n tap,\r\n filter,\r\n mergeMap,\r\n mapTo,\r\n pluck,\r\n} from 'rxjs/operators';\r\n\r\nimport {\r\n ApiRouteDefinition,\r\n isHttpInterceptorRouteConfig,\r\n AuthClientConfig,\r\n HttpInterceptorConfig,\r\n GetTokenOptions\r\n} from './config';\r\nimport { Client, ClientService } from './client';\r\nimport { AuthState } from './state';\r\nimport { AuthService } from './service';\r\n\r\nconst waitUntil =\r\n <TSignal>(signal$: Observable<TSignal>) =>\r\n <TSource>(source$: Observable<TSource>) =>\r\n source$.pipe(mergeMap((value) => signal$.pipe(first(), mapTo(value))));\r\n\r\n@Injectable()\r\nexport class AuthHttpInterceptor implements HttpInterceptor {\r\n constructor(\r\n private configFactory: AuthClientConfig,\r\n @Inject(ClientService) private client: Client,\r\n private authState: AuthState,\r\n private authService: AuthService\r\n ) {}\r\n\r\n intercept(\r\n req: HttpRequest<any>,\r\n next: HttpHandler\r\n ): Observable<HttpEvent<any>> {\r\n const config = this.configFactory.get();\r\n if (!config.httpInterceptor?.allowedList) {\r\n return next.handle(req);\r\n }\r\n\r\n const isLoaded$ = this.authService.isLoading$.pipe(\r\n filter((isLoading) => !isLoading)\r\n );\r\n\r\n return this.findMatchingRoute(req, config.httpInterceptor).pipe(\r\n concatMap((route) =>\r\n iif(\r\n // Check if a route was matched\r\n () => route !== null,\r\n // If we have a matching route, call getToken and attach the token to the\r\n // outgoing request\r\n of(route).pipe(\r\n waitUntil(isLoaded$), \r\n pluck('tokenOptions'),\r\n concatMap<GetTokenOptions, Observable<string>>(() =>\r\n this.getAccessToken().pipe(\r\n catchError((err) => {\r\n if (this.allowAnonymous(route, err)) {\r\n return of('');\r\n }\r\n\r\n this.authState.setError(err);\r\n return throwError(err);\r\n })\r\n )\r\n ),\r\n switchMap((token: string) => {\r\n // Clone the request and attach the bearer token\r\n const clone = token\r\n ? req.clone({\r\n headers: req.headers.set(\r\n 'Authorization',\r\n `Bearer ${token}`\r\n ),\r\n })\r\n : req;\r\n\r\n return next.handle(clone);\r\n })\r\n ),\r\n // If the URI being called was not found in our httpInterceptor config, simply\r\n // pass the request through without attaching a token\r\n next.handle(req)\r\n )\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Duplicate of AuthService.getAccessToken, but with a slightly different return & error handling.\r\n * Only used internally in the interceptor.\r\n *\r\n */\r\n private getAccessToken(): Observable<string> {\r\n return of(this.client).pipe(\r\n concatMap(async client => {\r\n return (await client.getAccessToken()) || \"\";\r\n }),\r\n tap((access_token) => {\r\n if (access_token)\r\n return this.authState.setAccessToken(access_token)\r\n }), catchError((error) => {\r\n console.error(\"error\");\r\n this.authState.refresh();\r\n return throwError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Strips the query and fragment from the given uri\r\n *\r\n * @param uri The uri to remove the query and fragment from\r\n */\r\n private stripQueryFrom(uri: string): string {\r\n if (uri.indexOf('?') > -1) {\r\n uri = uri.substr(0, uri.indexOf('?'));\r\n }\r\n\r\n if (uri.indexOf('#') > -1) {\r\n uri = uri.substr(0, uri.indexOf('#'));\r\n }\r\n\r\n return uri;\r\n }\r\n\r\n /**\r\n * Determines whether the specified route can have an access token attached to it, based on matching the HTTP request against\r\n * the interceptor route configuration.\r\n *\r\n * @param route The route to test\r\n * @param request The HTTP request\r\n */\r\n private canAttachToken(\r\n route: ApiRouteDefinition,\r\n request: HttpRequest<any>\r\n ): boolean {\r\n const testPrimitive = (value: string | undefined): boolean => {\r\n if (!value) {\r\n return false;\r\n }\r\n\r\n const requestPath = this.stripQueryFrom(request.url);\r\n\r\n if (value === requestPath) {\r\n return true;\r\n }\r\n\r\n // If the URL ends with an asterisk, match using startsWith.\r\n return (\r\n value.indexOf('*') === value.length - 1 &&\r\n request.url.startsWith(value.substr(0, value.length - 1))\r\n );\r\n };\r\n\r\n if (isHttpInterceptorRouteConfig(route)) {\r\n if (route.httpMethod && route.httpMethod !== request.method) {\r\n return false;\r\n }\r\n\r\n /* istanbul ignore if */\r\n if (!route.uri && !route.uriMatcher) {\r\n console.warn(\r\n 'Either a uri or uriMatcher is required when configuring the HTTP interceptor.'\r\n );\r\n }\r\n\r\n return route.uriMatcher\r\n ? route.uriMatcher(request.url)\r\n : testPrimitive(route.uri);\r\n }\r\n\r\n return testPrimitive(route);\r\n }\r\n\r\n /**\r\n * Tries to match a route from the SDK configuration to the HTTP request.\r\n * If a match is found, the route configuration is returned.\r\n *\r\n * @param request The Http request\r\n * @param config HttpInterceptorConfig\r\n */\r\n private findMatchingRoute(\r\n request: HttpRequest<any>,\r\n config: HttpInterceptorConfig\r\n ): Observable<ApiRouteDefinition | null> {\r\n return from(config.allowedList).pipe(\r\n first((route) => this.canAttachToken(route, request), null)\r\n );\r\n }\r\n\r\n private allowAnonymous(route: ApiRouteDefinition | null, err: any): boolean {\r\n return (\r\n !!route &&\r\n isHttpInterceptorRouteConfig(route) &&\r\n !!route.allowAnonymous &&\r\n ['login_required', 'consent_required', 'missing_refresh_token'].includes(\r\n err.error\r\n )\r\n );\r\n }\r\n}\r\n","import { Provider } from '@angular/core';\r\n\r\nimport { ClientService, ClientFactory } from './client';\r\nimport { AuthConfig, AuthConfigService, AuthClientConfig } from './config';\r\nimport { AuthGuard } from './guard';\r\nimport { AuthHttpInterceptor } from './interceptor';\r\nimport { AuthService } from './service';\r\n\r\n/**\r\n * Initialize the authentication system. Configuration can either be specified here,\r\n * or by calling AuthClientConfig.set (perhaps from an APP_INITIALIZER factory function).\r\n *\r\n * Note: Should only be used as of Angular 15, and should not be added to a component's providers.\r\n *\r\n * @param config The optional configuration for the SDK.\r\n *\r\n * @example\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [\r\n * provide(),\r\n * ],\r\n * });\r\n */\r\nexport function provide(config?: AuthConfig): Provider[] {\r\n return [\r\n AuthService,\r\n AuthHttpInterceptor,\r\n AuthGuard,\r\n {\r\n provide: AuthConfigService,\r\n useValue: config,\r\n },\r\n {\r\n provide: ClientService,\r\n useFactory: ClientFactory.createClient,\r\n deps: [AuthClientConfig],\r\n },\r\n ];\r\n}\r\n","import { HttpEvent, HttpRequest } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\nimport { AuthGuard } from './guard';\r\nimport { AuthHttpInterceptor } from './interceptor';\r\n\r\n/**\r\n * Functional AuthGuard to ensure routes can only be accessed when authenticated.\r\n *\r\n * Note: Should only be used as of Angular 15\r\n *\r\n * @param route Contains the information about a route associated with a component loaded in an outlet at a particular moment in time.\r\n * @param state Represents the state of the router at a moment in time.\r\n * @returns An Observable, indicating if the route can be accessed or not\r\n */\r\nexport const authGuardFn = (\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n) => inject(AuthGuard).canActivate(route, state);\r\n\r\n/**\r\n * Functional AuthHttpInterceptor to include the access token in matching requests.\r\n *\r\n * Note: Should only be used as of Angular 15\r\n *\r\n * @param req An outgoing HTTP request with an optional typed body.\r\n * @param handle Represents the next interceptor in an interceptor chain, or the real backend if there are no\r\n * further interceptors.\r\n * @returns An Observable representing the intercepted HttpRequest\r\n */\r\nexport const authHttpInterceptorFn = (\r\n req: HttpRequest<any>,\r\n handle: (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>\r\n) => inject(AuthHttpInterceptor).intercept(req, { handle });\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AuthState","i1.AuthService","i2.AuthState","i3.AuthService"],"mappings":"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"}