From 9939c2767634aabe878fa613060084c581e621d2 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Thu, 29 Jun 2023 12:26:47 -0400 Subject: [PATCH 1/8] Make account info mandatory for AuthenticationResult and CacheRecord types. (#6156) - Make account info mandatory for `AuthenticationResult` type. - Make account info mandatory for `CacheRecord` type. --- ...-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json | 7 +++++ .../src/app/IPublicClientApplication.ts | 2 +- .../src/app/PublicClientApplication.ts | 2 +- lib/msal-browser/src/cache/ITokenCache.ts | 4 +-- lib/msal-browser/src/cache/TokenCache.ts | 12 ++++---- .../src/cache/entities/CacheRecord.ts | 28 +++++++++++++++++++ .../src/controllers/IController.ts | 2 +- .../src/controllers/StandardController.ts | 2 +- lib/msal-browser/src/event/EventMessage.ts | 2 +- lib/msal-browser/src/index.ts | 3 +- .../BaseInteractionClient.ts | 6 ++-- .../NativeInteractionClient.ts | 4 +-- .../src/interaction_client/PopupClient.ts | 2 +- .../src/interaction_client/RedirectClient.ts | 2 +- .../SilentAuthCodeClient.ts | 2 +- .../interaction_client/SilentCacheClient.ts | 4 +-- .../interaction_client/SilentIframeClient.ts | 2 +- .../interaction_client/SilentRefreshClient.ts | 3 +- .../interaction_handler/InteractionHandler.ts | 4 +-- .../interaction_handler/RedirectHandler.ts | 4 +-- lib/msal-browser/src/internals.ts | 3 ++ .../src/response/AuthenticationResult.ts | 10 +++++++ .../test/app/PublicClientApplication.spec.ts | 2 +- .../interaction_client/PopupClient.spec.ts | 2 +- .../interaction_client/RedirectClient.spec.ts | 2 +- .../SilentAuthCodeClient.spec.ts | 3 +- .../SilentIframeClient.spec.ts | 3 +- 27 files changed, 83 insertions(+), 39 deletions(-) create mode 100644 change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json create mode 100644 lib/msal-browser/src/cache/entities/CacheRecord.ts create mode 100644 lib/msal-browser/src/response/AuthenticationResult.ts diff --git a/change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json b/change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json new file mode 100644 index 0000000000..0e1110a058 --- /dev/null +++ b/change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Make account info mandatory for AuthenticationResult and CacheRecord types #6156", + "packageName": "@azure/msal-browser", + "email": "kshabelko@microsoft.com", + "dependentChangeType": "prerelease" +} diff --git a/lib/msal-browser/src/app/IPublicClientApplication.ts b/lib/msal-browser/src/app/IPublicClientApplication.ts index e46b665a71..a9550aa9f9 100644 --- a/lib/msal-browser/src/app/IPublicClientApplication.ts +++ b/lib/msal-browser/src/app/IPublicClientApplication.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, AccountInfo, Logger, PerformanceCallbackFunction, @@ -21,6 +20,7 @@ import { EndSessionPopupRequest } from "../request/EndSessionPopupRequest"; import { ITokenCache } from "../cache/ITokenCache"; import { AuthorizationCodeRequest } from "../request/AuthorizationCodeRequest"; import { BrowserConfiguration } from "../config/Configuration"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export interface IPublicClientApplication { initialize(): Promise; diff --git a/lib/msal-browser/src/app/PublicClientApplication.ts b/lib/msal-browser/src/app/PublicClientApplication.ts index bdfd487eeb..a3cbc6de9b 100644 --- a/lib/msal-browser/src/app/PublicClientApplication.ts +++ b/lib/msal-browser/src/app/PublicClientApplication.ts @@ -13,7 +13,6 @@ import { WrapperSKU } from "../utils/BrowserConstants"; import { IPublicClientApplication } from "./IPublicClientApplication"; import { IController } from "../controllers/IController"; import { - AuthenticationResult, PerformanceCallbackFunction, AccountInfo, Logger, @@ -24,6 +23,7 @@ import { ControllerFactory } from "../controllers/ControllerFactory"; import { StandardController } from "../controllers/StandardController"; import { BrowserConfiguration, Configuration } from "../config/Configuration"; import { StandardOperatingContext } from "../operatingcontext/StandardOperatingContext"; +import { AuthenticationResult } from "../response/AuthenticationResult"; /** * The PublicClientApplication class is the object exposed by the library to perform authentication and authorization functions in Single Page Applications diff --git a/lib/msal-browser/src/cache/ITokenCache.ts b/lib/msal-browser/src/cache/ITokenCache.ts index 35dc6da1a1..b959ee6785 100644 --- a/lib/msal-browser/src/cache/ITokenCache.ts +++ b/lib/msal-browser/src/cache/ITokenCache.ts @@ -4,11 +4,11 @@ */ import { - ExternalTokenResponse, - AuthenticationResult, + ExternalTokenResponse } from "@azure/msal-common"; import { SilentRequest } from "../request/SilentRequest"; import { LoadTokenOptions } from "./TokenCache"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export interface ITokenCache { /** diff --git a/lib/msal-browser/src/cache/TokenCache.ts b/lib/msal-browser/src/cache/TokenCache.ts index e49e5284c5..d77dd5117d 100644 --- a/lib/msal-browser/src/cache/TokenCache.ts +++ b/lib/msal-browser/src/cache/TokenCache.ts @@ -16,8 +16,6 @@ import { AuthToken, RefreshTokenEntity, AuthorityType, - CacheRecord, - AuthenticationResult, Constants, } from "@azure/msal-common"; import { BrowserConfiguration } from "../config/Configuration"; @@ -25,6 +23,8 @@ import { SilentRequest } from "../request/SilentRequest"; import { BrowserCacheManager } from "./BrowserCacheManager"; import { ITokenCache } from "./ITokenCache"; import { BrowserAuthError } from "../error/BrowserAuthError"; +import { AuthenticationResult } from "../response/AuthenticationResult"; +import { CacheRecord } from "./entities/CacheRecord"; export type LoadTokenOptions = { clientInfo?: string; @@ -84,7 +84,7 @@ export class TokenCache implements ITokenCache { const idToken = new AuthToken(response.id_token, this.cryptoObj); - let cacheRecord: CacheRecord | undefined; + let cacheRecord: CacheRecord; let authority: Authority | undefined; if (request.account) { @@ -435,7 +435,7 @@ export class TokenCache implements ITokenCache { private generateAuthenticationResult( request: SilentRequest, idTokenObj: AuthToken, - cacheRecord?: CacheRecord, + cacheRecord: CacheRecord, authority?: Authority ): AuthenticationResult { let accessToken: string = Constants.EMPTY_STRING; @@ -469,9 +469,7 @@ export class TokenCache implements ITokenCache { uniqueId: uid, tenantId: tid, scopes: responseScopes, - account: cacheRecord?.account - ? cacheRecord.account.getAccountInfo() - : null, + account: cacheRecord.account.getAccountInfo(), idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING, idTokenClaims: idTokenObj ? idTokenObj.claims : {}, accessToken: accessToken, diff --git a/lib/msal-browser/src/cache/entities/CacheRecord.ts b/lib/msal-browser/src/cache/entities/CacheRecord.ts new file mode 100644 index 0000000000..4ae245c0ae --- /dev/null +++ b/lib/msal-browser/src/cache/entities/CacheRecord.ts @@ -0,0 +1,28 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { + AccessTokenEntity, + AccountEntity, + AppMetadataEntity, + CacheRecord as CommonCacheRecord, + IdTokenEntity, + RefreshTokenEntity +} from "@azure/msal-common"; + +export class CacheRecord extends CommonCacheRecord { + account: AccountEntity; + + constructor( + accountEntity: AccountEntity, + idTokenEntity?: IdTokenEntity | null, + accessTokenEntity?: AccessTokenEntity | null, + refreshTokenEntity?: RefreshTokenEntity | null, + appMetadataEntity?: AppMetadataEntity | null + ) { + super(accountEntity, idTokenEntity, accessTokenEntity, refreshTokenEntity, appMetadataEntity); + this.account = accountEntity; + } +} diff --git a/lib/msal-browser/src/controllers/IController.ts b/lib/msal-browser/src/controllers/IController.ts index 6d7478b25c..5393e0ef4d 100644 --- a/lib/msal-browser/src/controllers/IController.ts +++ b/lib/msal-browser/src/controllers/IController.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, AccountInfo, Logger, PerformanceCallbackFunction, @@ -28,6 +27,7 @@ import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandle import { EventHandler } from "../event/EventHandler"; import { PopupClient } from "../interaction_client/PopupClient"; import { SilentIframeClient } from "../interaction_client/SilentIframeClient"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export interface IController { initialize(): Promise; diff --git a/lib/msal-browser/src/controllers/StandardController.ts b/lib/msal-browser/src/controllers/StandardController.ts index 8d6512295b..8e4f8611dd 100644 --- a/lib/msal-browser/src/controllers/StandardController.ts +++ b/lib/msal-browser/src/controllers/StandardController.ts @@ -9,7 +9,6 @@ import { AccountInfo, Constants, INetworkModule, - AuthenticationResult, Logger, CommonSilentFlowRequest, ICrypto, @@ -72,6 +71,7 @@ import { StandardOperatingContext } from "../operatingcontext/StandardOperatingC import { BaseOperatingContext } from "../operatingcontext/BaseOperatingContext"; import { version, name } from "../packageMetadata"; import { IController } from "./IController"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export class StandardController implements IController { // OperatingContext diff --git a/lib/msal-browser/src/event/EventMessage.ts b/lib/msal-browser/src/event/EventMessage.ts index 3e6840921e..e5e12cb3ed 100644 --- a/lib/msal-browser/src/event/EventMessage.ts +++ b/lib/msal-browser/src/event/EventMessage.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, AuthError, AccountInfo, } from "@azure/msal-common"; @@ -16,6 +15,7 @@ import { SilentRequest, SsoSilentRequest, EndSessionRequest, + AuthenticationResult, } from ".."; export type EventMessage = { diff --git a/lib/msal-browser/src/index.ts b/lib/msal-browser/src/index.ts index f92312d69f..11c2809b2a 100644 --- a/lib/msal-browser/src/index.ts +++ b/lib/msal-browser/src/index.ts @@ -66,6 +66,7 @@ export { EndSessionRequest } from "./request/EndSessionRequest"; export { EndSessionPopupRequest } from "./request/EndSessionPopupRequest"; export { AuthorizationUrlRequest } from "./request/AuthorizationUrlRequest"; export { AuthorizationCodeRequest } from "./request/AuthorizationCodeRequest"; +export { AuthenticationResult } from "./response/AuthenticationResult"; // Cache export { LoadTokenOptions } from "./cache/TokenCache"; @@ -94,8 +95,6 @@ export { // Account AccountInfo, AccountEntity, - // Response - AuthenticationResult, IdTokenClaims, // Error AuthError, diff --git a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts index cf45d1b7ed..81726b6353 100644 --- a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts @@ -7,7 +7,6 @@ import { ICrypto, INetworkModule, Logger, - AuthenticationResult, AccountInfo, AccountEntity, BaseAuthRequest, @@ -35,6 +34,7 @@ import { BrowserConstants } from "../utils/BrowserConstants"; import { BrowserUtils } from "../utils/BrowserUtils"; import { INavigationClient } from "../navigation/INavigationClient"; import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export abstract class BaseInteractionClient { protected config: BrowserConfiguration; @@ -207,12 +207,12 @@ export abstract class BaseInteractionClient { } /* - * If authority provided in the request does not match environment/authority specified + * If authority provided in the request does not match environment/authority specified * in the account or MSAL config, we throw an error. */ async validateRequestAuthority(authority: string, account: AccountInfo): Promise { const discoveredAuthority = await this.getDiscoveredAuthority(authority); - + if(!discoveredAuthority.isAlias(account.environment)) { throw ClientConfigurationError.createAuthorityMismatchError(); } diff --git a/lib/msal-browser/src/interaction_client/NativeInteractionClient.ts b/lib/msal-browser/src/interaction_client/NativeInteractionClient.ts index fb774acbee..24736a1f8b 100644 --- a/lib/msal-browser/src/interaction_client/NativeInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/NativeInteractionClient.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, Logger, ICrypto, PromptValue, @@ -27,7 +26,6 @@ import { AuthError, CommonSilentFlowRequest, AccountInfo, - CacheRecord, } from "@azure/msal-common"; import { BaseInteractionClient } from "./BaseInteractionClient"; import { BrowserConfiguration } from "../config/Configuration"; @@ -54,6 +52,8 @@ import { NavigationOptions } from "../navigation/NavigationOptions"; import { INavigationClient } from "../navigation/INavigationClient"; import { BrowserAuthError } from "../error/BrowserAuthError"; import { SilentCacheClient } from "./SilentCacheClient"; +import { AuthenticationResult } from "../response/AuthenticationResult"; +import { CacheRecord } from "../cache/entities/CacheRecord"; export class NativeInteractionClient extends BaseInteractionClient { protected apiId: ApiId; diff --git a/lib/msal-browser/src/interaction_client/PopupClient.ts b/lib/msal-browser/src/interaction_client/PopupClient.ts index 98be049f56..a5c7a5233e 100644 --- a/lib/msal-browser/src/interaction_client/PopupClient.ts +++ b/lib/msal-browser/src/interaction_client/PopupClient.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, ThrottlingUtils, @@ -45,6 +44,7 @@ import { } from "../interaction_handler/InteractionHandler"; import { PopupWindowAttributes } from "../request/PopupWindowAttributes"; import { EventError } from "../event/EventMessage"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export type PopupParams = InteractionParams & { popup?: Window | null; diff --git a/lib/msal-browser/src/interaction_client/RedirectClient.ts b/lib/msal-browser/src/interaction_client/RedirectClient.ts index 9270e224fa..afcb2d24a7 100644 --- a/lib/msal-browser/src/interaction_client/RedirectClient.ts +++ b/lib/msal-browser/src/interaction_client/RedirectClient.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, UrlString, @@ -39,6 +38,7 @@ import { BrowserCacheManager } from "../cache/BrowserCacheManager"; import { EventHandler } from "../event/EventHandler"; import { INavigationClient } from "../navigation/INavigationClient"; import { EventError } from "../event/EventMessage"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export class RedirectClient extends StandardInteractionClient { protected nativeStorage: BrowserCacheManager; diff --git a/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts b/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts index 082fd81327..91759a193b 100644 --- a/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts +++ b/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, ICrypto, Logger, CommonAuthorizationCodeRequest, @@ -25,6 +24,7 @@ import { SilentHandler } from "../interaction_handler/SilentHandler"; import { AuthorizationCodeRequest } from "../request/AuthorizationCodeRequest"; import { HybridSpaAuthorizationCodeClient } from "./HybridSpaAuthorizationCodeClient"; import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export class SilentAuthCodeClient extends StandardInteractionClient { private apiId: ApiId; diff --git a/lib/msal-browser/src/interaction_client/SilentCacheClient.ts b/lib/msal-browser/src/interaction_client/SilentCacheClient.ts index 6c8717c711..06291824ff 100644 --- a/lib/msal-browser/src/interaction_client/SilentCacheClient.ts +++ b/lib/msal-browser/src/interaction_client/SilentCacheClient.ts @@ -6,7 +6,6 @@ import { StandardInteractionClient } from "./StandardInteractionClient"; import { CommonSilentFlowRequest, - AuthenticationResult, SilentFlowClient, ServerTelemetryManager, AccountInfo, @@ -20,6 +19,7 @@ import { BrowserAuthError, BrowserAuthErrorMessage, } from "../error/BrowserAuthError"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export class SilentCacheClient extends StandardInteractionClient { /** @@ -48,7 +48,7 @@ export class SilentCacheClient extends StandardInteractionClient { try { const cachedToken = await silentAuthClient.acquireCachedToken( silentRequest - ); + ) as AuthenticationResult; acquireTokenMeasurement.endMeasurement({ success: true, diff --git a/lib/msal-browser/src/interaction_client/SilentIframeClient.ts b/lib/msal-browser/src/interaction_client/SilentIframeClient.ts index b99b9c24c8..c6db31faf7 100644 --- a/lib/msal-browser/src/interaction_client/SilentIframeClient.ts +++ b/lib/msal-browser/src/interaction_client/SilentIframeClient.ts @@ -4,7 +4,6 @@ */ import { - AuthenticationResult, ICrypto, Logger, StringUtils, @@ -31,6 +30,7 @@ import { SilentHandler } from "../interaction_handler/SilentHandler"; import { SsoSilentRequest } from "../request/SsoSilentRequest"; import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler"; import { NativeInteractionClient } from "./NativeInteractionClient"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export class SilentIframeClient extends StandardInteractionClient { protected apiId: ApiId; diff --git a/lib/msal-browser/src/interaction_client/SilentRefreshClient.ts b/lib/msal-browser/src/interaction_client/SilentRefreshClient.ts index d1b11148d5..4d597af654 100644 --- a/lib/msal-browser/src/interaction_client/SilentRefreshClient.ts +++ b/lib/msal-browser/src/interaction_client/SilentRefreshClient.ts @@ -6,7 +6,6 @@ import { StandardInteractionClient } from "./StandardInteractionClient"; import { CommonSilentFlowRequest, - AuthenticationResult, ServerTelemetryManager, RefreshTokenClient, AuthError, @@ -15,6 +14,7 @@ import { } from "@azure/msal-common"; import { ApiId } from "../utils/BrowserConstants"; import { BrowserAuthError } from "../error/BrowserAuthError"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export class SilentRefreshClient extends StandardInteractionClient { /** @@ -58,6 +58,7 @@ export class SilentRefreshClient extends StandardInteractionClient { ); return refreshTokenClient .acquireTokenByRefreshToken(silentRequest) + .then((result) => result as AuthenticationResult) .then((result: AuthenticationResult) => { acquireTokenMeasurement.endMeasurement({ success: true, diff --git a/lib/msal-browser/src/interaction_handler/InteractionHandler.ts b/lib/msal-browser/src/interaction_handler/InteractionHandler.ts index 2181e7b8d8..10e5460b67 100644 --- a/lib/msal-browser/src/interaction_handler/InteractionHandler.ts +++ b/lib/msal-browser/src/interaction_handler/InteractionHandler.ts @@ -7,7 +7,6 @@ import { AuthorizationCodePayload, StringUtils, CommonAuthorizationCodeRequest, - AuthenticationResult, AuthorizationCodeClient, AuthorityFactory, Authority, @@ -26,6 +25,7 @@ import { BrowserAuthErrorMessage, } from "../error/BrowserAuthError"; import { TemporaryCacheKeys } from "../utils/BrowserConstants"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export type InteractionParams = {}; @@ -185,7 +185,7 @@ export class InteractionHandler { const tokenResponse = await this.authModule.acquireToken( this.authCodeRequest, authCodeResponse - ); + ) as AuthenticationResult; this.browserStorage.cleanRequestByState(state); return tokenResponse; } diff --git a/lib/msal-browser/src/interaction_handler/RedirectHandler.ts b/lib/msal-browser/src/interaction_handler/RedirectHandler.ts index 9b599d0add..f1fa5b57a8 100644 --- a/lib/msal-browser/src/interaction_handler/RedirectHandler.ts +++ b/lib/msal-browser/src/interaction_handler/RedirectHandler.ts @@ -8,7 +8,6 @@ import { StringUtils, CommonAuthorizationCodeRequest, ICrypto, - AuthenticationResult, Authority, INetworkModule, ClientAuthError, @@ -25,6 +24,7 @@ import { BrowserCacheManager } from "../cache/BrowserCacheManager"; import { InteractionHandler, InteractionParams } from "./InteractionHandler"; import { INavigationClient } from "../navigation/INavigationClient"; import { NavigationOptions } from "../navigation/NavigationOptions"; +import { AuthenticationResult } from "../response/AuthenticationResult"; export type RedirectParams = InteractionParams & { navigationClient: INavigationClient; @@ -217,7 +217,7 @@ export class RedirectHandler extends InteractionHandler { const tokenResponse = await this.authModule.acquireToken( this.authCodeRequest, authCodeResponse - ); + ) as AuthenticationResult; this.browserStorage.cleanRequestByState(state); return tokenResponse; diff --git a/lib/msal-browser/src/internals.ts b/lib/msal-browser/src/internals.ts index e10b53f890..6239bca61b 100644 --- a/lib/msal-browser/src/internals.ts +++ b/lib/msal-browser/src/internals.ts @@ -11,6 +11,9 @@ // Cache Manager export { BrowserCacheManager } from "./cache/BrowserCacheManager"; +// Cache entities +export { CacheRecord } from "./cache/entities/CacheRecord"; + // Clients export { StandardInteractionClient } from "./interaction_client/StandardInteractionClient"; export { RedirectClient } from "./interaction_client/RedirectClient"; diff --git a/lib/msal-browser/src/response/AuthenticationResult.ts b/lib/msal-browser/src/response/AuthenticationResult.ts new file mode 100644 index 0000000000..1d921fd3c5 --- /dev/null +++ b/lib/msal-browser/src/response/AuthenticationResult.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { AccountInfo, AuthenticationResult as CommonAuthenticationResult } from "@azure/msal-common"; + +export type AuthenticationResult = CommonAuthenticationResult & { + account: AccountInfo; +}; diff --git a/lib/msal-browser/test/app/PublicClientApplication.spec.ts b/lib/msal-browser/test/app/PublicClientApplication.spec.ts index 9b3c0a3e77..5d18f599ab 100644 --- a/lib/msal-browser/test/app/PublicClientApplication.spec.ts +++ b/lib/msal-browser/test/app/PublicClientApplication.spec.ts @@ -28,7 +28,6 @@ import { Constants, AccountInfo, TokenClaims, - AuthenticationResult, CommonAuthorizationUrlRequest, AuthorizationCodeClient, ResponseMode, @@ -94,6 +93,7 @@ import { NativeTokenRequest } from "../../src/broker/nativeBroker/NativeRequest" import { NativeAuthError } from "../../src/error/NativeAuthError"; import { StandardController } from "../../src/controllers/StandardController"; import { BrowserPerformanceMeasurement } from "../../src/telemetry/BrowserPerformanceMeasurement"; +import { AuthenticationResult } from "../../src/response/AuthenticationResult"; const cacheConfig = { temporaryCacheLocation: BrowserCacheLocation.SessionStorage, diff --git a/lib/msal-browser/test/interaction_client/PopupClient.spec.ts b/lib/msal-browser/test/interaction_client/PopupClient.spec.ts index 4dd948f43b..d04cdafc04 100644 --- a/lib/msal-browser/test/interaction_client/PopupClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/PopupClient.spec.ts @@ -23,7 +23,6 @@ import { Constants, AccountInfo, TokenClaims, - AuthenticationResult, CommonAuthorizationUrlRequest, AuthorizationCodeClient, ResponseMode, @@ -56,6 +55,7 @@ import { import { FetchClient } from "../../src/network/FetchClient"; import { InteractionHandler } from "../../src/interaction_handler/InteractionHandler"; import { getDefaultPerformanceClient } from "../utils/TelemetryUtils"; +import { AuthenticationResult } from "../../src/response/AuthenticationResult"; const testPopupWondowDefaults = { height: BrowserConstants.POPUP_HEIGHT, diff --git a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts index 9dd8111624..19c7bb28e4 100644 --- a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts @@ -25,7 +25,6 @@ import { Constants, AccountInfo, TokenClaims, - AuthenticationResult, CommonAuthorizationCodeRequest, CommonAuthorizationUrlRequest, AuthToken, @@ -72,6 +71,7 @@ import { EventType } from "../../src/event/EventType"; import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient"; import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler"; import { getDefaultPerformanceClient } from "../utils/TelemetryUtils"; +import { AuthenticationResult } from "../../src/response/AuthenticationResult"; const cacheConfig = { cacheLocation: BrowserCacheLocation.SessionStorage, diff --git a/lib/msal-browser/test/interaction_client/SilentAuthCodeClient.spec.ts b/lib/msal-browser/test/interaction_client/SilentAuthCodeClient.spec.ts index de42b024b5..48424badc7 100644 --- a/lib/msal-browser/test/interaction_client/SilentAuthCodeClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/SilentAuthCodeClient.spec.ts @@ -17,7 +17,6 @@ import { import { AccountInfo, TokenClaims, - AuthenticationResult, AuthorizationCodeClient, AuthenticationScheme, } from "@azure/msal-common"; @@ -25,7 +24,7 @@ import { BrowserAuthError } from "../../src/error/BrowserAuthError"; import { SilentHandler } from "../../src/interaction_handler/SilentHandler"; import { CryptoOps } from "../../src/crypto/CryptoOps"; import { SilentAuthCodeClient } from "../../src/interaction_client/SilentAuthCodeClient"; -import { ApiId, AuthorizationCodeRequest } from "../../src"; +import { ApiId, AuthorizationCodeRequest, AuthenticationResult } from "../../src"; describe("SilentAuthCodeClient", () => { let silentAuthCodeClient: SilentAuthCodeClient; diff --git a/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts b/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts index 9947b37c79..7052f64d1a 100644 --- a/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts @@ -19,7 +19,6 @@ import { AccountInfo, TokenClaims, PromptValue, - AuthenticationResult, CommonAuthorizationUrlRequest, AuthorizationCodeClient, ResponseMode, @@ -34,7 +33,7 @@ import { SilentHandler } from "../../src/interaction_handler/SilentHandler"; import { CryptoOps } from "../../src/crypto/CryptoOps"; import { SilentIframeClient } from "../../src/interaction_client/SilentIframeClient"; import { BrowserCacheManager } from "../../src/cache/BrowserCacheManager"; -import { ApiId } from "../../src"; +import { ApiId, AuthenticationResult } from "../../src"; import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient"; import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler"; import { getDefaultPerformanceClient } from "../utils/TelemetryUtils"; From 50fd23ef9af8d4da68030a9a5e06ea3152bdf8e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Do=C4=9Fan=20Eri=C5=9Fen?= Date: Thu, 29 Jun 2023 16:46:37 -0700 Subject: [PATCH 2/8] Update msal-node samples list (#6172) This PR: - Removes links to redundant and/or defunct samples from READMEs - Removes the ExpressTestApp to reduce clutter - Updates README listing samples with links to new samples - Minor corrections wrt sample classifications --- lib/msal-node/README.md | 2 - .../msal-node-samples/ExpressTestApp/.npmrc | 1 - .../ExpressTestApp/README.md | 132 ------ .../ExpressTestApp/TestApp/.npmrc | 1 - .../ExpressTestApp/TestApp/App/app.js | 72 ---- .../TestApp/App/controllers/mainController.js | 41 -- .../TestApp/App/public/404.html | 1 - .../TestApp/App/public/style.css | 27 -- .../TestApp/App/routes/router.js | 27 -- .../TestApp/App/utils/cachePlugin.js | 75 ---- .../TestApp/App/utils/fetchManager.js | 33 -- .../TestApp/App/utils/persistenceHelper.js | 18 - .../ExpressTestApp/TestApp/App/views/home.ejs | 38 -- .../ExpressTestApp/TestApp/App/views/id.ejs | 45 -- .../TestApp/App/views/includes/footer.ejs | 7 - .../TestApp/App/views/includes/navbar.ejs | 11 - .../TestApp/App/views/profile.ejs | 50 --- .../TestApp/App/views/tenant.ejs | 50 --- .../ExpressTestApp/TestApp/README.md | 107 ----- .../ExpressTestApp/TestApp/appSettings.json | 24 -- .../ExpressTestApp/TestApp/package.json | 26 -- .../ExpressTestApp/package.json | 31 -- .../ExpressTestApp/src/AuthProvider.ts | 398 ------------------ .../ExpressTestApp/src/ConfigurationUtils.ts | 79 ---- .../ExpressTestApp/src/Constants.ts | 55 --- .../ExpressTestApp/src/TokenValidator.ts | 99 ----- .../ExpressTestApp/src/Types.ts | 61 --- .../ExpressTestApp/tsconfig.json | 17 - .../ExpressTestApp/tslint.json | 9 - samples/msal-node-samples/README.md | 27 +- 30 files changed, 14 insertions(+), 1550 deletions(-) delete mode 100644 samples/msal-node-samples/ExpressTestApp/.npmrc delete mode 100644 samples/msal-node-samples/ExpressTestApp/README.md delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/.npmrc delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/app.js delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/controllers/mainController.js delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/public/404.html delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/public/style.css delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/routes/router.js delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/cachePlugin.js delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/fetchManager.js delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/persistenceHelper.js delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/views/home.ejs delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/views/id.ejs delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/footer.ejs delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/navbar.ejs delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/views/profile.ejs delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/App/views/tenant.ejs delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/README.md delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/appSettings.json delete mode 100644 samples/msal-node-samples/ExpressTestApp/TestApp/package.json delete mode 100644 samples/msal-node-samples/ExpressTestApp/package.json delete mode 100644 samples/msal-node-samples/ExpressTestApp/src/AuthProvider.ts delete mode 100644 samples/msal-node-samples/ExpressTestApp/src/ConfigurationUtils.ts delete mode 100644 samples/msal-node-samples/ExpressTestApp/src/Constants.ts delete mode 100644 samples/msal-node-samples/ExpressTestApp/src/TokenValidator.ts delete mode 100644 samples/msal-node-samples/ExpressTestApp/src/Types.ts delete mode 100644 samples/msal-node-samples/ExpressTestApp/tsconfig.json delete mode 100644 samples/msal-node-samples/ExpressTestApp/tslint.json diff --git a/lib/msal-node/README.md b/lib/msal-node/README.md index 504518dc2e..39a2dfb00d 100644 --- a/lib/msal-node/README.md +++ b/lib/msal-node/README.md @@ -112,13 +112,11 @@ AAD samples: - [on-behalf-of](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-node-samples/on-behalf-of): Web application using OAuth 2.0 auth code flow to acquire a token for a web API. The web API validates the token, and calls Microsoft Graph on behalf of the user who authenticated in the web application. - [username-password](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-node-samples/username-password): Web application using OAuth 2.0 resource owner password credentials (ROPC) flow to acquire a token for a web API. - [ElectronTestApp](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-node-samples/ElectronTestApp): Electron desktop application using OAuth 2.0 auth code with PKCE flow to acquire a token for a web API such as Microsoft Graph. -- [ExpressTestApp](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-node-samples/ExpressTestApp): Express.js MVC web application using OAuth 2.0 auth code with PKCE flow to acquire a token for a web API such as Microsoft Graph. - [Hybrid Spa Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-browser-samples/HybridSample): Sample demonstrating how to use `enableSpaAuthorizationCode` to perform SSO for applications that leverage server-side and client-side authentication using MSAL Browser and MSAL Node. B2C samples: - [b2c-user-flows](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-node-samples/b2c-user-flows): Express app using OAuth2.0 authorization code flow. -- [ms-identity-b2c-javascript-nodejs-management](https://github.com/Azure-Samples/ms-identity-b2c-javascript-nodejs-management/tree/main/Chapter2): Command line app using OAuth 2.0 client credentials flow for performing user management operations on an Azure AD / Azure AD B2C tenant Others: diff --git a/samples/msal-node-samples/ExpressTestApp/.npmrc b/samples/msal-node-samples/ExpressTestApp/.npmrc deleted file mode 100644 index 43c97e719a..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/samples/msal-node-samples/ExpressTestApp/README.md b/samples/msal-node-samples/ExpressTestApp/README.md deleted file mode 100644 index d45d6469b6..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# Securing an Express MVC web app with MSAL Node - -This sample illustrates a simple wrapper around **MSAL Node** to handle login, logout, and token acquisition. The wrapper is implemented in **TypeScript** and located under the `src/` folder. - -The wrapper handles authentication with both **Azure AD** and **Azure AD B2C**. A test application is provided under the `TestApp/` folder. It follows a standard MVC web app pattern in [Express.js](https://expressjs.com/) framework. See the [README](./TestApp/README.md) for registering and running the test app - -## Usage - -1. Start by building the wrapper: - - ```console - cd ExpressTestApp - npm run build - ``` - -2. Then, initialize the wrapper by providing a settings file in JSON (see: [appSettings.json](./TestApp/appSettings.json)). The file looks like the following: - - ```JSON - { - "credentials": { - "clientId": "CLIENT_ID", - "tenantId": "TENANT_ID", - "clientSecret": "CLIENT_SECRET" - }, - "settings": { - "homePageRoute": "/home", - "redirectUri": "http://localhost:4000/redirect", - "postLogoutRedirectUri": "http://localhost:4000" - } - } - ``` - -3. Add the web API endpoints you would like to call under **resources**: - - ```JSON - { - // ... - "resources": { - "graphAPI": { - "callingPageRoute": "/profile", - "endpoint": "https://graph.microsoft.com/v1.0/me", - "scopes": ["user.read"] - }, - } - } - ``` - -4. If you are authenticating with **Azure AD B2C**, user-flows and/or policies should be provided as well: - - ```JSON - { - // ... - "policies": { - "signUpSignIn": { - "authority": "https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/B2C_1_susi" - }, - "authorityDomain": "fabrikamb2c.b2clogin.com" - } - } - ``` - -5. Install and run the sample app: - - ```bash - cd TestApp && \ - npm install && \ - npm start - ``` - -6. Open a browser at `http://localhost:4000`. - -## Integration with the Express.js authentication wrapper - -To initialize the wrapper, import it and supply the settings file and an (optional) persistent cache plugin as shown below: - -```javascript -const settings = require('../../appSettings.json'); -const cachePlugin = require('../utils/cachePlugin'); - -const msalWrapper = require('msal-express-wrapper/dist/AuthProvider'); - -const authProvider = new msalWrapper.AuthProvider(settings, cachePlugin); -``` - -Once the wrapper is initialized, you can use it as below: - -### Authentication - -These routes are dedicated to the wrapper for handing authorization and token requests. They do not serve any page. - -```javascript -// authentication routes -app.get('/signin', authProvider.signIn); -app.get('/signout', authProvider.signOut); -app.get('/redirect', authProvider.handleRedirect); -``` - -### Securing routes - -Simply add the `isAuthenticated` middleware before the controller that serves the page you would like to secure: - -```javascript -// secure routes -app.get('/id', authProvider.isAuthenticated, mainController.getIdPage); -``` - -### Acquiring tokens - -Simply add the `getToken` middleware before the controller that makes a call to the web API that you would like to access. The access token will be available as a *session variable*: - -```javascript -// secure routes that call protected resources -app.get('/profile', authProvider.isAuthenticated, authProvider.getToken, mainController.getProfilePage); // get token for this route to call web API -``` - -## Remarks - -### Session support - -Session support in this sample is provided by the [express-session](https://www.npmjs.com/package/express-session) package, using [Redis](https://redis.io/) and [node-redis](https://github.com/NodeRedis/node-redis) to persist the session cache. There are other [compatible session stores](https://github.com/expressjs/session#compatible-session-stores) that you may use instead of Redis, e.g. MongoDB or SQL. - -### Token caching - -MSAL Node has an in-memory cache by default. The demo app also features a [persistent cache plugin](./TestApp/App/utils/cachePlugin.js) in order to save the cache to disk. It illustrates a distributed caching pattern where MSAL's token cache is persisted via an external service (here, Redis) and only the currently served user's tokens (and other authentication artifacts) are loaded into MSAL's memory. - -To do so, a persistence helper that implements basic Redis calls is illustrated in [persistenceHelper.js](./TestApp/App/utils/persistenceHelper.js). When you implement a persistence manager, you should also assign cache eviction policies, handle connection events from persistence server and take performance metrics such as cache hit ratios. For more on caching, see [Caching](../../../lib/msal-node/docs/caching.md). - -## More information - -* [Initializing a confidential client app with MSAL Node](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/initialize-confidential-client-application.md) -* [MSAL Node Configuration options](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/configuration.md) -* [Scenario: A web app that calls web APIs](https://docs.microsoft.com/azure/active-directory/develop/scenario-web-app-call-api-overview) diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/.npmrc b/samples/msal-node-samples/ExpressTestApp/TestApp/.npmrc deleted file mode 100644 index 43c97e719a..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/app.js b/samples/msal-node-samples/ExpressTestApp/TestApp/App/app.js deleted file mode 100644 index 56bba54732..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/app.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -const path = require('path'); -const redis = require('redis'); -const express = require('express'); -const session = require('express-session'); -const RedisStore = require('connect-redis')(session); // persist session in redis - -const msalWrapper = require('msal-express-wrapper/dist/AuthProvider'); -const appSettings = require('../appSettings.json'); -const router = require('./routes/router'); - -const SERVER_PORT = process.env.PORT || 4000; - -/** -* Instantiate the redis client, which is used in persistenceHelper. -* This provides basic get and set methods for the cachePlugin. -*/ -const redisClient = redis.createClient(); -redisClient.on('error', console.error); - -const persistenceHelper = require('./utils/persistenceHelper')(redisClient); -const cachePlugin = require('./utils/cachePlugin')(persistenceHelper); - -const app = express(); - -app.set('views', path.join(__dirname, './views')); -app.set('view engine', 'ejs'); - -app.use('/css', express.static(path.join(__dirname, 'node_modules/bootstrap/dist/css'))); -app.use('/js', express.static(path.join(__dirname, 'node_modules/bootstrap/dist/js'))); - -app.use(express.urlencoded({ extended: false })); - -app.use(express.static(path.join(__dirname, './public'))); - -/** - * Using express-session middleware. Be sure to familiarize yourself with available options - * and set the desired options. Visit: https://www.npmjs.com/package/express-session - */ -app.use(session({ - store: new RedisStore({ client: redisClient }), - secret: 'ENTER_YOUR_SECRET_HERE', - resave: false, - saveUninitialized: false, - cookie: { - secure: false, // set this to true when deploying - } -})); - -const authProvider = new msalWrapper.AuthProvider(appSettings, cachePlugin); - -/** -* When using a distributed token cache, msal's in-memory cache should only load -* the cache blob for the currently served user from the persistence store (here, Redis). -* This custom middleware first passes the session variable to cachePlugin object, and -* then re-initializes msal's token cache plugin. -*/ -function initializeTokenCachePlugin(req, res, next) { - const cachePlugin = require('./utils/cachePlugin')(persistenceHelper, req.session.id); - authProvider.msalClient.tokenCache.persistence = cachePlugin; - next(); -} - -app.use(initializeTokenCachePlugin); - -app.use(router(authProvider)); - -app.listen(SERVER_PORT, () => console.log(`Msal Node Auth Code Sample app listening on port ${SERVER_PORT}!`)); \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/controllers/mainController.js b/samples/msal-node-samples/ExpressTestApp/TestApp/App/controllers/mainController.js deleted file mode 100644 index 21721574bb..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/controllers/mainController.js +++ /dev/null @@ -1,41 +0,0 @@ -const fetchManager = require('../utils/fetchManager'); -const appSettings = require('../../appSettings.json'); - -exports.getHomePage = (req, res, next) => { - res.render('home', { isAuthenticated: req.session.isAuthenticated }); -} - -exports.getIdPage = (req, res, next) => { - const claims = { - name: req.session.account.idTokenClaims.name, - preferred_username: req.session.account.idTokenClaims.preferred_username, - oid: req.session.account.idTokenClaims.oid, - sub: req.session.account.idTokenClaims.sub - }; - - res.render('id', { isAuthenticated: req.session.isAuthenticated, claims: claims }); -} - -exports.getProfilePage = async(req, res, next) => { - let profile; - - try { - profile = await fetchManager.callAPI(appSettings.resources.graphAPI.endpoint, req.session["graphAPI"].accessToken); - res.render('profile', { isAuthenticated: req.session.isAuthenticated, profile: profile }); - } catch (error) { - console.log(error); - next(error); - } -} - -exports.getTenantPage = async(req, res, next) => { - let tenant; - - try { - tenant = await fetchManager.callAPI(appSettings.resources.armAPI.endpoint, req.session["armAPI"].accessToken); - res.render('tenant', { isAuthenticated: req.session.isAuthenticated, tenant: tenant.value[0] }); - } catch (error) { - console.log(error); - next(error); - } -} \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/public/404.html b/samples/msal-node-samples/ExpressTestApp/TestApp/App/public/404.html deleted file mode 100644 index e28f5c575b..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/public/404.html +++ /dev/null @@ -1 +0,0 @@ -Page Not Found \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/public/style.css b/samples/msal-node-samples/ExpressTestApp/TestApp/App/public/style.css deleted file mode 100644 index 601677a08b..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/public/style.css +++ /dev/null @@ -1,27 +0,0 @@ -h1 { - color: red; -} - -#card-div { - min-width: 40%; - margin: 5% auto 5% auto; -} - -#form-area-div { - width: 55%; - margin: 5% auto 5% auto; -} - -.table-area-div { - width: 70%; - margin: 5% auto 5% auto; -} - -.footer { - position: fixed; - left: 0; - bottom: 0; - width: 100%; - text-align: center; -} - diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/routes/router.js b/samples/msal-node-samples/ExpressTestApp/TestApp/App/routes/router.js deleted file mode 100644 index 869a826e61..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/routes/router.js +++ /dev/null @@ -1,27 +0,0 @@ -const express = require('express'); - -const mainController = require('../controllers/mainController'); - -module.exports = (authProvider) => { - // initialize router - const router = express.Router(); - - // app routes - router.get('/', (req, res, next) => res.redirect('/home')); - router.get('/home', mainController.getHomePage); - - // authentication routes - router.get('/signin', authProvider.signIn); - router.get('/signout', authProvider.signOut); - router.get('/redirect', authProvider.handleRedirect); - - // secure routes - router.get('/id', authProvider.isAuthenticated, mainController.getIdPage); - router.get('/profile', authProvider.isAuthenticated, authProvider.getToken, mainController.getProfilePage); // get token for this route to call web API - router.get('/tenant', authProvider.isAuthenticated, authProvider.getToken, mainController.getTenantPage) // get token for this route to call web API - - // 404 - router.get('*', (req, res) => res.status(404).redirect('/404.html')); - - return router; -}; \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/cachePlugin.js b/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/cachePlugin.js deleted file mode 100644 index 1ba3fab4d8..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/cachePlugin.js +++ /dev/null @@ -1,75 +0,0 @@ -/** -* A custom cache plugin for persisting the msal's token cache, using a persistence solution like Redis or MongoDB -* This effectively implements the ICachePlugin interface from msal. For more information, visit: -* https://azuread.github.io/microsoft-authentication-library-for-js/ref/interfaces/_azure_msal_common.icacheplugin.html -*/ - -module.exports = (persistenceHelper, sessionId) => { - return { - beforeCacheAccess: async (cacheContext) => { - return new Promise(async (resolve, reject) => { - - // express session ids start with the prefix "sess:" - persistenceHelper.get("sess:" + sessionId, (err, sessionData) => { - if (err) { - console.log(err); - reject(err); - } - - if (sessionData) { - try { - const parsedSessionData = JSON.parse(sessionData); // parse the session data - - persistenceHelper.get(parsedSessionData.account.homeAccountId, (err, cacheData) => { - if (err) { - console.log(err); - reject(err); - } - cacheContext.tokenCache.deserialize(cacheData); - resolve(); - }); - - } catch (err) { - console.log(err) - reject(err); - } - } else { - resolve(); - return; - } - }); - - }); - }, - afterCacheAccess: async (cacheContext) => { - return new Promise((resolve, reject) => { - - if (cacheContext.cacheHasChanged) { - const kvStore = cacheContext.tokenCache.getKVStore(); - - if (Object.keys(kvStore).length > 0) { - const accountEntity = Object.values(kvStore)[1]; // the second entity is the account - - if (accountEntity.hasOwnProperty("homeAccountId")) { - const homeAccountId = accountEntity.homeAccountId; // the homeAccountId is the partition key - - persistenceHelper.set(homeAccountId, cacheContext.tokenCache.serialize(), (err, data) => { - if (err) { - console.log(err); - reject(err); - } - resolve(); - }); - - } else { - reject(new Error("homeAccountId is not defined")); - } - } - } else { - resolve(); - return; - } - }); - } - }; -}; \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/fetchManager.js b/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/fetchManager.js deleted file mode 100644 index 11fc61aa9f..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/fetchManager.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -const { default: axios } = require('axios'); - -callAPI = async(endpoint, accessToken) => { - - if (!accessToken || accessToken === "") { - throw new Error('No tokens found') - } - - const options = { - headers: { - Authorization: `Bearer ${accessToken}` - } - }; - - console.log('request made to web API at: ' + new Date().toString()); - - try { - const response = await axios.default.get(endpoint, options); - return response.data; - } catch(error) { - console.log(error) - return error; - } -} - -module.exports = { - callAPI -}; \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/persistenceHelper.js b/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/persistenceHelper.js deleted file mode 100644 index 72980e8a90..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/utils/persistenceHelper.js +++ /dev/null @@ -1,18 +0,0 @@ -/** -* Simple persistence client helper, using Redis (node-redis). -* You must have redis installed on your machine and have redis server listening. -* Note that this is only for illustration, and you'll likely need to consider cache eviction policies and handle cache server connection issues. -* For more information, visit: https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/caching.md -*/ - -module.exports = (client) => { - return { - get: (key, callback) => { - client.get(key, callback); - }, - // For demo purposes, the client does not set sliding expiration, see the docs https://redis.io/commands/setex - set: (key, value, callback) => { - client.set(key, value, callback); - }, - } -}; \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/home.ejs b/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/home.ejs deleted file mode 100644 index 7be0c9c112..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/home.ejs +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - Home - - - - <%- include('includes/navbar', {isAuthenticated: isAuthenticated}); %> - -
-
-
-
- <% if (isAuthenticated) { %> -
Welcome!
- Get my profile - Get my tenant - <% } else { %> -
Sign-in to access your resources
- <% } %> -
-
-
-
- - <%- include('includes/footer'); %> - - - - - - - \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/id.ejs b/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/id.ejs deleted file mode 100644 index ca5f434d43..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/id.ejs +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - ID - - - - <%- include('includes/navbar', {isAuthenticated: isAuthenticated}); %> - - -
-

Some of the important claims in your ID token are shown below:

-
- -
- - - - - - - - - <% for (const [key, value] of Object.entries(claims)) { %> - - - - - <% } %> - -
ClaimValue
<%= key %><%= value %>
-
- - <%- include('includes/footer'); %> - - - - - - \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/footer.ejs b/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/footer.ejs deleted file mode 100644 index 65c287dcf7..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/footer.ejs +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/navbar.ejs b/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/navbar.ejs deleted file mode 100644 index 0b7c1bdf49..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/includes/navbar.ejs +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/profile.ejs b/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/profile.ejs deleted file mode 100644 index bc9c1f2310..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/profile.ejs +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - Profile - - - - <%- include('includes/navbar', {isAuthenticated: isAuthenticated}); %> - -
-

Calling Microsoft Graph API...

-
    -
  • resource: User object
  • -
  • endpoint: https://graph.microsoft.com/v1.0/me
  • -
  • scope: user.read
  • -
-

Contents of the response is below:

-
- -
- - - - - - - - - <% for (const [key, value] of Object.entries(profile)) { %> - - - - - <% } %> - -
ClaimValue
<%= key %><%= value %>
-
- - <%- include('includes/footer'); %> - - - - - - \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/tenant.ejs b/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/tenant.ejs deleted file mode 100644 index a9ed33bcd2..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/App/views/tenant.ejs +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - Tenant - - - - <%- include('includes/navbar', {isAuthenticated: isAuthenticated}); %> - -
-

Calling Azure Resource Manager API...

-
    -
  • resource: Tenant object
  • -
  • endpoint: https://management.azure.com/tenants?api-version=2020-01-01
  • -
  • scope: https://management.azure.com/user_impersonation
  • -
-

Contents of the response is below:

-
- -
- - - - - - - - - <% for (const [key, value] of Object.entries(tenant)) { %> - - - - - <% } %> - -
ClaimValue
<%= key %><%= value %>
-
- - <%- include('includes/footer'); %> - - - - - - \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/README.md b/samples/msal-node-samples/ExpressTestApp/TestApp/README.md deleted file mode 100644 index 1858efaad7..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# Overview - -This sample demonstrates a Node.js & Express web application that authenticates users against [Azure Active Directory](https://docs.microsoft.com/azure/active-directory/fundamentals/active-directory-whatis) (Azure AD) and obtains [Access Tokens](https://docs.microsoft.com/azure/active-directory/develop/access-tokens) to call the [Microsoft Graph API](https://docs.microsoft.com/graph/overview) (Graph API) and the [Azure Resource Manager API](https://docs.microsoft.com/azure/azure-resource-manager/management/overview) (ARM API), with the help of [Microsoft Authentication Library for Node.js](https://aka.ms/msalnode) (MSAL Node). It uses Redis for caching session and tokens. - -See also: [Caching](../../../../lib/msal-node/docs/caching.md) - -## Scenario - -1. The client application uses the **MSAL Node** to sign-in a user and obtain a JWT **Access Token** from **Azure AD**. -1. The **Access Token** is used as a *bearer* token to authorize the user to access the **resource** (Graph API or ARM API). -1. The **resource** responds with the data that the user has access to. - -## Contents - -| File/folder | Description | -|-------------------------------------|---------------------------------------------------------------| -| `App/app.js` | Application entry point. | -| `App/appSettings.json` | Application settings and authentication parameters. | -| `App/routes/router.js` | Application routes are defined here. | -| `App/controllers/mainController.js` | Main application controllers. | -| `App/utils/cachePlugin.js` | Example cache plugin implementation for saving cache to disk. | -| `App/utils/persistenceHelper.js` | Example Redis persistence store client, used with cache plugin. | - -## Prerequisites - -- [Node.js](https://nodejs.org/en/download/) must be installed to run this sample. -- [Visual Studio Code](https://code.visualstudio.com/download) is recommended for running and editing this sample. -- (Optional) [Redis](https://redis.io/) if you like to persist the app's token cache. -- An **Azure AD** tenant. For more information, see: [How to get an Azure AD tenant](https://docs.microsoft.com/azure/active-directory/develop/quickstart-create-new-tenant) -- A user account in your **Azure AD** tenant. - -## Setup - -Locate the root of the sample folder (i.e. `TestApp`). Then: - -```console - npm install -``` - -## Registration - -### Register the web app - -1. Navigate to the [Azure portal](https://portal.azure.com) and select the **Azure AD** service. -1. Select the **App Registrations** blade on the left, then select **New registration**. -1. In the **Register an application page** that appears, enter your application's registration information: - - In the **Name** section, enter a meaningful application name that will be displayed to users of the app, for example `ExpressWebApp`. - - Under **Supported account types**, select **Accounts in this organizational directory only**. - - In the **Redirect URI (optional)** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:4000/redirect`. -1. Select **Register** to create the application. -1. In the app's registration screen, find and note the **Application (client) ID**. You use this value in your app's configuration file(s) later in your code. -1. Select **Save** to save your changes. -1. In the app's registration screen, select the **Certificates & secrets** blade in the left to open the page where we can generate secrets and upload certificates. -1. In the **Client secrets** section, select **New client secret**: - - Type a key description (for instance `app secret`), - - Select one of the available key durations (**In 1 year**, **In 2 years**, or **Never Expires**) as per your security posture. - - The generated key value will be displayed when you select the **Add** button. Copy the generated value for use in the steps later. - - You'll need this key later in your code's configuration files. This key value will not be displayed again, and is not retrievable by any other means, so make sure to note it from the Azure portal before navigating to any other screen or blade. -1. In the app's registration screen, select the **API permissions** blade in the left to open the page where we add access to the APIs that your application needs. - - Select the **Add a permission** button and then, - - Ensure that the **Microsoft APIs** tab is selected. - - In the *Commonly used Microsoft APIs* section, select **Microsoft Graph** - - In the **Delegated permissions** section, select the **User.Read** in the list. Use the search box if necessary. - - Select the **Add permissions** button at the bottom. -1. Still in the **API permissions** blade, - - Select the **Add a permission** button and then, - - Ensure that the **Microsoft APIs** tab is selected. - - In the *Commonly used Microsoft APIs* section, select **Azure Service Management** - - In the **Delegated permissions** section, select the **user_impersonation** in the list. Use the search box if necessary. - - Select the **Add permissions** button at the bottom. - -### Configure the web app to use your app registration - -Open the project in your IDE (like Visual Studio or Visual Studio Code) to configure the code. - -> In the steps below, "ClientID" is the same as "Application ID" or "AppId". - -1. Open the `./App/appSettings.json` file. -1. Find the key `clientId` and replace the existing value with the **application ID** (clientId) of the `ExpressWebApp` application copied from the Azure Portal. -1. Find the key `tenantId` and replace the existing value with your Azure AD **tenant ID**. -1. Find the key `clientSecret` and replace the existing value with the key you saved during the creation of the `ExpressWebApp` app, in the Azure Portal. -1. Find the key `homePageRoute` and replace the existing value with the route that you wish to be redirected after sign-in, e.g. `/home`. -1. Find the key `redirectUri` and replace the existing value with the **Redirect URI** for `ExpressWebApp` app. For example, `http://localhost:4000/redirect`. -1. Find the `postLogoutRedirectUri` and replace the existing value with the URI that you wish to be redirected after sign-out, e.g. `http://localhost:4000/` - -## Running the sample - -Make sure that Redis server is currently running. Start the Redis server if needed. You will need [WSL](https://docs.microsoft.com/windows/wsl/install-win10) if on Windows: - -```console - redis-server -``` - -> : information_source: On Windows, you may use [WSL](https://docs.microsoft.com/windows/wsl/install-win10) to run above - -Locate the root of the sample folder (i.e. `TestApp`). Then: - -```console - npm start -``` - -## Explore the sample - -1. Open your browser and navigate to `http://localhost:4000`. -1. Click the **Sign-in** button on the top right corner. -1. Once you sign-in, click on the **See my profile** button to call **Microsoft Graph**. -1. Once you sign-in, click on the **Get my tenant** button to call **Azure Resource Manager**. diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/appSettings.json b/samples/msal-node-samples/ExpressTestApp/TestApp/appSettings.json deleted file mode 100644 index 59af2efad5..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/appSettings.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "credentials": { - "clientId": "Enter_the_Application_Id_Here", - "tenantId": "Enter_the_Tenant_Info_Here", - "clientSecret": "Enter_the_Client_Secret_Here" - }, - "settings": { - "homePageRoute": "/home", - "redirectUri": "http://localhost:4000/redirect", - "postLogoutRedirectUri": "http://localhost:4000/" - }, - "resources": { - "graphAPI": { - "callingPageRoute": "/profile", - "endpoint": "https://graph.microsoft.com/v1.0/me", - "scopes": ["user.read"] - }, - "armAPI": { - "callingPageRoute": "/tenant", - "endpoint": "https://management.azure.com/tenants?api-version=2020-01-01", - "scopes": ["https://management.azure.com/user_impersonation"] - } - } -} diff --git a/samples/msal-node-samples/ExpressTestApp/TestApp/package.json b/samples/msal-node-samples/ExpressTestApp/TestApp/package.json deleted file mode 100644 index 7e40b10509..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/TestApp/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "express-test-app", - "version": "1.0.0", - "description": "A Node.js & Express web app calling Microsoft Graph API using MSAL Node", - "private": true, - "main": "app.js", - "scripts": { - "start": "node App/app.js", - "dev": "nodemon App/app.js" - }, - "author": "", - "license": "MIT", - "dependencies": { - "axios": "^1.4.0", - "bootstrap": "^4.5.3", - "ejs": "^3.0.1", - "express": "^4.17.1", - "express-session": "^1.17.1", - "connect-redis": "^6.0.0", - "redis": "^3.1.2", - "msal-express-wrapper": "file:../" - }, - "devDependencies": { - "nodemon": "^2.0.2" - } -} \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/package.json b/samples/msal-node-samples/ExpressTestApp/package.json deleted file mode 100644 index 056438c0b9..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "msal-express-wrapper", - "version": "1.0.0", - "description": "A simple wrapper example around MSAL Node ConfidentialClientApplication class for Express MVC web apps", - "private": true, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "tsc", - "build:package": "cd ../../../lib/msal-common && npm run build && cd ../msal-node && npm run build", - "start:build": "npm run build:package && npm start", - "install:local": "npm install ../../../lib/msal-node" - }, - "author": "", - "license": "MIT", - "devDependencies": { - "@types/express": "^4.17.8", - "@types/express-session": "^1.17.3", - "@typescript-eslint/eslint-plugin": "^4.7.0", - "@typescript-eslint/parser": "^4.7.0", - "eslint": "^7.13.0", - "typescript": "^4.0.5" - }, - "dependencies": { - "@azure/msal-node": "^2.0.0-beta.0", - "axios": "^1.4.0", - "express": "^4.17.1", - "express-session": "^1.17.1", - "uuid": "^8.3.1" - } -} \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/src/AuthProvider.ts b/samples/msal-node-samples/ExpressTestApp/src/AuthProvider.ts deleted file mode 100644 index 234c69321e..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/src/AuthProvider.ts +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -import { - Request, - Response, - NextFunction -} from "express"; - -import { - InteractionRequiredAuthError, - PromptValue -} from '@azure/msal-node'; - -import { - ConfidentialClientApplication, - Configuration, - AccountInfo, - ICachePlugin, - CryptoProvider, - AuthorizationUrlRequest, - AuthorizationCodeRequest, -} from '@azure/msal-node'; - -import { ConfigurationUtils } from './ConfigurationUtils'; -import { TokenValidator } from "./TokenValidator"; -import { - AppSettings, - Resource, - AuthCodeParams -} from './Types'; - -import { ErrorMessages } from './Constants'; - -import * as constants from './Constants'; - -/** - * A simple wrapper around MSAL Node ConfidentialClientApplication object. - * It offers a collection of middleware and utility methods that automate - * basic authentication and authorization tasks in Express MVC web apps. - * - * You must have express and express-sessions packages installed. Middleware here - * can be used with express sessions in route controllers. - * - * Session variables accessible are as follows: - * req.session.isAuthenticated: boolean - * req.session.account: AccountInfo - * req.session..accessToken: string - */ -export class AuthProvider { - - appSettings: AppSettings; - msalConfig: Configuration; - msalClient: ConfidentialClientApplication; - - private tokenValidator: TokenValidator; - private cryptoProvider: CryptoProvider; - - constructor(appSettings: AppSettings, cache: ICachePlugin = null) { - ConfigurationUtils.validateAppSettings(appSettings); - - this.cryptoProvider = new CryptoProvider(); - - this.appSettings = appSettings; - this.msalConfig = ConfigurationUtils.getMsalConfiguration(appSettings, cache); - this.msalClient = new ConfidentialClientApplication(this.msalConfig); - this.tokenValidator = new TokenValidator(this.appSettings, this.cryptoProvider); - } - - // ========== MIDDLEWARE =========== - - /** - * Initiate sign in flow - * @param {Request} req: express request object - * @param {Response} res: express response object - * @param {NextFunction} next: express next - */ - signIn = async (req: Request, res: Response, next: NextFunction): Promise => { - - /** - * Request Configuration - * We manipulate these two request objects below - * to acquire a token with the appropriate claims - */ - if (!req.session["authCodeRequest"]) { - req.session.authCodeRequest = { - authority: "", - scopes: [], - state: {}, - redirectUri: "", - } as AuthorizationUrlRequest; - } - - if (!req.session["tokenRequest"]) { - req.session.tokenRequest = { - authority: "", - scopes: [], - redirectUri: "", - code: "", - } as AuthorizationCodeRequest; - } - - // signed-in user's account - if (!req.session["account"]) { - req.session.account = { - homeAccountId: "", - environment: "", - tenantId: "", - username: "", - idTokenClaims: {}, - } as AccountInfo; - } - - // random GUID for csrf check - req.session.nonce = this.cryptoProvider.createNewGuid(); - - /** - * The OAuth 2.0 state parameter can be used to encode information of the app's state before redirect. - * You can pass the user's state in the app, such as the page or view they were on, as input to this parameter. - * MSAL allows you to pass your custom state as state parameter in the request object. For more information, visit: - * https://docs.microsoft.com/azure/active-directory/develop/msal-js-pass-custom-state-authentication-request - */ - const state = this.cryptoProvider.base64Encode( - JSON.stringify({ - stage: constants.AppStages.SIGN_IN, - path: req.route.path, - nonce: req.session.nonce - }) - ); - - const params: AuthCodeParams = { - authority: this.msalConfig.auth.authority, - scopes: ["openid", "profile"], - state: state, - redirect: this.appSettings.settings.redirectUri, - prompt: PromptValue.SELECT_ACCOUNT, - }; - - // initiate the first leg of auth code grant to get token - this.getAuthCode(req, res, next, params); - }; - - /** - * Initiate sign out and clean the session - * @param {Request} req: express request object - * @param {Response} res: express response object - * @param {NextFunction} next: express next - */ - signOut = async (req: Request, res: Response, next: NextFunction): Promise => { - - /** - * Construct a logout URI and redirect the user to end the - * session with Azure AD/B2C. For more information, visit: - * (AAD) https://docs.microsoft.com/azure/active-directory/develop/v2-protocols-oidc#send-a-sign-out-request - * (B2C) https://docs.microsoft.com/azure/active-directory-b2c/openid-connect#send-a-sign-out-request - */ - const logoutURI = `${this.msalConfig.auth.authority}/oauth2/v2.0/logout?post_logout_redirect_uri=${this.appSettings.settings.postLogoutRedirectUri}`; - - req.session.isAuthenticated = false; - - req.session.destroy(() => { - res.redirect(logoutURI); - }); - } - - /** - * Middleware that handles redirect depending on request state - * There are basically 2 stages: sign-in and acquire token - * @param {Request} req: express request object - * @param {Response} res: express response object - * @param {NextFunction} next: express next - */ - handleRedirect = async (req: Request, res: Response, next: NextFunction): Promise => { - - if (req.query.state) { - const state = JSON.parse(this.cryptoProvider.base64Decode(req.query.state as string)); - - // check if nonce matches - if (state.nonce === req.session.nonce) { - - switch (state.stage) { - - case constants.AppStages.SIGN_IN: { - // token request should have auth code - req.session.tokenRequest.code = req.query.code as string; - - try { - - // exchange auth code for tokens - const tokenResponse = await this.msalClient.acquireTokenByCode(req.session.tokenRequest) - console.log("\nResponse: \n:", tokenResponse); - - try { - /** - * Confidential web applications like ASP.NET Core must validate ID tokens sent to them by - * using the user's browser in the hybrid flow, before allowing access to a user's data or - * establishing a session. If this does not apply, the application won't benefit from validating - * the token. For more information, visit: https://learn.microsoft.com/azure/active-directory/develop/access-tokens#validate-tokens - */ - const isIdTokenValid = await this.tokenValidator.validateIdToken(tokenResponse.idToken, tokenResponse.idTokenClaims); - - if (isIdTokenValid) { - - // assign session variables - req.session.account = tokenResponse.account; - req.session.isAuthenticated = true; - - return res.status(200).redirect(this.appSettings.settings.homePageRoute); - } else { - console.log(ErrorMessages.INVALID_TOKEN); - return res.status(401).send(ErrorMessages.NOT_PERMITTED); - } - } catch (error) { - console.log(error); - next(error); - } - - } catch (error) { - console.log(error); - next(error); - } - break; - } - - case constants.AppStages.ACQUIRE_TOKEN: { - // get the name of the resource associated with scope - const resourceName = this.getResourceName(state.path); - - req.session.tokenRequest.code = req.query.code as string - - try { - const tokenResponse = await this.msalClient.acquireTokenByCode(req.session.tokenRequest); - console.log("\nResponse: \n:", tokenResponse); - - req.session[resourceName].accessToken = tokenResponse.accessToken; - return res.status(200).redirect(state.path); - - } catch (error) { - console.log(error); - next(error); - } - break; - } - - default: - res.status(500).send(ErrorMessages.CANNOT_DETERMINE_APP_STAGE); - break; - } - } else { - console.log(ErrorMessages.NONCE_MISMATCH) - res.status(401).send(ErrorMessages.NOT_PERMITTED); - } - } else { - console.log(ErrorMessages.STATE_NOT_FOUND) - res.status(401).send(ErrorMessages.NOT_PERMITTED); - } - }; - - /** - * Middleware that gets tokens and calls web APIs - * @param {Request} req: express request object - * @param {Response} res: express response object - * @param {NextFunction} next: express next - */ - getToken = async (req: Request, res: Response, next: NextFunction): Promise => { - - // get scopes for token request - const scopes = (Object.values(this.appSettings.resources) - .find((resource: Resource) => resource.callingPageRoute === req.route.path)).scopes; - - const resourceName = this.getResourceName(req.route.path); - - if (!req.session[resourceName]) { - req.session[resourceName] = { - accessToken: null, - }; - } - - try { - - const tokenCache = await this.msalClient.getTokenCache(); - const account = await tokenCache.getAccountByHomeId(req.session.account.homeAccountId); - - const silentRequest = { - account: account, - scopes: scopes, - }; - - // acquire token silently to be used in resource call - const tokenResponse = await this.msalClient.acquireTokenSilent(silentRequest) - console.log("\nSuccessful silent token acquisition:\n Response: \n:", tokenResponse); - - // In B2C scenarios, sometimes an access token is returned empty. - // In that case, we will acquire token interactively instead. - if (tokenResponse.accessToken.length === 0) { - console.log(ErrorMessages.TOKEN_NOT_FOUND); - throw new InteractionRequiredAuthError(ErrorMessages.INTERACTION_REQUIRED); - } - - req.session[resourceName].accessToken = tokenResponse.accessToken; - next(); - - } catch (error) { - // in case there are no cached tokens, initiate an interactive call - if (error instanceof InteractionRequiredAuthError) { - - const state = this.cryptoProvider.base64Encode( - JSON.stringify({ - stage: constants.AppStages.ACQUIRE_TOKEN, - path: req.route.path, - nonce: req.session.nonce - }) - ); - - const params: AuthCodeParams = { - authority: this.msalConfig.auth.authority, - scopes: scopes, - state: state, - redirect: this.appSettings.settings.redirectUri, - account: req.session.account, - }; - - // initiate the first leg of auth code grant to get token - this.getAuthCode(req, res, next, params); - } else { - next(error); - } - } - } - - // ============== GUARD =============== - - /** - * Check if authenticated in session - * @param {Request} req: express request object - * @param {Response} res: express response object - * @param {NextFunction} next: express next - */ - isAuthenticated = (req: Request, res: Response, next: NextFunction): Response | void => { - if (req.session) { - if (!req.session.isAuthenticated) { - return res.status(401).send(ErrorMessages.NOT_PERMITTED); - } - next(); - } else { - res.status(401).send(ErrorMessages.NOT_PERMITTED); - } - } - - // ============== UTILS =============== - - /** - * This method is used to generate an auth code request - * @param {Request} req: express request object - * @param {Response} res: express response object - * @param {NextFunction} next: express next - * @param {AuthCodeParams} params: modify auth code url request - */ - private getAuthCode = async (req: Request, res: Response, next: NextFunction, params: AuthCodeParams): Promise => { - - // prepare the request - req.session.authCodeRequest.authority = params.authority; - req.session.authCodeRequest.scopes = params.scopes; - req.session.authCodeRequest.state = params.state; - req.session.authCodeRequest.redirectUri = params.redirect; - - req.session.tokenRequest.authority = params.authority; - req.session.tokenRequest.redirectUri = params.redirect; - req.session.tokenRequest.scopes = params.scopes; - - // request an authorization code to exchange for tokens - try { - const response = await this.msalClient.getAuthCodeUrl(req.session.authCodeRequest); - res.redirect(response); - } catch (error) { - console.log(JSON.stringify(error)); - next(error); - } - } - - /** - * Util method to get the resource name for a given callingPageRoute (appSettings.json) - * @param {string} path: route path - */ - private getResourceName = (path: string): string => { - const index = Object.values(this.appSettings.resources).findIndex((resource: Resource) => resource.callingPageRoute === path); - const resourceName = Object.keys(this.appSettings.resources)[index]; - return resourceName; - } -} - - - - - - diff --git a/samples/msal-node-samples/ExpressTestApp/src/ConfigurationUtils.ts b/samples/msal-node-samples/ExpressTestApp/src/ConfigurationUtils.ts deleted file mode 100644 index bd3007b6d5..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/src/ConfigurationUtils.ts +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -import { - Configuration, - ICachePlugin, - LogLevel, -} from '@azure/msal-node'; - -import { - AppSettings -} from './Types'; - -import { AuthorityStrings } from './Constants'; - -export class ConfigurationUtils { - - /** - * Validates the fields in the custom JSON configuration file - * @param {AppSettings} config: configuration file - */ - static validateAppSettings = (config: AppSettings): void => { - - if (!config.credentials.clientId || config.credentials.clientId === "Enter_the_Application_Id_Here") { - throw new Error("No clientId is provided!"); - } - - if (!config.credentials.tenantId || config.credentials.tenantId === "Enter_the_Tenant_Info_Here") { - throw new Error("No tenantId is provided!"); - } - - if (!config.credentials.clientSecret || config.credentials.clientSecret === "Enter_the_Client_Secret_Here") { - throw new Error("No clientSecret is provided!"); - } - - if (!config.settings.redirectUri || config.settings.redirectUri === "Enter_the_Redirect_Uri_Here") { - throw new Error("No redirectUri is provided!"); - } - - if (!config.settings.postLogoutRedirectUri || config.settings.postLogoutRedirectUri === "Enter_the_Post_Logout_Redirect_Uri_Here") { - throw new Error("No postLogoutRedirectUri is provided!"); - } - - if (!config.settings.homePageRoute) { - throw new Error("No homePageRoute is provided!"); - } - }; - - /** - * Maps the custom JSON configuration file to configuration - * object expected by MSAL Node ConfidentialClientApplication - * @param {AppSettings} config: configuration file - * @param {ICachePlugin} cachePlugin: passed at initialization - */ - static getMsalConfiguration = (config: AppSettings, cachePlugin: ICachePlugin = null): Configuration => { - return { - auth: { - clientId: config.credentials.clientId, - authority: config.policies ? config.policies.signUpSignIn.authority : AuthorityStrings.AAD + config.credentials.tenantId, - clientSecret: config.credentials.clientSecret, - knownAuthorities: config.policies ? [config.policies.authorityDomain] : [], // in B2C scenarios - }, - cache: { - cachePlugin, - }, - system: { - loggerOptions: { - loggerCallback(loglevel, message, containsPii) { - console.log(message); - }, - piiLoggingEnabled: false, - logLevel: LogLevel.Verbose, - } - } - } - }; -} \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/src/Constants.ts b/samples/msal-node-samples/ExpressTestApp/src/Constants.ts deleted file mode 100644 index 3aa967f5e0..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/src/Constants.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -/** - * Basic authentication stages used to determine - * appropriate action after redirect occurs - */ -export const AppStages = { - SIGN_IN: "sign_in", - SIGN_OUT: "sign_out", - ACQUIRE_TOKEN: "acquire_token", -}; - -/** - * String constants related to AAD Authority - */ -export const AuthorityConstants = { - COMMON: "common", - ORGANIZATIONS: "organizations", - CONSUMERS: "consumers" -} - -/** - * Global AAD cloud authority - */ -export const AuthorityStrings = { - AAD: "https://login.microsoftonline.com/", -} - -/** - * AAD Error codes - * For more information, visit: https://login.microsoftonline.com/error - */ -export const ErrorCodes = { - 65001: "AADSTS65001", - 90118: "AADB2C90118" -} - -/** - * Various error constants - */ -export const ErrorMessages = { - NOT_PERMITTED: "Not permitted", - INVALID_TOKEN: "Invalid token", - CANNOT_DETERMINE_APP_STAGE: "Cannot determine application stage", - NONCE_MISMATCH: "Nonce does not match", - INTERACTION_REQUIRED: "interaction_required", - TOKEN_NOT_FOUND: "No token found", - TOKEN_NOT_DECODED: "Token cannot be decoded", - TOKEN_NOT_VERIFIED: "Token cannot be verified", - KEYS_NOT_OBTAINED: "Signing keys cannot be obtained", - STATE_NOT_FOUND: "State not found", -} diff --git a/samples/msal-node-samples/ExpressTestApp/src/TokenValidator.ts b/samples/msal-node-samples/ExpressTestApp/src/TokenValidator.ts deleted file mode 100644 index 3630c38214..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/src/TokenValidator.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -import { CryptoProvider, IdTokenClaims } from "@azure/msal-node"; -import { AuthorityConstants, AuthorityStrings } from "./Constants"; -import { AppSettings } from "./Types"; - -export class TokenValidator { - private appSettings: AppSettings; - private cryptoProvider: CryptoProvider; - - /** - * @param {AppSettings} appSettings - * @param {Configuration} msalConfig - * @constructor - */ - constructor(appSettings: AppSettings, cryptoProvider: CryptoProvider) { - this.appSettings = appSettings; - this.cryptoProvider = cryptoProvider; - } - - /** - * Validates the signature of a JWT token - * @param {string} rawAuthToken - * @returns {Promise} - */ - async validateTokenSignature(rawAuthToken: string): Promise { - /** - * The OpenId Connect spec states: - * - * "If the ID Token is received via direct communication between the Client and the Token Endpoint - * (which it is in this flow), the TLS server validation MAY be used to validate the issuer in place - * of checking the token signature." (https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation) - * - * If your application does make use of hybrid flow and/or does not serve over HTTPS, you need to validate - * the signature of the token below and return the result as boolean below: - */ - - return true; - }; - - /** - * Validates a JWT id token - * @param {string} rawIdToken: raw Id token - * @returns {Promise} - */ - async validateIdToken(rawIdToken: string, idTokenClaims: IdTokenClaims): Promise { - - /** - * A JWT token validation is a 2-step process comprising of: (1) signature validation, (2) claims validation - * For more information, visit: https://learn.microsoft.com/azure/active-directory/develop/access-tokens#validate-tokens - */ - - try { - const isTokenSignatureValid = await this.validateTokenSignature(rawIdToken); - - if (!isTokenSignatureValid) { - return false; - } - - return this.validateIdTokenClaims(idTokenClaims); - } catch (error) { - console.log(error); - return false; - } - }; - - /** - * Validates the id token for a set of claims - * @param {IdTokenClaims} idTokenClaims: decoded id token claims - * @returns {boolean} - */ - validateIdTokenClaims(idTokenClaims: IdTokenClaims): boolean { - const now = Math.round(new Date().getTime() / 1000.0); // current time in seconds - - /** - * if a multi-tenant application only allows sign-in from specific tenants who have signed up - * for their service, then it must check either the issuer value or the tid claim value - * in the token to make sure that tenant is in their list of subscribers. If a multi-tenant - * application only deals with individuals and doesn’t make any access decisions based on tenants, - * then it can ignore the issuer value altogether. For more information, visit: - * https://learn.microsoft.com/azure/active-directory/develop/howto-convert-app-to-be-multi-tenant#update-your-code-to-handle-multiple-issuer-values - */ - const isMultiTenant = Object.values(AuthorityConstants).some(val => val === this.appSettings.credentials.tenantId); - - /** - * At the very least, check for issuer, audience and expiry dates. - * For more information on validating id tokens claims, visit: - * https://docs.microsoft.com/azure/active-directory/develop/id-tokens#validating-an-id_token - */ - const checkIssuer = isMultiTenant ? true : idTokenClaims.iss === `${AuthorityStrings.AAD}${this.appSettings.credentials.tenantId}/v2.0` ? true : false - const checkAudience = idTokenClaims.aud === this.appSettings.credentials.clientId ? true : false; - const checkTimestamp = idTokenClaims.iat <= now && idTokenClaims.exp >= now ? true : false; - - return checkIssuer && checkAudience && checkTimestamp; - }; -} diff --git a/samples/msal-node-samples/ExpressTestApp/src/Types.ts b/samples/msal-node-samples/ExpressTestApp/src/Types.ts deleted file mode 100644 index 46610c949e..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/src/Types.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -import { - AccountInfo, - AuthorizationUrlRequest, - AuthorizationCodeRequest, -} from "@azure/msal-node"; - -// extending express Request object -declare module "express-session" { - interface SessionData { - authCodeRequest: AuthorizationUrlRequest; - tokenRequest: AuthorizationCodeRequest; - account: AccountInfo; - nonce: string; - isAuthenticated?: boolean; - resources?: { - [resource: string]: Resource; - }; - } -} - -export type AuthCodeParams = { - authority: string; - scopes: string[]; - state: string; - redirect: string; - prompt?: string; - account?: AccountInfo; -}; - -export type Resource = { - callingPageRoute: string, - endpoint: string, - scopes: string[] -} - -export type Credentials = { - clientId: string, - tenantId: string, - clientSecret: string -} - -export type Settings = { - homePageRoute: string, - redirectUri: string, - postLogoutRedirectUri: string -} - -export type AppSettings = { - credentials: Credentials, - settings: Settings, - resources: { - [resource: string]: Resource - }, - policies: any, - protected: any, -} diff --git a/samples/msal-node-samples/ExpressTestApp/tsconfig.json b/samples/msal-node-samples/ExpressTestApp/tsconfig.json deleted file mode 100644 index 61fc48d391..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "declaration": true, - "outDir": "./dist", - "esModuleInterop": true, - "moduleResolution": "node", - "sourceMap": true, - "allowJs": true, - "checkJs": true, - "resolveJsonModule": true, - }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file diff --git a/samples/msal-node-samples/ExpressTestApp/tslint.json b/samples/msal-node-samples/ExpressTestApp/tslint.json deleted file mode 100644 index a7f5b679f4..0000000000 --- a/samples/msal-node-samples/ExpressTestApp/tslint.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "jsRules": {}, - "rules": {}, - "rulesDirectory": [] - } \ No newline at end of file diff --git a/samples/msal-node-samples/README.md b/samples/msal-node-samples/README.md index cb1c3e5c20..9f3e1a954f 100644 --- a/samples/msal-node-samples/README.md +++ b/samples/msal-node-samples/README.md @@ -12,34 +12,35 @@ Review our [scenario docs](https://docs.microsoft.com/azure/active-directory/dev | [auth-code-pkce](./auth-code-pkce/README.md) | web app (public client) (typescript) | authorization code with PKCE in typescript | | [auth-code-with-certs](./auth-code-with-certs/README.md) | web app (confidential client) | authorization code | | [auth-code-key-vault](./auth-code-key-vault/README.md) | web app (confidential client) | authorization code | +| [auth-code-distributed-cache](./auth-code-distributed-cache/README.md) | web app (confidential client) (typescript) | authorization code | +| [auth-code-cli-app](./auth-code-cli-app/README.md) | console app (public client) | authorization code | +| [auth-code-cli-brokered-app](./auth-code-cli-brokered-app/README.md) | console app (public client) | authorization code | | [silent-flow](./silent-flow/README.md) | web app (confidential client) | authorization code | -| [on-behalf-of](./on-behalf-of/README.md) | web app (confidential client) | on-behalf-of | +| [on-behalf-of](./on-behalf-of/README.md) | web API (confidential client) | on-behalf-of | +| [on-behalf-of-distributed-cache](./on-behalf-of-distributed-cache/README.md) | web API (confidential client) (typescript) | on-behalf-of | | [refresh-token](./refresh-token/README.md) | web app (confidential client) | refresh token | -| [username-password](./username-password/README.md) | console/daemon app (public client) | resource owner password credentials | -| [username-password-cca](./username-password-cca/README.md) | console/daemon app (confidential client) | resource owner password credentials | -| [device-code](./device-code/README.md) | headless app (public client) | device code | -| [client-credentials](./client-credentials/README.md) | console/daemon app (confidential client) | client credentials | +| [username-password](./username-password/README.md) | console app (public client) | resource owner password credentials | +| [username-password-cca](./username-password-cca/README.md) | console app (confidential client) | resource owner password credentials | +| [device-code](./device-code/README.md) | browserless app (public client) | device code | +| [client-credentials](./client-credentials/README.md) | daemon app (confidential client) | client credentials | +| [client-credentials-distributed-cache](./client-credentials-distributed-cache/README.md) | daemon app (confidential client) (typescript) | client credentials | | [b2c-user-flows](./b2c-user-flows/README.md) | web app (confidential client) | authorization code | | [ElectronTestApp](./ElectronTestApp/README.md) | desktop app (public client) | authorization code with PKCE | -| [ExpressTestApp](./ExpressTestApp/README.md) | web app (confidential client) | authorization code | For in-depth tutorials, see: - [Developing a web app with MSAL Node](https://docs.microsoft.com/azure/active-directory/develop/tutorial-v2-nodejs-webapp-msal) -- [Developing a console app with MSAL Node](https://docs.microsoft.com/azure/active-directory/develop/tutorial-v2-nodejs-console) +- [Developing a daemon app with MSAL Node](https://docs.microsoft.com/azure/active-directory/develop/tutorial-v2-nodejs-console) - [Developing a desktop app with MSAL Node](https://docs.microsoft.com/azure/active-directory/develop/tutorial-v2-nodejs-desktop) +- [Tutorial: Enable your Express web app to sign-in users and call APIs with the Microsoft identity platform](https://github.com/Azure-Samples/ms-identity-javascript-nodejs-tutorial) ### Other samples -These samples use either MSAL Node or passport-azure-ad in a variety of scenarios: +These samples use MSAL Node in a variety of scenarios: +- [React SPA with Express web app using the Backend For Frontend (BFF) Proxy architecture to authenticate users with Azure AD and call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-javascript-nodejs-tutorial/tree/main/5-AdvancedScenarios/1-call-graph-bff): Sample illustrating the BFF pattern to acquire tokens in a secure backend and share authentication state with a React single-page application. - [B2C user management sample](https://github.com/Azure-Samples/ms-identity-b2c-javascript-nodejs-management/tree/main/Chapter2): Command line app using OAuth 2.0 client credentials flow for performing user management operations in an Azure AD B2C tenant -- [Conditional Access sample](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/4-AdvancedGrants/2-call-api-api-ca) Web API handling conditional access challenges -- [Groups overage sample](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/5-AccessControl/2-call-api-groups) Web API calling Microsoft Graph to handle groups overage scenario - [Function API sample deployed to Azure Static Web Apps](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/4-Deployment/2-deploy-static): Azure Function web API using on-behalf-of flow -- [Passport Azure Function sample](https://github.com/Azure-Samples/ms-identity-nodejs-webapi-azurefunctions): Azure Function web API validating access tokens using the passport-azure-ad Bearer strategy -- [Passport web app sample](https://github.com/AzureADQuickStarts/AppModelv2-WebApp-OpenIDConnect-nodejs): Web app signing in users and acquiring tokens using the passport-azure-ad OIDC strategy -- [PoP tokens validation sample](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/6-AdvancedScenarios/2-call-api-pop) Web API parsing and validating PoP tokens - [Teams Tab SSO sample](https://github.com/pnp/teams-dev-samples/tree/main/samples/tab-sso/src/nodejs): Teams tab app demonstrating how integrate MSAL React and MSAL Node to achieve single sign-on ## How to run the samples? From 32df7b975cbfca687f6d5ddd620ca19a545f39d3 Mon Sep 17 00:00:00 2001 From: Joshua Head Date: Thu, 6 Jul 2023 04:42:39 +1000 Subject: [PATCH 3/8] fix: msal-node now references the right path for module index (#6190) fixes #6189 This is currently blocking a prototype for an electron app, so if it's possible to get this prioritized and a new beta candidate released that would be amazing --------- Co-authored-by: Joshua Head --- ...ure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json | 7 +++++++ lib/msal-node/package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json diff --git a/change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json b/change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json new file mode 100644 index 0000000000..da1bc81fff --- /dev/null +++ b/change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: msal-node now references the right index.esm.ja", + "packageName": "@azure/msal-node", + "email": "joshua.head@envoryat.com", + "dependentChangeType": "patch" +} diff --git a/lib/msal-node/package.json b/lib/msal-node/package.json index 44afecbd81..d4a4ed886a 100644 --- a/lib/msal-node/package.json +++ b/lib/msal-node/package.json @@ -47,7 +47,7 @@ "major" ] }, - "module": "dist/msal-node.esm.js", + "module": "dist/index.esm.js", "devDependencies": { "@microsoft/api-extractor": "^7.19.4", "@rollup/plugin-node-resolve": "^15.0.1", From faae9defff0424799bfa540fdb2c2f309b34db3a Mon Sep 17 00:00:00 2001 From: Thomas Norling Date: Wed, 5 Jul 2023 15:56:12 -0700 Subject: [PATCH 4/8] Fix React and Angular exports (#6193) - Removes main field from msal-angular, the file it points to doesn't exist and the Angular build step adds the relevant exports - Fixes the module field in msal-react to point to the correct file --- ...-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json | 7 +++++++ ...re-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json | 7 +++++++ lib/msal-angular/package.json | 3 +-- lib/msal-react/package.json | 4 ++-- 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json create mode 100644 change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json diff --git a/change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json b/change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json new file mode 100644 index 0000000000..5f8a4c0b6a --- /dev/null +++ b/change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Remove unused main field in package.json #6190", + "packageName": "@azure/msal-angular", + "email": "thomas.norling@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json b/change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json new file mode 100644 index 0000000000..081b4cb76d --- /dev/null +++ b/change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Fix module field in package.json #6190", + "packageName": "@azure/msal-react", + "email": "thomas.norling@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/lib/msal-angular/package.json b/lib/msal-angular/package.json index 0793da7119..8e737715f6 100644 --- a/lib/msal-angular/package.json +++ b/lib/msal-angular/package.json @@ -35,7 +35,6 @@ "format:check": "npx prettier --ignore-path .gitignore --check src", "format:fix": "npx prettier --ignore-path .gitignore --write src" }, - "main": "./dist/bundles/azure-msal-angular.umd.js", "typings": "./dist/azure-msal-angular.d.ts", "beachball": { "disallowedChangeTypes": [ @@ -79,4 +78,4 @@ "@azure/msal-browser": "^3.0.0-beta.0", "rxjs": "^7.0.0" } -} +} \ No newline at end of file diff --git a/lib/msal-react/package.json b/lib/msal-react/package.json index 2594dc53b5..ba6fc7dde5 100644 --- a/lib/msal-react/package.json +++ b/lib/msal-react/package.json @@ -46,7 +46,7 @@ "@azure/msal-browser": "^3.0.0-beta.0", "react": "^16.8.0 || ^17 || ^18" }, - "module": "dist/msal-react.esm.js", + "module": "dist/index.js", "devDependencies": { "@azure/msal-browser": "^3.0.0-beta.0", "@testing-library/jest-dom": "^5.11.5", @@ -67,4 +67,4 @@ "@rollup/plugin-typescript": "^11.1.0", "rollup": "^3.20.2" } -} +} \ No newline at end of file From 4ccef1b8a11ca5643c11eb9586e45f8e45398e8c Mon Sep 17 00:00:00 2001 From: Hector Morales Date: Wed, 5 Jul 2023 16:31:22 -0700 Subject: [PATCH 5/8] Make claims-based caching configurable (#6163) This PR: - Sets ability to cache based on requested claims as a configurable option under `CacheOptions.claimsBasedCachinEnabled` - Changes default behavior so in v3 claims-based caching is off by default and any request containing claims will go to the network - Provides a mitigation to the issue where requesting different claims results in a cache miss and a cached token accumulation with no practical way to clear unused tokens - Backport for LTS packages (msal-node v1/msal-browser v2) in progress --- ...-b9572127-f4c0-473a-a120-61bb7d2850c6.json | 7 + ...-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json | 7 + ...-44b62ae5-8011-430c-aca4-e7230b9845e9.json | 7 + lib/msal-browser/docs/configuration.md | 113 ++--- lib/msal-browser/docs/v2-migration.md | 19 + .../src/cache/BrowserCacheManager.ts | 1 + lib/msal-browser/src/config/Configuration.ts | 7 +- .../src/controllers/StandardController.ts | 6 +- .../BaseInteractionClient.ts | 20 +- .../StandardInteractionClient.ts | 4 + .../test/app/PublicClientApplication.spec.ts | 422 ++++++++++++++++-- .../test/cache/BrowserCacheManager.spec.ts | 17 +- .../test/cache/TokenCache.spec.ts | 1 + .../test/config/Configuration.spec.ts | 3 + .../interaction_client/RedirectClient.spec.ts | 8 +- lib/msal-browser/tsconfig.build.tsbuildinfo | 2 +- .../src/client/SilentFlowClient.ts | 10 + .../src/config/ClientConfiguration.ts | 17 + lib/msal-common/src/index.ts | 1 + .../test/client/SilentFlowClient.spec.ts | 114 +++++ .../test/config/ClientConfiguration.spec.ts | 9 + lib/msal-node/package.json | 1 + lib/msal-node/src/client/ClientApplication.ts | 13 +- lib/msal-node/src/config/Configuration.ts | 5 +- .../client/PublicClientApplication.spec.ts | 274 ++++++++---- lib/msal-node/test/utils/TestConstants.ts | 17 +- 26 files changed, 895 insertions(+), 210 deletions(-) create mode 100644 change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json create mode 100644 change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json create mode 100644 change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json diff --git a/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json b/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json new file mode 100644 index 0000000000..43babf4a75 --- /dev/null +++ b/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Make claims-based caching configurable #6163", + "packageName": "@azure/msal-browser", + "email": "hemoral@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json b/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json new file mode 100644 index 0000000000..0055944ab3 --- /dev/null +++ b/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Make claims-based caching configurable #6163", + "packageName": "@azure/msal-common", + "email": "hemoral@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json b/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json new file mode 100644 index 0000000000..cea34ff003 --- /dev/null +++ b/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Make claims-based caching configurable #6163", + "packageName": "@azure/msal-node", + "email": "hemoral@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/lib/msal-browser/docs/configuration.md b/lib/msal-browser/docs/configuration.md index d7ad7e27b3..839d06d6c5 100644 --- a/lib/msal-browser/docs/configuration.md +++ b/lib/msal-browser/docs/configuration.md @@ -18,17 +18,22 @@ const msalConfig = { redirectUri: "enter_redirect_uri_here", postLogoutRedirectUri: "enter_postlogout_uri_here", navigateToLoginRequestUrl: true, - clientCapabilities: ["CP1"] + clientCapabilities: ["CP1"], }, cache: { cacheLocation: "sessionStorage", temporaryCacheLocation: "sessionStorage", storeAuthStateInCookie: false, - secureCookies: false + secureCookies: false, + claimsBasedCachingEnabled: true, }, system: { loggerOptions: { - loggerCallback: (level: LogLevel, message: string, containsPii: boolean): void => { + loggerCallback: ( + level: LogLevel, + message: string, + containsPii: boolean + ): void => { if (containsPii) { return; } @@ -47,19 +52,19 @@ const msalConfig = { return; } }, - piiLoggingEnabled: false + piiLoggingEnabled: false, }, windowHashTimeout: 60000, iframeHashTimeout: 6000, loadFrameTimeout: 0, - asyncPopups: false + asyncPopups: false, }, telemetry: { application: { appName: "My Application", - appVersion: "1.0.0" - } - } + appVersion: "1.0.0", + }, + }, }; const msalInstance = new PublicClientApplication(msalConfig); @@ -69,69 +74,71 @@ const msalInstance = new PublicClientApplication(msalConfig); ### Auth Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `clientId` | App ID of your application. Can be found in your [portal registration](../README#prerequisites). | UUID/GUID | None. This parameter is required in order for MSAL to perform any actions. | -| `authority` | URI of the tenant to authenticate and authorize with. Usually takes the form of `https://{uri}/{tenantid}` (see [Authority](../../msal-common/docs/authority.md)) | String in URI format with tenant - `https://{uri}/{tenantid}` | `https://login.microsoftonline.com/common` | -| `knownAuthorities` | An array of URIs that are known to be valid. Used in B2C scenarios. | Array of strings in URI format | Empty array `[]` | -| `cloudDiscoveryMetadata` | A string containing the cloud discovery response. Used in AAD scenarios. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | -| `authorityMetadata` | A string containing the .well-known/openid-configuration endpoint response. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | -| `redirectUri` | URI where the authorization code response is sent back to. Whatever location is specified here must have the MSAL library available to handle the response. | String in absolute or relative URI format | Login request page (`window.location.href` of page which made auth request) | -| `postLogoutRedirectUri` | URI that is redirected to after a logout() call is made. | String in absolute or relative URI format. Pass `null` to disable post logout redirect. | Login request page (`window.location.href` of page which made auth request) | -| `navigateToLoginRequestUrl` | If `true`, will navigate back to the original request location before processing the authorization code response. If the `redirectUri` is the same as the original request location, this flag should be set to false. | boolean | `true` | -| `clientCapabilities` | Array of capabilities to be added to all network requests as part of the `xms_cc` claims request (see: [Client capability in MSAL](../../msal-common/docs/client-capability.md)) | Array of strings | [] | -| `protocolMode` | Enum representing the protocol mode to use. If `"AAD"`, will function on the OIDC-compliant AAD v2 endpoints; if `"OIDC"`, will function on other OIDC-compliant endpoints. | string | `"AAD"` | -| `azureCloudOptions` | A defined set of azure cloud options for developers to default to their specific cloud authorities, for specific clouds supported please refer to the [AzureCloudInstance](https://aka.ms/msaljs/azure_cloud_instance) | [AzureCloudOptions](https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#azurecloudoptions) | [AzureCloudInstance.None](msaljs/azure_cloud_instance) | -| `skipAuthorityMetadataCache` | A flag to choose whether to use the local metadata cache during authority initialization. Metadata cache would be used if no authority metadata is provided and after a network call for metadata has failed (see [Authority](../../msal-common/docs/authority.md)) | boolean | `false` | +| Option | Description | Format | Default Value | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| `clientId` | App ID of your application. Can be found in your [portal registration](../README#prerequisites). | UUID/GUID | None. This parameter is required in order for MSAL to perform any actions. | +| `authority` | URI of the tenant to authenticate and authorize with. Usually takes the form of `https://{uri}/{tenantid}` (see [Authority](../../msal-common/docs/authority.md)) | String in URI format with tenant - `https://{uri}/{tenantid}` | `https://login.microsoftonline.com/common` | +| `knownAuthorities` | An array of URIs that are known to be valid. Used in B2C scenarios. | Array of strings in URI format | Empty array `[]` | +| `cloudDiscoveryMetadata` | A string containing the cloud discovery response. Used in AAD scenarios. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | +| `authorityMetadata` | A string containing the .well-known/openid-configuration endpoint response. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | +| `redirectUri` | URI where the authorization code response is sent back to. Whatever location is specified here must have the MSAL library available to handle the response. | String in absolute or relative URI format | Login request page (`window.location.href` of page which made auth request) | +| `postLogoutRedirectUri` | URI that is redirected to after a logout() call is made. | String in absolute or relative URI format. Pass `null` to disable post logout redirect. | Login request page (`window.location.href` of page which made auth request) | +| `navigateToLoginRequestUrl` | If `true`, will navigate back to the original request location before processing the authorization code response. If the `redirectUri` is the same as the original request location, this flag should be set to false. | boolean | `true` | +| `clientCapabilities` | Array of capabilities to be added to all network requests as part of the `xms_cc` claims request (see: [Client capability in MSAL](../../msal-common/docs/client-capability.md)) | Array of strings | [] | +| `protocolMode` | Enum representing the protocol mode to use. If `"AAD"`, will function on the OIDC-compliant AAD v2 endpoints; if `"OIDC"`, will function on other OIDC-compliant endpoints. | string | `"AAD"` | +| `azureCloudOptions` | A defined set of azure cloud options for developers to default to their specific cloud authorities, for specific clouds supported please refer to the [AzureCloudInstance](https://aka.ms/msaljs/azure_cloud_instance) | [AzureCloudOptions](https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#azurecloudoptions) | [AzureCloudInstance.None](msaljs/azure_cloud_instance) | +| `skipAuthorityMetadataCache` | A flag to choose whether to use the local metadata cache during authority initialization. Metadata cache would be used if no authority metadata is provided and after a network call for metadata has failed (see [Authority](../../msal-common/docs/authority.md)) | boolean | `false` | ### Cache Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `cacheLocation` | Location of token cache in browser. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | -| `temporaryCacheLocation` | Location of temporary cache in browser. This option should only be changed for specific edge cases. Please refer to [caching](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/caching.md#cached-artifacts) for more. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | -| `storeAuthStateInCookie` | If true, stores cache items in cookies as well as browser cache. Should be set to true for use cases using IE. | boolean | `false` | -| `secureCookies` | If true and `storeAuthStateInCookies` is also enabled, MSAL adds the `Secure` flag to the browser cookie so it can only be sent over HTTPS. | boolean | `false` | -| `cacheMigrationEnabled` | If true, cache entries from older versions of MSAL will be updated to conform to the latest cache schema on startup. If your application has not been recently updated to a new version of MSAL.js you can safely turn this off. In the event old cache entries are not migrated it may result in a cache miss when attempting to retrieve accounts or tokens and affected users may need to re-authenticate to get up to date. | boolean | `true` when using `localStorage`, `false` otherwise | +| Option | Description | Format | Default Value | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| `cacheLocation` | Location of token cache in browser. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | +| `temporaryCacheLocation` | Location of temporary cache in browser. This option should only be changed for specific edge cases. Please refer to [caching](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/caching.md#cached-artifacts) for more. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | +| `storeAuthStateInCookie` | If true, stores cache items in cookies as well as browser cache. Should be set to true for use cases using IE. | boolean | `false` | +| `secureCookies` | If true and `storeAuthStateInCookies` is also enabled, MSAL adds the `Secure` flag to the browser cookie so it can only be sent over HTTPS. | boolean | `false` | +| `cacheMigrationEnabled` | If true, cache entries from older versions of MSAL will be updated to conform to the latest cache schema on startup. If your application has not been recently updated to a new version of MSAL.js you can safely turn this off. In the event old cache entries are not migrated it may result in a cache miss when attempting to retrieve accounts or tokens and affected users may need to re-authenticate to get up to date. | boolean | `true` when using `localStorage`, `false` otherwise | +| `claimsBasedCachingEnabled` | If `true`, access tokens will be cached under a key containing the hash of the requested claims string, resulting in a cache miss and new network token request when the same token request is made with different or missing claims. If set to `false`, tokens will be cached without claims, but all requests containing claims will go to the network and overwrite any previously cached token with the same scopes. | boolean | `false` | See [Caching in MSAL](./caching.md) for more. ### System Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `loggerOptions` | Config object for logger. | See [below](#logger-config-options). | See [below](#logger-config-options). | -| `windowHashTimeout` | Timeout in milliseconds to wait for popup operations to resolve. | integer (milliseconds) | `60000` | -| `iframeHashTimeout` | Timeout in milliseconds to wait for iframe operations to resolve. | integer (milliseconds) | `6000` | -| `loadFrameTimeout` | Timeout in milliseconds to wait for iframe/popup operations resolve. If provided, will set default values for `windowHashTimeout` and `iframeHashTimeout`. | integer (milliseconds) | `undefined` | -| `navigateFrameWait ` | Delay in milliseconds to wait for the iframe to load in the window. | integer (milliseconds) | In IE or Edge: `500`, in all other browsers: `0` | -| `asyncPopups` | Sets whether popups are opened asynchronously. When set to false, blank popups are opened before anything else happens. When set to true, popups are opened when making the network request. Can be set to true for scenarios where `about:blank` is not supported, e.g. desktop apps or progressive web apps | boolean | `false` | -| `allowRedirectInIframe` | By default, MSAL will not allow redirect operations to be initiated when the application is inside an iframe. Set this flag to `true` to remove this check. | boolean | `false` | -| `cryptoOptions` | Config object for crypto operations in the browser. | See [below](#crypto-config-options.) | See [below](#crypto-config-options.) | -| `pollIntervalMilliseconds` | Interval of time in milliseconds between polls of popup URL hash during authenticaiton. | integer (milliseconds) | `30` | +| Option | Description | Format | Default Value | +| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------------------------------------------ | +| `loggerOptions` | Config object for logger. | See [below](#logger-config-options). | See [below](#logger-config-options). | +| `windowHashTimeout` | Timeout in milliseconds to wait for popup operations to resolve. | integer (milliseconds) | `60000` | +| `iframeHashTimeout` | Timeout in milliseconds to wait for iframe operations to resolve. | integer (milliseconds) | `6000` | +| `loadFrameTimeout` | Timeout in milliseconds to wait for iframe/popup operations resolve. If provided, will set default values for `windowHashTimeout` and `iframeHashTimeout`. | integer (milliseconds) | `undefined` | +| `navigateFrameWait ` | Delay in milliseconds to wait for the iframe to load in the window. | integer (milliseconds) | In IE or Edge: `500`, in all other browsers: `0` | +| `asyncPopups` | Sets whether popups are opened asynchronously. When set to false, blank popups are opened before anything else happens. When set to true, popups are opened when making the network request. Can be set to true for scenarios where `about:blank` is not supported, e.g. desktop apps or progressive web apps | boolean | `false` | +| `allowRedirectInIframe` | By default, MSAL will not allow redirect operations to be initiated when the application is inside an iframe. Set this flag to `true` to remove this check. | boolean | `false` | +| `cryptoOptions` | Config object for crypto operations in the browser. | See [below](#crypto-config-options.) | See [below](#crypto-config-options.) | +| `pollIntervalMilliseconds` | Interval of time in milliseconds between polls of popup URL hash during authenticaiton. | integer (milliseconds) | `30` | #### Logger Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `loggerCallback` | Callback function which handles the logging of MSAL statements. | Function - `loggerCallback: (level: LogLevel, message: string, containsPii: boolean): void` | See [above](#using-the-config-object). | -| `piiLoggingEnabled` | If true, personally identifiable information (PII) is included in logs. | boolean | `false` | +| Option | Description | Format | Default Value | +| ------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------- | +| `loggerCallback` | Callback function which handles the logging of MSAL statements. | Function - `loggerCallback: (level: LogLevel, message: string, containsPii: boolean): void` | See [above](#using-the-config-object). | +| `piiLoggingEnabled` | If true, personally identifiable information (PII) is included in logs. | boolean | `false` | #### Crypto Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `useMsrCrypto` | Whether to use [MSR Crypto](https://github.com/microsoft/MSR-JavaScript-Crypto) if available in the browser (and other crypto interfaces are not available). | boolean | `false` -| `entropy` | Cryptographically strong random values used to seed MSR Crypto (e.g. `crypto.randomBytes(48)` from Node). 48 bits of entropy is recommended. Required if `useMsrCrypto` is enabled. | `Uint8Array` | `undefined` | + +| Option | Description | Format | Default Value | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------- | +| `useMsrCrypto` | Whether to use [MSR Crypto](https://github.com/microsoft/MSR-JavaScript-Crypto) if available in the browser (and other crypto interfaces are not available). | boolean | `false` | +| `entropy` | Cryptographically strong random values used to seed MSR Crypto (e.g. `crypto.randomBytes(48)` from Node). 48 bits of entropy is recommended. Required if `useMsrCrypto` is enabled. | `Uint8Array` | `undefined` | ### Telemetry Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | +| Option | Description | Format | Default Value | +| ------------- | ------------------------------------------------ | ----------------------------------- | ----------------------------------- | | `application` | Telemetry options for applications using MSAL.js | See [below](#application-telemetry) | See [below](#application-telemetry) | #### Application Telemetry -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `appName` | Unique string name of an application | string | Empty string "" | +| Option | Description | Format | Default Value | +| ------------ | ------------------------------------- | ------ | --------------- | +| `appName` | Unique string name of an application | string | Empty string "" | | `appVersion` | Version of the application using MSAL | string | Empty string "" | diff --git a/lib/msal-browser/docs/v2-migration.md b/lib/msal-browser/docs/v2-migration.md index 2816e2559f..9ceed52f55 100644 --- a/lib/msal-browser/docs/v2-migration.md +++ b/lib/msal-browser/docs/v2-migration.md @@ -59,6 +59,25 @@ const msalConfig = { const msalInstance = await msal.PublicClientApplication.createPublicClientApplication(msalConfig); ``` +### Claims-based caching + +In MSAL v2.x, adding claims to a request will result in a hash of the requested claims string being added to the token cache key by default. This implies that MSAL 2.x caches and matches tokens based on claims by default. In MSAL v3.x, this behavior is no longer the default. MSAL v3.x default behavior is to go to the network to refresh a token every time claims are requested, regardless of whether the token has been cached previously and is still valid. Then, after going to the network, the token received overwrites the cached token in case a silent request without claims is executed later. In order to enable claims-based caching in MSAL v3.x to maintain the same behavior as in MSAL v2.x, developers must use the `cacheOptions.claimsBasedCachingEnabled` configuration flag set to true in the Client Application configuration object: + +```typescript +const msalConfig = { + auth: { + ... + }, + ... + cache: { + claimsBasedCachingEnabled: true + } +} + +const msalInstance = new msal.PublicClientApplication(msalConfig); +await msalInstance.initialize(); +``` + All other APIs are backward compatible with [MSAL v2.x](../../msal-browser/). It is recommended to take a look at the [default sample](../../../samples/msal-browser-samples/VanillaJSTestApp2.0) to see a working example of MSAL v3.0. ### Crypto diff --git a/lib/msal-browser/src/cache/BrowserCacheManager.ts b/lib/msal-browser/src/cache/BrowserCacheManager.ts index 54980db351..aadd7addb3 100644 --- a/lib/msal-browser/src/cache/BrowserCacheManager.ts +++ b/lib/msal-browser/src/cache/BrowserCacheManager.ts @@ -1891,6 +1891,7 @@ export const DEFAULT_BROWSER_CACHE_MANAGER = ( storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; return new BrowserCacheManager( clientId, diff --git a/lib/msal-browser/src/config/Configuration.ts b/lib/msal-browser/src/config/Configuration.ts index f8c805c1c5..abf6bd784c 100644 --- a/lib/msal-browser/src/config/Configuration.ts +++ b/lib/msal-browser/src/config/Configuration.ts @@ -108,6 +108,10 @@ export type CacheOptions = { * If set, MSAL will attempt to migrate cache entries from older versions on initialization. By default this flag is set to true if cacheLocation is localStorage, otherwise false. */ cacheMigrationEnabled?: boolean; + /** + * Flag that determines whether access tokens are stored based on requested claims + */ + claimsBasedCachingEnabled?: boolean; }; export type BrowserSystemOptions = SystemOptions & { @@ -255,6 +259,7 @@ export function buildConfiguration( userInputCache.cacheLocation === BrowserCacheLocation.LocalStorage ? true : false, + claimsBasedCachingEnabled: false, }; // Default logger options for browser @@ -290,7 +295,7 @@ export function buildConfiguration( nativeBrokerHandshakeTimeout: userInputSystem?.nativeBrokerHandshakeTimeout || DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS, - pollIntervalMilliseconds: BrowserConstants.DEFAULT_POLL_INTERVAL_MS + pollIntervalMilliseconds: BrowserConstants.DEFAULT_POLL_INTERVAL_MS, }; const providedSystemOptions: BrowserSystemOptions = { diff --git a/lib/msal-browser/src/controllers/StandardController.ts b/lib/msal-browser/src/controllers/StandardController.ts index 8e4f8611dd..95e5fbd8d9 100644 --- a/lib/msal-browser/src/controllers/StandardController.ts +++ b/lib/msal-browser/src/controllers/StandardController.ts @@ -198,10 +198,7 @@ export class StandardController implements IController { // Initialize the crypto class. this.browserCrypto = this.isBrowserEnvironment - ? new CryptoOps( - this.logger, - this.performanceClient - ) + ? new CryptoOps(this.logger, this.performanceClient) : DEFAULT_CRYPTO_IMPLEMENTATION; this.eventHandler = new EventHandler(this.logger, this.browserCrypto); @@ -226,6 +223,7 @@ export class StandardController implements IController { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; this.nativeInternalStorage = new BrowserCacheManager( this.config.auth.clientId, diff --git a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts index 81726b6353..6415f2896b 100644 --- a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts @@ -178,8 +178,13 @@ export abstract class BaseInteractionClient { ); } - // Set requested claims hash if claims were requested - if (request.claims && !StringUtils.isEmpty(request.claims)) { + // Set requested claims hash if claims-based caching is enabled and claims were requested + if ( + this.config.cache.claimsBasedCachingEnabled && + request.claims && + // Checks for empty stringified object "{}" which doesn't qualify as requested claims + !StringUtils.isEmptyObj(request.claims) + ) { validatedRequest.requestedClaimsHash = await this.browserCrypto.hashString(request.claims); } @@ -210,10 +215,15 @@ export abstract class BaseInteractionClient { * If authority provided in the request does not match environment/authority specified * in the account or MSAL config, we throw an error. */ - async validateRequestAuthority(authority: string, account: AccountInfo): Promise { - const discoveredAuthority = await this.getDiscoveredAuthority(authority); + async validateRequestAuthority( + authority: string, + account: AccountInfo + ): Promise { + const discoveredAuthority = await this.getDiscoveredAuthority( + authority + ); - if(!discoveredAuthority.isAlias(account.environment)) { + if (!discoveredAuthority.isAlias(account.environment)) { throw ClientConfigurationError.createAuthorityMismatchError(); } } diff --git a/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts b/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts index 1123752af6..8ae353e856 100644 --- a/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts @@ -278,6 +278,10 @@ export abstract class StandardInteractionClient extends BaseInteractionClient { logLevel: logger.logLevel, correlationId: this.correlationId, }, + cacheOptions: { + claimsBasedCachingEnabled: + this.config.cache.claimsBasedCachingEnabled, + }, cryptoInterface: this.browserCrypto, networkInterface: this.networkClient, storageInterface: this.browserStorage, diff --git a/lib/msal-browser/test/app/PublicClientApplication.spec.ts b/lib/msal-browser/test/app/PublicClientApplication.spec.ts index 5d18f599ab..7156545b5e 100644 --- a/lib/msal-browser/test/app/PublicClientApplication.spec.ts +++ b/lib/msal-browser/test/app/PublicClientApplication.spec.ts @@ -101,6 +101,7 @@ const cacheConfig = { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; let testAppConfig = { @@ -189,23 +190,33 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { afterEach(() => { sinon.restore(); - }) + }); it("handles concurrent calls", async () => { const config = { auth: { - clientId: TEST_CONFIG.MSAL_CLIENT_ID + clientId: TEST_CONFIG.MSAL_CLIENT_ID, }, system: { - allowNativeBroker: true - } + allowNativeBroker: true, + }, }; const concurrency = 5; - const postMessageSpy: sinon.SinonSpy = sinon.spy(window, "postMessage"); - const initSpy: sinon.SinonSpy = sinon.spy(PublicClientApplication.prototype, "initialize"); + const postMessageSpy: sinon.SinonSpy = sinon.spy( + window, + "postMessage" + ); + const initSpy: sinon.SinonSpy = sinon.spy( + PublicClientApplication.prototype, + "initialize" + ); // @ts-ignore - const handshakeSpy: sinon.SinonSpy = sinon.spy(NativeMessageHandler.prototype, "sendHandshakeRequest"); + const handshakeSpy: sinon.SinonSpy = sinon.spy( + NativeMessageHandler.prototype, + // @ts-ignore + "sendHandshakeRequest" + ); let ports: Set = new Set(); let handledMessages = 0; @@ -220,8 +231,8 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { responseId: request.responseId, body: { method: "HandshakeResponse", - version: 3 - } + version: 3, + }, }; // Fan out messages to all registered ports to validate that responses are getting filtered out properly. @@ -252,8 +263,10 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { for (let i = 0; i < apps.length; i++) { // @ts-ignore expect(apps[i].controller.initialized).toBeTruthy(); - // @ts-ignore - expect(apps[i].controller.getNativeExtensionProvider()).toBeInstanceOf(NativeMessageHandler); + expect( + // @ts-ignore + apps[i].controller.getNativeExtensionProvider() + ).toBeInstanceOf(NativeMessageHandler); } } finally { for (const port of ports) { @@ -267,18 +280,27 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { it("handles concurrent calls with native handshake timeouts", async () => { const config = { auth: { - clientId: TEST_CONFIG.MSAL_CLIENT_ID + clientId: TEST_CONFIG.MSAL_CLIENT_ID, }, system: { - allowNativeBroker: true - } + allowNativeBroker: true, + }, }; const concurrency = 6; - const postMessageSpy: sinon.SinonSpy = sinon.spy(window, "postMessage"); - const initSpy: sinon.SinonSpy = sinon.spy(PublicClientApplication.prototype, "initialize"); + const postMessageSpy: sinon.SinonSpy = sinon.spy( + window, + "postMessage" + ); + const initSpy: sinon.SinonSpy = sinon.spy( + PublicClientApplication.prototype, + "initialize" + ); // @ts-ignore - const createProviderSpy: sinon.SinonSpy = sinon.spy(NativeMessageHandler, "createProvider"); + const createProviderSpy: sinon.SinonSpy = sinon.spy( + NativeMessageHandler, + "createProvider" + ); let ports: Set = new Set(); let handledMessages = 0; @@ -293,8 +315,8 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { responseId: request.responseId, body: { method: "HandshakeResponse", - version: 3 - } + version: 3, + }, }; // Time out the second half of the handshakes. @@ -330,8 +352,12 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { for (let i = 0; i < apps.length; i++) { // @ts-ignore expect(apps[i].controller.initialized).toBeTruthy(); - // @ts-ignore - nativeProviders += apps[i].controller.getNativeExtensionProvider() ? 1 : 0; + nativeProviders += apps[ + i + // @ts-ignore + ].controller.getNativeExtensionProvider() + ? 1 + : 0; } expect(nativeProviders).toEqual(concurrency / 2); } finally { @@ -805,7 +831,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { it("doesnt mutate request correlation id", async () => { const request: RedirectRequest = { scopes: [], - onRedirectNavigate: () => false // Skip the navigation + onRedirectNavigate: () => false, // Skip the navigation }; await pca.loginRedirect(request).catch(() => null); @@ -1102,7 +1128,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { it("doesnt mutate request correlation id", async () => { const request: RedirectRequest = { scopes: [], - onRedirectNavigate: () => false // Skip the navigation + onRedirectNavigate: () => false, // Skip the navigation }; await pca.acquireTokenRedirect(request).catch(() => null); @@ -1325,7 +1351,10 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { scopes: [], }; - jest.spyOn(PopupClient.prototype, "initiateAuthRequest").mockImplementation(() => { + jest.spyOn( + PopupClient.prototype, + "initiateAuthRequest" + ).mockImplementation(() => { throw "Request object has been built at this point, no need to continue"; }); @@ -1696,7 +1725,10 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { scopes: [], }; - jest.spyOn(PopupClient.prototype, "initiateAuthRequest").mockImplementation(() => { + jest.spyOn( + PopupClient.prototype, + "initiateAuthRequest" + ).mockImplementation(() => { throw "Request object has been built at this point, no need to continue"; }); @@ -2446,13 +2478,9 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { code: "123", }; - await pca - .acquireTokenByCode(request) - .catch(() => null); + await pca.acquireTokenByCode(request).catch(() => null); - await pca - .acquireTokenByCode(request) - .catch(() => null); + await pca.acquireTokenByCode(request).catch(() => null); expect(request.correlationId).toBe(undefined); }); @@ -2952,13 +2980,9 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { scopes: [], }; - await pca - .acquireTokenSilent(request) - .catch(() => null); + await pca.acquireTokenSilent(request).catch(() => null); - await pca - .acquireTokenSilent(request) - .catch(() => null); + await pca.acquireTokenSilent(request).catch(() => null); expect(request.correlationId).toBe(undefined); }); @@ -3099,6 +3123,112 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }); it("makes one network request with multiple parallel silent requests with same request", async () => { + const testServerTokenResponse = { + token_type: TEST_CONFIG.TOKEN_TYPE_BEARER, + scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), + expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + ext_expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + access_token: TEST_TOKENS.ACCESS_TOKEN, + refresh_token: TEST_TOKENS.REFRESH_TOKEN, + id_token: TEST_TOKENS.IDTOKEN_V2, + }; + const testIdTokenClaims: TokenClaims = { + ver: "2.0", + iss: "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", + sub: "AAAAAAAAAAAAAAAAAAAAAIkzqFVrSaSaFHy782bbtaQ", + name: "Abe Lincoln", + preferred_username: "AbeLi@microsoft.com", + oid: "00000000-0000-0000-66f3-3332eca7ea81", + tid: "3338040d-6c67-4c5b-b112-36a304b66dad", + nonce: "123523", + }; + const testAccount: AccountInfo = { + homeAccountId: TEST_DATA_CLIENT_INFO.TEST_HOME_ACCOUNT_ID, + localAccountId: TEST_DATA_CLIENT_INFO.TEST_UID, + environment: "login.windows.net", + tenantId: testIdTokenClaims.tid || "", + username: testIdTokenClaims.preferred_username || "", + }; + const testTokenResponse: AuthenticationResult = { + authority: TEST_CONFIG.validAuthority, + uniqueId: testIdTokenClaims.oid || "", + tenantId: testIdTokenClaims.tid || "", + scopes: [...TEST_CONFIG.DEFAULT_SCOPES, "User.Read"], + idToken: testServerTokenResponse.id_token, + idTokenClaims: testIdTokenClaims, + accessToken: testServerTokenResponse.access_token, + fromCache: false, + correlationId: RANDOM_TEST_GUID, + expiresOn: new Date( + Date.now() + testServerTokenResponse.expires_in * 1000 + ), + account: testAccount, + tokenType: AuthenticationScheme.BEARER, + }; + sinon + .stub(CryptoOps.prototype, "createNewGuid") + .returns(RANDOM_TEST_GUID); + sinon + .stub(CryptoOps.prototype, "hashString") + .resolves(TEST_CRYPTO_VALUES.TEST_SHA256_HASH); + const atsSpy = sinon.spy( + StandardController.prototype, + "acquireTokenSilentAsync" + ); + const silentATStub = sinon + .stub( + RefreshTokenClient.prototype, + "acquireTokenByRefreshToken" + ) + .resolves(testTokenResponse); + const tokenRequest: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.BEARER, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedTokenRequest: CommonSilentFlowRequest = { + ...tokenRequest, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + const silentRequest1 = pca.acquireTokenSilent(tokenRequest); + const silentRequest2 = pca.acquireTokenSilent(tokenRequest); + const silentRequest3 = pca.acquireTokenSilent(tokenRequest); + const parallelResponse = await Promise.all([ + silentRequest1, + silentRequest2, + silentRequest3, + ]); + + expect(silentATStub.calledWith(expectedTokenRequest)).toBeTruthy(); + expect(atsSpy.calledOnce).toBe(true); + expect(silentATStub.callCount).toEqual(1); + expect(parallelResponse[0]).toEqual(testTokenResponse); + expect(parallelResponse[1]).toEqual(testTokenResponse); + expect(parallelResponse[2]).toEqual(testTokenResponse); + expect(parallelResponse).toHaveLength(3); + }); + + it("makes one network request with multiple parallel silent requests with same request including claims when claimsBasedCaching is enabled", async () => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowNativeBroker: false, + }, + cache: { + claimsBasedCachingEnabled: true, + }, + }); + + await pca.initialize(); const testServerTokenResponse = { token_type: TEST_CONFIG.TOKEN_TYPE_BEARER, scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), @@ -3358,6 +3488,224 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { forceRefresh: false, }; + const silentRequest1 = pca.acquireTokenSilent(tokenRequest1); + const silentRequest2 = pca.acquireTokenSilent(tokenRequest1); + const silentRequest3 = pca.acquireTokenSilent(tokenRequest2); + const popSilentRequest1 = pca.acquireTokenSilent(popTokenRequest1); + const popSilentRequest2 = pca.acquireTokenSilent(popTokenRequest1); + const popSilentRequest3 = pca.acquireTokenSilent(popTokenRequest2); + const sshCertSilentRequest1 = + pca.acquireTokenSilent(sshCertRequest1); + const sshCertSilentRequest2 = + pca.acquireTokenSilent(sshCertRequest1); + const sshCertSilentRequest3 = + pca.acquireTokenSilent(sshCertRequest2); + await Promise.all([ + silentRequest1, + silentRequest2, + silentRequest3, + popSilentRequest1, + popSilentRequest2, + popSilentRequest3, + sshCertSilentRequest1, + sshCertSilentRequest2, + sshCertSilentRequest3, + ]); + + expect(silentATStub.calledWith(expectedTokenRequest1)).toBeTruthy(); + expect(silentATStub.calledWith(expectedTokenRequest2)).toBeTruthy(); + expect( + silentATStub.calledWith(expectedPopTokenRequest1) + ).toBeTruthy(); + expect( + silentATStub.calledWith(expectedPopTokenRequest2) + ).toBeTruthy(); + expect( + silentATStub.calledWith(expectedSshCertificateRequest1) + ).toBeTruthy(); + expect( + silentATStub.calledWith(expectedSshCertificateRequest2) + ).toBeTruthy(); + expect(silentATStub.callCount).toEqual(6); + }); + + it("makes network requests for each distinct request including claims when acquireTokenSilent is called in parallel with claimsBasedCaching is enabled", async () => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowNativeBroker: false, + }, + cache: { + claimsBasedCachingEnabled: true, + }, + }); + + await pca.initialize(); + const testServerTokenResponse = { + token_type: TEST_CONFIG.TOKEN_TYPE_BEARER, + scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), + expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + ext_expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + access_token: TEST_TOKENS.ACCESS_TOKEN, + refresh_token: TEST_TOKENS.REFRESH_TOKEN, + id_token: TEST_TOKENS.IDTOKEN_V2, + }; + const testIdTokenClaims: TokenClaims = { + ver: "2.0", + iss: "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", + sub: "AAAAAAAAAAAAAAAAAAAAAIkzqFVrSaSaFHy782bbtaQ", + name: "Abe Lincoln", + preferred_username: "AbeLi@microsoft.com", + oid: "00000000-0000-0000-66f3-3332eca7ea81", + tid: "3338040d-6c67-4c5b-b112-36a304b66dad", + nonce: "123523", + }; + const testAccount: AccountInfo = { + homeAccountId: TEST_DATA_CLIENT_INFO.TEST_HOME_ACCOUNT_ID, + localAccountId: TEST_DATA_CLIENT_INFO.TEST_UID, + environment: "login.windows.net", + tenantId: testIdTokenClaims.tid || "", + username: testIdTokenClaims.preferred_username || "", + }; + const testTokenResponse: AuthenticationResult = { + authority: TEST_CONFIG.validAuthority, + uniqueId: testIdTokenClaims.oid || "", + tenantId: testIdTokenClaims.tid || "", + scopes: [...TEST_CONFIG.DEFAULT_SCOPES, "User.Read"], + idToken: testServerTokenResponse.id_token, + idTokenClaims: testIdTokenClaims, + accessToken: testServerTokenResponse.access_token, + fromCache: false, + correlationId: RANDOM_TEST_GUID, + expiresOn: new Date( + Date.now() + testServerTokenResponse.expires_in * 1000 + ), + account: testAccount, + tokenType: AuthenticationScheme.BEARER, + }; + sinon + .stub(CryptoOps.prototype, "createNewGuid") + .returns(RANDOM_TEST_GUID); + sinon + .stub(CryptoOps.prototype, "hashString") + .resolves(TEST_CRYPTO_VALUES.TEST_SHA256_HASH); + const silentATStub = sinon + .stub( + RefreshTokenClient.prototype, + "acquireTokenByRefreshToken" + ) + .resolves(testTokenResponse); + // Beaerer requests + const tokenRequest1: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.BEARER, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedTokenRequest1: CommonSilentFlowRequest = { + ...tokenRequest1, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + const tokenRequest2: CommonSilentFlowRequest = { + scopes: ["Mail.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.BEARER, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedTokenRequest2: CommonSilentFlowRequest = { + ...tokenRequest1, + scopes: ["Mail.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + // PoP requests + const popTokenRequest1: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.POP, + resourceRequestMethod: "GET", + resourceRequestUri: "https://testUri.com/user.read", + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + + const popTokenRequest2: CommonSilentFlowRequest = { + scopes: ["Mail.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.POP, + resourceRequestMethod: "GET", + resourceRequestUri: "https://testUri.com/mail.read", + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedPopTokenRequest1: CommonSilentFlowRequest = { + ...popTokenRequest1, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + const expectedPopTokenRequest2: CommonSilentFlowRequest = { + ...popTokenRequest2, + scopes: ["Mail.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + // SSH Certificate requests + const sshCertRequest1: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.SSH, + sshJwk: TEST_SSH_VALUES.ENCODED_SSH_JWK, + sshKid: TEST_SSH_VALUES.SSH_KID, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + + const sshCertRequest2: CommonSilentFlowRequest = { + scopes: ["Mail.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.SSH, + sshJwk: TEST_SSH_VALUES.ALTERNATE_ENCODED_SSH_JWK, + sshKid: TEST_SSH_VALUES.ALTERNATE_SSH_KID, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + + const expectedSshCertificateRequest1: CommonSilentFlowRequest = { + ...sshCertRequest1, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + const expectedSshCertificateRequest2: CommonSilentFlowRequest = { + ...sshCertRequest2, + scopes: ["Mail.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + // Requests with claims const claimsRequest1: CommonSilentFlowRequest = { scopes: ["User.Read"], diff --git a/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts b/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts index ecfb8abdaa..0eed51d02b 100644 --- a/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts +++ b/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts @@ -61,6 +61,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( @@ -247,6 +248,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -264,6 +266,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: true, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -322,6 +325,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: true, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -356,6 +360,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -371,6 +376,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: true, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -2127,14 +2133,14 @@ describe("BrowserCacheManager tests", () => { testObj.authorization_endpoint = // @ts-ignore DEFAULT_OPENID_CONFIG_RESPONSE.body.authorization_endpoint; - testObj.token_endpoint = + testObj.token_endpoint = // @ts-ignore DEFAULT_OPENID_CONFIG_RESPONSE.body.token_endpoint; - testObj.end_session_endpoint = + testObj.end_session_endpoint = // @ts-ignore DEFAULT_OPENID_CONFIG_RESPONSE.body.end_session_endpoint; - // @ts-ignore - testObj.issuer = DEFAULT_OPENID_CONFIG_RESPONSE.body.issuer; + // @ts-ignore + testObj.issuer = DEFAULT_OPENID_CONFIG_RESPONSE.body.issuer; // @ts-ignore testObj.jwks_uri = DEFAULT_OPENID_CONFIG_RESPONSE.body.jwks_uri; testObj.aliasesFromNetwork = false; @@ -3094,6 +3100,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( @@ -3295,6 +3302,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( @@ -3500,6 +3508,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( diff --git a/lib/msal-browser/test/cache/TokenCache.spec.ts b/lib/msal-browser/test/cache/TokenCache.spec.ts index df8911b947..30d9e8dac8 100644 --- a/lib/msal-browser/test/cache/TokenCache.spec.ts +++ b/lib/msal-browser/test/cache/TokenCache.spec.ts @@ -56,6 +56,7 @@ describe("TokenCache tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( diff --git a/lib/msal-browser/test/config/Configuration.spec.ts b/lib/msal-browser/test/config/Configuration.spec.ts index 6f6036ffd3..fa12522510 100644 --- a/lib/msal-browser/test/config/Configuration.spec.ts +++ b/lib/msal-browser/test/config/Configuration.spec.ts @@ -49,6 +49,7 @@ describe("Configuration.ts Class Unit Tests", () => { expect(emptyConfig.cache?.storeAuthStateInCookie).toBeDefined(); expect(emptyConfig.cache?.storeAuthStateInCookie).toBe(false); expect(emptyConfig.cache?.secureCookies).toBe(false); + expect(emptyConfig.cache?.claimsBasedCachingEnabled).toBe(false); // System config checks expect(emptyConfig.system).toBeDefined(); expect(emptyConfig.system?.loggerOptions).toBeDefined(); @@ -222,6 +223,7 @@ describe("Configuration.ts Class Unit Tests", () => { cacheLocation: BrowserCacheLocation.LocalStorage, storeAuthStateInCookie: true, secureCookies: true, + claimsBasedCachingEnabled: true, }, system: { windowHashTimeout: TEST_POPUP_TIMEOUT_MS, @@ -253,6 +255,7 @@ describe("Configuration.ts Class Unit Tests", () => { expect(newConfig.cache?.storeAuthStateInCookie).not.toBeNull(); expect(newConfig.cache?.storeAuthStateInCookie).toBe(true); expect(newConfig.cache?.secureCookies).toBe(true); + expect(newConfig.cache?.claimsBasedCachingEnabled).toBe(true); // System config checks expect(newConfig.system).not.toBeNull(); expect(newConfig.system?.windowHashTimeout).not.toBeNull(); diff --git a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts index 19c7bb28e4..31714a58c3 100644 --- a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts @@ -79,6 +79,7 @@ const cacheConfig = { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; const loggerOptions = { @@ -1870,7 +1871,12 @@ describe("RedirectClient", () => { ) ).toEqual(`${Constants.DEFAULT_AUTHORITY}`); bfCacheCallback({ persisted: true }); - expect(eventSpy.calledWith(EventType.RESTORE_FROM_BFCACHE, InteractionType.Redirect)).toBe(true); + expect( + eventSpy.calledWith( + EventType.RESTORE_FROM_BFCACHE, + InteractionType.Redirect + ) + ).toBe(true); expect(browserStorage.isInteractionInProgress()).toBe( false ); diff --git a/lib/msal-browser/tsconfig.build.tsbuildinfo b/lib/msal-browser/tsconfig.build.tsbuildinfo index 7731d99b20..19893c2097 100644 --- a/lib/msal-browser/tsconfig.build.tsbuildinfo +++ b/lib/msal-browser/tsconfig.build.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/tslib/tslib.d.ts","../msal-common/dist/utils/constants.d.ts","../msal-common/dist/network/requestthumbprint.d.ts","../msal-common/dist/authority/authoritytype.d.ts","../msal-common/dist/authority/openidconfigresponse.d.ts","../msal-common/dist/url/iuri.d.ts","../msal-common/dist/authority/protocolmode.d.ts","../msal-common/dist/cache/entities/credentialentity.d.ts","../msal-common/dist/cache/entities/idtokenentity.d.ts","../msal-common/dist/utils/msaltypes.d.ts","../msal-common/dist/request/baseauthrequest.d.ts","../msal-common/dist/crypto/signedhttprequest.d.ts","../msal-common/dist/crypto/icrypto.d.ts","../msal-common/dist/cache/entities/accesstokenentity.d.ts","../msal-common/dist/cache/entities/refreshtokenentity.d.ts","../msal-common/dist/cache/entities/appmetadataentity.d.ts","../msal-common/dist/cache/entities/cacherecord.d.ts","../msal-common/dist/account/tokenclaims.d.ts","../msal-common/dist/account/accountinfo.d.ts","../msal-common/dist/cache/entities/servertelemetryentity.d.ts","../msal-common/dist/cache/entities/throttlingentity.d.ts","../msal-common/dist/authority/clouddiscoverymetadata.d.ts","../msal-common/dist/cache/entities/authoritymetadataentity.d.ts","../msal-common/dist/cache/interface/icachemanager.d.ts","../msal-common/dist/authority/azureregion.d.ts","../msal-common/dist/authority/azureregionconfiguration.d.ts","../msal-common/dist/authority/authorityoptions.d.ts","../msal-common/dist/authority/regiondiscoverymetadata.d.ts","../msal-common/dist/logger/logger.d.ts","../msal-common/dist/telemetry/performance/performanceevent.d.ts","../msal-common/dist/telemetry/performance/iperformancemeasurement.d.ts","../msal-common/dist/telemetry/performance/iperformanceclient.d.ts","../msal-common/dist/authority/authority.d.ts","../msal-common/dist/account/authtoken.d.ts","../msal-common/dist/cache/entities/accountentity.d.ts","../msal-common/dist/request/scopeset.d.ts","../msal-common/dist/cache/utils/cachetypes.d.ts","../msal-common/dist/cache/cachemanager.d.ts","../msal-common/dist/response/serverauthorizationtokenresponse.d.ts","../msal-common/dist/network/networkmanager.d.ts","../msal-common/dist/network/inetworkmodule.d.ts","../msal-common/dist/telemetry/server/servertelemetryrequest.d.ts","../msal-common/dist/telemetry/server/servertelemetrymanager.d.ts","../msal-common/dist/cache/interface/iserializabletokencache.d.ts","../msal-common/dist/cache/persistence/tokencachecontext.d.ts","../msal-common/dist/cache/interface/icacheplugin.d.ts","../msal-common/dist/account/clientcredentials.d.ts","../msal-common/dist/config/clientconfiguration.d.ts","../msal-common/dist/account/ccscredential.d.ts","../msal-common/dist/client/baseclient.d.ts","../msal-common/dist/request/commonauthorizationurlrequest.d.ts","../msal-common/dist/request/commonauthorizationcoderequest.d.ts","../msal-common/dist/response/authenticationresult.d.ts","../msal-common/dist/request/commonendsessionrequest.d.ts","../msal-common/dist/response/authorizationcodepayload.d.ts","../msal-common/dist/client/authorizationcodeclient.d.ts","../msal-common/dist/request/commonrefreshtokenrequest.d.ts","../msal-common/dist/request/commonsilentflowrequest.d.ts","../msal-common/dist/client/refreshtokenclient.d.ts","../msal-common/dist/client/silentflowclient.d.ts","../msal-common/dist/config/apptokenprovider.d.ts","../msal-common/dist/account/clientinfo.d.ts","../msal-common/dist/authority/authorityfactory.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","../msal-common/dist/request/nativerequest.d.ts","../msal-common/dist/request/nativesignoutrequest.d.ts","../msal-common/dist/broker/nativebroker/inativebrokerplugin.d.ts","../msal-common/dist/network/throttlingutils.d.ts","../msal-common/dist/response/serverauthorizationcoderesponse.d.ts","../msal-common/dist/url/urlstring.d.ts","../msal-common/dist/crypto/iguidgenerator.d.ts","../msal-common/dist/crypto/joseheader.d.ts","../msal-common/dist/request/commonclientcredentialrequest.d.ts","../msal-common/dist/request/commononbehalfofrequest.d.ts","../msal-common/dist/response/devicecoderesponse.d.ts","../msal-common/dist/request/commondevicecoderequest.d.ts","../msal-common/dist/request/commonusernamepasswordrequest.d.ts","../msal-common/dist/request/requestparameterbuilder.d.ts","../msal-common/dist/response/externaltokenresponse.d.ts","../msal-common/dist/utils/protocolutils.d.ts","../msal-common/dist/response/responsehandler.d.ts","../msal-common/dist/request/authenticationheaderparser.d.ts","../msal-common/dist/error/autherror.d.ts","../msal-common/dist/error/interactionrequiredautherror.d.ts","../msal-common/dist/error/servererror.d.ts","../msal-common/dist/error/clientautherror.d.ts","../msal-common/dist/error/clientconfigurationerror.d.ts","../msal-common/dist/account/decodedauthtoken.d.ts","../msal-common/dist/utils/stringutils.d.ts","../msal-common/dist/utils/timeutils.d.ts","../msal-common/dist/telemetry/performance/performanceclient.d.ts","../msal-common/dist/telemetry/performance/stubperformanceclient.d.ts","../msal-common/dist/crypto/poptokengenerator.d.ts","../msal-common/dist/packagemetadata.d.ts","../msal-common/dist/index.d.ts","./src/error/browserautherror.ts","./src/request/popupwindowattributes.ts","./src/request/popuprequest.ts","./src/request/redirectrequest.ts","./src/utils/browserconstants.ts","./src/network/fetchclient.ts","./src/network/xhrclient.ts","./src/utils/browserutils.ts","./src/navigation/navigationoptions.ts","./src/navigation/inavigationclient.ts","./src/navigation/navigationclient.ts","./src/config/configuration.ts","./src/error/browserconfigurationautherror.ts","./src/cache/iwindowstorage.ts","./src/cache/browserstorage.ts","./src/cache/memorystorage.ts","./src/utils/browserprotocolutils.ts","./src/broker/nativebroker/nativerequest.ts","./src/cache/browsercachemanager.ts","./src/event/eventtype.ts","./src/event/eventmessage.ts","./src/event/eventhandler.ts","./src/request/endsessionrequest.ts","./src/request/ssosilentrequest.ts","./src/packagemetadata.ts","./src/error/nativeautherror.ts","./src/broker/nativebroker/nativemessagehandler.ts","./src/interaction_client/baseinteractionclient.ts","./src/request/authorizationurlrequest.ts","./src/interaction_client/standardinteractionclient.ts","./src/interaction_handler/interactionhandler.ts","./src/interaction_handler/redirecthandler.ts","./src/request/silentrequest.ts","./src/broker/nativebroker/nativeresponse.ts","./src/interaction_client/silentcacheclient.ts","./src/interaction_client/nativeinteractionclient.ts","./src/interaction_client/redirectclient.ts","./src/request/endsessionpopuprequest.ts","./src/interaction_client/popupclient.ts","./src/interaction_handler/silenthandler.ts","./src/interaction_client/silentiframeclient.ts","./src/interaction_client/silentrefreshclient.ts","./src/utils/mathutils.ts","./src/utils/browserstringutils.ts","./src/crypto/isubtlecrypto.ts","./src/crypto/modernbrowsercrypto.ts","./src/crypto/msrbrowsercrypto.ts","./src/crypto/msbrowsercrypto.ts","./src/crypto/browsercrypto.ts","./src/crypto/guidgenerator.ts","./src/encode/base64encode.ts","./src/encode/base64decode.ts","./src/crypto/pkcegenerator.ts","./src/cache/iasyncmemorystorage.ts","./src/cache/databasestorage.ts","./src/cache/asyncmemorystorage.ts","./src/cache/cryptokeystore.ts","./src/crypto/cryptoops.ts","./src/telemetry/browserperformancemeasurement.ts","./src/telemetry/browserperformanceclient.ts","./src/internals.ts","./src/cache/tokencache.ts","./src/cache/itokencache.ts","./src/request/authorizationcoderequest.ts","./src/app/ipublicclientapplication.ts","./src/controllers/icontroller.ts","./src/operatingcontext/baseoperatingcontext.ts","./src/operatingcontext/teamsappoperatingcontext.ts","./src/operatingcontext/standardoperatingcontext.ts","./src/interaction_client/hybridspaauthorizationcodeclient.ts","./src/interaction_client/silentauthcodeclient.ts","./src/controllers/standardcontroller.ts","./src/controllers/controllerfactory.ts","./src/app/publicclientapplication.ts","./src/crypto/signedhttprequest.ts","./src/index.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/graceful-fs/index.d.ts","./node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/@types/istanbul-reports/index.d.ts","./node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","./node_modules/jest-diff/build/cleanupsemantic.d.ts","./node_modules/pretty-format/build/types.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/jest-diff/build/types.d.ts","./node_modules/jest-diff/build/difflines.d.ts","./node_modules/jest-diff/build/printdiffs.d.ts","./node_modules/jest-diff/build/index.d.ts","./node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/@types/jest/index.d.ts","./node_modules/@types/node-fetch/node_modules/form-data/index.d.ts","./node_modules/@types/node-fetch/externals.d.ts","./node_modules/@types/node-fetch/index.d.ts","./node_modules/@types/normalize-package-data/index.d.ts","./node_modules/@types/prettier/index.d.ts","./node_modules/@types/resolve/index.d.ts","./node_modules/@types/sinon/ts3.1/index.d.ts","./node_modules/@types/stack-utils/index.d.ts","./node_modules/@types/tunnel/index.d.ts","./node_modules/@types/yargs-parser/index.d.ts","./node_modules/@types/yargs/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/minimatch/index.d.ts","../../node_modules/@types/minimist/index.d.ts","../../node_modules/@types/parse-json/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},"4576b4e61049f5ffd7c9e935cf88832e089265bdb15ffc35077310042cbbbeea","1e385a987c106de39d4b4fa26669d23c76e302c1709b084b58bf4d94246fda87","5e319fdf572349410b8cc20d220cd6618137774ff770df7ab905b628339fda50","b1c870388df5b626c5485c24319039346c8505d1e3452148086105af1bfd6171","e03f6b084efd111f060e0c13bb864cb7e1d877e35191bbb717b524ae1c7fa947","862843747fa837649bd721feacd2d936e2221a85e35790cc67e2cffbca0dd1a8","724065c2f83560a069b8eade809bb29575df50bd7a32760b1ec533dc2deb5a0c","fb2a08a552475ef4e6ba971fc6ba453bf1706b7f20fb498e30ffe4995f61473c","840c254cef4d519c91012661e23795cc57892ba809351672b72243207083bc1b","a9bab28455365db6d1abf5ac14a819804e1151db5687a82919b78212fafffa2b","9b69d80c4b586889bdaa6e5e84768c0805b9fb4df7e188cf4f8bb7bb3c4c93e3","5a2fbd4dc710310356c99ad75288f33d686e360d8ed6c1302d396058ddb61118","ed4b75e934b993346c8b48953488a42e73184d07c60eff94ea11531999a7d64a","4c858e953c401511747441083ce7ba754f8bc3fe12dde7b6e961650265aaa97a","0fd87bdcee2af2fe527752e9d7f09b15eb3d8e279a143427b29afb5d6d7dac2e","9a1effdd0b12461ce95b95e58c77930b37e299b36cf8b0e307d62c4336faa11f","fb0bd3555b8af1497b0e0acd42c467ce0a40e9a9ed743c0f7722d6fab027c4d0","5ca47328dbfc6337b525152ab88927821a2a24c554bf4d5948f221b61e80d2dd","3304867f11ff65c60da788c360eb2ff136c9d5c3dd38e6d62abbbd89aaa78489","43140e0fcffc94424c4b9c4c7173e490cfb83df68d2e8ef9a6f34a16efa4e1ac","be85fb1199efb6c24dbf3aa5b985f21d649723fce53b9a6e8cab64bb72bcdc3c","3a867a1265733103bcad7755afd47b60a9dcac60d0a5dec42e085d6dcd5c911d","c01787f732d878d85dfa154b2b38e8d37de87d42103de786a5fab48d77c47655","c3c48e4f0deebb1b123f4dd83e980582cc1ea578c40062bce92cd4889ac50fa0","6dec53b98fadb9ec4638c1567d354aee9812fd20363e18e61609a3880ce9c763","fdb8d30b8242df45d23c5a4691b923ab99ad7cf5647693b62ce5824d9f24fe4f","d5f55c52313ecd71940425793e91e2e6f1b4ae8307d6fc5de67a763b22cf84aa","9b36e35bf4f4abcca7de976c5e433f8be6910a7c674b404d2fe24d104254a8ab","d8f9503bc2f5e2b83f640311c546e4cedf4ef7bb0c2ab03e51a0e839ab66b150","b33b82c78c2f7ca8fb2b1af736e2308869d07c5c0cae4a8df81ed540ad5fb7d1","c22e784c6b2d47979cdf84bfe1b18f80532bc94265f62123870b755150067ac2","f53a6907dfc25b09496387bf53900e81740c92a015d39d7c8cf69adc168f90bc","4d8ce0d97019c307467021293b2c24b74c88692f89b103f83f15ace45803233d","0497c19904620e94359644b1b82447a57da03d520cba2e7b776c72d7829eb192","63354c3d7e63811e62243e4cf2bf1efc31f1eaa3d7f15cbac8e532986ea13772","93d77d212d03de4e0c178dfd2ca291ce5f9625ca7a4c4083cba957eadde4ac27","77207dda0cfc40edde84a390109f49fa399c90aa38dd409dd7bd2fe2f7c84c98","a4a011a1d8fe222cd7b7172d27a9d72dd278f9f054585f7896ca859c343feefb","5bdabd9e1f998ecefce8911db251da9b847e8a79dc769ab90f224dbda84038a3","bbc3b1e705969c600f86c16aeec099c3b1e76096ed8227e0050cb7049d3305b1","7cf75e284d43663adcf5fcee60dcbf8d87f0fa7eba404af34a802493dac3ac5c","d2f0b0326978533385f6256ff7ba75d6cf6fa9426d55c5bbb2a5c0d6fa892e69","e9e51d22e92e12c72c5418bec47197de38577a30cdbd5eb67efea402c2722986","dd87e240c0115e6e75635fecac4d76ca829a73c4ab5bb74bf18380b394830b39","dd93626fbc255c1439093574aed0806f3aec4baf9ce99c9867ef7951b616d89c","38c468fd15ab0b0d979625adfa3562aa3113277823f54bdc4072cf43691faf59","c7205cf438edcb87dd62562eb5586830cf57790ff3fa9c1bc6ea67e4e0a6c5f1","88e90c6527b256095681b1a89c14d9bee15dd002493730f20eca454c73ba6c78","69514537455a02e3c51c1238d821c65eee1d57b16081e379a47b22cc61b37e34","946fa0abe5336c2c8efb9aff02b4987889ba4f225b115bfa635614dfee52d4c7","9a155c2da9c111dc02dfae665fba36d0e8ae665b76f55aec87d48e1150653f28","12d918e9578ad563a64c094717e55a7a5bc738bd03476e36312d8a20f57dea18","99cef539733f3c32895e5890426a39281f533afcbf8780025d258020b30a9cab","2467ec5f8f8ca4f44b6f8af00ed1c004c91639239bdc51e79682ff0c4e348e5e","52c6c5e6a1de07b2bb5d0bb4370151506c9b9526b589793dd07338f42fc8234c","311c3d7c21065edd96c1400d79e29fbb28f87acb68d453d416f2a93114f8c7d0","9329d7590c92d3ce321d3c4de36d53528afe7bd40b79224c022b9a81eab526d8","18eac57b1c6a7525a83038562f36ba94994166ed108c134522f59926d729b703","3a610d83a35b9cafbef90aaa379cdb5fc1681e930978a8c477e74d08784bd47c","ca7b4548270f45c13b60a8b22a50fbe0b73070a60209a92f9924c2d426b9ef79","c649bebc86680273b4b8411a7eccef4613696151c3aa74b1fd4f44851dba3123","a54b5d7f8c63c389c475359d4bd776e872cbf96360b44cc75a9cbe804ffcf285","4a53c158922bf59d84d825e724c2596434f80251b6df4292cfae9ff75bff94a8","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"57b6cb95756d1fe3bfeb20205de27b0c5406e4a86e130c6dfa6bd92af641e09d","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"e193e634a99c9c1d71f1c6e4e1567a4a73584328d21ea02dd5cddbaad6693f61","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","216717f17c095cde1dc19375e1ab3af0a4a485355860c077a4f9d6ea59fab5b5","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"80473bd0dd90ca1e166514c2dfead9d5803f9c51418864ca35abbeec6e6847e1","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","e6c86d83bd526c8bdb5d0bf935b8e72ce983763d600743f74d812fdf4abf4df6","a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","7d55d78cd47cf5280643b53434b16c2d9d11d144126932759fbdd51da525eec4","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"6de4a219df57d2b27274d59b67708f13c2cbf7ed211abe57d8f9ab8b25cde776","0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"d8d555f3d607ecaa18d55de6995ea8f206342ecc93305919eac945c7c78c78c6","e2a7281a5a7aec0ceb36ea105b8b3e1c6d6758ed199301f3a10de5ebbcb6e743","7f74442d87d094f1b77bed3748dd97c1d139eb05222fb46de9d1b8402279bd7d","0d39ee91274c833749ac253a276869d9bac615224a2cd55b65502260e02da127","f2fc45586b1e881c9e9cbff4445981c9c94554088881696cfa8926c10368838e","010696076753d265a6a67bcceb9ea6e66107067be599bdc2b0619efdc08d1bc7","e475bef588275a0f2b53373b3d17c7ddeaf111c40d3ca2706bfff92d2bf19d4e","612c84d13df19cc411b683a84df4a6401587afe703facbba3fc64ca933538fba","038799d3d36cdd6a0ab716d965f587f5d8f610a5306e1993364ebf4fae069ca3","3510b344ffb66182b00c0956dff723c6ab69a314112e71dd1eb0346a92d0312c","5599f34a53ab350a54e15a81982ba1c98197430ec3e1df7edcd37d1f31fdc506","d68d14ef5a31134bf952ef96c93446ed4f0686e840d0011a071ff8f4c782a30b","d4b5dc4a29556e4a80411db80e9f7eb69c69584e0738aca09ae4a6654c93d21f","63e61c4ea896197bfcbf8c499a2409baa31ab146694a847ec606a7e74080948e","60cab134777f1131b3abbe42a3eba3003013adb8c4d8a2f882a682c796c8a11e","0c0d1eadef6a092235981c643b9b797280f5130ddb3a738d563b87780977f668","7e25b3b42add5bb8b326256318255e81b83bccbfe4eff3bbab2070dffeb94f79","25e8e09851923044013f6efda775298ea55f220965d77c58b8a33802b63284f8","c22e086a091cfc8ccea49c0a23d7f59a70e61eff979662a0094e23aca97a9dcb","eb59654ed8ce9fc95dae05812daa514c9c8e0d0a49055d0b33e651e6926b31ea","0239a0d675f381ce9ee8ad7c77ab8acf9a1936810c2cd347480ea22f0acf6a9a","c7bb3d343635262f28289a380344885cc2d1178c4f2dc11e6e52eb6ec9fabff3","35af861275f61dfdf1be3690a1d53cfd825d7936c4ae548902291900b8402208","07885dee25c5ef1a3aa8706bf5dee042d5fd8ff2aa084ad576364996558e6aac","36592459ea33688b09cc82689b506ea58ab6f9785d4d9b85dd368325801faeb5","00595ab91d01d295a2a1fa5ca7ac8a976846d59fe7ca901a50c1605a48f30db1","9585005cf0ada58ee1024cec39d99fc9993f3e0a54011cfc2eebf7cf9ca875a6","64204f5616702808166a699eac9856d511700688db9b5e9d9bdf202c72ffc2cd","f5e76f7e9150bbdda56e2160e1291c682b28c5999cb9447a62256d04b0a69a26","fcb811dca5517cd0df9e0419a167e59dc2420a3b53248384b79ad40c62148e28","09158c9a28a1cf248f56fae441d90c9ca461e3378b64da07d7bc14ba1b86eb72","fc4f66910ae04a9d92a32588f47c131f32eb3809240d11cc3c715c9521f8e51f","8b4f4b7b2090b00acd17fe62fc30b1f8e57940c28d3b6ed450c1ef855be07330","a07a778db67a89aabb04c41806d28552f8428f2fbcf0f488d1a1ffebd4c568d3","a0a079fceca9261b22e611371647f081422cf2f33f104deee7c3dbf00c938190","f4a1cf86f7f71d4e20c90fcf34193d22737499d508a88ffa2f0a94dc1cbe1f20","3ad325feb1f14d572aa67780575a31ba1e75df92e07fe762c6c605425c82727b","179c52a8c5b0db2bfdaf3695393d7157ea3b605b4b6e8fa2d421e72a7afd3840","def88db6bdfce7bcab39f5faec825d5b88389e235741130989a5158fd1ccd178","43082e738f695414514204221ea73dec8cc238a32b892cf9ef987ce7306eb733","aefdc2770c29c5630e908513c45072afea4b09420ea988d551e927e46c7c85d3","41478fcf2fd6d8f32f9a7050e3fa192140b90dde56a3503e3d3cdb34120ae6ce","6ed7ec85c2efa9901cf6ff85513304221ca7104244ed412bcc3407843048a019","be42043f7b5add250dbcc82da7199f8cc1c32ff2c4e7532216043d99ee9ee481","5cca704e3d35807b0b8bf3d29dcc3e18ee78c401e58886daec5adebd70b11503","0fce22de0933f7003e94d97060d6e0a63a397fc661030c3b41f52e75bcc88b1b","14a11fcd3ac91174a26b150d4d0c6aed0e010fa412207b65b505e5a5205182e2","ff0815582326b779a5920602f257189a3cceb7f3c26ec2e386fbbcf03dc14bab","d222d5d94b908a09c806d3c2a1b859482e22800aa29594ec327f94543df2f885","84ad1063e46bbc5314a35f8bad7798ec87b2cba274f2aa1215ffb4eeb87383ee","ca8c7e6ccc8299f51be8a63d67eb4884920e4706f942b4a060ddce304103b7ea","24ab30eda63791b3f45a398ae31b66acc0a36e2cebb1c3167db3639a01f67256","d9ba8e5c84e9686730a5a573c4394f81c39f0ee4902fc7c0d8669eebb745dab3","2a2f286378234a2cee79fc16ee97835d3cb7a67d1dfe8118b07fb36a392d89b6","0cf6f34f36515a78e185cf052db6e2cdd040ae5ad8c7c2f5cddfce150e80d7b4","57bbfe242a99fd2f6d71b62dd838f7d5d9aceaeae8221934392cc1a15eb061a0",{"version":"056c7233a21291c4d5b1971f8421512c364bc20fed90b9d1dd0d8f27b8e39d5a","signature":"d197ae9b234e6038e679a3d9c3c65414ba27664e196ef8657772b8c8d0aaf1b4"},"b3dcf1545827ca7f2300515008e324c83474fa2a5eb71082b6be97941438d2f8","de930e86262cabede8aaecd6e7f50f11c66f3ff440b443ea8be55cb7963b662e","ea0d54935a770e2b98bad78d718c75e77a6aaa129fa80a7ec5736c301c1ba1fc","e7c598a83a03cd7790650d72482628a91ef54b61a82566df70340990c07df426","db1f3026dece2e8d3a4ecd3967e17e9f270d0d9f2ef6e729f9f6a6da3c1c92ba","63b3b61803c3332cb30f22d9557266278ba35e4d5f28b5fa66c49618ccf1e5db","f2dbe29bfe06cfa1faf05036bb4d283a573ced9e65b516781d8ca444727d0785","79ac794d512663c8a40a0df96a34487f8e74539e06a5ef066ebeddf9a149ae04","8b52fd0c3e8906888df558c12fc41d09ca09210dedd977660e8b71ffe52023e3","e7523c2c128412141a6f61ac238707fda7cc1aee5f532221bbbcfc4e430b0f30","db1147d62f7093750f37a32df084a660e58c98d519652563a26df62d31c657b8","13c78ad459ab056e8632aab0004f6fd7bfd6228aa62312ca960728dac94225f6","875383df6e85ccdc3f76ee7e9a85544620035a43de51f346f31a0dddcf435a04","14f90c2402ea4d1ae2b3831b61a840fab318d0034e2e7cc0e7e3c5db41f4bde8","51a72d498a22effce0e62bd87a3efc02731569d31aeae4e5dfb8532235cf090a","986855a63ecc9c740e697db64150ee4aebdf776bf8f6bb51b7669e187dc549c1","608a7f4d3c36e979fcca86535e5ebe6040813344acbf6a8f58d6b84fafa571ae","b333c62026fe1a09474a11e0854ebd7215c125da7bd7584bd77627b3eeabe83d","64b459e59a172275dcdb235553a80115db3bd5a81f8fe629830a8f33f29b3cdf","648f83235478575ced1ec77e6af6b46bea5362bdfcfccd7291314f0f7bf1a137","172388d261e58df2b4ca3a2822cd4aa285415ab050bd027ea506dfb2f285075a",{"version":"8728a4d5320916fb4909ab29fa6cf39b37ea2a90cc984a8c953da91ff45cd63b","affectsGlobalScope":true},"7d44097bd6100a1b1c1013c8fd818e98221edfeed1f901df7d849949d4ab5c3f","f2ac7bdd535bd8ad95f1253b44488b1ad530d797b69da8003424d7ac438284a2","82c80088bf08d069c595be833b7b16aaaedca6400fc02f1ad13ef97dcd5a6579","78d8a7d7b9e461de9a361356e5962b1d297c152085afc623ec7bfca4d7ab6748","00d50fd7d4d412cc52d3b5c6106a15d202d2ae86d4232efe25b3b93ae30b65f8","1e9a4754e7bfc0e5e0d9334b2dd1ae200745e859e242a0731557372b83adcafc","7620b21e40397ce60afaae7b7dea5697e4d79838f104a891b17eed79d993319b","34a9deba807e9cc490dd85edcb07e1840267481d0fcaf81ef1282e7f46561189","c404392717f996db62d70e560eca6f85573aac2fcb0a08eb3822a44bced6c79f","73363cea4bfa7cb414cea485565891d061e8c4f273a49a57d392a5f21b8e4c31","a31e4faff48594c48f7b831a8cae3cec03209cd5f1e6defb76f26b024f35fb61","f3f0772ad14ffeb9f8540c371500a26f23da69f54658f6e796845996ba214a74","1a2d63186069bc9c246eff56e61467d0503e40941ccf5344003d1a9306f0d74e","233ad5ae44409b60b8f5a608db873ed00a410fd22e4ec094a3d4a1686eaf26c4","7c191a7830a724eeed3a3a9260104a2d8dbd8eea5fbe5a661507c01235acaa87","a3ac2beb8ec289c2bbec8d86a92aa15549c76c291381607c507f20e9d035014c","b68fedd52f606a729a3342602c0d435d8d762ab87a7863f28678a5ec9d05d3ea","b3b2ba7e8c50b4b22615a3e344fee19ec1669583cc02fd877e9f49b967307150","e8f6ca217b77ab29e9774919fe6808ca352aebdf047c76fceaa2fcc27b6f062f","3bfdd8c2d0ccf93d13a930ca7c64cb7c312156138f7a8c270832935cf1f8656b","acfe21bab40163fa684741350f52fbd4d2297face00c3e93bb601222baa9041f","9aac78f53a727d0fff57cd569003bbd30d45f7ce650ce1361f73142a66bbb934","71bbe82a64b6387c31566f738687036ceab49ffd44cb0c5fe5ded054ba1f2170","d7d6a663ab7948d1b32c2f89e0e76e5221db6a3048e182b8774e643b9e040db3","f1ada71a7e7a60eebface151f2f03283920764b31dc5620ecfee8694dc555409","5b0be434253bc1877b6101b643954537ff9c0d55fd36af2b58bbf59da49b6f1b","7520b8fd838b0fbb00c880a2ee96182d7cc3fa284a01d9e76d4d546662ac5411","86f1ba4ab86ed246250c97930abbcc6aa483ecc7112eb143ea06287bac2718ac","6dbcbb58668730105e4b77bd23cd2c564359951534de050bb90075d5712f3e7e","3078727fed04c123165efdb42deeac5dceaa42ac62216ca13cb809dc7e13415f","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","b4f76b34637d79cefad486127115fed843762c69512d7101b7096e1293699679","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","dae3d1adc67ac3dbd1cd471889301339ec439837b5df565982345be20c8fca9a","b6ddf3a46ccfa4441d8be84d2e9bf3087573c48804196faedbd4a25b60631beb","946bd1737d9412395a8f24414c70f18660b84a75a12b0b448e6eb1a2161d06dd","bf88ef4208a770ca39a844b182b3695df536326ea566893fdc5b8418702a331e","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","d8aab31ba8e618cc3eea10b0945de81cb93b7e8150a013a482332263b9305322","462bccdf75fcafc1ae8c30400c9425e1a4681db5d605d1a0edb4f990a54d8094","5923d8facbac6ecf7c84739a5c701a57af94a6f6648d6229a6c768cf28f0f8cb","7adecb2c3238794c378d336a8182d4c3dd2c4fa6fa1785e2797a3db550edea62","dc12dc0e5aa06f4e1a7692149b78f89116af823b9e1f1e4eae140cd3e0e674e6","1bfc6565b90c8771615cd8cfcf9b36efc0275e5e83ac7d9181307e96eb495161","8a8a96898906f065f296665e411f51010b51372fa260d5373bf9f64356703190","7f82ef88bdb67d9a850dd1c7cd2d690f33e0f0acd208e3c9eba086f3670d4f73",{"version":"ccfd8774cd9b929f63ff7dcf657977eb0652e3547f1fcac1b3a1dc5db22d4d58","affectsGlobalScope":true},"736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","c8a34d0c858532a9fab7f0b65f3cff6507df055a0cd8b965c4fd5667b5a0cf7d","3663d1b50f356656a314e5df169bb51cb9d5fd75905fa703f75db6bb32030568","6fa0008bf91a4cc9c8963bace4bba0bd6865cbfa29c3e3ccc461155660fb113a","bc88e4049153bc4dddb4503ed7e624eb141edfa9064b3659d6c86e900fe9e621","8baa5d0febc68db886c40bf341e5c90dc215a90cd64552e47e8184be6b7e3358","168435ab3390620aebf1aa0001b380983582d0849755eeb17f2c501d1fc57587","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","882057f051daf834e4d01701066e1bac2d243b0c3eda702b25874402c1e0172d","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","149ebd778196c03e9c75b630866543501e0e9e62a146c1a17ce91ade4cdfb0ba","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","8841e2aa774b89bd23302dede20663306dc1b9902431ac64b24be8b8d0e3f649","209e814e8e71aec74f69686a9506dd7610b97ab59dcee9446266446f72a76d05","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","6aee496bf0ecfbf6731aa8cca32f4b6e92cdc0a444911a7d88410408a45ecc5d"],"options":{"allowUnusedLabels":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"emitDeclarationOnly":false,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"module":99,"noEmitHelpers":true,"noImplicitAny":true,"noImplicitReturns":true,"outDir":"./lib","rootDir":"./src","skipLibCheck":true,"sourceMap":false,"strict":true,"suppressImplicitAnyIndexErrors":true,"target":7},"fileIdsList":[[152,267],[152],[152,267,268,269,270,271],[152,267,269],[123,152,159],[152,275],[152,276],[152,281,286],[125,151,152,159,288,289],[125,140,152,159],[106,152],[109,152],[110,115,143,152],[111,122,123,130,140,151,152],[111,112,122,130,152],[113,152],[114,115,123,131,152],[115,140,148,152],[116,118,122,130,152],[117,152],[118,119,152],[122,152],[120,122,152],[122,123,124,140,151,152],[122,123,124,137,140,143,152],[152,156],[118,125,130,140,151,152],[122,123,125,126,130,140,148,151,152],[125,127,140,148,151,152],[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[122,128,152],[129,151,152],[118,122,130,140,152],[131,152],[132,152],[109,133,152],[134,150,152,156],[135,152],[136,152],[122,137,138,152],[137,139,152,154],[110,122,140,141,142,143,152],[110,140,142,152],[140,141,152],[143,152],[144,152],[122,146,147,152],[146,147,152],[115,130,140,148,152],[149,152],[130,150,152],[110,125,136,151,152],[115,152],[140,152,153],[152,154],[152,155],[110,115,122,124,133,140,151,152,154,156],[140,152,157],[125,127,152,159],[152,297],[152,279,282],[152,279,282,283,284],[152,281],[152,278,285],[152,280],[43,152,190,193,194,195,200,202,203,213,214,223,228,253,254],[43,152,190,193,194,195,200,202,213,214,223,253,254,255,256,259,262,263],[43,152,190,191,195,202,208,216],[43,152,190,195],[43,152],[43,152,190,191,206,244,245],[43,152,190,191,195,202,204,205,206,207,208],[43,152,195,203,204],[43,152,190,246,248],[43,152,191,195,244],[43,152,190,223,252],[43,152,204],[43,152,190,191,202,209,223,253],[43,152,190,195,198,200,201],[43,152,190,202,215,256,258,259,262],[43,152,190,193,194,195,200,202,209,212,213,214,217,223,228,229,231,253,254],[43,152,190,191,193,194,195,198,200,202,203,208,209,210,211,212,213,214,215,216,217,223,225,226,227,228,229,231,232,248,250,252,253,254,256,257,259,261],[43,152,190,191,202,203,234,235,236,237,238],[43,152,190,191,202,234,239,240,241,242,243,247],[43,152,190,233,239],[43,152,195,235],[43,152,190,195,234,235],[43,152,190,191,239,241],[43,152,190,215,248],[43,152,190,234],[43,152,190],[43,152,190,191],[43,152,190,195,210,211],[43,152,190,195,210,266],[43,152,190,191,192,193,194,195,198,199,200,201,202,203,210,211,213,214,215,219,223,228,251,252,254,255,264,265],[43,152,190,193,194,195,198,200,202,209,212,213,214,215,217],[43,152,190,191,193,194,195,199,200,202,208,209,212,214,216,217,218,223,224,225],[43,152,190,191,192,193,195,198,199,200,202,209,210,211,212,217,220,221,226,228],[43,152,190,191,194,195,198,199,200,202,209,210,211,212,213,217,220,222,226],[43,152,190,191,195,200,202,209,212,217,219,220,230,254,260],[43,152,190,191,195,220,223],[43,152,190,191,195,200,202,209,212,214,217,219,220,226,230],[43,152,190,191,195,220],[43,152,190,191,193,194,195,198,207,213,214,215,218,219],[43,152,190,191,195,209],[43,152,190,191,195,199,200,209,221],[43,152,190,191,202,209,221],[43,152,195,207,208,209,212,216,217,220,222,224,225,226,227,229,231,232,248,249,250],[43,152,199],[43,152,199,200],[43,152,195],[43,152,190,191,195],[43,152,190,202,215],[43,152,257],[43,152,190,192],[43,152,190,202,239,240,249],[43,152,190,193,194],[43,152,190,191,195,196,197],[60,152],[55,60,152],[55,152],[46,47,48,49,64,66,69,70,71,74,83,90,152],[66,69,71,74,75,83,152],[49,68,152],[67,152],[44,152],[61,90,95,152,159,160,161],[51,53,55,56,57,58,59,61,62,63,65,66,71,77,79,152],[44,50,55,152],[46,55,60,61,71,75,76,152],[47,64,152],[51,56,57,58,77,152],[50,152],[51,56,57,58,59,61,62,63,65,77,79,152],[87,152],[86,152],[44,51,56,57,58,62,63,65,77,78,152],[74,90,92,93,94,95,96,97,152],[45,53,55,71,74,75,80,81,82,83,85,90,91,152],[74,90,92,95,99,100,152],[74,90,92,95,100,152],[55,69,71,75,80,83,85,86,88,89,152],[53,54,152],[55,74,152],[152,178],[152,181],[44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,65,67,68,69,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,152,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,184,185,186,187,188,189],[90,152],[82,152],[45,80,81,83,152],[45,53,80,81,82,152],[44,52,90,152],[52,53,91,152],[44,52,53,61,152],[53,67,89,152],[52,53,152,170],[52,61,152],[53,152],[53,91,152],[53,61,152],[52,152],[44,52,85,90,104,152],[61,152],[81,152],[53,55,59,71,74,75,76,80,81,86,88,95,97,152,164,175],[72,73,152],[71,72,73,74,90,152],[72,73,74,152,186],[44,62,70,80,84,152],[48,152,164],[152,183],[152,304,343],[152,304,328,343],[152,343],[152,304],[152,304,329,343],[152,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342],[152,329,343],[275],[276],[304,343],[304,328,343],[343],[304],[304,329,343],[304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342],[329,343]],"referencedMap":[[269,1],[267,2],[272,3],[268,1],[270,4],[271,1],[273,2],[274,5],[275,2],[276,6],[277,7],[287,8],[289,2],[290,9],[288,10],[106,11],[107,11],[109,12],[110,13],[111,14],[112,15],[113,16],[114,17],[115,18],[116,19],[117,20],[118,21],[119,21],[121,22],[120,23],[122,22],[123,24],[124,25],[108,26],[158,2],[125,27],[126,28],[127,29],[159,30],[128,31],[129,32],[130,33],[131,34],[132,35],[133,36],[134,37],[135,38],[136,39],[137,40],[138,40],[139,41],[140,42],[142,43],[141,44],[143,45],[144,46],[145,2],[146,47],[147,48],[148,49],[149,50],[150,51],[151,52],[152,53],[153,54],[154,55],[155,56],[156,57],[157,58],[291,2],[292,2],[293,2],[294,2],[295,2],[296,59],[297,2],[298,60],[279,2],[283,61],[285,62],[284,61],[282,63],[286,64],[278,2],[281,65],[280,2],[43,2],[8,2],[10,2],[9,2],[2,2],[11,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[3,2],[4,2],[22,2],[19,2],[20,2],[21,2],[23,2],[24,2],[25,2],[5,2],[26,2],[27,2],[28,2],[29,2],[6,2],[33,2],[30,2],[31,2],[32,2],[34,2],[7,2],[35,2],[40,2],[41,2],[36,2],[37,2],[38,2],[39,2],[1,2],[42,2],[255,66],[264,67],[217,68],[208,69],[224,70],[246,71],[209,72],[205,73],[247,74],[245,75],[244,70],[253,76],[204,70],[206,77],[252,78],[202,79],[263,80],[256,81],[262,82],[239,83],[248,84],[240,85],[235,70],[236,86],[238,87],[237,86],[243,88],[265,89],[242,90],[241,90],[191,91],[203,91],[216,92],[212,93],[211,94],[210,70],[266,95],[218,96],[260,91],[226,97],[229,98],[227,99],[261,100],[225,101],[231,102],[232,103],[220,104],[221,105],[222,106],[230,107],[251,108],[200,109],[201,110],[199,111],[196,112],[197,112],[257,113],[259,114],[258,114],[215,70],[254,91],[219,91],[228,115],[213,91],[193,115],[192,70],[194,91],[223,69],[214,91],[250,116],[249,91],[195,117],[207,69],[234,91],[198,118],[233,70],[61,119],[76,120],[91,2],[89,2],[104,121],[183,2],[60,2],[75,122],[105,123],[69,124],[46,2],[67,2],[68,125],[64,2],[47,2],[49,2],[70,126],[162,127],[80,128],[56,129],[77,130],[58,2],[65,131],[59,132],[50,126],[51,133],[57,133],[62,2],[63,2],[66,134],[88,135],[86,2],[87,136],[79,137],[98,138],[92,139],[101,140],[102,141],[103,2],[90,142],[55,143],[166,2],[167,126],[188,144],[54,2],[178,2],[181,145],[182,146],[179,145],[180,145],[190,147],[71,148],[83,149],[82,150],[45,126],[163,151],[189,2],[177,2],[53,152],[94,153],[93,154],[168,155],[171,156],[96,157],[169,158],[99,159],[100,160],[172,158],[160,161],[161,2],[173,162],[78,2],[95,163],[97,2],[170,2],[174,164],[176,165],[164,2],[81,126],[74,166],[73,2],[186,167],[72,2],[187,168],[85,169],[84,2],[48,2],[165,170],[44,2],[52,2],[175,121],[184,171],[185,2],[299,2],[300,2],[301,2],[302,2],[303,2],[328,172],[329,173],[304,174],[307,174],[326,172],[327,172],[317,172],[316,175],[314,172],[309,172],[322,172],[320,172],[324,172],[308,172],[321,172],[325,172],[310,172],[311,172],[323,172],[305,172],[312,172],[313,172],[315,172],[319,172],[330,176],[318,172],[306,172],[343,177],[342,2],[337,176],[339,178],[338,176],[331,176],[332,176],[334,176],[336,176],[340,178],[341,178],[333,178],[335,178]],"exportedModulesMap":[[269,1],[267,2],[272,3],[268,1],[270,4],[271,1],[274,5],[275,2],[276,179],[277,180],[287,8],[289,2],[290,9],[288,10],[106,11],[107,11],[109,12],[110,13],[111,14],[112,15],[113,16],[114,17],[115,18],[116,19],[117,20],[118,21],[119,21],[121,22],[120,23],[122,22],[123,24],[124,25],[108,26],[158,2],[125,27],[126,28],[127,29],[159,30],[128,31],[129,32],[130,33],[131,34],[132,35],[133,36],[134,37],[135,38],[136,39],[137,40],[138,40],[139,41],[140,42],[142,43],[141,44],[143,45],[144,46],[145,2],[146,47],[147,48],[148,49],[149,50],[150,51],[151,52],[152,53],[153,54],[154,55],[155,56],[156,57],[157,58],[291,2],[292,2],[295,2],[296,59],[297,2],[298,60],[279,2],[283,61],[285,62],[284,61],[282,63],[286,64],[278,2],[281,65],[280,2],[255,66],[264,67],[217,68],[208,69],[224,70],[246,71],[209,72],[205,73],[247,74],[245,75],[244,70],[253,76],[204,70],[206,77],[252,78],[202,79],[263,80],[256,81],[262,82],[239,83],[248,84],[240,85],[235,70],[236,86],[238,87],[237,86],[243,88],[265,89],[242,90],[241,90],[191,91],[203,91],[216,92],[212,93],[211,94],[210,70],[266,95],[218,96],[260,91],[226,97],[229,98],[227,99],[261,100],[225,101],[231,102],[232,103],[220,104],[221,105],[222,106],[230,107],[251,108],[200,109],[201,110],[199,111],[196,112],[197,112],[257,113],[259,114],[258,114],[254,91],[219,91],[228,115],[213,91],[193,115],[192,70],[194,91],[223,69],[214,91],[250,116],[249,91],[195,117],[207,69],[234,91],[198,118],[233,70],[61,119],[76,120],[91,2],[89,2],[104,121],[183,2],[60,2],[75,122],[105,123],[69,124],[46,2],[67,2],[68,125],[64,2],[47,2],[49,2],[70,126],[162,127],[80,128],[56,129],[77,130],[58,2],[65,131],[59,132],[50,126],[51,133],[57,133],[62,2],[63,2],[66,134],[88,135],[86,2],[87,136],[79,137],[98,138],[92,139],[101,140],[102,141],[103,2],[90,142],[55,143],[166,2],[167,126],[188,144],[54,2],[178,2],[181,145],[182,146],[179,145],[180,145],[190,147],[71,148],[83,149],[82,150],[45,126],[163,151],[189,2],[177,2],[53,152],[94,153],[93,154],[168,155],[171,156],[96,157],[169,158],[99,159],[100,160],[172,158],[160,161],[161,2],[173,162],[78,2],[95,163],[97,2],[170,2],[174,164],[176,165],[164,2],[81,126],[74,166],[73,2],[186,167],[72,2],[187,168],[85,169],[84,2],[48,2],[165,170],[44,2],[52,2],[175,121],[184,171],[185,2],[328,181],[329,182],[304,183],[307,183],[326,181],[327,181],[317,181],[316,184],[314,181],[309,181],[322,181],[320,181],[324,181],[308,181],[321,181],[325,181],[310,181],[311,181],[323,181],[305,181],[312,181],[313,181],[315,181],[319,181],[330,185],[318,181],[306,181],[343,186],[337,185],[339,187],[338,185],[331,185],[332,185],[334,185],[336,185],[340,187],[341,187],[333,187],[335,187]],"semanticDiagnosticsPerFile":[269,267,272,268,270,271,273,274,275,276,277,287,289,290,288,106,107,109,110,111,112,113,114,115,116,117,118,119,121,120,122,123,124,108,158,125,126,127,159,128,129,130,131,132,133,134,135,136,137,138,139,140,142,141,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,291,292,293,294,295,296,297,298,279,283,285,284,282,286,278,281,280,43,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,255,264,217,208,224,246,209,205,247,245,244,253,204,206,252,202,263,256,262,239,248,240,235,236,238,237,243,265,242,241,191,203,216,212,211,210,266,218,260,226,229,227,261,225,231,232,220,221,222,230,251,200,201,199,196,197,257,259,258,215,254,219,228,213,193,192,194,223,214,250,249,195,207,234,198,233,61,76,91,89,104,183,60,75,105,69,46,67,68,64,47,49,70,162,80,56,77,58,65,59,50,51,57,62,63,66,88,86,87,79,98,92,101,102,103,90,55,166,167,188,54,178,181,182,179,180,190,71,83,82,45,163,189,177,53,94,93,168,171,96,169,99,100,172,160,161,173,78,95,97,170,174,176,164,81,74,73,186,72,187,85,84,48,165,44,52,175,184,185,299,300,301,302,303,328,329,304,307,326,327,317,316,314,309,322,320,324,308,321,325,310,311,323,305,312,313,315,319,330,318,306,343,342,337,339,338,331,332,334,336,340,341,333,335],"emitSignatures":[[191,"d441166844cb18828680dbf0093614f6a7d7f3ed598452f23e037850f51d2b48"],[192,"efb8e27827124bc3bf96b81288c0278c722d10f2372a1bbbb9de1943e784022b"],[193,"b6db293a5ba0539a0007b69a92c196b21be784c1781e2f8b573fc70e5502fe00"],[194,"3faa2b7701286a5b3863930e59ec45a3e74a9b6dacd216e168afb2a799a9598a"],[195,"ad571a3f39e29d5e8e075af18b746e5e2d3118b988e9e83aad817a42095ae6a5"],[196,"19c3d80a37e4a5874dc264c1b5c5e11e73c25c65c31caa30064444e22d2bc19e"],[197,"587a18a5a21a6151ff51d2866fac32a61c2bf38ba878e2e5fcae6c06a27c8ed9"],[198,"d096779b92cdcef404daabce9e63afd112933685aae708b593a047fc6ef13682"],[199,"028906b65dcdb3143cc9b429815765340ffc11d40b7366ba30bb32e558e111f2"],[200,"05ba173a5408ad8a44e055640e5e153a684c6403f860dca7670cf52bd55b8f06"],[201,"91e41ef69d685c82a0a4fa960f672aca91d0bfb84e83226cc0efce42ea885f91"],[202,"0ccc83798a02eccf9f48d3c3f40018a9325e7c8340ebb37f0b6fcccccc559746"],[203,"14badeabb60c97286c971eb2a6836f94b11c640ff5524f732a4db47794aa81b5"],[204,"8c83218e92cb960a020ce6ccf208c7fdd29fdba50f824ec9f7804b9a47c175d0"],[205,"30e79e66ea64c11aaaec0ae2b8e5b7103719724a177ff960f46f354f43802917"],[206,"dd3e55e236d60bdf8506e7b8be544f8b9df241b62ee011b31315ab2e79b0a903"],[207,"21d8187cfb7239fce0ce089728ffd45ecbf8c4aa27032d9db415ea3cf5ca3c51"],[208,"603b76444ae7b739baddb69d2aae1e5c18b5c5c1015e881b3c3f2c513eb238fa"],[209,"43c34dae447b31f4c7dd950e2f680aba20870b8c609fa9833653dd98fd4c439a"],[210,"eae113bf0a860bcbc633f34b3f36e727d17be869809a9e9cc669465856cc7008"],[211,"b9ca0fb0079964ec1910ff2b82e5b8ca83f1ac6de0eb7c522dbfb684dc9183df"],[212,"22ff06d3a95eec8c7d0c5f0129af7303a358496857e0ce33e1c9208769f58741"],[213,"eef3134d50fa7818d4c01c67fb07f06370d555d962eff626b4d07a02129ef3ae"],[214,"220783370c7924b174300eba6475f0f0bfdd9af48b1b6666e396492b1f3fef98"],[216,"9949d8f1e82774101d22659e35dc5e033d88f9ff063f771f9b9adcd75ad19de7"],[217,"487ca02a3e3bbd43ad193f10a67c45ef382126be9a368d05811a661b905d3a8d"],[218,"58ca8213c17a9c2411639a1d7c400fc4607c8670cd5aea4587d484541b359a37"],[219,"631b03a76016caa819ebfa95a40a7c5eac41820c4451135f9114073e75ec4afe"],[220,"30e5060e2b21e10485b6ea2be7a6333a1203221bc524bcc50e91705da896e7f3"],[221,"28294756d2ac4e877f815fead8368692fc7184a1eac4068f2520d63a0a2fda8e"],[222,"3caff9d44a20278cb2afc4dc64920cc9526e54a573c173291a9d8fc1b158bf9e"],[223,"69519f4adf7a7cb54324811083ee3be4e1c5347e2ac231f8ea4e496887bff4c9"],[224,"8b837e28c1150e380b11aeaf340df60807cdab426470f8676f00bf95a4319a3c"],[225,"4ac2f63cc352f37faf2c9541c721ad3229395d37abfc598e2a43072058a72e69"],[226,"bd867da24128f3d993754f1d2d9b95c9f2ff621a8d3c98c1240fbef7f846e4cd"],[227,"4d28b4504df2740399e5aa82006b233b0ffa943cc62c241aa991ffe99fbb1ddd"],[228,"9febdac3e7d1d0b7eeeaf33c29910cbecd2ec54645fbcf599e96f9cb173d2220"],[229,"fcf5e0e4fa6fed619edcd530d9b377bce22484b2b25cadb4e9c40d41591372be"],[230,"effb76b3ca674c89ae36ec40ccece5ca4903ec3d13c7eb92578fc6e6b0badad4"],[231,"8cfd0ec19c0b2888662d17de5ffafd386a1f50efc11e271572d5684af46a3a51"],[232,"a87502b6275e6b99939a3014c2811b2e8edc7ae9fd1e3e8ee55cc81645239530"],[233,"739731412d089540b2052b41dd063e0f262bc19e01ceb4810f62c5a5f16ae100"],[234,"907131c0bcf9741260318ac27ffea73097acca354ceceb79786a333885b5a411"],[235,"b3b2c7ef0b4af33d7e14dd8476bd703a7177f05f508841d2b5c21f9a6ca76bee"],[236,"7ed92046051a8f54cfd94af6eb14780a40df60bea3d9b6f8352ac6e052d45426"],[237,"3d2ad15a531e64c9d5756fd06f0cfb7b45f42681d538c13b0254fe5dd40425df"],[238,"99a87bf464559fc16b188c79dec11daaf9655121849628505eb167a9eb7fa482"],[239,"24f99e013108faaa7c982d534beac5547799169ae56068729ba2dbc983e925e3"],[240,"02045589ea2bb49a89e6f8bc4849072452c577bc156de79d83d753dfa17957d6"],[241,"d98de1d7659f822b239b3bda52685932ff1146c84ad508f156e39919a53cfdb2"],[242,"2c44328a58807293355a0734148616a87f302cd4f25ae29ecf613531e572e46e"],[243,"942f20091205c4cb8b11bba42c44710f947c19dc94418330630ff6486817fbb3"],[244,"7e284c8dfe26d888a7c67a35917bd14b953434edfe829f4edf6359a3755a1104"],[245,"3ce69b0792fed631137c3962e3ff260648077ac227566940ebf0618005fa59d6"],[246,"27e989ca5305607f25c04f58cd6200f5914dff48a2fd73385a9b0cacce9b9703"],[247,"066ac9e2e824ab186a27aa4ff3dbaed993cad73884a03ae3cc9c3685c1c9c709"],[248,"a309d5dfcb9701d51b99affcea4b70aac378f7fba21aacf073965c730d616391"],[249,"bcf9cd7df582ca8558b0282337117890dd118ddd7907754bcec20051d773256d"],[250,"f29b4ba2cadff17b5f0f00c3738a0747f1a09277adb65efe913129b67f8192bc"],[251,"37367a7bb56e6b43242ae4f9e91f67daa7a81a3fc24059a13baa00c165a827a6"],[252,"30efc13612cb879a026ace5a8d2c70d9671b7089039548bd10e20ddb91d9173e"],[253,"5079b3b63c07286febd317783006102a7f083d0e6408714bccaafb714588187c"],[254,"46dc8315335776a873ff4ce9036b8108e99622ac5c14ac621bcf008c07a48c60"],[255,"8a5fd71a7211014842b6c1db1471adc8d5bb0a71940dee28789dcf6c5144e670"],[256,"06cbf838f6e6e82f9a0e4bf5c9fa4be0e0803d4529dae0e2de880e84da77c6b9"],[257,"eb3b9bcd24dd44ad6cfcedcd552084044c1c2758ec3cf6bf9fa38083bb07b24f"],[258,"18c1847b9366aee3f8bc45d5617bb5330faa03453b869b0a8c328fbb7c754db9"],[259,"96bbfa09f1c8eb678650c29c75a906e5fce8fbd9c486c04b5726eae18d3f45b5"],[260,"2028320e204d815bcd3c9449dcb9f9361b8f532d5e7461aae00efc4c57041653"],[261,"6bee3e8579b80d79017407c5d75f02d1931eb163e5eaf3bc34f15f30102075e2"],[262,"c59041530e840a693f22a2589a0d5d694b0dea2caa6f061264600431406894f9"],[263,"4835a88c228d2b941f689a36a56ef48dd0a499bbe96cd137d923d70952378f34"],[264,"e645ce3aef9ef7a80e316b1069b4c1559d6fb2f15f3d4b57b43bbb98e692961c"],[265,"a6ce4b4bc46a4c15e4e017fcf012c1660d04ad80cb351d91fd831d496ee674b4"],[266,"4362b4c2ca275c862b545143b59507ad796fa6654058ed1011545e8f06006f4e"]],"latestChangedDtsFile":"./lib/index.d.ts"},"version":"4.9.5"} \ No newline at end of file +{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/tslib/tslib.d.ts","../msal-common/dist/utils/constants.d.ts","../msal-common/dist/network/requestthumbprint.d.ts","../msal-common/dist/authority/authoritytype.d.ts","../msal-common/dist/authority/openidconfigresponse.d.ts","../msal-common/dist/url/iuri.d.ts","../msal-common/dist/authority/protocolmode.d.ts","../msal-common/dist/cache/entities/credentialentity.d.ts","../msal-common/dist/cache/entities/idtokenentity.d.ts","../msal-common/dist/utils/msaltypes.d.ts","../msal-common/dist/request/baseauthrequest.d.ts","../msal-common/dist/crypto/signedhttprequest.d.ts","../msal-common/dist/crypto/icrypto.d.ts","../msal-common/dist/cache/entities/accesstokenentity.d.ts","../msal-common/dist/cache/entities/refreshtokenentity.d.ts","../msal-common/dist/cache/entities/appmetadataentity.d.ts","../msal-common/dist/cache/entities/cacherecord.d.ts","../msal-common/dist/account/tokenclaims.d.ts","../msal-common/dist/account/accountinfo.d.ts","../msal-common/dist/cache/entities/servertelemetryentity.d.ts","../msal-common/dist/cache/entities/throttlingentity.d.ts","../msal-common/dist/authority/clouddiscoverymetadata.d.ts","../msal-common/dist/cache/entities/authoritymetadataentity.d.ts","../msal-common/dist/cache/interface/icachemanager.d.ts","../msal-common/dist/authority/azureregion.d.ts","../msal-common/dist/authority/azureregionconfiguration.d.ts","../msal-common/dist/authority/authorityoptions.d.ts","../msal-common/dist/authority/regiondiscoverymetadata.d.ts","../msal-common/dist/logger/logger.d.ts","../msal-common/dist/telemetry/performance/performanceevent.d.ts","../msal-common/dist/telemetry/performance/iperformancemeasurement.d.ts","../msal-common/dist/telemetry/performance/iperformanceclient.d.ts","../msal-common/dist/authority/authority.d.ts","../msal-common/dist/account/authtoken.d.ts","../msal-common/dist/cache/entities/accountentity.d.ts","../msal-common/dist/request/scopeset.d.ts","../msal-common/dist/cache/utils/cachetypes.d.ts","../msal-common/dist/cache/cachemanager.d.ts","../msal-common/dist/response/serverauthorizationtokenresponse.d.ts","../msal-common/dist/network/networkmanager.d.ts","../msal-common/dist/network/inetworkmodule.d.ts","../msal-common/dist/telemetry/server/servertelemetryrequest.d.ts","../msal-common/dist/telemetry/server/servertelemetrymanager.d.ts","../msal-common/dist/cache/interface/iserializabletokencache.d.ts","../msal-common/dist/cache/persistence/tokencachecontext.d.ts","../msal-common/dist/cache/interface/icacheplugin.d.ts","../msal-common/dist/account/clientcredentials.d.ts","../msal-common/dist/config/clientconfiguration.d.ts","../msal-common/dist/account/ccscredential.d.ts","../msal-common/dist/client/baseclient.d.ts","../msal-common/dist/request/commonauthorizationurlrequest.d.ts","../msal-common/dist/request/commonauthorizationcoderequest.d.ts","../msal-common/dist/response/authenticationresult.d.ts","../msal-common/dist/request/commonendsessionrequest.d.ts","../msal-common/dist/response/authorizationcodepayload.d.ts","../msal-common/dist/client/authorizationcodeclient.d.ts","../msal-common/dist/request/commonrefreshtokenrequest.d.ts","../msal-common/dist/request/commonsilentflowrequest.d.ts","../msal-common/dist/client/refreshtokenclient.d.ts","../msal-common/dist/client/silentflowclient.d.ts","../msal-common/dist/config/apptokenprovider.d.ts","../msal-common/dist/account/clientinfo.d.ts","../msal-common/dist/authority/authorityfactory.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","../msal-common/dist/request/nativerequest.d.ts","../msal-common/dist/request/nativesignoutrequest.d.ts","../msal-common/dist/broker/nativebroker/inativebrokerplugin.d.ts","../msal-common/dist/network/throttlingutils.d.ts","../msal-common/dist/response/serverauthorizationcoderesponse.d.ts","../msal-common/dist/url/urlstring.d.ts","../msal-common/dist/crypto/iguidgenerator.d.ts","../msal-common/dist/crypto/joseheader.d.ts","../msal-common/dist/request/commonclientcredentialrequest.d.ts","../msal-common/dist/request/commononbehalfofrequest.d.ts","../msal-common/dist/response/devicecoderesponse.d.ts","../msal-common/dist/request/commondevicecoderequest.d.ts","../msal-common/dist/request/commonusernamepasswordrequest.d.ts","../msal-common/dist/request/requestparameterbuilder.d.ts","../msal-common/dist/response/externaltokenresponse.d.ts","../msal-common/dist/utils/protocolutils.d.ts","../msal-common/dist/response/responsehandler.d.ts","../msal-common/dist/request/authenticationheaderparser.d.ts","../msal-common/dist/error/autherror.d.ts","../msal-common/dist/error/interactionrequiredautherror.d.ts","../msal-common/dist/error/servererror.d.ts","../msal-common/dist/error/clientautherror.d.ts","../msal-common/dist/error/clientconfigurationerror.d.ts","../msal-common/dist/account/decodedauthtoken.d.ts","../msal-common/dist/utils/stringutils.d.ts","../msal-common/dist/utils/timeutils.d.ts","../msal-common/dist/telemetry/performance/performanceclient.d.ts","../msal-common/dist/telemetry/performance/stubperformanceclient.d.ts","../msal-common/dist/crypto/poptokengenerator.d.ts","../msal-common/dist/packagemetadata.d.ts","../msal-common/dist/index.d.ts","./src/error/browserautherror.ts","./src/request/popupwindowattributes.ts","./src/request/popuprequest.ts","./src/request/redirectrequest.ts","./src/utils/browserconstants.ts","./src/network/fetchclient.ts","./src/network/xhrclient.ts","./src/utils/browserutils.ts","./src/navigation/navigationoptions.ts","./src/navigation/inavigationclient.ts","./src/navigation/navigationclient.ts","./src/config/configuration.ts","./src/error/browserconfigurationautherror.ts","./src/cache/iwindowstorage.ts","./src/cache/browserstorage.ts","./src/cache/memorystorage.ts","./src/utils/browserprotocolutils.ts","./src/broker/nativebroker/nativerequest.ts","./src/cache/browsercachemanager.ts","./src/event/eventtype.ts","./src/event/eventmessage.ts","./src/event/eventhandler.ts","./src/request/endsessionrequest.ts","./src/request/ssosilentrequest.ts","./src/packagemetadata.ts","./src/error/nativeautherror.ts","./src/broker/nativebroker/nativemessagehandler.ts","./src/interaction_client/baseinteractionclient.ts","./src/request/authorizationurlrequest.ts","./src/interaction_client/standardinteractionclient.ts","./src/interaction_handler/interactionhandler.ts","./src/interaction_handler/redirecthandler.ts","./src/request/silentrequest.ts","./src/broker/nativebroker/nativeresponse.ts","./src/interaction_client/silentcacheclient.ts","./src/interaction_client/nativeinteractionclient.ts","./src/interaction_client/redirectclient.ts","./src/request/endsessionpopuprequest.ts","./src/interaction_client/popupclient.ts","./src/interaction_handler/silenthandler.ts","./src/interaction_client/silentiframeclient.ts","./src/interaction_client/silentrefreshclient.ts","./src/utils/mathutils.ts","./src/utils/browserstringutils.ts","./src/crypto/isubtlecrypto.ts","./src/crypto/modernbrowsercrypto.ts","./src/crypto/browsercrypto.ts","./src/crypto/guidgenerator.ts","./src/encode/base64encode.ts","./src/encode/base64decode.ts","./src/crypto/pkcegenerator.ts","./src/cache/iasyncmemorystorage.ts","./src/cache/databasestorage.ts","./src/cache/asyncmemorystorage.ts","./src/cache/cryptokeystore.ts","./src/crypto/cryptoops.ts","./src/telemetry/browserperformancemeasurement.ts","./src/telemetry/browserperformanceclient.ts","./src/internals.ts","./src/cache/tokencache.ts","./src/cache/itokencache.ts","./src/request/authorizationcoderequest.ts","./src/app/ipublicclientapplication.ts","./src/controllers/icontroller.ts","./src/operatingcontext/baseoperatingcontext.ts","./src/operatingcontext/teamsappoperatingcontext.ts","./src/operatingcontext/standardoperatingcontext.ts","./src/interaction_client/hybridspaauthorizationcodeclient.ts","./src/interaction_client/silentauthcodeclient.ts","./src/controllers/standardcontroller.ts","./src/controllers/controllerfactory.ts","./src/app/publicclientapplication.ts","./src/crypto/signedhttprequest.ts","./src/index.ts","./node_modules/@jest/expect-utils/build/index.d.ts","./node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","./node_modules/@sinclair/typebox/typebox.d.ts","./node_modules/@jest/schemas/build/index.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/jest-diff/build/index.d.ts","./node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/expect/build/index.d.ts","./node_modules/@types/jest/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},"4576b4e61049f5ffd7c9e935cf88832e089265bdb15ffc35077310042cbbbeea","6290294552868c27a27402be0b104448636779b5d39a5c9e26597001c59ea41d","5e319fdf572349410b8cc20d220cd6618137774ff770df7ab905b628339fda50","f607f88e0e89211bcca6d2cb3aed645574168a1892f272d9d1ae044039be4e9b","e03f6b084efd111f060e0c13bb864cb7e1d877e35191bbb717b524ae1c7fa947","862843747fa837649bd721feacd2d936e2221a85e35790cc67e2cffbca0dd1a8","6172ca1b321aac26f2262d0aae4d172daf9153a3957cfbf1681c8816ebcae65d","fb2a08a552475ef4e6ba971fc6ba453bf1706b7f20fb498e30ffe4995f61473c","840c254cef4d519c91012661e23795cc57892ba809351672b72243207083bc1b","a9bab28455365db6d1abf5ac14a819804e1151db5687a82919b78212fafffa2b","9b69d80c4b586889bdaa6e5e84768c0805b9fb4df7e188cf4f8bb7bb3c4c93e3","5a2fbd4dc710310356c99ad75288f33d686e360d8ed6c1302d396058ddb61118","ed4b75e934b993346c8b48953488a42e73184d07c60eff94ea11531999a7d64a","4c858e953c401511747441083ce7ba754f8bc3fe12dde7b6e961650265aaa97a","0fd87bdcee2af2fe527752e9d7f09b15eb3d8e279a143427b29afb5d6d7dac2e","9a1effdd0b12461ce95b95e58c77930b37e299b36cf8b0e307d62c4336faa11f","fb0bd3555b8af1497b0e0acd42c467ce0a40e9a9ed743c0f7722d6fab027c4d0","5ca47328dbfc6337b525152ab88927821a2a24c554bf4d5948f221b61e80d2dd","3304867f11ff65c60da788c360eb2ff136c9d5c3dd38e6d62abbbd89aaa78489","43140e0fcffc94424c4b9c4c7173e490cfb83df68d2e8ef9a6f34a16efa4e1ac","be85fb1199efb6c24dbf3aa5b985f21d649723fce53b9a6e8cab64bb72bcdc3c","3a867a1265733103bcad7755afd47b60a9dcac60d0a5dec42e085d6dcd5c911d","c01787f732d878d85dfa154b2b38e8d37de87d42103de786a5fab48d77c47655","c3c48e4f0deebb1b123f4dd83e980582cc1ea578c40062bce92cd4889ac50fa0","6dec53b98fadb9ec4638c1567d354aee9812fd20363e18e61609a3880ce9c763","fdb8d30b8242df45d23c5a4691b923ab99ad7cf5647693b62ce5824d9f24fe4f","cf57ae2795992cbbed84bca730860c246416d9f7b15bb551f3cef176e3d27cbe","9b36e35bf4f4abcca7de976c5e433f8be6910a7c674b404d2fe24d104254a8ab","d8f9503bc2f5e2b83f640311c546e4cedf4ef7bb0c2ab03e51a0e839ab66b150","9c19df457a55a8a36a5032471a8d328c8ab7e6c074d3f629753791a99e9b5f53","c22e784c6b2d47979cdf84bfe1b18f80532bc94265f62123870b755150067ac2","f53a6907dfc25b09496387bf53900e81740c92a015d39d7c8cf69adc168f90bc","b97198b2a3080ff30ee7bfc2f420114304c127f0e2ce32b4279fa3dc5d777216","0497c19904620e94359644b1b82447a57da03d520cba2e7b776c72d7829eb192","63354c3d7e63811e62243e4cf2bf1efc31f1eaa3d7f15cbac8e532986ea13772","93d77d212d03de4e0c178dfd2ca291ce5f9625ca7a4c4083cba957eadde4ac27","77207dda0cfc40edde84a390109f49fa399c90aa38dd409dd7bd2fe2f7c84c98","a4a011a1d8fe222cd7b7172d27a9d72dd278f9f054585f7896ca859c343feefb","5bdabd9e1f998ecefce8911db251da9b847e8a79dc769ab90f224dbda84038a3","bbc3b1e705969c600f86c16aeec099c3b1e76096ed8227e0050cb7049d3305b1","7cf75e284d43663adcf5fcee60dcbf8d87f0fa7eba404af34a802493dac3ac5c","d2f0b0326978533385f6256ff7ba75d6cf6fa9426d55c5bbb2a5c0d6fa892e69","e9e51d22e92e12c72c5418bec47197de38577a30cdbd5eb67efea402c2722986","dd87e240c0115e6e75635fecac4d76ca829a73c4ab5bb74bf18380b394830b39","dd93626fbc255c1439093574aed0806f3aec4baf9ce99c9867ef7951b616d89c","38c468fd15ab0b0d979625adfa3562aa3113277823f54bdc4072cf43691faf59","c7205cf438edcb87dd62562eb5586830cf57790ff3fa9c1bc6ea67e4e0a6c5f1","6041b0f2ab0c5effc49f99b71e359ced30a52085c93cb5eb7742ab6409bb5307","3883bfc6d685adea15758fa6db94a381c62f94f685ed9cc06e734e97a946172d","946fa0abe5336c2c8efb9aff02b4987889ba4f225b115bfa635614dfee52d4c7","9a155c2da9c111dc02dfae665fba36d0e8ae665b76f55aec87d48e1150653f28","12d918e9578ad563a64c094717e55a7a5bc738bd03476e36312d8a20f57dea18","99cef539733f3c32895e5890426a39281f533afcbf8780025d258020b30a9cab","2467ec5f8f8ca4f44b6f8af00ed1c004c91639239bdc51e79682ff0c4e348e5e","52c6c5e6a1de07b2bb5d0bb4370151506c9b9526b589793dd07338f42fc8234c","311c3d7c21065edd96c1400d79e29fbb28f87acb68d453d416f2a93114f8c7d0","9329d7590c92d3ce321d3c4de36d53528afe7bd40b79224c022b9a81eab526d8","18eac57b1c6a7525a83038562f36ba94994166ed108c134522f59926d729b703","3a610d83a35b9cafbef90aaa379cdb5fc1681e930978a8c477e74d08784bd47c","ca7b4548270f45c13b60a8b22a50fbe0b73070a60209a92f9924c2d426b9ef79","c649bebc86680273b4b8411a7eccef4613696151c3aa74b1fd4f44851dba3123","a54b5d7f8c63c389c475359d4bd776e872cbf96360b44cc75a9cbe804ffcf285","4a53c158922bf59d84d825e724c2596434f80251b6df4292cfae9ff75bff94a8","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"57b6cb95756d1fe3bfeb20205de27b0c5406e4a86e130c6dfa6bd92af641e09d","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"e193e634a99c9c1d71f1c6e4e1567a4a73584328d21ea02dd5cddbaad6693f61","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","216717f17c095cde1dc19375e1ab3af0a4a485355860c077a4f9d6ea59fab5b5","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"80473bd0dd90ca1e166514c2dfead9d5803f9c51418864ca35abbeec6e6847e1","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","e6c86d83bd526c8bdb5d0bf935b8e72ce983763d600743f74d812fdf4abf4df6","a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","7d55d78cd47cf5280643b53434b16c2d9d11d144126932759fbdd51da525eec4","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"6de4a219df57d2b27274d59b67708f13c2cbf7ed211abe57d8f9ab8b25cde776","0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"d8d555f3d607ecaa18d55de6995ea8f206342ecc93305919eac945c7c78c78c6","e2a7281a5a7aec0ceb36ea105b8b3e1c6d6758ed199301f3a10de5ebbcb6e743","7f74442d87d094f1b77bed3748dd97c1d139eb05222fb46de9d1b8402279bd7d","0d39ee91274c833749ac253a276869d9bac615224a2cd55b65502260e02da127","f2fc45586b1e881c9e9cbff4445981c9c94554088881696cfa8926c10368838e","010696076753d265a6a67bcceb9ea6e66107067be599bdc2b0619efdc08d1bc7","e475bef588275a0f2b53373b3d17c7ddeaf111c40d3ca2706bfff92d2bf19d4e","612c84d13df19cc411b683a84df4a6401587afe703facbba3fc64ca933538fba","038799d3d36cdd6a0ab716d965f587f5d8f610a5306e1993364ebf4fae069ca3","3510b344ffb66182b00c0956dff723c6ab69a314112e71dd1eb0346a92d0312c","5599f34a53ab350a54e15a81982ba1c98197430ec3e1df7edcd37d1f31fdc506","d68d14ef5a31134bf952ef96c93446ed4f0686e840d0011a071ff8f4c782a30b","d4b5dc4a29556e4a80411db80e9f7eb69c69584e0738aca09ae4a6654c93d21f","63e61c4ea896197bfcbf8c499a2409baa31ab146694a847ec606a7e74080948e","60cab134777f1131b3abbe42a3eba3003013adb8c4d8a2f882a682c796c8a11e","0c0d1eadef6a092235981c643b9b797280f5130ddb3a738d563b87780977f668","7e25b3b42add5bb8b326256318255e81b83bccbfe4eff3bbab2070dffeb94f79","25e8e09851923044013f6efda775298ea55f220965d77c58b8a33802b63284f8","c22e086a091cfc8ccea49c0a23d7f59a70e61eff979662a0094e23aca97a9dcb","eb59654ed8ce9fc95dae05812daa514c9c8e0d0a49055d0b33e651e6926b31ea","0239a0d675f381ce9ee8ad7c77ab8acf9a1936810c2cd347480ea22f0acf6a9a","c7bb3d343635262f28289a380344885cc2d1178c4f2dc11e6e52eb6ec9fabff3","35af861275f61dfdf1be3690a1d53cfd825d7936c4ae548902291900b8402208","5980ba4a12dfc5fb66e59438315deb4d35d1369b3f886c1dec146600197b2c7e","36592459ea33688b09cc82689b506ea58ab6f9785d4d9b85dd368325801faeb5","00595ab91d01d295a2a1fa5ca7ac8a976846d59fe7ca901a50c1605a48f30db1","9585005cf0ada58ee1024cec39d99fc9993f3e0a54011cfc2eebf7cf9ca875a6","64204f5616702808166a699eac9856d511700688db9b5e9d9bdf202c72ffc2cd","dff9f3d7279058c621a4d76cb681ebd1c95e227dba067592fd347ac393b2d234","eeb28ef9fd75a3804ee12c66a0b3e6f039205270695b9faf14c86bd19af4ebee","8aec7a425aced8f5355175b94a273e7ea178bdbd52110c893170742b9be139e4","4b0215c65e2a94a467e48ca6ba9d67771f90d858a9b2dfb187a30308e7cbb69e",{"version":"8b4f4b7b2090b00acd17fe62fc30b1f8e57940c28d3b6ed450c1ef855be07330","signature":"d441166844cb18828680dbf0093614f6a7d7f3ed598452f23e037850f51d2b48"},{"version":"a07a778db67a89aabb04c41806d28552f8428f2fbcf0f488d1a1ffebd4c568d3","signature":"efb8e27827124bc3bf96b81288c0278c722d10f2372a1bbbb9de1943e784022b"},{"version":"a0a079fceca9261b22e611371647f081422cf2f33f104deee7c3dbf00c938190","signature":"b6db293a5ba0539a0007b69a92c196b21be784c1781e2f8b573fc70e5502fe00"},{"version":"f4a1cf86f7f71d4e20c90fcf34193d22737499d508a88ffa2f0a94dc1cbe1f20","signature":"3faa2b7701286a5b3863930e59ec45a3e74a9b6dacd216e168afb2a799a9598a"},{"version":"4045af8d5c148fbc03daa721f181748bb3dc6a67785cfcdafee46fb7ae8fde5c","signature":"b58aa94043dccae8ac9fcb2d7c07f25c863f3772a80a014a9a0b61d36b61895b"},{"version":"179c52a8c5b0db2bfdaf3695393d7157ea3b605b4b6e8fa2d421e72a7afd3840","signature":"19c3d80a37e4a5874dc264c1b5c5e11e73c25c65c31caa30064444e22d2bc19e"},{"version":"def88db6bdfce7bcab39f5faec825d5b88389e235741130989a5158fd1ccd178","signature":"587a18a5a21a6151ff51d2866fac32a61c2bf38ba878e2e5fcae6c06a27c8ed9"},{"version":"43082e738f695414514204221ea73dec8cc238a32b892cf9ef987ce7306eb733","signature":"d096779b92cdcef404daabce9e63afd112933685aae708b593a047fc6ef13682"},{"version":"aefdc2770c29c5630e908513c45072afea4b09420ea988d551e927e46c7c85d3","signature":"028906b65dcdb3143cc9b429815765340ffc11d40b7366ba30bb32e558e111f2"},{"version":"41478fcf2fd6d8f32f9a7050e3fa192140b90dde56a3503e3d3cdb34120ae6ce","signature":"05ba173a5408ad8a44e055640e5e153a684c6403f860dca7670cf52bd55b8f06"},{"version":"6ed7ec85c2efa9901cf6ff85513304221ca7104244ed412bcc3407843048a019","signature":"91e41ef69d685c82a0a4fa960f672aca91d0bfb84e83226cc0efce42ea885f91"},{"version":"585f2aa01d22c5a784269e9fa8b7600a766b3857d200eae061dd43c8cd498a56","signature":"857962d30dbc7f0910aa00e35085bd631b035ba1afc3c74a98df8cee53cb967f"},{"version":"5cca704e3d35807b0b8bf3d29dcc3e18ee78c401e58886daec5adebd70b11503","signature":"14badeabb60c97286c971eb2a6836f94b11c640ff5524f732a4db47794aa81b5"},{"version":"0fce22de0933f7003e94d97060d6e0a63a397fc661030c3b41f52e75bcc88b1b","signature":"8c83218e92cb960a020ce6ccf208c7fdd29fdba50f824ec9f7804b9a47c175d0"},{"version":"14a11fcd3ac91174a26b150d4d0c6aed0e010fa412207b65b505e5a5205182e2","signature":"30e79e66ea64c11aaaec0ae2b8e5b7103719724a177ff960f46f354f43802917"},{"version":"ff0815582326b779a5920602f257189a3cceb7f3c26ec2e386fbbcf03dc14bab","signature":"dd3e55e236d60bdf8506e7b8be544f8b9df241b62ee011b31315ab2e79b0a903"},{"version":"d222d5d94b908a09c806d3c2a1b859482e22800aa29594ec327f94543df2f885","signature":"21d8187cfb7239fce0ce089728ffd45ecbf8c4aa27032d9db415ea3cf5ca3c51"},{"version":"84ad1063e46bbc5314a35f8bad7798ec87b2cba274f2aa1215ffb4eeb87383ee","signature":"603b76444ae7b739baddb69d2aae1e5c18b5c5c1015e881b3c3f2c513eb238fa"},{"version":"cd6782b23b08b556002db5ad0c3e3365454e3327ac1fd7e4a9d27bb813c54d20","signature":"50425b41e87ffaf1fdee579f680643dbda413eea5db984eab163de063e23741d"},{"version":"ee686d629c0eab52714089e75be2f43a50d52662f0f4755362c3fda07cf2ae51","signature":"f08d4bb529d3348103d7b7133a13ae1880db310ba08b46a1f9f90dd67c6f9cbe"},{"version":"ba99629c0b3743e8c62e971cf69d3670a79e4d2bffc68a3e1408e66ec14a9f6d","signature":"b9ca0fb0079964ec1910ff2b82e5b8ca83f1ac6de0eb7c522dbfb684dc9183df"},{"version":"2a2f286378234a2cee79fc16ee97835d3cb7a67d1dfe8118b07fb36a392d89b6","signature":"22ff06d3a95eec8c7d0c5f0129af7303a358496857e0ce33e1c9208769f58741"},{"version":"0cf6f34f36515a78e185cf052db6e2cdd040ae5ad8c7c2f5cddfce150e80d7b4","signature":"eef3134d50fa7818d4c01c67fb07f06370d555d962eff626b4d07a02129ef3ae"},{"version":"57bbfe242a99fd2f6d71b62dd838f7d5d9aceaeae8221934392cc1a15eb061a0","signature":"220783370c7924b174300eba6475f0f0bfdd9af48b1b6666e396492b1f3fef98"},{"version":"27ed0fa5f7c55ff017a4ef62c61474d8db8b6426b58387faf9dc820e532d22f6","signature":"86910754b1dd2150aeb8b54951593015631871e352c3aaf6df332430162ea51b"},{"version":"416b53493a79f95a0ad66b718fac402a37af1792c2b149f2e2ffb5700f50217e","signature":"4a66502385c84a643589908ce44b12bcf94af05f970285b423536184ce894998"},{"version":"de930e86262cabede8aaecd6e7f50f11c66f3ff440b443ea8be55cb7963b662e","signature":"487ca02a3e3bbd43ad193f10a67c45ef382126be9a368d05811a661b905d3a8d"},{"version":"4574e0e173b7df9d9cbfb48a0f60cf454c835c024bd35fe9f66a72c2d434b125","signature":"5ebcb3d67df810df4f05891b1e53fcb890fa3860195d243cd25a6d0776be9a01"},{"version":"e7c598a83a03cd7790650d72482628a91ef54b61a82566df70340990c07df426","signature":"631b03a76016caa819ebfa95a40a7c5eac41820c4451135f9114073e75ec4afe"},{"version":"81f6d6148afbe12fdd155b21f1f76efd0ec464ef9e03ace4f0d675ef120c4398","signature":"30e5060e2b21e10485b6ea2be7a6333a1203221bc524bcc50e91705da896e7f3"},{"version":"63b3b61803c3332cb30f22d9557266278ba35e4d5f28b5fa66c49618ccf1e5db","signature":"28294756d2ac4e877f815fead8368692fc7184a1eac4068f2520d63a0a2fda8e"},{"version":"f2dbe29bfe06cfa1faf05036bb4d283a573ced9e65b516781d8ca444727d0785","signature":"3caff9d44a20278cb2afc4dc64920cc9526e54a573c173291a9d8fc1b158bf9e"},{"version":"79ac794d512663c8a40a0df96a34487f8e74539e06a5ef066ebeddf9a149ae04","signature":"69519f4adf7a7cb54324811083ee3be4e1c5347e2ac231f8ea4e496887bff4c9"},{"version":"8b52fd0c3e8906888df558c12fc41d09ca09210dedd977660e8b71ffe52023e3","signature":"8b837e28c1150e380b11aeaf340df60807cdab426470f8676f00bf95a4319a3c"},{"version":"54567c2c5119a2ce989178c450197ebd29e0c8c94a0f2199438481ed65464467","signature":"4ac2f63cc352f37faf2c9541c721ad3229395d37abfc598e2a43072058a72e69"},{"version":"2d6ad14ec61757d64ab7cb9a9866c6da0f36f9691209955ed3fc3dcc1b456b24","signature":"9bc8f648f6de3f01a348e35072ddd309bd057cc2783958d4818063084ac2bf82"},{"version":"d8ceff1b90873b896c16e41ceb5540cc7da933260d51e4670661b8feba1f86ff","signature":"4d28b4504df2740399e5aa82006b233b0ffa943cc62c241aa991ffe99fbb1ddd"},{"version":"875383df6e85ccdc3f76ee7e9a85544620035a43de51f346f31a0dddcf435a04","signature":"9febdac3e7d1d0b7eeeaf33c29910cbecd2ec54645fbcf599e96f9cb173d2220"},{"version":"14f90c2402ea4d1ae2b3831b61a840fab318d0034e2e7cc0e7e3c5db41f4bde8","signature":"fcf5e0e4fa6fed619edcd530d9b377bce22484b2b25cadb4e9c40d41591372be"},{"version":"51a72d498a22effce0e62bd87a3efc02731569d31aeae4e5dfb8532235cf090a","signature":"effb76b3ca674c89ae36ec40ccece5ca4903ec3d13c7eb92578fc6e6b0badad4"},{"version":"986855a63ecc9c740e697db64150ee4aebdf776bf8f6bb51b7669e187dc549c1","signature":"8cfd0ec19c0b2888662d17de5ffafd386a1f50efc11e271572d5684af46a3a51"},{"version":"253a1ccc1caf9ecc213f229bdac468b80961d6c90738f0d74d7671fcb522eaf6","signature":"a87502b6275e6b99939a3014c2811b2e8edc7ae9fd1e3e8ee55cc81645239530"},{"version":"b333c62026fe1a09474a11e0854ebd7215c125da7bd7584bd77627b3eeabe83d","signature":"739731412d089540b2052b41dd063e0f262bc19e01ceb4810f62c5a5f16ae100"},{"version":"ab77827099a1a5413f07a18fb0e849db20620298edadb249ec8f8622ef1a958a","signature":"5e7e5c5b3617526b5d2662556f5553ccb729b99bbeef33a343815155a9c4d2f7"},{"version":"648f83235478575ced1ec77e6af6b46bea5362bdfcfccd7291314f0f7bf1a137","signature":"b3b2c7ef0b4af33d7e14dd8476bd703a7177f05f508841d2b5c21f9a6ca76bee"},{"version":"172388d261e58df2b4ca3a2822cd4aa285415ab050bd027ea506dfb2f285075a","signature":"7ed92046051a8f54cfd94af6eb14780a40df60bea3d9b6f8352ac6e052d45426"},{"version":"3879bd2b4a9aec9e5147454d7efb785b4102de8dd079db4d51006fdb6dc362ad","signature":"cd8b70aecfe9342baa36f17d99522e361b7666907fc97e990e56eb791283d20d"},{"version":"82c80088bf08d069c595be833b7b16aaaedca6400fc02f1ad13ef97dcd5a6579","signature":"02045589ea2bb49a89e6f8bc4849072452c577bc156de79d83d753dfa17957d6"},{"version":"78d8a7d7b9e461de9a361356e5962b1d297c152085afc623ec7bfca4d7ab6748","signature":"d98de1d7659f822b239b3bda52685932ff1146c84ad508f156e39919a53cfdb2"},{"version":"00d50fd7d4d412cc52d3b5c6106a15d202d2ae86d4232efe25b3b93ae30b65f8","signature":"2c44328a58807293355a0734148616a87f302cd4f25ae29ecf613531e572e46e"},{"version":"1e9a4754e7bfc0e5e0d9334b2dd1ae200745e859e242a0731557372b83adcafc","signature":"942f20091205c4cb8b11bba42c44710f947c19dc94418330630ff6486817fbb3"},{"version":"7620b21e40397ce60afaae7b7dea5697e4d79838f104a891b17eed79d993319b","signature":"7e284c8dfe26d888a7c67a35917bd14b953434edfe829f4edf6359a3755a1104"},{"version":"34a9deba807e9cc490dd85edcb07e1840267481d0fcaf81ef1282e7f46561189","signature":"3ce69b0792fed631137c3962e3ff260648077ac227566940ebf0618005fa59d6"},{"version":"c404392717f996db62d70e560eca6f85573aac2fcb0a08eb3822a44bced6c79f","signature":"27e989ca5305607f25c04f58cd6200f5914dff48a2fd73385a9b0cacce9b9703"},{"version":"dc3340860809898df0a55554f16f5df11d4b08fe86b49fff87fafc547edb0e00","signature":"0757eaf226cfdd07b49a70d125f692cbf7fb286c5b38f3daf3f369e508875297"},{"version":"24fab3df46a3bfa08300e85f96549ba8ab3932284f05932b7da81e0ce08bcd0a","signature":"81b9671054b603f90e5b3cfa201cb75f0b8b2e47195b1bc93ea6d090a00f0bcf"},{"version":"f3f0772ad14ffeb9f8540c371500a26f23da69f54658f6e796845996ba214a74","signature":"bcf9cd7df582ca8558b0282337117890dd118ddd7907754bcec20051d773256d"},{"version":"daa27a5ea2db9d6975dc761135d4f6b587083decd00b66e766afdbd518feeb06","signature":"182e392a62f76505cea059dbda0113dc256f3b62bce7fbcd88860652688cdb6b"},{"version":"233ad5ae44409b60b8f5a608db873ed00a410fd22e4ec094a3d4a1686eaf26c4","signature":"37367a7bb56e6b43242ae4f9e91f67daa7a81a3fc24059a13baa00c165a827a6"},{"version":"7c191a7830a724eeed3a3a9260104a2d8dbd8eea5fbe5a661507c01235acaa87","signature":"30efc13612cb879a026ace5a8d2c70d9671b7089039548bd10e20ddb91d9173e"},{"version":"a3ac2beb8ec289c2bbec8d86a92aa15549c76c291381607c507f20e9d035014c","signature":"5079b3b63c07286febd317783006102a7f083d0e6408714bccaafb714588187c"},{"version":"b68fedd52f606a729a3342602c0d435d8d762ab87a7863f28678a5ec9d05d3ea","signature":"46dc8315335776a873ff4ce9036b8108e99622ac5c14ac621bcf008c07a48c60"},{"version":"b3b2ba7e8c50b4b22615a3e344fee19ec1669583cc02fd877e9f49b967307150","signature":"8a5fd71a7211014842b6c1db1471adc8d5bb0a71940dee28789dcf6c5144e670"},{"version":"5580306d17c4665e871e41eb645a8f823fda43c3aeda19acf2b658f47a24bac8","signature":"7723fb07804e04863dffe884bd1f018f4b1a144c7366aabfd3c8a17d2750aa62"},{"version":"3bfdd8c2d0ccf93d13a930ca7c64cb7c312156138f7a8c270832935cf1f8656b","signature":"eb3b9bcd24dd44ad6cfcedcd552084044c1c2758ec3cf6bf9fa38083bb07b24f"},{"version":"acfe21bab40163fa684741350f52fbd4d2297face00c3e93bb601222baa9041f","signature":"18c1847b9366aee3f8bc45d5617bb5330faa03453b869b0a8c328fbb7c754db9"},{"version":"9aac78f53a727d0fff57cd569003bbd30d45f7ce650ce1361f73142a66bbb934","signature":"96bbfa09f1c8eb678650c29c75a906e5fce8fbd9c486c04b5726eae18d3f45b5"},{"version":"71bbe82a64b6387c31566f738687036ceab49ffd44cb0c5fe5ded054ba1f2170","signature":"2028320e204d815bcd3c9449dcb9f9361b8f532d5e7461aae00efc4c57041653"},{"version":"d7d6a663ab7948d1b32c2f89e0e76e5221db6a3048e182b8774e643b9e040db3","signature":"6bee3e8579b80d79017407c5d75f02d1931eb163e5eaf3bc34f15f30102075e2"},{"version":"56f75fbfe11baded413e40d0bdcd9e79ade067d92ee2dc64b25e1773ab1a6147","signature":"5543c67a21ce7357a9ca55f30abda982fbafd5b78e1d5c215777b04e00193fbe"},{"version":"5b0be434253bc1877b6101b643954537ff9c0d55fd36af2b58bbf59da49b6f1b","signature":"4835a88c228d2b941f689a36a56ef48dd0a499bbe96cd137d923d70952378f34"},{"version":"7520b8fd838b0fbb00c880a2ee96182d7cc3fa284a01d9e76d4d546662ac5411","signature":"e645ce3aef9ef7a80e316b1069b4c1559d6fb2f15f3d4b57b43bbb98e692961c"},{"version":"86f1ba4ab86ed246250c97930abbcc6aa483ecc7112eb143ea06287bac2718ac","signature":"a6ce4b4bc46a4c15e4e017fcf012c1660d04ad80cb351d91fd831d496ee674b4"},{"version":"2a5134763ef8303d97fe8d990ae969fb426ccca4a5608863ff3000b1b60bf44a","signature":"eeef09185c6c7f8e02e581e05694238612db0271ad510ca8231e5fac12f95de2"},"6c1e688f95fcaf53b1e41c0fdadf2c1cfc96fa924eaf7f9fdb60f96deb0a4986","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","db25694be959314fd1e868d72e567746db1db9e2001fae545d12d2a8c1bba1b8","43883cf3635bb1846cbdc6c363787b76227677388c74f7313e3f0edb380840fa","2d47012580f859dae201d2eef898a416bdae719dffc087dfd06aefe3de2f9c8d","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","2cec1a31729b9b01e9294c33fc9425d336eff067282809761ad2e74425d6d2a5",{"version":"240c702fb4b3bd54d83ee167d80fa7f0cd7300fef7eea0b32cef33129740893c","affectsGlobalScope":true}],"options":{"allowUnusedLabels":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"emitDeclarationOnly":false,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"module":99,"noEmitHelpers":true,"noImplicitAny":true,"noImplicitReturns":true,"outDir":"./lib","rootDir":"./src","skipLibCheck":true,"sourceMap":false,"strict":true,"suppressImplicitAnyIndexErrors":true,"target":7},"fileIdsList":[[152],[152,267],[152,269,272],[106,152],[109,152],[110,115,143,152],[111,122,123,130,140,151,152],[111,112,122,130,152],[113,152],[114,115,123,131,152],[115,140,148,152],[116,118,122,130,152],[117,152],[118,119,152],[122,152],[120,122,152],[122,123,124,140,151,152],[122,123,124,137,140,143,152],[152,156],[118,125,130,140,151,152],[122,123,125,126,130,140,148,151,152],[125,127,140,148,151,152],[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[122,128,152],[129,151,152],[118,122,130,140,152],[131,152],[132,152],[109,133,152],[134,150,152,156],[135,152],[136,152],[122,137,138,152],[137,139,152,154],[110,122,140,141,142,143,152],[110,140,142,152],[140,141,152],[143,152],[144,152],[122,146,147,152],[146,147,152],[115,130,140,148,152],[149,152],[130,150,152],[110,125,136,151,152],[115,152],[140,152,153],[152,154],[152,155],[110,115,122,124,133,140,151,152,154,156],[140,152,157],[152,265,271],[152,269],[152,266,270],[152,268],[43,152,190,193,194,195,200,202,203,213,214,223,228,251,252],[43,152,190,193,194,195,200,202,213,214,223,251,252,253,254,257,260,261],[43,152,190,191,195,202,208,216],[43,152,190,195],[43,152],[43,152,190,191,206,242,243],[43,152,190,191,195,202,204,205,206,207,208],[43,152,195,203,204],[43,152,190,244,246],[43,152,191,195,242],[43,152,190,223,250],[43,152,204],[43,152,190,191,202,209,223,251],[43,152,190,195,198,200,201],[43,152,190,202,215,254,256,257,260],[43,152,190,193,194,195,200,202,209,212,213,214,217,223,228,229,231,251,252],[43,152,190,191,193,194,195,198,200,202,203,208,209,210,211,212,213,214,215,216,217,223,225,226,227,228,229,231,232,246,248,250,251,252,254,255,257,259],[43,152,190,191,234,235,236],[43,152,190,191,234,237,238,239,240,241,245],[43,152,190,233,237],[43,152,195,235],[43,152,190,191,237,239],[43,152,190,215,246],[43,152,190,234],[43,152,190],[43,152,190,191],[43,152,190,195,210,211],[43,152,190,195,210,264],[43,152,190,191,192,193,194,195,198,199,200,201,202,203,210,211,213,214,215,219,223,228,249,250,252,253,262,263],[43,152,190,193,194,195,198,200,202,209,212,213,214,215,217],[43,152,190,191,193,194,195,199,200,202,208,209,212,214,216,217,218,223,224,225],[43,152,190,191,192,193,195,198,199,200,202,209,210,211,212,217,220,221,226,228],[43,152,190,191,194,195,198,199,200,202,209,210,211,212,213,217,220,222,226],[43,152,190,191,195,200,202,209,212,217,219,220,230,252,258],[43,152,190,191,195,220,223],[43,152,190,191,195,200,202,209,212,214,217,219,220,226,230],[43,152,190,191,195,220],[43,152,190,191,193,194,195,198,207,213,214,215,218,219],[43,152,190,191,195,209],[43,152,190,191,195,199,200,209,221],[43,152,190,191,202,209,221],[43,152,195,207,208,209,212,216,217,220,222,224,225,226,227,229,231,232,246,247,248],[43,152,199],[43,152,199,200],[43,152,195],[43,152,190,191,195],[43,152,190,202,215],[43,152,255],[43,152,190,192],[43,152,190,237,238,247],[43,152,190,193,194],[43,152,190,191,195,196,197],[60,152],[55,60,152],[55,152],[46,47,48,49,64,66,69,70,71,74,83,90,152],[66,69,71,74,75,83,152],[49,68,152],[67,152],[44,152],[61,90,95,152,159,160,161],[51,53,55,56,57,58,59,61,62,63,65,66,71,77,79,152],[44,50,55,152],[46,55,60,61,71,75,76,152],[47,64,152],[51,56,57,58,77,152],[50,152],[51,56,57,58,59,61,62,63,65,77,79,152],[87,152],[86,152],[44,51,56,57,58,62,63,65,77,78,152],[74,90,92,93,94,95,96,97,152],[45,53,55,71,74,75,80,81,82,83,85,90,91,152],[74,90,92,95,99,100,152],[74,90,92,95,100,152],[55,69,71,75,80,83,85,86,88,89,152],[53,54,152],[55,74,152],[152,178],[152,181],[44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,65,67,68,69,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,152,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,184,185,186,187,188,189],[90,152],[82,152],[45,80,81,83,152],[45,53,80,81,82,152],[44,52,90,152],[52,53,91,152],[44,52,53,61,152],[53,67,89,152],[52,53,152,170],[52,61,152],[53,152],[53,91,152],[53,61,152],[52,152],[44,52,85,90,104,152],[61,152],[81,152],[53,55,59,71,74,75,76,80,81,86,88,95,97,152,164,175],[72,73,152],[71,72,73,74,90,152],[73,74,152,186],[44,62,70,80,84,152],[48,152,164],[152,183],[190,193,194,195,200,202,213,214,223,228,251,252],[190,193,194,195,200,202,213,214,223,251,252,253,254],[190,202,208],[190,195],[190,242],[190,195,202,204,206,208],[204],[190,244,246],[242],[190,223,250],[190,202,209,223,251],[190,195,200],[190,202,254],[190,193,194,195,200,202,209,212,213,214,217,223,228,229,231,251,252],[190,193,194,195,200,202,209,211,212,213,214,217,223,225,227,228,229,231,232,251,252,254,255,257,259],[190],[190,237],[235],[190,195,210,211],[190,195,210,264],[190,191,192,193,194,195,198,199,200,201,202,203,210,211,213,214,215,219,223,228,249,250,252,253,262,263],[190,193,194,200,202,209,212,213,214,217],[190,193,194,195,200,202,208,209,212,214,217,218,223,224,225],[190,192,193,200,202,209,212,217,220,221,228],[190,194,200,202,209,212,213,217,220],[190,195,200,202,209,212,217,220,252],[190,220,223],[190,195,200,202,209,212,214,217,219,220],[190,220],[190,193,194,195,213,214,218,219],[190,209],[190,200,209,221],[190,202,209,221],[195,207,208,209,212,216,217,220,222,224,225,226,227,229,231,232,246,247,248],[199],[199,200],[195],[190,202],[255],[190,192],[193,194]],"referencedMap":[[265,1],[268,2],[267,1],[273,3],[106,4],[107,4],[109,5],[110,6],[111,7],[112,8],[113,9],[114,10],[115,11],[116,12],[117,13],[118,14],[119,14],[121,15],[120,16],[122,15],[123,17],[124,18],[108,19],[158,1],[125,20],[126,21],[127,22],[159,23],[128,24],[129,25],[130,26],[131,27],[132,28],[133,29],[134,30],[135,31],[136,32],[137,33],[138,33],[139,34],[140,35],[142,36],[141,37],[143,38],[144,39],[145,1],[146,40],[147,41],[148,42],[149,43],[150,44],[151,45],[152,46],[153,47],[154,48],[155,49],[156,50],[157,51],[272,52],[270,53],[271,54],[266,1],[269,55],[43,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[253,56],[262,57],[217,58],[208,59],[224,60],[244,61],[209,62],[205,63],[245,64],[243,65],[242,60],[251,66],[204,60],[206,67],[250,68],[202,69],[261,70],[254,71],[260,72],[237,73],[246,74],[238,75],[235,60],[236,76],[241,77],[263,78],[240,79],[239,79],[191,80],[203,80],[216,81],[212,82],[211,83],[210,60],[264,84],[218,85],[258,80],[226,86],[229,87],[227,88],[259,89],[225,90],[231,91],[232,92],[220,93],[221,94],[222,95],[230,96],[249,97],[200,98],[201,99],[199,100],[196,101],[197,101],[255,102],[257,103],[256,103],[215,60],[252,80],[219,80],[228,104],[213,80],[193,104],[192,60],[194,80],[223,59],[214,80],[248,105],[247,80],[195,106],[207,59],[234,80],[198,107],[233,60],[61,108],[76,109],[91,1],[89,1],[104,110],[183,1],[60,1],[75,111],[105,112],[69,113],[46,1],[67,1],[68,114],[64,1],[47,1],[49,1],[70,115],[162,116],[80,117],[56,118],[77,119],[58,1],[65,120],[59,121],[50,115],[51,122],[57,122],[62,1],[63,1],[66,123],[88,124],[86,1],[87,125],[79,126],[98,127],[92,128],[101,129],[102,130],[103,1],[90,131],[55,132],[166,1],[167,115],[188,133],[54,1],[178,1],[181,134],[182,135],[179,134],[180,134],[190,136],[71,137],[83,138],[82,139],[45,115],[163,140],[189,1],[177,1],[53,141],[94,142],[93,143],[168,144],[171,145],[96,146],[169,147],[99,148],[100,149],[172,147],[160,150],[161,1],[173,151],[78,1],[95,152],[97,1],[170,1],[174,153],[176,154],[164,1],[81,115],[74,155],[73,1],[186,156],[72,1],[187,157],[85,158],[84,1],[48,1],[165,159],[44,1],[52,1],[175,110],[184,160],[185,1]],"exportedModulesMap":[[265,1],[268,2],[267,1],[273,3],[106,4],[107,4],[109,5],[110,6],[111,7],[112,8],[113,9],[114,10],[115,11],[116,12],[117,13],[118,14],[119,14],[121,15],[120,16],[122,15],[123,17],[124,18],[108,19],[158,1],[125,20],[126,21],[127,22],[159,23],[128,24],[129,25],[130,26],[131,27],[132,28],[133,29],[134,30],[135,31],[136,32],[137,33],[138,33],[139,34],[140,35],[142,36],[141,37],[143,38],[144,39],[145,1],[146,40],[147,41],[148,42],[149,43],[150,44],[151,45],[152,46],[153,47],[154,48],[155,49],[156,50],[157,51],[272,52],[270,53],[271,54],[266,1],[269,55],[253,161],[262,162],[217,163],[208,164],[244,165],[209,166],[205,167],[245,168],[243,169],[251,170],[206,167],[250,171],[202,172],[261,173],[254,174],[260,175],[237,176],[246,176],[238,177],[236,178],[241,177],[263,176],[191,176],[203,176],[216,176],[212,179],[211,180],[264,181],[218,182],[258,176],[226,183],[229,184],[227,185],[259,186],[225,187],[231,188],[232,189],[220,190],[221,191],[222,192],[230,193],[249,194],[200,195],[201,196],[199,197],[196,176],[197,176],[255,198],[257,199],[256,199],[252,176],[219,176],[228,200],[213,176],[193,200],[194,176],[223,164],[214,176],[248,176],[247,176],[195,201],[207,164],[198,164],[61,108],[76,109],[91,1],[89,1],[104,110],[183,1],[60,1],[75,111],[105,112],[69,113],[46,1],[67,1],[68,114],[64,1],[47,1],[49,1],[70,115],[162,116],[80,117],[56,118],[77,119],[58,1],[65,120],[59,121],[50,115],[51,122],[57,122],[62,1],[63,1],[66,123],[88,124],[86,1],[87,125],[79,126],[98,127],[92,128],[101,129],[102,130],[103,1],[90,131],[55,132],[166,1],[167,115],[188,133],[54,1],[178,1],[181,134],[182,135],[179,134],[180,134],[190,136],[71,137],[83,138],[82,139],[45,115],[163,140],[189,1],[177,1],[53,141],[94,142],[93,143],[168,144],[171,145],[96,146],[169,147],[99,148],[100,149],[172,147],[160,150],[161,1],[173,151],[78,1],[95,152],[97,1],[170,1],[174,153],[176,154],[164,1],[81,115],[74,155],[73,1],[186,156],[72,1],[187,157],[85,158],[84,1],[48,1],[165,159],[44,1],[52,1],[175,110],[184,160],[185,1]],"semanticDiagnosticsPerFile":[265,268,267,273,106,107,109,110,111,112,113,114,115,116,117,118,119,121,120,122,123,124,108,158,125,126,127,159,128,129,130,131,132,133,134,135,136,137,138,139,140,142,141,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,272,270,271,266,269,43,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,253,262,217,208,224,244,209,205,245,243,242,251,204,206,250,202,261,254,260,237,246,238,235,236,241,263,240,239,191,203,216,212,211,210,264,218,258,226,229,227,259,225,231,232,220,221,222,230,249,200,201,199,196,197,255,257,256,215,252,219,228,213,193,192,194,223,214,248,247,195,207,234,198,233,61,76,91,89,104,183,60,75,105,69,46,67,68,64,47,49,70,162,80,56,77,58,65,59,50,51,57,62,63,66,88,86,87,79,98,92,101,102,103,90,55,166,167,188,54,178,181,182,179,180,190,71,83,82,45,163,189,177,53,94,93,168,171,96,169,99,100,172,160,161,173,78,95,97,170,174,176,164,81,74,73,186,72,187,85,84,48,165,44,52,175,184,185],"latestChangedDtsFile":"./lib/index.d.ts"},"version":"4.9.5"} \ No newline at end of file diff --git a/lib/msal-common/src/client/SilentFlowClient.ts b/lib/msal-common/src/client/SilentFlowClient.ts index 827292df40..b3fb3c833e 100644 --- a/lib/msal-common/src/client/SilentFlowClient.ts +++ b/lib/msal-common/src/client/SilentFlowClient.ts @@ -19,6 +19,7 @@ import { ResponseHandler } from "../response/ResponseHandler"; import { CacheRecord } from "../cache/entities/CacheRecord"; import { CacheOutcome } from "../utils/Constants"; import { IPerformanceClient } from "../telemetry/performance/IPerformanceClient"; +import { StringUtils } from "../utils/StringUtils"; export class SilentFlowClient extends BaseClient { constructor( @@ -75,6 +76,15 @@ export class SilentFlowClient extends BaseClient { "SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true." ); throw ClientAuthError.createRefreshRequiredError(); + } else if ( + !this.config.cacheOptions.claimsBasedCachingEnabled && + !StringUtils.isEmptyObj(request.claims) + ) { + // Must refresh due to request parameters. + this.logger.info( + "SilentFlowClient:acquireCachedToken - Skipping cache because claims-based caching is disabled and claims were requested." + ); + throw ClientAuthError.createRefreshRequiredError(); } // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases diff --git a/lib/msal-common/src/config/ClientConfiguration.ts b/lib/msal-common/src/config/ClientConfiguration.ts index 50b5019915..bb527b63db 100644 --- a/lib/msal-common/src/config/ClientConfiguration.ts +++ b/lib/msal-common/src/config/ClientConfiguration.ts @@ -38,6 +38,7 @@ export type ClientConfiguration = { authOptions: AuthOptions; systemOptions?: SystemOptions; loggerOptions?: LoggerOptions; + cacheOptions?: CacheOptions; storageInterface?: CacheManager; networkInterface?: INetworkModule; cryptoInterface?: ICrypto; @@ -53,6 +54,7 @@ export type CommonClientConfiguration = { authOptions: Required; systemOptions: Required; loggerOptions: Required; + cacheOptions: Required; storageInterface: CacheManager; networkInterface: INetworkModule; cryptoInterface: Required; @@ -108,6 +110,15 @@ export type LoggerOptions = { correlationId?: string; }; +/** + * Use this to configure credential cache preferences in the ClientConfiguration object + * + * - claimsBasedCachingEnabled - Sets whether tokens should be cached based on the claims hash. Default is false. + */ +export type CacheOptions = { + claimsBasedCachingEnabled?: boolean; +}; + /** * Library-specific options */ @@ -157,6 +168,10 @@ const DEFAULT_LOGGER_IMPLEMENTATION: Required = { correlationId: Constants.EMPTY_STRING, }; +const DEFAULT_CACHE_OPTIONS: Required = { + claimsBasedCachingEnabled: false, +}; + const DEFAULT_NETWORK_IMPLEMENTATION: INetworkModule = { async sendGetRequestAsync(): Promise { const notImplErr = @@ -205,6 +220,7 @@ export function buildClientConfiguration({ authOptions: userAuthOptions, systemOptions: userSystemOptions, loggerOptions: userLoggerOption, + cacheOptions: userCacheOptions, storageInterface: storageImplementation, networkInterface: networkImplementation, cryptoInterface: cryptoImplementation, @@ -224,6 +240,7 @@ export function buildClientConfiguration({ authOptions: buildAuthOptions(userAuthOptions), systemOptions: { ...DEFAULT_SYSTEM_OPTIONS, ...userSystemOptions }, loggerOptions: loggerOptions, + cacheOptions: { ...DEFAULT_CACHE_OPTIONS, ...userCacheOptions }, storageInterface: storageImplementation || new DefaultStorageClass( diff --git a/lib/msal-common/src/index.ts b/lib/msal-common/src/index.ts index f0f06faf33..ae9dd84c5c 100644 --- a/lib/msal-common/src/index.ts +++ b/lib/msal-common/src/index.ts @@ -16,6 +16,7 @@ export { AuthOptions, SystemOptions, LoggerOptions, + CacheOptions, DEFAULT_SYSTEM_OPTIONS, AzureCloudOptions, ApplicationTelemetry, diff --git a/lib/msal-common/test/client/SilentFlowClient.spec.ts b/lib/msal-common/test/client/SilentFlowClient.spec.ts index 828db9a148..3fbcd700d3 100644 --- a/lib/msal-common/test/client/SilentFlowClient.spec.ts +++ b/lib/msal-common/test/client/SilentFlowClient.spec.ts @@ -268,6 +268,120 @@ describe("SilentFlowClient unit tests", () => { expect(response.state).toBe(""); }); + it("acquireCachedToken throws when given valid claims with default configuration", async () => { + const testScopes = [ + Constants.OPENID_SCOPE, + Constants.PROFILE_SCOPE, + ...TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + ]; + testAccessTokenEntity.target = testScopes.join(" "); + sinon + .stub( + Authority.prototype, + "getEndpointMetadataFromNetwork" + ) + .resolves(DEFAULT_OPENID_CONFIG_RESPONSE.body); + sinon + .stub(AuthToken, "extractTokenClaims") + .returns(ID_TOKEN_CLAIMS); + sinon + .stub(CacheManager.prototype, "readAccountFromCache") + .returns(testAccountEntity); + sinon + .stub(CacheManager.prototype, "getIdToken") + .returns(testIdToken); + sinon + .stub(CacheManager.prototype, "getAccessToken") + .returns(testAccessTokenEntity); + sinon + .stub(CacheManager.prototype, "getRefreshToken") + .returns(testRefreshTokenEntity); + const config = + await ClientTestUtils.createTestClientConfiguration(); + const client = new SilentFlowClient(config, stubPerformanceClient); + sinon.stub(TimeUtils, "isTokenExpired").returns(false); + + const silentFlowRequest: CommonSilentFlowRequest = { + scopes: TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + account: testAccount, + authority: TEST_CONFIG.validAuthority, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + claims: `{ "access_token": { "xms_cc":{"values":["cp1"] } }}`, + }; + + await expect( + client.acquireCachedToken(silentFlowRequest) + ).rejects.toMatchObject( + ClientAuthError.createRefreshRequiredError() + ); + }); + + it("acquireCachedToken does not throw when given valid claims with claimsBasedCachingEnabled", async () => { + const testScopes = [ + Constants.OPENID_SCOPE, + Constants.PROFILE_SCOPE, + ...TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + ]; + testAccessTokenEntity.target = testScopes.join(" "); + sinon + .stub( + Authority.prototype, + "getEndpointMetadataFromNetwork" + ) + .resolves(DEFAULT_OPENID_CONFIG_RESPONSE.body); + sinon + .stub(AuthToken, "extractTokenClaims") + .returns(ID_TOKEN_CLAIMS); + sinon + .stub(CacheManager.prototype, "readAccountFromCache") + .returns(testAccountEntity); + sinon + .stub(CacheManager.prototype, "getIdToken") + .returns(testIdToken); + sinon + .stub(CacheManager.prototype, "getAccessToken") + .returns(testAccessTokenEntity); + sinon + .stub(CacheManager.prototype, "getRefreshToken") + .returns(testRefreshTokenEntity); + const config = + await ClientTestUtils.createTestClientConfiguration(); + const client = new SilentFlowClient( + { + ...config, + cacheOptions: { + ...config.cacheOptions, + claimsBasedCachingEnabled: true, + }, + }, + stubPerformanceClient + ); + sinon.stub(TimeUtils, "isTokenExpired").returns(false); + + const silentFlowRequest: CommonSilentFlowRequest = { + scopes: TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + account: testAccount, + authority: TEST_CONFIG.validAuthority, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + claims: `{ "access_token": { "xms_cc":{"values":["cp1"] } }}`, + }; + + const response = await client.acquireCachedToken(silentFlowRequest); + expect(response.authority).toEqual( + `${TEST_URIS.DEFAULT_INSTANCE}${TEST_CONFIG.TENANT}/` + ); + expect(response.uniqueId).toEqual(ID_TOKEN_CLAIMS.oid); + expect(response.tenantId).toEqual(ID_TOKEN_CLAIMS.tid); + expect(response.scopes).toEqual(testScopes); + expect(response.account).toEqual(testAccount); + expect(response.idToken).toEqual(testIdToken.secret); + expect(response.idTokenClaims).toEqual(ID_TOKEN_CLAIMS); + expect(response.accessToken).toEqual(testAccessTokenEntity.secret); + expect(response.state).toBe(""); + }); + it("acquireCachedToken returns correct token when max age is provided and has not transpired yet", async () => { const testScopes = [ Constants.OPENID_SCOPE, diff --git a/lib/msal-common/test/config/ClientConfiguration.spec.ts b/lib/msal-common/test/config/ClientConfiguration.spec.ts index 05a4bfb292..3913285a21 100644 --- a/lib/msal-common/test/config/ClientConfiguration.spec.ts +++ b/lib/msal-common/test/config/ClientConfiguration.spec.ts @@ -134,6 +134,9 @@ describe("ClientConfiguration.ts Class Unit Tests", () => { // Logger options checks expect(emptyConfig.loggerOptions).not.toBeNull(); expect(emptyConfig.loggerOptions.piiLoggingEnabled).toBe(false); + // Cache Options checks + expect(emptyConfig.cacheOptions).not.toBeNull(); + expect(emptyConfig.cacheOptions.claimsBasedCachingEnabled).toBe(false); // Client info checks expect(emptyConfig.libraryInfo.sku).toBe(Constants.SKU); expect(emptyConfig.libraryInfo.version).toBe(version); @@ -219,6 +222,9 @@ describe("ClientConfiguration.ts Class Unit Tests", () => { ): void => {}, piiLoggingEnabled: true, }, + cacheOptions: { + claimsBasedCachingEnabled: true, + }, libraryInfo: { sku: TEST_CONFIG.TEST_SKU, version: TEST_CONFIG.TEST_VERSION, @@ -298,6 +304,9 @@ describe("ClientConfiguration.ts Class Unit Tests", () => { expect(newConfig.loggerOptions).not.toBeNull(); expect(newConfig.loggerOptions.loggerCallback).not.toBeNull(); expect(newConfig.loggerOptions.piiLoggingEnabled).toBe(true); + // Cache options tests + expect(newConfig.cacheOptions).not.toBeNull(); + expect(newConfig.cacheOptions.claimsBasedCachingEnabled).toBe(true); // Client info tests expect(newConfig.libraryInfo.sku).toBe(TEST_CONFIG.TEST_SKU); expect(newConfig.libraryInfo.version).toBe(TEST_CONFIG.TEST_VERSION); diff --git a/lib/msal-node/package.json b/lib/msal-node/package.json index d4a4ed886a..230c964722 100644 --- a/lib/msal-node/package.json +++ b/lib/msal-node/package.json @@ -35,6 +35,7 @@ "lint:fix": "npm run lint -- -- --fix", "build:all": "npm run build:common && npm run build", "build:common": "cd ../msal-common && npm run build", + "build:modules:watch": "rollup -cw --bundleConfigAsCjs", "link:localDeps": "npx lerna@6 bootstrap --scope @azure/msal-common --scope @azure/msal-node", "prepack": "npm run build:all", "format:check": "npx prettier --ignore-path .gitignore --check src test", diff --git a/lib/msal-node/src/client/ClientApplication.ts b/lib/msal-node/src/client/ClientApplication.ts index 2f118a78c5..bd1ac3e203 100644 --- a/lib/msal-node/src/client/ClientApplication.ts +++ b/lib/msal-node/src/client/ClientApplication.ts @@ -437,6 +437,10 @@ export abstract class ClientApplication { this.config.system.loggerOptions.piiLoggingEnabled, correlationId: requestCorrelationId, }, + cacheOptions: { + claimsBasedCachingEnabled: + this.config.cache.claimsBasedCachingEnabled, + }, cryptoInterface: this.cryptoProvider, networkInterface: this.config.system.networkClient, storageInterface: this.storage, @@ -499,8 +503,13 @@ export abstract class ClientApplication { authRequest.authenticationScheme = AuthenticationScheme.BEARER; - // Set requested claims hash if claims were requested - if (authRequest.claims && !StringUtils.isEmpty(authRequest.claims)) { + // Set requested claims hash if claims-based caching is enabled and claims were requested + if ( + this.config.cache.claimsBasedCachingEnabled && + authRequest.claims && + // Checks for empty stringified object "{}" which doesn't qualify as requested claims + !StringUtils.isEmptyObj(authRequest.claims) + ) { authRequest.requestedClaimsHash = await this.cryptoProvider.hashString(authRequest.claims); } diff --git a/lib/msal-node/src/config/Configuration.ts b/lib/msal-node/src/config/Configuration.ts index b235675a67..43b628a299 100644 --- a/lib/msal-node/src/config/Configuration.ts +++ b/lib/msal-node/src/config/Configuration.ts @@ -57,6 +57,7 @@ export type NodeAuthOptions = { */ export type CacheOptions = { cachePlugin?: ICachePlugin; + claimsBasedCachingEnabled?: boolean; }; /** @@ -128,7 +129,9 @@ const DEFAULT_AUTH_OPTIONS: Required = { skipAuthorityMetadataCache: false, }; -const DEFAULT_CACHE_OPTIONS: CacheOptions = {}; +const DEFAULT_CACHE_OPTIONS: CacheOptions = { + claimsBasedCachingEnabled: false, +}; const DEFAULT_LOGGER_OPTIONS: LoggerOptions = { loggerCallback: (): void => { diff --git a/lib/msal-node/test/client/PublicClientApplication.spec.ts b/lib/msal-node/test/client/PublicClientApplication.spec.ts index d3578729ed..9fe3113f71 100644 --- a/lib/msal-node/test/client/PublicClientApplication.spec.ts +++ b/lib/msal-node/test/client/PublicClientApplication.spec.ts @@ -21,7 +21,7 @@ import { ServerAuthorizationCodeResponse, InteractionRequiredAuthError, AccountEntity, - IdToken + IdToken, } from "@azure/msal-common"; import { Configuration, @@ -237,12 +237,12 @@ describe("PublicClientApplication", () => { account: mockAccountInfo, scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, }; - + const silentFlowClient = getMsalCommonAutoMock().SilentFlowClient; jest.spyOn(msalCommon, "SilentFlowClient").mockImplementation( (config) => new silentFlowClient(config) ); - + const authApp = new PublicClientApplication(appConfig); await authApp.acquireTokenSilent(request); expect(SilentFlowClient).toHaveBeenCalledTimes(1); @@ -255,60 +255,70 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SilentFlowRequest = { account: mockNativeAccountInfo, - scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE + scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, }; - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenSilent"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "acquireTokenSilent" + ); const response = await authApp.acquireTokenSilent(request); expect(brokerSpy).toHaveBeenCalled(); - expect(response.idToken).toEqual(mockNativeAuthenticationResult.idToken); - expect(response.accessToken).toEqual(mockNativeAuthenticationResult.accessToken); - expect(response.account).toEqual(mockNativeAuthenticationResult.account); + expect(response.idToken).toEqual( + mockNativeAuthenticationResult.idToken + ); + expect(response.accessToken).toEqual( + mockNativeAuthenticationResult.accessToken + ); + expect(response.account).toEqual( + mockNativeAuthenticationResult.account + ); }); test("acquireTokenSilent - calls into NativeBrokerPlugin and throws", (done) => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SilentFlowRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, - account: mockNativeAccountInfo + account: mockNativeAccountInfo, }; - const testError = new InteractionRequiredAuthError("interaction_required", ); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenSilent").mockImplementation(() => { - return Promise.reject(testError); - }); - authApp.acquireTokenSilent(request).catch(e => { + const testError = new InteractionRequiredAuthError( + "interaction_required" + ); + const brokerSpy = jest + .spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenSilent") + .mockImplementation(() => { + return Promise.reject(testError); + }); + authApp.acquireTokenSilent(request).catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); done(); }); }); - }); - describe("acquireTokenInteractive tests", () => { - test("acquireTokenInteractive succeeds", async () => { const authApp = new PublicClientApplication(appConfig); - + let redirectUri: string; - + const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe( - true - ); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); http.get( `${redirectUri}?code=${TEST_CONSTANTS.AUTHORIZATION_CODE}` ); @@ -318,13 +328,16 @@ describe("PublicClientApplication", () => { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, openBrowser: openBrowser, }; - + const MockAuthorizationCodeClient = getMsalCommonAutoMock().AuthorizationCodeClient; - jest.spyOn(msalCommon, "AuthorizationCodeClient").mockImplementation( + jest.spyOn( + msalCommon, + "AuthorizationCodeClient" + ).mockImplementation( (config) => new MockAuthorizationCodeClient(config) ); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "getAuthCodeUrl" @@ -332,7 +345,7 @@ describe("PublicClientApplication", () => { redirectUri = req.redirectUri; return Promise.resolve(TEST_CONSTANTS.AUTH_CODE_URL); }); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "acquireToken" @@ -343,7 +356,7 @@ describe("PublicClientApplication", () => { ]); return Promise.resolve(mockAuthenticationResult); }); - + const response = await authApp.acquireTokenInteractive(request); expect(response.idToken).toEqual(mockAuthenticationResult.idToken); expect(response.accessToken).toEqual( @@ -351,49 +364,56 @@ describe("PublicClientApplication", () => { ); expect(response.account).toEqual(mockAuthenticationResult.account); }); - + test("acquireTokenInteractive - with custom loopback client succeeds", async () => { const authApp = new PublicClientApplication(appConfig); - + const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe( - true - ); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); return Promise.resolve(); }; - + const testServerCodeResponse: ServerAuthorizationCodeResponse = { code: TEST_CONSTANTS.AUTHORIZATION_CODE, client_info: TEST_DATA_CLIENT_INFO.TEST_DECODED_CLIENT_INFO, state: "123", }; - + const mockListenForAuthCode = jest.fn(() => { - return new Promise((resolve) => { - resolve(testServerCodeResponse); - }); + return new Promise( + (resolve) => { + resolve(testServerCodeResponse); + } + ); }); - const mockGetRedirectUri = jest.fn(() => TEST_CONSTANTS.REDIRECT_URI); + const mockGetRedirectUri = jest.fn( + () => TEST_CONSTANTS.REDIRECT_URI + ); const mockCloseServer = jest.fn(() => {}); - + const customLoopbackClient: ILoopbackClient = { listenForAuthCode: mockListenForAuthCode, getRedirectUri: mockGetRedirectUri, closeServer: mockCloseServer, }; - + const request: InteractiveRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, openBrowser: openBrowser, loopbackClient: customLoopbackClient, }; - + const MockAuthorizationCodeClient = getMsalCommonAutoMock().AuthorizationCodeClient; - jest.spyOn(msalCommon, "AuthorizationCodeClient").mockImplementation( + jest.spyOn( + msalCommon, + "AuthorizationCodeClient" + ).mockImplementation( (config) => new MockAuthorizationCodeClient(config) ); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "getAuthCodeUrl" @@ -401,7 +421,7 @@ describe("PublicClientApplication", () => { expect(req.redirectUri).toEqual(TEST_CONSTANTS.REDIRECT_URI); return Promise.resolve(TEST_CONSTANTS.AUTH_CODE_URL); }); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "acquireToken" @@ -412,7 +432,7 @@ describe("PublicClientApplication", () => { ]); return Promise.resolve(mockAuthenticationResult); }); - + const response = await authApp.acquireTokenInteractive(request); expect(response.idToken).toEqual(mockAuthenticationResult.idToken); expect(response.accessToken).toEqual( @@ -428,50 +448,68 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe(true); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); return Promise.resolve(); }; const request: InteractiveRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, - openBrowser + openBrowser, }; - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenInteractive"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "acquireTokenInteractive" + ); const response = await authApp.acquireTokenInteractive(request); expect(brokerSpy).toHaveBeenCalled(); - expect(response.idToken).toEqual(mockNativeAuthenticationResult.idToken); - expect(response.accessToken).toEqual(mockNativeAuthenticationResult.accessToken); - expect(response.account).toEqual(mockNativeAuthenticationResult.account); + expect(response.idToken).toEqual( + mockNativeAuthenticationResult.idToken + ); + expect(response.accessToken).toEqual( + mockNativeAuthenticationResult.accessToken + ); + expect(response.account).toEqual( + mockNativeAuthenticationResult.account + ); }); test("acquireTokenInteractive - calls into NativeBrokerPlugin and throws", (done) => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe(true); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); return Promise.resolve(); }; const request: InteractiveRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, - openBrowser + openBrowser, }; const testError = ClientAuthError.createUserCanceledError(); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenInteractive").mockImplementation(() => { - return Promise.reject(testError); - }); - authApp.acquireTokenInteractive(request).catch(e => { + const brokerSpy = jest + .spyOn( + MockNativeBrokerPlugin.prototype, + "acquireTokenInteractive" + ) + .mockImplementation(() => { + return Promise.reject(testError); + }); + authApp.acquireTokenInteractive(request).catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); done(); @@ -482,14 +520,14 @@ describe("PublicClientApplication", () => { describe("signOut tests", () => { test("signOut clears account from local cache", async () => { const authApp = new PublicClientApplication({ - ...appConfig + ...appConfig, }); const cryptoProvider = new CryptoProvider(); const accountEntity: AccountEntity = AccountEntity.createAccount( - TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, - mockAccountInfo.homeAccountId, - new IdToken(mockAuthenticationResult.idToken, cryptoProvider), + TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, + mockAccountInfo.homeAccountId, + new IdToken(mockAuthenticationResult.idToken, cryptoProvider), fakeAuthority ); @@ -508,14 +546,17 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SignOutRequest = { - account: mockNativeAccountInfo + account: mockNativeAccountInfo, }; - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "signOut"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "signOut" + ); await authApp.signOut(request); expect(brokerSpy).toHaveBeenCalled(); }); @@ -524,17 +565,19 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SignOutRequest = { - account: mockNativeAccountInfo + account: mockNativeAccountInfo, }; const testError = ClientAuthError.createNoAccountFoundError(); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "signOut").mockImplementation(() => { - return Promise.reject(testError); - }); + const brokerSpy = jest + .spyOn(MockNativeBrokerPlugin.prototype, "signOut") + .mockImplementation(() => { + return Promise.reject(testError); + }); authApp.signOut(request).catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); @@ -546,14 +589,14 @@ describe("PublicClientApplication", () => { describe("getAllAccounts tests", () => { test("getAllAccounts returns an array of accounts found in the cache", async () => { const authApp = new PublicClientApplication({ - ...appConfig + ...appConfig, }); const cryptoProvider = new CryptoProvider(); const accountEntity: AccountEntity = AccountEntity.createAccount( - TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, - mockAccountInfo.homeAccountId, - new IdToken(mockAuthenticationResult.idToken, cryptoProvider), + TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, + mockAccountInfo.homeAccountId, + new IdToken(mockAuthenticationResult.idToken, cryptoProvider), fakeAuthority ); @@ -568,11 +611,14 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "getAllAccounts"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "getAllAccounts" + ); const accounts = await authApp.getAllAccounts(); expect(brokerSpy).toHaveBeenCalled(); expect(accounts).toStrictEqual([mockNativeAccountInfo]); @@ -582,14 +628,16 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const testError = ClientAuthError.createNoAccountFoundError(); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "getAllAccounts").mockImplementation(() => { - return Promise.reject(testError); - }); + const brokerSpy = jest + .spyOn(MockNativeBrokerPlugin.prototype, "getAllAccounts") + .mockImplementation(() => { + return Promise.reject(testError); + }); authApp.getAllAccounts().catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); @@ -598,7 +646,7 @@ describe("PublicClientApplication", () => { }); }); - test("initializeBaseRequest passes a claims hash to acquireToken", async () => { + test("initializeBaseRequest passes a requested claims hash to acquireToken when claimsBasedHashing is enabled", async () => { const account: AccountInfo = { homeAccountId: "", environment: "", @@ -623,7 +671,10 @@ describe("PublicClientApplication", () => { silentFlowClient.prototype, "acquireToken" ); - const authApp = new PublicClientApplication(appConfig); + const authApp = new PublicClientApplication({ + ...appConfig, + cache: { claimsBasedCachingEnabled: true }, + }); await authApp.acquireTokenSilent(request); expect(silentFlowClient.prototype.acquireToken).toHaveBeenCalledWith( expect.objectContaining({ requestedClaimsHash: expect.any(String) }) @@ -635,6 +686,43 @@ describe("PublicClientApplication", () => { ).toBeGreaterThan(0); }); + test("initializeBaseRequest doesn't pass a claims hash to acquireToken when claimsBasedHashing is disabled by default", async () => { + const account: AccountInfo = { + homeAccountId: "", + environment: "", + tenantId: "", + username: "", + localAccountId: "", + name: "", + idTokenClaims: ID_TOKEN_CLAIMS, + }; + const request: SilentFlowRequest = { + account: account, + scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, + claims: TEST_CONSTANTS.CLAIMS, + }; + + const silentFlowClient = getMsalCommonAutoMock().SilentFlowClient; + jest.spyOn(msalCommon, "SilentFlowClient").mockImplementation( + (config) => new silentFlowClient(config) + ); + + const acquireTokenSpy = jest.spyOn( + silentFlowClient.prototype, + "acquireToken" + ); + const authApp = new PublicClientApplication(appConfig); + await authApp.acquireTokenSilent(request); + expect(silentFlowClient.prototype.acquireToken).toHaveBeenCalledWith( + expect.not.objectContaining({ + requestedClaimsHash: expect.any(String), + }) + ); + + const submittedRequest = acquireTokenSpy.mock.calls[0][0]; + expect((submittedRequest as any)?.requestedClaimsHash).toBe(undefined); + }); + test("create AuthorizationCode URL", async () => { const request: AuthorizationUrlRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, diff --git a/lib/msal-node/test/utils/TestConstants.ts b/lib/msal-node/test/utils/TestConstants.ts index 50a647b427..d578836b88 100644 --- a/lib/msal-node/test/utils/TestConstants.ts +++ b/lib/msal-node/test/utils/TestConstants.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. */ -import { AccountInfo , +import { + AccountInfo, ICrypto, AuthError, PkceCodes, @@ -47,7 +48,7 @@ line3 line4 -----END CERTIFICATE----- `, - CLAIMS: "claim1 claim2", + CLAIMS: `{ "access_token": { "xms_cc":{"values":["cp1"] } }}`, SNI_CERTIFICATE: `-----BEGIN PRIVATE KEY-----\r line1\r line2\r @@ -249,13 +250,13 @@ export const mockAccountInfo: AccountInfo = { username: ID_TOKEN_CLAIMS.preferred_username, idTokenClaims: ID_TOKEN_CLAIMS, name: ID_TOKEN_CLAIMS.name, - nativeAccountId: undefined + nativeAccountId: undefined, }; export const mockNativeAccountInfo: AccountInfo = { ...mockAccountInfo, - nativeAccountId: "test-nativeAccountId" -} + nativeAccountId: "test-nativeAccountId", +}; export const mockAuthenticationResult: AuthenticationResult = { authority: TEST_CONSTANTS.DEFAULT_AUTHORITY, @@ -269,13 +270,13 @@ export const mockAuthenticationResult: AuthenticationResult = { fromCache: false, expiresOn: new Date(), tokenType: "BEARER", - correlationId: "test-correlationId" + correlationId: "test-correlationId", }; export const mockNativeAuthenticationResult: AuthenticationResult = { ...mockAuthenticationResult, - account: mockNativeAccountInfo -} + account: mockNativeAccountInfo, +}; export type MockedMetadataResponse = { tenant_discovery_endpoint: string; From 1f5bcd0076067f937a4f0bf0d31dcad5e48aa1aa Mon Sep 17 00:00:00 2001 From: Thomas Norling Date: Wed, 5 Jul 2023 17:07:20 -0700 Subject: [PATCH 6/8] July 2023 Release [beta.1] (#6199) Bumps packages to beta.1 --- ...-8efd78c1-92ab-4c2a-ac45-0044359e2365.json | 7 --- ...-1fe30015-5db8-41ae-988f-d27fa55e15e3.json | 7 --- ...-27a1b48c-e064-44b8-92ab-8a995e90048e.json | 7 --- ...-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json | 7 --- ...-86bd2ee6-1646-4c84-a3ae-0eb31623675e.json | 7 --- ...-b9572127-f4c0-473a-a120-61bb7d2850c6.json | 7 --- ...-3cdc9d22-67a6-41c7-8d7c-6b42b43c8106.json | 7 --- ...-a23ce5a8-953f-4bbd-8950-76a9c5276a9f.json | 7 --- ...-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json | 7 --- ...-44b62ae5-8011-430c-aca4-e7230b9845e9.json | 7 --- ...-5b1b3e16-c8e5-47fb-847f-9faada5ce08e.json | 7 --- ...-91151471-3461-48a0-8707-8f9afdb4381b.json | 7 --- ...-9e932e64-f4d6-4bcb-9073-c7ad35d97ca5.json | 7 --- ...-3c09725e-4448-4a85-99a7-c134763a3547.json | 7 --- ...-52ca3a73-b606-443a-946c-a90644ba34be.json | 7 --- ...-e1e4c320-58b4-4318-8348-7893261b7295.json | 7 --- .../msal-node-extensions/CHANGELOG.json | 23 +++++++++ extensions/msal-node-extensions/CHANGELOG.md | 10 +++- extensions/msal-node-extensions/package.json | 6 +-- .../src/packageMetadata.ts | 3 +- lib/msal-angular/CHANGELOG.json | 21 +++++++++ lib/msal-angular/CHANGELOG.md | 11 ++++- lib/msal-angular/package.json | 8 ++-- lib/msal-angular/src/packageMetadata.ts | 4 +- lib/msal-browser/CHANGELOG.json | 47 +++++++++++++++++++ lib/msal-browser/CHANGELOG.md | 14 +++++- lib/msal-browser/package.json | 6 +-- lib/msal-browser/src/packageMetadata.ts | 3 +- lib/msal-common/CHANGELOG.json | 29 ++++++++++++ lib/msal-common/CHANGELOG.md | 11 ++++- lib/msal-common/package.json | 4 +- lib/msal-common/src/packageMetadata.ts | 3 +- lib/msal-node/CHANGELOG.json | 41 ++++++++++++++++ lib/msal-node/CHANGELOG.md | 13 ++++- lib/msal-node/package.json | 6 +-- lib/msal-node/src/packageMetadata.ts | 3 +- lib/msal-react/CHANGELOG.json | 29 ++++++++++++ lib/msal-react/CHANGELOG.md | 11 ++++- lib/msal-react/package.json | 8 ++-- lib/msal-react/src/packageMetadata.ts | 3 +- 40 files changed, 280 insertions(+), 149 deletions(-) delete mode 100644 change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json delete mode 100644 change/@azure-msal-browser-1fe30015-5db8-41ae-988f-d27fa55e15e3.json delete mode 100644 change/@azure-msal-browser-27a1b48c-e064-44b8-92ab-8a995e90048e.json delete mode 100644 change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json delete mode 100644 change/@azure-msal-browser-86bd2ee6-1646-4c84-a3ae-0eb31623675e.json delete mode 100644 change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json delete mode 100644 change/@azure-msal-common-3cdc9d22-67a6-41c7-8d7c-6b42b43c8106.json delete mode 100644 change/@azure-msal-common-a23ce5a8-953f-4bbd-8950-76a9c5276a9f.json delete mode 100644 change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json delete mode 100644 change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json delete mode 100644 change/@azure-msal-node-5b1b3e16-c8e5-47fb-847f-9faada5ce08e.json delete mode 100644 change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json delete mode 100644 change/@azure-msal-node-9e932e64-f4d6-4bcb-9073-c7ad35d97ca5.json delete mode 100644 change/@azure-msal-node-extensions-3c09725e-4448-4a85-99a7-c134763a3547.json delete mode 100644 change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json delete mode 100644 change/@azure-msal-react-e1e4c320-58b4-4318-8348-7893261b7295.json diff --git a/change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json b/change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json deleted file mode 100644 index 5f8a4c0b6a..0000000000 --- a/change/@azure-msal-angular-8efd78c1-92ab-4c2a-ac45-0044359e2365.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Remove unused main field in package.json #6190", - "packageName": "@azure/msal-angular", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-browser-1fe30015-5db8-41ae-988f-d27fa55e15e3.json b/change/@azure-msal-browser-1fe30015-5db8-41ae-988f-d27fa55e15e3.json deleted file mode 100644 index 11fa0ffae9..0000000000 --- a/change/@azure-msal-browser-1fe30015-5db8-41ae-988f-d27fa55e15e3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Export IdTokenClaims & PromptValue types", - "packageName": "@azure/msal-browser", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-browser-27a1b48c-e064-44b8-92ab-8a995e90048e.json b/change/@azure-msal-browser-27a1b48c-e064-44b8-92ab-8a995e90048e.json deleted file mode 100644 index 79b540dadc..0000000000 --- a/change/@azure-msal-browser-27a1b48c-e064-44b8-92ab-8a995e90048e.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "DevDependency updates", - "packageName": "@azure/msal-browser", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json b/change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json deleted file mode 100644 index 0e1110a058..0000000000 --- a/change/@azure-msal-browser-327c8ac5-8041-4c9b-9b4c-fa7ca85e713f.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Make account info mandatory for AuthenticationResult and CacheRecord types #6156", - "packageName": "@azure/msal-browser", - "email": "kshabelko@microsoft.com", - "dependentChangeType": "prerelease" -} diff --git a/change/@azure-msal-browser-86bd2ee6-1646-4c84-a3ae-0eb31623675e.json b/change/@azure-msal-browser-86bd2ee6-1646-4c84-a3ae-0eb31623675e.json deleted file mode 100644 index 0f54d23466..0000000000 --- a/change/@azure-msal-browser-86bd2ee6-1646-4c84-a3ae-0eb31623675e.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Update string conversion function", - "packageName": "@azure/msal-browser", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json b/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json deleted file mode 100644 index 43babf4a75..0000000000 --- a/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Make claims-based caching configurable #6163", - "packageName": "@azure/msal-browser", - "email": "hemoral@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-common-3cdc9d22-67a6-41c7-8d7c-6b42b43c8106.json b/change/@azure-msal-common-3cdc9d22-67a6-41c7-8d7c-6b42b43c8106.json deleted file mode 100644 index 16a81f6939..0000000000 --- a/change/@azure-msal-common-3cdc9d22-67a6-41c7-8d7c-6b42b43c8106.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Fix performance bug with regional authority detection #6139", - "packageName": "@azure/msal-common", - "email": "joarroyo@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-common-a23ce5a8-953f-4bbd-8950-76a9c5276a9f.json b/change/@azure-msal-common-a23ce5a8-953f-4bbd-8950-76a9c5276a9f.json deleted file mode 100644 index cf7c1ca7ca..0000000000 --- a/change/@azure-msal-common-a23ce5a8-953f-4bbd-8950-76a9c5276a9f.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "DevDependency updates", - "packageName": "@azure/msal-common", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json b/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json deleted file mode 100644 index 0055944ab3..0000000000 --- a/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Make claims-based caching configurable #6163", - "packageName": "@azure/msal-common", - "email": "hemoral@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json b/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json deleted file mode 100644 index cea34ff003..0000000000 --- a/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Make claims-based caching configurable #6163", - "packageName": "@azure/msal-node", - "email": "hemoral@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-node-5b1b3e16-c8e5-47fb-847f-9faada5ce08e.json b/change/@azure-msal-node-5b1b3e16-c8e5-47fb-847f-9faada5ce08e.json deleted file mode 100644 index 15ea8a4fc6..0000000000 --- a/change/@azure-msal-node-5b1b3e16-c8e5-47fb-847f-9faada5ce08e.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Export IdTokenClaims & ServerAuthorizationCodeResponse types", - "packageName": "@azure/msal-node", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json b/change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json deleted file mode 100644 index da1bc81fff..0000000000 --- a/change/@azure-msal-node-91151471-3461-48a0-8707-8f9afdb4381b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "fix: msal-node now references the right index.esm.ja", - "packageName": "@azure/msal-node", - "email": "joshua.head@envoryat.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-node-9e932e64-f4d6-4bcb-9073-c7ad35d97ca5.json b/change/@azure-msal-node-9e932e64-f4d6-4bcb-9073-c7ad35d97ca5.json deleted file mode 100644 index 35df0c609b..0000000000 --- a/change/@azure-msal-node-9e932e64-f4d6-4bcb-9073-c7ad35d97ca5.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "DevDependency updates", - "packageName": "@azure/msal-node", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@azure-msal-node-extensions-3c09725e-4448-4a85-99a7-c134763a3547.json b/change/@azure-msal-node-extensions-3c09725e-4448-4a85-99a7-c134763a3547.json deleted file mode 100644 index 98aa09b58d..0000000000 --- a/change/@azure-msal-node-extensions-3c09725e-4448-4a85-99a7-c134763a3547.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "DevDependency updates", - "packageName": "@azure/msal-node-extensions", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json b/change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json deleted file mode 100644 index 081b4cb76d..0000000000 --- a/change/@azure-msal-react-52ca3a73-b606-443a-946c-a90644ba34be.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Fix module field in package.json #6190", - "packageName": "@azure/msal-react", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-react-e1e4c320-58b4-4318-8348-7893261b7295.json b/change/@azure-msal-react-e1e4c320-58b4-4318-8348-7893261b7295.json deleted file mode 100644 index d87a5c82fe..0000000000 --- a/change/@azure-msal-react-e1e4c320-58b4-4318-8348-7893261b7295.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "DevDependency updates", - "packageName": "@azure/msal-react", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "none" -} diff --git a/extensions/msal-node-extensions/CHANGELOG.json b/extensions/msal-node-extensions/CHANGELOG.json index 8efcfd9295..d29c479597 100644 --- a/extensions/msal-node-extensions/CHANGELOG.json +++ b/extensions/msal-node-extensions/CHANGELOG.json @@ -1,6 +1,29 @@ { "name": "@azure/msal-node-extensions", "entries": [ + { + "date": "Thu, 06 Jul 2023 00:01:33 GMT", + "tag": "@azure/msal-node-extensions_v1.0.0-beta.1", + "version": "1.0.0-beta.1", + "comments": { + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-node-extensions", + "commit": "f714b51f03eb87ccd0102d886c814b3dab2b5cc9", + "comment": "DevDependency updates" + } + ], + "prerelease": [ + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump @azure/msal-common to v14.0.0-beta.1", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c" + } + ] + } + }, { "date": "Thu, 15 Jun 2023 22:19:25 GMT", "tag": "@azure/msal-node-extensions_v1.0.0-beta.0", diff --git a/extensions/msal-node-extensions/CHANGELOG.md b/extensions/msal-node-extensions/CHANGELOG.md index 55f4d78a8e..9b77c034d1 100644 --- a/extensions/msal-node-extensions/CHANGELOG.md +++ b/extensions/msal-node-extensions/CHANGELOG.md @@ -1,9 +1,17 @@ # Change Log - @azure/msal-node-extensions -This log was last generated on Thu, 15 Jun 2023 22:19:25 GMT and should not be manually modified. +This log was last generated on Thu, 06 Jul 2023 00:01:33 GMT and should not be manually modified. +## 1.0.0-beta.1 + +Thu, 06 Jul 2023 00:01:33 GMT + +### Changes + +- Bump @azure/msal-common to v14.0.0-beta.1 + ## 1.0.0-beta.0 Thu, 15 Jun 2023 22:19:25 GMT diff --git a/extensions/msal-node-extensions/package.json b/extensions/msal-node-extensions/package.json index 9383e0824c..c6c6d738a1 100644 --- a/extensions/msal-node-extensions/package.json +++ b/extensions/msal-node-extensions/package.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-node-extensions", - "version": "1.0.0-beta.0", + "version": "1.0.0-beta.1", "repository": { "type": "git", "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git" @@ -50,7 +50,7 @@ ] }, "dependencies": { - "@azure/msal-common": "14.0.0-beta.0", + "@azure/msal-common": "14.0.0-beta.1", "@azure/msal-node-runtime": "^0.13.6-alpha.0", "keytar": "^7.8.0" }, @@ -67,4 +67,4 @@ "tslib": "^2.0.0", "typescript": "^4.9.5" } -} \ No newline at end of file +} diff --git a/extensions/msal-node-extensions/src/packageMetadata.ts b/extensions/msal-node-extensions/src/packageMetadata.ts index 3cddac67ef..75a5bfa6d0 100644 --- a/extensions/msal-node-extensions/src/packageMetadata.ts +++ b/extensions/msal-node-extensions/src/packageMetadata.ts @@ -1,4 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-node-extensions"; -export const version = "1.0.0-beta.0"; - +export const version = "1.0.0-beta.1"; diff --git a/lib/msal-angular/CHANGELOG.json b/lib/msal-angular/CHANGELOG.json index e6eac24bf5..8e74b39171 100644 --- a/lib/msal-angular/CHANGELOG.json +++ b/lib/msal-angular/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@azure/msal-angular", "entries": [ + { + "date": "Thu, 06 Jul 2023 00:01:36 GMT", + "tag": "@azure/msal-angular_v3.0.0-beta.1", + "version": "3.0.0-beta.1", + "comments": { + "prerelease": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-angular", + "commit": "faae9defff0424799bfa540fdb2c2f309b34db3a", + "comment": "Remove unused main field in package.json #6190" + }, + { + "author": "beachball", + "package": "@azure/msal-angular", + "comment": "Bump @azure/msal-browser to v3.0.0-beta.1", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c" + } + ] + } + }, { "date": "Thu, 15 Jun 2023 22:19:25 GMT", "tag": "@azure/msal-angular_v3.0.0-beta.0", diff --git a/lib/msal-angular/CHANGELOG.md b/lib/msal-angular/CHANGELOG.md index a516d245b5..88b79b9f88 100644 --- a/lib/msal-angular/CHANGELOG.md +++ b/lib/msal-angular/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @azure/msal-angular -This log was last generated on Thu, 15 Jun 2023 22:19:25 GMT and should not be manually modified. +This log was last generated on Thu, 06 Jul 2023 00:01:36 GMT and should not be manually modified. +## 3.0.0-beta.1 + +Thu, 06 Jul 2023 00:01:36 GMT + +### Changes + +- Remove unused main field in package.json #6190 (thomas.norling@microsoft.com) +- Bump @azure/msal-browser to v3.0.0-beta.1 + ## 3.0.0-beta.0 Thu, 15 Jun 2023 22:19:25 GMT diff --git a/lib/msal-angular/package.json b/lib/msal-angular/package.json index 8e737715f6..f6309523f2 100644 --- a/lib/msal-angular/package.json +++ b/lib/msal-angular/package.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-angular", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "author": { "name": "Microsoft", "email": "nugetaad@microsoft.com", @@ -55,7 +55,7 @@ "@angular/platform-browser": "^15.1.4", "@angular/platform-browser-dynamic": "^15.1.4", "@angular/router": "^15.1.4", - "@azure/msal-browser": "^3.0.0-beta.0", + "@azure/msal-browser": "^3.0.0-beta.1", "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", @@ -75,7 +75,7 @@ "zone.js": "~0.11.8" }, "peerDependencies": { - "@azure/msal-browser": "^3.0.0-beta.0", + "@azure/msal-browser": "^3.0.0-beta.1", "rxjs": "^7.0.0" } -} \ No newline at end of file +} diff --git a/lib/msal-angular/src/packageMetadata.ts b/lib/msal-angular/src/packageMetadata.ts index c4fb17c11e..f570265470 100644 --- a/lib/msal-angular/src/packageMetadata.ts +++ b/lib/msal-angular/src/packageMetadata.ts @@ -1,3 +1,3 @@ /* eslint-disable header/header */ -export const name = '@azure/msal-angular'; -export const version = '3.0.0-beta.0'; +export const name = "@azure/msal-angular"; +export const version = "3.0.0-beta.1"; diff --git a/lib/msal-browser/CHANGELOG.json b/lib/msal-browser/CHANGELOG.json index 9613e2e945..e4d5f3f07c 100644 --- a/lib/msal-browser/CHANGELOG.json +++ b/lib/msal-browser/CHANGELOG.json @@ -1,6 +1,53 @@ { "name": "@azure/msal-browser", "entries": [ + { + "date": "Thu, 06 Jul 2023 00:01:35 GMT", + "tag": "@azure/msal-browser_v3.0.0-beta.1", + "version": "3.0.0-beta.1", + "comments": { + "prerelease": [ + { + "author": "hemoral@microsoft.com", + "package": "@azure/msal-browser", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c", + "comment": "Make claims-based caching configurable #6163" + }, + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-browser", + "commit": "b2b17b3cc0485be1eaca97a15de06c846557921a", + "comment": "Update string conversion function" + }, + { + "author": "kshabelko@microsoft.com", + "package": "@azure/msal-browser", + "commit": "9939c2767634aabe878fa613060084c581e621d2", + "comment": "Make account info mandatory for AuthenticationResult and CacheRecord types #6156" + }, + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-browser", + "commit": "5ecb611181d878b533ddb43f4774b064d63f8f3a", + "comment": "Export IdTokenClaims & PromptValue types" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump @azure/msal-common to v14.0.0-beta.1", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c" + } + ], + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-browser", + "commit": "f714b51f03eb87ccd0102d886c814b3dab2b5cc9", + "comment": "DevDependency updates" + } + ] + } + }, { "date": "Thu, 15 Jun 2023 22:19:24 GMT", "tag": "@azure/msal-browser_v3.0.0-beta.0", diff --git a/lib/msal-browser/CHANGELOG.md b/lib/msal-browser/CHANGELOG.md index 609afd9b3d..1e0af4382b 100644 --- a/lib/msal-browser/CHANGELOG.md +++ b/lib/msal-browser/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @azure/msal-browser -This log was last generated on Thu, 15 Jun 2023 22:19:24 GMT and should not be manually modified. +This log was last generated on Thu, 06 Jul 2023 00:01:35 GMT and should not be manually modified. +## 3.0.0-beta.1 + +Thu, 06 Jul 2023 00:01:35 GMT + +### Changes + +- Make claims-based caching configurable #6163 (hemoral@microsoft.com) +- Update string conversion function (thomas.norling@microsoft.com) +- Make account info mandatory for AuthenticationResult and CacheRecord types #6156 (kshabelko@microsoft.com) +- Export IdTokenClaims & PromptValue types (thomas.norling@microsoft.com) +- Bump @azure/msal-common to v14.0.0-beta.1 + ## 3.0.0-beta.0 Thu, 15 Jun 2023 22:19:24 GMT diff --git a/lib/msal-browser/package.json b/lib/msal-browser/package.json index e967c3a002..184bb75b26 100644 --- a/lib/msal-browser/package.json +++ b/lib/msal-browser/package.json @@ -10,7 +10,7 @@ "type": "git", "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git" }, - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "description": "Microsoft Authentication Library for js", "keywords": [ "implicit", @@ -94,6 +94,6 @@ "typescript": "^4.9.5" }, "dependencies": { - "@azure/msal-common": "14.0.0-beta.0" + "@azure/msal-common": "14.0.0-beta.1" } -} \ No newline at end of file +} diff --git a/lib/msal-browser/src/packageMetadata.ts b/lib/msal-browser/src/packageMetadata.ts index 484acac892..54a2e52c61 100644 --- a/lib/msal-browser/src/packageMetadata.ts +++ b/lib/msal-browser/src/packageMetadata.ts @@ -1,4 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-browser"; -export const version = "3.0.0-beta.0"; - +export const version = "3.0.0-beta.1"; diff --git a/lib/msal-common/CHANGELOG.json b/lib/msal-common/CHANGELOG.json index 90d4572120..8f289243fe 100644 --- a/lib/msal-common/CHANGELOG.json +++ b/lib/msal-common/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@azure/msal-common", "entries": [ + { + "date": "Thu, 06 Jul 2023 00:01:34 GMT", + "tag": "@azure/msal-common_v14.0.0-beta.1", + "version": "14.0.0-beta.1", + "comments": { + "prerelease": [ + { + "author": "hemoral@microsoft.com", + "package": "@azure/msal-common", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c", + "comment": "Make claims-based caching configurable #6163" + }, + { + "author": "joarroyo@microsoft.com", + "package": "@azure/msal-common", + "commit": "6e4d09f9f6a32c96413d432c42bcf21c52971a22", + "comment": "Fix performance bug with regional authority detection #6139" + } + ], + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-common", + "commit": "f714b51f03eb87ccd0102d886c814b3dab2b5cc9", + "comment": "DevDependency updates" + } + ] + } + }, { "date": "Thu, 15 Jun 2023 22:19:26 GMT", "tag": "@azure/msal-common_v14.0.0-beta.0", diff --git a/lib/msal-common/CHANGELOG.md b/lib/msal-common/CHANGELOG.md index 0c00f4e25e..d5f6a1b085 100644 --- a/lib/msal-common/CHANGELOG.md +++ b/lib/msal-common/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @azure/msal-common -This log was last generated on Thu, 15 Jun 2023 22:19:26 GMT and should not be manually modified. +This log was last generated on Thu, 06 Jul 2023 00:01:34 GMT and should not be manually modified. +## 14.0.0-beta.1 + +Thu, 06 Jul 2023 00:01:34 GMT + +### Changes + +- Make claims-based caching configurable #6163 (hemoral@microsoft.com) +- Fix performance bug with regional authority detection #6139 (joarroyo@microsoft.com) + ## 14.0.0-beta.0 Thu, 15 Jun 2023 22:19:26 GMT diff --git a/lib/msal-common/package.json b/lib/msal-common/package.json index a906d87ce3..a292505501 100644 --- a/lib/msal-common/package.json +++ b/lib/msal-common/package.json @@ -10,7 +10,7 @@ "type": "git", "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git" }, - "version": "14.0.0-beta.0", + "version": "14.0.0-beta.1", "description": "Microsoft Authentication Library for js", "keywords": [ "implicit", @@ -83,4 +83,4 @@ "typescript": "^4.9.5", "yargs": "^17.5.1" } -} \ No newline at end of file +} diff --git a/lib/msal-common/src/packageMetadata.ts b/lib/msal-common/src/packageMetadata.ts index 163879c633..ea45dd7109 100644 --- a/lib/msal-common/src/packageMetadata.ts +++ b/lib/msal-common/src/packageMetadata.ts @@ -1,4 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-common"; -export const version = "14.0.0-beta.0"; - +export const version = "14.0.0-beta.1"; diff --git a/lib/msal-node/CHANGELOG.json b/lib/msal-node/CHANGELOG.json index 6b027a9b11..ccf7727bc6 100644 --- a/lib/msal-node/CHANGELOG.json +++ b/lib/msal-node/CHANGELOG.json @@ -1,6 +1,47 @@ { "name": "@azure/msal-node", "entries": [ + { + "date": "Thu, 06 Jul 2023 00:01:33 GMT", + "tag": "@azure/msal-node_v2.0.0-beta.1", + "version": "2.0.0-beta.1", + "comments": { + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-node", + "commit": "f714b51f03eb87ccd0102d886c814b3dab2b5cc9", + "comment": "DevDependency updates" + } + ], + "prerelease": [ + { + "author": "joshua.head@envoryat.com", + "package": "@azure/msal-node", + "commit": "32df7b975cbfca687f6d5ddd620ca19a545f39d3", + "comment": "fix: msal-node now references the right index.esm.ja" + }, + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-node", + "commit": "5ecb611181d878b533ddb43f4774b064d63f8f3a", + "comment": "Export IdTokenClaims & ServerAuthorizationCodeResponse types" + }, + { + "author": "hemoral@microsoft.com", + "package": "@azure/msal-node", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c", + "comment": "Make claims-based caching configurable #6163" + }, + { + "author": "beachball", + "package": "@azure/msal-node", + "comment": "Bump @azure/msal-common to v14.0.0-beta.1", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c" + } + ] + } + }, { "date": "Thu, 15 Jun 2023 22:19:26 GMT", "tag": "@azure/msal-node_v2.0.0-beta.0", diff --git a/lib/msal-node/CHANGELOG.md b/lib/msal-node/CHANGELOG.md index 57f2e6582b..513eb47a20 100644 --- a/lib/msal-node/CHANGELOG.md +++ b/lib/msal-node/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @azure/msal-node -This log was last generated on Thu, 15 Jun 2023 22:19:26 GMT and should not be manually modified. +This log was last generated on Thu, 06 Jul 2023 00:01:33 GMT and should not be manually modified. +## 2.0.0-beta.1 + +Thu, 06 Jul 2023 00:01:33 GMT + +### Changes + +- fix: msal-node now references the right index.esm.ja (joshua.head@envoryat.com) +- Export IdTokenClaims & ServerAuthorizationCodeResponse types (thomas.norling@microsoft.com) +- Make claims-based caching configurable #6163 (hemoral@microsoft.com) +- Bump @azure/msal-common to v14.0.0-beta.1 + ## 2.0.0-beta.0 Thu, 15 Jun 2023 22:19:26 GMT diff --git a/lib/msal-node/package.json b/lib/msal-node/package.json index 230c964722..6607cfdf58 100644 --- a/lib/msal-node/package.json +++ b/lib/msal-node/package.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-node", - "version": "2.0.0-beta.0", + "version": "2.0.0-beta.1", "author": { "name": "Microsoft", "email": "nugetaad@microsoft.com", @@ -68,11 +68,11 @@ "yargs": "^17.3.1" }, "dependencies": { - "@azure/msal-common": "14.0.0-beta.0", + "@azure/msal-common": "14.0.0-beta.1", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, "engines": { "node": "18 || 20" } -} \ No newline at end of file +} diff --git a/lib/msal-node/src/packageMetadata.ts b/lib/msal-node/src/packageMetadata.ts index cc0f6fb7a9..79df913962 100644 --- a/lib/msal-node/src/packageMetadata.ts +++ b/lib/msal-node/src/packageMetadata.ts @@ -1,4 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-node"; -export const version = "2.0.0-beta.0"; - +export const version = "2.0.0-beta.1"; diff --git a/lib/msal-react/CHANGELOG.json b/lib/msal-react/CHANGELOG.json index 3ee2611c34..0da877946a 100644 --- a/lib/msal-react/CHANGELOG.json +++ b/lib/msal-react/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@azure/msal-react", "entries": [ + { + "date": "Thu, 06 Jul 2023 00:01:32 GMT", + "tag": "@azure/msal-react_v2.0.0-beta.1", + "version": "2.0.0-beta.1", + "comments": { + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-react", + "commit": "f714b51f03eb87ccd0102d886c814b3dab2b5cc9", + "comment": "DevDependency updates" + } + ], + "prerelease": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-react", + "commit": "faae9defff0424799bfa540fdb2c2f309b34db3a", + "comment": "Fix module field in package.json #6190" + }, + { + "author": "beachball", + "package": "@azure/msal-react", + "comment": "Bump @azure/msal-browser to v3.0.0-beta.1", + "commit": "4ccef1b8a11ca5643c11eb9586e45f8e45398e8c" + } + ] + } + }, { "date": "Thu, 15 Jun 2023 22:19:25 GMT", "tag": "@azure/msal-react_v2.0.0-beta.0", diff --git a/lib/msal-react/CHANGELOG.md b/lib/msal-react/CHANGELOG.md index 64a537e248..7808cb80fa 100644 --- a/lib/msal-react/CHANGELOG.md +++ b/lib/msal-react/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @azure/msal-react -This log was last generated on Thu, 15 Jun 2023 22:19:25 GMT and should not be manually modified. +This log was last generated on Thu, 06 Jul 2023 00:01:32 GMT and should not be manually modified. +## 2.0.0-beta.1 + +Thu, 06 Jul 2023 00:01:32 GMT + +### Changes + +- Fix module field in package.json #6190 (thomas.norling@microsoft.com) +- Bump @azure/msal-browser to v3.0.0-beta.1 + ## 2.0.0-beta.0 Thu, 15 Jun 2023 22:19:25 GMT diff --git a/lib/msal-react/package.json b/lib/msal-react/package.json index ba6fc7dde5..83ee6cc222 100644 --- a/lib/msal-react/package.json +++ b/lib/msal-react/package.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-react", - "version": "2.0.0-beta.0", + "version": "2.0.0-beta.1", "author": { "name": "Microsoft", "email": "nugetaad@microsoft.com", @@ -43,12 +43,12 @@ "format:fix": "npx prettier --ignore-path .gitignore --write src test" }, "peerDependencies": { - "@azure/msal-browser": "^3.0.0-beta.0", + "@azure/msal-browser": "^3.0.0-beta.1", "react": "^16.8.0 || ^17 || ^18" }, "module": "dist/index.js", "devDependencies": { - "@azure/msal-browser": "^3.0.0-beta.0", + "@azure/msal-browser": "^3.0.0-beta.1", "@testing-library/jest-dom": "^5.11.5", "@testing-library/react": "^13.4.0", "@types/jest": "^29.5.0", @@ -67,4 +67,4 @@ "@rollup/plugin-typescript": "^11.1.0", "rollup": "^3.20.2" } -} \ No newline at end of file +} diff --git a/lib/msal-react/src/packageMetadata.ts b/lib/msal-react/src/packageMetadata.ts index 6e412d894e..a8b10f677e 100644 --- a/lib/msal-react/src/packageMetadata.ts +++ b/lib/msal-react/src/packageMetadata.ts @@ -1,4 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-react"; -export const version = "2.0.0-beta.0"; - +export const version = "2.0.0-beta.1"; From fb446dc2cf3f598ca65ddb7f6392b2917b7d0092 Mon Sep 17 00:00:00 2001 From: Thomas Norling Date: Thu, 6 Jul 2023 08:55:08 -0700 Subject: [PATCH 7/8] July 2023 Post Release [beta.1] (#6211) Updates package-locks after beta.1 releases --- .../msal-node-extensions/package-lock.json | 12 ++++----- lib/msal-angular/package-lock.json | 25 ++++++++++--------- lib/msal-browser/package-lock.json | 20 +++++++++++++-- lib/msal-common/package-lock.json | 4 +-- lib/msal-node/package-lock.json | 12 ++++----- lib/msal-react/package-lock.json | 22 ++++++++-------- 6 files changed, 56 insertions(+), 39 deletions(-) diff --git a/extensions/msal-node-extensions/package-lock.json b/extensions/msal-node-extensions/package-lock.json index 708da4498d..03334ed611 100644 --- a/extensions/msal-node-extensions/package-lock.json +++ b/extensions/msal-node-extensions/package-lock.json @@ -1,15 +1,15 @@ { "name": "@azure/msal-node-extensions", - "version": "1.0.0-beta.0", + "version": "1.0.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@azure/msal-node-extensions", - "version": "1.0.0-beta.0", + "version": "1.0.0-beta.1", "license": "MIT", "dependencies": { - "@azure/msal-common": "14.0.0-beta.0", + "@azure/msal-common": "14.0.0-beta.1", "@azure/msal-node-runtime": "^0.13.6-alpha.0", "keytar": "^7.8.0" }, @@ -77,9 +77,9 @@ } }, "node_modules/@azure/msal-common": { - "version": "14.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.0.tgz", - "integrity": "sha512-ovzonM2gYXE3ORHDrd1fWQhV8YSifqEa2tGNHE4/oRfCXsDXZFKcoG4bH7ye2pNL32xBh6JUJG2pEwKYvOuRYA==", + "version": "14.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.1.tgz", + "integrity": "sha512-zU68eqVJOLh+CQlo8GF5EKYtzYPF/0fOVgXP3lrEa9YqFt4A9sI2Qd2VBaDaA4jGWwddSqquDp6NQbNdO3Wb5Q==", "engines": { "node": ">=0.8.0" } diff --git a/lib/msal-angular/package-lock.json b/lib/msal-angular/package-lock.json index dd949bb046..0dbc118285 100644 --- a/lib/msal-angular/package-lock.json +++ b/lib/msal-angular/package-lock.json @@ -1,12 +1,12 @@ { "name": "@azure/msal-angular", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@azure/msal-angular", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "license": "MIT", "devDependencies": { "@angular-devkit/build-angular": "^15.1.5", @@ -20,6 +20,7 @@ "@angular/platform-browser": "^15.1.4", "@angular/platform-browser-dynamic": "^15.1.4", "@angular/router": "^15.1.4", + "@azure/msal-browser": "^3.0.0-beta.1", "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", @@ -39,7 +40,7 @@ "zone.js": "~0.11.8" }, "peerDependencies": { - "@azure/msal-browser": "^3.0.0-beta.0", + "@azure/msal-browser": "^3.0.0-beta.1", "rxjs": "^7.0.0" } }, @@ -599,22 +600,22 @@ "dev": true }, "node_modules/@azure/msal-browser": { - "version": "3.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.0.0-beta.0.tgz", - "integrity": "sha512-QtfEuiDXZdePrhVZLge24WOaxmGuvTu1t/tFxGWpEQV4xfLz2ueSdh4lSbz1GbbdOOQ0KDbTghO6CGHC1X8HBg==", - "peer": true, + "version": "3.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.0.0-beta.1.tgz", + "integrity": "sha512-dgAGPQS6Ae/krVyTjJ6WPBZelGrkrq3mqesu2GGHGG9WMNsH/Eofy1wOfkc2XQ1F/wY7q7Za+BpzBFfYhdGUrg==", + "dev": true, "dependencies": { - "@azure/msal-common": "14.0.0-beta.0" + "@azure/msal-common": "14.0.0-beta.1" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.0.tgz", - "integrity": "sha512-ovzonM2gYXE3ORHDrd1fWQhV8YSifqEa2tGNHE4/oRfCXsDXZFKcoG4bH7ye2pNL32xBh6JUJG2pEwKYvOuRYA==", - "peer": true, + "version": "14.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.1.tgz", + "integrity": "sha512-zU68eqVJOLh+CQlo8GF5EKYtzYPF/0fOVgXP3lrEa9YqFt4A9sI2Qd2VBaDaA4jGWwddSqquDp6NQbNdO3Wb5Q==", + "dev": true, "engines": { "node": ">=0.8.0" } diff --git a/lib/msal-browser/package-lock.json b/lib/msal-browser/package-lock.json index c88134c4ac..4f2c30d700 100644 --- a/lib/msal-browser/package-lock.json +++ b/lib/msal-browser/package-lock.json @@ -1,13 +1,16 @@ { "name": "@azure/msal-browser", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@azure/msal-browser", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "license": "MIT", + "dependencies": { + "@azure/msal-common": "14.0.0-beta.1" + }, "devDependencies": { "@azure/storage-blob": "^12.2.1", "@babel/core": "^7.7.2", @@ -214,6 +217,14 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, + "node_modules/@azure/msal-common": { + "version": "14.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.1.tgz", + "integrity": "sha512-zU68eqVJOLh+CQlo8GF5EKYtzYPF/0fOVgXP3lrEa9YqFt4A9sI2Qd2VBaDaA4jGWwddSqquDp6NQbNdO3Wb5Q==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@azure/storage-blob": { "version": "12.14.0", "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", @@ -8196,6 +8207,11 @@ } } }, + "@azure/msal-common": { + "version": "14.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.1.tgz", + "integrity": "sha512-zU68eqVJOLh+CQlo8GF5EKYtzYPF/0fOVgXP3lrEa9YqFt4A9sI2Qd2VBaDaA4jGWwddSqquDp6NQbNdO3Wb5Q==" + }, "@azure/storage-blob": { "version": "12.14.0", "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", diff --git a/lib/msal-common/package-lock.json b/lib/msal-common/package-lock.json index cec356d3c0..0676db2ca4 100644 --- a/lib/msal-common/package-lock.json +++ b/lib/msal-common/package-lock.json @@ -1,12 +1,12 @@ { "name": "@azure/msal-common", - "version": "14.0.0-beta.0", + "version": "14.0.0-beta.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@azure/msal-common", - "version": "14.0.0-beta.0", + "version": "14.0.0-beta.1", "license": "MIT", "devDependencies": { "@babel/core": "^7.7.2", diff --git a/lib/msal-node/package-lock.json b/lib/msal-node/package-lock.json index 599a5c5b45..ffd9ea6728 100644 --- a/lib/msal-node/package-lock.json +++ b/lib/msal-node/package-lock.json @@ -1,15 +1,15 @@ { "name": "@azure/msal-node", - "version": "2.0.0-beta.0", + "version": "2.0.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@azure/msal-node", - "version": "2.0.0-beta.0", + "version": "2.0.0-beta.1", "license": "MIT", "dependencies": { - "@azure/msal-common": "14.0.0-beta.0", + "@azure/msal-common": "14.0.0-beta.1", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -48,9 +48,9 @@ } }, "node_modules/@azure/msal-common": { - "version": "14.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.0.tgz", - "integrity": "sha512-ovzonM2gYXE3ORHDrd1fWQhV8YSifqEa2tGNHE4/oRfCXsDXZFKcoG4bH7ye2pNL32xBh6JUJG2pEwKYvOuRYA==", + "version": "14.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.1.tgz", + "integrity": "sha512-zU68eqVJOLh+CQlo8GF5EKYtzYPF/0fOVgXP3lrEa9YqFt4A9sI2Qd2VBaDaA4jGWwddSqquDp6NQbNdO3Wb5Q==", "engines": { "node": ">=0.8.0" } diff --git a/lib/msal-react/package-lock.json b/lib/msal-react/package-lock.json index fd3e63ad0c..9e9c16deb0 100644 --- a/lib/msal-react/package-lock.json +++ b/lib/msal-react/package-lock.json @@ -1,19 +1,19 @@ { "name": "@azure/msal-react", - "version": "2.0.0-beta.0", + "version": "2.0.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@azure/msal-react", - "version": "2.0.0-beta.0", + "version": "2.0.0-beta.1", "license": "MIT", "dependencies": { "@rollup/plugin-typescript": "^11.1.0", "rollup": "^3.20.2" }, "devDependencies": { - "@azure/msal-browser": "^3.0.0-beta.0", + "@azure/msal-browser": "^3.0.0-beta.1", "@testing-library/jest-dom": "^5.11.5", "@testing-library/react": "^13.4.0", "@types/jest": "^29.5.0", @@ -32,7 +32,7 @@ "node": ">=10" }, "peerDependencies": { - "@azure/msal-browser": "^3.0.0-beta.0", + "@azure/msal-browser": "^3.0.0-beta.1", "react": "^16.8.0 || ^17 || ^18" } }, @@ -56,21 +56,21 @@ } }, "node_modules/@azure/msal-browser": { - "version": "3.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.0.0-beta.0.tgz", - "integrity": "sha512-QtfEuiDXZdePrhVZLge24WOaxmGuvTu1t/tFxGWpEQV4xfLz2ueSdh4lSbz1GbbdOOQ0KDbTghO6CGHC1X8HBg==", + "version": "3.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.0.0-beta.1.tgz", + "integrity": "sha512-dgAGPQS6Ae/krVyTjJ6WPBZelGrkrq3mqesu2GGHGG9WMNsH/Eofy1wOfkc2XQ1F/wY7q7Za+BpzBFfYhdGUrg==", "dev": true, "dependencies": { - "@azure/msal-common": "14.0.0-beta.0" + "@azure/msal-common": "14.0.0-beta.1" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.0.tgz", - "integrity": "sha512-ovzonM2gYXE3ORHDrd1fWQhV8YSifqEa2tGNHE4/oRfCXsDXZFKcoG4bH7ye2pNL32xBh6JUJG2pEwKYvOuRYA==", + "version": "14.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.0.0-beta.1.tgz", + "integrity": "sha512-zU68eqVJOLh+CQlo8GF5EKYtzYPF/0fOVgXP3lrEa9YqFt4A9sI2Qd2VBaDaA4jGWwddSqquDp6NQbNdO3Wb5Q==", "dev": true, "engines": { "node": ">=0.8.0" From ee596e8d2f3b3b5f6e97a9700e9bc3d3bba2e827 Mon Sep 17 00:00:00 2001 From: "microsoft-github-policy-service[bot]" <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Date: Fri, 7 Jul 2023 13:47:26 -0700 Subject: [PATCH 8/8] FabricBot: Onboarding to GitOps.ResourceManagement because of FabricBot decommissioning (#6221) Add prIssueManagement.yml to onboard repo to GitOps.ResourceManagement as FabricBot replacement Owners of the FabricBot configuration should have received email notification. The same information contained in the email is published internally at: https://aka.ms/gim/fabricbot. Details on the replacement service and the syntax of the new yaml configuration file is available publicly at: https://microsoft.github.io/GitOps/policies/resource-management.html Please review and merge this PR to complete the process of onboarding to the new service. --------- Co-authored-by: microsoft-github-policy-service[bot] <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> --- .github/fabricbot.json | 1346 ----------------------- .github/policies/resourceManagement.yml | 232 ++++ 2 files changed, 232 insertions(+), 1346 deletions(-) delete mode 100644 .github/fabricbot.json create mode 100644 .github/policies/resourceManagement.yml diff --git a/.github/fabricbot.json b/.github/fabricbot.json deleted file mode 100644 index 8ccbcab8a3..0000000000 --- a/.github/fabricbot.json +++ /dev/null @@ -1,1346 +0,0 @@ -{ - "version": "1.0", - "tasks": [ - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssueCommentResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "activitySenderHasAssociation", - "parameters": { - "permissions": "write", - "association": "MEMBER" - } - }, - { - "name": "hasLabel", - "parameters": { - "label": "question" - } - }, - { - "operator": "not", - "operands": [ - { - "name": "isActivitySender", - "parameters": { - "user": { - "type": "author" - } - } - } - ] - }, - { - "operator": "not", - "operands": [ - { - "name": "isCloseAndComment", - "parameters": {} - } - ] - }, - { - "name": "isOpen", - "parameters": {} - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issue_comment" - ], - "taskName": "Add Needs: Author Feedback and answered labels when AzureAD member comments on issue", - "actions": [ - { - "name": "addLabel", - "parameters": { - "label": "answered" - } - }, - { - "name": "addLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ] - }, - "disabled": false - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssueCommentResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "isAction", - "parameters": { - "action": "created" - } - }, - { - "name": "isActivitySender", - "parameters": { - "user": { - "type": "author" - }, - "association": "MEMBER" - } - }, - { - "name": "hasLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - }, - { - "operator": "not", - "operands": [ - { - "name": "isCloseAndComment", - "parameters": {} - } - ] - }, - { - "name": "isOpen", - "parameters": {} - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issue_comment" - ], - "taskName": "Add Needs: Attention label when author comments on issue", - "actions": [ - { - "name": "addLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "no-issue-activity" - } - } - ] - }, - "disabled": false - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssuesOnlyResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "or", - "operands": [ - { - "name": "labelAdded", - "parameters": { - "label": "bug" - } - }, - { - "name": "labelAdded", - "parameters": { - "label": "p1" - } - }, - { - "name": "labelAdded", - "parameters": { - "label": "p2" - } - }, - { - "name": "labelAdded", - "parameters": { - "label": "enhancement" - } - }, - { - "name": "labelAdded", - "parameters": { - "label": "feature" - } - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issues", - "project_card" - ], - "actions": [ - { - "name": "removeLabel", - "parameters": { - "label": "bug-unconfirmed" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "question" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "answered" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "no-issue-activity" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "feature-unconfirmed" - } - } - ], - "taskName": "Remove extraneous labels when bug, p1, p2, enhancement or feature labels added" - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssuesOnlyResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "isAction", - "parameters": { - "action": "closed" - } - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issues", - "project_card" - ], - "taskName": "Remove status labels when issue is closed", - "actions": [ - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "ReleaseAnnouncement", - "subCapability": "ReleaseAnnouncement", - "version": "1.0", - "config": { - "taskName": "Announce a fix has been released", - "prReply": ":tada:`@azure/${pkgName}@${version}` has been released which incorporates this pull request.:tada:\n\nHandy links:\n* [Release Notes](https://github.com/${owner}/${repo}/releases/tag/${pkgName}-${version})\n* [Official NPM Release](https://www.npmjs.com/package/@azure/${pkgName}/v/${versionNumber})", - "conditionalPrReplies": [ - { - "reply": ":tada:`${pkgName}@${version}` has been released which incorporates this pull request.:tada:\n\nHandy links:\n* [Release Notes](https://github.com/${owner}/${repo}/releases/tag/${pkgName}-${version})\n* [Official NPM Release](https://www.npmjs.com/package/${pkgName}/v/${versionNumber})", - "condition": { - "placeholder": "${pkgName}", - "operator": "equals", - "value": "msal" - } - }, - { - "reply": ":tada:`@azure/${pkgName}@${version}` has been released which incorporates this pull request.:tada:\n\nWe recommend upgrading to the latest version of `@azure/msal-browser` or `@azure/msal-node` to take advantage of this change.\n\nHandy links:\n* [Release Notes](https://github.com/${owner}/${repo}/releases/tag/${pkgName}-${version})\n* [Official NPM Release](https://www.npmjs.com/package/@azure/${pkgName}/v/${versionNumber})", - "condition": { - "placeholder": "${pkgName}", - "operator": "equals", - "value": "msal-common" - } - } - ], - "issueReply": ":tada:This issue was addressed in #${prNumber}, which has now been successfully released as `@azure/${pkgName}@${version}`.:tada:\n\nHandy links:\n* [Release Notes](https://github.com/${owner}/${repo}/releases/tag/${pkgName}-${version})\n* [Official NPM Release](https://www.npmjs.com/package/@azure/${pkgName}/v/${versionNumber})", - "conditionalIssueReplies": [ - { - "reply": ":tada:This issue was addressed in #${prNumber}, which has now been successfully released as `${pkgName}@${version}`.:tada:\n\nHandy links:\n* [Release Notes](https://github.com/${owner}/${repo}/releases/tag/${pkgName}-${version})\n* [Official NPM Release](https://www.npmjs.com/package/${pkgName}/v/${versionNumber})", - "condition": { - "placeholder": "${pkgName}", - "operator": "equals", - "value": "msal" - } - }, - { - "condition": { - "placeholder": "${pkgName}", - "operator": "equals", - "value": "msal-common" - }, - "reply": ":tada:This issue was addressed in #${prNumber}, which has now been successfully released as `@azure/${pkgName}@${version}`.:tada:\n\nWe recommend upgrading to the latest version of `@azure/msal-browser` or `@azure/msal-node` to take advantage of this change.\n\nHandy links:\n* [Release Notes](https://github.com/${owner}/${repo}/releases/tag/${pkgName}-${version})\n* [Official NPM Release](https://www.npmjs.com/package/@azure/${pkgName}/v/${versionNumber})" - } - ], - "referencedPrsRegex": "#(\\d+)", - "referencedPrsGroup": 1, - "packageRegex": "(@azure\\/)?(.+)\\s(v.*)", - "packageNameGroup": 2, - "packageVersionGroup": 3 - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssueCommentResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "operator": "not", - "operands": [ - { - "name": "isOpen", - "parameters": {} - } - ] - }, - { - "name": "isActivitySender", - "parameters": { - "user": { - "type": "author" - } - } - }, - { - "name": "hasLabel", - "parameters": { - "label": "no-issue-activity" - } - }, - { - "operator": "not", - "operands": [ - { - "name": "isCloseAndComment", - "parameters": {} - } - ] - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issue_comment" - ], - "actions": [ - { - "name": "reopenIssue", - "parameters": {} - }, - { - "name": "addLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "no-issue-activity" - } - }, - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - } - ], - "taskName": "Reopen issue if the issue was closed due to inactivity and original author comments" - } - }, - { - "taskType": "scheduled", - "capabilityId": "ScheduledSearch", - "subCapability": "ScheduledSearch", - "version": "1.1", - "config": { - "frequency": [ - { - "weekDay": 0, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 1, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 2, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 3, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 4, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 5, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 6, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - } - ], - "searchTerms": [ - { - "name": "isOpen", - "parameters": {} - }, - { - "name": "hasLabel", - "parameters": { - "label": "question" - } - }, - { - "name": "hasLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - }, - { - "name": "noActivitySince", - "parameters": { - "days": 5 - } - }, - { - "name": "isIssue", - "parameters": {} - }, - { - "name": "noLabel", - "parameters": { - "label": "no-issue-activity" - } - } - ], - "taskName": "Mark questions stale after 5 days of inactivity by the author", - "actions": [ - { - "name": "addReply", - "parameters": { - "comment": "@${issueAuthor} This issue has been automatically marked as stale because it is marked as requiring author feedback but has not had any activity for **5 days**. If your issue has been resolved please let us know by closing the issue. If your issue has **not** been resolved please leave a comment to keep this open. It will be closed automatically in **7 days** if it remains stale." - } - }, - { - "name": "addLabel", - "parameters": { - "label": "no-issue-activity" - } - } - ] - } - }, - { - "taskType": "scheduled", - "capabilityId": "ScheduledSearch", - "subCapability": "ScheduledSearch", - "version": "1.1", - "config": { - "frequency": [ - { - "weekDay": 0, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 1, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 2, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 3, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 4, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 5, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 6, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - } - ], - "searchTerms": [ - { - "name": "isOpen", - "parameters": {} - }, - { - "name": "hasLabel", - "parameters": { - "label": "no-issue-activity" - } - }, - { - "name": "noActivitySince", - "parameters": { - "days": 7 - } - }, - { - "name": "isIssue", - "parameters": {} - } - ], - "taskName": "Close stale issues after 7 days", - "actions": [ - { - "name": "closeIssue", - "parameters": {} - } - ] - } - }, - { - "taskType": "scheduled", - "capabilityId": "ScheduledSearch", - "subCapability": "ScheduledSearch", - "version": "1.1", - "config": { - "frequency": [ - { - "weekDay": 0, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 1, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 2, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 3, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 4, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 5, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - }, - { - "weekDay": 6, - "hours": [ - 6, - 18 - ], - "timezoneOffset": -7 - } - ], - "searchTerms": [ - { - "name": "isOpen", - "parameters": {} - }, - { - "name": "isIssue", - "parameters": {} - }, - { - "name": "hasLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - }, - { - "name": "noActivitySince", - "parameters": { - "days": 5 - } - } - ], - "taskName": "Remind MSAL.js team to respond to issues after 5 days of inactivity", - "actions": [ - { - "name": "addReply", - "parameters": { - "comment": "This issue requires attention from the MSAL.js team and has not seen activity in **5 days**. ${assignees} please follow up." - } - } - ] - } - }, - { - "taskType": "scheduled", - "capabilityId": "ScheduledSearch", - "subCapability": "ScheduledSearch", - "version": "1.1", - "config": { - "frequency": [ - { - "weekDay": 0, - "hours": [], - "timezoneOffset": -8 - }, - { - "weekDay": 1, - "hours": [], - "timezoneOffset": -8 - }, - { - "weekDay": 2, - "hours": [], - "timezoneOffset": -8 - }, - { - "weekDay": 3, - "hours": [], - "timezoneOffset": -8 - }, - { - "weekDay": 4, - "hours": [], - "timezoneOffset": -8 - }, - { - "weekDay": 5, - "hours": [], - "timezoneOffset": -8 - }, - { - "weekDay": 6, - "hours": [], - "timezoneOffset": -8 - } - ], - "searchTerms": [ - { - "name": "isClosed", - "parameters": {} - }, - { - "name": "noActivitySince", - "parameters": { - "days": 7 - } - }, - { - "name": "isIssue", - "parameters": {} - } - ], - "taskName": "Lock closed issues after 7 days of inactivity", - "actions": [ - { - "name": "lockIssue", - "parameters": { - "reason": "resolved" - } - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssuesOnlyResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "isOpen", - "parameters": {} - }, - { - "name": "labelAdded", - "parameters": { - "label": "Needs: Author Feedback" - } - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issues", - "project_card" - ], - "taskName": "Removes Needs: Attention Label when Needs: Author Feedback is added", - "actions": [ - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssuesOnlyResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "isOpen", - "parameters": {} - }, - { - "name": "labelAdded", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issues", - "project_card" - ], - "taskName": "Removes Needs: Author Feedback label when Needs: Attention is added", - "actions": [ - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Author Feedback" - } - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "PullRequestResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "isAction", - "parameters": { - "action": "opened" - } - }, - { - "name": "isActivitySender", - "parameters": { - "user": "dependabot[bot]" - } - } - ] - }, - "eventType": "pull_request", - "eventNames": [ - "pull_request", - "issues", - "project_card" - ], - "taskName": "Auto approve dependabot PRs", - "actions": [ - { - "name": "approvePullRequest" - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssuesOnlyResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "hasLabel", - "parameters": { - "label": "question" - } - }, - { - "name": "isAction", - "parameters": { - "action": "opened" - } - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issues", - "project_card" - ], - "taskName": "On question issue open add Needs: Attention label", - "actions": [ - { - "name": "addLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "PullRequestResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "isAction", - "parameters": { - "action": "opened" - } - }, - { - "operator": "not", - "operands": [ - { - "name": "activitySenderHasAssociation", - "parameters": { - "association": "MEMBER" - } - } - ] - }, - { - "operator": "not", - "operands": [ - { - "name": "isActivitySender", - "parameters": { - "user": "github-actions[bot]" - } - } - ] - } - ] - }, - "eventType": "pull_request", - "eventNames": [ - "pull_request", - "issues", - "project_card" - ], - "actions": [ - { - "name": "assignToIcmUserGroup", - "parameters": { - "groupId": "60ddfa574ab5702958084812", - "assignmentTarget": "Primary" - } - }, - { - "name": "assignToIcmUserGroup", - "parameters": { - "groupId": "60ddfa574ab5702958084812", - "assignmentTarget": "FirstBackup" - } - } - ], - "taskName": "Assign on-call engineers to PRs opened by external contributors" - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "PullRequestResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "isAction", - "parameters": { - "action": "opened" - } - }, - { - "operator": "not", - "operands": [ - { - "name": "activitySenderHasAssociation", - "parameters": { - "association": "MEMBER" - } - } - ] - }, - { - "operator": "not", - "operands": [ - { - "name": "prIncludesModifiedFile", - "parameters": { - "pathFilter": "change/" - } - } - ] - }, - { - "name": "prTargetsBranch", - "parameters": { - "branchName": "dev" - } - }, - { - "operator": "or", - "operands": [ - { - "name": "prMatchesPattern", - "parameters": { - "matchRegex": "lib\\/.*\\/src\\/" - } - }, - { - "name": "prMatchesPattern", - "parameters": { - "matchRegex": "extensions\\/.*\\/src\\/" - } - } - ] - } - ] - }, - "eventType": "pull_request", - "eventNames": [ - "pull_request", - "issues", - "project_card" - ], - "actions": [ - { - "name": "addReply", - "parameters": { - "comment": "Thank you for your contribution! Please generate change files by running `npm run beachball:change` from the root of the repo, then answer each prompt and push up the generated files." - } - } - ], - "taskName": "Prompt external contributors to generate changefiles if not yet included in the PR" - }, - "disabled": false - }, - { - "taskType": "scheduled", - "capabilityId": "ScheduledSearch", - "subCapability": "ScheduledSearch", - "version": "1.1", - "config": { - "frequency": [ - { - "weekDay": 1, - "hours": [ - 8 - ], - "timezoneOffset": -7, - "restrictions": [ - { - "name": "isLastInMonth", - "parameters": {} - } - ] - } - ], - "searchTerms": [ - { - "name": "isOpen", - "parameters": {} - }, - { - "name": "isDraftPr", - "parameters": { - "value": "false" - } - }, - { - "name": "isPr", - "parameters": {} - }, - { - "name": "noActivitySince", - "parameters": { - "days": 7 - } - }, - { - "name": "noLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ], - "actions": [ - { - "name": "addReply", - "parameters": { - "comment": "Reminder: The next release is scheduled for next week and this PR appears to be stale :( \n\nIf changes have been requested please address feedback. \nIf this PR is still a work in progress please mark as draft." - } - }, - { - "name": "addLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ], - "taskName": "Post reminder message on stale PRs" - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "PullRequestResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "hasLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - }, - { - "operator": "or", - "operands": [ - { - "name": "isAction", - "parameters": { - "action": "merged" - } - }, - { - "name": "isAction", - "parameters": { - "action": "synchronize" - } - }, - { - "name": "isAction", - "parameters": { - "action": "closed" - } - } - ] - } - ] - }, - "eventType": "pull_request", - "eventNames": [ - "pull_request", - "issues", - "project_card" - ], - "actions": [ - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ], - "taskName": "Remove Needs: Attention label when PR is no longer stale" - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "PullRequestReviewResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "name": "hasLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ] - }, - "eventType": "pull_request", - "eventNames": [ - "pull_request_review" - ], - "taskName": "Remove Needs: Attention label on Pull Request review", - "actions": [ - { - "name": "removeLabel", - "parameters": { - "label": "Needs: Attention :wave:" - } - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssuesOnlyResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "operator": "not", - "operands": [ - { - "name": "isAssignedToSomeone", - "parameters": {} - } - ] - }, - { - "name": "isAction", - "parameters": { - "action": "labeled" - } - }, - { - "name": "hasLabel", - "parameters": { - "label": "public-client" - } - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issues", - "project_card" - ], - "taskName": "Assign public client issues to MSAL.js on-call", - "actions": [ - { - "name": "assignToIcmUserGroup", - "parameters": { - "groupId": "60ddfa574ab5702958084812", - "assignmentTarget": "Primary" - } - } - ] - } - }, - { - "taskType": "trigger", - "capabilityId": "IssueResponder", - "subCapability": "IssuesOnlyResponder", - "version": "1.0", - "config": { - "conditions": { - "operator": "and", - "operands": [ - { - "operator": "not", - "operands": [ - { - "name": "isAssignedToSomeone", - "parameters": {} - } - ] - }, - { - "name": "isAction", - "parameters": { - "action": "labeled" - } - }, - { - "name": "hasLabel", - "parameters": { - "label": "confidential-client" - } - } - ] - }, - "eventType": "issue", - "eventNames": [ - "issues", - "project_card" - ], - "taskName": "Assign confidential client issues", - "actions": [ - { - "name": "assignToIcmUserGroup", - "parameters": { - "groupId": "60ddfa574ab5702958084812", - "assignmentTarget": "Primary" - } - } - ] - } - } - ], - "userGroups": [ - { - "_id": "60ddfa574ab5702958084812", - "groupType": "ICM", - "name": "MSAL.js Team", - "onCallTeamId": 80279 - } - ] -} diff --git a/.github/policies/resourceManagement.yml b/.github/policies/resourceManagement.yml new file mode 100644 index 0000000000..73d59aa448 --- /dev/null +++ b/.github/policies/resourceManagement.yml @@ -0,0 +1,232 @@ +id: +name: GitOps.PullRequestIssueManagement +description: GitOps.PullRequestIssueManagement primitive +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + scheduledSearches: + - description: + frequencies: + - hourly: + hour: 12 + filters: + - isOpen + - hasLabel: + label: question + - hasLabel: + label: 'Needs: Author Feedback' + - noActivitySince: + days: 5 + - isIssue + - isNotLabeledWith: + label: no-issue-activity + actions: + - addReply: + reply: '@${issueAuthor} This issue has been automatically marked as stale because it is marked as requiring author feedback but has not had any activity for **5 days**. If your issue has been resolved please let us know by closing the issue. If your issue has **not** been resolved please leave a comment to keep this open. It will be closed automatically in **7 days** if it remains stale.' + - addLabel: + label: no-issue-activity + - description: + frequencies: + - hourly: + hour: 12 + filters: + - isOpen + - hasLabel: + label: no-issue-activity + - noActivitySince: + days: 7 + - isIssue + actions: + - closeIssue + - description: + frequencies: + - hourly: + hour: 12 + filters: + - isOpen + - isIssue + - hasLabel: + label: 'Needs: Attention :wave:' + - noActivitySince: + days: 5 + actions: + - addReply: + reply: This issue requires attention from the MSAL.js team and has not seen activity in **5 days**. ${assignees} please follow up. + - description: + frequencies: + - weekday: + day: Monday + time: 8:0 + filters: + - isOpen + - isNotDraftPullRequest + - isPullRequest + - noActivitySince: + days: 7 + - isNotLabeledWith: + label: 'Needs: Attention :wave:' + actions: + - addReply: + reply: >- + Reminder: The next release is scheduled for next week and this PR appears to be stale :( + + + If changes have been requested please address feedback. + + If this PR is still a work in progress please mark as draft. + - addLabel: + label: 'Needs: Attention :wave:' + eventResponderTasks: + - if: + - payloadType: Issues + - or: + - labelAdded: + label: bug + - labelAdded: + label: p1 + - labelAdded: + label: p2 + - labelAdded: + label: enhancement + - labelAdded: + label: feature + then: + - removeLabel: + label: bug-unconfirmed + - removeLabel: + label: question + - removeLabel: + label: answered + - removeLabel: + label: no-issue-activity + - removeLabel: + label: 'Needs: Attention :wave:' + - removeLabel: + label: 'Needs: Author Feedback' + - removeLabel: + label: feature-unconfirmed + description: + - if: + - payloadType: Issues + - isAction: + action: Closed + then: + - removeLabel: + label: 'Needs: Attention :wave:' + - removeLabel: + label: 'Needs: Author Feedback' + description: + - if: + - payloadType: Issues + - isOpen + - labelAdded: + label: 'Needs: Author Feedback' + then: + - removeLabel: + label: 'Needs: Attention :wave:' + description: + - if: + - payloadType: Issues + - isOpen + - labelAdded: + label: 'Needs: Attention :wave:' + then: + - removeLabel: + label: 'Needs: Author Feedback' + description: + - if: + - payloadType: Pull_Request + - isAction: + action: Opened + - isActivitySender: + user: dependabot[bot] + issueAuthor: False + then: + - approvePullRequest: + comment: '' + description: + - if: + - payloadType: Issues + - hasLabel: + label: question + - isAction: + action: Opened + then: + - addLabel: + label: 'Needs: Attention :wave:' + description: + - if: + - payloadType: Pull_Request + - isAction: + action: Opened + - not: + activitySenderHasAssociation: + association: Member + - not: + isActivitySender: + user: github-actions[bot] + issueAuthor: False + then: + - assignIcmUsers: + teamId: 80279 + primary: True + secondary: False + - assignIcmUsers: + teamId: 80279 + primary: False + secondary: True + description: + - if: + - payloadType: Pull_Request + - hasLabel: + label: 'Needs: Attention :wave:' + - or: + - isAction: + action: Null + - isAction: + action: Synchronize + - isAction: + action: Closed + then: + - removeLabel: + label: 'Needs: Attention :wave:' + description: + - if: + - payloadType: Pull_Request_Review + - hasLabel: + label: 'Needs: Attention :wave:' + then: + - removeLabel: + label: 'Needs: Attention :wave:' + description: + - if: + - payloadType: Issues + - not: isAssignedToSomeone + - isAction: + action: Labeled + - hasLabel: + label: public-client + then: + - assignIcmUsers: + teamId: 80279 + primary: True + secondary: False + description: + - if: + - payloadType: Issues + - not: isAssignedToSomeone + - isAction: + action: Labeled + - hasLabel: + label: confidential-client + then: + - assignIcmUsers: + teamId: 80279 + primary: True + secondary: False + description: +onFailure: +onSuccess: