@bravobit/bb-foundation 0.51.7 → 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.
- package/auth/lib/auth.interceptor.d.ts +5 -3
- package/auth/lib/auth.session.d.ts +7 -0
- package/auth/lib/interfaces/config.interface.d.ts +2 -0
- package/elements/lib/elements.interfaces.d.ts +1 -0
- package/elements/lib/file-picker/file-picker.component.d.ts +3 -1
- package/elements/lib/multi-file-control/multi-file-control.component.d.ts +6 -6
- package/fesm2022/bravobit-bb-foundation-auth.mjs +90 -59
- package/fesm2022/bravobit-bb-foundation-auth.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-elements.mjs +34 -22
- package/fesm2022/bravobit-bb-foundation-elements.mjs.map +1 -1
- package/localize/lib/transforms/interpolate.transform.d.ts +1 -1
- package/localize/lib/transforms/plural.transform.d.ts +1 -1
- package/localize/lib/transforms/reference.transform.d.ts +1 -1
- package/package.json +9 -9
|
@@ -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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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { map, startWith, distinctUntilChanged, shareReplay, tap, delay, switchMap } from 'rxjs/operators';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { Directive, Optional, Self, InjectionToken, Input, EventEmitter, Component, ChangeDetectionStrategy, ViewEncapsulation, Inject, Output, booleanAttribute, ContentChild, Host, HostBinding, inject, Renderer2, numberAttribute, HostListener, ElementRef, ViewContainerRef, EnvironmentInjector, Pipe, LOCALE_ID, forwardRef, ViewChild, ChangeDetectorRef, makeEnvironmentProviders, NgModule } from '@angular/core';
|
|
4
|
-
import * as i2 from 'rxjs';
|
|
4
|
+
import * as i2$1 from 'rxjs';
|
|
5
5
|
import { fromEvent, merge, EMPTY, BehaviorSubject, combineLatest, of, Subscription, takeUntil } from 'rxjs';
|
|
6
6
|
import * as i1 from '@angular/forms';
|
|
7
7
|
import { NgControl, Validators, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
8
|
-
import * as i1$
|
|
8
|
+
import * as i1$2 from '@bravobit/bb-foundation/localize';
|
|
9
9
|
import { BbLocalize, Localize, BbLocalizeTemplate, BbLocalizeString, LOCALIZE_ID } from '@bravobit/bb-foundation/localize';
|
|
10
10
|
import { AsyncPipe, DOCUMENT, formatDate, NgTemplateOutlet } from '@angular/common';
|
|
11
11
|
import { BbTemplate } from '@bravobit/bb-foundation/utils';
|
|
12
12
|
import * as i1$1 from '@angular/cdk/platform';
|
|
13
13
|
import { Platform } from '@angular/cdk/platform';
|
|
14
|
-
import * as
|
|
14
|
+
import * as i2 from '@bravobit/bb-foundation';
|
|
15
15
|
import { Files, clamp, hsvToHex, hexToHsv, Exif, FileLoader, parseDate } from '@bravobit/bb-foundation';
|
|
16
16
|
import { Overlay } from '@angular/cdk/overlay';
|
|
17
17
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
@@ -829,7 +829,7 @@ class BbFileImage {
|
|
|
829
829
|
return null;
|
|
830
830
|
});
|
|
831
831
|
}
|
|
832
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbFileImage, deps: [{ token: i1$1.Platform }, { token:
|
|
832
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbFileImage, deps: [{ token: i1$1.Platform }, { token: i2.ImageConverter }, { token: i3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
833
833
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: BbFileImage, isStandalone: true, name: "bbFileImage" });
|
|
834
834
|
}
|
|
835
835
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbFileImage, decorators: [{
|
|
@@ -837,7 +837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImpor
|
|
|
837
837
|
args: [{
|
|
838
838
|
name: 'bbFileImage'
|
|
839
839
|
}]
|
|
840
|
-
}], ctorParameters: () => [{ type: i1$1.Platform }, { type:
|
|
840
|
+
}], ctorParameters: () => [{ type: i1$1.Platform }, { type: i2.ImageConverter }, { type: i3.DomSanitizer }] });
|
|
841
841
|
|
|
842
842
|
class BbFileDataUrl {
|
|
843
843
|
// Dependencies.
|
|
@@ -958,7 +958,7 @@ class BbRelativeTime {
|
|
|
958
958
|
date?.getMonth() === tomorrow?.getMonth() &&
|
|
959
959
|
date?.getFullYear() === tomorrow?.getFullYear();
|
|
960
960
|
};
|
|
961
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbRelativeTime, deps: [{ token: LOCALE_ID }, { token: i1$
|
|
961
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbRelativeTime, deps: [{ token: LOCALE_ID }, { token: i1$2.Localize, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
962
962
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: BbRelativeTime, isStandalone: true, name: "bbRelativeTime" });
|
|
963
963
|
}
|
|
964
964
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbRelativeTime, decorators: [{
|
|
@@ -969,7 +969,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImpor
|
|
|
969
969
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
970
970
|
type: Inject,
|
|
971
971
|
args: [LOCALE_ID]
|
|
972
|
-
}] }, { type: i1$
|
|
972
|
+
}] }, { type: i1$2.Localize, decorators: [{
|
|
973
973
|
type: Optional
|
|
974
974
|
}] }] });
|
|
975
975
|
|
|
@@ -1697,8 +1697,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImpor
|
|
|
1697
1697
|
|
|
1698
1698
|
let nextUniqueId$2 = 0;
|
|
1699
1699
|
class BbMultiFileControl {
|
|
1700
|
-
|
|
1701
|
-
|
|
1700
|
+
// Dependencies.
|
|
1701
|
+
_files = inject(Files);
|
|
1702
|
+
_changeDetectorRef = inject(ChangeDetectorRef);
|
|
1703
|
+
_config = inject(ELEMENTS_CONFIG, { optional: true });
|
|
1702
1704
|
// Readonly data.
|
|
1703
1705
|
labelId = `bb-multi-file-control-${nextUniqueId$2++}`;
|
|
1704
1706
|
// Views.
|
|
@@ -1706,7 +1708,7 @@ class BbMultiFileControl {
|
|
|
1706
1708
|
// Inputs.
|
|
1707
1709
|
label = null;
|
|
1708
1710
|
hint = null;
|
|
1709
|
-
accept =
|
|
1711
|
+
accept = this.getAcceptString();
|
|
1710
1712
|
grouped = false;
|
|
1711
1713
|
required = false;
|
|
1712
1714
|
disabled = false;
|
|
@@ -1720,10 +1722,6 @@ class BbMultiFileControl {
|
|
|
1720
1722
|
// Callbacks.
|
|
1721
1723
|
onTouchedCallback = () => ({});
|
|
1722
1724
|
onChangeCallback = () => ({});
|
|
1723
|
-
constructor(_files, _changeDetectorRef) {
|
|
1724
|
-
this._files = _files;
|
|
1725
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
1726
|
-
}
|
|
1727
1725
|
get showList() {
|
|
1728
1726
|
return this.value?.length > 0 || this.items?.length > 0;
|
|
1729
1727
|
}
|
|
@@ -1760,7 +1758,7 @@ class BbMultiFileControl {
|
|
|
1760
1758
|
this.error = !!error;
|
|
1761
1759
|
}
|
|
1762
1760
|
validate({ value }) {
|
|
1763
|
-
const regexString = (this.accept
|
|
1761
|
+
const regexString = (this.accept ?? '*')
|
|
1764
1762
|
.replace(/\*/g, '.\*')
|
|
1765
1763
|
.replace(/,/g, '|');
|
|
1766
1764
|
const mimeTypeRegex = new RegExp(regexString);
|
|
@@ -1790,7 +1788,13 @@ class BbMultiFileControl {
|
|
|
1790
1788
|
return 'File' in window && input instanceof File
|
|
1791
1789
|
|| 'Blob' in window && input instanceof Blob;
|
|
1792
1790
|
}
|
|
1793
|
-
|
|
1791
|
+
getAcceptString() {
|
|
1792
|
+
const allowedFileTypes = this._config?.allowedFileTypes ?? [];
|
|
1793
|
+
return allowedFileTypes?.length <= 0
|
|
1794
|
+
? null
|
|
1795
|
+
: allowedFileTypes.join(', ');
|
|
1796
|
+
}
|
|
1797
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbMultiFileControl, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1794
1798
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: BbMultiFileControl, isStandalone: true, selector: "bb-multi-file-control", inputs: { label: "label", hint: "hint", accept: "accept", grouped: ["grouped", "grouped", booleanAttribute], required: ["required", "required", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], hideErrors: ["hideErrors", "hideErrors", booleanAttribute], items: "items" }, outputs: { delete: "delete" }, host: { properties: { "class.required": "required", "class.disabled": "disabled", "class.grouped": "grouped", "class.error": "error" }, classAttribute: "bb-multi-file-control" }, providers: [
|
|
1795
1799
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BbMultiFileControl), multi: true },
|
|
1796
1800
|
{ provide: NG_VALIDATORS, useExisting: BbMultiFileControl, multi: true }
|
|
@@ -1808,7 +1812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImpor
|
|
|
1808
1812
|
'[class.grouped]': 'grouped',
|
|
1809
1813
|
'[class.error]': 'error'
|
|
1810
1814
|
}, imports: [BbFormError, BbTemplate, BbButton, BbLocalize, BbLocalizeTemplate, BbLocalizeString, BbFileDrop], template: "<!-- The label of the input. -->\n@if (label; as labelContent) {\n <label [for]=\"labelId\"\n class=\"bb-multi-file-control-label\">\n <ng-template [bbTemplate]=\"labelContent\">{{ labelContent }}</ng-template>\n </label>\n}\n\n<input #fileInput\n [id]=\"labelId\"\n [accept]=\"accept\"\n [disabled]=\"disabled\"\n (change)=\"onFileChange($event)\"\n class=\"bb-multi-file-control-input\"\n type=\"file\"\n tabindex=\"-1\"\n multiple>\n\n<div [bbFileDropDisabled]=\"disabled\"\n (bbFileDrop)=\"addFiles($event)\"\n class=\"bb-multi-file-control-container\">\n @if (showList) {\n <ul class=\"bb-multi-file-control-list\">\n @for (item of items; track item?.id) {\n <li class=\"bb-multi-file-control-item\">\n <i class=\"bb-multi-file-control-icon attach-horizontal\"></i>\n <a [href]=\"item?.url\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"bb-multi-file-control-item-content\">{{ item?.label }}</a>\n @if (!disabled && delete?.observed) {\n <button (click)=\"delete?.emit(item)\"\n type=\"button\"\n class=\"bb-multi-file-control-item-button\">\n <i class=\"bb-multi-file-control-icon clear\"></i>\n </button>\n }\n </li>\n }\n @for (file of value; track $index) {\n <li class=\"bb-multi-file-control-item\">\n <i class=\"bb-multi-file-control-icon attach-horizontal\"></i>\n <button (click)=\"downloadFile(file)\"\n class=\"bb-multi-file-control-item-content\"\n type=\"button\">\n {{ file?.name }}\n </button>\n @if (!disabled) {\n <button (click)=\"deleteFile($index)\"\n type=\"button\"\n class=\"bb-multi-file-control-item-button\">\n <i class=\"bb-multi-file-control-icon clear\"></i>\n </button>\n }\n </li>\n }\n </ul>\n } @else if (!disabled) {\n <i class=\"bb-multi-file-control-icon attach-vertical\"></i>\n <p [bb-localize-string]=\"'multi-file-control.choose_file_text' | bbLocalize\"\n class=\"bb-multi-file-control-empty\">\n <label *bbLocalizeTemplate=\"'label'\"\n [for]=\"labelId\">{{ 'multi-file-control.choose_file' | bbLocalize }}</label>\n </p>\n }\n @if (!disabled) {\n <button (click)=\"openFileDialog()\"\n type=\"button\"\n class=\"primary small bb-multi-file-control-button\"\n bb-button>\n <i class=\"bb-multi-file-control-icon add\" suffix></i>\n {{ 'multi-file-control.choose_file' | bbLocalize }}\n </button>\n }\n</div>\n\n@if (!hideErrors) {\n <bb-form-error (errorChange)=\"onErrorChange($event)\"></bb-form-error>\n}\n\n<!-- The file picker hint. -->\n@if (hint; as hintContent) {\n <p class=\"bb-multi-file-control-hint\">\n <ng-template [bbTemplate]=\"hintContent\">{{ hintContent }}</ng-template>\n </p>\n}\n", styles: [".bb-multi-file-control{display:block;line-height:normal}.bb-multi-file-control.grouped{margin-bottom:1.5rem}.bb-multi-file-control.required>.bb-multi-file-control-label:after{content:\"*\";font-size:.75rem;vertical-align:top;color:var(--bb-form-label-required-color)}.bb-multi-file-control-container.is-hovered{border-color:var(--bb-multi-file-control-focus-border-color);box-shadow:0 .375rem .375rem -.375rem #0000001a,var(--bb-multi-file-control-box-shadow)}.bb-multi-file-control.disabled>.bb-multi-file-control-container{cursor:default;color:var(--bb-control-disabled-color);background-color:var(--bb-control-disabled-background-color)}.bb-multi-file-control.error>.bb-multi-file-control-label{color:var(--bb-control-error-color)}.bb-multi-file-control.error>.bb-multi-file-control-hint{display:none}.bb-multi-file-control.error>.bb-multi-file-control-container{border:1px solid var(--bb-control-error-border-color);background-color:var(--bb-control-error-background-color)}.bb-multi-file-control-label{display:block;margin-bottom:.25rem;color:var(--bb-form-label-color);font-size:var(--bb-form-label-font-size);font-weight:var(--bb-form-label-font-weight)}.bb-multi-file-control-input{opacity:0;z-index:-1;width:.1px;height:.1px;overflow:hidden;position:absolute}.bb-multi-file-control-container{width:100%;display:flex;color:#111;padding:.5rem;overflow:hidden;min-height:7.5rem;align-items:center;border-radius:.5rem;flex-direction:column;justify-content:center;background-color:#fff;transition-duration:.25s;transition-property:background-color,box-shadow;transition-timing-function:cubic-bezier(0,0,.2,1);border:1px solid var(--bb-multi-file-control-border-color);box-shadow:0 .375rem .375rem -.375rem #0000001a}.bb-multi-file-control-button{margin-top:.5rem}.bb-multi-file-control-list{flex:1;width:100%;overflow:hidden}.bb-multi-file-control-empty{flex:1;width:100%;color:#758795;display:block;font-weight:400;line-height:1.5;text-align:center;font-size:.875rem}.bb-multi-file-control-empty>label{cursor:pointer;display:inline;font-size:inherit;font-weight:inherit;text-decoration:underline;color:var(--bb-multi-file-control-color)}.bb-multi-file-control-item{height:2rem;display:flex;max-width:100%;overflow:hidden;align-items:center;white-space:nowrap;border-radius:.5rem;text-overflow:ellipsis;padding:0 .25rem 0 .5rem;background-color:#edf4fd;border:1px solid var(--bb-multi-file-control-border-color)}.bb-multi-file-control-item:not(:last-child){margin-bottom:.25rem}.bb-multi-file-control-item-content{flex:1;padding:0;border:none;max-width:100%;margin:0 .5rem;overflow:hidden;appearance:none;text-align:left;font-weight:400;font-size:.875rem;white-space:nowrap;text-decoration:none;text-overflow:ellipsis;background-color:transparent}.bb-multi-file-control-item-content,.bb-multi-file-control-item-content:visited{color:#0a305c}.bb-multi-file-control-item-content:hover,.bb-multi-file-control-item-content:focus{text-decoration:underline}.bb-multi-file-control-item-button{padding:0;width:1.5rem;display:flex;height:1.5rem;align-items:center;border-radius:.25rem;justify-content:center;border:1px solid hsl(0,73%,25%);background-color:#b51c1c}.bb-multi-file-control-item-button:hover,.bb-multi-file-control-item-button:focus{background-color:#a81a1a}.bb-multi-file-control-item-button:active{background-color:#9a1818}.bb-multi-file-control-hint{display:block;line-height:1.5;margin-top:.25rem;font-size:.8125rem;color:#758795}.bb-multi-file-control-icon{width:1.25rem;height:1.25rem;display:inline-flex;background-size:contain;background-repeat:no-repeat;background-position:center center}.bb-multi-file-control-icon.add{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"%23fff\" viewBox=\"0 0 24 24\"%3E%3Cpath d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/%3E%3C/svg%3E')}.bb-multi-file-control-icon.attach-vertical{width:1.5rem;height:1.5rem;margin-bottom:.5rem;background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"%23758795\" viewBox=\"0 0 24 24\"%3E%3Cpath d=\"M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4V5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1V6H10v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V5c0-2.21-1.79-4-4-4S7 2.79 7 5v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5V6h-1.5z\"/%3E%3C/svg%3E')}.bb-multi-file-control-icon.attach-horizontal{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"%3E%3Cpath d=\"M2 12.5C2 9.46 4.46 7 7.5 7H18c2.21 0 4 1.79 4 4s-1.79 4-4 4H9.5C8.12 15 7 13.88 7 12.5S8.12 10 9.5 10H17v2H9.41c-.55 0-.55 1 0 1H18c1.1 0 2-.9 2-2s-.9-2-2-2H7.5C5.57 9 4 10.57 4 12.5S5.57 16 7.5 16H17v2H7.5C4.46 18 2 15.54 2 12.5z\"/%3E%3C/svg%3E')}.bb-multi-file-control-icon.clear{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"%23fff\" viewBox=\"0 0 24 24\"%3E%3Cpath d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/%3E%3C/svg%3E')}\n"] }]
|
|
1811
|
-
}],
|
|
1815
|
+
}], propDecorators: { fileInput: [{
|
|
1812
1816
|
type: ViewChild,
|
|
1813
1817
|
args: ['fileInput', { static: true }]
|
|
1814
1818
|
}], label: [{
|
|
@@ -1837,6 +1841,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImpor
|
|
|
1837
1841
|
|
|
1838
1842
|
let nextUniqueId$1 = 0;
|
|
1839
1843
|
class BbFilePicker {
|
|
1844
|
+
// Dependencies.
|
|
1845
|
+
_config = inject(ELEMENTS_CONFIG, { optional: true });
|
|
1840
1846
|
// Readonly data.
|
|
1841
1847
|
labelId = `bb-file-picker-${nextUniqueId$1++}`;
|
|
1842
1848
|
// Views.
|
|
@@ -1845,7 +1851,7 @@ class BbFilePicker {
|
|
|
1845
1851
|
// Inputs.
|
|
1846
1852
|
label = null;
|
|
1847
1853
|
hint = null;
|
|
1848
|
-
accept =
|
|
1854
|
+
accept = this.getAcceptString();
|
|
1849
1855
|
showImages = true;
|
|
1850
1856
|
grouped = false;
|
|
1851
1857
|
required = false;
|
|
@@ -1911,7 +1917,7 @@ class BbFilePicker {
|
|
|
1911
1917
|
if (value === null || value === undefined) {
|
|
1912
1918
|
return null;
|
|
1913
1919
|
}
|
|
1914
|
-
const regexString = (this.accept
|
|
1920
|
+
const regexString = (this.accept ?? '*')
|
|
1915
1921
|
.replace(/\*/g, '.\*')
|
|
1916
1922
|
.replace(/,/g, '|');
|
|
1917
1923
|
const mimeTypeRegex = new RegExp(regexString);
|
|
@@ -1933,6 +1939,12 @@ class BbFilePicker {
|
|
|
1933
1939
|
}
|
|
1934
1940
|
return Array.from(element.files);
|
|
1935
1941
|
}
|
|
1942
|
+
getAcceptString() {
|
|
1943
|
+
const allowedFileTypes = this._config?.allowedFileTypes ?? [];
|
|
1944
|
+
return allowedFileTypes?.length <= 0
|
|
1945
|
+
? null
|
|
1946
|
+
: allowedFileTypes.join(', ');
|
|
1947
|
+
}
|
|
1936
1948
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbFilePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1937
1949
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: BbFilePicker, isStandalone: true, selector: "bb-file-picker", inputs: { label: "label", hint: "hint", accept: "accept", showImages: "showImages", grouped: ["grouped", "grouped", booleanAttribute], required: ["required", "required", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], hideErrors: ["hideErrors", "hideErrors", booleanAttribute], value: "value" }, outputs: { valueChange: "valueChange" }, host: { properties: { "class.required": "required", "class.disabled": "disabled", "class.grouped": "grouped", "class.error": "error" }, classAttribute: "bb-file-picker" }, providers: [
|
|
1938
1950
|
{
|
|
@@ -2090,7 +2102,7 @@ class BbImagePicker {
|
|
|
2090
2102
|
setDisabledState(isDisabled) {
|
|
2091
2103
|
this.disabled = isDisabled;
|
|
2092
2104
|
}
|
|
2093
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbImagePicker, deps: [{ token:
|
|
2105
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: BbImagePicker, deps: [{ token: i2.ImageConverter }], target: i0.ɵɵFactoryTarget.Component });
|
|
2094
2106
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: BbImagePicker, isStandalone: true, selector: "bb-image-picker", inputs: { label: "label", placeholder: "placeholder", styleDimensions: "styleDimensions", cropDimensions: "cropDimensions", buttonClass: "buttonClass", disabled: ["disabled", "disabled", booleanAttribute], grouped: ["grouped", "grouped", booleanAttribute], value: "value" }, outputs: { valueChange: "valueChange" }, host: { properties: { "class.disabled": "disabled", "class.grouped": "grouped" }, classAttribute: "bb-image-picker" }, providers: [
|
|
2095
2107
|
{
|
|
2096
2108
|
provide: NG_VALUE_ACCESSOR,
|
|
@@ -2112,7 +2124,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImpor
|
|
|
2112
2124
|
multi: true
|
|
2113
2125
|
}
|
|
2114
2126
|
], imports: [BbButton, AsyncPipe], template: "<!-- The input that can open the file picker. -->\n<input #fileInput\n (change)=\"onFileChange($event)\"\n class=\"bb-image-picker-input\"\n type=\"file\"\n tabindex=\"-1\"\n accept=\"image/*\">\n\n<span [style.width]=\"styleDimensions?.width ?? '100%'\"\n [style.height]=\"styleDimensions?.height ?? '215px'\"\n [style.background-image]=\"image | async\"\n class=\"bb-image-input-image\"></span>\n\n@if (label; as labelText) {\n <button (click)=\"openFilePicker()\"\n bb-button\n class=\"bb-image-input-button {{ buttonClass }}\"\n type=\"button\">\n {{ labelText }}\n </button>\n}\n", styles: [".bb-image-picker{display:flex;align-items:center;line-height:normal;flex-direction:column}.bb-image-picker.circle>.bb-image-input-image{border-radius:50%}.bb-image-picker.grouped{margin-bottom:1.5rem}.bb-image-picker.disabled{opacity:.5;cursor:default;-webkit-user-select:none;user-select:none;pointer-events:none}.bb-image-picker-input{opacity:0;z-index:-1;width:.1px;height:.1px;overflow:hidden;position:absolute}.bb-image-input-image{display:flex;cursor:default;position:relative;align-items:center;border-radius:.25rem;justify-content:center;background:#0003 url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7) center center/cover no-repeat}.bb-image-input-button{margin-top:.75rem}\n"] }]
|
|
2115
|
-
}], ctorParameters: () => [{ type:
|
|
2127
|
+
}], ctorParameters: () => [{ type: i2.ImageConverter }], propDecorators: { fileInput: [{
|
|
2116
2128
|
type: ViewChild,
|
|
2117
2129
|
args: ['fileInput', { static: true }]
|
|
2118
2130
|
}], label: [{
|
|
@@ -2411,7 +2423,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImpor
|
|
|
2411
2423
|
BbInput,
|
|
2412
2424
|
BbFormError
|
|
2413
2425
|
], template: "<!-- Label of the date picker. -->\n@if (label; as labelContent) {\n <label class=\"bb-date-picker-label\">\n <ng-template [bbTemplate]=\"labelContent\">{{ labelContent }}</ng-template>\n </label>\n}\n\n@if (data$ | async; as data) {\n <!-- The form containing the year/month/day fields. -->\n <div [formGroup]=\"form\"\n class=\"bb-date-picker-container\">\n <div class=\"bb-date-picker-item\">\n <bb-form-control hideErrors>\n <select [class.has-value]=\"!!form?.get('day')?.value\"\n bbInput\n autocomplete=\"off\"\n formControlName=\"day\">\n <option [ngValue]=\"null\">{{ dayPlaceholder }}</option>\n @for (day of data?.days; track day?.value) {\n <option [value]=\"day?.value\">{{ day?.label }}</option>\n }\n </select>\n </bb-form-control>\n </div>\n <div class=\"bb-date-picker-item\">\n <bb-form-control hideErrors>\n <select [class.has-value]=\"!!form?.get('month')?.value\"\n bbInput\n autocomplete=\"off\"\n formControlName=\"month\">\n <option [ngValue]=\"null\">{{ monthPlaceholder }}</option>\n @for (month of data?.months; track month?.value) {\n <option [value]=\"month?.value\">{{ month?.label }}</option>\n }\n </select>\n </bb-form-control>\n </div>\n <div class=\"bb-date-picker-item\">\n <bb-form-control hideErrors>\n @if (data?.years?.length > 0) {\n <select [class.has-value]=\"!!form?.get('year')?.value\"\n bbInput\n autocomplete=\"off\"\n formControlName=\"year\">\n <option [ngValue]=\"null\">{{ yearPlaceholder }}</option>\n @for (year of data?.years; track year) {\n <option [value]=\"year\">{{ year }}</option>\n }\n </select>\n } @else {\n <input [placeholder]=\"yearPlaceholder\"\n bbInput\n type=\"text\"\n inputmode=\"numeric\"\n minlength=\"4\"\n maxlength=\"4\"\n pattern=\"^[0-9]{4}$\"\n formControlName=\"year\"\n autocomplete=\"off\">\n }\n </bb-form-control>\n </div>\n </div>\n}\n\n<!-- The date picker error. -->\n@if (!hideErrors) {\n <bb-form-error (errorChange)=\"onErrorChange($event)\"></bb-form-error>\n}\n<!-- The date picker hint. -->\n@if (hint; as hintContent) {\n <p class=\"bb-date-picker-hint\">\n <ng-template [bbTemplate]=\"hintContent\">{{ hintContent }}</ng-template>\n </p>\n}\n", styles: [".bb-date-picker{display:block;line-height:normal}.bb-date-picker.required>.bb-date-picker-label:after{content:\"*\";font-size:.75rem;vertical-align:top;color:var(--bb-form-label-required-color)}.bb-date-picker.readonly{pointer-events:none}.bb-date-picker.readonly>.bb-date-picker-container>.bb-date-picker-item>.bb-form-control>.bb-form-control-container{cursor:default;border-style:dotted;border-color:#bdc4c9}.bb-date-picker.readonly>.bb-date-picker-container>.bb-date-picker-item>.bb-form-control>.bb-form-control-container>select:disabled{opacity:1}.bb-date-picker.grouped{margin-bottom:1.5rem}.bb-date-picker.error>.bb-date-picker-label{color:var(--bb-control-error-color)}.bb-date-picker.error>.bb-date-picker-container>.bb-date-picker-item>.bb-form-control>.bb-form-control-container{border-color:var(--bb-control-error-border-color);background-color:var(--bb-control-error-background-color)}.bb-date-picker.error>.bb-date-picker-container>.bb-date-picker-item>.bb-form-control>.bb-form-control-container>input::placeholder,.bb-date-picker.error>.bb-date-picker-container>.bb-date-picker-item>.bb-form-control>.bb-form-control-container>textarea::placeholder,.bb-date-picker.error>.bb-date-picker-container>.bb-date-picker-item>.bb-form-control>.bb-form-control-container>select:not(.has-value){color:var(--bb-control-error-placeholder-color)}.bb-date-picker.error>.bb-date-picker-container>.bb-date-picker-item>.bb-form-control>.bb-form-control-container:has(input:not(:disabled):not(:read-only):focus,select:not(:disabled):focus){box-shadow:var(--bb-control-error-box-shadow)}.bb-date-picker-label{display:block;margin-bottom:.25rem;color:var(--bb-form-label-color, #525252);font-weight:var(--bb-form-label-font-weight, 400);font-size:var(--bb-form-label-font-size, .875rem)}.bb-date-picker-container{display:flex}.bb-date-picker-item{flex:1}.bb-date-picker-item>.bb-form-control>.bb-form-control-container:has(input:not(:disabled):not(:read-only):focus,select:not(:disabled):focus){z-index:1;position:relative}.bb-date-picker-item>.bb-form-control>.bb-form-control-container>select>option:first-child{color:#d2d2d2}.bb-date-picker-item>.bb-form-control>.bb-form-control-container>select:not(.has-value){color:#d2d2d2}.bb-date-picker-item>.bb-form-control>.bb-form-control-container>select:not(.has-value)>option:not(:first-child){color:#111}.bb-date-picker-item:not(:first-child):not(:last-child){margin:0 -1px}.bb-date-picker-item:not(:first-child):not(:last-child)>.bb-form-control>.bb-form-control-container{border-radius:0}.bb-date-picker-item:first-child>.bb-form-control>.bb-form-control-container{border-top-right-radius:0;border-bottom-right-radius:0}.bb-date-picker-item:last-child>.bb-form-control>.bb-form-control-container{border-top-left-radius:0;border-bottom-left-radius:0}.bb-date-picker-hint{display:block;line-height:1.5;margin-top:.25rem;font-size:.8125rem;color:#758795}\n"] }]
|
|
2414
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i2.Observable, decorators: [{
|
|
2426
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i2$1.Observable, decorators: [{
|
|
2415
2427
|
type: Inject,
|
|
2416
2428
|
args: [LOCALIZE_ID]
|
|
2417
2429
|
}] }], propDecorators: { label: [{
|