{"version":3,"sources":["jsdelivr-header.js","/libs/angular-swa-auth/src/lib/identity-provider.ts","/libs/angular-swa-auth/src/lib/auth-config.ts","/libs/angular-swa-auth/src/lib/auth-event.ts","/node_modules/tslib/tslib.es6.js","/libs/angular-swa-auth/src/lib/client-principal.ts","/libs/angular-swa-auth/src/lib/has-some-allowed-roles.ts","/libs/angular-swa-auth/src/lib/storage.service.ts","/libs/angular-swa-auth/src/lib/first-identity-provider-selector.service.ts","/libs/angular-swa-auth/src/lib/identity-provider-selector.service.ts","/libs/angular-swa-auth/src/lib/auth.service.ts","/libs/angular-swa-auth/src/lib/auth-event-persistence.service.ts","/libs/angular-swa-auth/src/lib/auth-event-initializer.provider.ts","/libs/angular-swa-auth/src/lib/auto-login-http-interceptor.service.ts","/libs/angular-swa-auth/src/lib/swa-roles-check.directive.ts","/libs/angular-swa-auth/src/lib/swa-auth.module.ts","/libs/angular-swa-auth/src/lib/auth.guard.ts","/libs/angular-swa-auth/src/lib/swa-role.guard.ts","/libs/angular-swa-auth/src/lib/identity-provider-interactive-selector.service.ts"],"names":[],"mappings":"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","file":"/npm/@christianacca/angular-swa-auth@2.2.0/bundles/christianacca-angular-swa-auth.umd.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.19.2.\n * Original file: /npm/@christianacca/angular-swa-auth@2.2.0/bundles/christianacca-angular-swa-auth.umd.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export type ManagedIdentityProvider = 'aad' | 'facebook' | 'github' | 'google' | 'twitter';\n\nexport interface IdentityProviderInfo<T extends ManagedIdentityProvider | string = string> {\n  id: T;\n  name: string;\n}\n\n/**\n * Identity Providers managed by Azure Static Web Apps service\n */\nexport const managedIdentityProviders: Record<\n  ManagedIdentityProvider,\n  IdentityProviderInfo<ManagedIdentityProvider>\n> = {\n  github: { id: 'github', name: 'GitHub' },\n  google: { id: 'google', name: 'Google' },\n  twitter: { id: 'twitter', name: 'Twitter' },\n  aad: { id: 'aad', name: 'Azure AD' },\n  facebook: { id: 'facebook', name: 'Facebook' }\n};\n","import { Injectable, Type } from '@angular/core';\nimport { IdentityProviderInfo, managedIdentityProviders } from './identity-provider';\nimport { IdentityProviderSelectorService } from './identity-provider-selector.service';\n\n/**\n * Library configuration\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class AuthConfig {\n  /**\n   * An instance of the default configuration for the library\n   */\n  static defaults = new AuthConfig();\n\n  /**\n   * The relative url path of this app's functions api\n   */\n  apiUrl = 'api';\n\n  /**\n   * The identity providers available to login with. Defaults to the list of managed idp provided by azure\n   * static web apps service\n   * @see {managedIdentityProviders}\n   */\n  identityProviders: IdentityProviderInfo[] = Object.values(managedIdentityProviders);\n  /**\n   * The service that will select the identity provider to login with. Defaults to\n   * a service that will select the first entry from `identityProviders`\n   */\n  identityProviderSelectorType?: Type<IdentityProviderSelectorService>;\n  /**\n   * Trigger login flow when there is an unauthorized response from your functions app api.\n   */\n  loginOnUnauthorizedApiRequests = true;\n  /**\n   * The relative url of your functions app api endpoint to send the authentication session events\n   */\n  sessionEventsApiUrl = '/api/authevents';\n  /**\n   * Send authentication session events to your functions app api?\n   */\n  sendSessionEventsToApi = false;\n\n  /**\n   * The client-side route to redirect to when the user is found to be unauthorized\n   */\n  unauthorizedRoute = 'unauthorized';\n\n  /**\n   * Return a clone of the current instance overriding the current fields using the `values` supplied\n   * @param values Override values\n   */\n  with(values: Partial<AuthConfig>) {\n    return {\n      ...this,\n      ...values,\n      availableIdentityProviders: values.identityProviders ?? this.identityProviders\n    };\n  }\n}\n","import { ClientPrincipal } from './client-principal';\n\n/**\n * Type names of the authentication session events\n */\nexport type AuthEventType = 'login' | 'sign-up' | 'logout' | 'purge';\n\n/**\n * An extract of an `AuthEvent` that will sent to the function app api\n */\nexport interface AuthEventPayload {\n  type: AuthEventType;\n  userId: string;\n  identityProvider: string;\n}\n\n/**\n * An authentication session event\n */\nexport abstract class AuthEvent {\n  abstract type: AuthEventType;\n  abstract user: ClientPrincipal;\n\n  /**\n   * Creates an event object representing the user having logged in\n   * @param user The current user\n   */\n  static login(user: ClientPrincipal): AuthEvent {\n    return {\n      type: 'login',\n      user\n    };\n  }\n\n  /**\n   * Creates an event object representing the user having logged out\n   * @param user The current user\n   */\n  static logout(user: ClientPrincipal): AuthEvent {\n    return {\n      type: 'logout',\n      user\n    };\n  }\n\n  /**\n   * Creates an event object representing the user requesting to \"forget me\"\n   * @param user The current user\n   */\n  static purge(user: ClientPrincipal): AuthEvent {\n    return {\n      type: 'purge',\n      user\n    };\n  }\n\n  /**\n   * Creates an event object representing having signed up\n   * @param user The current user\n   */\n  static signUp(user: ClientPrincipal): AuthEvent {\n    return {\n      type: 'sign-up',\n      user\n    };\n  }\n\n  /**\n   * Prepare an {@link AuthEvent } payload to be sent to the api for persistence that has been sanitized for GDPR/PII\n   *\n   * @param evt the event to be sent to the api\n   */\n  static toAuthEventPayload(evt: AuthEvent): AuthEventPayload {\n    const {\n      user: { userId, identityProvider },\n      type\n    } = evt;\n    return { userId, identityProvider, type };\n  }\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","/**\n * The normalized details of a user\n */\nexport interface ClientPrincipal {\n  identityProvider: string;\n  userId: string;\n  userDetails: string;\n  userRoles: string[];\n}\n\n/**\n * The role name that all unauthenticated users are a member of\n */\nexport const anonymousRole = 'anonymous';\n/**\n * The role name that all authenticated users are a member of\n */\nexport const authenticatedRole = 'authenticated';\n","import { AllowedRole } from './auth.service';\nimport { anonymousRole } from './client-principal';\n\n/**\n * Is one or more of the `allowedRoles` in `actualRoles`. Implicitly every user (authenticated or unauthenticated)\n * is a member of the {@link anonymousRole} and that is assumed when verifying `allowedRoles`\n */\nexport const hasSomeAllowedRoles = (allowedRoles: AllowedRole[], actualRoles: string[]) => {\n  const allowedRoleNames = flattenAllowedRoles(allowedRoles);\n  return (\n    allowedRoleNames.length === 0 ||\n    allowedRoleNames.includes(anonymousRole) ||\n    allowedRoleNames.some(r => actualRoles.includes(r))\n  );\n};\n\n/**\n * Convenience function to flatten a jagged array of names of roles into a single dimensional array\n */\nexport const flattenAllowedRoles = (allowedRoles: AllowedRole[]) =>\n  Array.from(new Set<string>(allowedRoles.flat(10) as unknown as string[]));\n","import { Injectable } from '@angular/core';\n\n/**\n * Abstracts browser sessionStorage api so that it can be replaced as necessary\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class StorageService {\n  setItem(key: string, value: string) {\n    window.sessionStorage.setItem(key, value);\n  }\n\n  /**\n   * Remove the entry associated with the `key` and return it's value\n   * @param key\n   */\n  popItem(key: string): string | null {\n    const value = this.getItem(key);\n    this.removeItem(key);\n    return value;\n  }\n\n  getItem(key: string): string | null {\n    return window.sessionStorage.getItem(key);\n  }\n\n  removeItem(key: string) {\n    window.sessionStorage.removeItem(key);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { AuthConfig } from './auth-config';\nimport { IdentityProviderSelectorService } from './identity-provider-selector.service';\n\n/**\n * The default implementation of `IdentityProviderSelectorService` that will select the first entry\n * from `AuthConfig.identityProviders`\n */\n@Injectable()\nexport class FirstIdentityProviderSelectorService implements IdentityProviderSelectorService {\n  constructor(private config: AuthConfig) {}\n\n  selectIdentityProvider(): Observable<string | undefined> {\n    return of(this.config.identityProviders[0]?.id);\n  }\n}\n","import { forwardRef, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AuthConfig } from './auth-config';\nimport { LoginOptions } from './auth.service';\nimport { FirstIdentityProviderSelectorService } from './first-identity-provider-selector.service';\n\n/**\n * Options that are useful to present in any prompt displayed to the user when required to select an identity provider\n */\nexport type IdentityProviderSelectionOptions = Pick<LoginOptions, 'isSignUp'> & Pick<AuthConfig, 'identityProviders'>;\n\n/**\n * Selects the identity provider that should be logged in with.\n * Register your own instance of this class if you do not want to use default service\n * (`FirstIdentityProviderSelectorService`)\n *\n * @example\n * ```ts\n * // identity-provider-prompt.service.ts\n * @Injectable()\n * export class IdentityProviderPromptService implements IdentityProviderSelectorService {\n *\n *   constructor(private config: AuthConfig) { }\n *\n *   selectIdentityProvider(): Observable<string | undefined> {\n *     const idp = this.config.identityProviders[0];\n *     const ok = idp && confirm(`Sign-in with ${idp.name}`);\n *     return of(ok ? idp.id : undefined);\n *   }\n * }\n *\n * // app.module.ts...\n * imports: [\n *   AuthModule.forRoot({\n *     identityProviderSelectorType: IdentityProviderPromptService\n *   })\n * ]\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n  useClass: forwardRef(() => FirstIdentityProviderSelectorService)\n})\nexport abstract class IdentityProviderSelectorService {\n  /**\n   * Return the id of the identity provider that will be used to login or `undefined` to cancel the login flow\n   */\n  abstract selectIdentityProvider(options: IdentityProviderSelectionOptions): Observable<string | undefined>;\n}\n","import { Injectable } from '@angular/core';\nimport { defer, Observable, of, Subject } from 'rxjs';\nimport { first, map, mergeMap, shareReplay, take, tap } from 'rxjs/operators';\nimport { AuthConfig } from './auth-config';\nimport { AuthEvent } from './auth-event';\nimport { ClientPrincipal } from './client-principal';\nimport { hasSomeAllowedRoles } from './has-some-allowed-roles';\nimport { IdentityProviderSelectorService } from './identity-provider-selector.service';\nimport { StorageService } from './storage.service';\n\n/**\n * @ignore\n */\ninterface AuthResponseData {\n  clientPrincipal: ClientPrincipal | null;\n}\n\n/**\n * The shape for an allowed (aka required) role\n */\nexport type AllowedRole = string | AllowedRole[];\n\n/**\n * Options that control the behaviour when purging user information\n */\nexport interface PurgeOptions {\n  /**\n   * Purge the data for all applications (defaults to just this application)?\n   */\n  globally?: boolean;\n}\n\n/**\n * Options that control the login behaviour\n */\nexport interface LoginOptions {\n  /**\n   * The identity provider to login with.\n   * Defaults to the first entry in `AuthConfig.identityProviders`. This can be customized by\n   * registering your own `IdentityProviderSelectorService`\n   * @example\n   * ```ts\n   * // app.module...\n   * imports: [\n   *   AuthModule.forRoot({\n   *     identityProviderSelectorType: YourIdentityProviderSelectorService\n   *   })\n   * ]\n   * ```\n   */\n  identityProvider?: string;\n  /**\n   * The client-side url to redirect to after the user has been authenticated\n   */\n  redirectUrl?: string;\n  /**\n   * Is this a sign-up request or no? (defaults to `false`)\n   */\n  isSignUp?: boolean;\n}\n\n/**\n * @ignore\n */\nconst noExplicitRoles: string[] = [];\n/**\n * @ignore\n */\nconst storageKeyPrefix = 'angular_swa_auth';\n\n/**\n * @ignore\n */\nconst signingUpFlagKey = `${storageKeyPrefix}_signing_up`;\n\n/**\n * The main service for working with authenticated users\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class AuthService {\n  /**\n   * Return the current authenticated user or `null` when the user is not authenticated.\n   *\n   * The first subscriber will trigger a fetch from the built-in user api endpoint. Late subscribers will then receive\n   * the last value emitted.\n   *\n   */\n  currentUser$: Observable<ClientPrincipal | null>;\n\n  /**\n   * The identity providers available to login with.\n   * Note: This is just a convenient alias of `AuthConfig.identityProviders`\n   */\n  readonly identityProviders = this.config.identityProviders;\n\n  /**\n   * Return whether the user is authenticated.\n   *\n   * This status will NOT be re-evaluated if the `userLoaded$`'s\n   * authenticated session expires\n   *\n   */\n  isAuthenticated$: Observable<boolean>;\n\n  protected sessionEvents = new Subject<AuthEvent>();\n  /**\n   * Authentication session events as they occur\n   */\n  sessionEvents$ = this.sessionEvents.asObservable();\n\n  private currentIdp$: Observable<string | undefined>;\n\n  constructor(\n    private config: AuthConfig,\n    private storage: StorageService,\n    private idpSelectorService: IdentityProviderSelectorService\n  ) {\n    this.currentUser$ = defer(() => this.httpGet<AuthResponseData>('/.auth/me')).pipe(\n      map(resp => resp.clientPrincipal),\n      tap(user => {\n        if (user) {\n          this.publishAuthenticatedSuccessEvents(user);\n        }\n      }),\n      shareReplay({ bufferSize: 1, refCount: false })\n    );\n\n    this.isAuthenticated$ = this.currentUser$.pipe(\n      map(user => !!user),\n      shareReplay({ bufferSize: 1, refCount: false })\n    );\n\n    this.currentIdp$ = this.currentUser$.pipe(map(user => user?.identityProvider));\n  }\n\n  /**\n   * Ensure that login has already occurred and therefore the user object is loaded.\n   * Where login has not already occurred, then initiate the login flow.\n   *\n   * IMPORTANT: when login has not already occurred, the browser will be redirected to the IDP\n   *\n   * @param targetUrl The client-side url to redirect to after the user has been authenticated\n   * @returns `true` when login has already occurred, `false` otherwise\n   * @see `login`\n   */\n  async ensureLoggedIn(targetUrl?: string): Promise<boolean> {\n    const user = await this.currentUser$.pipe(first()).toPromise();\n    if (user) {\n      return true;\n    }\n\n    await this.login({ redirectUrl: targetUrl });\n    return false;\n  }\n\n  /**\n   * Does the current user have one or more of the `allowedRoles` supplied.\n   *\n   * Note: because the observable returned completes, consumers do NOT have to unsubscribe from it\n   *\n   * @param allowedRoles The list of roles to check\n   * @return {Observable<boolean>} an observable that returns true/false and then completes\n   */\n  hasSomeRoles$(allowedRoles: AllowedRole[]) {\n    return this.currentUser$.pipe(\n      map(user => hasSomeAllowedRoles(allowedRoles, user?.userRoles ?? noExplicitRoles)),\n      take(1)\n    );\n  }\n\n  /**\n   * Trigger the login flow, redirecting the browser to the identity provider.\n   * @param options The options that control the login behaviour\n   * @returns {boolean} false when the identity provider to login with is not selected, true otherwise\n   */\n  async login(options: LoginOptions = {}): Promise<boolean> {\n    const idp = options.identityProvider ?? (await this.selectIdentityProvider(options).toPromise());\n\n    if (!idp) {\n      return false;\n    }\n\n    const redirectUrl = options.redirectUrl ? window.location.origin + options.redirectUrl : undefined;\n    const idpUrl = `${window.location.origin}/.auth/login/${idp}`;\n    this.redirectToIdentityProvider(redirectUrl ? `${idpUrl}?post_login_redirect_uri=${redirectUrl}` : idpUrl);\n\n    if (options.isSignUp) {\n      this.setSigningUpFlag();\n    }\n\n    return true;\n  }\n\n  /**\n   * Trigger the logout flow. This is a no-op when the user is not already authenticated\n   * @param redirectUrl The url to redirect to after the user has been logged out\n   * @returns {boolean} false when the user is not already authenticated, true otherwise\n   */\n  async logout(redirectUrl?: string): Promise<boolean> {\n    const user = await this.currentUser$.toPromise();\n    if (!user) {\n      return false;\n    }\n\n    const idpUrl = `${window.location.origin}/.auth/logout`;\n    this.redirectToIdentityProvider(redirectUrl ? `${idpUrl}?post_logout_redirect_uri=${redirectUrl}` : idpUrl);\n\n    this.sessionEvents.next(AuthEvent.logout(user));\n\n    return true;\n  }\n\n  /**\n   * Purge user consent information stored at the identity provider for the currently authenticated user.\n   * This is a no-op when the user is not already authenticated.\n   * IMPORTANT: this will redirect the browser, landing back at the base url for the application\n   * @param options The options that control the purge behaviour\n   * @returns {boolean} false when the user is authenticated, true otherwise\n   */\n  async purge(options: PurgeOptions = {}): Promise<boolean> {\n    const user = await this.currentUser$.toPromise();\n    if (!user) {\n      return false;\n    }\n\n    const host = options.globally ? 'identity.azurestaticapps.net' : window.location.origin;\n    this.redirectToIdentityProvider(`${host}/.auth/purge/${user.identityProvider}`);\n\n    this.sessionEvents.next(AuthEvent.purge(user));\n\n    return true;\n  }\n\n  /**\n   * Http implementation to perform a GET request to fetch json. The default implementation uses the\n   * `fetch` browser api\n   * @param url the url of http json endpoint\n   */\n  protected httpGet<T>(url: string): Promise<T> | Observable<T> {\n    // note: we're using fetch api rather than angular `HttpClient` so that an app is not forced to take a\n    // dependency on `HttpClientModule` which it might not need\n    return fetch(url).then(resp => resp.json());\n  }\n\n  /**\n   * Initiate the browser redirect to azure static web apps auth html endpoints\n   * @param url The full url of the auth html endpoint to redirect the browser to\n   */\n  protected redirectToIdentityProvider(url: string) {\n    window.location.href = url;\n  }\n\n  protected setSigningUpFlag() {\n    this.storage.setItem(signingUpFlagKey, '1');\n  }\n\n  protected popSigningUpFlag() {\n    return !!this.storage.popItem(signingUpFlagKey);\n  }\n\n  private publishAuthenticatedSuccessEvents(user: ClientPrincipal) {\n    this.sessionEvents.next(AuthEvent.login(user));\n    if (this.popSigningUpFlag()) {\n      this.sessionEvents.next(AuthEvent.signUp(user));\n    }\n  }\n\n  private selectIdentityProvider({ isSignUp }: LoginOptions): Observable<string | undefined> {\n    const options = {\n      isSignUp,\n      identityProviders: this.identityProviders\n    };\n    return this.currentIdp$.pipe(\n      mergeMap(idp => (idp ? of(idp) : this.idpSelectorService.selectIdentityProvider(options)))\n    );\n  }\n}\n","import { ErrorHandler, Injectable, OnDestroy } from '@angular/core';\nimport { EMPTY, Observable, Subscription } from 'rxjs';\nimport { catchError, concatMap } from 'rxjs/operators';\nimport { AuthConfig } from './auth-config';\nimport { AuthEvent } from './auth-event';\nimport { AuthService } from './auth.service';\n\n/**\n * Send authentication session events to your functions app api\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class AuthEventPersistenceService implements OnDestroy {\n  private subscription = new Subscription();\n  private saves$: Observable<void>;\n\n  constructor(authService: AuthService, errorHandler: ErrorHandler, private config: AuthConfig) {\n    this.saves$ = authService.sessionEvents$.pipe(\n      concatMap(evt =>\n        this.sendEvent(evt).pipe(\n          catchError(err => {\n            errorHandler.handleError(err);\n            return EMPTY;\n          })\n        )\n      )\n    );\n  }\n\n  /**\n   * Start listening to the events to send them to the api\n   */\n  start() {\n    this.subscription.add(this.saves$.subscribe());\n  }\n\n  /**\n   * Send the event to the api. The default implementation is send event using the `navigator.sendBeacon`\n   */\n  protected sendEvent(evt: AuthEvent): Observable<void> {\n    const payload = this.prepareEventPayload(evt);\n    // `sendBeacon` is a more reliable way of ensuring the http request is made even when app page is unloaded\n    navigator.sendBeacon(\n      this.config.sessionEventsApiUrl,\n      typeof payload === 'string' ? payload : JSON.stringify(payload)\n    );\n    return EMPTY;\n  }\n\n  /**\n   * Override this method if you need to modify the data sent to the api.\n   *\n   * Note: the the cookie containing all the `ClientPrincipal` fields will be available also to the api function\n   *\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  protected prepareEventPayload(evt: AuthEvent): any {\n    return AuthEvent.toAuthEventPayload(evt);\n  }\n\n  ngOnDestroy() {\n    this.subscription.unsubscribe();\n  }\n}\n","import { APP_INITIALIZER, FactoryProvider } from '@angular/core';\nimport { AuthConfig } from './auth-config';\nimport { AuthEventPersistenceService } from './auth-event-persistence.service';\n\n/**\n * @ignore\n */\nconst startEventPersistence = (eventPersistanceService: AuthEventPersistenceService, authConfig: AuthConfig) => () => {\n  if (authConfig.sendSessionEventsToApi) {\n    eventPersistanceService.start();\n  }\n};\n\n/**\n * @ignore\n */\nexport const authEventInitializerProvider: FactoryProvider = {\n  provide: APP_INITIALIZER,\n  useFactory: startEventPersistence,\n  deps: [AuthEventPersistenceService, AuthConfig],\n  multi: true\n};\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { EMPTY, from, Observable, of, throwError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\nimport { AuthConfig } from './auth-config';\nimport { AuthService } from './auth.service';\n\n/**\n * Trigger login flow when there is an unauthorized response from the api\n */\n@Injectable()\nexport class AutoLoginHttpInterceptor implements HttpInterceptor {\n  constructor(private authService: AuthService, private config: AuthConfig) {}\n\n  intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n    if (!this.shouldHandle(req)) {\n      return next.handle(req);\n    }\n\n    return next.handle(req).pipe(\n      catchError(err => {\n        const swallowError$ = of(err instanceof HttpErrorResponse && err.status === 401).pipe(\n          mergeMap(isUnauthorizedErr => {\n            if (!isUnauthorizedErr) {\n              return of(false);\n            }\n\n            // note: we are NOT using Router.url value but instead using window.location so as to optimize on\n            // tree shaking. This is a workaround for angular not supporting tree shakable multi-use providers :-(\n            const redirectUrl = window.location.pathname + window.location.search;\n            return from(this.authService.login({ redirectUrl }));\n          })\n        );\n\n        return swallowError$.pipe(mergeMap(swallow => (swallow ? EMPTY : throwError(err))));\n      })\n    );\n  }\n\n  private shouldHandle(req: HttpRequest<unknown>) {\n    return req.url.toLowerCase().startsWith(this.config.apiUrl.toLowerCase());\n  }\n}\n","import { Directive, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { combineLatest, merge, Observable, ReplaySubject, Subscription } from 'rxjs';\nimport { map, takeUntil } from 'rxjs/operators';\nimport { AllowedRole, AuthService } from './auth.service';\nimport { hasSomeAllowedRoles } from './has-some-allowed-roles';\n\n/**\n * @ignore\n */\nconst noExplicitRoles: string[] = [];\n\n/**\n * Structural directive to perform an authorization check using roles defined in Status Web App\n *\n * Checkout the storybook examples for more guidance: <https://stories.angular-swa-auth.codingdemo.co.uk/?path=/story/swarolecheckdirective>\n *\n * @example\n * ```html\n * <nav class=\"menu\" *swaRoleCheck=\"let canAdmin of ['admin']; let maybeCanAdmin = isPlaceholder\">\n *   <p class=\"menu-label\">Menu</p>\n *   <ul class=\"menu-list\">\n *     <a routerLink=\"/users\" routerLinkActive=\"is-active\">\n *       <progress *ngIf=\"maybeCanAdmin\" class=\"progress is-primary is-medium\" max=\"100\">15%</progress>\n *       <span *ngIf=\"!maybeCanAdmin\" [ngClass]=\"!canAdmin ? 'has-text-grey-lighter' : ''\">Users</span>\n *     </a>\n *   </ul>\n * </nav>\n * ```\n */\n@Directive({\n  selector: '[swaRoleCheck]'\n})\nexport class SwaRoleCheckDirective implements OnInit, OnDestroy {\n  @Input() set swaRoleCheckOf(value: AllowedRole[]) {\n    // we're ignoring null/undefined to accommodate async fetching of allowed roles in the consumer template. In this\n    // scenario the async pipe will initially assign a null to our input property. We skip this so that the initial\n    // placeholder authz result will be in play until the allowed roles are finally fetched\n    if (value == null) return;\n\n    this.allowedRoles.next(value);\n  }\n\n  @Input() set swaRoleCheckUserRoles(value: string[]) {\n    // we're ignoring null/undefined to accommodate async fetching of user roles in the consumer template. In this\n    // scenario the async pipe will initially assign a null to our input property. We skip this so that the initial\n    // placeholder authz result will be in play until the user roles are finally fetched\n    if (value == null) return;\n\n    this.userRolesFromTemplate.next(value);\n  }\n\n  private allowedRoles = new ReplaySubject<AllowedRole[]>(1);\n  private userRolesFromTemplate = new ReplaySubject<string[]>(1);\n  private subscription = new Subscription();\n\n  private context = {\n    ['$implicit']: false,\n    isPlaceholder: true\n  };\n\n  constructor(\n    private viewContainerRef: ViewContainerRef,\n    private templateRef: TemplateRef<never>,\n    private authService: AuthService\n  ) {}\n\n  ngOnInit() {\n    const injectedRoles$ = this.authService.currentUser$.pipe(\n      map(user => user?.userRoles),\n      takeUntil(this.userRolesFromTemplate)\n    );\n    const userRoles$ = merge(this.userRolesFromTemplate, injectedRoles$).pipe(map(x => x ?? noExplicitRoles));\n\n    const permissionCheck$: Observable<boolean> = combineLatest([this.allowedRoles, userRoles$]).pipe(\n      map(([allowedRoles, userRoles]) => hasSomeAllowedRoles(allowedRoles, userRoles))\n    );\n\n    this.subscription = permissionCheck$.subscribe(authzResult => {\n      this.context['$implicit'] = authzResult;\n      this.context.isPlaceholder = false;\n    });\n\n    this.viewContainerRef.createEmbeddedView(this.templateRef, this.context);\n  }\n\n  ngOnDestroy() {\n    this.subscription.unsubscribe();\n  }\n}\n","import { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { AuthConfig } from './auth-config';\nimport { authEventInitializerProvider } from './auth-event-initializer.provider';\nimport { AutoLoginHttpInterceptor } from './auto-login-http-interceptor.service';\nimport { IdentityProviderSelectorService } from './identity-provider-selector.service';\nimport { SwaRoleCheckDirective } from './swa-roles-check.directive';\n\nconst PUBLIC_DECLARATIONS = [SwaRoleCheckDirective];\n\n/**\n * Library module\n * @example\n *  * // app.module.ts...\n * imports: [\n *   AuthModule.forRoot({\n *     // overrides to the default configuration here\n *   })\n * ]\n */\n@NgModule({\n  declarations: PUBLIC_DECLARATIONS,\n  exports: PUBLIC_DECLARATIONS\n})\nexport class SwaAuthModule {\n  static forRoot(config?: Partial<AuthConfig>): ModuleWithProviders<SwaAuthModule> {\n    const finalConfigs = config ? AuthConfig.defaults.with(config) : AuthConfig.defaults;\n    const idpSelectorProvider =\n      finalConfigs.identityProviderSelectorType != null\n        ? [\n            finalConfigs.identityProviderSelectorType,\n            { provide: IdentityProviderSelectorService, useExisting: finalConfigs.identityProviderSelectorType }\n          ]\n        : [];\n    const autoLoginInterceptorProvider = finalConfigs.loginOnUnauthorizedApiRequests\n      ? [{ provide: HTTP_INTERCEPTORS, useClass: AutoLoginHttpInterceptor, multi: true }]\n      : [];\n    const providers = [\n      autoLoginInterceptorProvider,\n      authEventInitializerProvider,\n      idpSelectorProvider,\n      { provide: AuthConfig, useValue: finalConfigs }\n    ];\n    return {\n      ngModule: SwaAuthModule,\n      providers\n    };\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, CanLoad, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthService } from './auth.service';\n\n/**\n * Add to a route to trigger the sign in flow when the user is not already authenticated\n *\n * Implements `CanLoad` for use with lazy loaded routes and `CanActivate` for regular routes.\n *\n * @see { AuthService.ensureLoggedIn }\n * @example\n * ```ts\n * export const routes: Routes = [\n *   { path: 'secure-page', component: SecurePageComponent, canActivate: [AuthGuard] },\n *   {\n *     path: 'product',\n *     canLoad: [AuthGuard],\n *     loadChildren: () => import('@christianacca/demo-app/product-admin').then(m => m.ProductAdminModule)\n *   },\n * ];\n * ```\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class AuthGuard implements CanActivate, CanLoad {\n  constructor(private authService: AuthService, private router: Router) {}\n\n  canActivate(_route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {\n    return this.authService.ensureLoggedIn(state.url);\n  }\n\n  canLoad(/* route: Route, segments: UrlSegment[] */): Promise<boolean> {\n    const navigation = this.router.getCurrentNavigation();\n    const targetUrl = !navigation ? '/' : navigation.extractedUrl.toString();\n    return this.authService.ensureLoggedIn(targetUrl);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport {\n  ActivatedRouteSnapshot,\n  CanActivate,\n  CanLoad,\n  Data,\n  Route,\n  Router,\n  RouterStateSnapshot,\n  UrlTree\n} from '@angular/router';\nimport { from, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AuthConfig } from './auth-config';\nimport { AllowedRole, AuthService } from './auth.service';\nimport { flattenAllowedRoles } from './has-some-allowed-roles';\n\n/**\n * Add to a route to perform an authorization check using roles defined in Status Web App.\n *\n * Implements `CanLoad` for use with lazy loaded routes and `CanActivate` for regular routes.\n *\n * Will first trigger the sign in flow when the user is not already authenticated. Then verifies\n * that the user is a member of one or more {@link AllowedRole}'s as defined in an `allowedRoles`\n * field on `Route.data` for the route about to be navigated to.\n *\n * Where the user is deemed unauthorized the SPA will be routed to the client-side route configured\n * using {@link AuthConfig.unauthorizedRoute}.\n *\n * The  allowed role(s) from the matching route will be passed as query string parameters to this nominated\n * unauthorized route.\n *\n * @see {AuthService.hasSomeRoles$}\n *\n * @example\n * ```ts\n * // app.module.ts...\n *\n * export const routes: Routes = [\n *   {\n *     path: 'product-admin',\n *     data: {\n *       allowedRoles: 'admin' // other ex: ['admin', ['product-reader', 'owner']]\n *     },\n *     canActivate: [SwaRoleGuard],\n *     component: AdminComponent\n *   },\n *   {\n *     path: 'user-admin',\n *     data: {\n *       allowedRoles: 'owner'\n *     },\n *     canLoad: [SwaRoleGuard],\n *     loadChildren: () => import('@christianacca/demo-app/user-admin').then(m => m.UserAdminModule)\n *   }\n * ];\n *\n * // unauthorized.component.ts...\n *\n * export class UnauthorizedComponent {\n *   allowedRoles: string[];\n *   constructor(route: ActivatedRoute) {\n *     this.allowedRoles = route.snapshot.queryParamMap.getAll('allowedRoles');\n *   }\n * }\n * ```\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class SwaRoleGuard implements CanActivate, CanLoad {\n  constructor(private authService: AuthService, private router: Router, private config: AuthConfig) {}\n\n  private static getAllowedRoles(route: { data?: Data }): AllowedRole[] | undefined {\n    const roles = route.data?.allowedRoles;\n    if (!roles) {\n      return undefined;\n    }\n    return Array.isArray(roles) ? roles : [roles];\n  }\n\n  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n    return this.ensureHasRouteRoles(route, state.url);\n  }\n\n  canLoad(route: Route) {\n    const navigation = this.router.getCurrentNavigation();\n    const targetUrl = !navigation ? '/' : navigation.extractedUrl.toString();\n    return this.ensureHasRouteRoles(route, targetUrl);\n  }\n\n  private ensureHasRouteRoles(route: { data?: Data }, targetUrl: string): Observable<boolean | UrlTree> | boolean {\n    // Q: why are we calling `ensureLoggedIn` below?\n    // A: Angular will execute CanLoad guards BEFORE CanActivate guards\n    // Therefore this guard runs BEFORE the AuthGuard. As a consequence, this guard also\n    // needs to trigger the login flow.\n\n    const allowedRoles = SwaRoleGuard.getAllowedRoles(route);\n    if (!allowedRoles) {\n      return true;\n    }\n    const isLoggedIn$ = from(this.authService.ensureLoggedIn(targetUrl));\n    return isLoggedIn$.pipe(\n      switchMap(isLoggedIn => {\n        if (!isLoggedIn) {\n          // the user cancelled login prompt\n          return of(false);\n        }\n        return this.ensureHasSomeRoles(allowedRoles);\n      })\n    );\n  }\n\n  private ensureHasSomeRoles(allowedRoles: AllowedRole[]) {\n    return this.authService\n      .hasSomeRoles$(allowedRoles)\n      .pipe(map(isAuthorized => isAuthorized || this.getUnauthorizedUrl(allowedRoles)));\n  }\n\n  private getUnauthorizedUrl(allowedRoles: AllowedRole[]) {\n    const url = this.router.parseUrl(this.config.unauthorizedRoute);\n    url.queryParams['allowedRoles'] = flattenAllowedRoles(allowedRoles);\n    return url;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport {\n  IdentityProviderSelectionOptions,\n  IdentityProviderSelectorService\n} from './identity-provider-selector.service';\n\n/**\n * @ignore\n */\nexport interface IdentityProviderPromptContext {\n  selectionOptions: IdentityProviderSelectionOptions;\n  open: boolean;\n}\n\n/**\n * An implementation of `IdentityProviderSelectorService` that orchestrates the UI workflow of showing to the user a\n * list of identity providers to select when logging in or signing up.\n *\n * @example\n * ```ts\n * // your UI prompt component. EG...\n * import { IdentityProviderInteractiveSelectorService } from '@christianacca/angular-swa-auth';\n *\n * @Component({\n *   selector: 'app-idp-selector-modal',\n *   template: `\n *     <div *ngIf=\"svc.prompt$ | async as vm\" class=\"modal\" [ngClass]=\"{ 'is-active': vm.open }\">\n *       <div class=\"modal-background\"></div>\n *       <div class=\"modal-card\">\n *         <header class=\"modal-card-head\">\n *           <p class=\"modal-card-title\">{{ vm.selectionOptions.isSignUp ? 'Sign-up' : 'Login' }}</p>\n *         </header>\n *         <nav class=\"menu modal-card-body\">\n *           <p class=\"menu-label\">With:</p>\n *           <div class=\"menu-list\">\n *             <a\n *               *ngFor=\"let provider of vm.selectionOptions.identityProviders\"\n *               (click)=\"svc.selectAndClose(provider.id)\"\n *              >{{ provider.name }}</a\n *             >\n *           </div>\n *         </nav>\n *       </div>\n *       <button class=\"modal-close is-large\" aria-label=\"close\" (click)=\"svc.selectAndClose(undefined)\"></button>\n *     </div>\n *   `,\n *   changeDetection: ChangeDetectionStrategy.OnPush\n * })\n *  export class IdpSelectorModalComponent {\n *   constructor(public svc: IdentityProviderInteractiveSelectorService) {}\n * }\n *\n * // app.component.ts...\n * @Component({\n *  selector: 'app-root',\n *  template: `\n *    <app-idp-selector-modal></app-idp-selector-modal>\n *    <router-outlet></router-outlet>\n *  `\n * })\n * export class AppComponent {}\n *\n * // app.module.ts...\n * imports: [\n *   AuthModule.forRoot({\n *     identityProviderSelectorType: IdentityProviderInteractiveSelectorService\n *   })\n * ]\n * ```\n */\n@Injectable()\nexport class IdentityProviderInteractiveSelectorService implements IdentityProviderSelectorService {\n  private prompt = new BehaviorSubject<IdentityProviderPromptContext>({\n    open: false,\n    selectionOptions: {\n      identityProviders: []\n    }\n  });\n\n  /**\n   * An observable that will emit true/false and should be used to show/hide a prompt asking the user\n   * to select from the configured li st of identity providers\n   */\n  prompt$ = this.prompt.asObservable();\n\n  private selected = new Subject<string | undefined>();\n\n  /**\n   * Called with the users selection of identity provider to cause the prompt to close\n   * @param identityProvider Identity Provider that was selected or `undefined` to indicate the user cancelled the login\n   */\n  selectAndClose(identityProvider: string | undefined) {\n    this.prompt.next({ ...this.prompt.value, open: false });\n    this.selected.next(identityProvider);\n  }\n\n  selectIdentityProvider(options: IdentityProviderSelectionOptions): Observable<string | undefined> {\n    this.prompt.next({ selectionOptions: options, open: true });\n    return this.selected.pipe(take(1));\n  }\n}\n"]}