{"version":3,"file":"ngx-security-auth.mjs","sources":["../../../projects/auth/src/lib/util/base64.util.ts","../../../projects/auth/src/lib/util/jwt.util.ts","../../../projects/auth/src/lib/util/locale-storage.util.ts","../../../projects/auth/src/lib/util/session-storage.util.ts","../../../projects/auth/src/lib/util/nonce.util.ts","../../../projects/auth/src/lib/util/url.util.ts","../../../projects/auth/src/lib/service/tokens/auth-tokens.ts","../../../projects/auth/src/lib/service/tokens/tokens-service-options.ts","../../../projects/auth/src/lib/service/auth-flow-options.ts","../../../projects/auth/src/lib/service/password-flow/password-flow-options.ts","../../../projects/auth/src/lib/service/authorization-code-flow/authorization-code-flow-options.ts","../../../projects/auth/src/lib/service/client-credentials-flow/client-credentials-flow-options.ts","../../../projects/auth/src/lib/service/tokens/tokens.service.ts","../../../projects/auth/src/lib/service/password-flow/password-flow.service.ts","../../../projects/auth/src/lib/service/implicit-flow/implicit-flow-options.ts","../../../projects/auth/src/lib/service/implicit-flow/implicit-flow.service.ts","../../../projects/auth/src/lib/service/authorization-code-flow/authorization-code-flow.service.ts","../../../projects/auth/src/lib/service/client-credentials-flow/client-credentials-flow.service.ts","../../../projects/auth/src/lib/service/subject/auth-subject-service-options.ts","../../../projects/auth/src/lib/service/subject/auth-subject.service.ts","../../../projects/auth/src/lib/interceptor/auth-http-interceptor-options.ts","../../../projects/auth/src/lib/interceptor/auth-http.interceptor.ts","../../../projects/auth/src/lib/auth.provider.ts","../../../projects/auth/src/ngx-security-auth.ts"],"sourcesContent":["export class Base64Util {\n\n  /**\n   * Decode base64 value\n   *\n   * <br/>\n   * <i>credits for decoder goes to https://github.com/atk</i>\n   *\n   *  @param value: base64 value\n   */\n  static decode(value: string): string {\n    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    let output = '';\n\n    value = String(value).replace(/=+$/, '');\n\n    if (value.length % 4 === 1) {\n      throw new Error('\\'atob\\' failed: The string to be decoded is not correctly encoded.');\n    }\n\n    for (\n      // initialize result and counters\n      let bc = 0, bs: any, buffer: any, idx = 0;\n      // get next character\n      (buffer = value.charAt(idx++));\n      // character found in table? initialize bit storage and add its ascii value;\n      ~buffer &&\n      (\n        (bs = bc % 4 ? bs * 64 + buffer : buffer),\n          // and if not first of each 4 characters,\n          // convert the first 8 bits to one ascii character\n        bc++ % 4\n      )\n        ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n        : 0\n    ) {\n      // try to find character in table (0-63, not found => -1)\n      buffer = chars.indexOf(buffer);\n    }\n    return output;\n  }\n\n  /**\n   * Decode base64 value\n   *\n   * @param value: base64 value\n   */\n  static decodeUnicode(value: string): string {\n    const fn = (c: any) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n    return decodeURIComponent(Array.prototype.map.call(Base64Util.decode(value), fn).join(''));\n  }\n\n  /**\n   * Decode url-base64 value\n   *\n   * @param value: url-base64 encoded\n   */\n  static urlDecode(value: string): string {\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 new Error('Illegal base64url string!');\n    }\n\n    return Base64Util.decodeUnicode(output);\n  }\n\n  /**\n   * Encode in url-base64 format\n   *\n   * @param value: plain text\n   */\n  static urlEncode(value: string): string {\n    const base64 = btoa(value);\n    return base64\n      .replace(/\\+/g, '-')\n      .replace(/\\//g, '_')\n      .replace(/=/g, '');\n  }\n}\n","import { Base64Util } from './base64.util';\n\nexport class JwtUtil {\n\n  /**\n   * Decode JWT token\n   *\n   * @param token: JWT string\n   */\n  static decodeToken<T>(token: string): T {\n    if (!token || token === '') {\n      return null;\n    }\n\n    const parts = token.split('.');\n\n    if (parts.length !== 3) {\n      throw new Error(\n        'The inspected token doesn\\'t appear to be a JWT. Check to make sure it has three parts and see https://jwt.io for more.'\n      );\n    }\n\n    const decoded = Base64Util.urlDecode(parts[1]);\n    if (!decoded) {\n      throw new Error('Cannot decode the token.');\n    }\n\n    return JSON.parse(decoded);\n  }\n\n  /**\n   * Get JWT token expiration date\n   *\n   * @param token: JWT string\n   */\n  static getTokenExpirationDate(token: string): Date | null {\n    const decoded: any = JwtUtil.decodeToken(token);\n\n    if (!decoded || !decoded.hasOwnProperty('exp')) {\n      return null;\n    }\n\n    const date = new Date(0);\n    date.setUTCSeconds(decoded.exp);\n\n    return date;\n  }\n\n  /**\n   * Return if token is expired\n   *\n   * @param token: JWT string\n   * @param offsetSeconds: offset from expiration date\n   */\n  static isTokenExpired(token: string, offsetSeconds?: number): boolean {\n    if (!token || token === '') {\n      return true;\n    }\n    const date = JwtUtil.getTokenExpirationDate(token);\n    offsetSeconds = offsetSeconds || 0;\n\n    if (date === null) {\n      return false;\n    }\n\n    return !(date.valueOf() > new Date().valueOf() + offsetSeconds * 1000);\n  }\n\n  /**\n   * Get JWT token client id\n   *\n   * @param token: JWT string\n   */\n  static getTokenClientId(token: string): string | null {\n    const decoded: any = JwtUtil.decodeToken(token);\n\n    if (!decoded || !decoded.hasOwnProperty('client_id')) {\n      return null;\n    }\n\n    return decoded.client_id;\n  }\n}\n","export class LocaleStorageUtil {\n\n  /**\n   * Stringify to JSON string value and save it to local-storage\n   *\n   * @param key as string\n   * @param value as any\n   */\n  static put<T>(key: string, value: T): void {\n    localStorage.setItem(key, JSON.stringify(value));\n  }\n\n  /**\n   * Read value from local-storage and parse it as JSON.\n   *\n   * @param key as string\n   */\n  static get<T>(key: string): T | null {\n    const item = localStorage.getItem(key);\n    if (!item) {\n      return null;\n    }\n    try {\n      return JSON.parse(item);\n    } catch (ex) {\n      console.warn(`Cannot parse ${key} as JSON`, ex);\n      return item as any;\n    }\n  }\n\n  /**\n   * Remove value from local-storage\n   *\n   * @param key as string\n   */\n  static remove(key: string): void {\n    localStorage.removeItem(key);\n  }\n}\n","export class SessionStorageUtil {\n\n  /**\n   * Stringify to JSON string value and save it to session-storage\n   *\n   * @param key as string\n   * @param value as any\n   */\n  static put<T>(key: string, value: T): void {\n    sessionStorage.setItem(key, JSON.stringify(value));\n  }\n\n  /**\n   * Read value from session-storage and parse it as JSON.\n   *\n   * @param key as string\n   */\n  static get<T>(key: string): T | null {\n    const item = sessionStorage.getItem(key);\n    if (!item) {\n      return null;\n    }\n    try {\n      return JSON.parse(item);\n    } catch (ex) {\n      console.warn(`Cannot parse ${key} as JSON`, ex);\n      return item as any;\n    }\n  }\n\n  /**\n   * Remove value from session-storage\n   *\n   * @param key as string\n   */\n  static remove(key: string): void {\n    sessionStorage.removeItem(key);\n  }\n}\n","import { Base64Util } from './base64.util';\nimport { SessionStorageUtil } from './session-storage.util';\n\nexport class NonceUtil {\n\n  static createNonce(): string {\n    const unreserved = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n    let size = 45;\n    let id = '';\n\n    const crypto = typeof self === 'undefined' ? null : (self.crypto || self['msCrypto']);\n    if (crypto) {\n      let bytes = new Uint8Array(size);\n      crypto.getRandomValues(bytes);\n      bytes = bytes.map(x => unreserved.charCodeAt(x % unreserved.length));\n      id = String.fromCharCode.apply(null, bytes);\n    } else {\n      while (0 < size--) {\n        id += unreserved[Math.random() * unreserved.length | 0];\n      }\n    }\n    return Base64Util.urlEncode(id);\n  }\n\n  static createAndSaveNonce(): string {\n    const nonce = NonceUtil.createNonce();\n    SessionStorageUtil.put('nonce', nonce);\n    return nonce;\n  }\n}\n","export class UrlUtil {\n\n  static getHashFragmentParams(customHashFragment?: string): { [param: string]: string } {\n    let hash = customHashFragment || window.location.hash;\n\n    hash = decodeURIComponent(hash);\n\n    if (hash.indexOf('#') !== 0) {\n      return {};\n    }\n\n    const questionMarkPosition = hash.indexOf('?');\n\n    if (questionMarkPosition > -1) {\n      hash = hash.substr(questionMarkPosition + 1);\n    } else {\n      hash = hash.substr(1);\n    }\n\n    return UrlUtil.parseQueryString(hash);\n  }\n\n  static parseQueryString(queryString: string): { [param: string]: string } {\n    const data = {};\n    let pairs, pair, separatorIndex, escapedKey, escapedValue, key, value;\n\n    if (queryString === null) {\n      return data;\n    }\n\n    pairs = queryString.split('&');\n\n    for (let i = 0; i < pairs.length; i++) {\n      pair = pairs[i];\n      separatorIndex = pair.indexOf('=');\n\n      if (separatorIndex === -1) {\n        escapedKey = pair;\n        escapedValue = null;\n      } else {\n        escapedKey = pair.substr(0, separatorIndex);\n        escapedValue = pair.substr(separatorIndex + 1);\n      }\n\n      key = decodeURIComponent(escapedKey);\n      value = decodeURIComponent(escapedValue);\n\n      if (key.substr(0, 1) === '/') {\n        key = key.substr(1);\n      }\n\n      data[key] = value;\n    }\n\n    return data;\n  }\n\n  static getCodePartsFromUrl(queryString: string): { [param: string]: string } {\n    if (!queryString || queryString.length === 0) {\n      return UrlUtil.getHashFragmentParams();\n    }\n\n    // normalize query string\n    if (queryString.charAt(0) === '?') {\n      queryString = queryString.substr(1);\n    }\n\n    return UrlUtil.parseQueryString(queryString);\n  }\n}\n","export class AuthTokens {\n  /**\n   * Access token value\n   */\n  accessToken: string;\n  /**\n   * Refresh token (available in password and authorization-code flow)\n   */\n  refreshToken?: string;\n}\n","import { AuthTokens } from './auth-tokens';\n\nfunction defaultMapper(tokens: any): AuthTokens {\n  tokens = tokens || {};\n  return {\n    accessToken: tokens['access_token'] || tokens['accessToken'] || null,\n    refreshToken: tokens['refresh_token'] || tokens['refreshToken'] || null\n  };\n}\n\nexport class TokensServiceOptions {\n  /**\n   * Token mapper. Default is {@link defaultMapper}\n   */\n  mapper?: (tokens: any) => AuthTokens;\n\n  constructor(opt?: TokensServiceOptions) {\n    this.mapper = opt && opt.mapper || defaultMapper;\n  }\n}\n","export enum AuthFlowType {\n  PASSWORD = 'PASSWORD',\n  IMPLICIT = 'IMPLICIT',\n  AUTHORIZATION_CODE = 'AUTHORIZATION_CODE',\n  CLIENT_CREDENTIALS = 'CLIENT_CREDENTIALS'\n}\n\nexport class AuthFlowOptions {\n  /**\n   * Flow type\n   */\n  type?: AuthFlowType;\n  /**\n   * Client ID\n   */\n  clientId?: string;\n  /**\n   * Scopes\n   */\n  scope?: string;\n  /**\n   * Resource\n   */\n  resource?: string;\n\n  constructor(type: AuthFlowType, opt?: AuthFlowOptions) {\n    this.type = type;\n    this.clientId = opt && opt.clientId || null;\n    this.scope = opt && opt.scope || null;\n    this.resource = opt && opt.resource || null;\n  }\n}\n","import { AuthFlowOptions, AuthFlowType } from '../auth-flow-options';\n\nexport class PasswordFlowOptions extends AuthFlowOptions {\n  /**\n   * Token URL for obtaining access token and refresh token\n   */\n  tokenUrl?: string;\n  /**\n   * Dummy client secret if {@link useHttpBasicAuth} is set to true\n   */\n  clientSecret?: string;\n  /**\n   * Include clientId and clientSecret as basic authorization header when fetching tokens. Default value is true.\n   */\n  useHttpBasicAuth?: boolean;\n\n  constructor(opt?: PasswordFlowOptions) {\n    super(AuthFlowType.PASSWORD, opt as AuthFlowOptions);\n    this.tokenUrl = opt && opt.tokenUrl || null;\n    this.clientSecret = opt && opt.clientSecret || null;\n    this.useHttpBasicAuth = opt && opt.useHttpBasicAuth || true;\n  }\n}\n","import { AuthFlowOptions, AuthFlowType } from '../auth-flow-options';\n\nexport class AuthorizationCodeFlowOptions extends AuthFlowOptions {\n  /**\n   * Login URL\n   */\n  loginUrl?: string;\n  /**\n   * Token URL for obtaining access token and refresh token\n   */\n  tokenUrl?: string;\n  /**\n   * Dummy client secret if {@link useHttpBasicAuth} is set to true\n   */\n  clientSecret?: string;\n  /**\n   * Include clientId and clientSecret as basic authorization header when fetching tokens. Default value is true.\n   */\n  useHttpBasicAuth?: boolean;\n  /**\n   * OAuth2 response type. Default is 'code'\n   */\n  responseType?: 'code' | string;\n  /**\n   * Prevent clear hash after login. By default we clear authorization state un URL.\n   */\n  preventClearHashAfterLogin?: boolean;\n  disablePKCE?: boolean;\n\n  constructor(opt?: AuthorizationCodeFlowOptions) {\n    super(AuthFlowType.AUTHORIZATION_CODE, opt as AuthFlowOptions);\n    this.loginUrl = opt && opt.loginUrl || null;\n    this.tokenUrl = opt && opt.tokenUrl || null;\n    this.clientSecret = opt && opt.clientSecret || null;\n    this.useHttpBasicAuth = opt && opt.useHttpBasicAuth || true;\n    this.responseType = opt && opt.responseType || 'code';\n    this.preventClearHashAfterLogin = opt && opt.preventClearHashAfterLogin || false;\n    this.disablePKCE = opt && opt.disablePKCE || null;\n  }\n}\n","import { AuthFlowOptions, AuthFlowType } from '../auth-flow-options';\n\nexport class ClientCredentialsFlowOptions extends AuthFlowOptions {\n  /**\n   * Token URL for obtaining access token and refresh token\n   */\n  tokenUrl?: string;\n  /**\n   * Dummy client secret if {@link useHttpBasicAuth} is set to true\n   */\n  clientSecret?: string;\n  /**\n   * Include clientId and clientSecret as basic authorization header when fetching tokens. Default value is true.\n   */\n  useHttpBasicAuth?: boolean;\n\n  constructor(opt?: ClientCredentialsFlowOptions) {\n    super(AuthFlowType.CLIENT_CREDENTIALS, opt as AuthFlowOptions);\n    this.tokenUrl = opt && opt.tokenUrl || null;\n    this.clientSecret = opt && opt.clientSecret || null;\n    this.useHttpBasicAuth = opt && opt.useHttpBasicAuth || true;\n  }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject, throwError } from 'rxjs';\nimport { finalize, last, map, mergeMap, take, tap } from 'rxjs/operators';\n\nimport { TokensServiceOptions } from './tokens-service-options';\nimport { SessionStorageUtil } from '../../util/session-storage.util';\nimport { LocaleStorageUtil } from '../../util/locale-storage.util';\nimport { JwtUtil } from '../../util/jwt.util';\nimport { AuthFlowType } from '../auth-flow-options';\nimport { ClientCredentialsFlowOptions } from '../client-credentials-flow/client-credentials-flow-options';\nimport { PasswordFlowOptions } from '../password-flow/password-flow-options';\nimport { AuthorizationCodeFlowOptions } from '../authorization-code-flow/authorization-code-flow-options';\nimport { AuthTokens } from './auth-tokens';\n\n@Injectable()\nexport class TokensService implements OnDestroy {\n\n  private static ACCESS_TOKEN_KEY = 'access_token';\n  private static REFRESH_TOKEN_KEY = 'refresh_token';\n\n  private accessToken: BehaviorSubject<string> = new BehaviorSubject(SessionStorageUtil.get(TokensService.ACCESS_TOKEN_KEY));\n  private refreshToken: BehaviorSubject<string> = new BehaviorSubject(LocaleStorageUtil.get(TokensService.REFRESH_TOKEN_KEY));\n  private accessTokenPending: Subject<void> = null;\n\n  accessToken$: Observable<string> = this.accessToken.asObservable();\n  refreshToken$: Observable<string> = this.refreshToken.asObservable();\n\n  constructor(private http: HttpClient, private options: TokensServiceOptions, private passwordFlowOptions: PasswordFlowOptions,\n              private authorizationCodeFlowOptions: AuthorizationCodeFlowOptions,\n              private clientCredentialsFlowOptions: ClientCredentialsFlowOptions) {\n  }\n\n  /**\n   * Clean up\n   * @ignore\n   */\n  ngOnDestroy(): void {\n    if (this.accessTokenPending) {\n      this.accessTokenPending.complete();\n    }\n    this.accessToken.complete();\n    this.refreshToken.complete();\n  }\n\n  /**\n   * Save access token to session storage and update current access token state.\n   *\n   * @param token: access token\n   */\n  setAccessToken(token: string): void {\n    SessionStorageUtil.put(TokensService.ACCESS_TOKEN_KEY, token);\n    this.accessToken.next(token);\n  }\n\n  /**\n   * Save refresh token to local storage and update current refresh token state.\n   *\n   * @param token: refresh token\n   */\n  setRefreshToken(token: string): void {\n    LocaleStorageUtil.put(TokensService.REFRESH_TOKEN_KEY, token);\n    this.refreshToken.next(token);\n  }\n\n  /**\n   * Save access token and refresh token with {@link setAccessToken} and {@link setRefreshToken}.\n   *\n   * @param accessToken\n   * @param refreshToken\n   */\n  setTokens(accessToken: string, refreshToken: string): void {\n    this.setAccessToken(accessToken);\n    this.setRefreshToken(refreshToken);\n  }\n\n  /**\n   * Get current access token.\n   */\n  getAccessToken(): string {\n    return this.accessToken.getValue();\n  }\n\n  /**\n   * Get current refresh token.\n   */\n  getRefreshToken(): string {\n    return this.refreshToken.getValue();\n  }\n\n  /**\n   * Return authentication flow type of current access token\n   */\n  getAuthenticationFlowType(token: string = this.getAccessToken()): AuthFlowType | null {\n    const clientId: string = JwtUtil.getTokenClientId(token);\n    if (!clientId) {\n      return null;\n    }\n    if (this.passwordFlowOptions.clientId === clientId) {\n      return AuthFlowType.PASSWORD;\n    } else if (this.authorizationCodeFlowOptions.clientId === clientId) {\n      return AuthFlowType.AUTHORIZATION_CODE;\n    } else if (this.clientCredentialsFlowOptions.clientId === clientId) {\n      return AuthFlowType.CLIENT_CREDENTIALS;\n    }\n    return null;\n  }\n\n  /**\n   * Return true if current access token exists and it is not expired yet.\n   *\n   * @param offsetSeconds: offset from expiration date\n   */\n  hasValidAccessToken(offsetSeconds?: number): boolean {\n    const token = this.getAccessToken();\n    return token && !JwtUtil.isTokenExpired(token, offsetSeconds);\n  }\n\n  /**\n   * Return true if current refresh token exists and it is not expired yet.\n   *\n   * @param offsetSeconds: offset from expiration date\n   */\n  hasValidRefreshToken(offsetSeconds?: number): boolean {\n    const token = this.getRefreshToken();\n    return token && !JwtUtil.isTokenExpired(token, offsetSeconds);\n  }\n\n  /**\n   * Return a valid access token or raise exception if token cannot be obtained. If access token is expired and a valid refresh token exists\n   * we will fetch new access token.\n   */\n  getValidAccessToken(): Observable<string> {\n    if (this.accessTokenPending && !this.accessTokenPending.isStopped) {\n      return this.accessTokenPending.pipe(last(), mergeMap(() => this.accessToken$.pipe(take(1))));\n    }\n\n    this.accessTokenPending = new Subject();\n\n    return combineLatest([this.accessToken$, this.refreshToken$]).pipe(\n      mergeMap(([accessToken, refreshToken]) => {\n        if (!accessToken && !refreshToken) {\n          return throwError({message: 'Authentication token is missing'});\n        }\n        if (accessToken) {\n          if (JwtUtil.isTokenExpired(accessToken)) {\n\n            if (this.getAuthenticationFlowType(accessToken) === AuthFlowType.CLIENT_CREDENTIALS) {\n              return this.authenticateWithClientCredentials().pipe(map(tokens => tokens.accessToken));\n            }\n\n            if (!refreshToken) {\n              return throwError({message: 'Access token expired', details: 'No refresh token to obtain new access token'});\n            }\n\n            if (JwtUtil.isTokenExpired(refreshToken)) {\n              return throwError({message: 'Refresh token expired', details: 'Cannot obtain new access token'});\n            }\n\n            // obtain new access token\n            return this.authenticateWithRefreshToken(refreshToken).pipe(map(tokens => tokens.accessToken));\n          }\n          return of(accessToken);\n        }\n\n        if (JwtUtil.isTokenExpired(refreshToken)) {\n          return throwError({message: 'Access token is missing', details: 'Refresh token expired - cannot obtain new access token'});\n        } else {\n          // obtain new access token\n          return this.authenticateWithRefreshToken(refreshToken).pipe(map(tokens => tokens.accessToken));\n        }\n      }),\n      take(1),\n      finalize(() => {\n        this.accessTokenPending.next();\n        this.accessTokenPending.complete();\n      })\n    );\n  }\n\n  /**\n   * Authenticate via password oAuth2 flow.\n   *\n   * @param username: subject identifier\n   * @param password: subject credentials\n   * @param params: additional parameters\n   * @param headers: additional headers\n   */\n  authenticateWithPassword(username: string, password: string, params: HttpParams = new HttpParams(),\n                           headers: HttpHeaders = new HttpHeaders()): Observable<AuthTokens> {\n    params = (params || new HttpParams())\n      .set('username', username)\n      .set('password', password)\n      .set('grant_type', 'password');\n\n    headers = (headers || new HttpHeaders())\n      .set('Content-Type', 'application/x-www-form-urlencoded');\n\n    if (this.passwordFlowOptions.useHttpBasicAuth) {\n      headers = headers\n        .set('Authorization', `Basic ${btoa(`${this.passwordFlowOptions.clientId}:${this.passwordFlowOptions.clientSecret}`)}`);\n    }\n\n    return this.http.post<any>(this.passwordFlowOptions.tokenUrl, params, {headers: headers}).pipe(\n      map(tokens => this.transform(tokens)),\n      tap(token => this.setTokens(token.accessToken || null, token.refreshToken || null))\n    );\n  }\n\n  /**\n   * Refresh access token via refresh_token oAuth2 grant type.\n   *\n   * @param refreshToken: a valid refresh token\n   * @param params: additional parameters\n   * @param headers: additional parameters\n   */\n  authenticateWithRefreshToken(refreshToken: string, params: HttpParams = new HttpParams(),\n                               headers: HttpHeaders = new HttpHeaders()): Observable<AuthTokens> {\n    if (!refreshToken) {\n      return throwError({message: 'Refresh token must not be empty'});\n    }\n\n    params = (params || new HttpParams())\n      .set('grant_type', 'refresh_token')\n      .set('refresh_token', refreshToken);\n\n    headers = (headers || new HttpHeaders())\n      .set('Content-Type', 'application/x-www-form-urlencoded');\n\n    let tokenUrl: string = null;\n    let clientId: string = null;\n    let clientSecret: string = null;\n    let useHttpBasicAuth: boolean = null;\n    switch (this.getAuthenticationFlowType(refreshToken)) {\n      case AuthFlowType.PASSWORD:\n        tokenUrl = this.passwordFlowOptions.tokenUrl;\n        clientId = this.passwordFlowOptions.clientId;\n        clientSecret = this.passwordFlowOptions.clientSecret;\n        useHttpBasicAuth = this.passwordFlowOptions.useHttpBasicAuth;\n        break;\n      case AuthFlowType.AUTHORIZATION_CODE:\n        tokenUrl = this.authorizationCodeFlowOptions.tokenUrl;\n        clientId = this.authorizationCodeFlowOptions.clientId;\n        clientSecret = this.authorizationCodeFlowOptions.clientSecret;\n        useHttpBasicAuth = this.authorizationCodeFlowOptions.useHttpBasicAuth;\n        break;\n      case AuthFlowType.CLIENT_CREDENTIALS:\n        tokenUrl = this.clientCredentialsFlowOptions.tokenUrl;\n        clientId = this.clientCredentialsFlowOptions.clientId;\n        clientSecret = this.clientCredentialsFlowOptions.clientSecret;\n        useHttpBasicAuth = this.clientCredentialsFlowOptions.useHttpBasicAuth;\n        break;\n      default:\n        return throwError({message: 'Refresh token authentication is not supported'});\n    }\n\n    if (!tokenUrl) {\n      return throwError({message: 'Refresh token not supported'});\n    }\n\n    if (clientSecret && useHttpBasicAuth) {\n      headers = headers.set('Authorization', `Basic ${btoa(`${clientId}:${clientSecret}`)}`);\n    }\n\n    return this.http.post<any>(tokenUrl, params, {headers}).pipe(\n      map(tokens => this.transform(tokens)),\n      tap(token => this.setTokens(token.accessToken || null, token.refreshToken || null))\n    );\n  }\n\n  /**\n   * Fetch access token and refresh token via authorization_code oAuth2 grant type.\n   *\n   * @param code: a valid code form authorization code flow redirection\n   * @param params: additional parameters\n   * @param headers: additional parameters\n   */\n  authenticateWithAuthorizationCode(code: string, params: HttpParams = new HttpParams(),\n                                    headers: HttpHeaders = new HttpHeaders()): Observable<AuthTokens> {\n    params = (params || new HttpParams())\n      .set('grant_type', 'authorization_code')\n      .set('code', code);\n\n    headers = (headers || new HttpHeaders())\n      .set('Content-Type', 'application/x-www-form-urlencoded');\n\n    if (this.authorizationCodeFlowOptions.useHttpBasicAuth) {\n      headers = headers.set('Authorization', `Basic ${btoa(`${this.authorizationCodeFlowOptions.clientId}:${this.authorizationCodeFlowOptions.clientSecret}`)}`);\n    } else {\n      params = params.set('client_id', this.authorizationCodeFlowOptions.clientId);\n\n      if (this.authorizationCodeFlowOptions.clientSecret) {\n        params = params.set('client_secret', this.authorizationCodeFlowOptions.clientSecret);\n      }\n    }\n\n    return this.http.post<any>(this.authorizationCodeFlowOptions.tokenUrl, params, {headers}).pipe(\n      map(tokens => this.transform(tokens)),\n      tap(token => this.setTokens(token.accessToken || null, token.refreshToken || null))\n    );\n  }\n\n  /**\n   * Authenticate via client credentials oAuth2 flow.\n   *\n   * @param params: additional parameters\n   * @param headers: additional headers\n   */\n  authenticateWithClientCredentials(params: HttpParams = new HttpParams(),\n                                    headers: HttpHeaders = new HttpHeaders()): Observable<AuthTokens> {\n    params = (params || new HttpParams())\n      .set('grant_type', 'client_credentials');\n\n    headers = (headers || new HttpHeaders())\n      .set('Content-Type', 'application/x-www-form-urlencoded');\n\n    if (this.clientCredentialsFlowOptions.useHttpBasicAuth) {\n      headers = headers\n        .set('Authorization', `Basic ${btoa(`${this.clientCredentialsFlowOptions.clientId}:${this.clientCredentialsFlowOptions.clientSecret}`)}`);\n    }\n    return this.http.post<any>(this.clientCredentialsFlowOptions.tokenUrl, params, {headers: headers}).pipe(\n      map(tokens => this.transform(tokens)),\n      tap(token => this.setTokens(token.accessToken || null, token.refreshToken || null))\n    );\n  }\n\n  /**\n   * Clear token state. Remove from session-storage and local-storage too.\n   */\n  clear(): void {\n    this.accessToken.next(null);\n    SessionStorageUtil.remove(TokensService.ACCESS_TOKEN_KEY);\n    this.refreshToken.next(null);\n    LocaleStorageUtil.remove(TokensService.REFRESH_TOKEN_KEY);\n  }\n\n  /**\n   * Transform tokens {@link TokensServiceOptions.mapper}\n   * @param tokens\n   * @ignore\n   */\n  private transform(tokens: any): AuthTokens {\n    return this.options.mapper(tokens);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nimport { TokensService } from '../tokens/tokens.service';\nimport { AuthTokens } from '../tokens/auth-tokens';\n\n@Injectable()\nexport class PasswordFlowService {\n\n  constructor(private tokens: TokensService) {\n  }\n\n  /**\n   * Authenticate via password oAuth2 flow.\n   *\n   * @param username: subject identifier\n   * @param password: subject credentials\n   * @param params: additional parameters\n   * @param headers: additional headers\n   */\n  authenticate(username: string, password: string, params: HttpParams = new HttpParams(),\n               headers: HttpHeaders = new HttpHeaders()): Observable<AuthTokens> {\n    return this.tokens.authenticateWithPassword(username, password, params, headers);\n  }\n\n  /**\n   * Clear authentication state. See {@link TokensService.clear}\n   */\n  clear(): void {\n    this.tokens.clear();\n  }\n}\n","import { AuthFlowOptions, AuthFlowType } from '../auth-flow-options';\n\nexport class ImplicitFlowOptions extends AuthFlowOptions {\n  /**\n   * Login URL\n   */\n  loginUrl?: string;\n  /**\n   * OAuth2 response type. Default is 'token'\n   */\n  responseType?: 'token' | 'id_token' | string;\n  /**\n   * Prevent clear hash after login. By default we clear authorization state un URL.\n   */\n  preventClearHashAfterLogin?: boolean;\n\n  constructor(opt?: ImplicitFlowOptions) {\n    super(AuthFlowType.IMPLICIT, opt as AuthFlowOptions);\n    this.loginUrl = opt && opt.loginUrl || null;\n    this.responseType = opt && opt.responseType || 'token';\n    this.preventClearHashAfterLogin = opt && opt.preventClearHashAfterLogin || false;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nimport { TokensService } from '../tokens/tokens.service';\nimport { ImplicitFlowOptions } from './implicit-flow-options';\nimport { UrlUtil } from '../../util/url.util';\nimport { SessionStorageUtil } from '../../util/session-storage.util';\nimport { NonceUtil } from '../../util/nonce.util';\n\n@Injectable()\nexport class ImplicitFlowService {\n\n  constructor(private tokens: TokensService, private  options: ImplicitFlowOptions) {\n  }\n\n  /**\n   * Check if current URL contains user authorization attributes and save it to session storage.\n   *\n   * @param authenticateAutomatically: redirect user to login url if user is unauthorized\n   */\n  initialize(authenticateAutomatically: boolean = false): Observable<{ message: string }> {\n    return new Observable(observer => {\n      if (this.tokens.hasValidAccessToken()) {\n        observer.next({message: 'Access token is still valid'});\n        observer.complete();\n        return;\n      }\n\n      const {access_token, state, error} = UrlUtil.getHashFragmentParams();\n\n      if (error) {\n        observer.error({message: error});\n        return;\n      }\n\n      if (!access_token && !state && authenticateAutomatically) {\n        observer.next({message: 'No access token and authenticate automatically is set to true - you will be redirected'});\n        observer.complete();\n        this.authenticate();\n        return;\n      }\n\n      if (!access_token) {\n        observer.error({message: 'No access token in URL'});\n        return;\n      }\n\n      if (!state) {\n        observer.error({message: 'Nonce is missing'});\n        return;\n      }\n\n      if (state !== SessionStorageUtil.get<string>('nonce')) {\n        observer.error({message: 'Nonce is not valid'});\n        return;\n      }\n\n      this.tokens.setAccessToken(access_token);\n\n      observer.next({message: 'Access token saved'});\n      observer.complete();\n\n      if (!this.options.preventClearHashAfterLogin) {\n        location.hash = '';\n      }\n    });\n  }\n\n  /**\n   * Generate login URL and redirect to it.\n   *\n   * @param redirectUri: redirect URI for returning after authentication\n   * @param noPrompt: oAuth2 attribute during authentication process\n   * @param params: additional params\n   */\n  authenticate(redirectUri: string = document.location.href, noPrompt: boolean = false, params: HttpParams = new HttpParams()): void {\n    document.location.href = this.loginUrl(redirectUri, noPrompt, params);\n  }\n\n  /**\n   * Generate login URL\n   *\n   * @param redirectUri: redirect URI for returning after authentication\n   * @param noPrompt: oAuth2 attribute during authentication process\n   * @param params: additional params\n   */\n  loginUrl(redirectUri: string, noPrompt: boolean = false, params: HttpParams = new HttpParams()): string {\n    const nonce = NonceUtil.createAndSaveNonce();\n\n    params = (params || new HttpParams())\n      .set('client_id', this.options.clientId)\n      .set('state', nonce)\n      .set('response_type', this.options.responseType)\n      .set('redirect_uri', redirectUri);\n\n    if (this.options.scope) {\n      params = params.set('scope', this.options.scope);\n    }\n\n    if (this.options.resource) {\n      params = params.set('resource', this.options.resource);\n    }\n    if (noPrompt) {\n      params = params.set('prompt', 'none');\n    }\n\n    return `${this.options.loginUrl}?${params.toString()}`;\n  }\n\n  /**\n   * Clear authentication state. See {@link TokensService.clear}\n   */\n  clear(): void {\n    this.tokens.clear();\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nimport { TokensService } from '../tokens/tokens.service';\nimport { AuthorizationCodeFlowOptions } from './authorization-code-flow-options';\nimport { AuthTokens } from '../tokens/auth-tokens';\nimport { UrlUtil } from '../../util/url.util';\nimport { SessionStorageUtil } from '../../util/session-storage.util';\nimport { NonceUtil } from '../../util/nonce.util';\n\n@Injectable()\nexport class AuthorizationCodeFlowService {\n\n  constructor(private tokens: TokensService, private options: AuthorizationCodeFlowOptions) {\n  }\n\n  /**\n   * Check if current URL contains user partial authorization attributes and fetch tokens.\n   *\n   * @param authenticateAutomatically: redirect user to login url if user is unauthorized\n   */\n  initialize(authenticateAutomatically: boolean = false): Observable<{ message: string }> {\n    return new Observable(observer => {\n      if (this.tokens.hasValidAccessToken()) {\n        observer.next({message: 'Access is still valid'});\n        observer.complete();\n        return;\n      }\n\n      const {code, state, error} = UrlUtil.getCodePartsFromUrl(window.location.search);\n\n      if (!this.options.preventClearHashAfterLogin) {\n        const href = location.href\n          .replace(/[&?]code=[^&$]*/, '')\n          .replace(/[&?]scope=[^&$]*/, '')\n          .replace(/[&?]state=[^&$]*/, '')\n          .replace(/[&?]session_state=[^&$]*/, '');\n\n        history.replaceState(null, window.name, href);\n      }\n\n      if (error) {\n        observer.error({message: error});\n        return;\n      }\n\n      if (!code && !state && authenticateAutomatically) {\n        observer.next({message: 'No code and authenticate automatically is set to true - you will be redirected'});\n        observer.complete();\n        this.authenticate();\n        return;\n      }\n\n      if (!state) {\n        observer.error({message: 'Nonce is missing'});\n        return;\n      }\n\n      if (state !== SessionStorageUtil.get('nonce')) {\n        observer.error({message: 'Nonce is not valid'});\n        return;\n      }\n\n      if (!code) {\n        observer.error({message: 'Code is missing'});\n        return;\n      }\n\n      this.getTokenFromCode(code).subscribe(() => {\n        observer.next({message: 'Tokens  saved'});\n        observer.complete();\n      }, observer.error);\n    });\n  }\n\n  /**\n   * Generate login URL and redirect to it.\n   *\n   * @param redirectUri: redirect URI for returning after authentication\n   * @param noPrompt: oAuth2 attribute during authentication process\n   * @param params: additional params\n   */\n  authenticate(redirectUri: string = document.location.href, noPrompt: boolean = false, params: HttpParams = new HttpParams()): void {\n    document.location.href = this.loginUrl(redirectUri, noPrompt, params);\n  }\n\n  /**\n   * Generate login URL\n   *\n   * @param redirectUri: redirect URI for returning after authentication\n   * @param noPrompt: oAuth2 attribute during authentication process\n   * @param params: additional params\n   */\n  loginUrl(redirectUri: string, noPrompt: boolean = false, params: HttpParams = new HttpParams()): string {\n    const nonce = NonceUtil.createAndSaveNonce();\n\n    params = (params || new HttpParams())\n      .set('client_id', this.options.clientId)\n      .set('state', nonce)\n      .set('response_type', this.options.responseType)\n      .set('redirect_uri', redirectUri);\n\n    if (this.options.scope) {\n      params = params.set('scope', this.options.scope);\n    }\n\n    if (this.options.resource) {\n      params = params.set('resource', this.options.resource);\n    }\n    if (noPrompt) {\n      params = params.set('prompt', 'none');\n    }\n\n    return `${this.options.loginUrl}?${params.toString()}`;\n  }\n\n  /**\n   * Clear authentication state. See {@link TokensService.clear}\n   */\n  clear(): void {\n    this.tokens.clear();\n  }\n\n  private getTokenFromCode(code: string): Observable<AuthTokens> {\n    let params = new HttpParams();\n\n    if (!this.options.disablePKCE) {\n      const pkciVerifier = SessionStorageUtil.get<string>('PKCI_verifier');\n\n      if (!pkciVerifier) {\n        console.warn('No PKCI verifier found in storage!');\n      } else {\n        params = params.set('code_verifier', pkciVerifier);\n      }\n    }\n\n    return this.tokens.authenticateWithAuthorizationCode(code, params);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nimport { TokensService } from '../tokens/tokens.service';\nimport { AuthTokens } from '../tokens/auth-tokens';\n\n@Injectable()\nexport class ClientCredentialsFlowService {\n\n  constructor(private tokens: TokensService) {\n  }\n\n  /**\n   * Authenticate via client credentials oAuth2 flow.\n   *\n   * @param params: additional parameters\n   * @param headers: additional headers\n   */\n  authenticate(params: HttpParams = new HttpParams(), headers: HttpHeaders = new HttpHeaders()): Observable<AuthTokens> {\n    return this.tokens.authenticateWithClientCredentials(params, headers);\n  }\n\n  /**\n   * Clear authentication state. See {@link TokensService.clear}\n   */\n  clear(): void {\n    this.tokens.clear();\n  }\n}\n","import { Subject, SubjectDetails } from '@ngx-security/core';\n\nfunction defaultMapper<D extends SubjectDetails, S extends Subject<D>>(jwt: any): S {\n  jwt = jwt || {};\n  return {\n    principal: jwt['user_name'] || jwt['username'] || jwt['email'] || null,\n    authorities: jwt['authorities'] || [],\n    details: jwt\n  } as S;\n}\n\nexport class AuthSubjectServiceOptions<D extends SubjectDetails, S extends Subject<D>> {\n  /**\n   * Subject mapper. Default is {@link defaultMapper}\n   */\n  mapper?: (jwt: any) => S;\n\n  constructor(opt?: AuthSubjectServiceOptions<D, S>) {\n    this.mapper = opt && opt.mapper || defaultMapper;\n  }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { Subject, SubjectDetails, SubjectService } from '@ngx-security/core';\nimport { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';\nimport { filter, map, pairwise, take } from 'rxjs/operators';\n\nimport { TokensService } from '../tokens/tokens.service';\nimport { AuthSubjectServiceOptions } from './auth-subject-service-options';\nimport { JwtUtil } from '../../util/jwt.util';\nimport { AuthFlowType } from '../auth-flow-options';\n\n@Injectable()\nexport class AuthSubjectService<D extends SubjectDetails, S extends Subject<D>> extends SubjectService<D, S> implements OnDestroy {\n\n  private readonly sub: Subscription;\n\n  private subject: BehaviorSubject<S> = new BehaviorSubject(null);\n\n  subject$: Observable<S> = this.subject.asObservable();\n  principal$: Observable<string> = this.subject$.pipe(map(subject => subject && subject.principal || null));\n  authorities$: Observable<string[]> = this.subject$.pipe(map(subject => subject && subject.authorities || []));\n  details$: Observable<D | null> = this.subject$.pipe(map(subject => subject && subject.details || null));\n  displayName$: Observable<string | null> = this.details$.pipe(map(details => details && details.displayName || null));\n  isAuthorized$: Observable<boolean> = this.authorities$.pipe(map(authorities => authorities.length > 0));\n\n  changes$: Observable<S> = this.subject$.pipe(\n    pairwise(),\n    filter((pair: S[]) => pair[0] !== pair[1] && (pair[0] && pair[0].principal || null) !== (pair[1] && pair[1].principal || null)),\n    map((pair: S[]) => pair[1])\n  );\n\n  constructor(private tokensService: TokensService, private options: AuthSubjectServiceOptions<D, S>) {\n    super();\n    this.sub = this.tokensService.accessToken$.subscribe(accessToken => {\n      this.decode(accessToken);\n    });\n  }\n\n  /**\n   * Clean up\n   * @ignore\n   */\n  ngOnDestroy(): void {\n    this.sub.unsubscribe();\n    this.subject.complete();\n  }\n\n  protected setSubject(subject: S | null) {\n    this.subject.next(subject);\n  }\n\n  /**\n   * Return subject\n   */\n  getSubject(): S {\n    return this.subject.getValue();\n  }\n\n  /**\n   * Return subject authorities\n   */\n  getAuthorities(): string[] {\n    const subject = this.subject.getValue();\n    return subject && subject.authorities || [];\n  }\n\n  /**\n   * Update user details\n   *\n   * @param details\n   */\n  updateDetails(details: D): void {\n    const subject = this.getSubject();\n    if (!subject) {\n      return;\n    }\n    this.subject.next({...subject, ...{details}});\n  }\n\n  /**\n   * Check if user is authenticated. Has valid access token or chance to obtain new\n   */\n  isAuthenticated(): Observable<boolean> {\n    return combineLatest([this.tokensService.accessToken$, this.tokensService.refreshToken$]).pipe(\n      take(1),\n      map(([accessToken, refreshToken]) => {\n        if (!accessToken && !refreshToken) {\n          return false;\n        }\n        if (accessToken) {\n          if (this.tokensService.getAuthenticationFlowType(accessToken) === AuthFlowType.CLIENT_CREDENTIALS) {\n            return true;\n          }\n          if (JwtUtil.isTokenExpired(accessToken)) {\n            return refreshToken && !JwtUtil.isTokenExpired(refreshToken);\n          }\n          return true;\n        }\n        return !JwtUtil.isTokenExpired(refreshToken);\n      })\n    );\n  }\n\n  /**\n   * Clear subject\n   */\n  clear(): void {\n    this.subject.next(null);\n  }\n\n  /**\n   * Decode access token to JWT and convert to subject object via {@link AuthSubjectServiceOptions.mapper}\n   * @ignore\n   */\n  private decode(accessToken: string): void {\n    const jwt = JwtUtil.decodeToken(accessToken);\n    this.setSubject(this.options.mapper(jwt));\n  }\n}\n","export class AuthHttpInterceptorOptions {\n  /**\n   * Whitelisted URLs where access token will be added as authorization header. By default none URL is whitelisted.\n   * Examples:\n   * 1. [new RegExp(\".&ast;/my-api.&ast;\")]\n   * 2. [\"https://example.com/my-auth-api/users/me\"]\n   */\n  whitelistedUrls?: (RegExp | string)[];\n\n  constructor(opt?: AuthHttpInterceptorOptions) {\n    this.whitelistedUrls = opt && opt.whitelistedUrls || [];\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { mergeMap } from 'rxjs/operators';\n\nimport { TokensService } from '../service/tokens/tokens.service';\nimport { AuthHttpInterceptorOptions } from './auth-http-interceptor-options';\n\n@Injectable()\nexport class AuthHttpInterceptor implements HttpInterceptor {\n\n  constructor(private tokens: TokensService, protected options: AuthHttpInterceptorOptions = new AuthHttpInterceptorOptions()) {\n  }\n\n  /**\n   * Intercept all requests and append Authorization header with access token if requested url is in whitelisted URLs. See\n   * {@link isWhitelistedUrl}\n   */\n  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    if (!this.isWhitelistedUrl(request)) {\n      return next.handle(request);\n    }\n    return this.tokens.getValidAccessToken().pipe(\n      mergeMap(accessToken => next.handle(request.clone({\n        setHeaders: {'Authorization': `Bearer ${accessToken}`}\n      })))\n    );\n  }\n\n  /**\n   * Check if requested url is whitelisted. Whitelisted URLs can be passed via {@link AuthHttpInterceptorOptions.whitelistedUrls}\n   */\n  private isWhitelistedUrl(request: HttpRequest<any>): boolean {\n    const url = request.url;\n    return this.options.whitelistedUrls\n      .findIndex(d => typeof d === 'string' ? d === url : d instanceof RegExp ? d.test(url) : false) > -1;\n  }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http';\nimport { Subject, SubjectDetails, SubjectService } from '@ngx-security/core';\n\nimport { AuthHttpInterceptor } from './interceptor/auth-http.interceptor';\nimport { TokensService } from './service/tokens/tokens.service';\nimport { AuthHttpInterceptorOptions } from './interceptor/auth-http-interceptor-options';\nimport { TokensServiceOptions } from './service/tokens/tokens-service-options';\nimport { PasswordFlowOptions } from './service/password-flow/password-flow-options';\nimport { ImplicitFlowOptions } from './service/implicit-flow/implicit-flow-options';\nimport { AuthorizationCodeFlowOptions } from './service/authorization-code-flow/authorization-code-flow-options';\nimport { ClientCredentialsFlowOptions } from './service/client-credentials-flow/client-credentials-flow-options';\nimport { AuthSubjectService } from './service/subject/auth-subject.service';\nimport { AuthSubjectServiceOptions } from './service/subject/auth-subject-service-options';\nimport { PasswordFlowService } from './service/password-flow/password-flow.service';\nimport { ImplicitFlowService } from './service/implicit-flow/implicit-flow.service';\nimport { AuthorizationCodeFlowService } from './service/authorization-code-flow/authorization-code-flow.service';\nimport { ClientCredentialsFlowService } from './service/client-credentials-flow/client-credentials-flow.service';\n\nexport interface SecurityAuthModuleConfig<D extends SubjectDetails, S extends Subject<D>> {\n  tokens?: TokensServiceOptions;\n  passwordFlow?: PasswordFlowOptions;\n  implicitFlow?: ImplicitFlowOptions;\n  authorizationCodeFlow?: AuthorizationCodeFlowOptions;\n  clientCredentialsFlow?: ClientCredentialsFlowOptions;\n  subject?: AuthSubjectServiceOptions<D, S>;\n  interceptor?: AuthHttpInterceptorOptions;\n}\n\nexport function tokensFactory(options: TokensServiceOptions, passwordFlowOptions: PasswordFlowOptions,\n                              authorizationCodeFlowOptions: AuthorizationCodeFlowOptions,\n                              clientCredentialsFlowOptions: ClientCredentialsFlowOptions): (http: HttpClient) => TokensService {\n  return (http: HttpClient) =>\n    new TokensService(http, new TokensServiceOptions(options), new PasswordFlowOptions(passwordFlowOptions),\n      new AuthorizationCodeFlowOptions(authorizationCodeFlowOptions), new ClientCredentialsFlowOptions(clientCredentialsFlowOptions));\n}\n\nexport function passwordFlowFactory(): (tokens: TokensService) => PasswordFlowService {\n  return (tokens: TokensService) => new PasswordFlowService(tokens);\n}\n\nexport function implicitFlowFactory(options: ImplicitFlowOptions): (tokens: TokensService) => ImplicitFlowService {\n  return (tokens: TokensService) => new ImplicitFlowService(tokens, new ImplicitFlowOptions(options));\n}\n\nexport function authorizationCodeFlowFactory(options: AuthorizationCodeFlowOptions): (tokens: TokensService) =>\n  AuthorizationCodeFlowService {\n  return (tokens: TokensService) =>\n    new AuthorizationCodeFlowService(tokens, new AuthorizationCodeFlowOptions(options));\n}\n\nexport function clientCredentialsFlowFactory(): (tokens: TokensService) => ClientCredentialsFlowService {\n  return (tokens: TokensService) => new ClientCredentialsFlowService(tokens);\n}\n\nexport function authSubjectFactory<D extends SubjectDetails, S extends Subject<D>>(options: AuthSubjectServiceOptions<D, S>)\n  : (tokens: TokensService) => AuthSubjectService<D, S> {\n  return (tokens: TokensService) => new AuthSubjectService(tokens, new AuthSubjectServiceOptions(options));\n}\n\nexport function interceptorFactory(options: AuthHttpInterceptorOptions): (tokens: TokensService) => AuthHttpInterceptor {\n  return (tokens: TokensService) => new AuthHttpInterceptor(tokens, new AuthHttpInterceptorOptions(options));\n}\n\nexport function provideSecurityAuth<D extends SubjectDetails, S extends Subject<D>>(config: SecurityAuthModuleConfig<D, S> = {}): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: TokensService,\n      useFactory: tokensFactory(config.tokens, config.passwordFlow, config.authorizationCodeFlow, config.clientCredentialsFlow),\n      deps: [HttpClient]\n    },\n    {\n      provide: PasswordFlowService,\n      useFactory: passwordFlowFactory(),\n      deps: [TokensService]\n    },\n    {\n      provide: ImplicitFlowService,\n      useFactory: implicitFlowFactory(config.implicitFlow),\n      deps: [TokensService]\n    },\n    {\n      provide: AuthorizationCodeFlowService,\n      useFactory: authorizationCodeFlowFactory(config.authorizationCodeFlow),\n      deps: [TokensService]\n    },\n    {\n      provide: ClientCredentialsFlowService,\n      useFactory: clientCredentialsFlowFactory(),\n      deps: [TokensService]\n    },\n    {\n      provide: SubjectService,\n      useFactory: authSubjectFactory(config.subject),\n      deps: [TokensService]\n    },\n    {\n      provide: HTTP_INTERCEPTORS,\n      useFactory: interceptorFactory(config.interceptor),\n      deps: [TokensService],\n      multi: true\n    }\n  ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["defaultMapper","i2.TokensServiceOptions","i3.PasswordFlowOptions","i4.AuthorizationCodeFlowOptions","i5.ClientCredentialsFlowOptions","i1.TokensService","i2.ImplicitFlowOptions","i2.AuthorizationCodeFlowOptions","i2.AuthSubjectServiceOptions","i2.AuthHttpInterceptorOptions"],"mappings":"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"}