@bravobit/bb-foundation 0.52.0 → 0.52.1

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.
@@ -7,12 +7,14 @@ export declare class AuthInterceptor implements HttpInterceptor {
7
7
  private readonly _authHeaderString;
8
8
  private readonly _authScheme;
9
9
  isRefreshing: boolean;
10
- refreshingAccessToken$: BehaviorSubject<string>;
10
+ refreshingAccessToken$: BehaviorSubject<boolean>;
11
11
  intercept(request: HttpRequest<unknown>, next: HttpHandler): import("rxjs").Observable<import("@angular/common/http").HttpEvent<any>>;
12
+ private modifyRequest;
13
+ private handleBrowserStorageRequest;
14
+ private handleHttpOnlyCookieRequest;
12
15
  private handle401Error;
13
16
  private logoutUser;
14
- private getAccessToken;
15
- private addAuthorizationHeader;
17
+ private getAccessTokenFromSession;
16
18
  static ɵfac: i0.ɵɵFactoryDeclaration<AuthInterceptor, never>;
17
19
  static ɵprov: i0.ɵɵInjectableDeclaration<AuthInterceptor>;
18
20
  }
@@ -1,4 +1,5 @@
1
1
  import { StorageStrategy } from '@bravobit/bb-foundation/storage';
2
+ import { AuthStrategy } from './interfaces/config.interface';
2
3
  import { AuthToken } from './interfaces/token.interface';
3
4
  export declare class AuthSession {
4
5
  private readonly _jwt;
@@ -6,6 +7,7 @@ export declare class AuthSession {
6
7
  private readonly _accessTokenStorageKey;
7
8
  private readonly _refreshTokenStorageKey;
8
9
  private readonly _userStorageKey;
10
+ private readonly _strategy;
9
11
  private _accessTokenString;
10
12
  private _refreshTokenString;
11
13
  private _accessTokenPayload;
@@ -15,8 +17,13 @@ export declare class AuthSession {
15
17
  constructor(options?: {
16
18
  id?: string;
17
19
  storage?: StorageStrategy;
20
+ strategy?: AuthStrategy;
18
21
  });
19
22
  get snapshot(): {
23
+ user: any;
24
+ accessToken?: undefined;
25
+ refreshToken?: undefined;
26
+ } | {
20
27
  user: any;
21
28
  accessToken: string;
22
29
  refreshToken: string;
@@ -1,7 +1,9 @@
1
1
  import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
2
2
  import { InjectionToken } from '@angular/core';
3
+ export type AuthStrategy = 'httpOnlyCookie' | 'browserStorage';
3
4
  export interface AuthConfig {
4
5
  applicationId: string;
6
+ strategy: AuthStrategy;
5
7
  http?: {
6
8
  scheme?: string;
7
9
  header?: string;
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Injector, TransferState, makeStateKey, Injectable, Directive, Input, provideAppInitializer, makeEnvironmentProviders, NgModule } from '@angular/core';
3
- import { HttpContextToken, HttpClient, HttpContext, HttpErrorResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
3
+ import { HttpContextToken, HttpClient, HttpHeaders, HttpContext, HttpErrorResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
4
4
  import { shareReplay, tap, map, distinctUntilChanged, catchError, filter, take, switchMap, finalize } from 'rxjs/operators';
5
5
  import { firstValueFrom, BehaviorSubject, of, Subscription, first, throwError } from 'rxjs';
6
6
  import { Storage, StorageOption } from '@bravobit/bb-foundation/storage';
@@ -138,6 +138,7 @@ class AuthSession {
138
138
  _accessTokenStorageKey;
139
139
  _refreshTokenStorageKey;
140
140
  _userStorageKey;
141
+ _strategy;
141
142
  // Token strings.
142
143
  _accessTokenString = null;
143
144
  _refreshTokenString = null;
@@ -156,10 +157,14 @@ class AuthSession {
156
157
  this._userStorageKey = this.generateKey(applicationId, 'au_usr');
157
158
  // Setting up the storage.
158
159
  this._storage = options?.storage ?? null;
160
+ this._strategy = options?.strategy ?? null;
159
161
  // Init methods.
160
162
  this.restoreFromStorage();
161
163
  }
162
164
  get snapshot() {
165
+ if (this._strategy === 'httpOnlyCookie') {
166
+ return { user: this._user$.getValue() };
167
+ }
163
168
  return {
164
169
  user: this._user$.getValue(),
165
170
  accessToken: this.accessToken,
@@ -183,9 +188,12 @@ class AuthSession {
183
188
  return this._refreshTokenPayload ?? null;
184
189
  }
185
190
  authenticated() {
186
- return this.isTokenValid(this._accessTokenPayload) || this.isTokenValid(this._refreshTokenPayload);
191
+ return !!this.snapshot?.user;
187
192
  }
188
193
  setTokens(accessToken, refreshToken, persist = true) {
194
+ if (this._strategy === 'httpOnlyCookie') {
195
+ return;
196
+ }
189
197
  this.setAccessToken(accessToken);
190
198
  this.setRefreshToken(refreshToken);
191
199
  if (persist) {
@@ -206,20 +214,22 @@ class AuthSession {
206
214
  if (!this._storage) {
207
215
  return;
208
216
  }
209
- // Set the access token.
210
- const accessToken = this._storage.get(this._accessTokenStorageKey);
211
- this.setAccessToken(accessToken);
212
- // Set the refresh token.
213
- const refreshToken = this._storage.get(this._refreshTokenStorageKey);
214
- this.setRefreshToken(refreshToken);
217
+ if (this._strategy === 'browserStorage') {
218
+ // Set the access token.
219
+ const accessToken = this._storage.get(this._accessTokenStorageKey);
220
+ this.setAccessToken(accessToken);
221
+ // Set the refresh token.
222
+ const refreshToken = this._storage.get(this._refreshTokenStorageKey);
223
+ this.setRefreshToken(refreshToken);
224
+ }
215
225
  // Set the user if we have any correct token payloads.
216
- if (this._accessTokenPayload || this._refreshTokenPayload) {
226
+ if ((this._accessTokenPayload || this._refreshTokenPayload) || this._strategy === 'httpOnlyCookie') {
217
227
  const user = this._storage.get(this._userStorageKey);
218
228
  this._user$.next(user ?? null); // Note: just settings here instead of setUser() because of syncing to the storage.
219
229
  }
220
230
  }
221
231
  persistTokensInStorage() {
222
- if (!this._storage) {
232
+ if (!this._storage || this._strategy === 'httpOnlyCookie') {
223
233
  return;
224
234
  }
225
235
  // Set the access token if completely valid.
@@ -263,15 +273,15 @@ class AuthSession {
263
273
  this._refreshTokenString = value ?? null;
264
274
  this._refreshTokenPayload = this._jwt.decode(this._refreshTokenString);
265
275
  }
266
- generateKey = (applicationId, key) => {
276
+ generateKey(applicationId, key) {
267
277
  return [applicationId, key].join('_');
268
- };
269
- isTokenValid = (token) => {
278
+ }
279
+ isTokenValid(token) {
270
280
  if (!token) {
271
281
  return false;
272
282
  }
273
283
  return token?.expiresAt?.getTime() > Date.now();
274
- };
284
+ }
275
285
  }
276
286
 
277
287
  class Auth {
@@ -299,7 +309,8 @@ class Auth {
299
309
  // Starting the new session.
300
310
  this.session = new AuthSession({
301
311
  id: this._config?.applicationId,
302
- storage: storageStrategy
312
+ storage: storageStrategy,
313
+ strategy: this._config?.strategy
303
314
  });
304
315
  this.user = this.session.user;
305
316
  }
@@ -318,15 +329,16 @@ class Auth {
318
329
  const user = this._state?.get(this._authStateKey, null) ?? null;
319
330
  return this.session.setUser(user);
320
331
  }
321
- // Try to fetch the user from the server.
322
- const user$ = this.me();
323
- const user = await firstValueFrom(user$, { defaultValue: null });
324
- // Set the state if exists.
325
- if (this._state) {
326
- this._state?.set(this._authStateKey, user ?? null);
332
+ if (this._config?.strategy === 'browserStorage') {
333
+ // Try to fetch the user from the server.
334
+ const user$ = this.me();
335
+ const user = await firstValueFrom(user$, { defaultValue: null });
336
+ // Set the state if exists.
337
+ if (this._state) {
338
+ this._state?.set(this._authStateKey, user ?? null);
339
+ }
340
+ this.session.setUser(user);
327
341
  }
328
- // Save the user in the storage and handle auto refreshing.
329
- this.session.setUser(user);
330
342
  this.handleAutoRefreshing();
331
343
  }
332
344
  me() {
@@ -365,10 +377,8 @@ class Auth {
365
377
  }
366
378
  async resendVerifyCode(verifyToken) {
367
379
  const url = this.getUrl('auth/resend');
368
- const result$ = this._httpClient.post(url, {
369
- verify_token: verifyToken
370
- });
371
- return firstValueFrom(result$);
380
+ const result$ = this._httpClient.post(url, { verify_token: verifyToken });
381
+ return await firstValueFrom(result$);
372
382
  }
373
383
  async register(data, options) {
374
384
  // Execute API call.
@@ -388,30 +398,36 @@ class Auth {
388
398
  // Note: We do this because else we try to invalidate
389
399
  // an "undefined" refresh token.
390
400
  const refreshToken = this.session.refreshToken;
391
- if (!refreshToken) {
401
+ if (!refreshToken && this._config?.strategy === 'browserStorage') {
392
402
  return this.session.clear();
393
403
  }
394
- // We do have a refresh token, so try to
395
- // invalidate it in the backend.
404
+ // We do have a refresh token, so try to invalidate it in the backend.
405
+ // or we are httpOnlyCookie authenticated.
396
406
  try {
397
407
  const url = this.getUrl('auth/logout');
398
408
  const headerName = this._config?.http?.header ?? 'Authorization';
409
+ const headers = new HttpHeaders({
410
+ [headerName]: refreshToken
411
+ });
399
412
  const observable$ = this._httpClient.get(url, {
400
- headers: { [headerName]: refreshToken }
413
+ ...(this._config?.strategy === 'browserStorage' ? { headers } : {}),
414
+ ...(this._config?.strategy === 'httpOnlyCookie' ? { withCredentials: true } : {})
401
415
  });
402
416
  firstValueFrom(observable$).then(_ => _).catch(_ => _);
403
417
  }
404
418
  catch {
405
419
  // Do nothing because the tokens will be deleted anyways from the session.
406
420
  }
407
- // Delete the tokens from the session.
408
- return this.session.clear();
421
+ finally {
422
+ // Delete the tokens from the session.
423
+ this.session.clear();
424
+ }
409
425
  }
410
426
  refresh() {
411
427
  // If the refresh token does
412
428
  // not exist just return an observable of null.
413
429
  const refreshToken = this.session.refreshToken;
414
- if (!refreshToken) {
430
+ if (!refreshToken && this._config?.strategy === 'browserStorage') {
415
431
  return of(null);
416
432
  }
417
433
  // Perform the refresh call.
@@ -419,8 +435,12 @@ class Auth {
419
435
  const scheme = this._config?.http?.scheme ?? 'Bearer';
420
436
  const url = this.getUrl('auth/refresh');
421
437
  const context = new HttpContext().set(USE_AUTHORIZATION, false);
438
+ const headers = new HttpHeaders({
439
+ [headerName]: `${scheme} ${refreshToken}`
440
+ });
422
441
  return this._httpClient.get(url, {
423
- headers: { [headerName]: `${scheme} ${refreshToken}` },
442
+ ...(this._config?.strategy === 'browserStorage' ? { headers } : {}),
443
+ ...(this._config?.strategy === 'httpOnlyCookie' ? { withCredentials: true } : {}),
424
444
  context: context
425
445
  }).pipe(tap(({ token, refresh_token }) => this.setTokens(token, refresh_token)), map(({ token }) => token));
426
446
  }
@@ -461,7 +481,7 @@ class Auth {
461
481
  }
462
482
  handleAutoRefreshing() {
463
483
  const shouldAutoRefresh = this._config?.autoRefresh ?? false;
464
- if (!shouldAutoRefresh) {
484
+ if (!shouldAutoRefresh || this._config?.strategy === 'httpOnlyCookie') {
465
485
  return;
466
486
  }
467
487
  const expiresAt = this.session.refreshTokenPayload?.expiresAt ?? null;
@@ -708,15 +728,14 @@ class AuthInterceptor {
708
728
  _authScheme = this._config?.http?.scheme ?? 'Bearer';
709
729
  // Data.
710
730
  isRefreshing = false;
711
- refreshingAccessToken$ = new BehaviorSubject(null);
731
+ refreshingAccessToken$ = new BehaviorSubject(false);
712
732
  intercept(request, next) {
713
733
  // 1. Check if the user wants to use the authorization for this request.
714
734
  if (!request.context.get(USE_AUTHORIZATION)) {
715
735
  return next.handle(request);
716
736
  }
717
737
  // 2. Compose the new request.
718
- const accessToken = this.getAccessToken(request);
719
- const newRequest = this.addAuthorizationHeader(request, accessToken);
738
+ const newRequest = this.modifyRequest(request);
720
739
  // 3. Handle all errors.
721
740
  return next.handle(newRequest).pipe(catchError(error => {
722
741
  // Handle the HTTP401 error.
@@ -727,20 +746,42 @@ class AuthInterceptor {
727
746
  return throwError(() => error);
728
747
  }));
729
748
  }
749
+ modifyRequest(request) {
750
+ switch (this._config?.strategy) {
751
+ case 'browserStorage':
752
+ return this.handleBrowserStorageRequest(request);
753
+ case 'httpOnlyCookie':
754
+ return this.handleHttpOnlyCookieRequest(request);
755
+ default:
756
+ throw new Error(`invalid auth strategy "${this._config?.strategy}"`);
757
+ }
758
+ }
759
+ handleBrowserStorageRequest(request) {
760
+ const accessToken = this.getAccessTokenFromSession(request);
761
+ if (!accessToken) {
762
+ return request.clone({ headers: request.headers.delete(this._authHeaderString) });
763
+ }
764
+ return request.clone({
765
+ setHeaders: { [this._authHeaderString]: `${this._authScheme} ${accessToken}` }
766
+ });
767
+ }
768
+ handleHttpOnlyCookieRequest(request) {
769
+ return request.clone({ withCredentials: true });
770
+ }
730
771
  handle401Error(request, next) {
731
772
  // If already refreshing wait for the refresh token to complete.
732
773
  if (this.isRefreshing) {
733
- return this.refreshingAccessToken$.pipe(filter(accessToken => accessToken !== null), take(1), switchMap(accessToken => next.handle(this.addAuthorizationHeader(request, accessToken))));
774
+ return this.refreshingAccessToken$.pipe(filter(accessToken => accessToken !== false), take(1), switchMap(() => next.handle(this.modifyRequest(request))));
734
775
  }
735
776
  // Set the refreshing to true.
736
777
  this.isRefreshing = true;
737
- this.refreshingAccessToken$.next(null);
778
+ this.refreshingAccessToken$.next(false);
738
779
  return this._auth.refresh().pipe(switchMap(newAccessToken => {
739
- if (!newAccessToken) {
780
+ if (!newAccessToken && this._config?.strategy === 'browserStorage') {
740
781
  return throwError(() => new Error('No refresh token was available.'));
741
782
  }
742
- this.refreshingAccessToken$.next(newAccessToken);
743
- return next.handle(this.addAuthorizationHeader(request, newAccessToken));
783
+ this.refreshingAccessToken$.next(true);
784
+ return next.handle(this.modifyRequest(request));
744
785
  }), catchError(() => this.logoutUser()), finalize(() => this.isRefreshing = false));
745
786
  }
746
787
  logoutUser() {
@@ -749,27 +790,14 @@ class AuthInterceptor {
749
790
  // Return null as data.
750
791
  return of(null);
751
792
  }
752
- getAccessToken = (request) => {
793
+ getAccessTokenFromSession(request) {
753
794
  // Get the token based on header.
754
795
  if (request.headers.has(this._authHeaderString)) {
755
796
  return request.headers.get(this._authHeaderString);
756
797
  }
757
798
  // Return the default access token.
758
799
  return this._auth.session.accessToken;
759
- };
760
- addAuthorizationHeader = (request, accessToken = null) => {
761
- // Remove auth header when we do not have
762
- // an access token.
763
- if (!accessToken) {
764
- return request.clone({
765
- headers: request.headers.delete(this._authHeaderString)
766
- });
767
- }
768
- // Add the auth header to the request.
769
- return request.clone({
770
- setHeaders: { [this._authHeaderString]: `${this._authScheme} ${accessToken}` }
771
- });
772
- };
800
+ }
773
801
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: AuthInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
774
802
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: AuthInterceptor });
775
803
  }
@@ -783,6 +811,9 @@ function provideAuthConfig(config) {
783
811
  { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
784
812
  provideAppInitializer(() => inject(Auth).initialize())
785
813
  ];
814
+ if (config?.strategy === 'httpOnlyCookie' && !config?.bootstrap) {
815
+ throw new Error('the "bootstrap" option must be enabled when using strategy=httpOnlyCookie');
816
+ }
786
817
  if (config?.interceptActing) {
787
818
  providers.push({ provide: HTTP_INTERCEPTORS, useClass: ActingInterceptor, multi: true });
788
819
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bravobit-bb-foundation-auth.mjs","sources":["../../../projects/bb-foundation/auth/src/lib/interfaces/config.interface.ts","../../../projects/bb-foundation/auth/src/lib/tokens/use-authorization.token.ts","../../../projects/bb-foundation/auth/src/lib/helpers/jwt.helper.ts","../../../projects/bb-foundation/auth/src/lib/providers/verify.provider.ts","../../../projects/bb-foundation/auth/src/lib/providers/email.provider.ts","../../../projects/bb-foundation/auth/src/lib/auth.session.ts","../../../projects/bb-foundation/auth/src/lib/auth.service.ts","../../../projects/bb-foundation/auth/src/lib/directives/authenticated.directive.ts","../../../projects/bb-foundation/auth/src/lib/guards/anonymous.guard.ts","../../../projects/bb-foundation/auth/src/lib/guards/authenticated.guard.ts","../../../projects/bb-foundation/auth/src/lib/acting.service.ts","../../../projects/bb-foundation/auth/src/lib/acting.interceptor.ts","../../../projects/bb-foundation/auth/src/lib/auth.interceptor.ts","../../../projects/bb-foundation/auth/src/lib/auth.config.ts","../../../projects/bb-foundation/auth/src/lib/auth.module.ts","../../../projects/bb-foundation/auth/src/bravobit-bb-foundation-auth.ts"],"sourcesContent":["import {ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree} from '@angular/router';\nimport {InjectionToken} from '@angular/core';\n\nexport interface AuthConfig {\n applicationId: string;\n\n http?: {\n scheme?: string,\n header?: string\n };\n\n redirects?: {\n authenticated?: string | string[];\n unauthenticated?: string | string[];\n };\n setRedirectOnFailedAuth?: boolean;\n\n interceptActing?: boolean;\n\n bootstrap?: boolean;\n providers?: string[];\n autoRefresh?: boolean;\n}\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('auth config');\n\nexport const AUTH_REDIRECT_HANDLER = new InjectionToken<AuthRedirectHandler>('auth redirect handler');\n\nexport interface AuthRedirectHandler {\n\n onFailedAuthenticated(snapshot?: ActivatedRouteSnapshot, state?: RouterStateSnapshot): boolean | UrlTree;\n onFailedAnonymous(snapshot?: ActivatedRouteSnapshot, state?: RouterStateSnapshot): boolean | UrlTree;\n\n}\n","import {HttpContextToken} from '@angular/common/http';\n\nexport const USE_AUTHORIZATION = new HttpContextToken(() => true);","import {AuthToken} from '../interfaces/token.interface';\n\nexport class JwtHelper {\n\n decode(token: string) {\n try {\n if (token === null || token === undefined) {\n return null;\n }\n\n const json = JSON.parse(\n this.urlDecode(token.split('.')[1])\n );\n\n return this.parse(json);\n } catch {\n return null;\n }\n }\n\n private urlDecode(token: string | null) {\n const value = token || '';\n let output = value\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += '==';\n break;\n case 3:\n output += '=';\n break;\n default:\n throw 'Illegal base64url string!';\n }\n\n try {\n return this.baseDecodeUnicode(output);\n } catch {\n return atob(output);\n }\n }\n\n private baseDecodeUnicode = (value: string) => {\n return decodeURIComponent(atob(value).replace(/(.)/g, (_, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = '0' + code;\n }\n return '%' + code;\n }));\n };\n\n private parse = (data: object) => {\n return {\n id: data['jti'] ?? null,\n type: data['typ'] ?? null,\n audience: data['aud'] ?? null,\n issuer: data['iss'] ?? null,\n subject: data['sub'] ?? null,\n role: data['role'] ?? null,\n notValidBefore: this.parseDate(data['nbf']),\n expiresAt: this.parseDate(data['exp']),\n issuedAt: this.parseDate(data['iat'])\n } as AuthToken;\n };\n\n private parseDate = (epochInSeconds: number) => {\n if (!epochInSeconds || epochInSeconds <= 0) {\n return null;\n }\n\n return new Date(epochInSeconds * 1000);\n };\n\n}\n","import {AuthProvider, AuthProviderResponse, AuthProviderResult} from '../interfaces/provider.interface';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\n\nexport class AuthVerifyProvider implements AuthProvider {\n\n constructor(private _code: string,\n private _verifyToken: string,\n private _endpoint: string) {\n }\n\n async authenticate(httpClient: HttpClient): Promise<AuthProviderResult> {\n // Execute API call.\n const data$ = httpClient.post<Pick<AuthProviderResponse, 'token' | 'refresh_token' | 'user'>>(this._endpoint, {\n token: this._code,\n verify_token: this._verifyToken\n });\n\n const data = await firstValueFrom(data$);\n return {\n accessToken: data?.token,\n refreshToken: data?.refresh_token,\n user: data?.user\n };\n }\n\n}\n","import {AuthProvider, AuthProviderResponse, AuthProviderResult} from '../interfaces/provider.interface';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\n\nexport class AuthEmailProvider implements AuthProvider {\n\n constructor(private _email: string,\n private _password: string,\n private _endpoint: string) {\n }\n\n async authenticate(httpClient: HttpClient): Promise<AuthProviderResult> {\n // Execute API call.\n const data$ = httpClient.post<AuthProviderResponse>(this._endpoint, {\n email: this._email,\n password: this._password\n });\n\n const data = await firstValueFrom(data$);\n return {\n accessToken: data?.token,\n refreshToken: data?.refresh_token,\n user: data?.user,\n provider: data?.provider,\n verifyToken: data?.verify_token\n };\n }\n\n}\n","import {StorageStrategy} from '@bravobit/bb-foundation/storage';\nimport {AuthToken} from './interfaces/token.interface';\nimport {JwtHelper} from './helpers/jwt.helper';\nimport {shareReplay} from 'rxjs/operators';\nimport {BehaviorSubject} from 'rxjs';\n\nexport class AuthSession {\n\n // Readonly data.\n private readonly _jwt = new JwtHelper();\n private readonly _storage: StorageStrategy | null;\n private readonly _accessTokenStorageKey: string;\n private readonly _refreshTokenStorageKey: string;\n private readonly _userStorageKey: string;\n\n // Token strings.\n private _accessTokenString: string | null = null;\n private _refreshTokenString: string | null = null;\n\n // Token payloads.\n private _accessTokenPayload: AuthToken | null = null;\n private _refreshTokenPayload: AuthToken | null = null;\n\n // Private user data.\n private _user$ = new BehaviorSubject<any | null>(null);\n\n // Public user data.\n user = this._user$.pipe(\n shareReplay({refCount: true, bufferSize: 1})\n );\n\n constructor(options?: { id?: string, storage?: StorageStrategy }) {\n const applicationId = options?.id ?? 'ng';\n\n // Setting up the readonly storage keys.\n this._accessTokenStorageKey = this.generateKey(applicationId, 'au_act');\n this._refreshTokenStorageKey = this.generateKey(applicationId, 'au_rft');\n this._userStorageKey = this.generateKey(applicationId, 'au_usr');\n\n // Setting up the storage.\n this._storage = options?.storage ?? null;\n\n // Init methods.\n this.restoreFromStorage();\n }\n\n get snapshot() {\n return {\n user: this._user$.getValue(),\n accessToken: this.accessToken,\n refreshToken: this.refreshToken\n };\n }\n\n get accessToken() {\n return this.isTokenValid(this._accessTokenPayload)\n ? this._accessTokenString\n : null;\n }\n\n get refreshToken() {\n return this.isTokenValid(this.refreshTokenPayload)\n ? this._refreshTokenString\n : null;\n }\n\n get accessTokenPayload() {\n return this._accessTokenPayload ?? null;\n }\n\n get refreshTokenPayload() {\n return this._refreshTokenPayload ?? null;\n }\n\n authenticated() {\n return this.isTokenValid(this._accessTokenPayload) || this.isTokenValid(this._refreshTokenPayload);\n }\n\n setTokens(accessToken: string | null, refreshToken: string | null, persist: boolean = true) {\n this.setAccessToken(accessToken);\n this.setRefreshToken(refreshToken);\n\n if (persist) {\n this.persistTokensInStorage();\n }\n }\n\n setUser(user: unknown, persist: boolean = true) {\n this._user$.next(user ?? null);\n\n if (persist) {\n this.persistUserInStorage();\n }\n }\n\n clear() {\n this.setTokens(null, null);\n this.setUser(null);\n }\n\n private restoreFromStorage() {\n if (!this._storage) {\n return;\n }\n\n // Set the access token.\n const accessToken = this._storage.get<string>(this._accessTokenStorageKey);\n this.setAccessToken(accessToken);\n\n // Set the refresh token.\n const refreshToken = this._storage.get<string>(this._refreshTokenStorageKey);\n this.setRefreshToken(refreshToken);\n\n // Set the user if we have any correct token payloads.\n if (this._accessTokenPayload || this._refreshTokenPayload) {\n const user = this._storage.get<unknown>(this._userStorageKey);\n this._user$.next(user ?? null); // Note: just settings here instead of setUser() because of syncing to the storage.\n }\n }\n\n private persistTokensInStorage() {\n if (!this._storage) {\n return;\n }\n\n // Set the access token if completely valid.\n if (!!this.accessToken) {\n this._storage.set<string>(this._accessTokenStorageKey, this._accessTokenString, {\n expires: this._accessTokenPayload?.expiresAt\n });\n } else {\n this._storage.remove(this._accessTokenStorageKey);\n }\n\n // Set the refresh token if completely valid.\n if (!!this.refreshToken) {\n this._storage.set<string>(this._refreshTokenStorageKey, this._refreshTokenString, {\n expires: this._refreshTokenPayload?.expiresAt\n });\n } else {\n this._storage.remove(this._refreshTokenStorageKey);\n }\n }\n\n private persistUserInStorage() {\n if (!this._storage) {\n return;\n }\n\n const user = this._user$.getValue();\n if (!user) {\n return this._storage.remove(this._userStorageKey);\n }\n\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n this._storage.set<unknown>(this._userStorageKey, user, {\n expires: new Date(date.getTime())\n });\n }\n\n private setAccessToken(value: string | null) {\n this._accessTokenString = value ?? null;\n this._accessTokenPayload = this._jwt.decode(this._accessTokenString);\n }\n\n private setRefreshToken(value: string | null) {\n this._refreshTokenString = value ?? null;\n this._refreshTokenPayload = this._jwt.decode(this._refreshTokenString);\n }\n\n private generateKey = (applicationId: string, key: string) => {\n return [applicationId, key].join('_');\n };\n\n private isTokenValid = (token: AuthToken) => {\n if (!token) {\n return false;\n }\n\n return token?.expiresAt?.getTime() > Date.now();\n };\n\n}\n","import {AUTH_CONFIG, AUTH_REDIRECT_HANDLER, AuthConfig, AuthRedirectHandler} from './interfaces/config.interface';\nimport {inject, Injectable, Injector, makeStateKey, StateKey, TransferState} from '@angular/core';\nimport {HttpClient, HttpContext, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {AuthProvider, AuthSignInResponse} from './interfaces/provider.interface';\nimport {Storage, StorageOption} from '@bravobit/bb-foundation/storage';\nimport {HttpConfig, HTTP_CONFIG} from '@bravobit/bb-foundation/http';\nimport {USE_AUTHORIZATION} from './tokens/use-authorization.token';\nimport {AuthVerifyProvider} from './providers/verify.provider';\nimport {AuthEmailProvider} from './providers/email.provider';\nimport {firstValueFrom, Observable, of} from 'rxjs';\nimport {Platform} from '@angular/cdk/platform';\nimport {AuthSession} from './auth.session';\nimport {map, tap} from 'rxjs/operators';\nimport {Router} from '@angular/router';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Auth {\n\n // Dependencies.\n private readonly _storage: Storage = inject(Storage);\n private readonly _injector: Injector = inject(Injector);\n private readonly _platform: Platform = inject(Platform);\n private readonly _httpClient: HttpClient = inject(HttpClient);\n private readonly _state?: TransferState = inject(TransferState, {optional: true});\n private readonly _config?: AuthConfig = inject(AUTH_CONFIG, {optional: true});\n private readonly _httpConfig?: HttpConfig = inject(HTTP_CONFIG, {optional: true});\n private readonly _handler?: AuthRedirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n // Readonly data.\n private readonly _authStateKey: StateKey<any | null> = makeStateKey(`bbAuthStateKey`);\n private readonly _httpAlias: string | null = this._httpConfig?.defaultAlias ?? null;\n\n readonly session: AuthSession;\n readonly user: Observable<any | null>;\n\n private _refreshHandler: number | null = null;\n\n constructor() {\n // We select a storage strategy based on the server/browser.\n // Only cookies CAN work on the server.\n const storageStrategy = this._platform.isBrowser\n ? this._storage.select([StorageOption.Cookie, StorageOption.Local])\n : this._storage.cookie;\n\n // Starting the new session.\n this.session = new AuthSession({\n id: this._config?.applicationId,\n storage: storageStrategy\n });\n this.user = this.session.user;\n }\n\n async initialize() {\n // Check if the app should bootstrap the authentication.\n const shouldBootstrap = this._config?.bootstrap ?? true;\n if (!shouldBootstrap) {\n return this.handleAutoRefreshing();\n }\n\n // Only retrieve from the server when we are actually authenticated.\n if (!this.session.authenticated()) {\n return;\n }\n\n // Get the key from the server state.\n if (this._state && this._state?.hasKey(this._authStateKey)) {\n const user = this._state?.get(this._authStateKey, null) ?? null;\n return this.session.setUser(user);\n }\n\n // Try to fetch the user from the server.\n const user$ = this.me();\n const user = await firstValueFrom(user$, {defaultValue: null});\n\n // Set the state if exists.\n if (this._state) {\n this._state?.set<any>(this._authStateKey, user ?? null);\n }\n\n // Save the user in the storage and handle auto refreshing.\n this.session.setUser(user);\n this.handleAutoRefreshing();\n }\n\n me<T = any>() {\n const url = this.getUrl('auth/me');\n return this._httpClient.get<T>(url);\n }\n\n async signIn(provider: AuthProvider, as?: string[]) {\n const {accessToken, refreshToken, user, ...result} = await provider.authenticate(this._httpClient);\n\n // Check if the role matches.\n const role = user?.role ?? null;\n if (as && !as.includes(role)) {\n throw new Error('Invalid role.');\n }\n\n // Validate if the provider is one of the available\n // providers then return the user object and the provider.\n const apiProvider = result?.provider ?? null;\n const apiVerifyToken = result?.verifyToken ?? null;\n const availableProviders = this._config?.providers ?? ['email', 'sms', 'totp'];\n if (availableProviders.includes(apiProvider)) {\n return <AuthSignInResponse>{user, provider: apiProvider, verifyToken: apiVerifyToken};\n }\n\n // Set the tokens in storage.\n this.setTokens(accessToken, refreshToken);\n\n // Set the user in storage.\n this.session.setUser(user);\n\n // Return the user.\n return <AuthSignInResponse>{user};\n }\n\n async signInWithEmail(email: string, password: string, as?: string[]) {\n const url = this.getUrl('auth/login');\n return this.signIn(new AuthEmailProvider(email, password, url), as);\n }\n\n async signInWithVerifyCode(code: string, verifyToken: string) {\n const url = this.getUrl('auth/verify');\n return this.signIn(new AuthVerifyProvider(code, verifyToken, url));\n }\n\n async resendVerifyCode(verifyToken: string) {\n const url = this.getUrl('auth/resend');\n const result$ = this._httpClient.post(url, {\n verify_token: verifyToken\n });\n\n return firstValueFrom(result$);\n }\n\n async register<T = any>(data: any, options?: {\n headers?: HttpHeaders | {\n [header: string]: string | string[];\n };\n params?: HttpParams | {\n [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n };\n }) {\n // Execute API call.\n const url = this.getUrl('auth/register');\n const result$ = this._httpClient.post<{ token: string, refresh_token: string, user: any }>(url, data, options);\n const result = await firstValueFrom(result$);\n\n // Set the tokens in storage.\n this.setTokens(result?.token, result?.refresh_token);\n\n // Set the user in storage.\n const user = result?.user;\n this.session.setUser(user);\n\n // Return the user.\n return <T>user;\n }\n\n logout() {\n // If we don't have a refresh token just clear the session.\n // Note: We do this because else we try to invalidate\n // an \"undefined\" refresh token.\n const refreshToken = this.session.refreshToken;\n if (!refreshToken) {\n return this.session.clear();\n }\n\n // We do have a refresh token, so try to\n // invalidate it in the backend.\n try {\n const url = this.getUrl('auth/logout');\n const headerName = this._config?.http?.header ?? 'Authorization';\n const observable$ = this._httpClient.get(url, {\n headers: {[headerName]: refreshToken}\n });\n firstValueFrom(observable$).then(_ => _).catch(_ => _);\n } catch {\n // Do nothing because the tokens will be deleted anyways from the session.\n }\n\n // Delete the tokens from the session.\n return this.session.clear();\n }\n\n refresh() {\n // If the refresh token does\n // not exist just return an observable of null.\n const refreshToken = this.session.refreshToken;\n if (!refreshToken) {\n return of(null);\n }\n\n // Perform the refresh call.\n const headerName = this._config?.http?.header ?? 'Authorization';\n const scheme = this._config?.http?.scheme ?? 'Bearer';\n\n const url = this.getUrl('auth/refresh');\n const context = new HttpContext().set(USE_AUTHORIZATION, false);\n\n return this._httpClient.get<{ token: string, refresh_token: string }>(url, {\n headers: {[headerName]: `${scheme} ${refreshToken}`},\n context: context\n }).pipe(\n tap(({token, refresh_token}) => this.setTokens(token, refresh_token)),\n map(({token}) => token)\n );\n }\n\n async requestPassword(email: string, extraParams: { [key: string]: any } = {}) {\n const url = this.getUrl('auth/reset');\n const observable$ = this._httpClient.post(url, {...extraParams, email});\n return firstValueFrom(observable$);\n }\n\n async resetPassword(token: string, newPassword: string, extraParams: { [key: string]: any } = {}) {\n const url = this.getUrl('auth/reset-password');\n const observable$ = this._httpClient.post(url, {...extraParams, token, password: newPassword});\n return firstValueFrom(observable$);\n }\n\n clearAndRedirect() {\n // 1. Delete the tokens from the session.\n this.session.clear();\n\n if (this._handler) {\n const urlTree = this._handler.onFailedAuthenticated();\n if (typeof urlTree === 'boolean' || urlTree === null || urlTree === undefined) {\n return;\n }\n\n this.router.navigateByUrl(urlTree).then(_ => _);\n return;\n }\n\n // 2. Compose the route url.\n const redirectUrl = this._config?.redirects.unauthenticated ?? null;\n\n // 3. Route back if the user provided a redirect url.\n if (this.router && redirectUrl) {\n const commands = Array.isArray(redirectUrl) ? redirectUrl : [redirectUrl];\n this.router.navigate(commands).then(_ => _);\n }\n }\n\n private setTokens(accessToken: string, refreshToken: string) {\n // Set the tokens in our session.\n this.session.setTokens(accessToken, refreshToken);\n\n // We need to update the auto refresh of the refresh token.\n this.handleAutoRefreshing();\n }\n\n private handleAutoRefreshing() {\n const shouldAutoRefresh = this._config?.autoRefresh ?? false;\n if (!shouldAutoRefresh) {\n return;\n }\n\n const expiresAt = this.session.refreshTokenPayload?.expiresAt ?? null;\n if (expiresAt === null || !this._platform.isBrowser) {\n return;\n }\n\n const differenceInMilliseconds = expiresAt.getTime() - Date.now();\n const offsetInMilliseconds = 10_000; // 10 seconds.\n\n // We want to start the refresh 10 seconds before it expires.\n const actualTiming = differenceInMilliseconds - offsetInMilliseconds;\n if (actualTiming <= 0) {\n return;\n }\n\n // We need to cap the timings because if\n // we get large numbers it might cause unwanted results.\n const maxTiming = 1000 * 60 * 60 * 24; // 24 hours.\n const cappedTiming = Math.max(1, Math.min(actualTiming, maxTiming));\n try {\n if (this._refreshHandler !== null) {\n clearTimeout?.(this._refreshHandler);\n this._refreshHandler = null;\n }\n this._refreshHandler = window?.setTimeout?.(() => this.autoRefresh(), cappedTiming);\n } catch {\n // Just ignore it.\n }\n }\n\n private async autoRefresh() {\n try {\n // We just need to wait for it to refresh.\n const refresh$ = this.refresh();\n await firstValueFrom(refresh$);\n } catch {\n // Something went wrong refreshing, we need to clear.\n this.clearAndRedirect();\n }\n }\n\n private get router() {\n return this._injector.get(Router);\n }\n\n private getUrl(endpoint: string) {\n return [this._httpAlias, endpoint]\n .filter(item => !!item)\n .join('/');\n }\n\n}\n","import {Directive, EmbeddedViewRef, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {Auth} from '../auth.service';\nimport {Subscription} from 'rxjs';\n\n@Directive({\n selector: 'ng-template[bbAuthenticated]'\n})\nexport class BbAuthenticated implements OnInit, OnDestroy {\n\n // Data.\n private _valid: boolean = false;\n\n // Templates.\n private _elseTemplateRef: TemplateRef<any> | null = null;\n\n // View refs.\n private _thenViewRef: EmbeddedViewRef<any> | null = null;\n private _elseViewRef: EmbeddedViewRef<any> | null = null;\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n @Input()\n set bbAuthenticatedElse(templateRef: TemplateRef<any>) {\n this.assertTemplate('bbAuthenticatedElse', templateRef);\n this._elseTemplateRef = templateRef;\n this.updateView();\n }\n\n constructor(private _auth: Auth,\n private _templateRef: TemplateRef<any>,\n private _viewContainerRef: ViewContainerRef) {\n }\n\n ngOnInit() {\n const subscription = this._auth.user.pipe(\n map(user => !!user),\n distinctUntilChanged()\n ).subscribe(valid => {\n this._valid = valid;\n this.updateView();\n });\n this._subscription.add(subscription);\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n private updateView() {\n if (this._valid) {\n if (!this._thenViewRef) {\n this._viewContainerRef.clear();\n this._elseViewRef = null;\n if (this._templateRef) {\n this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._templateRef);\n }\n }\n } else {\n if (!this._elseViewRef) {\n this._viewContainerRef.clear();\n this._thenViewRef = null;\n if (this._elseTemplateRef) {\n this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef);\n }\n }\n }\n }\n\n private assertTemplate(property: string, templateRef: TemplateRef<any> | null) {\n const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n if (!isTemplateRefOrNull) {\n throw new Error(`${property} must be a TemplateRef.`);\n }\n }\n\n static ngAcceptInputType_bbAuthenticatedElse: TemplateRef<any>;\n\n}\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {AUTH_CONFIG, AUTH_REDIRECT_HANDLER} from '../interfaces/config.interface';\nimport {inject} from '@angular/core';\nimport {Auth} from '../auth.service';\nimport {map} from 'rxjs/operators';\nimport {first} from 'rxjs';\n\nexport const bbAnonymousGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const auth = inject(Auth);\n const router = inject(Router);\n const config = inject(AUTH_CONFIG, {optional: true});\n const redirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n return auth.user.pipe(\n map(user => !!user),\n map(authenticated => {\n if (!authenticated) {\n return true;\n }\n\n if (redirectHandler) {\n return redirectHandler.onFailedAnonymous(route, state);\n }\n\n // If we don't have a URL to go to we can just say\n // the user is not allowed in this route by returning false.\n const nextUrl = config?.redirects?.authenticated ?? null;\n if (!nextUrl) {\n return false;\n }\n\n const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];\n return router.createUrlTree(commands);\n }),\n first()\n );\n};\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {AUTH_CONFIG, AUTH_REDIRECT_HANDLER} from '../interfaces/config.interface';\nimport {Auth} from '../auth.service';\nimport {inject} from '@angular/core';\nimport {map} from 'rxjs/operators';\nimport {first} from 'rxjs';\n\nexport const bbAuthenticatedGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const auth = inject(Auth);\n const router = inject(Router);\n const config = inject(AUTH_CONFIG, {optional: true});\n const redirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n return auth.user.pipe(\n map(user => !!user),\n map(authenticated => {\n if (authenticated) {\n return true;\n }\n\n if (redirectHandler) {\n return redirectHandler.onFailedAuthenticated(route, state);\n }\n\n // If we don't have a URL to go to we can just say\n // the user is not allowed in this route by returning false.\n const nextUrl = config?.redirects?.unauthenticated ?? null;\n if (!nextUrl) {\n return false;\n }\n\n const setRedirectOnFailedAuth = config?.setRedirectOnFailedAuth ?? true;\n const redirectUrl = state?.url ?? null;\n const queryParams = setRedirectOnFailedAuth && redirectUrl ? {redirectUrl} : {};\n const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];\n return router.createUrlTree(commands, {queryParams});\n }),\n first()\n );\n};\n","import {BehaviorSubject, firstValueFrom, Observable} from 'rxjs';\nimport {combineLatestMap} from '@bravobit/bb-foundation/rxjs';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {inject, Injectable} from '@angular/core';\nimport {Auth} from './auth.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Acting {\n\n // Dependencies.\n private readonly _auth: Auth = inject(Auth);\n\n // Cache.\n private _userId$ = new BehaviorSubject<number>(null);\n\n // State.\n readonly info$: Observable<{ active?: boolean, user?: any }> = this.getInfo();\n\n async start(userId: number) {\n this._userId$.next(userId);\n return await this.fetchUserDetails();\n }\n\n async stop() {\n this._userId$.next(null);\n return await this.fetchUserDetails();\n }\n\n getCurrent() {\n return this._userId$.getValue();\n }\n\n private async fetchUserDetails() {\n const user$ = this._auth.me();\n const user = await firstValueFrom(user$);\n this._auth.session.setUser(user);\n }\n\n private getInfo() {\n const active$ = this._userId$.pipe(\n map(item => !!item),\n distinctUntilChanged()\n );\n\n return combineLatestMap({active: active$, user: this._auth.user});\n }\n\n}\n","import {HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {inject, Injectable} from '@angular/core';\nimport {Acting} from './acting.service';\n\n@Injectable()\nexport class ActingInterceptor implements HttpInterceptor {\n\n // Dependencies.\n private readonly _acting: Acting = inject(Acting);\n\n // Readonly data.\n private readonly _headerString: string = 'X-Act-User-Id';\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler) {\n const userId = this._acting.getCurrent();\n if (userId === null || userId === undefined) {\n return next.handle(request);\n }\n\n const modified = request.clone({\n setHeaders: {[this._headerString]: `${userId}`}\n });\n\n return next.handle(modified);\n }\n\n}\n","import {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {catchError, filter, finalize, switchMap, take} from 'rxjs/operators';\nimport {AUTH_CONFIG, AuthConfig} from './interfaces/config.interface';\nimport {USE_AUTHORIZATION} from './tokens/use-authorization.token';\nimport {HttpError} from '@bravobit/bb-foundation/http';\nimport {BehaviorSubject, of, throwError} from 'rxjs';\nimport {inject, Injectable} from '@angular/core';\nimport {Auth} from './auth.service';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n\n // Dependencies.\n private readonly _auth: Auth = inject(Auth);\n private readonly _config?: AuthConfig = inject(AUTH_CONFIG, {optional: true});\n\n // Readonly data.\n private readonly _authHeaderString: string = this._config?.http?.header ?? 'Authorization';\n private readonly _authScheme: string = this._config?.http?.scheme ?? 'Bearer';\n\n // Data.\n isRefreshing: boolean = false;\n refreshingAccessToken$ = new BehaviorSubject<string | null>(null);\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler) {\n // 1. Check if the user wants to use the authorization for this request.\n if (!request.context.get(USE_AUTHORIZATION)) {\n return next.handle(request);\n }\n\n // 2. Compose the new request.\n const accessToken = this.getAccessToken(request);\n const newRequest = this.addAuthorizationHeader(request, accessToken);\n\n // 3. Handle all errors.\n return next.handle(newRequest).pipe(\n catchError(error => {\n // Handle the HTTP401 error.\n if ((error instanceof HttpErrorResponse || error instanceof HttpError) && error?.status === 401) {\n return this.handle401Error(request, next);\n }\n\n // Just re-throw the parsed error.\n return throwError(() => error);\n })\n );\n }\n\n private handle401Error(request: HttpRequest<unknown>, next: HttpHandler) {\n // If already refreshing wait for the refresh token to complete.\n if (this.isRefreshing) {\n return this.refreshingAccessToken$.pipe(\n filter(accessToken => accessToken !== null),\n take(1),\n switchMap(accessToken => next.handle(this.addAuthorizationHeader(request, accessToken)))\n );\n }\n\n // Set the refreshing to true.\n this.isRefreshing = true;\n this.refreshingAccessToken$.next(null);\n\n return this._auth.refresh().pipe(\n switchMap(newAccessToken => {\n if (!newAccessToken) {\n return throwError(() => new Error('No refresh token was available.'));\n }\n\n this.refreshingAccessToken$.next(newAccessToken);\n return next.handle(this.addAuthorizationHeader(request, newAccessToken));\n }),\n catchError(() => this.logoutUser()),\n finalize(() => this.isRefreshing = false)\n );\n }\n\n private logoutUser() {\n // Handle the refresh error.\n this._auth.clearAndRedirect();\n\n // Return null as data.\n return of(null);\n }\n\n private getAccessToken = (request: HttpRequest<unknown>) => {\n // Get the token based on header.\n if (request.headers.has(this._authHeaderString)) {\n return request.headers.get(this._authHeaderString);\n }\n\n // Return the default access token.\n return this._auth.session.accessToken;\n };\n\n private addAuthorizationHeader = (request: HttpRequest<unknown>, accessToken: string | null = null) => {\n // Remove auth header when we do not have\n // an access token.\n if (!accessToken) {\n return request.clone({\n headers: request.headers.delete(this._authHeaderString)\n });\n }\n\n // Add the auth header to the request.\n return request.clone({\n setHeaders: {[this._authHeaderString]: `${this._authScheme} ${accessToken}`}\n });\n };\n\n}\n","import {EnvironmentProviders, makeEnvironmentProviders, inject, provideAppInitializer, Provider} from '@angular/core';\nimport {AUTH_CONFIG, AuthConfig} from './interfaces/config.interface';\nimport {HTTP_INTERCEPTORS} from '@angular/common/http';\nimport {ActingInterceptor} from './acting.interceptor';\nimport {AuthInterceptor} from './auth.interceptor';\nimport {Auth} from './auth.service';\n\nexport function provideAuthConfig(config?: AuthConfig): EnvironmentProviders {\n const providers: Provider = [\n {provide: AUTH_CONFIG, useValue: config},\n {provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true},\n provideAppInitializer(() => inject(Auth).initialize())\n ];\n\n if (config?.interceptActing) {\n providers.push({provide: HTTP_INTERCEPTORS, useClass: ActingInterceptor, multi: true});\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import {BbAuthenticated} from './directives/authenticated.directive';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {AuthConfig} from './interfaces/config.interface';\nimport {provideAuthConfig} from './auth.config';\n\n@NgModule({\n imports: [BbAuthenticated],\n exports: [BbAuthenticated]\n})\nexport class AuthModule {\n\n static forRoot(config: AuthConfig): ModuleWithProviders<AuthModule> {\n return {\n ngModule: AuthModule,\n providers: [\n provideAuthConfig(config)\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.Auth"],"mappings":";;;;;;;;;;;MAwBa,WAAW,GAAG,IAAI,cAAc,CAAa,aAAa;MAE1D,qBAAqB,GAAG,IAAI,cAAc,CAAsB,uBAAuB;;ACxB7F,MAAM,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,MAAM,IAAI;;MCAnD,SAAS,CAAA;AAElB,IAAA,MAAM,CAAC,KAAa,EAAA;AAChB,QAAA,IAAI;YACA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACvC,gBAAA,OAAO,IAAI;;YAGf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CACtC;AAED,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AACzB,QAAA,MAAM;AACJ,YAAA,OAAO,IAAI;;;AAIX,IAAA,SAAS,CAAC,KAAoB,EAAA;AAClC,QAAA,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,MAAM,GAAG;AACR,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG;AACjB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAEvB,QAAA,QAAQ,MAAM,CAAC,MAAM,GAAG,CAAC;AACrB,YAAA,KAAK,CAAC;gBACF;AACJ,YAAA,KAAK,CAAC;gBACF,MAAM,IAAI,IAAI;gBACd;AACJ,YAAA,KAAK,CAAC;gBACF,MAAM,IAAI,GAAG;gBACb;AACJ,YAAA;AACI,gBAAA,MAAM,2BAA2B;;AAGzC,QAAA,IAAI;AACA,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;;AACvC,QAAA,MAAM;AACJ,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC;;;AAInB,IAAA,iBAAiB,GAAG,CAAC,KAAa,KAAI;AAC1C,QAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;AAC3D,YAAA,IAAI,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;AACrD,YAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACjB,gBAAA,IAAI,GAAG,GAAG,GAAG,IAAI;;YAErB,OAAO,GAAG,GAAG,IAAI;SACpB,CAAC,CAAC;AACP,KAAC;AAEO,IAAA,KAAK,GAAG,CAAC,IAAY,KAAI;QAC7B,OAAO;AACH,YAAA,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;AACvB,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;AACzB,YAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;AAC7B,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;AAC3B,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;AAC5B,YAAA,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI;YAC1B,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;SAC1B;AAClB,KAAC;AAEO,IAAA,SAAS,GAAG,CAAC,cAAsB,KAAI;AAC3C,QAAA,IAAI,CAAC,cAAc,IAAI,cAAc,IAAI,CAAC,EAAE;AACxC,YAAA,OAAO,IAAI;;AAGf,QAAA,OAAO,IAAI,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC1C,KAAC;AAEJ;;MC1EY,kBAAkB,CAAA;AAEP,IAAA,KAAA;AACA,IAAA,YAAA;AACA,IAAA,SAAA;AAFpB,IAAA,WAAA,CAAoB,KAAa,EACb,YAAoB,EACpB,SAAiB,EAAA;QAFjB,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAS,CAAA,SAAA,GAAT,SAAS;;IAG7B,MAAM,YAAY,CAAC,UAAsB,EAAA;;QAErC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAiE,IAAI,CAAC,SAAS,EAAE;YAC1G,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC;AACtB,SAAA,CAAC;AAEF,QAAA,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC;QACxC,OAAO;YACH,WAAW,EAAE,IAAI,EAAE,KAAK;YACxB,YAAY,EAAE,IAAI,EAAE,aAAa;YACjC,IAAI,EAAE,IAAI,EAAE;SACf;;AAGR;;MCtBY,iBAAiB,CAAA;AAEN,IAAA,MAAA;AACA,IAAA,SAAA;AACA,IAAA,SAAA;AAFpB,IAAA,WAAA,CAAoB,MAAc,EACd,SAAiB,EACjB,SAAiB,EAAA;QAFjB,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAS,CAAA,SAAA,GAAT,SAAS;;IAG7B,MAAM,YAAY,CAAC,UAAsB,EAAA;;QAErC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAuB,IAAI,CAAC,SAAS,EAAE;YAChE,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,QAAQ,EAAE,IAAI,CAAC;AAClB,SAAA,CAAC;AAEF,QAAA,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC;QACxC,OAAO;YACH,WAAW,EAAE,IAAI,EAAE,KAAK;YACxB,YAAY,EAAE,IAAI,EAAE,aAAa;YACjC,IAAI,EAAE,IAAI,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACxB,WAAW,EAAE,IAAI,EAAE;SACtB;;AAGR;;MCtBY,WAAW,CAAA;;AAGH,IAAA,IAAI,GAAG,IAAI,SAAS,EAAE;AACtB,IAAA,QAAQ;AACR,IAAA,sBAAsB;AACtB,IAAA,uBAAuB;AACvB,IAAA,eAAe;;IAGxB,kBAAkB,GAAkB,IAAI;IACxC,mBAAmB,GAAkB,IAAI;;IAGzC,mBAAmB,GAAqB,IAAI;IAC5C,oBAAoB,GAAqB,IAAI;;AAG7C,IAAA,MAAM,GAAG,IAAI,eAAe,CAAa,IAAI,CAAC;;IAGtD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,WAAW,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAC,CAAC,CAC/C;AAED,IAAA,WAAA,CAAY,OAAoD,EAAA;AAC5D,QAAA,MAAM,aAAa,GAAG,OAAO,EAAE,EAAE,IAAI,IAAI;;QAGzC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC;QACvE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC;QACxE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC;;QAGhE,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI;;QAGxC,IAAI,CAAC,kBAAkB,EAAE;;AAG7B,IAAA,IAAI,QAAQ,GAAA;QACR,OAAO;AACH,YAAA,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC;SACtB;;AAGL,IAAA,IAAI,WAAW,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB;cAC3C,IAAI,CAAC;cACL,IAAI;;AAGd,IAAA,IAAI,YAAY,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB;cAC3C,IAAI,CAAC;cACL,IAAI;;AAGd,IAAA,IAAI,kBAAkB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,mBAAmB,IAAI,IAAI;;AAG3C,IAAA,IAAI,mBAAmB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,oBAAoB,IAAI,IAAI;;IAG5C,aAAa,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC;;AAGtG,IAAA,SAAS,CAAC,WAA0B,EAAE,YAA2B,EAAE,UAAmB,IAAI,EAAA;AACtF,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;AAChC,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;QAElC,IAAI,OAAO,EAAE;YACT,IAAI,CAAC,sBAAsB,EAAE;;;AAIrC,IAAA,OAAO,CAAC,IAAa,EAAE,OAAA,GAAmB,IAAI,EAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAE9B,IAAI,OAAO,EAAE;YACT,IAAI,CAAC,oBAAoB,EAAE;;;IAInC,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;;IAGd,kBAAkB,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB;;;AAIJ,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAS,IAAI,CAAC,sBAAsB,CAAC;AAC1E,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;;AAGhC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAS,IAAI,CAAC,uBAAuB,CAAC;AAC5E,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;;QAGlC,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,oBAAoB,EAAE;AACvD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAU,IAAI,CAAC,eAAe,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;;;IAI/B,sBAAsB,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB;;;AAIJ,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAS,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,kBAAkB,EAAE;AAC5E,gBAAA,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE;AACtC,aAAA,CAAC;;aACC;YACH,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;;;AAIrD,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAS,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAC9E,gBAAA,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE;AACvC,aAAA,CAAC;;aACC;YACH,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC;;;IAIlD,oBAAoB,GAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB;;QAGJ,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACnC,IAAI,CAAC,IAAI,EAAE;YACP,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;;AAGrD,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE;QACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAU,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE;YACnD,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,SAAA,CAAC;;AAGE,IAAA,cAAc,CAAC,KAAoB,EAAA;AACvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,IAAI,IAAI;AACvC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;;AAGhE,IAAA,eAAe,CAAC,KAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,IAAI,IAAI;AACxC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC;;AAGlE,IAAA,WAAW,GAAG,CAAC,aAAqB,EAAE,GAAW,KAAI;QACzD,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACzC,KAAC;AAEO,IAAA,YAAY,GAAG,CAAC,KAAgB,KAAI;QACxC,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,OAAO,KAAK;;QAGhB,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AACnD,KAAC;AAEJ;;MCrKY,IAAI,CAAA;;AAGI,IAAA,QAAQ,GAAY,MAAM,CAAC,OAAO,CAAC;AACnC,IAAA,SAAS,GAAa,MAAM,CAAC,QAAQ,CAAC;AACtC,IAAA,SAAS,GAAa,MAAM,CAAC,QAAQ,CAAC;AACtC,IAAA,WAAW,GAAe,MAAM,CAAC,UAAU,CAAC;IAC5C,MAAM,GAAmB,MAAM,CAAC,aAAa,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;IAChE,OAAO,GAAgB,MAAM,CAAC,WAAW,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;IAC5D,WAAW,GAAgB,MAAM,CAAC,WAAW,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;IAChE,QAAQ,GAAyB,MAAM,CAAC,qBAAqB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;;AAGhF,IAAA,aAAa,GAAyB,YAAY,CAAC,CAAA,cAAA,CAAgB,CAAC;IACpE,UAAU,GAAkB,IAAI,CAAC,WAAW,EAAE,YAAY,IAAI,IAAI;AAE1E,IAAA,OAAO;AACP,IAAA,IAAI;IAEL,eAAe,GAAkB,IAAI;AAE7C,IAAA,WAAA,GAAA;;;AAGI,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;AACnC,cAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC;AAClE,cAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;;AAG1B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC;AAC3B,YAAA,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa;AAC/B,YAAA,OAAO,EAAE;AACZ,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI;;AAGjC,IAAA,MAAM,UAAU,GAAA;;QAEZ,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,IAAI;QACvD,IAAI,CAAC,eAAe,EAAE;AAClB,YAAA,OAAO,IAAI,CAAC,oBAAoB,EAAE;;;QAItC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE;YAC/B;;;AAIJ,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACxD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,IAAI;YAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;;;AAIrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE;AACvB,QAAA,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC,CAAC;;AAG9D,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,MAAM,EAAE,GAAG,CAAM,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,IAAI,CAAC;;;AAI3D,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,oBAAoB,EAAE;;IAG/B,EAAE,GAAA;QACE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAClC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAI,GAAG,CAAC;;AAGvC,IAAA,MAAM,MAAM,CAAC,QAAsB,EAAE,EAAa,EAAA;QAC9C,MAAM,EAAC,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,MAAM,EAAC,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;;AAGlG,QAAA,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI;QAC/B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;;;;AAKpC,QAAA,MAAM,WAAW,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI;AAC5C,QAAA,MAAM,cAAc,GAAG,MAAM,EAAE,WAAW,IAAI,IAAI;AAClD,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;AAC9E,QAAA,IAAI,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YAC1C,OAA2B,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAC;;;AAIzF,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;;AAGzC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;;QAG1B,OAA2B,EAAC,IAAI,EAAC;;AAGrC,IAAA,MAAM,eAAe,CAAC,KAAa,EAAE,QAAgB,EAAE,EAAa,EAAA;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;AACrC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;;AAGvE,IAAA,MAAM,oBAAoB,CAAC,IAAY,EAAE,WAAmB,EAAA;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;AACtC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;;IAGtE,MAAM,gBAAgB,CAAC,WAAmB,EAAA;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;AACvC,YAAA,YAAY,EAAE;AACjB,SAAA,CAAC;AAEF,QAAA,OAAO,cAAc,CAAC,OAAO,CAAC;;AAGlC,IAAA,MAAM,QAAQ,CAAU,IAAS,EAAE,OAOlC,EAAA;;QAEG,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACxC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAsD,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;AAC9G,QAAA,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC;;QAG5C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC;;AAGpD,QAAA,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;;AAG1B,QAAA,OAAU,IAAI;;IAGlB,MAAM,GAAA;;;;AAIF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;QAC9C,IAAI,CAAC,YAAY,EAAE;AACf,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;;;;AAK/B,QAAA,IAAI;YACA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,eAAe;YAChE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE;AAC1C,gBAAA,OAAO,EAAE,EAAC,CAAC,UAAU,GAAG,YAAY;AACvC,aAAA,CAAC;YACF,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;;AACxD,QAAA,MAAM;;;;AAKR,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;;IAG/B,OAAO,GAAA;;;AAGH,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;QAC9C,IAAI,CAAC,YAAY,EAAE;AACf,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;;;QAInB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,eAAe;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,QAAQ;QAErD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC;AAE/D,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAA2C,GAAG,EAAE;YACvE,OAAO,EAAE,EAAC,CAAC,UAAU,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,EAAC;AACpD,YAAA,OAAO,EAAE;AACZ,SAAA,CAAC,CAAC,IAAI,CACH,GAAG,CAAC,CAAC,EAAC,KAAK,EAAE,aAAa,EAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,EACrE,GAAG,CAAC,CAAC,EAAC,KAAK,EAAC,KAAK,KAAK,CAAC,CAC1B;;AAGL,IAAA,MAAM,eAAe,CAAC,KAAa,EAAE,cAAsC,EAAE,EAAA;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;AACrC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,EAAC,GAAG,WAAW,EAAE,KAAK,EAAC,CAAC;AACvE,QAAA,OAAO,cAAc,CAAC,WAAW,CAAC;;IAGtC,MAAM,aAAa,CAAC,KAAa,EAAE,WAAmB,EAAE,cAAsC,EAAE,EAAA;QAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,EAAC,GAAG,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAC,CAAC;AAC9F,QAAA,OAAO,cAAc,CAAC,WAAW,CAAC;;IAGtC,gBAAgB,GAAA;;AAEZ,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAEpB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE;AACrD,YAAA,IAAI,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE;gBAC3E;;AAGJ,YAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C;;;QAIJ,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,eAAe,IAAI,IAAI;;AAGnE,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW,EAAE;AAC5B,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,CAAC,WAAW,CAAC;AACzE,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;;;IAI3C,SAAS,CAAC,WAAmB,EAAE,YAAoB,EAAA;;QAEvD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;;QAGjD,IAAI,CAAC,oBAAoB,EAAE;;IAGvB,oBAAoB,GAAA;QACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,KAAK;QAC5D,IAAI,CAAC,iBAAiB,EAAE;YACpB;;QAGJ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,SAAS,IAAI,IAAI;QACrE,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;YACjD;;QAGJ,MAAM,wBAAwB,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AACjE,QAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC;;AAGpC,QAAA,MAAM,YAAY,GAAG,wBAAwB,GAAG,oBAAoB;AACpE,QAAA,IAAI,YAAY,IAAI,CAAC,EAAE;YACnB;;;;QAKJ,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AACnE,QAAA,IAAI;AACA,YAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;AAC/B,gBAAA,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC;AACpC,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAE/B,YAAA,IAAI,CAAC,eAAe,GAAG,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC;;AACrF,QAAA,MAAM;;;;AAKJ,IAAA,MAAM,WAAW,GAAA;AACrB,QAAA,IAAI;;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE;AAC/B,YAAA,MAAM,cAAc,CAAC,QAAQ,CAAC;;AAChC,QAAA,MAAM;;YAEJ,IAAI,CAAC,gBAAgB,EAAE;;;AAI/B,IAAA,IAAY,MAAM,GAAA;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;;AAG7B,IAAA,MAAM,CAAC,QAAgB,EAAA;AAC3B,QAAA,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ;aAC5B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;aACrB,IAAI,CAAC,GAAG,CAAC;;uGAnST,IAAI,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAJ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,IAAI,cAFD,MAAM,EAAA,CAAA;;2FAET,IAAI,EAAA,UAAA,EAAA,CAAA;kBAHhB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCTY,eAAe,CAAA;AAsBJ,IAAA,KAAA;AACA,IAAA,YAAA;AACA,IAAA,iBAAA;;IArBZ,MAAM,GAAY,KAAK;;IAGvB,gBAAgB,GAA4B,IAAI;;IAGhD,YAAY,GAAgC,IAAI;IAChD,YAAY,GAAgC,IAAI;;AAGhD,IAAA,aAAa,GAAG,IAAI,YAAY,EAAE;IAE1C,IACI,mBAAmB,CAAC,WAA6B,EAAA;AACjD,QAAA,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,WAAW,CAAC;AACvD,QAAA,IAAI,CAAC,gBAAgB,GAAG,WAAW;QACnC,IAAI,CAAC,UAAU,EAAE;;AAGrB,IAAA,WAAA,CAAoB,KAAW,EACX,YAA8B,EAC9B,iBAAmC,EAAA;QAFnC,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;;IAGrC,QAAQ,GAAA;AACJ,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CACrC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EACnB,oBAAoB,EAAE,CACzB,CAAC,SAAS,CAAC,KAAK,IAAG;AAChB,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;YACnB,IAAI,CAAC,UAAU,EAAE;AACrB,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;;IAGxC,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;;IAG7B,UAAU,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACpB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;AAC9B,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;;;;aAGrF;AACH,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACpB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;AAC9B,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,CAAC;;;;;IAM5F,cAAc,CAAC,QAAgB,EAAE,WAAoC,EAAA;AACzE,QAAA,MAAM,mBAAmB,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,WAAW,CAAC,kBAAkB,CAAC;QAC9E,IAAI,CAAC,mBAAmB,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAA,uBAAA,CAAyB,CAAC;;;IAI7D,OAAO,qCAAqC;uGArEnC,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE;AACb,iBAAA;+HAiBO,mBAAmB,EAAA,CAAA;sBADtB;;;MChBQ,gBAAgB,GAAkB,CAAC,KAA6B,EAAE,KAA0B,KAAI;AACzG,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACzB,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACpD,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;IAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACjB,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EACnB,GAAG,CAAC,aAAa,IAAG;QAChB,IAAI,CAAC,aAAa,EAAE;AAChB,YAAA,OAAO,IAAI;;QAGf,IAAI,eAAe,EAAE;YACjB,OAAO,eAAe,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;;;;QAK1D,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,IAAI,IAAI;QACxD,IAAI,CAAC,OAAO,EAAE;AACV,YAAA,OAAO,KAAK;;AAGhB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC;AAC7D,QAAA,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;AACzC,KAAC,CAAC,EACF,KAAK,EAAE,CACV;AACL;;MC7Ba,oBAAoB,GAAkB,CAAC,KAA6B,EAAE,KAA0B,KAAI;AAC7G,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACzB,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACpD,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;IAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACjB,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EACnB,GAAG,CAAC,aAAa,IAAG;QAChB,IAAI,aAAa,EAAE;AACf,YAAA,OAAO,IAAI;;QAGf,IAAI,eAAe,EAAE;YACjB,OAAO,eAAe,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;;;;QAK9D,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,EAAE,eAAe,IAAI,IAAI;QAC1D,IAAI,CAAC,OAAO,EAAE;AACV,YAAA,OAAO,KAAK;;AAGhB,QAAA,MAAM,uBAAuB,GAAG,MAAM,EAAE,uBAAuB,IAAI,IAAI;AACvE,QAAA,MAAM,WAAW,GAAG,KAAK,EAAE,GAAG,IAAI,IAAI;AACtC,QAAA,MAAM,WAAW,GAAG,uBAAuB,IAAI,WAAW,GAAG,EAAC,WAAW,EAAC,GAAG,EAAE;AAC/E,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC;QAC7D,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAC,WAAW,EAAC,CAAC;AACxD,KAAC,CAAC,EACF,KAAK,EAAE,CACV;AACL;;MC9Ba,MAAM,CAAA;;AAGE,IAAA,KAAK,GAAS,MAAM,CAAC,IAAI,CAAC;;AAGnC,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAS,IAAI,CAAC;;AAG3C,IAAA,KAAK,GAAiD,IAAI,CAAC,OAAO,EAAE;IAE7E,MAAM,KAAK,CAAC,MAAc,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1B,QAAA,OAAO,MAAM,IAAI,CAAC,gBAAgB,EAAE;;AAGxC,IAAA,MAAM,IAAI,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,OAAO,MAAM,IAAI,CAAC,gBAAgB,EAAE;;IAGxC,UAAU,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;AAG3B,IAAA,MAAM,gBAAgB,GAAA;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC7B,QAAA,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;;IAG5B,OAAO,GAAA;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC9B,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EACnB,oBAAoB,EAAE,CACzB;AAED,QAAA,OAAO,gBAAgB,CAAC,EAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC,CAAC;;uGArC5D,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAN,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAM,cAFH,MAAM,EAAA,CAAA;;2FAET,MAAM,EAAA,UAAA,EAAA,CAAA;kBAHlB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCHY,iBAAiB,CAAA;;AAGT,IAAA,OAAO,GAAW,MAAM,CAAC,MAAM,CAAC;;IAGhC,aAAa,GAAW,eAAe;IAExD,SAAS,CAAC,OAA6B,EAAE,IAAiB,EAAA;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;QACxC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;AAG/B,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;YAC3B,UAAU,EAAE,EAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAA,EAAG,MAAM,CAAA,CAAE;AACjD,SAAA,CAAC;AAEF,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;uGAlBvB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAjB,iBAAiB,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;MCMY,eAAe,CAAA;;AAGP,IAAA,KAAK,GAAS,MAAM,CAAC,IAAI,CAAC;IAC1B,OAAO,GAAgB,MAAM,CAAC,WAAW,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;;IAG5D,iBAAiB,GAAW,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,eAAe;IACzE,WAAW,GAAW,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,QAAQ;;IAG7E,YAAY,GAAY,KAAK;AAC7B,IAAA,sBAAsB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;IAEjE,SAAS,CAAC,OAA6B,EAAE,IAAiB,EAAA;;QAEtD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;;QAI/B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC;;AAGpE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAC/B,UAAU,CAAC,KAAK,IAAG;;AAEf,YAAA,IAAI,CAAC,KAAK,YAAY,iBAAiB,IAAI,KAAK,YAAY,SAAS,KAAK,KAAK,EAAE,MAAM,KAAK,GAAG,EAAE;gBAC7F,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC;;;AAI7C,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;SACjC,CAAC,CACL;;IAGG,cAAc,CAAC,OAA6B,EAAE,IAAiB,EAAA;;AAEnE,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CACnC,MAAM,CAAC,WAAW,IAAI,WAAW,KAAK,IAAI,CAAC,EAC3C,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAC3F;;;AAIL,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;AAEtC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAC5B,SAAS,CAAC,cAAc,IAAG;YACvB,IAAI,CAAC,cAAc,EAAE;gBACjB,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;;AAGzE,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC;AAChD,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;SAC3E,CAAC,EACF,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,EACnC,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAC5C;;IAGG,UAAU,GAAA;;AAEd,QAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;;AAG7B,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;;AAGX,IAAA,cAAc,GAAG,CAAC,OAA6B,KAAI;;QAEvD,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;YAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;;;AAItD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW;AACzC,KAAC;AAEO,IAAA,sBAAsB,GAAG,CAAC,OAA6B,EAAE,WAA6B,GAAA,IAAI,KAAI;;;QAGlG,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,OAAO,CAAC,KAAK,CAAC;gBACjB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB;AACzD,aAAA,CAAC;;;QAIN,OAAO,OAAO,CAAC,KAAK,CAAC;AACjB,YAAA,UAAU,EAAE,EAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAA,EAAG,IAAI,CAAC,WAAW,CAAI,CAAA,EAAA,WAAW,EAAE;AAC9E,SAAA,CAAC;AACN,KAAC;uGAjGQ,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;ACFK,SAAU,iBAAiB,CAAC,MAAmB,EAAA;AACjD,IAAA,MAAM,SAAS,GAAa;AACxB,QAAA,EAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAC;QACxC,EAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAC;QACpE,qBAAqB,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;KACxD;AAED,IAAA,IAAI,MAAM,EAAE,eAAe,EAAE;AACzB,QAAA,SAAS,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC;;AAG1F,IAAA,OAAO,wBAAwB,CAAC,SAAS,CAAC;AAC9C;;MCVa,UAAU,CAAA;IAEnB,OAAO,OAAO,CAAC,MAAkB,EAAA;QAC7B,OAAO;AACH,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,SAAS,EAAE;gBACP,iBAAiB,CAAC,MAAM;AAC3B;SACJ;;uGARI,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAV,UAAU,EAAA,OAAA,EAAA,CAHT,eAAe,CAAA,EAAA,OAAA,EAAA,CACf,eAAe,CAAA,EAAA,CAAA;wGAEhB,UAAU,EAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAJtB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,OAAO,EAAE,CAAC,eAAe,CAAC;oBAC1B,OAAO,EAAE,CAAC,eAAe;AAC5B,iBAAA;;;ACRD;;AAEG;;;;"}
1
+ {"version":3,"file":"bravobit-bb-foundation-auth.mjs","sources":["../../../projects/bb-foundation/auth/src/lib/interfaces/config.interface.ts","../../../projects/bb-foundation/auth/src/lib/tokens/use-authorization.token.ts","../../../projects/bb-foundation/auth/src/lib/helpers/jwt.helper.ts","../../../projects/bb-foundation/auth/src/lib/providers/verify.provider.ts","../../../projects/bb-foundation/auth/src/lib/providers/email.provider.ts","../../../projects/bb-foundation/auth/src/lib/auth.session.ts","../../../projects/bb-foundation/auth/src/lib/auth.service.ts","../../../projects/bb-foundation/auth/src/lib/directives/authenticated.directive.ts","../../../projects/bb-foundation/auth/src/lib/guards/anonymous.guard.ts","../../../projects/bb-foundation/auth/src/lib/guards/authenticated.guard.ts","../../../projects/bb-foundation/auth/src/lib/acting.service.ts","../../../projects/bb-foundation/auth/src/lib/acting.interceptor.ts","../../../projects/bb-foundation/auth/src/lib/auth.interceptor.ts","../../../projects/bb-foundation/auth/src/lib/auth.config.ts","../../../projects/bb-foundation/auth/src/lib/auth.module.ts","../../../projects/bb-foundation/auth/src/bravobit-bb-foundation-auth.ts"],"sourcesContent":["import {ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree} from '@angular/router';\nimport {InjectionToken} from '@angular/core';\n\nexport type AuthStrategy = 'httpOnlyCookie' | 'browserStorage';\n\nexport interface AuthConfig {\n applicationId: string;\n strategy: AuthStrategy;\n\n http?: {\n scheme?: string,\n header?: string\n };\n\n redirects?: {\n authenticated?: string | string[];\n unauthenticated?: string | string[];\n };\n setRedirectOnFailedAuth?: boolean;\n\n interceptActing?: boolean;\n\n bootstrap?: boolean;\n providers?: string[];\n autoRefresh?: boolean;\n}\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('auth config');\n\nexport const AUTH_REDIRECT_HANDLER = new InjectionToken<AuthRedirectHandler>('auth redirect handler');\n\nexport interface AuthRedirectHandler {\n\n onFailedAuthenticated(snapshot?: ActivatedRouteSnapshot, state?: RouterStateSnapshot): boolean | UrlTree;\n\n onFailedAnonymous(snapshot?: ActivatedRouteSnapshot, state?: RouterStateSnapshot): boolean | UrlTree;\n\n}\n","import {HttpContextToken} from '@angular/common/http';\n\nexport const USE_AUTHORIZATION = new HttpContextToken(() => true);","import {AuthToken} from '../interfaces/token.interface';\n\nexport class JwtHelper {\n\n decode(token: string) {\n try {\n if (token === null || token === undefined) {\n return null;\n }\n\n const json = JSON.parse(\n this.urlDecode(token.split('.')[1])\n );\n\n return this.parse(json);\n } catch {\n return null;\n }\n }\n\n private urlDecode(token: string | null) {\n const value = token || '';\n let output = value\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += '==';\n break;\n case 3:\n output += '=';\n break;\n default:\n throw 'Illegal base64url string!';\n }\n\n try {\n return this.baseDecodeUnicode(output);\n } catch {\n return atob(output);\n }\n }\n\n private baseDecodeUnicode = (value: string) => {\n return decodeURIComponent(atob(value).replace(/(.)/g, (_, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = '0' + code;\n }\n return '%' + code;\n }));\n };\n\n private parse = (data: object) => {\n return {\n id: data['jti'] ?? null,\n type: data['typ'] ?? null,\n audience: data['aud'] ?? null,\n issuer: data['iss'] ?? null,\n subject: data['sub'] ?? null,\n role: data['role'] ?? null,\n notValidBefore: this.parseDate(data['nbf']),\n expiresAt: this.parseDate(data['exp']),\n issuedAt: this.parseDate(data['iat'])\n } as AuthToken;\n };\n\n private parseDate = (epochInSeconds: number) => {\n if (!epochInSeconds || epochInSeconds <= 0) {\n return null;\n }\n\n return new Date(epochInSeconds * 1000);\n };\n\n}\n","import {AuthProvider, AuthProviderResponse, AuthProviderResult} from '../interfaces/provider.interface';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\n\nexport class AuthVerifyProvider implements AuthProvider {\n\n constructor(private _code: string,\n private _verifyToken: string,\n private _endpoint: string) {\n }\n\n async authenticate(httpClient: HttpClient): Promise<AuthProviderResult> {\n // Execute API call.\n const data$ = httpClient.post<Pick<AuthProviderResponse, 'token' | 'refresh_token' | 'user'>>(this._endpoint, {\n token: this._code,\n verify_token: this._verifyToken\n });\n\n const data = await firstValueFrom(data$);\n return {\n accessToken: data?.token,\n refreshToken: data?.refresh_token,\n user: data?.user\n };\n }\n\n}\n","import {AuthProvider, AuthProviderResponse, AuthProviderResult} from '../interfaces/provider.interface';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\n\nexport class AuthEmailProvider implements AuthProvider {\n\n constructor(private _email: string,\n private _password: string,\n private _endpoint: string) {\n }\n\n async authenticate(httpClient: HttpClient): Promise<AuthProviderResult> {\n // Execute API call.\n const data$ = httpClient.post<AuthProviderResponse>(this._endpoint, {\n email: this._email,\n password: this._password\n });\n\n const data = await firstValueFrom(data$);\n return {\n accessToken: data?.token,\n refreshToken: data?.refresh_token,\n user: data?.user,\n provider: data?.provider,\n verifyToken: data?.verify_token\n };\n }\n\n}\n","import {StorageStrategy} from '@bravobit/bb-foundation/storage';\nimport {AuthStrategy} from './interfaces/config.interface';\nimport {AuthToken} from './interfaces/token.interface';\nimport {JwtHelper} from './helpers/jwt.helper';\nimport {shareReplay} from 'rxjs/operators';\nimport {BehaviorSubject} from 'rxjs';\n\nexport class AuthSession {\n\n // Readonly data.\n private readonly _jwt = new JwtHelper();\n private readonly _storage: StorageStrategy | null;\n private readonly _accessTokenStorageKey: string;\n private readonly _refreshTokenStorageKey: string;\n private readonly _userStorageKey: string;\n private readonly _strategy: AuthStrategy;\n\n // Token strings.\n private _accessTokenString: string | null = null;\n private _refreshTokenString: string | null = null;\n\n // Token payloads.\n private _accessTokenPayload: AuthToken | null = null;\n private _refreshTokenPayload: AuthToken | null = null;\n\n // Private user data.\n private _user$ = new BehaviorSubject<any | null>(null);\n\n // Public user data.\n user = this._user$.pipe(\n shareReplay({refCount: true, bufferSize: 1})\n );\n\n constructor(options?: { id?: string, storage?: StorageStrategy, strategy?: AuthStrategy }) {\n const applicationId = options?.id ?? 'ng';\n\n // Setting up the readonly storage keys.\n this._accessTokenStorageKey = this.generateKey(applicationId, 'au_act');\n this._refreshTokenStorageKey = this.generateKey(applicationId, 'au_rft');\n this._userStorageKey = this.generateKey(applicationId, 'au_usr');\n\n // Setting up the storage.\n this._storage = options?.storage ?? null;\n this._strategy = options?.strategy ?? null;\n\n // Init methods.\n this.restoreFromStorage();\n }\n\n get snapshot() {\n if (this._strategy === 'httpOnlyCookie') {\n return {user: this._user$.getValue()};\n }\n return {\n user: this._user$.getValue(),\n accessToken: this.accessToken,\n refreshToken: this.refreshToken\n };\n }\n\n get accessToken() {\n return this.isTokenValid(this._accessTokenPayload)\n ? this._accessTokenString\n : null;\n }\n\n get refreshToken() {\n return this.isTokenValid(this.refreshTokenPayload)\n ? this._refreshTokenString\n : null;\n }\n\n get accessTokenPayload() {\n return this._accessTokenPayload ?? null;\n }\n\n get refreshTokenPayload() {\n return this._refreshTokenPayload ?? null;\n }\n\n authenticated() {\n return !!this.snapshot?.user;\n }\n\n setTokens(accessToken: string | null, refreshToken: string | null, persist: boolean = true) {\n if (this._strategy === 'httpOnlyCookie') {\n return;\n }\n\n this.setAccessToken(accessToken);\n this.setRefreshToken(refreshToken);\n\n if (persist) {\n this.persistTokensInStorage();\n }\n }\n\n setUser(user: unknown, persist: boolean = true) {\n this._user$.next(user ?? null);\n\n if (persist) {\n this.persistUserInStorage();\n }\n }\n\n clear() {\n this.setTokens(null, null);\n this.setUser(null);\n }\n\n private restoreFromStorage() {\n if (!this._storage) {\n return;\n }\n\n if (this._strategy === 'browserStorage') {\n // Set the access token.\n const accessToken = this._storage.get<string>(this._accessTokenStorageKey);\n this.setAccessToken(accessToken);\n\n // Set the refresh token.\n const refreshToken = this._storage.get<string>(this._refreshTokenStorageKey);\n this.setRefreshToken(refreshToken);\n }\n\n // Set the user if we have any correct token payloads.\n if ((this._accessTokenPayload || this._refreshTokenPayload) || this._strategy === 'httpOnlyCookie') {\n const user = this._storage.get<unknown>(this._userStorageKey);\n this._user$.next(user ?? null); // Note: just settings here instead of setUser() because of syncing to the storage.\n }\n }\n\n private persistTokensInStorage() {\n if (!this._storage || this._strategy === 'httpOnlyCookie') {\n return;\n }\n\n // Set the access token if completely valid.\n if (!!this.accessToken) {\n this._storage.set<string>(this._accessTokenStorageKey, this._accessTokenString, {\n expires: this._accessTokenPayload?.expiresAt\n });\n } else {\n this._storage.remove(this._accessTokenStorageKey);\n }\n\n // Set the refresh token if completely valid.\n if (!!this.refreshToken) {\n this._storage.set<string>(this._refreshTokenStorageKey, this._refreshTokenString, {\n expires: this._refreshTokenPayload?.expiresAt\n });\n } else {\n this._storage.remove(this._refreshTokenStorageKey);\n }\n }\n\n private persistUserInStorage() {\n if (!this._storage) {\n return;\n }\n\n const user = this._user$.getValue();\n if (!user) {\n return this._storage.remove(this._userStorageKey);\n }\n\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n this._storage.set<unknown>(this._userStorageKey, user, {\n expires: new Date(date.getTime())\n });\n }\n\n private setAccessToken(value: string | null) {\n this._accessTokenString = value ?? null;\n this._accessTokenPayload = this._jwt.decode(this._accessTokenString);\n }\n\n private setRefreshToken(value: string | null) {\n this._refreshTokenString = value ?? null;\n this._refreshTokenPayload = this._jwt.decode(this._refreshTokenString);\n }\n\n private generateKey(applicationId: string, key: string) {\n return [applicationId, key].join('_');\n }\n\n private isTokenValid(token: AuthToken) {\n if (!token) {\n return false;\n }\n\n return token?.expiresAt?.getTime() > Date.now();\n }\n\n}\n","import {AUTH_CONFIG, AUTH_REDIRECT_HANDLER, AuthConfig, AuthRedirectHandler} from './interfaces/config.interface';\nimport {inject, Injectable, Injector, makeStateKey, StateKey, TransferState} from '@angular/core';\nimport {HttpClient, HttpContext, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {AuthProvider, AuthSignInResponse} from './interfaces/provider.interface';\nimport {Storage, StorageOption} from '@bravobit/bb-foundation/storage';\nimport {HttpConfig, HTTP_CONFIG} from '@bravobit/bb-foundation/http';\nimport {USE_AUTHORIZATION} from './tokens/use-authorization.token';\nimport {AuthVerifyProvider} from './providers/verify.provider';\nimport {AuthEmailProvider} from './providers/email.provider';\nimport {firstValueFrom, Observable, of} from 'rxjs';\nimport {Platform} from '@angular/cdk/platform';\nimport {AuthSession} from './auth.session';\nimport {map, tap} from 'rxjs/operators';\nimport {Router} from '@angular/router';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Auth {\n\n // Dependencies.\n private readonly _storage: Storage = inject(Storage);\n private readonly _injector: Injector = inject(Injector);\n private readonly _platform: Platform = inject(Platform);\n private readonly _httpClient: HttpClient = inject(HttpClient);\n private readonly _state?: TransferState = inject(TransferState, {optional: true});\n private readonly _config?: AuthConfig = inject(AUTH_CONFIG, {optional: true});\n private readonly _httpConfig?: HttpConfig = inject(HTTP_CONFIG, {optional: true});\n private readonly _handler?: AuthRedirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n // Readonly data.\n private readonly _authStateKey: StateKey<any | null> = makeStateKey(`bbAuthStateKey`);\n private readonly _httpAlias: string | null = this._httpConfig?.defaultAlias ?? null;\n\n readonly session: AuthSession;\n readonly user: Observable<any | null>;\n\n private _refreshHandler: number | null = null;\n\n constructor() {\n // We select a storage strategy based on the server/browser.\n // Only cookies CAN work on the server.\n const storageStrategy = this._platform.isBrowser\n ? this._storage.select([StorageOption.Cookie, StorageOption.Local])\n : this._storage.cookie;\n\n // Starting the new session.\n this.session = new AuthSession({\n id: this._config?.applicationId,\n storage: storageStrategy,\n strategy: this._config?.strategy\n });\n this.user = this.session.user;\n }\n\n async initialize() {\n // Check if the app should bootstrap the authentication.\n const shouldBootstrap = this._config?.bootstrap ?? true;\n if (!shouldBootstrap) {\n return this.handleAutoRefreshing();\n }\n\n // Only retrieve from the server when we are actually authenticated.\n if (!this.session.authenticated()) {\n return;\n }\n\n // Get the key from the server state.\n if (this._state && this._state?.hasKey(this._authStateKey)) {\n const user = this._state?.get(this._authStateKey, null) ?? null;\n return this.session.setUser(user);\n }\n\n if (this._config?.strategy === 'browserStorage') {\n // Try to fetch the user from the server.\n const user$ = this.me();\n const user = await firstValueFrom(user$, {defaultValue: null});\n\n // Set the state if exists.\n if (this._state) {\n this._state?.set<any>(this._authStateKey, user ?? null);\n }\n\n this.session.setUser(user);\n }\n\n this.handleAutoRefreshing();\n }\n\n me<T = any>() {\n const url = this.getUrl('auth/me');\n return this._httpClient.get<T>(url);\n }\n\n async signIn(provider: AuthProvider, as?: string[]) {\n const {accessToken, refreshToken, user, ...result} = await provider.authenticate(this._httpClient);\n\n // Check if the role matches.\n const role = user?.role ?? null;\n if (as && !as.includes(role)) {\n throw new Error('Invalid role.');\n }\n\n // Validate if the provider is one of the available\n // providers then return the user object and the provider.\n const apiProvider = result?.provider ?? null;\n const apiVerifyToken = result?.verifyToken ?? null;\n const availableProviders = this._config?.providers ?? ['email', 'sms', 'totp'];\n if (availableProviders.includes(apiProvider)) {\n return <AuthSignInResponse>{user, provider: apiProvider, verifyToken: apiVerifyToken};\n }\n\n // Set the tokens in storage.\n this.setTokens(accessToken, refreshToken);\n\n // Set the user in storage.\n this.session.setUser(user);\n\n // Return the user.\n return <AuthSignInResponse>{user};\n }\n\n async signInWithEmail(email: string, password: string, as?: string[]) {\n const url = this.getUrl('auth/login');\n return this.signIn(new AuthEmailProvider(email, password, url), as);\n }\n\n async signInWithVerifyCode(code: string, verifyToken: string) {\n const url = this.getUrl('auth/verify');\n return this.signIn(new AuthVerifyProvider(code, verifyToken, url));\n }\n\n async resendVerifyCode(verifyToken: string) {\n const url = this.getUrl('auth/resend');\n const result$ = this._httpClient.post(url, {verify_token: verifyToken});\n return await firstValueFrom(result$);\n }\n\n async register<T = any>(data: any, options?: {\n headers?: HttpHeaders | {\n [header: string]: string | string[];\n };\n params?: HttpParams | {\n [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n };\n }) {\n // Execute API call.\n const url = this.getUrl('auth/register');\n const result$ = this._httpClient.post<{ token: string, refresh_token: string, user: any }>(url, data, options);\n const result = await firstValueFrom(result$);\n\n // Set the tokens in storage.\n this.setTokens(result?.token, result?.refresh_token);\n\n // Set the user in storage.\n const user = result?.user;\n this.session.setUser(user);\n\n // Return the user.\n return <T>user;\n }\n\n logout() {\n // If we don't have a refresh token just clear the session.\n // Note: We do this because else we try to invalidate\n // an \"undefined\" refresh token.\n const refreshToken = this.session.refreshToken;\n if (!refreshToken && this._config?.strategy === 'browserStorage') {\n return this.session.clear();\n }\n\n // We do have a refresh token, so try to invalidate it in the backend.\n // or we are httpOnlyCookie authenticated.\n try {\n const url = this.getUrl('auth/logout');\n const headerName = this._config?.http?.header ?? 'Authorization';\n\n const headers = new HttpHeaders({\n [headerName]: refreshToken\n });\n\n const observable$ = this._httpClient.get(url, {\n ...(this._config?.strategy === 'browserStorage' ? {headers} : {}),\n ...(this._config?.strategy === 'httpOnlyCookie' ? {withCredentials: true} : {})\n });\n firstValueFrom(observable$).then(_ => _).catch(_ => _);\n } catch {\n // Do nothing because the tokens will be deleted anyways from the session.\n } finally {\n // Delete the tokens from the session.\n this.session.clear();\n }\n }\n\n refresh() {\n // If the refresh token does\n // not exist just return an observable of null.\n const refreshToken = this.session.refreshToken;\n if (!refreshToken && this._config?.strategy === 'browserStorage') {\n return of(null);\n }\n\n // Perform the refresh call.\n const headerName = this._config?.http?.header ?? 'Authorization';\n const scheme = this._config?.http?.scheme ?? 'Bearer';\n\n const url = this.getUrl('auth/refresh');\n const context = new HttpContext().set(USE_AUTHORIZATION, false);\n\n const headers = new HttpHeaders({\n [headerName]: `${scheme} ${refreshToken}`\n });\n\n return this._httpClient.get<{ token: string, refresh_token: string }>(url, {\n ...(this._config?.strategy === 'browserStorage' ? {headers} : {}),\n ...(this._config?.strategy === 'httpOnlyCookie' ? {withCredentials: true} : {}),\n context: context\n }).pipe(\n tap(({token, refresh_token}) => this.setTokens(token, refresh_token)),\n map(({token}) => token)\n );\n }\n\n async requestPassword(email: string, extraParams: { [key: string]: any } = {}) {\n const url = this.getUrl('auth/reset');\n const observable$ = this._httpClient.post(url, {...extraParams, email});\n return firstValueFrom(observable$);\n }\n\n async resetPassword(token: string, newPassword: string, extraParams: { [key: string]: any } = {}) {\n const url = this.getUrl('auth/reset-password');\n const observable$ = this._httpClient.post(url, {...extraParams, token, password: newPassword});\n return firstValueFrom(observable$);\n }\n\n clearAndRedirect() {\n // 1. Delete the tokens from the session.\n this.session.clear();\n\n if (this._handler) {\n const urlTree = this._handler.onFailedAuthenticated();\n if (typeof urlTree === 'boolean' || urlTree === null || urlTree === undefined) {\n return;\n }\n\n this.router.navigateByUrl(urlTree).then(_ => _);\n return;\n }\n\n // 2. Compose the route url.\n const redirectUrl = this._config?.redirects.unauthenticated ?? null;\n\n // 3. Route back if the user provided a redirect url.\n if (this.router && redirectUrl) {\n const commands = Array.isArray(redirectUrl) ? redirectUrl : [redirectUrl];\n this.router.navigate(commands).then(_ => _);\n }\n }\n\n private setTokens(accessToken: string, refreshToken: string) {\n // Set the tokens in our session.\n this.session.setTokens(accessToken, refreshToken);\n\n // We need to update the auto refresh of the refresh token.\n this.handleAutoRefreshing();\n }\n\n private handleAutoRefreshing() {\n const shouldAutoRefresh = this._config?.autoRefresh ?? false;\n if (!shouldAutoRefresh || this._config?.strategy === 'httpOnlyCookie') {\n return;\n }\n\n const expiresAt = this.session.refreshTokenPayload?.expiresAt ?? null;\n if (expiresAt === null || !this._platform.isBrowser) {\n return;\n }\n\n const differenceInMilliseconds = expiresAt.getTime() - Date.now();\n const offsetInMilliseconds = 10_000; // 10 seconds.\n\n // We want to start the refresh 10 seconds before it expires.\n const actualTiming = differenceInMilliseconds - offsetInMilliseconds;\n if (actualTiming <= 0) {\n return;\n }\n\n // We need to cap the timings because if\n // we get large numbers it might cause unwanted results.\n const maxTiming = 1000 * 60 * 60 * 24; // 24 hours.\n const cappedTiming = Math.max(1, Math.min(actualTiming, maxTiming));\n try {\n if (this._refreshHandler !== null) {\n clearTimeout?.(this._refreshHandler);\n this._refreshHandler = null;\n }\n this._refreshHandler = window?.setTimeout?.(() => this.autoRefresh(), cappedTiming);\n } catch {\n // Just ignore it.\n }\n }\n\n private async autoRefresh() {\n try {\n // We just need to wait for it to refresh.\n const refresh$ = this.refresh();\n await firstValueFrom(refresh$);\n } catch {\n // Something went wrong refreshing, we need to clear.\n this.clearAndRedirect();\n }\n }\n\n private get router() {\n return this._injector.get(Router);\n }\n\n private getUrl(endpoint: string) {\n return [this._httpAlias, endpoint]\n .filter(item => !!item)\n .join('/');\n }\n\n}\n","import {Directive, EmbeddedViewRef, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {Auth} from '../auth.service';\nimport {Subscription} from 'rxjs';\n\n@Directive({\n selector: 'ng-template[bbAuthenticated]'\n})\nexport class BbAuthenticated implements OnInit, OnDestroy {\n\n // Data.\n private _valid: boolean = false;\n\n // Templates.\n private _elseTemplateRef: TemplateRef<any> | null = null;\n\n // View refs.\n private _thenViewRef: EmbeddedViewRef<any> | null = null;\n private _elseViewRef: EmbeddedViewRef<any> | null = null;\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n @Input()\n set bbAuthenticatedElse(templateRef: TemplateRef<any>) {\n this.assertTemplate('bbAuthenticatedElse', templateRef);\n this._elseTemplateRef = templateRef;\n this.updateView();\n }\n\n constructor(private _auth: Auth,\n private _templateRef: TemplateRef<any>,\n private _viewContainerRef: ViewContainerRef) {\n }\n\n ngOnInit() {\n const subscription = this._auth.user.pipe(\n map(user => !!user),\n distinctUntilChanged()\n ).subscribe(valid => {\n this._valid = valid;\n this.updateView();\n });\n this._subscription.add(subscription);\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n private updateView() {\n if (this._valid) {\n if (!this._thenViewRef) {\n this._viewContainerRef.clear();\n this._elseViewRef = null;\n if (this._templateRef) {\n this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._templateRef);\n }\n }\n } else {\n if (!this._elseViewRef) {\n this._viewContainerRef.clear();\n this._thenViewRef = null;\n if (this._elseTemplateRef) {\n this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef);\n }\n }\n }\n }\n\n private assertTemplate(property: string, templateRef: TemplateRef<any> | null) {\n const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n if (!isTemplateRefOrNull) {\n throw new Error(`${property} must be a TemplateRef.`);\n }\n }\n\n static ngAcceptInputType_bbAuthenticatedElse: TemplateRef<any>;\n\n}\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {AUTH_CONFIG, AUTH_REDIRECT_HANDLER} from '../interfaces/config.interface';\nimport {inject} from '@angular/core';\nimport {Auth} from '../auth.service';\nimport {map} from 'rxjs/operators';\nimport {first} from 'rxjs';\n\nexport const bbAnonymousGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const auth = inject(Auth);\n const router = inject(Router);\n const config = inject(AUTH_CONFIG, {optional: true});\n const redirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n return auth.user.pipe(\n map(user => !!user),\n map(authenticated => {\n if (!authenticated) {\n return true;\n }\n\n if (redirectHandler) {\n return redirectHandler.onFailedAnonymous(route, state);\n }\n\n // If we don't have a URL to go to we can just say\n // the user is not allowed in this route by returning false.\n const nextUrl = config?.redirects?.authenticated ?? null;\n if (!nextUrl) {\n return false;\n }\n\n const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];\n return router.createUrlTree(commands);\n }),\n first()\n );\n};\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {AUTH_CONFIG, AUTH_REDIRECT_HANDLER} from '../interfaces/config.interface';\nimport {Auth} from '../auth.service';\nimport {inject} from '@angular/core';\nimport {map} from 'rxjs/operators';\nimport {first} from 'rxjs';\n\nexport const bbAuthenticatedGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const auth = inject(Auth);\n const router = inject(Router);\n const config = inject(AUTH_CONFIG, {optional: true});\n const redirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n return auth.user.pipe(\n map(user => !!user),\n map(authenticated => {\n if (authenticated) {\n return true;\n }\n\n if (redirectHandler) {\n return redirectHandler.onFailedAuthenticated(route, state);\n }\n\n // If we don't have a URL to go to we can just say\n // the user is not allowed in this route by returning false.\n const nextUrl = config?.redirects?.unauthenticated ?? null;\n if (!nextUrl) {\n return false;\n }\n\n const setRedirectOnFailedAuth = config?.setRedirectOnFailedAuth ?? true;\n const redirectUrl = state?.url ?? null;\n const queryParams = setRedirectOnFailedAuth && redirectUrl ? {redirectUrl} : {};\n const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];\n return router.createUrlTree(commands, {queryParams});\n }),\n first()\n );\n};\n","import {BehaviorSubject, firstValueFrom, Observable} from 'rxjs';\nimport {combineLatestMap} from '@bravobit/bb-foundation/rxjs';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {inject, Injectable} from '@angular/core';\nimport {Auth} from './auth.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Acting {\n\n // Dependencies.\n private readonly _auth: Auth = inject(Auth);\n\n // Cache.\n private _userId$ = new BehaviorSubject<number>(null);\n\n // State.\n readonly info$: Observable<{ active?: boolean, user?: any }> = this.getInfo();\n\n async start(userId: number) {\n this._userId$.next(userId);\n return await this.fetchUserDetails();\n }\n\n async stop() {\n this._userId$.next(null);\n return await this.fetchUserDetails();\n }\n\n getCurrent() {\n return this._userId$.getValue();\n }\n\n private async fetchUserDetails() {\n const user$ = this._auth.me();\n const user = await firstValueFrom(user$);\n this._auth.session.setUser(user);\n }\n\n private getInfo() {\n const active$ = this._userId$.pipe(\n map(item => !!item),\n distinctUntilChanged()\n );\n\n return combineLatestMap({active: active$, user: this._auth.user});\n }\n\n}\n","import {HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {inject, Injectable} from '@angular/core';\nimport {Acting} from './acting.service';\n\n@Injectable()\nexport class ActingInterceptor implements HttpInterceptor {\n\n // Dependencies.\n private readonly _acting: Acting = inject(Acting);\n\n // Readonly data.\n private readonly _headerString: string = 'X-Act-User-Id';\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler) {\n const userId = this._acting.getCurrent();\n if (userId === null || userId === undefined) {\n return next.handle(request);\n }\n\n const modified = request.clone({\n setHeaders: {[this._headerString]: `${userId}`}\n });\n\n return next.handle(modified);\n }\n\n}\n","import {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {catchError, filter, finalize, switchMap, take} from 'rxjs/operators';\nimport {AUTH_CONFIG, AuthConfig} from './interfaces/config.interface';\nimport {USE_AUTHORIZATION} from './tokens/use-authorization.token';\nimport {HttpError} from '@bravobit/bb-foundation/http';\nimport {BehaviorSubject, of, throwError} from 'rxjs';\nimport {inject, Injectable} from '@angular/core';\nimport {Auth} from './auth.service';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n\n // Dependencies.\n private readonly _auth: Auth = inject(Auth);\n private readonly _config?: AuthConfig = inject(AUTH_CONFIG, {optional: true});\n\n // Readonly data.\n private readonly _authHeaderString: string = this._config?.http?.header ?? 'Authorization';\n private readonly _authScheme: string = this._config?.http?.scheme ?? 'Bearer';\n\n // Data.\n isRefreshing: boolean = false;\n refreshingAccessToken$ = new BehaviorSubject<boolean>(false);\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler) {\n // 1. Check if the user wants to use the authorization for this request.\n if (!request.context.get(USE_AUTHORIZATION)) {\n return next.handle(request);\n }\n\n // 2. Compose the new request.\n const newRequest = this.modifyRequest(request);\n\n // 3. Handle all errors.\n return next.handle(newRequest).pipe(\n catchError(error => {\n // Handle the HTTP401 error.\n if ((error instanceof HttpErrorResponse || error instanceof HttpError) && error?.status === 401) {\n return this.handle401Error(request, next);\n }\n\n // Just re-throw the parsed error.\n return throwError(() => error);\n })\n );\n }\n\n private modifyRequest<T>(request: HttpRequest<T>) {\n switch (this._config?.strategy) {\n case 'browserStorage':\n return this.handleBrowserStorageRequest(request);\n case 'httpOnlyCookie':\n return this.handleHttpOnlyCookieRequest(request);\n default:\n throw new Error(`invalid auth strategy \"${this._config?.strategy}\"`);\n }\n }\n\n private handleBrowserStorageRequest<T>(request: HttpRequest<T>) {\n const accessToken = this.getAccessTokenFromSession(request);\n if (!accessToken) {\n return request.clone({headers: request.headers.delete(this._authHeaderString)});\n }\n\n return request.clone({\n setHeaders: {[this._authHeaderString]: `${this._authScheme} ${accessToken}`}\n });\n }\n\n private handleHttpOnlyCookieRequest<T>(request: HttpRequest<T>) {\n return request.clone({withCredentials: true});\n }\n\n private handle401Error(request: HttpRequest<unknown>, next: HttpHandler) {\n // If already refreshing wait for the refresh token to complete.\n if (this.isRefreshing) {\n return this.refreshingAccessToken$.pipe(\n filter(accessToken => accessToken !== false),\n take(1),\n switchMap(() => next.handle(this.modifyRequest(request)))\n );\n }\n\n // Set the refreshing to true.\n this.isRefreshing = true;\n this.refreshingAccessToken$.next(false);\n\n return this._auth.refresh().pipe(\n switchMap(newAccessToken => {\n if (!newAccessToken && this._config?.strategy === 'browserStorage') {\n return throwError(() => new Error('No refresh token was available.'));\n }\n\n this.refreshingAccessToken$.next(true);\n return next.handle(this.modifyRequest(request));\n }),\n catchError(() => this.logoutUser()),\n finalize(() => this.isRefreshing = false)\n );\n }\n\n private logoutUser() {\n // Handle the refresh error.\n this._auth.clearAndRedirect();\n\n // Return null as data.\n return of(null);\n }\n\n private getAccessTokenFromSession(request: HttpRequest<unknown>) {\n // Get the token based on header.\n if (request.headers.has(this._authHeaderString)) {\n return request.headers.get(this._authHeaderString);\n }\n\n // Return the default access token.\n return this._auth.session.accessToken;\n }\n\n}\n","import {EnvironmentProviders, makeEnvironmentProviders, inject, provideAppInitializer, Provider} from '@angular/core';\nimport {AUTH_CONFIG, AuthConfig} from './interfaces/config.interface';\nimport {HTTP_INTERCEPTORS} from '@angular/common/http';\nimport {ActingInterceptor} from './acting.interceptor';\nimport {AuthInterceptor} from './auth.interceptor';\nimport {Auth} from './auth.service';\n\nexport function provideAuthConfig(config?: AuthConfig): EnvironmentProviders {\n const providers: Provider = [\n {provide: AUTH_CONFIG, useValue: config},\n {provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true},\n provideAppInitializer(() => inject(Auth).initialize())\n ];\n\n if (config?.strategy === 'httpOnlyCookie' && !config?.bootstrap) {\n throw new Error('the \"bootstrap\" option must be enabled when using strategy=httpOnlyCookie');\n }\n\n if (config?.interceptActing) {\n providers.push({provide: HTTP_INTERCEPTORS, useClass: ActingInterceptor, multi: true});\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import {BbAuthenticated} from './directives/authenticated.directive';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {AuthConfig} from './interfaces/config.interface';\nimport {provideAuthConfig} from './auth.config';\n\n@NgModule({\n imports: [BbAuthenticated],\n exports: [BbAuthenticated]\n})\nexport class AuthModule {\n\n static forRoot(config: AuthConfig): ModuleWithProviders<AuthModule> {\n return {\n ngModule: AuthModule,\n providers: [\n provideAuthConfig(config)\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.Auth"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bravobit/bb-foundation",
3
- "version": "0.52.0",
3
+ "version": "0.52.1",
4
4
  "description": "The Angular core foundation of the Bravobit team.",
5
5
  "author": {
6
6
  "name": "Stan van Heumen",
@@ -40,6 +40,10 @@
40
40
  "types": "./auth/index.d.ts",
41
41
  "default": "./fesm2022/bravobit-bb-foundation-auth.mjs"
42
42
  },
43
+ "./combobox": {
44
+ "types": "./combobox/index.d.ts",
45
+ "default": "./fesm2022/bravobit-bb-foundation-combobox.mjs"
46
+ },
43
47
  "./collections": {
44
48
  "types": "./collections/index.d.ts",
45
49
  "default": "./fesm2022/bravobit-bb-foundation-collections.mjs"
@@ -48,22 +52,18 @@
48
52
  "types": "./dashboard/index.d.ts",
49
53
  "default": "./fesm2022/bravobit-bb-foundation-dashboard.mjs"
50
54
  },
51
- "./dialog": {
52
- "types": "./dialog/index.d.ts",
53
- "default": "./fesm2022/bravobit-bb-foundation-dialog.mjs"
54
- },
55
55
  "./elements": {
56
56
  "types": "./elements/index.d.ts",
57
57
  "default": "./fesm2022/bravobit-bb-foundation-elements.mjs"
58
58
  },
59
- "./combobox": {
60
- "types": "./combobox/index.d.ts",
61
- "default": "./fesm2022/bravobit-bb-foundation-combobox.mjs"
62
- },
63
59
  "./http": {
64
60
  "types": "./http/index.d.ts",
65
61
  "default": "./fesm2022/bravobit-bb-foundation-http.mjs"
66
62
  },
63
+ "./dialog": {
64
+ "types": "./dialog/index.d.ts",
65
+ "default": "./fesm2022/bravobit-bb-foundation-dialog.mjs"
66
+ },
67
67
  "./localize": {
68
68
  "types": "./localize/index.d.ts",
69
69
  "default": "./fesm2022/bravobit-bb-foundation-localize.mjs"