Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@aws-cdk/aws-cognito

Package Overview
Dependencies
Maintainers
5
Versions
288
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@aws-cdk/aws-cognito - npm Package Compare versions

Comparing version 1.31.0 to 1.32.0

test/integ.user-pool-client-explcit-props.d.ts

170

lib/user-pool-client.d.ts

@@ -1,31 +0,130 @@

import { Construct, Resource } from '@aws-cdk/core';
import { Construct, IResource, Resource } from '@aws-cdk/core';
import { IUserPool } from './user-pool';
/**
* Types of authentication flow
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html
*/
export declare enum AuthFlow {
export interface AuthFlow {
/**
* Enable flow for server-side or admin authentication (no client app)
* Enable admin based user password authentication flow
* @default false
*/
ADMIN_NO_SRP = "ADMIN_NO_SRP_AUTH",
readonly adminUserPassword?: boolean;
/**
* Enable custom authentication flow
* @default false
*/
CUSTOM_FLOW_ONLY = "CUSTOM_AUTH_FLOW_ONLY",
readonly custom?: boolean;
/**
* Enable auth using username & password
* @default false
*/
USER_PASSWORD = "USER_PASSWORD_AUTH"
readonly userPassword?: boolean;
/**
* Enable SRP based authentication
* @default false
*/
readonly userSrp?: boolean;
/**
* Enable authflow to refresh tokens
* @default false
*/
readonly refreshToken?: boolean;
}
export interface UserPoolClientProps {
/**
* OAuth settings to configure the interaction between the app and this client.
*/
export interface OAuthSettings {
/**
* OAuth flows that are allowed with this client.
* @see - the 'Allowed OAuth Flows' section at https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html
* @default - all OAuth flows disabled
*/
readonly flows: OAuthFlows;
/**
* List of allowed redirect URLs for the identity providers.
* @default - no callback URLs
*/
readonly callbackUrls?: string[];
/**
* OAuth scopes that are allowed with this client.
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html
* @default - no OAuth scopes are configured.
*/
readonly scopes: OAuthScope[];
}
/**
* Types of OAuth grant flows
* @see - the 'Allowed OAuth Flows' section at https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html
*/
export interface OAuthFlows {
/**
* Initiate an authorization code grant flow, which provides an authorization code as the response.
* @default false
*/
readonly authorizationCodeGrant?: boolean;
/**
* The client should get the access token and ID token directly.
* @default false
*/
readonly implicitCodeGrant?: boolean;
/**
* Client should get the access token and ID token from the token endpoint
* using a combination of client and client_secret.
* @default false
*/
readonly clientCredentials?: boolean;
}
/**
* OAuth scopes that are allowed with this client.
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html
*/
export declare class OAuthScope {
/**
* Grants access to the 'phone_number' and 'phone_number_verified' claims.
* Automatically includes access to `OAuthScope.OPENID`.
*/
static readonly PHONE: OAuthScope;
/**
* Grants access to the 'email' and 'email_verified' claims.
* Automatically includes access to `OAuthScope.OPENID`.
*/
static readonly EMAIL: OAuthScope;
/**
* Returns all user attributes in the ID token that are readable by the client
*/
static readonly OPENID: OAuthScope;
/**
* Grants access to all user attributes that are readable by the client
* Automatically includes access to `OAuthScope.OPENID`.
*/
static readonly PROFILE: OAuthScope;
/**
* Grants access to Amazon Cognito User Pool API operations that require access tokens,
* such as UpdateUserAttributes and VerifyUserAttribute.
*/
static readonly COGNITO_ADMIN: OAuthScope;
/**
* Custom scope is one that you define for your own resource server in the Resource Servers.
* The format is 'resource-server-identifier/scope'.
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html
*/
static custom(name: string): OAuthScope;
/**
* The name of this scope as recognized by CloudFormation.
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-allowedoauthscopes
*/
readonly scopeName: string;
private constructor();
}
/**
* Properties for the UserPoolClient construct
*/
export interface UserPoolClientOptions {
/**
* Name of the application client
* @default cloudformation generated name
* @default - cloudformation generated name
*/
readonly userPoolClientName?: string;
/**
* The UserPool resource this client will have access to
*/
readonly userPool: IUserPool;
/**
* Whether to generate a client secret

@@ -36,24 +135,51 @@ * @default false

/**
* List of enabled authentication flows
* @default no enabled flows
* The set of OAuth authentication flows to enable on the client
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html
* @default - all auth flows disabled
*/
readonly enabledAuthFlows?: AuthFlow[];
readonly authFlows?: AuthFlow;
/**
* OAuth settings for this to client to interact with the app.
* @default - see defaults in `OAuthSettings`
*/
readonly oAuth?: OAuthSettings;
}
/**
* Define a UserPool App Client
* Properties for the UserPoolClient construct
*/
export declare class UserPoolClient extends Resource {
export interface UserPoolClientProps extends UserPoolClientOptions {
/**
* The UserPool resource this client will have access to
*/
readonly userPool: IUserPool;
}
/**
* Represents a Cognito user pool client.
*/
export interface IUserPoolClient extends IResource {
/**
* Name of the application client
* @attribute
*/
readonly userPoolClientId: string;
}
/**
* Define a UserPool App Client
*/
export declare class UserPoolClient extends Resource implements IUserPoolClient {
/**
* @attribute
* Import a user pool client given its id.
*/
readonly userPoolClientName: string;
static fromUserPoolClientId(scope: Construct, id: string, userPoolClientId: string): IUserPoolClient;
readonly userPoolClientId: string;
private readonly _userPoolClientName?;
constructor(scope: Construct, id: string, props: UserPoolClientProps);
/**
* @attribute
* The client name that was specified via the `userPoolClientName` property during initialization,
* throws an error otherwise.
*/
readonly userPoolClientClientSecret: string;
constructor(scope: Construct, id: string, props: UserPoolClientProps);
get userPoolClientName(): string;
private configureAuthFlows;
private configureOAuthFlows;
private configureOAuthScopes;
}

@@ -6,39 +6,152 @@ "use strict";

/**
* Types of authentication flow
* OAuth scopes that are allowed with this client.
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html
*/
var AuthFlow;
(function (AuthFlow) {
class OAuthScope {
constructor(scopeName) {
this.scopeName = scopeName;
}
/**
* Enable flow for server-side or admin authentication (no client app)
* Custom scope is one that you define for your own resource server in the Resource Servers.
* The format is 'resource-server-identifier/scope'.
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html
*/
AuthFlow["ADMIN_NO_SRP"] = "ADMIN_NO_SRP_AUTH";
/**
* Enable custom authentication flow
*/
AuthFlow["CUSTOM_FLOW_ONLY"] = "CUSTOM_AUTH_FLOW_ONLY";
/**
* Enable auth using username & password
*/
AuthFlow["USER_PASSWORD"] = "USER_PASSWORD_AUTH";
})(AuthFlow = exports.AuthFlow || (exports.AuthFlow = {}));
static custom(name) {
return new OAuthScope(name);
}
}
exports.OAuthScope = OAuthScope;
/**
* Grants access to the 'phone_number' and 'phone_number_verified' claims.
* Automatically includes access to `OAuthScope.OPENID`.
*/
OAuthScope.PHONE = new OAuthScope('phone');
/**
* Grants access to the 'email' and 'email_verified' claims.
* Automatically includes access to `OAuthScope.OPENID`.
*/
OAuthScope.EMAIL = new OAuthScope('email');
/**
* Returns all user attributes in the ID token that are readable by the client
*/
OAuthScope.OPENID = new OAuthScope('openid');
/**
* Grants access to all user attributes that are readable by the client
* Automatically includes access to `OAuthScope.OPENID`.
*/
OAuthScope.PROFILE = new OAuthScope('profile');
/**
* Grants access to Amazon Cognito User Pool API operations that require access tokens,
* such as UpdateUserAttributes and VerifyUserAttribute.
*/
OAuthScope.COGNITO_ADMIN = new OAuthScope('aws.cognito.signin.user.admin');
/**
* Define a UserPool App Client
*/
class UserPoolClient extends core_1.Resource {
/*
* Note to implementers: Two CloudFormation return values Name and ClientSecret are part of the spec.
* However, they have been explicity not implemented here. They are not documented in CloudFormation, and
* CloudFormation returns the following the string when these two attributes are 'GetAtt' - "attribute not supported
* at this time, please use the CLI or Console to retrieve this value".
* Awaiting updates from CloudFormation.
*/
constructor(scope, id, props) {
super(scope, id, {
physicalName: props.userPoolClientName,
});
var _a, _b, _c;
super(scope, id);
const resource = new cognito_generated_1.CfnUserPoolClient(this, 'Resource', {
clientName: this.physicalName,
clientName: props.userPoolClientName,
generateSecret: props.generateSecret,
userPoolId: props.userPool.userPoolId,
explicitAuthFlows: props.enabledAuthFlows
explicitAuthFlows: this.configureAuthFlows(props),
allowedOAuthFlows: this.configureOAuthFlows(props.oAuth),
allowedOAuthScopes: this.configureOAuthScopes(props.oAuth),
callbackUrLs: (((_a = props.oAuth) === null || _a === void 0 ? void 0 : _a.callbackUrls) && ((_b = props.oAuth) === null || _b === void 0 ? void 0 : _b.callbackUrls.length) > 0) ? (_c = props.oAuth) === null || _c === void 0 ? void 0 : _c.callbackUrls : undefined,
allowedOAuthFlowsUserPoolClient: props.oAuth ? true : undefined,
});
this.userPoolClientId = resource.ref;
this.userPoolClientClientSecret = resource.attrClientSecret;
this.userPoolClientName = resource.attrName;
this._userPoolClientName = props.userPoolClientName;
}
/**
* Import a user pool client given its id.
*/
static fromUserPoolClientId(scope, id, userPoolClientId) {
class Import extends core_1.Resource {
constructor() {
super(...arguments);
this.userPoolClientId = userPoolClientId;
}
}
return new Import(scope, id);
}
/**
* The client name that was specified via the `userPoolClientName` property during initialization,
* throws an error otherwise.
*/
get userPoolClientName() {
if (this._userPoolClientName === undefined) {
throw new Error('userPoolClientName is available only if specified on the UserPoolClient during initialization');
}
return this._userPoolClientName;
}
configureAuthFlows(props) {
var _a, _b, _c, _d, _e;
const authFlows = [];
if ((_a = props.authFlows) === null || _a === void 0 ? void 0 : _a.userPassword) {
authFlows.push('ALLOW_USER_PASSWORD_AUTH');
}
if ((_b = props.authFlows) === null || _b === void 0 ? void 0 : _b.adminUserPassword) {
authFlows.push('ALLOW_ADMIN_USER_PASSWORD_AUTH');
}
if ((_c = props.authFlows) === null || _c === void 0 ? void 0 : _c.custom) {
authFlows.push('ALLOW_CUSTOM_AUTH');
}
if ((_d = props.authFlows) === null || _d === void 0 ? void 0 : _d.userSrp) {
authFlows.push('ALLOW_USER_SRP_AUTH');
}
if ((_e = props.authFlows) === null || _e === void 0 ? void 0 : _e.refreshToken) {
authFlows.push('ALLOW_REFRESH_TOKEN_AUTH');
}
if (authFlows.length === 0) {
return undefined;
}
return authFlows;
}
configureOAuthFlows(oAuth) {
if ((oAuth === null || oAuth === void 0 ? void 0 : oAuth.flows.authorizationCodeGrant) || (oAuth === null || oAuth === void 0 ? void 0 : oAuth.flows.implicitCodeGrant)) {
if ((oAuth === null || oAuth === void 0 ? void 0 : oAuth.callbackUrls) === undefined || (oAuth === null || oAuth === void 0 ? void 0 : oAuth.callbackUrls.length) === 0) {
throw new Error('callbackUrl must be specified when codeGrant or implicitGrant OAuth flows are enabled.');
}
if (oAuth === null || oAuth === void 0 ? void 0 : oAuth.flows.clientCredentials) {
throw new Error('clientCredentials OAuth flow cannot be selected along with codeGrant or implicitGrant.');
}
}
const oAuthFlows = [];
if (oAuth === null || oAuth === void 0 ? void 0 : oAuth.flows.clientCredentials) {
oAuthFlows.push('client_credentials');
}
if (oAuth === null || oAuth === void 0 ? void 0 : oAuth.flows.implicitCodeGrant) {
oAuthFlows.push('implicit');
}
if (oAuth === null || oAuth === void 0 ? void 0 : oAuth.flows.authorizationCodeGrant) {
oAuthFlows.push('code');
}
if (oAuthFlows.length === 0) {
return undefined;
}
return oAuthFlows;
}
configureOAuthScopes(oAuth) {
const oAuthScopes = new Set(oAuth === null || oAuth === void 0 ? void 0 : oAuth.scopes.map((x) => x.scopeName));
const autoOpenIdScopes = [OAuthScope.PHONE, OAuthScope.EMAIL, OAuthScope.PROFILE];
if (autoOpenIdScopes.reduce((agg, s) => agg || oAuthScopes.has(s.scopeName), false)) {
oAuthScopes.add(OAuthScope.OPENID.scopeName);
}
if (oAuthScopes.size > 0) {
return Array.from(oAuthScopes);
}
return undefined;
}
}
exports.UserPoolClient = UserPoolClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wb29sLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVzZXItcG9vbC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3Q0FBb0Q7QUFDcEQsMkRBQXdEO0FBR3hEOztHQUVHO0FBQ0gsSUFBWSxRQWVYO0FBZkQsV0FBWSxRQUFRO0lBQ2xCOztPQUVHO0lBQ0gsOENBQWtDLENBQUE7SUFFbEM7O09BRUc7SUFDSCxzREFBMEMsQ0FBQTtJQUUxQzs7T0FFRztJQUNILGdEQUFvQyxDQUFBO0FBQ3RDLENBQUMsRUFmVyxRQUFRLEdBQVIsZ0JBQVEsS0FBUixnQkFBUSxRQWVuQjtBQTJCRDs7R0FFRztBQUNILE1BQWEsY0FBZSxTQUFRLGVBQVE7SUFnQjFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtTQUN2QyxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdkQsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzdCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNwQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQ3JDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFoQ0Qsd0NBZ0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0LCBSZXNvdXJjZSB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgQ2ZuVXNlclBvb2xDbGllbnQgfSBmcm9tICcuL2NvZ25pdG8uZ2VuZXJhdGVkJztcbmltcG9ydCB7IElVc2VyUG9vbCB9IGZyb20gJy4vdXNlci1wb29sJztcblxuLyoqXG4gKiBUeXBlcyBvZiBhdXRoZW50aWNhdGlvbiBmbG93XG4gKi9cbmV4cG9ydCBlbnVtIEF1dGhGbG93IHtcbiAgLyoqXG4gICAqIEVuYWJsZSBmbG93IGZvciBzZXJ2ZXItc2lkZSBvciBhZG1pbiBhdXRoZW50aWNhdGlvbiAobm8gY2xpZW50IGFwcClcbiAgICovXG4gIEFETUlOX05PX1NSUCA9ICdBRE1JTl9OT19TUlBfQVVUSCcsXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBjdXN0b20gYXV0aGVudGljYXRpb24gZmxvd1xuICAgKi9cbiAgQ1VTVE9NX0ZMT1dfT05MWSA9ICdDVVNUT01fQVVUSF9GTE9XX09OTFknLFxuXG4gIC8qKlxuICAgKiBFbmFibGUgYXV0aCB1c2luZyB1c2VybmFtZSAmIHBhc3N3b3JkXG4gICAqL1xuICBVU0VSX1BBU1NXT1JEID0gJ1VTRVJfUEFTU1dPUkRfQVVUSCdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyUG9vbENsaWVudFByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudFxuICAgKiBAZGVmYXVsdCBjbG91ZGZvcm1hdGlvbiBnZW5lcmF0ZWQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlclBvb2xDbGllbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVXNlclBvb2wgcmVzb3VyY2UgdGhpcyBjbGllbnQgd2lsbCBoYXZlIGFjY2VzcyB0b1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlclBvb2w6IElVc2VyUG9vbDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBnZW5lcmF0ZSBhIGNsaWVudCBzZWNyZXRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyYXRlU2VjcmV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBlbmFibGVkIGF1dGhlbnRpY2F0aW9uIGZsb3dzXG4gICAqIEBkZWZhdWx0IG5vIGVuYWJsZWQgZmxvd3NcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWRBdXRoRmxvd3M/OiBBdXRoRmxvd1tdXG59XG5cbi8qKlxuICogRGVmaW5lIGEgVXNlclBvb2wgQXBwIENsaWVudFxuICovXG5leHBvcnQgY2xhc3MgVXNlclBvb2xDbGllbnQgZXh0ZW5kcyBSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2xDbGllbnRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2xDbGllbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbENsaWVudENsaWVudFNlY3JldDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBVc2VyUG9vbENsaWVudFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLnVzZXJQb29sQ2xpZW50TmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IENmblVzZXJQb29sQ2xpZW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGNsaWVudE5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgZ2VuZXJhdGVTZWNyZXQ6IHByb3BzLmdlbmVyYXRlU2VjcmV0LFxuICAgICAgdXNlclBvb2xJZDogcHJvcHMudXNlclBvb2wudXNlclBvb2xJZCxcbiAgICAgIGV4cGxpY2l0QXV0aEZsb3dzOiBwcm9wcy5lbmFibGVkQXV0aEZsb3dzXG4gICAgfSk7XG5cbiAgICB0aGlzLnVzZXJQb29sQ2xpZW50SWQgPSByZXNvdXJjZS5yZWY7XG4gICAgdGhpcy51c2VyUG9vbENsaWVudENsaWVudFNlY3JldCA9IHJlc291cmNlLmF0dHJDbGllbnRTZWNyZXQ7XG4gICAgdGhpcy51c2VyUG9vbENsaWVudE5hbWUgPSByZXNvdXJjZS5hdHRyTmFtZTtcbiAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wb29sLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVzZXItcG9vbC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3Q0FBK0Q7QUFDL0QsMkRBQXdEO0FBMEZ4RDs7O0dBR0c7QUFDSCxNQUFhLFVBQVU7SUErQ3JCLFlBQW9CLFNBQWlCO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFuQkQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7O0FBckNILGdDQWtEQztBQWpEQzs7O0dBR0c7QUFDb0IsZ0JBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV2RDs7O0dBR0c7QUFDb0IsZ0JBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV2RDs7R0FFRztBQUNvQixpQkFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXpEOzs7R0FHRztBQUNvQixrQkFBTyxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRTNEOzs7R0FHRztBQUNvQix3QkFBYSxHQUFHLElBQUksVUFBVSxDQUFDLCtCQUErQixDQUFDLENBQUM7QUEyRXpGOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsZUFBUTtJQWUxQzs7Ozs7O09BTUc7SUFFSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCOztRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sUUFBUSxHQUFHLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUN2RCxVQUFVLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUNwQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNB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LENBQUMsT0FBTyxDQUFFLENBQUM7UUFDcEYsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDbkYsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUN4QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDaEM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFsR0Qsd0NBa0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0LCBJUmVzb3VyY2UsIFJlc291cmNlIH0gZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyBDZm5Vc2VyUG9vbENsaWVudCB9IGZyb20gJy4vY29nbml0by5nZW5lcmF0ZWQnO1xuaW1wb3J0IHsgSVVzZXJQb29sIH0gZnJvbSAnLi91c2VyLXBvb2wnO1xuXG4vKipcbiAqIFR5cGVzIG9mIGF1dGhlbnRpY2F0aW9uIGZsb3dcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvZ25pdG8vbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FtYXpvbi1jb2duaXRvLXVzZXItcG9vbHMtYXV0aGVudGljYXRpb24tZmxvdy5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEZsb3cge1xuICAvKipcbiAgICogRW5hYmxlIGFkbWluIGJhc2VkIHVzZXIgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZmxvd1xuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRtaW5Vc2VyUGFzc3dvcmQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgY3VzdG9tIGF1dGhlbnRpY2F0aW9uIGZsb3dcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhdXRoIHVzaW5nIHVzZXJuYW1lICYgcGFzc3dvcmRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJQYXNzd29yZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBTUlAgYmFzZWQgYXV0aGVudGljYXRpb25cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJTcnA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgYXV0aGZsb3cgdG8gcmVmcmVzaCB0b2tlbnNcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlZnJlc2hUb2tlbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT0F1dGggc2V0dGluZ3MgdG8gY29uZmlndXJlIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBhcHAgYW5kIHRoaXMgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoU2V0dGluZ3Mge1xuXG4gIC8qKlxuICAgKiBPQXV0aCBmbG93cyB0aGF0IGFyZSBhbGxvd2VkIHdpdGggdGhpcyBjbGllbnQuXG4gICAqIEBzZWUgLSB0aGUgJ0FsbG93ZWQgT0F1dGggRmxvd3MnIHNlY3Rpb24gYXQgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvZ25pdG8vbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2NvZ25pdG8tdXNlci1wb29scy1hcHAtaWRwLXNldHRpbmdzLmh0bWxcbiAgICogQGRlZmF1bHQgLSBhbGwgT0F1dGggZmxvd3MgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGZsb3dzOiBPQXV0aEZsb3dzO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFsbG93ZWQgcmVkaXJlY3QgVVJMcyBmb3IgdGhlIGlkZW50aXR5IHByb3ZpZGVycy5cbiAgICogQGRlZmF1bHQgLSBubyBjYWxsYmFjayBVUkxzXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFja1VybHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT0F1dGggc2NvcGVzIHRoYXQgYXJlIGFsbG93ZWQgd2l0aCB0aGlzIGNsaWVudC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29nbml0by9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvY29nbml0by11c2VyLXBvb2xzLWFwcC1pZHAtc2V0dGluZ3MuaHRtbFxuICAgKiBAZGVmYXVsdCAtIG5vIE9BdXRoIHNjb3BlcyBhcmUgY29uZmlndXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNjb3BlczogT0F1dGhTY29wZVtdO1xufVxuXG4vKipcbiAqIFR5cGVzIG9mIE9BdXRoIGdyYW50IGZsb3dzXG4gKiBAc2VlIC0gdGhlICdBbGxvd2VkIE9BdXRoIEZsb3dzJyBzZWN0aW9uIGF0IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2duaXRvL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jb2duaXRvLXVzZXItcG9vbHMtYXBwLWlkcC1zZXR0aW5ncy5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhGbG93cyB7XG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhbiBhdXRob3JpemF0aW9uIGNvZGUgZ3JhbnQgZmxvdywgd2hpY2ggcHJvdmlkZXMgYW4gYXV0aG9yaXphdGlvbiBjb2RlIGFzIHRoZSByZXNwb25zZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6YXRpb25Db2RlR3JhbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2xpZW50IHNob3VsZCBnZXQgdGhlIGFjY2VzcyB0b2tlbiBhbmQgSUQgdG9rZW4gZGlyZWN0bHkuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbXBsaWNpdENvZGVHcmFudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENsaWVudCBzaG91bGQgZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gYW5kIElEIHRva2VuIGZyb20gdGhlIHRva2VuIGVuZHBvaW50XG4gICAqIHVzaW5nIGEgY29tYmluYXRpb24gb2YgY2xpZW50IGFuZCBjbGllbnRfc2VjcmV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xpZW50Q3JlZGVudGlhbHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9BdXRoIHNjb3BlcyB0aGF0IGFyZSBhbGxvd2VkIHdpdGggdGhpcyBjbGllbnQuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2duaXRvL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jb2duaXRvLXVzZXItcG9vbHMtYXBwLWlkcC1zZXR0aW5ncy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBPQXV0aFNjb3BlIHtcbiAgLyoqXG4gICAqIEdyYW50cyBhY2Nlc3MgdG8gdGhlICdwaG9uZV9udW1iZXInIGFuZCAncGhvbmVfbnVtYmVyX3ZlcmlmaWVkJyBjbGFpbXMuXG4gICAqIEF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgYWNjZXNzIHRvIGBPQXV0aFNjb3BlLk9QRU5JRGAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBIT05FID0gbmV3IE9BdXRoU2NvcGUoJ3Bob25lJyk7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBhY2Nlc3MgdG8gdGhlICdlbWFpbCcgYW5kICdlbWFpbF92ZXJpZmllZCcgY2xhaW1zLlxuICAgKiBBdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGFjY2VzcyB0byBgT0F1dGhTY29wZS5PUEVOSURgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFTUFJTCA9IG5ldyBPQXV0aFNjb3BlKCdlbWFpbCcpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB1c2VyIGF0dHJpYnV0ZXMgaW4gdGhlIElEIHRva2VuIHRoYXQgYXJlIHJlYWRhYmxlIGJ5IHRoZSBjbGllbnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgT1BFTklEID0gbmV3IE9BdXRoU2NvcGUoJ29wZW5pZCcpO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgYWNjZXNzIHRvIGFsbCB1c2VyIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVhZGFibGUgYnkgdGhlIGNsaWVudFxuICAgKiBBdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGFjY2VzcyB0byBgT0F1dGhTY29wZS5PUEVOSURgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9GSUxFID0gbmV3IE9BdXRoU2NvcGUoJ3Byb2ZpbGUnKTtcblxuICAvKipcbiAgICogR3JhbnRzIGFjY2VzcyB0byBBbWF6b24gQ29nbml0byBVc2VyIFBvb2wgQVBJIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGFjY2VzcyB0b2tlbnMsXG4gICAqIHN1Y2ggYXMgVXBkYXRlVXNlckF0dHJpYnV0ZXMgYW5kIFZlcmlmeVVzZXJBdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPR05JVE9fQURNSU4gPSBuZXcgT0F1dGhTY29wZSgnYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4nKTtcblxuICAvKipcbiAgICogQ3VzdG9tIHNjb3BlIGlzIG9uZSB0aGF0IHlvdSBkZWZpbmUgZm9yIHlvdXIgb3duIHJlc291cmNlIHNlcnZlciBpbiB0aGUgUmVzb3VyY2UgU2VydmVycy5cbiAgICogVGhlIGZvcm1hdCBpcyAncmVzb3VyY2Utc2VydmVyLWlkZW50aWZpZXIvc2NvcGUnLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2duaXRvL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jb2duaXRvLXVzZXItcG9vbHMtZGVmaW5lLXJlc291cmNlLXNlcnZlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20obmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBPQXV0aFNjb3BlKG5hbWUpO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIHNjb3BlIGFzIHJlY29nbml6ZWQgYnkgQ2xvdWRGb3JtYXRpb24uXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWNvZ25pdG8tdXNlcnBvb2xjbGllbnQuaHRtbCNjZm4tY29nbml0by11c2VycG9vbGNsaWVudC1hbGxvd2Vkb2F1dGhzY29wZXNcbiAgICovXG4gIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gIHB1YmxpYyByZWFkb25seSBzY29wZU5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNjb3BlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zY29wZU5hbWUgPSBzY29wZU5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgVXNlclBvb2xDbGllbnQgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBvb2xDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudFxuICAgKiBAZGVmYXVsdCAtIGNsb3VkZm9ybWF0aW9uIGdlbmVyYXRlZCBuYW1lXG4gICAqL1xuICByZWFkb25seSB1c2VyUG9vbENsaWVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgYSBjbGllbnQgc2VjcmV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBnZW5lcmF0ZVNlY3JldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzZXQgb2YgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3MgdG8gZW5hYmxlIG9uIHRoZSBjbGllbnRcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29nbml0by9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYW1hem9uLWNvZ25pdG8tdXNlci1wb29scy1hdXRoZW50aWNhdGlvbi1mbG93Lmh0bWxcbiAgICogQGRlZmF1bHQgLSBhbGwgYXV0aCBmbG93cyBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aEZsb3dzPzogQXV0aEZsb3c7XG5cbiAgLyoqXG4gICAqIE9BdXRoIHNldHRpbmdzIGZvciB0aGlzIHRvIGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBhcHAuXG4gICAqIEBkZWZhdWx0IC0gc2VlIGRlZmF1bHRzIGluIGBPQXV0aFNldHRpbmdzYFxuICAgKi9cbiAgcmVhZG9ubHkgb0F1dGg/OiBPQXV0aFNldHRpbmdzO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBVc2VyUG9vbENsaWVudCBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUG9vbENsaWVudFByb3BzIGV4dGVuZHMgVXNlclBvb2xDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBVc2VyUG9vbCByZXNvdXJjZSB0aGlzIGNsaWVudCB3aWxsIGhhdmUgYWNjZXNzIHRvXG4gICAqL1xuICByZWFkb25seSB1c2VyUG9vbDogSVVzZXJQb29sO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBDb2duaXRvIHVzZXIgcG9vbCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJQb29sQ2xpZW50IGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB1c2VyUG9vbENsaWVudElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgVXNlclBvb2wgQXBwIENsaWVudFxuICovXG5leHBvcnQgY2xhc3MgVXNlclBvb2xDbGllbnQgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElVc2VyUG9vbENsaWVudCB7XG4gIC8qKlxuICAgKiBJbXBvcnQgYSB1c2VyIHBvb2wgY2xpZW50IGdpdmVuIGl0cyBpZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVVzZXJQb29sQ2xpZW50SWQoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgdXNlclBvb2xDbGllbnRJZDogc3RyaW5nKTogSVVzZXJQb29sQ2xpZW50IHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElVc2VyUG9vbENsaWVudCB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2xDbGllbnRJZCA9IHVzZXJQb29sQ2xpZW50SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbENsaWVudElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3VzZXJQb29sQ2xpZW50TmFtZT86IHN0cmluZztcblxuICAvKlxuICAgKiBOb3RlIHRvIGltcGxlbWVudGVyczogVHdvIENsb3VkRm9ybWF0aW9uIHJldHVybiB2YWx1ZXMgTmFtZSBhbmQgQ2xpZW50U2VjcmV0IGFyZSBwYXJ0IG9mIHRoZSBzcGVjLlxuICAgKiBIb3dldmVyLCB0aGV5IGhhdmUgYmVlbiBleHBsaWNpdHkgbm90IGltcGxlbWVudGVkIGhlcmUuIFRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIGluIENsb3VkRm9ybWF0aW9uLCBhbmRcbiAgICogQ2xvdWRGb3JtYXRpb24gcmV0dXJucyB0aGUgZm9sbG93aW5nIHRoZSBzdHJpbmcgd2hlbiB0aGVzZSB0d28gYXR0cmlidXRlcyBhcmUgJ0dldEF0dCcgLSBcImF0dHJpYnV0ZSBub3Qgc3VwcG9ydGVkXG4gICAqIGF0IHRoaXMgdGltZSwgcGxlYXNlIHVzZSB0aGUgQ0xJIG9yIENvbnNvbGUgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZVwiLlxuICAgKiBBd2FpdGluZyB1cGRhdGVzIGZyb20gQ2xvdWRGb3JtYXRpb24uXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBVc2VyUG9vbENsaWVudFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IENmblVzZXJQb29sQ2xpZW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGNsaWVudE5hbWU6IHByb3BzLnVzZXJQb29sQ2xpZW50TmFtZSxcbiAgICAgIGdlbmVyYXRlU2VjcmV0OiBwcm9wcy5nZW5lcmF0ZVNlY3JldCxcbiAgICAgIHVzZXJQb29sSWQ6IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICBleHBsaWNpdEF1dGhGbG93czogdGhpcy5jb25maWd1cmVBdXRoRmxvd3MocHJvcHMpLFxuICAgICAgYWxsb3dlZE9BdXRoRmxvd3M6IHRoaXMuY29uZmlndXJlT0F1dGhGbG93cyhwcm9wcy5vQXV0aCksXG4gICAgICBhbGxvd2VkT0F1dGhTY29wZXM6IHRoaXMuY29uZmlndXJlT0F1dGhTY29wZXMocHJvcHMub0F1dGgpLFxuICAgICAgY2FsbGJhY2tVckxzOiAocHJvcHMub0F1dGg/LmNhbGxiYWNrVXJscyAmJiBwcm9wcy5vQXV0aD8uY2FsbGJhY2tVcmxzLmxlbmd0aCA+IDApID8gcHJvcHMub0F1dGg/LmNhbGxiYWNrVXJscyA6IHVuZGVmaW5lZCxcbiAgICAgIGFsbG93ZWRPQXV0aEZsb3dzVXNlclBvb2xDbGllbnQ6IHByb3BzLm9BdXRoID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRoaXMudXNlclBvb2xDbGllbnRJZCA9IHJlc291cmNlLnJlZjtcbiAgICB0aGlzLl91c2VyUG9vbENsaWVudE5hbWUgPSBwcm9wcy51c2VyUG9vbENsaWVudE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsaWVudCBuYW1lIHRoYXQgd2FzIHNwZWNpZmllZCB2aWEgdGhlIGB1c2VyUG9vbENsaWVudE5hbWVgIHByb3BlcnR5IGR1cmluZyBpbml0aWFsaXphdGlvbixcbiAgICogdGhyb3dzIGFuIGVycm9yIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdXNlclBvb2xDbGllbnROYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3VzZXJQb29sQ2xpZW50TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQb29sQ2xpZW50TmFtZSBpcyBhdmFpbGFibGUgb25seSBpZiBzcGVjaWZpZWQgb24gdGhlIFVzZXJQb29sQ2xpZW50IGR1cmluZyBpbml0aWFsaXphdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdXNlclBvb2xDbGllbnROYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVBdXRoRmxvd3MocHJvcHM6IFVzZXJQb29sQ2xpZW50UHJvcHMpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXV0aEZsb3dzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChwcm9wcy5hdXRoRmxvd3M/LnVzZXJQYXNzd29yZCkgeyBhdXRoRmxvd3MucHVzaCgnQUxMT1dfVVNFUl9QQVNTV09SRF9BVVRIJyk7IH1cbiAgICBpZiAocHJvcHMuYXV0aEZsb3dzPy5hZG1pblVzZXJQYXNzd29yZCkgeyBhdXRoRmxvd3MucHVzaCgnQUxMT1dfQURNSU5fVVNFUl9QQVNTV09SRF9BVVRIJyk7IH1cbiAgICBpZiAocHJvcHMuYXV0aEZsb3dzPy5jdXN0b20pIHsgYXV0aEZsb3dzLnB1c2goJ0FMTE9XX0NVU1RPTV9BVVRIJyk7IH1cbiAgICBpZiAocHJvcHMuYXV0aEZsb3dzPy51c2VyU3JwKSB7IGF1dGhGbG93cy5wdXNoKCdBTExPV19VU0VSX1NSUF9BVVRIJyk7IH1cbiAgICBpZiAocHJvcHMuYXV0aEZsb3dzPy5yZWZyZXNoVG9rZW4pIHsgYXV0aEZsb3dzLnB1c2goJ0FMTE9XX1JFRlJFU0hfVE9LRU5fQVVUSCcpOyB9XG5cbiAgICBpZiAoYXV0aEZsb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF1dGhGbG93cztcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlT0F1dGhGbG93cyhvQXV0aD86IE9BdXRoU2V0dGluZ3MpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9BdXRoPy5mbG93cy5hdXRob3JpemF0aW9uQ29kZUdyYW50IHx8IG9BdXRoPy5mbG93cy5pbXBsaWNpdENvZGVHcmFudCkge1xuICAgICAgaWYgKG9BdXRoPy5jYWxsYmFja1VybHMgPT09IHVuZGVmaW5lZCB8fCBvQXV0aD8uY2FsbGJhY2tVcmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrVXJsIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gY29kZUdyYW50IG9yIGltcGxpY2l0R3JhbnQgT0F1dGggZmxvd3MgYXJlIGVuYWJsZWQuJyk7XG4gICAgICB9XG4gICAgICBpZiAob0F1dGg/LmZsb3dzLmNsaWVudENyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2xpZW50Q3JlZGVudGlhbHMgT0F1dGggZmxvdyBjYW5ub3QgYmUgc2VsZWN0ZWQgYWxvbmcgd2l0aCBjb2RlR3JhbnQgb3IgaW1wbGljaXRHcmFudC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvQXV0aEZsb3dzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChvQXV0aD8uZmxvd3MuY2xpZW50Q3JlZGVudGlhbHMpIHsgb0F1dGhGbG93cy5wdXNoKCdjbGllbnRfY3JlZGVudGlhbHMnKTsgfVxuICAgIGlmIChvQXV0aD8uZmxvd3MuaW1wbGljaXRDb2RlR3JhbnQpIHsgb0F1dGhGbG93cy5wdXNoKCdpbXBsaWNpdCcpOyB9XG4gICAgaWYgKG9BdXRoPy5mbG93cy5hdXRob3JpemF0aW9uQ29kZUdyYW50KSB7IG9BdXRoRmxvd3MucHVzaCgnY29kZScpOyB9XG5cbiAgICBpZiAob0F1dGhGbG93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBvQXV0aEZsb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVPQXV0aFNjb3BlcyhvQXV0aD86IE9BdXRoU2V0dGluZ3MpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb0F1dGhTY29wZXMgPSBuZXcgU2V0KG9BdXRoPy5zY29wZXMubWFwKCh4KSA9PiB4LnNjb3BlTmFtZSkpO1xuICAgIGNvbnN0IGF1dG9PcGVuSWRTY29wZXMgPSBbIE9BdXRoU2NvcGUuUEhPTkUsIE9BdXRoU2NvcGUuRU1BSUwsIE9BdXRoU2NvcGUuUFJPRklMRSBdO1xuICAgIGlmIChhdXRvT3BlbklkU2NvcGVzLnJlZHVjZSgoYWdnLCBzKSA9PiBhZ2cgfHwgb0F1dGhTY29wZXMuaGFzKHMuc2NvcGVOYW1lKSwgZmFsc2UpKSB7XG4gICAgICBvQXV0aFNjb3Blcy5hZGQoT0F1dGhTY29wZS5PUEVOSUQuc2NvcGVOYW1lKTtcbiAgICB9XG4gICAgaWYgKG9BdXRoU2NvcGVzLnNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShvQXV0aFNjb3Blcyk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==

153

lib/user-pool.d.ts

@@ -5,2 +5,3 @@ import { IRole } from '@aws-cdk/aws-iam';

import { ICustomAttribute, RequiredAttributes } from './user-pool-attr';
import { IUserPoolClient, UserPoolClientOptions } from './user-pool-client';
/**

@@ -51,2 +52,6 @@ * The different ways in which users of this pool can sign up or sign in.

}
/**
* Triggers for a user pool
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html
*/
export interface UserPoolTriggers {

@@ -56,2 +61,3 @@ /**

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-create-auth-challenge.html
* @default - no trigger configured
*/

@@ -62,2 +68,3 @@ readonly createAuthChallenge?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html
* @default - no trigger configured
*/

@@ -68,2 +75,3 @@ readonly customMessage?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-define-auth-challenge.html
* @default - no trigger configured
*/

@@ -74,2 +82,3 @@ readonly defineAuthChallenge?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-post-authentication.html
* @default - no trigger configured
*/

@@ -80,2 +89,3 @@ readonly postAuthentication?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-post-confirmation.html
* @default - no trigger configured
*/

@@ -86,2 +96,3 @@ readonly postConfirmation?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-authentication.html
* @default - no trigger configured
*/

@@ -92,2 +103,3 @@ readonly preAuthentication?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html
* @default - no trigger configured
*/

@@ -98,2 +110,3 @@ readonly preSignUp?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
* @default - no trigger configured
*/

@@ -104,2 +117,3 @@ readonly preTokenGeneration?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-migrate-user.html
* @default - no trigger configured
*/

@@ -110,2 +124,3 @@ readonly userMigration?: lambda.IFunction;

* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-verify-auth-challenge-response.html
* @default - no trigger configured
*/

@@ -119,2 +134,62 @@ readonly verifyAuthChallengeResponse?: lambda.IFunction;

/**
* User pool operations to which lambda triggers can be attached.
*/
export declare class UserPoolOperation {
/**
* Creates a challenge in a custom auth flow
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-create-auth-challenge.html
*/
static readonly CREATE_AUTH_CHALLENGE: UserPoolOperation;
/**
* Advanced customization and localization of messages
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html
*/
static readonly CUSTOM_MESSAGE: UserPoolOperation;
/**
* Determines the next challenge in a custom auth flow
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-define-auth-challenge.html
*/
static readonly DEFINE_AUTH_CHALLENGE: UserPoolOperation;
/**
* Event logging for custom analytics
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-post-authentication.html
*/
static readonly POST_AUTHENTICATION: UserPoolOperation;
/**
* Custom welcome messages or event logging for custom analytics
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-post-confirmation.html
*/
static readonly POST_CONFIRMATION: UserPoolOperation;
/**
* Custom validation to accept or deny the sign-in request
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-authentication.html
*/
static readonly PRE_AUTHENTICATION: UserPoolOperation;
/**
* Custom validation to accept or deny the sign-up request
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html
*/
static readonly PRE_SIGN_UP: UserPoolOperation;
/**
* Add or remove attributes in Id tokens
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
*/
static readonly PRE_TOKEN_GENERATION: UserPoolOperation;
/**
* Migrate a user from an existing user directory to user pools
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-migrate-user.html
*/
static readonly USER_MIGRATION: UserPoolOperation;
/**
* Determines if a response is correct in a custom auth flow
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-verify-auth-challenge-response.html
*/
static readonly VERIFY_AUTH_CHALLENGE_RESPONSE: UserPoolOperation;
/** A custom user pool operation */
static of(name: string): UserPoolOperation;
/** The key to use in `CfnUserPool.LambdaConfigProperty` */
readonly operationName: string;
private constructor();
}
/**
* The email verification style

@@ -368,3 +443,3 @@ */

* Lambda functions to use for supported Cognito triggers.
*
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html
* @default - No Lambda triggers.

@@ -388,2 +463,6 @@ */

readonly userPoolArn: string;
/**
* Create a user pool client.
*/
addClient(id: string, options?: UserPoolClientOptions): IUserPoolClient;
}

@@ -423,71 +502,7 @@ /**

/**
* Attach 'Create Auth Challenge' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-create-auth-challenge.html
* @param fn the lambda function to attach
* Add a lambda trigger to a user pool operation
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html
*/
addCreateAuthChallengeTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Custom Message' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html
* @param fn the lambda function to attach
*/
addCustomMessageTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Define Auth Challenge' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-define-auth-challenge.html
* @param fn the lambda function to attach
*/
addDefineAuthChallengeTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Post Authentication' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-post-authentication.html
* @param fn the lambda function to attach
*/
addPostAuthenticationTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Post Confirmation' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-post-confirmation.html
* @param fn the lambda function to attach
*/
addPostConfirmationTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Pre Authentication' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-authentication.html
* @param fn the lambda function to attach
*/
addPreAuthenticationTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Pre Sign Up' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html
* @param fn the lambda function to attach
*/
addPreSignUpTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Pre Token Generation' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
* @param fn the lambda function to attach
*/
addPreTokenGenerationTrigger(fn: lambda.IFunction): void;
/**
* Attach 'User Migration' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-migrate-user.html
* @param fn the lambda function to attach
*/
addUserMigrationTrigger(fn: lambda.IFunction): void;
/**
* Attach 'Verify Auth Challenge Response' trigger
* Grants access from cognito-idp.amazonaws.com to the lambda
* @see https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-verify-auth-challenge-response.html
* @param fn the lambda function to attach
*/
addVerifyAuthChallengeResponseTrigger(fn: lambda.IFunction): void;
addTrigger(operation: UserPoolOperation, fn: lambda.IFunction): void;
addClient(id: string, options?: UserPoolClientOptions): IUserPoolClient;
private addLambdaPermission;

@@ -494,0 +509,0 @@ private verificationMessageConfiguration;

{
"name": "@aws-cdk/aws-cognito",
"version": "1.31.0",
"version": "1.32.0",
"description": "The CDK Construct Library for AWS::Cognito",

@@ -65,15 +65,15 @@ "main": "lib/index.js",

"devDependencies": {
"@aws-cdk/assert": "1.31.0",
"@aws-cdk/assert": "1.32.0",
"@types/nodeunit": "^0.0.30",
"cdk-build-tools": "1.31.0",
"cdk-integ-tools": "1.31.0",
"cfn2ts": "1.31.0",
"cdk-build-tools": "1.32.0",
"cdk-integ-tools": "1.32.0",
"cfn2ts": "1.32.0",
"jest": "^24.9.0",
"nodeunit": "^0.11.3",
"pkglint": "1.31.0"
"pkglint": "1.32.0"
},
"dependencies": {
"@aws-cdk/aws-iam": "1.31.0",
"@aws-cdk/aws-lambda": "1.31.0",
"@aws-cdk/core": "1.31.0",
"@aws-cdk/aws-iam": "1.32.0",
"@aws-cdk/aws-lambda": "1.32.0",
"@aws-cdk/core": "1.32.0",
"constructs": "^2.0.0"

@@ -83,5 +83,5 @@ },

"peerDependencies": {
"@aws-cdk/aws-iam": "1.31.0",
"@aws-cdk/aws-lambda": "1.31.0",
"@aws-cdk/core": "1.31.0",
"@aws-cdk/aws-iam": "1.32.0",
"@aws-cdk/aws-lambda": "1.32.0",
"@aws-cdk/core": "1.32.0",
"constructs": "^2.0.0"

@@ -95,17 +95,4 @@ },

"exclude": [
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.verifyAuthChallengeResponse",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.userMigration",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.preTokenGeneration",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.preSignUp",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.preAuthentication",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.postConfirmation",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.postAuthentication",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.defineAuthChallenge",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.customMessage",
"props-default-doc:@aws-cdk/aws-cognito.UserPoolTriggers.createAuthChallenge",
"docs-public-apis:@aws-cdk/aws-cognito.UserPoolTriggers",
"docs-public-apis:@aws-cdk/aws-cognito.UserPoolClient.userPoolClientClientSecret",
"docs-public-apis:@aws-cdk/aws-cognito.UserPoolClient.userPoolClientId",
"docs-public-apis:@aws-cdk/aws-cognito.UserPoolClient.userPoolClientName",
"docs-public-apis:@aws-cdk/aws-cognito.UserPoolClientProps"
"attribute-tag:@aws-cdk/aws-cognito.UserPoolClient.userPoolClientName",
"resource-attribute:@aws-cdk/aws-cognito.UserPoolClient.userPoolClientClientSecret"
]

@@ -112,0 +99,0 @@ },

@@ -41,3 +41,5 @@ ## Amazon Cognito Construct Library

- [Emails](#emails)
- [Lambda Triggers](#lambda-triggers)
- [Import](#importing-user-pools)
- [App Clients](#app-clients)

@@ -281,2 +283,34 @@ ## User Pools

### Lambda Triggers
User pools can be configured such that AWS Lambda functions can be triggered when certain user operations or actions
occur, such as, sign up, user confirmation, sign in, etc. They can also be used to add custom authentication
challenges, user migrations and custom verification messages. Learn more about triggers at [User Pool Workflows with
Triggers](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html).
Lambda triggers can either be specified as part of the `UserPool` initialization, or it can be added later, via methods
on the construct, as so -
```ts
const authChallengeFn = new lambda.Function(this, 'authChallengeFn', {
// ...
});
const userpool = new UserPool(this, 'myuserpool', {
// ...
triggers: {
createAuthChallenge: authChallengeFn,
// ...
}
});
userpool.addTrigger(UserPoolOperation.USER_MIGRATION, new lambda.Function(this, 'userMigrationFn', {
// ...
}));
```
The following table lists the set of triggers available, and their corresponding method to add it to the user pool.
For more information on the function of these triggers and how to configure them, read [User Pool Workflows with
Triggers](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html).
### Importing User Pools

@@ -300,2 +334,71 @@

'arn:aws:cognito-idp:eu-west-1:123456789012:userpool/us-east-1_mtRyYQ14D');
```
```
### App Clients
An app is an entity within a user pool that has permission to call unauthenticated APIs (APIs that do not have an
authenticated user), such as APIs to register, sign in, and handle forgotten passwords. To call these APIs, you need an
app client ID and an optional client secret. Read [Configuring a User Pool App
Client](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html) to learn more.
The following code creates an app client and retrieves the client id -
```ts
const pool = new UserPool(this, 'pool');
const client = pool.addClient('customer-app-client');
const clientId = client.userPoolClientId;
```
Existing app clients can be imported into the CDK app using the `UserPoolClient.fromUserPoolClientId()` API. For new
and imported user pools, clients can also be created via the `UserPoolClient` constructor, as so -
```ts
const importedPool = UserPool.fromUserPoolId(this, 'imported-pool', 'us-east-1_oiuR12Abd');
new UserPoolClient(this, 'customer-app-client', {
userPool: importedPool
});
```
Clients can be configured with authentication flows. Authentication flows allow users on a client to be authenticated
with a user pool. Cognito user pools provide several several different types of authentication, such as, SRP (Secure
Remote Password) authentication, username-and-password authentication, etc. Learn more about this at [UserPool Authentication
Flow](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html).
The following code configures a client to use both SRP and username-and-password authentication -
```ts
const pool = new UserPool(this, 'pool');
pool.addClient('app-client', {
authFlows: {
userPassword: true,
userSrp: true,
}
});
```
Custom authentication protocols can be configured by setting the `custom` property under `authFlow` and defining lambda
functions for the corresponding user pool [triggers](#lambda-triggers). Learn more at [Custom Authentication
Flow](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow).
In addition to these authentication mechanisms, Cognito user pools also support using OAuth 2.0 framework for
authenticating users. User pool clients can be configured with OAuth 2.0 authorization flows and scopes. Learn more
about the [OAuth 2.0 authorization framework](https://tools.ietf.org/html/rfc6749) and [Cognito user pool's
implementation of
OAuth2.0](https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-user-pool-oauth-2-0-grants/).
The following code configures an app client with the authorization code grant flow and registers the the app's welcome
page as a callback (or redirect) URL. It also configures the access token scope to 'openid'. All of these concepts can
be found in the [OAuth 2.0 RFC](https://tools.ietf.org/html/rfc6749).
```ts
const pool = new UserPool(this, 'Pool');
pool.addClient('app-client', {
oAuth: {
flows: {
authorizationCodeGrant: true,
},
scopes: [ OAuthScope.OPENID ],
callbackUrls: [ 'https://my-app-domain.com/welcome' ],
}
});
```
{
"Resources": {
"createAuthChallengeServiceRole611710B5": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"createAuthChallengeB185B225": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"createAuthChallengeServiceRole611710B5",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "createAuthChallenge"
},
"DependsOn": [
"createAuthChallengeServiceRole611710B5"
]
},
"createAuthChallengeCreateAuthChallengeCognito57E2297E": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"createAuthChallengeB185B225",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"customMessageServiceRoleB4AE7F17": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"customMessage52BA91E2": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"customMessageServiceRoleB4AE7F17",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "customMessage"
},
"DependsOn": [
"customMessageServiceRoleB4AE7F17"
]
},
"customMessageCustomMessageCognitoB4F894A6": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"customMessage52BA91E2",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"defineAuthChallengeServiceRole9E2D15DF": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"defineAuthChallengeAE7BCDA1": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"defineAuthChallengeServiceRole9E2D15DF",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "defineAuthChallenge"
},
"DependsOn": [
"defineAuthChallengeServiceRole9E2D15DF"
]
},
"defineAuthChallengeDefineAuthChallengeCognito4DBD8021": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"defineAuthChallengeAE7BCDA1",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"postAuthenticationServiceRole5B3B242A": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"postAuthentication741BD8E3": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"postAuthenticationServiceRole5B3B242A",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "postAuthentication"
},
"DependsOn": [
"postAuthenticationServiceRole5B3B242A"
]
},
"postAuthenticationPostAuthenticationCognito8B923BC3": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"postAuthentication741BD8E3",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"postConfirmationServiceRole864BE5F9": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"postConfirmationD5E3F1DD": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"postConfirmationServiceRole864BE5F9",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "postConfirmation"
},
"DependsOn": [
"postConfirmationServiceRole864BE5F9"
]
},
"postConfirmationPostConfirmationCognito9D010393": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"postConfirmationD5E3F1DD",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"preAuthenticationServiceRole9712F4D8": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"preAuthentication56F78C81": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"preAuthenticationServiceRole9712F4D8",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "preAuthentication"
},
"DependsOn": [
"preAuthenticationServiceRole9712F4D8"
]
},
"preAuthenticationPreAuthenticationCognito67FACB54": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"preAuthentication56F78C81",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"preSignUpServiceRole0A7E91EB": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"preSignUp1934B27C": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"preSignUpServiceRole0A7E91EB",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "preSignUp"
},
"DependsOn": [
"preSignUpServiceRole0A7E91EB"
]
},
"preSignUpPreSignUpCognitoE986CC53": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"preSignUp1934B27C",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"preTokenGenerationServiceRole430C3D14": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"preTokenGeneration1E968302": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"preTokenGenerationServiceRole430C3D14",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "preTokenGeneration"
},
"DependsOn": [
"preTokenGenerationServiceRole430C3D14"
]
},
"preTokenGenerationPreTokenGenerationCognitoC1959918": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"preTokenGeneration1E968302",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"userMigrationServiceRole091766B0": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"userMigrationAAA960EC": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"userMigrationServiceRole091766B0",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "userMigration"
},
"DependsOn": [
"userMigrationServiceRole091766B0"
]
},
"userMigrationUserMigrationCognito29EEC4AD": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"userMigrationAAA960EC",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"verifyAuthChallengeResponseServiceRole7077884C": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
}
},
"verifyAuthChallengeResponse211FE4A6": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "foo"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"verifyAuthChallengeResponseServiceRole7077884C",
"Arn"
]
},
"Runtime": "nodejs12.x",
"FunctionName": "verifyAuthChallengeResponse"
},
"DependsOn": [
"verifyAuthChallengeResponseServiceRole7077884C"
]
},
"verifyAuthChallengeResponseVerifyAuthChallengeResponseCognito9DC48AFC": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"verifyAuthChallengeResponse211FE4A6",
"Arn"
]
},
"Principal": "cognito-idp.amazonaws.com"
}
},
"myuserpoolsmsRole0E16FDD9": {

@@ -68,3 +708,75 @@ "Type": "AWS::IAM::Role",

],
"LambdaConfig": {},
"LambdaConfig": {
"CreateAuthChallenge": {
"Fn::GetAtt": [
"createAuthChallengeB185B225",
"Arn"
]
},
"CustomMessage": {
"Fn::GetAtt": [
"customMessage52BA91E2",
"Arn"
]
},
"DefineAuthChallenge": {
"Fn::GetAtt": [
"defineAuthChallengeAE7BCDA1",
"Arn"
]
},
"PostAuthentication": {
"Fn::GetAtt": [
"postAuthentication741BD8E3",
"Arn"
]
},
"PostConfirmation": {
"Fn::GetAtt": [
"postConfirmationD5E3F1DD",
"Arn"
]
},
"PreAuthentication": {
"Fn::GetAtt": [
"preAuthentication56F78C81",
"Arn"
]
},
"PreSignUp": {
"Fn::GetAtt": [
"preSignUp1934B27C",
"Arn"
]
},
"PreTokenGeneration": {
"Fn::GetAtt": [
"preTokenGeneration1E968302",
"Arn"
]
},
"UserMigration": {
"Fn::GetAtt": [
"userMigrationAAA960EC",
"Arn"
]
},
"VerifyAuthChallengeResponse": {
"Fn::GetAtt": [
"verifyAuthChallengeResponse211FE4A6",
"Arn"
]
}
},
"MfaConfiguration": "ON",
"Policies": {
"PasswordPolicy": {
"MinimumLength": 12,
"RequireLowercase": true,
"RequireNumbers": true,
"RequireSymbols": true,
"RequireUppercase": true,
"TemporaryPasswordValidityDays": 10
}
},
"Schema": [

@@ -112,13 +824,2 @@ {

],
"MfaConfiguration": "ON",
"Policies": {
"PasswordPolicy": {
"MinimumLength": 12,
"RequireLowercase": true,
"RequireNumbers": true,
"RequireSymbols": true,
"RequireUppercase": true,
"TemporaryPasswordValidityDays": 10
}
},
"SmsConfiguration": {

@@ -125,0 +826,0 @@ "ExternalId": "integuserpoolmyuserpoolDA38443C",

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const aws_lambda_1 = require("@aws-cdk/aws-lambda");
const core_1 = require("@aws-cdk/core");

@@ -57,2 +58,14 @@ const lib_1 = require("../lib");

},
lambdaTriggers: {
createAuthChallenge: dummyTrigger('createAuthChallenge'),
customMessage: dummyTrigger('customMessage'),
defineAuthChallenge: dummyTrigger('defineAuthChallenge'),
postAuthentication: dummyTrigger('postAuthentication'),
postConfirmation: dummyTrigger('postConfirmation'),
preAuthentication: dummyTrigger('preAuthentication'),
preSignUp: dummyTrigger('preSignUp'),
preTokenGeneration: dummyTrigger('preTokenGeneration'),
userMigration: dummyTrigger('userMigration'),
verifyAuthChallengeResponse: dummyTrigger('verifyAuthChallengeResponse'),
},
});

@@ -62,2 +75,10 @@ new core_1.CfnOutput(stack, 'userpoolId', {

});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcudXNlci1wb29sLWV4cGxpY2l0LXByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWcudXNlci1wb29sLWV4cGxpY2l0LXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsd0NBQWdFO0FBQ2hFLGdDQUE4RztBQUU5RyxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQUcsRUFBRSxDQUFDO0FBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBSyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBRWhELE1BQU0sUUFBUSxHQUFHLElBQUksY0FBUSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUU7SUFDakQsWUFBWSxFQUFFLFlBQVk7SUFDMUIsY0FBYyxFQUFFO1FBQ2QsWUFBWSxFQUFFLDhDQUE4QztRQUM1RCxTQUFTLEVBQUUsb0ZBQW9GO1FBQy9GLFVBQVUsRUFBRSxxRkFBcUY7S0FDbEc7SUFDRCxpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLGdCQUFnQixFQUFFO1FBQ2hCLFNBQVMsRUFBRSw4REFBOEQ7UUFDekUsWUFBWSxFQUFFLGdEQUFnRDtRQUM5RCxVQUFVLEVBQUUsK0RBQStEO0tBQzVFO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsUUFBUSxFQUFFLElBQUk7UUFDZCxLQUFLLEVBQUUsSUFBSTtLQUNaO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFLElBQUk7UUFDWCxLQUFLLEVBQUUsSUFBSTtLQUNaO0lBQ0Qsa0JBQWtCLEVBQUU7UUFDbEIsUUFBUSxFQUFFLElBQUk7UUFDZCxLQUFLLEVBQUUsSUFBSTtLQUNaO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsa0JBQWtCLEVBQUUsSUFBSSxxQkFBZSxFQUFFO1FBQ3pDLHFCQUFxQixFQUFFLElBQUkscUJBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3RFLGtCQUFrQixFQUFFLElBQUkscUJBQWUsRUFBRTtRQUN6QyxxQkFBcUIsRUFBRSxJQUFJLHFCQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNoRSxtQkFBbUIsRUFBRSxJQUFJLHNCQUFnQixFQUFFO1FBQzNDLG9CQUFvQixFQUFFLElBQUksdUJBQWlCLEVBQUU7S0FDOUM7SUFDRCxHQUFHLEVBQUUsU0FBRyxDQUFDLFFBQVE7SUFDakIsZUFBZSxFQUFFO1FBQ2YsR0FBRyxFQUFFLElBQUk7UUFDVCxHQUFHLEVBQUUsSUFBSTtLQUNWO0lBQ0QsY0FBYyxFQUFFO1FBQ2Qsb0JBQW9CLEVBQUUsZUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdkMsU0FBUyxFQUFFLEVBQUU7UUFDYixhQUFhLEVBQUUsSUFBSTtRQUNuQixnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsY0FBYyxFQUFFLElBQUk7S0FDckI7SUFDRCxhQUFhLEVBQUU7UUFDYixJQUFJLEVBQUUsMEJBQTBCO1FBQ2hDLE9BQU8sRUFBRSwwQkFBMEI7S0FDcEM7Q0FDRixDQUFDLENBQUM7QUFFSCxJQUFJLGdCQUFTLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRTtJQUNqQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwLCBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgQm9vbGVhbkF0dHJpYnV0ZSwgRGF0ZVRpbWVBdHRyaWJ1dGUsIE1mYSwgTnVtYmVyQXR0cmlidXRlLCBTdHJpbmdBdHRyaWJ1dGUsIFVzZXJQb29sIH0gZnJvbSAnLi4vbGliJztcblxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnaW50ZWctdXNlci1wb29sJyk7XG5cbmNvbnN0IHVzZXJwb29sID0gbmV3IFVzZXJQb29sKHN0YWNrLCAnbXl1c2VycG9vbCcsIHtcbiAgdXNlclBvb2xOYW1lOiAnTXlVc2VyUG9vbCcsXG4gIHVzZXJJbnZpdGF0aW9uOiB7XG4gICAgZW1haWxTdWJqZWN0OiAnaW52aXRhdGlvbiBlbWFpbCBzdWJqZWN0IGZyb20gdGhlIGludGVnIHRlc3QnLFxuICAgIGVtYWlsQm9keTogJ2ludml0YXRpb24gZW1haWwgYm9keSBmcm9tIHRoZSBpbnRlZyB0ZXN0IGZvciB7dXNlcm5hbWV9LiBUZW1wIHBhc3N3b3JkIGlzIHsjIyMjfS4nLFxuICAgIHNtc01lc3NhZ2U6ICdpbnZpdGF0aW9uIHNtcyBtZXNzYWdlIGZyb20gdGhlIGludGVnIHRlc3QgZm9yIHt1c2VybmFtZX0uIFRlbXAgcGFzc3dvcmQgaXMgeyMjIyN9LicsXG4gIH0sXG4gIHNlbGZTaWduVXBFbmFibGVkOiB0cnVlLFxuICB1c2VyVmVyaWZpY2F0aW9uOiB7XG4gICAgZW1haWxCb2R5OiAndmVyaWZpY2F0aW9uIGVtYWlsIGJvZHkgZnJvbSB0aGUgaW50ZWcgdGVzdC4gQ29kZSBpcyB7IyMjI30uJyxcbiAgICBlbWFpbFN1YmplY3Q6ICd2ZXJpZmljYXRpb24gZW1haWwgc3ViamVjdCBmcm9tIHRoZSBpbnRlZyB0ZXN0JyxcbiAgICBzbXNNZXNzYWdlOiAndmVyaWZpY2F0aW9uIHNtcyBtZXNzYWdlIGZyb20gdGhlIGludGVnIHRlc3QuIENvZGUgaXMgeyMjIyN9LicsXG4gIH0sXG4gIHNpZ25JbkFsaWFzZXM6IHtcbiAgICB1c2VybmFtZTogdHJ1ZSxcbiAgICBlbWFpbDogdHJ1ZSxcbiAgfSxcbiAgYXV0b1ZlcmlmeToge1xuICAgIGVtYWlsOiB0cnVlLFxuICAgIHBob25lOiB0cnVlLFxuICB9LFxuICByZXF1aXJlZEF0dHJpYnV0ZXM6IHtcbiAgICBmdWxsbmFtZTogdHJ1ZSxcbiAgICBlbWFpbDogdHJ1ZSxcbiAgfSxcbiAgY3VzdG9tQXR0cmlidXRlczoge1xuICAgICdzb21lLXN0cmluZy1hdHRyJzogbmV3IFN0cmluZ0F0dHJpYnV0ZSgpLFxuICAgICdhbm90aGVyLXN0cmluZy1hdHRyJzogbmV3IFN0cmluZ0F0dHJpYnV0ZSh7IG1pbkxlbjogNCwgbWF4TGVuOiAxMDAgfSksXG4gICAgJ3NvbWUtbnVtYmVyLWF0dHInOiBuZXcgTnVtYmVyQXR0cmlidXRlKCksXG4gICAgJ2Fub3RoZXItbnVtYmVyLWF0dHInOiBuZXcgTnVtYmVyQXR0cmlidXRlKHsgbWluOiAxMCwgbWF4OiA1MCB9KSxcbiAgICAnc29tZS1ib29sZWFuLWF0dHInOiBuZXcgQm9vbGVhbkF0dHJpYnV0ZSgpLFxuICAgICdzb21lLWRhdGV0aW1lLWF0dHInOiBuZXcgRGF0ZVRpbWVBdHRyaWJ1dGUoKSxcbiAgfSxcbiAgbWZhOiBNZmEuUkVRVUlSRUQsXG4gIG1mYVNlY29uZEZhY3Rvcjoge1xuICAgIHNtczogdHJ1ZSxcbiAgICBvdHA6IHRydWUsXG4gIH0sXG4gIHBhc3N3b3JkUG9saWN5OiB7XG4gICAgdGVtcFBhc3N3b3JkVmFsaWRpdHk6IER1cmF0aW9uLmRheXMoMTApLFxuICAgIG1pbkxlbmd0aDogMTIsXG4gICAgcmVxdWlyZURpZ2l0czogdHJ1ZSxcbiAgICByZXF1aXJlTG93ZXJjYXNlOiB0cnVlLFxuICAgIHJlcXVpcmVVcHBlcmNhc2U6IHRydWUsXG4gICAgcmVxdWlyZVN5bWJvbHM6IHRydWUsXG4gIH0sXG4gIGVtYWlsU2V0dGluZ3M6IHtcbiAgICBmcm9tOiAnbm9yZXBseUBteWF3ZXNvbWVhcHAuY29tJyxcbiAgICByZXBseVRvOiAnc3VwcG9ydEBteWF3ZXNvbWVhcHAuY29tJyxcbiAgfSxcbn0pO1xuXG5uZXcgQ2ZuT3V0cHV0KHN0YWNrLCAndXNlcnBvb2xJZCcsIHtcbiAgdmFsdWU6IHVzZXJwb29sLnVzZXJQb29sSWRcbn0pOyJdfQ==
function dummyTrigger(name) {
return new aws_lambda_1.Function(stack, name, {
functionName: name,
handler: 'index.handler',
runtime: aws_lambda_1.Runtime.NODEJS_12_X,
code: aws_lambda_1.Code.fromInline('foo'),
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcudXNlci1wb29sLWV4cGxpY2l0LXByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWcudXNlci1wb29sLWV4cGxpY2l0LXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsb0RBQXlFO0FBQ3pFLHdDQUFnRTtBQUNoRSxnQ0FBOEc7QUFFOUcsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFHLEVBQUUsQ0FBQztBQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLFlBQUssQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUVoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQ2pELFlBQVksRUFBRSxZQUFZO0lBQzFCLGNBQWMsRUFBRTtRQUNkLFlBQVksRUFBRSw4Q0FBOEM7UUFDNUQsU0FBUyxFQUFFLG9GQUFvRjtRQUMvRixVQUFVLEVBQUUscUZBQXFGO0tBQ2xHO0lBQ0QsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixnQkFBZ0IsRUFBRTtRQUNoQixTQUFTLEVBQUUsOERBQThEO1FBQ3pFLFlBQVksRUFBRSxnREFBZ0Q7UUFDOUQsVUFBVSxFQUFFLCtEQUErRDtLQUM1RTtJQUNELGFBQWEsRUFBRTtRQUNiLFFBQVEsRUFBRSxJQUFJO1FBQ2QsS0FBSyxFQUFFLElBQUk7S0FDWjtJQUNELFVBQVUsRUFBRTtRQUNWLEtBQUssRUFBRSxJQUFJO1FBQ1gsS0FBSyxFQUFFLElBQUk7S0FDWjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsS0FBSyxFQUFFLElBQUk7S0FDWjtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLGtCQUFrQixFQUFFLElBQUkscUJBQWUsRUFBRTtRQUN6QyxxQkFBcUIsRUFBRSxJQUFJLHFCQUFlLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0RSxrQkFBa0IsRUFBRSxJQUFJLHFCQUFlLEVBQUU7UUFDekMscUJBQXFCLEVBQUUsSUFBSSxxQkFBZSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDaEUsbUJBQW1CLEVBQUUsSUFBSSxzQkFBZ0IsRUFBRTtRQUMzQyxvQkFBb0IsRUFBRSxJQUFJLHVCQUFpQixFQUFFO0tBQzlDO0lBQ0QsR0FBRyxFQUFFLFNBQUcsQ0FBQyxRQUFRO0lBQ2pCLGVBQWUsRUFBRTtRQUNmLEdBQUcsRUFBRSxJQUFJO1FBQ1QsR0FBRyxFQUFFLElBQUk7S0FDVjtJQUNELGNBQWMsRUFBRTtRQUNkLG9CQUFvQixFQUFFLGVBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLFNBQVMsRUFBRSxFQUFFO1FBQ2IsYUFBYSxFQUFFLElBQUk7UUFDbkIsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCLGNBQWMsRUFBRSxJQUFJO0tBQ3JCO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxPQUFPLEVBQUUsMEJBQTBCO0tBQ3BDO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLHFCQUFxQixDQUFDO1FBQ3hELGFBQWEsRUFBRSxZQUFZLENBQUMsZUFBZSxDQUFDO1FBQzVDLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztRQUN4RCxrQkFBa0IsRUFBRSxZQUFZLENBQUMsb0JBQW9CLENBQUM7UUFDdEQsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixDQUFDO1FBQ2xELGlCQUFpQixFQUFFLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztRQUNwRCxTQUFTLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxrQkFBa0IsRUFBRSxZQUFZLENBQUMsb0JBQW9CLENBQUM7UUFDdEQsYUFBYSxFQUFFLFlBQVksQ0FBQyxlQUFlLENBQUM7UUFDNUMsMkJBQTJCLEVBQUUsWUFBWSxDQUFDLDZCQUE2QixDQUFDO0tBQ3pFO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsSUFBSSxnQkFBUyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUU7SUFDakMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQzNCLENBQUMsQ0FBQztBQUVILFNBQVMsWUFBWSxDQUFDLElBQVk7SUFDaEMsT0FBTyxJQUFJLHFCQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtRQUMvQixZQUFZLEVBQUUsSUFBSTtRQUNsQixPQUFPLEVBQUUsZUFBZTtRQUN4QixPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1FBQzVCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7S0FDN0IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBJRnVuY3Rpb24sIFJ1bnRpbWUgfSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhJztcbmltcG9ydCB7IEFwcCwgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdAYXdzLWNkay9jb3JlJztcbmltcG9ydCB7IEJvb2xlYW5BdHRyaWJ1dGUsIERhdGVUaW1lQXR0cmlidXRlLCBNZmEsIE51bWJlckF0dHJpYnV0ZSwgU3RyaW5nQXR0cmlidXRlLCBVc2VyUG9vbCB9IGZyb20gJy4uL2xpYic7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbmNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ2ludGVnLXVzZXItcG9vbCcpO1xuXG5jb25zdCB1c2VycG9vbCA9IG5ldyBVc2VyUG9vbChzdGFjaywgJ215dXNlcnBvb2wnLCB7XG4gIHVzZXJQb29sTmFtZTogJ015VXNlclBvb2wnLFxuICB1c2VySW52aXRhdGlvbjoge1xuICAgIGVtYWlsU3ViamVjdDogJ2ludml0YXRpb24gZW1haWwgc3ViamVjdCBmcm9tIHRoZSBpbnRlZyB0ZXN0JyxcbiAgICBlbWFpbEJvZHk6ICdpbnZpdGF0aW9uIGVtYWlsIGJvZHkgZnJvbSB0aGUgaW50ZWcgdGVzdCBmb3Ige3VzZXJuYW1lfS4gVGVtcCBwYXNzd29yZCBpcyB7IyMjI30uJyxcbiAgICBzbXNNZXNzYWdlOiAnaW52aXRhdGlvbiBzbXMgbWVzc2FnZSBmcm9tIHRoZSBpbnRlZyB0ZXN0IGZvciB7dXNlcm5hbWV9LiBUZW1wIHBhc3N3b3JkIGlzIHsjIyMjfS4nLFxuICB9LFxuICBzZWxmU2lnblVwRW5hYmxlZDogdHJ1ZSxcbiAgdXNlclZlcmlmaWNhdGlvbjoge1xuICAgIGVtYWlsQm9keTogJ3ZlcmlmaWNhdGlvbiBlbWFpbCBib2R5IGZyb20gdGhlIGludGVnIHRlc3QuIENvZGUgaXMgeyMjIyN9LicsXG4gICAgZW1haWxTdWJqZWN0OiAndmVyaWZpY2F0aW9uIGVtYWlsIHN1YmplY3QgZnJvbSB0aGUgaW50ZWcgdGVzdCcsXG4gICAgc21zTWVzc2FnZTogJ3ZlcmlmaWNhdGlvbiBzbXMgbWVzc2FnZSBmcm9tIHRoZSBpbnRlZyB0ZXN0LiBDb2RlIGlzIHsjIyMjfS4nLFxuICB9LFxuICBzaWduSW5BbGlhc2VzOiB7XG4gICAgdXNlcm5hbWU6IHRydWUsXG4gICAgZW1haWw6IHRydWUsXG4gIH0sXG4gIGF1dG9WZXJpZnk6IHtcbiAgICBlbWFpbDogdHJ1ZSxcbiAgICBwaG9uZTogdHJ1ZSxcbiAgfSxcbiAgcmVxdWlyZWRBdHRyaWJ1dGVzOiB7XG4gICAgZnVsbG5hbWU6IHRydWUsXG4gICAgZW1haWw6IHRydWUsXG4gIH0sXG4gIGN1c3RvbUF0dHJpYnV0ZXM6IHtcbiAgICAnc29tZS1zdHJpbmctYXR0cic6IG5ldyBTdHJpbmdBdHRyaWJ1dGUoKSxcbiAgICAnYW5vdGhlci1zdHJpbmctYXR0cic6IG5ldyBTdHJpbmdBdHRyaWJ1dGUoeyBtaW5MZW46IDQsIG1heExlbjogMTAwIH0pLFxuICAgICdzb21lLW51bWJlci1hdHRyJzogbmV3IE51bWJlckF0dHJpYnV0ZSgpLFxuICAgICdhbm90aGVyLW51bWJlci1hdHRyJzogbmV3IE51bWJlckF0dHJpYnV0ZSh7IG1pbjogMTAsIG1heDogNTAgfSksXG4gICAgJ3NvbWUtYm9vbGVhbi1hdHRyJzogbmV3IEJvb2xlYW5BdHRyaWJ1dGUoKSxcbiAgICAnc29tZS1kYXRldGltZS1hdHRyJzogbmV3IERhdGVUaW1lQXR0cmlidXRlKCksXG4gIH0sXG4gIG1mYTogTWZhLlJFUVVJUkVELFxuICBtZmFTZWNvbmRGYWN0b3I6IHtcbiAgICBzbXM6IHRydWUsXG4gICAgb3RwOiB0cnVlLFxuICB9LFxuICBwYXNzd29yZFBvbGljeToge1xuICAgIHRlbXBQYXNzd29yZFZhbGlkaXR5OiBEdXJhdGlvbi5kYXlzKDEwKSxcbiAgICBtaW5MZW5ndGg6IDEyLFxuICAgIHJlcXVpcmVEaWdpdHM6IHRydWUsXG4gICAgcmVxdWlyZUxvd2VyY2FzZTogdHJ1ZSxcbiAgICByZXF1aXJlVXBwZXJjYXNlOiB0cnVlLFxuICAgIHJlcXVpcmVTeW1ib2xzOiB0cnVlLFxuICB9LFxuICBlbWFpbFNldHRpbmdzOiB7XG4gICAgZnJvbTogJ25vcmVwbHlAbXlhd2Vzb21lYXBwLmNvbScsXG4gICAgcmVwbHlUbzogJ3N1cHBvcnRAbXlhd2Vzb21lYXBwLmNvbScsXG4gIH0sXG4gIGxhbWJkYVRyaWdnZXJzOiB7XG4gICAgY3JlYXRlQXV0aENoYWxsZW5nZTogZHVtbXlUcmlnZ2VyKCdjcmVhdGVBdXRoQ2hhbGxlbmdlJyksXG4gICAgY3VzdG9tTWVzc2FnZTogZHVtbXlUcmlnZ2VyKCdjdXN0b21NZXNzYWdlJyksXG4gICAgZGVmaW5lQXV0aENoYWxsZW5nZTogZHVtbXlUcmlnZ2VyKCdkZWZpbmVBdXRoQ2hhbGxlbmdlJyksXG4gICAgcG9zdEF1dGhlbnRpY2F0aW9uOiBkdW1teVRyaWdnZXIoJ3Bvc3RBdXRoZW50aWNhdGlvbicpLFxuICAgIHBvc3RDb25maXJtYXRpb246IGR1bW15VHJpZ2dlcigncG9zdENvbmZpcm1hdGlvbicpLFxuICAgIHByZUF1dGhlbnRpY2F0aW9uOiBkdW1teVRyaWdnZXIoJ3ByZUF1dGhlbnRpY2F0aW9uJyksXG4gICAgcHJlU2lnblVwOiBkdW1teVRyaWdnZXIoJ3ByZVNpZ25VcCcpLFxuICAgIHByZVRva2VuR2VuZXJhdGlvbjogZHVtbXlUcmlnZ2VyKCdwcmVUb2tlbkdlbmVyYXRpb24nKSxcbiAgICB1c2VyTWlncmF0aW9uOiBkdW1teVRyaWdnZXIoJ3VzZXJNaWdyYXRpb24nKSxcbiAgICB2ZXJpZnlBdXRoQ2hhbGxlbmdlUmVzcG9uc2U6IGR1bW15VHJpZ2dlcigndmVyaWZ5QXV0aENoYWxsZW5nZVJlc3BvbnNlJyksXG4gIH0sXG59KTtcblxubmV3IENmbk91dHB1dChzdGFjaywgJ3VzZXJwb29sSWQnLCB7XG4gIHZhbHVlOiB1c2VycG9vbC51c2VyUG9vbElkXG59KTtcblxuZnVuY3Rpb24gZHVtbXlUcmlnZ2VyKG5hbWU6IHN0cmluZyk6IElGdW5jdGlvbiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb24oc3RhY2ssIG5hbWUsIHtcbiAgICBmdW5jdGlvbk5hbWU6IG5hbWUsXG4gICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzEyX1gsXG4gICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdmb28nKSxcbiAgfSk7XG59Il19

@@ -48,3 +48,2 @@ {

"EmailVerificationSubject": "Verify your new account",
"LambdaConfig": {},
"SmsConfiguration": {

@@ -51,0 +50,0 @@ "ExternalId": "integuserpoolmyuserpoolDA38443C",

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = require("@aws-cdk/assert");
require("@aws-cdk/assert/jest");

@@ -10,3 +11,3 @@ const core_1 = require("@aws-cdk/core");

const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool', {});
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN

@@ -17,7 +18,238 @@ new lib_1.UserPoolClient(stack, 'Client', {

// THEN
expect(stack).toHaveResource('AWS::Cognito::UserPoolClient', {
UserPoolId: stack.resolve(pool.userPoolId),
});
});
test('client name', () => {
// GIVEN
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN
const client1 = new lib_1.UserPoolClient(stack, 'Client1', {
userPool: pool,
userPoolClientName: 'myclient'
});
const client2 = new lib_1.UserPoolClient(stack, 'Client2', {
userPool: pool,
});
// THEN
expect(client1.userPoolClientName).toEqual('myclient');
expect(() => client2.userPoolClientName).toThrow(/available only if specified on the UserPoolClient during initialization/);
});
test('import', () => {
// GIVEN
const stack = new core_1.Stack();
// WHEN
const client = lib_1.UserPoolClient.fromUserPoolClientId(stack, 'Client', 'client-id-1');
// THEN
expect(client.userPoolClientId).toEqual('client-id-1');
});
test('ExplicitAuthFlows is absent by default', () => {
// GIVEN
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN
pool.addClient('Client');
// THEN
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
UserPoolId: stack.resolve(pool.userPoolId)
ExplicitAuthFlows: assert_1.ABSENT,
});
});
test('ExplicitAuthFlows are correctly named', () => {
// GIVEN
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN
pool.addClient('Client', {
authFlows: {
adminUserPassword: true,
custom: true,
refreshToken: true,
userPassword: true,
userSrp: true,
}
});
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
ExplicitAuthFlows: [
'ALLOW_USER_PASSWORD_AUTH',
'ALLOW_ADMIN_USER_PASSWORD_AUTH',
'ALLOW_CUSTOM_AUTH',
'ALLOW_USER_SRP_AUTH',
'ALLOW_REFRESH_TOKEN_AUTH',
],
});
});
test('AllowedOAuthFlows is absent by default', () => {
// GIVEN
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN
pool.addClient('Client');
// THEN
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
AllowedOAuthFlows: assert_1.ABSENT,
});
});
test('AllowedOAuthFlows are correctly named', () => {
// GIVEN
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN
pool.addClient('Client1', {
oAuth: {
flows: {
authorizationCodeGrant: true,
implicitCodeGrant: true,
},
callbackUrls: ['redirect-url'],
scopes: [lib_1.OAuthScope.PHONE],
},
});
pool.addClient('Client2', {
oAuth: {
flows: {
clientCredentials: true,
},
callbackUrls: ['redirect-url'],
scopes: [lib_1.OAuthScope.PHONE],
},
});
// THEN
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
AllowedOAuthFlows: ['implicit', 'code'],
AllowedOAuthFlowsUserPoolClient: true,
});
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
AllowedOAuthFlows: ['client_credentials'],
AllowedOAuthFlowsUserPoolClient: true,
});
});
test('fails when callbackUrls are not specified for codeGrant or implicitGrant', () => {
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
expect(() => pool.addClient('Client1', {
oAuth: {
flows: { authorizationCodeGrant: true },
scopes: [lib_1.OAuthScope.PHONE],
}
})).toThrow(/callbackUrl must be specified/);
expect(() => pool.addClient('Client2', {
oAuth: {
flows: { implicitCodeGrant: true },
scopes: [lib_1.OAuthScope.PHONE],
},
})).toThrow(/callbackUrl must be specified/);
expect(() => pool.addClient('Client3', {
oAuth: {
flows: { clientCredentials: true },
scopes: [lib_1.OAuthScope.PHONE],
}
})).not.toThrow();
});
test('fails when clientCredentials OAuth flow is selected along with codeGrant or implicitGrant', () => {
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
expect(() => pool.addClient('Client1', {
oAuth: {
flows: {
authorizationCodeGrant: true,
clientCredentials: true,
},
callbackUrls: ['redirect-url'],
scopes: [lib_1.OAuthScope.PHONE],
},
})).toThrow(/clientCredentials OAuth flow cannot be selected/);
expect(() => pool.addClient('Client2', {
oAuth: {
flows: {
implicitCodeGrant: true,
clientCredentials: true,
},
callbackUrls: ['redirect-url'],
scopes: [lib_1.OAuthScope.PHONE],
},
})).toThrow(/clientCredentials OAuth flow cannot be selected/);
});
test('OAuth scopes', () => {
// GIVEN
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN
pool.addClient('Client', {
oAuth: {
flows: { clientCredentials: true, },
scopes: [
lib_1.OAuthScope.PHONE,
lib_1.OAuthScope.EMAIL,
lib_1.OAuthScope.OPENID,
lib_1.OAuthScope.PROFILE,
lib_1.OAuthScope.COGNITO_ADMIN,
lib_1.OAuthScope.custom('my-resource-server/my-own-scope'),
],
},
});
// THEN
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
AllowedOAuthScopes: [
'phone',
'email',
'openid',
'profile',
'aws.cognito.signin.user.admin',
'my-resource-server/my-own-scope'
],
});
});
test('OAuthScope - openid is included when email or phone is specified', () => {
// GIVEN
const stack = new core_1.Stack();
const pool = new lib_1.UserPool(stack, 'Pool');
// WHEN
pool.addClient('Client1', {
userPoolClientName: 'Client1',
oAuth: {
flows: { clientCredentials: true, },
scopes: [lib_1.OAuthScope.PHONE,],
},
});
pool.addClient('Client2', {
userPoolClientName: 'Client2',
oAuth: {
flows: { clientCredentials: true, },
scopes: [lib_1.OAuthScope.EMAIL,],
},
});
pool.addClient('Client3', {
userPoolClientName: 'Client3',
oAuth: {
flows: { clientCredentials: true, },
scopes: [lib_1.OAuthScope.PROFILE,],
},
});
pool.addClient('Client4', {
userPoolClientName: 'Client4',
oAuth: {
flows: { clientCredentials: true, },
scopes: [lib_1.OAuthScope.COGNITO_ADMIN,],
},
});
// THEN
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
ClientName: 'Client1',
AllowedOAuthScopes: ['phone', 'openid',],
});
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
ClientName: 'Client2',
AllowedOAuthScopes: ['email', 'openid',],
});
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
ClientName: 'Client3',
AllowedOAuthScopes: ['profile', 'openid',],
});
expect(stack).toHaveResourceLike('AWS::Cognito::UserPoolClient', {
ClientName: 'Client4',
AllowedOAuthScopes: ['aws.cognito.signin.user.admin'],
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wb29sLWNsaWVudC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidXNlci1wb29sLWNsaWVudC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsZ0NBQThCO0FBQzlCLHdDQUFzQztBQUN0QyxnQ0FBa0Q7QUFFbEQsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUN6QixRQUFRO1FBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFLLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLGNBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUcsQ0FBQyxDQUFDO1FBRTlDLE9BQU87UUFDUCxJQUFJLG9CQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNsQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILE9BQU87UUFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsOEJBQThCLEVBQUU7WUFDL0QsVUFBVSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdAYXdzLWNkay9hc3NlcnQvamVzdCc7XG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgVXNlclBvb2wsIFVzZXJQb29sQ2xpZW50IH0gZnJvbSAnLi4vbGliJztcblxuZGVzY3JpYmUoJ1VzZXIgUG9vbCBDbGllbnQnLCAoKSA9PiB7XG4gIHRlc3QoJ2RlZmF1bHQgc2V0dXAnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHBvb2wgPSBuZXcgVXNlclBvb2woc3RhY2ssICdQb29sJywgeyB9KTtcblxuICAgIC8vIFdIRU5cbiAgICBuZXcgVXNlclBvb2xDbGllbnQoc3RhY2ssICdDbGllbnQnLCB7XG4gICAgICB1c2VyUG9vbDogcG9vbFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sQ2xpZW50Jywge1xuICAgICAgVXNlclBvb2xJZDogc3RhY2sucmVzb2x2ZShwb29sLnVzZXJQb29sSWQpXG4gICAgfSk7XG4gIH0pO1xufSk7Il19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wb29sLWNsaWVudC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidXNlci1wb29sLWNsaWVudC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNENBQXlDO0FBQ3pDLGdDQUE4QjtBQUM5Qix3Q0FBc0M7QUFDdEMsZ0NBQThEO0FBRTlELFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDekIsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBSyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLE9BQU87UUFDUCxJQUFJLG9CQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNsQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILE9BQU87UUFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLDhCQUE4QixFQUFFO1lBQzNELFVBQVUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDM0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUN2QixRQUFRO1FBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFLLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLGNBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekMsT0FBTztRQUNQLE1BQU0sT0FBTyxHQUFHLElBQUksb0JBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ25ELFFBQVEsRUFBRSxJQUFJO1lBQ2Qsa0JBQWtCLEVBQUUsVUFBVTtTQUMvQixDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJ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QUc7YUFDaEM7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtZQUN4QixrQkFBa0IsRUFBRSxTQUFTO1lBQzdCLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEdBQUc7Z0JBQ25DLE1BQU0sRUFBRSxDQUFFLGdCQUFVLENBQUMsYUFBYSxFQUFHO2FBQ3RDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTztRQUNQLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyw4QkFBOEIsRUFBRTtZQUMvRCxVQUFVLEVBQUUsU0FBUztZQUNyQixrQkFBa0IsRUFBRSxDQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUc7U0FDM0MsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLDhCQUE4QixFQUFFO1lBQy9ELFVBQVUsRUFBRSxTQUFTO1lBQ3JCLGtCQUFrQixFQUFFLENBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRztTQUMzQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsOEJBQThCLEVBQUU7WUFDL0QsVUFBVSxFQUFFLFNBQVM7WUFDckIsa0JBQWtCLEVBQUUsQ0FBRSxTQUFTLEVBQUUsUUFBUSxFQUFHO1NBQzdDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyw4QkFBOEIsRUFBRTtZQUMvRCxVQUFVLEVBQUUsU0FBUztZQUNyQixrQkFBa0IsRUFBRSxDQUFFLCtCQUErQixDQUFFO1NBQ3hELENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBQlNFTlQgfSBmcm9tICdAYXdzLWNkay9hc3NlcnQnO1xuaW1wb3J0ICdAYXdzLWNkay9hc3NlcnQvamVzdCc7XG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgT0F1dGhTY29wZSwgVXNlclBvb2wsIFVzZXJQb29sQ2xpZW50IH0gZnJvbSAnLi4vbGliJztcblxuZGVzY3JpYmUoJ1VzZXIgUG9vbCBDbGllbnQnLCAoKSA9PiB7XG4gIHRlc3QoJ2RlZmF1bHQgc2V0dXAnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHBvb2wgPSBuZXcgVXNlclBvb2woc3RhY2ssICdQb29sJyk7XG5cbiAgICAvLyBXSEVOXG4gICAgbmV3IFVzZXJQb29sQ2xpZW50KHN0YWNrLCAnQ2xpZW50Jywge1xuICAgICAgdXNlclBvb2w6IHBvb2xcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sQ2xpZW50Jywge1xuICAgICAgVXNlclBvb2xJZDogc3RhY2sucmVzb2x2ZShwb29sLnVzZXJQb29sSWQpLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdjbGllbnQgbmFtZScsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgY29uc3QgcG9vbCA9IG5ldyBVc2VyUG9vbChzdGFjaywgJ1Bvb2wnKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBjbGllbnQxID0gbmV3IFVzZXJQb29sQ2xpZW50KHN0YWNrLCAnQ2xpZW50MScsIHtcbiAgICAgIHVzZXJQb29sOiBwb29sLFxuICAgICAgdXNlclBvb2xDbGllbnROYW1lOiAnbXljbGllbnQnXG4gICAgfSk7XG4gICAgY29uc3QgY2xpZW50MiA9IG5ldyBVc2VyUG9vbENsaWVudChzdGFjaywgJ0NsaWVudDInLCB7XG4gICAgICB1c2VyUG9vbDogcG9vbCxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QoY2xpZW50MS51c2VyUG9vbENsaWVudE5hbWUpLnRvRXF1YWwoJ215Y2xpZW50Jyk7XG4gICAgZXhwZWN0KCgpID0+IGNsaWVudDIudXNlclBvb2xDbGllbnROYW1lKS50b1Rocm93KC9hdmFpbGFibGUgb25seSBpZiBzcGVjaWZpZWQgb24gdGhlIFVzZXJQb29sQ2xpZW50IGR1cmluZyBpbml0aWFsaXphdGlvbi8pO1xuICB9KTtcblxuICB0ZXN0KCdpbXBvcnQnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGNsaWVudCA9IFVzZXJQb29sQ2xpZW50LmZyb21Vc2VyUG9vbENsaWVudElkKHN0YWNrLCAnQ2xpZW50JywgJ2NsaWVudC1pZC0xJyk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KGNsaWVudC51c2VyUG9vbENsaWVudElkKS50b0VxdWFsKCdjbGllbnQtaWQtMScpO1xuICB9KTtcblxuICB0ZXN0KCdFeHBsaWNpdEF1dGhGbG93cyBpcyBhYnNlbnQgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgY29uc3QgcG9vbCA9IG5ldyBVc2VyUG9vbChzdGFjaywgJ1Bvb2wnKTtcblxuICAgIC8vIFdIRU5cbiAgICBwb29sLmFkZENsaWVudCgnQ2xpZW50Jyk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6Q29nbml0bzo6VXNlclBvb2xDbGllbnQnLCB7XG4gICAgICBFeHBsaWNpdEF1dGhGbG93czogQUJTRU5ULFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdFeHBsaWNpdEF1dGhGbG93cyBhcmUgY29ycmVjdGx5IG5hbWVkJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBjb25zdCBwb29sID0gbmV3IFVzZXJQb29sKHN0YWNrLCAnUG9vbCcpO1xuXG4gICAgLy8gV0hFTlxuICAgIHBvb2wuYWRkQ2xpZW50KCdDbGllbnQnLCB7XG4gICAgICBhdXRoRmxvd3M6IHtcbiAgICAgICAgYWRtaW5Vc2VyUGFzc3dvcmQ6IHRydWUsXG4gICAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgICAgcmVmcmVzaFRva2VuOiB0cnVlLFxuICAgICAgICB1c2VyUGFzc3dvcmQ6IHRydWUsXG4gICAgICAgIHVzZXJTcnA6IHRydWUsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIHtcbiAgICAgIEV4cGxpY2l0QXV0aEZsb3dzOiBbXG4gICAgICAgICdBTExPV19VU0VSX1BBU1NXT1JEX0FVVEgnLFxuICAgICAgICAnQUxMT1dfQURNSU5fVVNFUl9QQVNTV09SRF9BVVRIJyxcbiAgICAgICAgJ0FMTE9XX0NVU1RPTV9BVVRIJyxcbiAgICAgICAgJ0FMTE9XX1VTRVJfU1JQX0FVVEgnLFxuICAgICAgICAnQUxMT1dfUkVGUkVTSF9UT0tFTl9BVVRIJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ0FsbG93ZWRPQXV0aEZsb3dzIGlzIGFic2VudCBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBjb25zdCBwb29sID0gbmV3IFVzZXJQb29sKHN0YWNrLCAnUG9vbCcpO1xuXG4gICAgLy8gV0hFTlxuICAgIHBvb2wuYWRkQ2xpZW50KCdDbGllbnQnKTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIHtcbiAgICAgIEFsbG93ZWRPQXV0aEZsb3dzOiBBQlNFTlQsXG4gICAgICAvLyBBbGxvd2VkT0F1dGhGbG93c1VzZXJQb29sQ2xpZW50OiBBQlNFTlQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ0FsbG93ZWRPQXV0aEZsb3dzIGFyZSBjb3JyZWN0bHkgbmFtZWQnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHBvb2wgPSBuZXcgVXNlclBvb2woc3RhY2ssICdQb29sJyk7XG5cbiAgICAvLyBXSEVOXG4gICAgcG9vbC5hZGRDbGllbnQoJ0NsaWVudDEnLCB7XG4gICAgICBvQXV0aDoge1xuICAgICAgICBmbG93czoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb25Db2RlR3JhbnQ6IHRydWUsXG4gICAgICAgICAgaW1wbGljaXRDb2RlR3JhbnQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxiYWNrVXJsczogWyAncmVkaXJlY3QtdXJsJyBdLFxuICAgICAgICBzY29wZXM6IFsgT0F1dGhTY29wZS5QSE9ORSBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwb29sLmFkZENsaWVudCgnQ2xpZW50MicsIHtcbiAgICAgIG9BdXRoOiB7XG4gICAgICAgIGZsb3dzOiB7XG4gICAgICAgICAgY2xpZW50Q3JlZGVudGlhbHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxiYWNrVXJsczogWyAncmVkaXJlY3QtdXJsJyBdLFxuICAgICAgICBzY29wZXM6IFsgT0F1dGhTY29wZS5QSE9ORSBdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIHtcbiAgICAgIEFsbG93ZWRPQXV0aEZsb3dzOiBbICdpbXBsaWNpdCcsICdjb2RlJyBdLFxuICAgICAgQWxsb3dlZE9BdXRoRmxvd3NVc2VyUG9vbENsaWVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sQ2xpZW50Jywge1xuICAgICAgQWxsb3dlZE9BdXRoRmxvd3M6IFsgJ2NsaWVudF9jcmVkZW50aWFscycgXSxcbiAgICAgIEFsbG93ZWRPQXV0aEZsb3dzVXNlclBvb2xDbGllbnQ6IHRydWUsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIHdoZW4gY2FsbGJhY2tVcmxzIGFyZSBub3Qgc3BlY2lmaWVkIGZvciBjb2RlR3JhbnQgb3IgaW1wbGljaXRHcmFudCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHBvb2wgPSBuZXcgVXNlclBvb2woc3RhY2ssICdQb29sJyk7XG5cbiAgICBleHBlY3QoKCkgPT4gcG9vbC5hZGRDbGllbnQoJ0NsaWVudDEnLCB7XG4gICAgICBvQXV0aDoge1xuICAgICAgICBmbG93czogeyBhdXRob3JpemF0aW9uQ29kZUdyYW50OiB0cnVlIH0sXG4gICAgICAgIHNjb3BlczogWyBPQXV0aFNjb3BlLlBIT05FIF0sXG4gICAgICB9XG4gICAgfSkpLnRvVGhyb3coL2NhbGxiYWNrVXJsIG11c3QgYmUgc3BlY2lmaWVkLyk7XG5cbiAgICBleHBlY3QoKCkgPT4gcG9vbC5hZGRDbGllbnQoJ0NsaWVudDInLCB7XG4gICAgICBvQXV0aDoge1xuICAgICAgICBmbG93czogeyBpbXBsaWNpdENvZGVHcmFudDogdHJ1ZSB9LFxuICAgICAgICBzY29wZXM6IFsgT0F1dGhTY29wZS5QSE9ORSBdLFxuICAgICAgfSxcbiAgICB9KSkudG9UaHJvdygvY2FsbGJhY2tVcmwgbXVzdCBiZSBzcGVjaWZpZWQvKTtcblxuICAgIGV4cGVjdCgoKSA9PiBwb29sLmFkZENsaWVudCgnQ2xpZW50MycsIHtcbiAgICAgIG9BdXRoOiB7XG4gICAgICAgIGZsb3dzOiB7IGNsaWVudENyZWRlbnRpYWxzOiB0cnVlIH0sXG4gICAgICAgIHNjb3BlczogWyBPQXV0aFNjb3BlLlBIT05FIF0sXG4gICAgICB9XG4gICAgfSkpLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIHdoZW4gY2xpZW50Q3JlZGVudGlhbHMgT0F1dGggZmxvdyBpcyBzZWxlY3RlZCBhbG9uZyB3aXRoIGNvZGVHcmFudCBvciBpbXBsaWNpdEdyYW50JywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgY29uc3QgcG9vbCA9IG5ldyBVc2VyUG9vbChzdGFjaywgJ1Bvb2wnKTtcblxuICAgIGV4cGVjdCgoKSA9PiBwb29sLmFkZENsaWVudCgnQ2xpZW50MScsIHtcbiAgICAgIG9BdXRoOiB7XG4gICAgICAgIGZsb3dzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbkNvZGVHcmFudDogdHJ1ZSxcbiAgICAgICAgICBjbGllbnRDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsbGJhY2tVcmxzOiBbICdyZWRpcmVjdC11cmwnIF0sXG4gICAgICAgIHNjb3BlczogWyBPQXV0aFNjb3BlLlBIT05FIF0sXG4gICAgICB9LFxuICAgIH0pKS50b1Rocm93KC9jbGllbnRDcmVkZW50aWFscyBPQXV0aCBmbG93IGNhbm5vdCBiZSBzZWxlY3RlZC8pO1xuXG4gICAgZXhwZWN0KCgpID0+IHBvb2wuYWRkQ2xpZW50KCdDbGllbnQyJywge1xuICAgICAgb0F1dGg6IHtcbiAgICAgICAgZmxvd3M6IHtcbiAgICAgICAgICBpbXBsaWNpdENvZGVHcmFudDogdHJ1ZSxcbiAgICAgICAgICBjbGllbnRDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsbGJhY2tVcmxzOiBbICdyZWRpcmVjdC11cmwnIF0sXG4gICAgICAgIHNjb3BlczogWyBPQXV0aFNjb3BlLlBIT05FIF0sXG4gICAgICB9LFxuICAgIH0pKS50b1Rocm93KC9jbGllbnRDcmVkZW50aWFscyBPQXV0aCBmbG93IGNhbm5vdCBiZSBzZWxlY3RlZC8pO1xuICB9KTtcblxuICB0ZXN0KCdPQXV0aCBzY29wZXMnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHBvb2wgPSBuZXcgVXNlclBvb2woc3RhY2ssICdQb29sJyk7XG5cbiAgICAvLyBXSEVOXG4gICAgcG9vbC5hZGRDbGllbnQoJ0NsaWVudCcsIHtcbiAgICAgIG9BdXRoOiB7XG4gICAgICAgIGZsb3dzOiB7IGNsaWVudENyZWRlbnRpYWxzOiB0cnVlLCB9LFxuICAgICAgICBzY29wZXM6IFtcbiAgICAgICAgICBPQXV0aFNjb3BlLlBIT05FLFxuICAgICAgICAgIE9BdXRoU2NvcGUuRU1BSUwsXG4gICAgICAgICAgT0F1dGhTY29wZS5PUEVOSUQsXG4gICAgICAgICAgT0F1dGhTY29wZS5QUk9GSUxFLFxuICAgICAgICAgIE9BdXRoU2NvcGUuQ09HTklUT19BRE1JTixcbiAgICAgICAgICBPQXV0aFNjb3BlLmN1c3RvbSgnbXktcmVzb3VyY2Utc2VydmVyL215LW93bi1zY29wZScpLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIHtcbiAgICAgIEFsbG93ZWRPQXV0aFNjb3BlczogW1xuICAgICAgICAncGhvbmUnLFxuICAgICAgICAnZW1haWwnLFxuICAgICAgICAnb3BlbmlkJyxcbiAgICAgICAgJ3Byb2ZpbGUnLFxuICAgICAgICAnYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4nLFxuICAgICAgICAnbXktcmVzb3VyY2Utc2VydmVyL215LW93bi1zY29wZSdcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ09BdXRoU2NvcGUgLSBvcGVuaWQgaXMgaW5jbHVkZWQgd2hlbiBlbWFpbCBvciBwaG9uZSBpcyBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHBvb2wgPSBuZXcgVXNlclBvb2woc3RhY2ssICdQb29sJyk7XG5cbiAgICAvLyBXSEVOXG4gICAgcG9vbC5hZGRDbGllbnQoJ0NsaWVudDEnLCB7XG4gICAgICB1c2VyUG9vbENsaWVudE5hbWU6ICdDbGllbnQxJyxcbiAgICAgIG9BdXRoOiB7XG4gICAgICAgIGZsb3dzOiB7IGNsaWVudENyZWRlbnRpYWxzOiB0cnVlLCB9LFxuICAgICAgICBzY29wZXM6IFsgT0F1dGhTY29wZS5QSE9ORSwgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcG9vbC5hZGRDbGllbnQoJ0NsaWVudDInLCB7XG4gICAgICB1c2VyUG9vbENsaWVudE5hbWU6ICdDbGllbnQyJyxcbiAgICAgIG9BdXRoOiB7XG4gICAgICAgIGZsb3dzOiB7IGNsaWVudENyZWRlbnRpYWxzOiB0cnVlLCB9LFxuICAgICAgICBzY29wZXM6IFsgT0F1dGhTY29wZS5FTUFJTCwgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcG9vbC5hZGRDbGllbnQoJ0NsaWVudDMnLCB7XG4gICAgICB1c2VyUG9vbENsaWVudE5hbWU6ICdDbGllbnQzJyxcbiAgICAgIG9BdXRoOiB7XG4gICAgICAgIGZsb3dzOiB7IGNsaWVudENyZWRlbnRpYWxzOiB0cnVlLCB9LFxuICAgICAgICBzY29wZXM6IFsgT0F1dGhTY29wZS5QUk9GSUxFLCBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwb29sLmFkZENsaWVudCgnQ2xpZW50NCcsIHtcbiAgICAgIHVzZXJQb29sQ2xpZW50TmFtZTogJ0NsaWVudDQnLFxuICAgICAgb0F1dGg6IHtcbiAgICAgICAgZmxvd3M6IHsgY2xpZW50Q3JlZGVudGlhbHM6IHRydWUsIH0sXG4gICAgICAgIHNjb3BlczogWyBPQXV0aFNjb3BlLkNPR05JVE9fQURNSU4sIF0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sQ2xpZW50Jywge1xuICAgICAgQ2xpZW50TmFtZTogJ0NsaWVudDEnLFxuICAgICAgQWxsb3dlZE9BdXRoU2NvcGVzOiBbICdwaG9uZScsICdvcGVuaWQnLCBdLFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sQ2xpZW50Jywge1xuICAgICAgQ2xpZW50TmFtZTogJ0NsaWVudDInLFxuICAgICAgQWxsb3dlZE9BdXRoU2NvcGVzOiBbICdlbWFpbCcsICdvcGVuaWQnLCBdLFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sQ2xpZW50Jywge1xuICAgICAgQ2xpZW50TmFtZTogJ0NsaWVudDMnLFxuICAgICAgQWxsb3dlZE9BdXRoU2NvcGVzOiBbICdwcm9maWxlJywgJ29wZW5pZCcsIF0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6Q29nbml0bzo6VXNlclBvb2xDbGllbnQnLCB7XG4gICAgICBDbGllbnROYW1lOiAnQ2xpZW50NCcsXG4gICAgICBBbGxvd2VkT0F1dGhTY29wZXM6IFsgJ2F3cy5jb2duaXRvLnNpZ25pbi51c2VyLmFkbWluJyBdLFxuICAgIH0pO1xuICB9KTtcbn0pOyJdfQ==

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc