diff --git a/packages/@aws-cdk-testing/cli-integ/lib/aws.ts b/packages/@aws-cdk-testing/cli-integ/lib/aws.ts index bcf19f4a47e3f..ff62196022b1a 100644 --- a/packages/@aws-cdk-testing/cli-integ/lib/aws.ts +++ b/packages/@aws-cdk-testing/cli-integ/lib/aws.ts @@ -1,7 +1,32 @@ -import * as AWS from 'aws-sdk'; - -// eslint-disable-next-line @typescript-eslint/no-require-imports -require('aws-sdk/lib/maintenance_mode_message').suppress = true; +import { + CloudFormationClient, + DeleteStackCommand, + DescribeStacksCommand, + UpdateTerminationProtectionCommand, + Stack, +} from '@aws-sdk/client-cloudformation'; +import { DeleteRepositoryCommand, ECRClient } from '@aws-sdk/client-ecr'; +import { ECSClient } from '@aws-sdk/client-ecs'; +import { IAMClient } from '@aws-sdk/client-iam'; +import { LambdaClient } from '@aws-sdk/client-lambda'; +import { + S3Client, + DeleteObjectsCommand, + ListObjectVersionsCommand, + ObjectIdentifier, + DeleteBucketCommand, +} from '@aws-sdk/client-s3'; +import { SNSClient } from '@aws-sdk/client-sns'; +import { SSOClient } from '@aws-sdk/client-sso'; +import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts'; +import { fromIni } from '@aws-sdk/credential-providers'; +import { AwsCredentialIdentityProvider } from '@smithy/types'; +import { ConfiguredRetryStrategy } from '@smithy/util-retry'; +interface ClientConfig { + readonly credentials?: AwsCredentialIdentityProvider; + readonly region: string; + readonly retryStrategy: ConfiguredRetryStrategy; +} export class AwsClients { public static async default(output: NodeJS.WritableStream) { @@ -13,55 +38,65 @@ export class AwsClients { return new AwsClients(region, output); } - private readonly config: any; + private readonly config: ClientConfig; - public readonly cloudFormation: AwsCaller; - public readonly s3: AwsCaller; - public readonly ecr: AwsCaller; - public readonly ecs: AwsCaller; - public readonly sso: AwsCaller; - public readonly sns: AwsCaller; - public readonly iam: AwsCaller; - public readonly lambda: AwsCaller; - public readonly sts: AwsCaller; + public readonly cloudFormation: CloudFormationClient; + public readonly s3: S3Client; + public readonly ecr: ECRClient; + public readonly ecs: ECSClient; + public readonly sso: SSOClient; + public readonly sns: SNSClient; + public readonly iam: IAMClient; + public readonly lambda: LambdaClient; + public readonly sts: STSClient; constructor(public readonly region: string, private readonly output: NodeJS.WritableStream) { this.config = { credentials: chainableCredentials(this.region), region: this.region, - maxRetries: 8, - retryDelayOptions: { base: 500 }, - stsRegionalEndpoints: 'regional', + retryStrategy: new ConfiguredRetryStrategy(9, (attempt: number) => attempt ** 500), }; - this.cloudFormation = makeAwsCaller(AWS.CloudFormation, this.config); - this.s3 = makeAwsCaller(AWS.S3, this.config); - this.ecr = makeAwsCaller(AWS.ECR, this.config); - this.ecs = makeAwsCaller(AWS.ECS, this.config); - this.sso = makeAwsCaller(AWS.SSO, this.config); - this.sns = makeAwsCaller(AWS.SNS, this.config); - this.iam = makeAwsCaller(AWS.IAM, this.config); - this.lambda = makeAwsCaller(AWS.Lambda, this.config); - this.sts = makeAwsCaller(AWS.STS, this.config); + this.cloudFormation = new CloudFormationClient(this.config); + this.s3 = new S3Client(this.config); + this.ecr = new ECRClient(this.config); + this.ecs = new ECSClient(this.config); + this.sso = new SSOClient(this.config); + this.sns = new SNSClient(this.config); + this.iam = new IAMClient(this.config); + this.lambda = new LambdaClient(this.config); + this.sts = new STSClient(this.config); } public async account(): Promise { // Reduce # of retries, we use this as a circuit breaker for detecting no-config - return (await new AWS.STS({ ...this.config, maxRetries: 1 }).getCallerIdentity().promise()).Account!; + const stsClient = new STSClient({ + credentials: this.config.credentials, + region: this.config.region, + maxAttempts: 2, + }); + + return (await stsClient.send(new GetCallerIdentityCommand())).Account!; } public async deleteStacks(...stackNames: string[]) { - if (stackNames.length === 0) { return; } + if (stackNames.length === 0) { + return; + } // We purposely do all stacks serially, because they've been ordered // to do the bootstrap stack last. for (const stackName of stackNames) { - await this.cloudFormation('updateTerminationProtection', { - EnableTerminationProtection: false, - StackName: stackName, - }); - await this.cloudFormation('deleteStack', { - StackName: stackName, - }); + await this.cloudFormation.send( + new UpdateTerminationProtectionCommand({ + EnableTerminationProtection: false, + StackName: stackName, + }), + ); + await this.cloudFormation.send( + new DeleteStackCommand({ + StackName: stackName, + }), + ); await retry(this.output, `Deleting ${stackName}`, retry.forSeconds(600), async () => { const status = await this.stackStatus(stackName); @@ -69,7 +104,7 @@ export class AwsClients { throw retry.abort(new Error(`'${stackName}' is in state '${status}'`)); } if (status !== undefined) { - throw new Error(`Delete of '${stackName}' not complete yet`); + throw new Error(`Delete of '${stackName}' not complete yet, status: '${status}'`); } }); } @@ -77,120 +112,79 @@ export class AwsClients { public async stackStatus(stackName: string): Promise { try { - return (await this.cloudFormation('describeStacks', { StackName: stackName })).Stacks?.[0].StackStatus; + return ( + await this.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackName, + }), + ) + ).Stacks?.[0].StackStatus; } catch (e: any) { - if (isStackMissingError(e)) { return undefined; } + if (isStackMissingError(e)) { + return undefined; + } throw e; } } public async emptyBucket(bucketName: string) { - const objects = await this.s3('listObjectVersions', { Bucket: bucketName }); - const deletes = [...objects.Versions || [], ...objects.DeleteMarkers || []] - .reduce((acc, obj) => { - if (typeof obj.VersionId !== 'undefined' && typeof obj.Key !== 'undefined') { - acc.push({ Key: obj.Key, VersionId: obj.VersionId }); - } else if (typeof obj.Key !== 'undefined') { - acc.push({ Key: obj.Key }); - } - return acc; - }, [] as AWS.S3.ObjectIdentifierList); + const objects = await this.s3.send( + new ListObjectVersionsCommand({ + Bucket: bucketName, + }), + ); + + const deletes = [...(objects.Versions || []), ...(objects.DeleteMarkers || [])].reduce((acc, obj) => { + if (typeof obj.VersionId !== 'undefined' && typeof obj.Key !== 'undefined') { + acc.push({ Key: obj.Key, VersionId: obj.VersionId }); + } else if (typeof obj.Key !== 'undefined') { + acc.push({ Key: obj.Key }); + } + return acc; + }, [] as ObjectIdentifier[]); + if (deletes.length === 0) { return Promise.resolve(); } - return this.s3('deleteObjects', { - Bucket: bucketName, - Delete: { - Objects: deletes, - Quiet: false, - }, - }); + + return this.s3.send( + new DeleteObjectsCommand({ + Bucket: bucketName, + Delete: { + Objects: deletes, + Quiet: false, + }, + }), + ); } public async deleteImageRepository(repositoryName: string) { - await this.ecr('deleteRepository', { repositoryName, force: true }); + await this.ecr.send( + new DeleteRepositoryCommand({ + repositoryName: repositoryName, + force: true, + }), + ); } public async deleteBucket(bucketName: string) { try { await this.emptyBucket(bucketName); - await this.s3('deleteBucket', { - Bucket: bucketName, - }); + + await this.s3.send( + new DeleteBucketCommand({ + Bucket: bucketName, + }), + ); } catch (e: any) { - if (isBucketMissingError(e)) { return; } + if (isBucketMissingError(e)) { + return; + } throw e; } } } -/** - * Perform an AWS call from nothing - * - * Create the correct client, do the call and resole the promise(). - */ -async function awsCall< - Svc extends AWS.Service, - Calls extends ServiceCalls, - Call extends keyof Calls, -// eslint-disable-next-line @typescript-eslint/no-shadow ->(ctor: new (config: any) => Svc, config: any, call: Call, request: First): Promise> { - const cfn = new ctor(config); - const response = ((cfn as any)[call] as any)(request); - try { - return response.promise(); - } catch (e: any) { - const newErr = new Error(`${String(call)}(${JSON.stringify(request)}): ${e.message}`); - (newErr as any).code = e.code; - throw newErr; - } -} - -type AwsCaller = >(call: B, request: First[B]>) => Promise[B]>>; - -/** - * Factory function to invoke 'awsCall' for specific services. - * - * Not strictly necessary but calling this replaces a whole bunch of annoying generics you otherwise have to type: - * - * ```ts - * export function cloudFormation< - * C extends keyof ServiceCalls, - * >(call: C, request: First[C]>): Promise[C]>> { - * return awsCall(AWS.CloudFormation, call, request); - * } - * ``` - */ -// eslint-disable-next-line @typescript-eslint/no-shadow -function makeAwsCaller(ctor: new (config: any) => A, config: any): AwsCaller { - return >(call: B, request: First[B]>): Promise[B]>> => { - return awsCall(ctor, config, call, request); - }; -} - -type ServiceCalls = NoNayNever>; -// Map ever member in the type to the important AWS call overload, or to 'never' -type SimplifiedService = {[k in keyof T]: AwsCallIO}; -// Remove all 'never' types from an object type -type NoNayNever = Pick; - -// Because of the overloads an AWS handler type looks like this: -// -// { -// (params: INPUTSTRUCT, callback?: ((err: AWSError, data: {}) => void) | undefined): Request; -// (callback?: ((err: AWS.AWSError, data: {}) => void) | undefined): AWS.Request<...>; -// } -// -// Get the first overload and extract the input and output struct types -type AwsCallIO = - T extends { - (args: infer INPUT, callback?: ((err: AWS.AWSError, data: any) => void) | undefined): AWS.Request; - (callback?: ((err: AWS.AWSError, data: {}) => void) | undefined): AWS.Request; - } ? [INPUT, OUTPUT] : never; - -type First = T extends [any, any] ? T[0] : never; -type Second = T extends [any, any] ? T[1] : never; - export function isStackMissingError(e: Error) { return e.message.indexOf('does not exist') > -1; } @@ -207,7 +201,12 @@ export function isBucketMissingError(e: Error) { * Exceptions will cause the operation to retry. Use `retry.abort` to annotate an exception * to stop the retry and end in a failure. */ -export async function retry(output: NodeJS.WritableStream, operation: string, deadline: Date, block: () => Promise): Promise { +export async function retry( + output: NodeJS.WritableStream, + operation: string, + deadline: Date, + block: () => Promise, +): Promise { let i = 0; output.write(`💈 ${operation}\n`); while (true) { @@ -217,7 +216,7 @@ export async function retry(output: NodeJS.WritableStream, operation: string, output.write(`💈 ${operation}: succeeded after ${i} attempts\n`); return ret; } catch (e: any) { - if (e.abort || Date.now() > deadline.getTime( )) { + if (e.abort || Date.now() > deadline.getTime()) { throw new Error(`${operation}: did not succeed after ${i} attempts: ${e}`); } output.write(`⏳ ${operation} (${e.message})\n`); @@ -241,57 +240,21 @@ retry.abort = (e: Error): Error => { return e; }; -export function outputFromStack(key: string, stack: AWS.CloudFormation.Stack): string | undefined { - return (stack.Outputs ?? []).find(o => o.OutputKey === key)?.OutputValue; +export function outputFromStack(key: string, stack: Stack): string | undefined { + return (stack.Outputs ?? []).find((o) => o.OutputKey === key)?.OutputValue; } export async function sleep(ms: number) { - return new Promise(ok => setTimeout(ok, ms)); + return new Promise((ok) => setTimeout(ok, ms)); } -function chainableCredentials(region: string): AWS.Credentials | undefined { - - const profileName = process.env.AWS_PROFILE; - if (process.env.CODEBUILD_BUILD_ARN && profileName) { - +function chainableCredentials(region: string): AwsCredentialIdentityProvider | undefined { + if (process.env.CODEBUILD_BUILD_ARN && process.env.AWS_PROFILE) { // in codebuild we must assume the role that the cdk uses // otherwise credentials will just be picked up by the normal sdk // heuristics and expire after an hour. - - // can't use '~' since the SDK doesn't seem to expand it...? - const configPath = `${process.env.HOME}/.aws/config`; - const ini = new AWS.IniLoader().loadFrom({ - filename: configPath, - isConfig: true, - }); - - const profile = ini[profileName]; - - if (!profile) { - throw new Error(`Profile '${profileName}' does not exist in config file (${configPath})`); - } - - const arn = profile.role_arn; - const externalId = profile.external_id; - - if (!arn) { - throw new Error(`role_arn does not exist in profile ${profileName}`); - } - - if (!externalId) { - throw new Error(`external_id does not exist in profile ${externalId}`); - } - - return new AWS.ChainableTemporaryCredentials({ - params: { - RoleArn: arn, - ExternalId: externalId, - RoleSessionName: 'integ-tests', - }, - stsConfig: { - region, - }, - masterCredentials: new AWS.ECSCredentials(), + return fromIni({ + clientConfig: { region }, }); } diff --git a/packages/@aws-cdk-testing/cli-integ/lib/staging/codeartifact.ts b/packages/@aws-cdk-testing/cli-integ/lib/staging/codeartifact.ts index cade81401071b..e1fe0adf18c9d 100644 --- a/packages/@aws-cdk-testing/cli-integ/lib/staging/codeartifact.ts +++ b/packages/@aws-cdk-testing/cli-integ/lib/staging/codeartifact.ts @@ -1,4 +1,19 @@ -import * as AWS from 'aws-sdk'; +import { + AssociateExternalConnectionCommand, + CodeartifactClient, + CreateDomainCommand, + CreateRepositoryCommand, + DeleteRepositoryCommand, + DescribeDomainCommand, + DescribeRepositoryCommand, + GetAuthorizationTokenCommand, + GetRepositoryEndpointCommand, + ListPackagesCommand, + ListPackagesRequest, + ListRepositoriesCommand, + ListTagsForResourceCommand, + PutPackageOriginConfigurationCommand, +} from '@aws-sdk/client-codeartifact'; import { sleep } from '../aws'; const COLLECT_BY_TAG = 'collect-by'; @@ -8,7 +23,9 @@ export class TestRepository { public static readonly DEFAULT_DOMAIN = 'test-cdk'; public static async newRandom() { - const qualifier = Math.random().toString(36).replace(/[^a-z0-9]+/g, ''); + const qualifier = Math.random() + .toString(36) + .replace(/[^a-z0-9]+/g, ''); const repo = new TestRepository(`test-${qualifier}`); await repo.prepare(); @@ -29,26 +46,36 @@ export class TestRepository { * Garbage collect repositories */ public static async gc() { - if (!await TestRepository.existing('*dummy*').domainExists()) { + if (!(await TestRepository.existing('*dummy*').domainExists())) { return; } - const codeArtifact = new AWS.CodeArtifact(); + const codeArtifact = new CodeartifactClient(); let nextToken: string | undefined; do { - const page = await codeArtifact.listRepositories({ nextToken }).promise(); + const page = await codeArtifact.send( + new ListRepositoriesCommand({ + nextToken: nextToken, + }), + ); for (const repo of page.repositories ?? []) { - const tags = await codeArtifact.listTagsForResource({ resourceArn: repo.arn! }).promise(); - const collectable = tags?.tags?.find(t => t.key === COLLECT_BY_TAG && Number(t.value) < Date.now()); + const tags = await codeArtifact.send( + new ListTagsForResourceCommand({ + resourceArn: repo.arn!, + }), + ); + const collectable = tags?.tags?.find((t) => t.key === COLLECT_BY_TAG && Number(t.value) < Date.now()); if (collectable) { // eslint-disable-next-line no-console console.log('Deleting', repo.name); - await codeArtifact.deleteRepository({ - domain: repo.domainName!, - repository: repo.name!, - }).promise(); + await codeArtifact.send( + new DeleteRepositoryCommand({ + domain: repo.domainName!, + repository: repo.name!, + }), + ); } } @@ -62,12 +89,11 @@ export class TestRepository { public readonly mavenUpstream = 'maven-upstream'; public readonly domain = TestRepository.DEFAULT_DOMAIN; - private readonly codeArtifact = new AWS.CodeArtifact(); + private readonly codeArtifact = new CodeartifactClient(); private _loginInformation: LoginInformation | undefined; - private constructor(public readonly repositoryName: string) { - } + private constructor(public readonly repositoryName: string) {} public async prepare() { await this.ensureDomain(); @@ -75,12 +101,7 @@ export class TestRepository { await this.ensureRepository(this.repositoryName, { description: 'Testing repository', - upstreams: [ - this.npmUpstream, - this.pypiUpstream, - this.nugetUpstream, - this.mavenUpstream, - ], + upstreams: [this.npmUpstream, this.pypiUpstream, this.nugetUpstream, this.mavenUpstream], tags: { [COLLECT_BY_TAG]: `${Date.now() + REPO_LIFETIME_MS}`, }, @@ -93,27 +114,74 @@ export class TestRepository { } this._loginInformation = { - authToken: (await this.codeArtifact.getAuthorizationToken({ domain: this.domain, durationSeconds: 12 * 3600 }).promise()).authorizationToken!, + authToken: ( + await this.codeArtifact.send( + new GetAuthorizationTokenCommand({ + domain: this.domain, + durationSeconds: 12 * 3600, + }), + ) + ).authorizationToken!, repositoryName: this.repositoryName, - npmEndpoint: (await this.codeArtifact.getRepositoryEndpoint({ domain: this.domain, repository: this.repositoryName, format: 'npm' }).promise()).repositoryEndpoint!, - mavenEndpoint: (await this.codeArtifact.getRepositoryEndpoint({ domain: this.domain, repository: this.repositoryName, format: 'maven' }).promise()).repositoryEndpoint!, - nugetEndpoint: (await this.codeArtifact.getRepositoryEndpoint({ domain: this.domain, repository: this.repositoryName, format: 'nuget' }).promise()).repositoryEndpoint!, - pypiEndpoint: (await this.codeArtifact.getRepositoryEndpoint({ domain: this.domain, repository: this.repositoryName, format: 'pypi' }).promise()).repositoryEndpoint!, + + npmEndpoint: ( + await this.codeArtifact.send( + new GetRepositoryEndpointCommand({ + domain: this.domain, + repository: this.repositoryName, + format: 'npm', + }), + ) + ).repositoryEndpoint!, + + mavenEndpoint: ( + await this.codeArtifact.send( + new GetRepositoryEndpointCommand({ + domain: this.domain, + repository: this.repositoryName, + format: 'maven', + }), + ) + ).repositoryEndpoint!, + + nugetEndpoint: ( + await this.codeArtifact.send( + new GetRepositoryEndpointCommand({ + domain: this.domain, + repository: this.repositoryName, + format: 'nuget', + }), + ) + ).repositoryEndpoint!, + + pypiEndpoint: ( + await this.codeArtifact.send( + new GetRepositoryEndpointCommand({ + domain: this.domain, + repository: this.repositoryName, + format: 'pypi', + }), + ) + ).repositoryEndpoint!, }; return this._loginInformation; } public async delete() { try { - await this.codeArtifact.deleteRepository({ - domain: this.domain, - repository: this.repositoryName, - }).promise(); + await this.codeArtifact.send( + new DeleteRepositoryCommand({ + domain: this.domain, + repository: this.repositoryName, + }), + ); // eslint-disable-next-line no-console console.log('Deleted', this.repositoryName); } catch (e: any) { - if (e.code !== 'ResourceNotFoundException') { throw e; } + if (e.name !== 'ResourceNotFoundException') { + throw e; + } // Okay } } @@ -127,27 +195,35 @@ export class TestRepository { */ public async markAllUpstreamAllow() { for await (const pkg of this.listPackages({ upstream: 'BLOCK' })) { - await retryThrottled(() => this.codeArtifact.putPackageOriginConfiguration({ - domain: this.domain, - repository: this.repositoryName, - - format: pkg.format!, - package: pkg.package!, - namespace: pkg.namespace!, - restrictions: { - publish: 'ALLOW', - upstream: 'ALLOW', - }, - }).promise()); + await retryThrottled(() => + this.codeArtifact.send( + new PutPackageOriginConfigurationCommand({ + domain: this.domain, + repository: this.repositoryName, + + format: pkg.format!, + package: pkg.package!, + namespace: pkg.namespace!, + restrictions: { + publish: 'ALLOW', + upstream: 'ALLOW', + }, + }), + ), + ); } } private async ensureDomain() { - if (await this.domainExists()) { return; } - await this.codeArtifact.createDomain({ - domain: this.domain, - tags: [{ key: 'testing', value: 'true' }], - }).promise(); + if (await this.domainExists()) { + return; + } + await this.codeArtifact.send( + new CreateDomainCommand({ + domain: this.domain, + tags: [{ key: 'testing', value: 'true' }], + }), + ); } private async ensureUpstreams() { @@ -169,58 +245,77 @@ export class TestRepository { }); } - private async ensureRepository(name: string, options?: { - readonly description?: string; - readonly external?: string; - readonly upstreams?: string[]; - readonly tags?: Record; - }) { - if (await this.repositoryExists(name)) { return; } - - await this.codeArtifact.createRepository({ - domain: this.domain, - repository: name, - description: options?.description, - upstreams: options?.upstreams?.map(repositoryName => ({ repositoryName })), - tags: options?.tags ? Object.entries(options.tags).map(([key, value]) => ({ key, value })) : undefined, - }).promise(); + private async ensureRepository( + name: string, + options?: { + readonly description?: string; + readonly external?: string; + readonly upstreams?: string[]; + readonly tags?: Record; + }, + ) { + if (await this.repositoryExists(name)) { + return; + } - if (options?.external) { - const externalConnection = options.external; - await retry(() => this.codeArtifact.associateExternalConnection({ + await this.codeArtifact.send( + new CreateRepositoryCommand({ domain: this.domain, repository: name, - externalConnection, - }).promise()); + description: options?.description, + upstreams: options?.upstreams?.map((repositoryName) => ({ repositoryName })), + tags: options?.tags ? Object.entries(options.tags).map(([key, value]) => ({ key, value })) : undefined, + }), + ); + + if (options?.external) { + const externalConnection = options.external; + await retry(() => + this.codeArtifact.send( + new AssociateExternalConnectionCommand({ + domain: this.domain, + repository: name, + externalConnection, + }), + ), + ); } } private async domainExists() { try { - await this.codeArtifact.describeDomain({ domain: this.domain }).promise(); + await this.codeArtifact.send(new DescribeDomainCommand({ domain: this.domain })); return true; } catch (e: any) { - if (e.code !== 'ResourceNotFoundException') { throw e; } + if (e.name !== 'ResourceNotFoundException') { + throw e; + } return false; } } private async repositoryExists(name: string) { try { - await this.codeArtifact.describeRepository({ domain: this.domain, repository: name }).promise(); + await this.codeArtifact.send(new DescribeRepositoryCommand({ domain: this.domain, repository: name })); return true; } catch (e: any) { - if (e.code !== 'ResourceNotFoundException') { throw e; } + if (e.name !== 'ResourceNotFoundException') { + throw e; + } return false; } } - private async* listPackages(filter: Pick = {}) { - let response = await retryThrottled(() => this.codeArtifact.listPackages({ - domain: this.domain, - repository: this.repositoryName, - ...filter, - }).promise()); + private async *listPackages(filter: Pick = {}) { + let response = await retryThrottled(() => + this.codeArtifact.send( + new ListPackagesCommand({ + domain: this.domain, + repository: this.repositoryName, + ...filter, + }), + ), + ); while (true) { for (const p of response.packages ?? []) { @@ -231,12 +326,16 @@ export class TestRepository { break; } - response = await retryThrottled(() => this.codeArtifact.listPackages({ - domain: this.domain, - repository: this.repositoryName, - ...filter, - nextToken: response.nextToken, - }).promise()); + response = await retryThrottled(() => + this.codeArtifact.send( + new ListPackagesCommand({ + domain: this.domain, + repository: this.repositoryName, + ...filter, + nextToken: response.nextToken, + }), + ), + ); } } } @@ -247,7 +346,9 @@ async function retry(block: () => Promise) { try { return await block(); } catch (e: any) { - if (attempts-- === 0) { throw e; } + if (attempts-- === 0) { + throw e; + } // eslint-disable-next-line no-console console.debug(e.message); await sleep(500); @@ -264,8 +365,12 @@ async function retryThrottled(block: () => Promise) { } catch (e: any) { // eslint-disable-next-line no-console console.debug(e.message); - if (e.code !== 'ThrottlingException') { throw e; } - if (attempts-- === 0) { throw e; } + if (e.name !== 'ThrottlingException') { + throw e; + } + if (attempts-- === 0) { + throw e; + } await sleep(Math.floor(Math.random() * time)); time *= 2; } diff --git a/packages/@aws-cdk-testing/cli-integ/lib/with-cdk-app.ts b/packages/@aws-cdk-testing/cli-integ/lib/with-cdk-app.ts index f2b5263df06a5..619ca8b96175c 100644 --- a/packages/@aws-cdk-testing/cli-integ/lib/with-cdk-app.ts +++ b/packages/@aws-cdk-testing/cli-integ/lib/with-cdk-app.ts @@ -2,6 +2,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; +import { DescribeStacksCommand, Stack } from '@aws-sdk/client-cloudformation'; import { outputFromStack, AwsClients } from './aws'; import { TestContext } from './integ-test'; import { findYarnPackages } from './package-sources/repo-source'; @@ -511,7 +512,14 @@ export class TestFixture extends ShellHelper { const imageRepositoryNames = stacksToDelete.map(stack => outputFromStack('ImageRepositoryName', stack)).filter(defined); await Promise.all(imageRepositoryNames.map(r => this.aws.deleteImageRepository(r))); - await this.aws.deleteStacks(...stacksToDelete.map(s => s.StackName)); + await this.aws.deleteStacks( + ...stacksToDelete.map((s) => { + if (!s.StackName) { + throw new Error('Stack name is required to delete a stack.'); + } + return s.StackName; + }), + ); // We might have leaked some buckets by upgrading the bootstrap stack. Be // sure to clean everything. @@ -529,7 +537,7 @@ export class TestFixture extends ShellHelper { /** * Return the stacks starting with our testing prefix that should be deleted */ - private async deleteableStacks(prefix: string): Promise { + private async deleteableStacks(prefix: string): Promise { const statusFilter = [ 'CREATE_IN_PROGRESS', 'CREATE_FAILED', 'CREATE_COMPLETE', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'ROLLBACK_COMPLETE', @@ -544,16 +552,21 @@ export class TestFixture extends ShellHelper { 'IMPORT_ROLLBACK_COMPLETE', ]; - const response = await this.aws.cloudFormation('describeStacks', {}); + const response = await this.aws.cloudFormation.send(new DescribeStacksCommand({})); return (response.Stacks ?? []) - .filter(s => s.StackName.startsWith(prefix)) - .filter(s => statusFilter.includes(s.StackStatus)) - .filter(s => s.RootId === undefined); // Only delete parent stacks. Nested stacks are deleted in the process + .filter((s) => s.StackName && s.StackName.startsWith(prefix)) + .filter((s) => s.StackStatus && statusFilter.includes(s.StackStatus)) + .filter((s) => s.RootId === undefined); // Only delete parent stacks. Nested stacks are deleted in the process } - private sortBootstrapStacksToTheEnd(stacks: AWS.CloudFormation.Stack[]) { + private sortBootstrapStacksToTheEnd(stacks: Stack[]) { stacks.sort((a, b) => { + + if (!a.StackName || !b.StackName) { + throw new Error('Stack names do not exists. These are required for sorting the bootstrap stacks.'); + } + const aBs = a.StackName.startsWith(this.bootstrapStackName); const bBs = b.StackName.startsWith(this.bootstrapStackName); diff --git a/packages/@aws-cdk-testing/cli-integ/package.json b/packages/@aws-cdk-testing/cli-integ/package.json index bb22a3e5eafee..fd65ad224c613 100644 --- a/packages/@aws-cdk-testing/cli-integ/package.json +++ b/packages/@aws-cdk-testing/cli-integ/package.json @@ -39,7 +39,19 @@ }, "dependencies": { "@octokit/rest": "^18.12.0", - "aws-sdk": "^2.1653.0", + "@aws-sdk/client-codeartifact": "3.637.0", + "@aws-sdk/client-cloudformation": "3.637.0", + "@aws-sdk/client-ecr": "3.637.0", + "@aws-sdk/client-ecs": "3.637.0", + "@aws-sdk/client-iam": "3.637.0", + "@aws-sdk/client-lambda": "3.637.0", + "@aws-sdk/client-s3": "3.637.0", + "@aws-sdk/client-sns": "3.637.0", + "@aws-sdk/client-sso": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/credential-providers": "3.637.0", + "@smithy/util-retry": "3.0.3", + "@smithy/types": "3.3.0", "axios": "^1.7.2", "chalk": "^4", "fs-extra": "^9.1.0", diff --git a/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/bootstrapping.integtest.ts b/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/bootstrapping.integtest.ts index ab56611bf39e0..5e8d1304b4973 100644 --- a/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/bootstrapping.integtest.ts +++ b/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/bootstrapping.integtest.ts @@ -1,6 +1,9 @@ /* eslint-disable @aws-cdk/no-literal-partition */ import * as fs from 'fs'; import * as path from 'path'; +import { DescribeStackResourcesCommand, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'; +import { DescribeRepositoriesCommand } from '@aws-sdk/client-ecr'; +import { CreatePolicyCommand, DeletePolicyCommand, GetRoleCommand } from '@aws-sdk/client-iam'; import * as yaml from 'yaml'; import { integTest, randomString, withoutBootstrap } from '../../lib'; import eventually from '../../lib/eventually'; @@ -15,9 +18,11 @@ integTest('can bootstrap without execution', withoutBootstrap(async (fixture) => noExecute: true, }); - const resp = await fixture.aws.cloudFormation('describeStacks', { - StackName: bootstrapStackName, - }); + const resp = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: bootstrapStackName, + }), + ); expect(resp.Stacks?.[0].StackStatus).toEqual('REVIEW_IN_PROGRESS'); })); @@ -145,7 +150,7 @@ integTest('can create a legacy bootstrap stack with --public-access-block-config tags: 'Foo=Bar', }); - const response = await fixture.aws.cloudFormation('describeStacks', { StackName: bootstrapStackName }); + const response = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: bootstrapStackName })); expect(response.Stacks?.[0].Tags).toEqual([ { Key: 'Foo', Value: 'Bar' }, ]); @@ -167,7 +172,7 @@ integTest('can create multiple legacy bootstrap stacks', withoutBootstrap(async toolkitStackName: bootstrapStackName2, }); - const response = await fixture.aws.cloudFormation('describeStacks', { StackName: bootstrapStackName1 }); + const response = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: bootstrapStackName1 })); expect(response.Stacks?.[0].Tags).toEqual([ { Key: 'Foo', Value: 'Bar' }, ]); @@ -272,17 +277,19 @@ integTest('can remove customPermissionsBoundary', withoutBootstrap(async (fixtur const policyName = `${bootstrapStackName}-pb`; let policyArn; try { - const policy = await fixture.aws.iam('createPolicy', { - PolicyName: policyName, - PolicyDocument: JSON.stringify({ - Version: '2012-10-17', - Statement: { - Action: ['*'], - Resource: ['*'], - Effect: 'Allow', - }, + const policy = await fixture.aws.iam.send( + new CreatePolicyCommand({ + PolicyName: policyName, + PolicyDocument: JSON.stringify({ + Version: '2012-10-17', + Statement: { + Action: ['*'], + Resource: ['*'], + Effect: 'Allow', + }, + }), }), - }); + ); policyArn = policy.Policy?.Arn; // Policy creation and consistency across regions is "almost immediate" @@ -295,7 +302,9 @@ integTest('can remove customPermissionsBoundary', withoutBootstrap(async (fixtur customPermissionsBoundary: policyName, }); - const response = await fixture.aws.cloudFormation('describeStacks', { StackName: bootstrapStackName }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ StackName: bootstrapStackName }), + ); expect( response.Stacks?.[0].Parameters?.some( param => (param.ParameterKey === 'InputPermissionsBoundary' && param.ParameterValue === policyName), @@ -309,7 +318,9 @@ integTest('can remove customPermissionsBoundary', withoutBootstrap(async (fixtur toolkitStackName: bootstrapStackName, usePreviousParameters: false, }); - const response2 = await fixture.aws.cloudFormation('describeStacks', { StackName: bootstrapStackName }); + const response2 = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ StackName: bootstrapStackName }), + ); expect( response2.Stacks?.[0].Parameters?.some( param => (param.ParameterKey === 'InputPermissionsBoundary' && !param.ParameterValue), @@ -317,12 +328,17 @@ integTest('can remove customPermissionsBoundary', withoutBootstrap(async (fixtur const region = fixture.aws.region; const account = await fixture.aws.account(); - const role = await fixture.aws.iam('getRole', { RoleName: `cdk-${fixture.qualifier}-cfn-exec-role-${account}-${region}` }); + const role = await fixture.aws.iam.send( + new GetRoleCommand({ RoleName: `cdk-${fixture.qualifier}-cfn-exec-role-${account}-${region}` }), + ); + if (!role.Role) { + throw new Error('Role not found'); + } expect(role.Role.PermissionsBoundary).toBeUndefined(); } finally { if (policyArn) { - await fixture.aws.iam('deletePolicy', { PolicyArn: policyArn }); + await fixture.aws.iam.send(new DeletePolicyCommand({ PolicyArn: policyArn })); } } })); @@ -342,7 +358,7 @@ integTest('switch on termination protection, switch is left alone on re-bootstra force: true, }); - const response = await fixture.aws.cloudFormation('describeStacks', { StackName: bootstrapStackName }); + const response = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: bootstrapStackName })); expect(response.Stacks?.[0].EnableTerminationProtection).toEqual(true); })); @@ -361,7 +377,7 @@ integTest('add tags, left alone on re-bootstrap', withoutBootstrap(async (fixtur force: true, }); - const response = await fixture.aws.cloudFormation('describeStacks', { StackName: bootstrapStackName }); + const response = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: bootstrapStackName })); expect(response.Stacks?.[0].Tags).toEqual([ { Key: 'Foo', Value: 'Bar' }, ]); @@ -384,7 +400,7 @@ integTest('can add tags then update tags during re-bootstrap', withoutBootstrap( force: true, }); - const response = await fixture.aws.cloudFormation('describeStacks', { StackName: bootstrapStackName }); + const response = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: bootstrapStackName })); expect(response.Stacks?.[0].Tags).toEqual([ { Key: 'Foo', Value: 'BarBaz' }, ]); @@ -418,18 +434,22 @@ integTest('create ECR with tag IMMUTABILITY to set on', withoutBootstrap(async ( toolkitStackName: bootstrapStackName, }); - const response = await fixture.aws.cloudFormation('describeStackResources', { - StackName: bootstrapStackName, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStackResourcesCommand({ + StackName: bootstrapStackName, + }), + ); const ecrResource = response.StackResources?.find(resource => resource.LogicalResourceId === 'ContainerAssetsRepository'); expect(ecrResource).toBeDefined(); - const ecrResponse = await fixture.aws.ecr('describeRepositories', { - repositoryNames: [ - // This is set, as otherwise we don't end up here - ecrResource?.PhysicalResourceId ?? '', - ], - }); + const ecrResponse = await fixture.aws.ecr.send( + new DescribeRepositoriesCommand({ + repositoryNames: [ + // This is set, as otherwise we don't end up here + ecrResource?.PhysicalResourceId ?? '', + ], + }), + ); expect(ecrResponse.repositories?.[0].imageTagMutability).toEqual('IMMUTABLE'); })); diff --git a/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli-lib.integtest.ts b/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli-lib.integtest.ts index 2d0da77b48f63..c0b90cf503642 100644 --- a/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli-lib.integtest.ts +++ b/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli-lib.integtest.ts @@ -1,65 +1,90 @@ +import { DescribeStackResourcesCommand, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'; import { integTest, withCliLibFixture } from '../../lib'; jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime -integTest('cli-lib synth', withCliLibFixture(async (fixture) => { - await fixture.cdk(['synth', fixture.fullStackName('simple-1')]); - expect(fixture.template('simple-1')).toEqual(expect.objectContaining({ - // Checking for a small subset is enough as proof that synth worked - Resources: expect.objectContaining({ - queue276F7297: expect.objectContaining({ - Type: 'AWS::SQS::Queue', - Properties: { - VisibilityTimeout: 300, - }, - Metadata: { - 'aws:cdk:path': `${fixture.stackNamePrefix}-simple-1/queue/Resource`, - }, +integTest( + 'cli-lib synth', + withCliLibFixture(async (fixture) => { + await fixture.cdk(['synth', fixture.fullStackName('simple-1')]); + expect(fixture.template('simple-1')).toEqual( + expect.objectContaining({ + // Checking for a small subset is enough as proof that synth worked + Resources: expect.objectContaining({ + queue276F7297: expect.objectContaining({ + Type: 'AWS::SQS::Queue', + Properties: { + VisibilityTimeout: 300, + }, + Metadata: { + 'aws:cdk:path': `${fixture.stackNamePrefix}-simple-1/queue/Resource`, + }, + }), + }), }), - }), - })); -})); + ); + }), +); -integTest('cli-lib list', withCliLibFixture(async (fixture) => { - const listing = await fixture.cdk(['list'], { captureStderr: false }); - expect(listing).toContain(fixture.fullStackName('simple-1')); -})); +integTest( + 'cli-lib list', + withCliLibFixture(async (fixture) => { + const listing = await fixture.cdk(['list'], { captureStderr: false }); + expect(listing).toContain(fixture.fullStackName('simple-1')); + }), +); -integTest('cli-lib deploy', withCliLibFixture(async (fixture) => { - const stackName = fixture.fullStackName('simple-1'); +integTest( + 'cli-lib deploy', + withCliLibFixture(async (fixture) => { + const stackName = fixture.fullStackName('simple-1'); - try { - // deploy the stack - await fixture.cdk(['deploy', stackName], { - neverRequireApproval: true, - }); + try { + // deploy the stack + await fixture.cdk(['deploy', stackName], { + neverRequireApproval: true, + }); - // verify the number of resources in the stack - const expectedStack = await fixture.aws.cloudFormation('describeStackResources', { - StackName: stackName, - }); - expect(expectedStack.StackResources?.length).toEqual(3); - } finally { - // delete the stack - await fixture.cdk(['destroy', stackName], { - captureStderr: false, - }); - } -})); + // verify the number of resources in the stack + const expectedStack = await fixture.aws.cloudFormation.send( + new DescribeStackResourcesCommand({ + StackName: stackName, + }), + ); + expect(expectedStack.StackResources?.length).toEqual(3); + } finally { + // delete the stack + await fixture.cdk(['destroy', stackName], { + captureStderr: false, + }); + } + }), +); -integTest('security related changes without a CLI are expected to fail when approval is required', withCliLibFixture(async (fixture) => { - const stdErr = await fixture.cdk(['deploy', fixture.fullStackName('simple-1')], { - onlyStderr: true, - captureStderr: true, - allowErrExit: true, - neverRequireApproval: false, - }); +integTest( + 'security related changes without a CLI are expected to fail when approval is required', + withCliLibFixture(async (fixture) => { + const stdErr = await fixture.cdk(['deploy', fixture.fullStackName('simple-1')], { + onlyStderr: true, + captureStderr: true, + allowErrExit: true, + neverRequireApproval: false, + }); - expect(stdErr).toContain('This deployment will make potentially sensitive changes according to your current security approval level'); - expect(stdErr).toContain('Deployment failed: Error: \"--require-approval\" is enabled and stack includes security-sensitive updates'); + expect(stdErr).toContain( + 'This deployment will make potentially sensitive changes according to your current security approval level', + ); + expect(stdErr).toContain( + 'Deployment failed: Error: "--require-approval" is enabled and stack includes security-sensitive updates', + ); - // Ensure stack was not deployed - await expect(fixture.aws.cloudFormation('describeStacks', { - StackName: fixture.fullStackName('simple-1'), - })).rejects.toThrow('does not exist'); -})); + // Ensure stack was not deployed + await expect( + fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: fixture.fullStackName('simple-1'), + }), + ), + ).rejects.toThrow('does not exist'); + }), +); diff --git a/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli.integtest.ts b/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli.integtest.ts index 2db469867234f..d33ba35e630e0 100644 --- a/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli.integtest.ts +++ b/packages/@aws-cdk-testing/cli-integ/tests/cli-integ-tests/cli.integtest.ts @@ -1,6 +1,24 @@ import { promises as fs, existsSync } from 'fs'; import * as os from 'os'; import * as path from 'path'; +import { + CreateStackCommand, + DescribeStackResourcesCommand, + DescribeStacksCommand, + GetTemplateCommand, + ListChangeSetsCommand, +} from '@aws-sdk/client-cloudformation'; +import { DescribeServicesCommand } from '@aws-sdk/client-ecs'; +import { + CreateRoleCommand, + DeleteRoleCommand, + DeleteRolePolicyCommand, + ListRolePoliciesCommand, + PutRolePolicyCommand, +} from '@aws-sdk/client-iam'; +import { InvokeCommand } from '@aws-sdk/client-lambda'; +import { CreateTopicCommand, DeleteTopicCommand } from '@aws-sdk/client-sns'; +import { AssumeRoleCommand, GetCallerIdentityCommand } from '@aws-sdk/client-sts'; import * as chalk from 'chalk'; import { integTest, @@ -280,9 +298,11 @@ integTest( const stackArn = await fixture.cdkDeploy('test-2', { captureStderr: false }); // verify the number of resources in the stack - const response = await fixture.aws.cloudFormation('describeStackResources', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStackResourcesCommand({ + StackName: stackArn, + }), + ); expect(response.StackResources?.length).toEqual(2); }), ); @@ -296,9 +316,11 @@ integTest( }); // verify the number of resources in the stack - const response = await fixture.aws.cloudFormation('describeStackResources', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStackResourcesCommand({ + StackName: stackArn, + }), + ); expect(response.StackResources?.length).toBeGreaterThan(0); }), ); @@ -340,9 +362,11 @@ integTest( expect(stackArn.split('\n').length).toEqual(1); // verify the number of resources in the stack - const response = await fixture.aws.cloudFormation('describeStackResources', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStackResourcesCommand({ + StackName: stackArn, + }), + ); expect(response.StackResources?.length).toEqual(1); }), ); @@ -358,15 +382,19 @@ integTest( // verify that we only deployed a single stack (there's a single ARN in the output) expect(stackArn.split('\n').length).toEqual(1); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); expect(response.Stacks?.[0].StackStatus).toEqual('REVIEW_IN_PROGRESS'); //verify a change set was created with the provided name - const changeSetResponse = await fixture.aws.cloudFormation('listChangeSets', { - StackName: stackArn, - }); + const changeSetResponse = await fixture.aws.cloudFormation.send( + new ListChangeSetsCommand({ + StackName: stackArn, + }), + ); const changeSets = changeSetResponse.Summaries || []; expect(changeSets.length).toEqual(1); expect(changeSets[0].ChangeSetName).toEqual(changeSetName); @@ -390,9 +418,11 @@ integTest( // Ensure stack was not deployed await expect( - fixture.aws.cloudFormation('describeStacks', { - StackName: fixture.fullStackName(stackName), - }), + fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: fixture.fullStackName(stackName), + }), + ), ).rejects.toThrow('does not exist'); }), ); @@ -427,9 +457,11 @@ integTest( captureStderr: false, }); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); expect(response.Stacks?.[0].Parameters).toContainEqual({ ParameterKey: 'TopicNameParam', @@ -449,9 +481,11 @@ integTest( }), ).rejects.toThrow('exited with error'); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: fixture.fullStackName('param-test-1'), - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: fixture.fullStackName('param-test-1'), + }), + ); const stackArn = response.Stacks?.[0].StackId; expect(response.Stacks?.[0].StackStatus).toEqual('ROLLBACK_COMPLETE'); @@ -462,9 +496,11 @@ integTest( captureStderr: false, }); - const newStackResponse = await fixture.aws.cloudFormation('describeStacks', { - StackName: newStackArn, - }); + const newStackResponse = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: newStackArn, + }), + ); // THEN expect(stackArn).not.toEqual(newStackArn); // new stack was created @@ -485,9 +521,11 @@ integTest( captureStderr: false, }); - let response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + let response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); expect(response.Stacks?.[0].StackStatus).toEqual('CREATE_COMPLETE'); @@ -499,9 +537,11 @@ integTest( }), ).rejects.toThrow('exited with error'); - response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); expect(response.Stacks?.[0].StackStatus).toEqual('UPDATE_ROLLBACK_COMPLETE'); @@ -511,9 +551,11 @@ integTest( captureStderr: false, }); - response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); // THEN expect(response.Stacks?.[0].StackStatus).toEqual('UPDATE_COMPLETE'); @@ -553,9 +595,11 @@ integTest( captureStderr: false, }); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); expect(response.Stacks?.[0].Parameters).toContainEqual({ ParameterKey: 'DisplayNameParam', @@ -573,7 +617,7 @@ integTest( withDefaultFixture(async (fixture) => { const topicName = `${fixture.stackNamePrefix}-test-topic`; - const response = await fixture.aws.sns('createTopic', { Name: topicName }); + const response = await fixture.aws.sns.send(new CreateTopicCommand({ Name: topicName })); const topicArn = response.TopicArn!; try { await fixture.cdkDeploy('test-2', { @@ -581,14 +625,18 @@ integTest( }); // verify that the stack we deployed has our notification ARN - const describeResponse = await fixture.aws.cloudFormation('describeStacks', { - StackName: fixture.fullStackName('test-2'), - }); + const describeResponse = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: fixture.fullStackName('test-2'), + }), + ); expect(describeResponse.Stacks?.[0].NotificationARNs).toEqual([topicArn]); } finally { - await fixture.aws.sns('deleteTopic', { - TopicArn: topicArn, - }); + await fixture.aws.sns.send( + new DeleteTopicCommand({ + TopicArn: topicArn, + }), + ); } }), ); @@ -606,46 +654,61 @@ integTest( await deleteRole(); - const createResponse = await fixture.aws.iam('createRole', { - RoleName: roleName, - AssumeRolePolicyDocument: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Principal: { Service: 'cloudformation.amazonaws.com' }, - Effect: 'Allow', - }, - { - Action: 'sts:AssumeRole', - Principal: { AWS: (await fixture.aws.sts('getCallerIdentity', {})).Arn }, - Effect: 'Allow', - }, - ], - }), - }); - const roleArn = createResponse.Role.Arn; - try { - await fixture.aws.iam('putRolePolicy', { + const createResponse = await fixture.aws.iam.send( + new CreateRoleCommand({ RoleName: roleName, - PolicyName: 'DefaultPolicy', - PolicyDocument: JSON.stringify({ + AssumeRolePolicyDocument: JSON.stringify({ Version: '2012-10-17', Statement: [ { - Action: '*', - Resource: '*', + Action: 'sts:AssumeRole', + Principal: { Service: 'cloudformation.amazonaws.com' }, + Effect: 'Allow', + }, + { + Action: 'sts:AssumeRole', + Principal: { AWS: (await fixture.aws.sts.send(new GetCallerIdentityCommand({}))).Arn }, Effect: 'Allow', }, ], }), - }); + }), + ); + + if (!createResponse.Role) { + throw new Error('Role is expected to be present!!'); + } + + if (!createResponse.Role.Arn) { + throw new Error('Role arn is expected to be present!!'); + } + + const roleArn = createResponse.Role.Arn; + try { + await fixture.aws.iam.send( + new PutRolePolicyCommand({ + RoleName: roleName, + PolicyName: 'DefaultPolicy', + PolicyDocument: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Action: '*', + Resource: '*', + Effect: 'Allow', + }, + ], + }), + }), + ); await retry(fixture.output, 'Trying to assume fresh role', retry.forSeconds(300), async () => { - await fixture.aws.sts('assumeRole', { - RoleArn: roleArn, - RoleSessionName: 'testing', - }); + await fixture.aws.sts.send( + new AssumeRoleCommand({ + RoleArn: roleArn, + RoleSessionName: 'testing', + }), + ); }); // In principle, the role has replicated from 'us-east-1' to wherever we're testing. @@ -668,13 +731,21 @@ integTest( async function deleteRole() { try { - for (const policyName of (await fixture.aws.iam('listRolePolicies', { RoleName: roleName })).PolicyNames) { - await fixture.aws.iam('deleteRolePolicy', { - RoleName: roleName, - PolicyName: policyName, - }); + const response = await fixture.aws.iam.send(new ListRolePoliciesCommand({ RoleName: roleName })); + + if (!response.PolicyNames) { + throw new Error('Policy names cannot be undefined for deleteRole() function'); } - await fixture.aws.iam('deleteRole', { RoleName: roleName }); + + for (const policyName of response.PolicyNames) { + await fixture.aws.iam.send( + new DeleteRolePolicyCommand({ + RoleName: roleName, + PolicyName: policyName, + }), + ); + } + await fixture.aws.iam.send(new DeleteRoleCommand({ RoleName: roleName })); } catch (e: any) { if (e.message.indexOf('cannot be found') > -1) { return; @@ -699,9 +770,11 @@ integTest( { neverRequireApproval: true, verbose: true, captureStderr: false }, true, ); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); expect(response.Stacks?.[0].StackStatus).toEqual('CREATE_COMPLETE'); await fixture.cdkDestroy(fixture.stackNamePrefix); @@ -798,18 +871,20 @@ integTest( `cdk migrate --from-stack creates deployable ${language} app`, withExtendedTimeoutFixture(async (fixture) => { const migrateStackName = fixture.fullStackName('migrate-stack'); - await fixture.aws.cloudFormation('createStack', { - StackName: migrateStackName, - TemplateBody: await fs.readFile( - path.join(__dirname, '..', '..', 'resources', 'templates', 'sqs-template.json'), - 'utf8', - ), - }); + await fixture.aws.cloudFormation.send( + new CreateStackCommand({ + StackName: migrateStackName, + TemplateBody: await fs.readFile( + path.join(__dirname, '..', '..', 'resources', 'templates', 'sqs-template.json'), + 'utf8', + ), + }), + ); try { let stackStatus = 'CREATE_IN_PROGRESS'; while (stackStatus === 'CREATE_IN_PROGRESS') { stackStatus = await ( - await fixture.aws.cloudFormation('describeStacks', { StackName: migrateStackName }) + await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: migrateStackName })) ).Stacks?.[0].StackStatus!; await sleep(1000); } @@ -825,9 +900,11 @@ integTest( verbose: true, captureStderr: false, }); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: migrateStackName, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: migrateStackName, + }), + ); expect(response.Stacks?.[0].StackStatus).toEqual('UPDATE_COMPLETE'); } finally { @@ -1126,19 +1203,23 @@ integTest( withDefaultFixture(async (fixture) => { const stackArn = await fixture.cdkDeploy('lambda', { captureStderr: false }); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); const lambdaArn = response.Stacks?.[0].Outputs?.[0].OutputValue; if (lambdaArn === undefined) { throw new Error('Stack did not have expected Lambda ARN output'); } - const output = await fixture.aws.lambda('invoke', { - FunctionName: lambdaArn, - }); + const output = await fixture.aws.lambda.send( + new InvokeCommand({ + FunctionName: lambdaArn, + }), + ); - expect(JSON.stringify(output.Payload)).toContain('dear asset'); + expect(JSON.stringify(output.Payload?.transformToString())).toContain('dear asset'); }), ); @@ -1360,7 +1441,9 @@ integTest( // This should have succeeded but not deployed the stack. await expect( - fixture.aws.cloudFormation('describeStacks', { StackName: fixture.fullStackName('conditional-resource') }), + fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ StackName: fixture.fullStackName('conditional-resource') }), + ), ).rejects.toThrow('conditional-resource does not exist'); // Deploy the stack with resources @@ -1370,7 +1453,9 @@ integTest( await fixture.cdkDeploy('conditional-resource', { modEnv: { NO_RESOURCE: 'TRUE' } }); await expect( - fixture.aws.cloudFormation('describeStacks', { StackName: fixture.fullStackName('conditional-resource') }), + fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ StackName: fixture.fullStackName('conditional-resource') }), + ), ).rejects.toThrow('conditional-resource does not exist'); }), ); @@ -1447,7 +1532,7 @@ integTest( expect(changeSet4.ChangeSetId).not.toEqual(changeSet3.ChangeSetId); async function getLatestChangeSet() { - const response = await fixture.aws.cloudFormation('describeStacks', { StackName: stackArn }); + const response = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: stackArn })); if (!response.Stacks?.[0]) { throw new Error('Did not get a ChangeSet at all'); } @@ -1676,7 +1761,9 @@ integTest( expect(template.Resources.NestedStackNestedStackNestedStackNestedStackResourceB70834FD).toEqual( expect.objectContaining({ Metadata: { - 'aws:cdk:path': `${fixture.fullStackName('TestStack')}/NestedStack.NestedStack/NestedStack.NestedStackResource`, + 'aws:cdk:path': `${fixture.fullStackName( + 'TestStack', + )}/NestedStack.NestedStack/NestedStack.NestedStackResource`, 'aws:asset:path': expect.stringMatching( `${fixture.stackNamePrefix.replace(/-/, '')}TestStackNestedStack[0-9A-Z]{8}\.nested\.template\.json`, ), @@ -1835,7 +1922,9 @@ integTest( await fixture.cdkDeploy('importable-stack', { modEnv: { LARGE_TEMPLATE: '1', INCLUDE_SINGLE_QUEUE: '0', RETAIN_SINGLE_QUEUE: '0' }, }); - const cfnTemplateBeforeImport = await fixture.aws.cloudFormation('getTemplate', { StackName: fullStackName }); + const cfnTemplateBeforeImport = await fixture.aws.cloudFormation.send( + new GetTemplateCommand({ StackName: fullStackName }), + ); expect(cfnTemplateBeforeImport.TemplateBody).not.toContain(queueLogicalId); // WHEN @@ -1844,8 +1933,12 @@ integTest( }); // THEN - const describeStacksResponse = await fixture.aws.cloudFormation('describeStacks', { StackName: fullStackName }); - const cfnTemplateAfterImport = await fixture.aws.cloudFormation('getTemplate', { StackName: fullStackName }); + const describeStacksResponse = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ StackName: fullStackName }), + ); + const cfnTemplateAfterImport = await fixture.aws.cloudFormation.send( + new GetTemplateCommand({ StackName: fullStackName }), + ); expect(describeStacksResponse.Stacks![0].StackStatus).toEqual('IMPORT_COMPLETE'); expect(cfnTemplateAfterImport.TemplateBody).toContain(queueLogicalId); } finally { @@ -1926,9 +2019,11 @@ integTest( }, }); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); const functionName = response.Stacks?.[0].Outputs?.[0].OutputValue; // THEN @@ -1965,9 +2060,11 @@ integTest( }, }); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); const functionName = response.Stacks?.[0].Outputs?.[0].OutputValue; // THEN @@ -2002,9 +2099,11 @@ integTest( }, }); - const response = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); + const response = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); const serviceName = response.Stacks?.[0].Outputs?.find((output) => output.OutputKey == 'ServiceName')?.OutputValue; // THEN @@ -2032,46 +2131,25 @@ integTest( }, }); - const describeStacksResponse = await fixture.aws.cloudFormation('describeStacks', { - StackName: stackArn, - }); - const clusterName = describeStacksResponse.Stacks?.[0].Outputs?.find( - (output) => output.OutputKey == 'ClusterName', - )?.OutputValue!; - const serviceName = describeStacksResponse.Stacks?.[0].Outputs?.find( - (output) => output.OutputKey == 'ServiceName', - )?.OutputValue!; + const describeStacksResponse = await fixture.aws.cloudFormation.send( + new DescribeStacksCommand({ + StackName: stackArn, + }), + ); + const clusterName = describeStacksResponse.Stacks?.[0].Outputs?.find((output) => output.OutputKey == 'ClusterName') + ?.OutputValue!; + const serviceName = describeStacksResponse.Stacks?.[0].Outputs?.find((output) => output.OutputKey == 'ServiceName') + ?.OutputValue!; // THEN - const describeServicesResponse = await fixture.aws.ecs('describeServices', { - cluster: clusterName, - services: [serviceName], - }); - expect(describeServicesResponse.services?.[0].deployments).toHaveLength(1); // only one deployment present - }), -); - -integTest( - 'hotswap deployment for ecs service detects failed deployment and errors', - withDefaultFixture(async (fixture) => { - // GIVEN - await fixture.cdkDeploy('ecs-hotswap'); - - // WHEN - const deployOutput = await fixture.cdkDeploy('ecs-hotswap', { - options: ['--hotswap'], - modEnv: { - USE_INVALID_ECS_HOTSWAP_IMAGE: 'true', - }, - allowErrExit: true, - }); - - // THEN - expect(deployOutput).toContain( - `❌ ${fixture.stackNamePrefix}-ecs-hotswap failed: ResourceNotReady: Resource is not in the state deploymentCompleted`, + const describeServicesResponse = await fixture.aws.ecs.send( + new DescribeServicesCommand({ + cluster: clusterName, + services: [serviceName], + }), ); - expect(deployOutput).not.toContain('hotswapped!'); + expect(describeServicesResponse.services?.[0].deployments).toHaveLength(1); // only one deployment present }), ); diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/cdk.out new file mode 100644 index 0000000000000..bd5311dc372de --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"36.0.5"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/codebuild-project-arm.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/codebuild-project-arm.assets.json new file mode 100644 index 0000000000000..15d66e1bb38f4 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/codebuild-project-arm.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.5", + "files": { + "fb14db2f3f849c96db420afc9fd158b99550fa4ffa602209cd78e471a282fc4a": { + "source": { + "path": "codebuild-project-arm.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "fb14db2f3f849c96db420afc9fd158b99550fa4ffa602209cd78e471a282fc4a.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/codebuild-project-arm.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/codebuild-project-arm.template.json new file mode 100644 index 0000000000000..a902bdb9a33ce --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/codebuild-project-arm.template.json @@ -0,0 +1,497 @@ +{ + "Resources": { + "MyProjectMediumRole1F3769C8": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "MyProjectMediumRoleDefaultPolicy08D66D98": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectMediumE40D9677" + }, + ":*" + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectMediumE40D9677" + } + ] + ] + } + ] + }, + { + "Action": [ + "codebuild:BatchPutCodeCoverages", + "codebuild:BatchPutTestCases", + "codebuild:CreateReport", + "codebuild:CreateReportGroup", + "codebuild:UpdateReport" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codebuild:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":report-group/", + { + "Ref": "MyProjectMediumE40D9677" + }, + "-*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "MyProjectMediumRoleDefaultPolicy08D66D98", + "Roles": [ + { + "Ref": "MyProjectMediumRole1F3769C8" + } + ] + } + }, + "MyProjectMediumE40D9677": { + "Type": "AWS::CodeBuild::Project", + "Properties": { + "Artifacts": { + "Type": "NO_ARTIFACTS" + }, + "Cache": { + "Type": "NO_CACHE" + }, + "EncryptionKey": "alias/aws/s3", + "Environment": { + "ComputeType": "BUILD_GENERAL1_MEDIUM", + "Image": "aws/codebuild/amazonlinux2-aarch64-standard:3.0", + "ImagePullCredentialsType": "CODEBUILD", + "PrivilegedMode": false, + "Type": "ARM_CONTAINER" + }, + "ServiceRole": { + "Fn::GetAtt": [ + "MyProjectMediumRole1F3769C8", + "Arn" + ] + }, + "Source": { + "BuildSpec": "{\n \"version\": \"0.2\"\n}", + "Type": "NO_SOURCE" + } + } + }, + "MyProjectXLargeRoleC17867F7": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "MyProjectXLargeRoleDefaultPolicyACC3F91E": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectXLarge21A68AC6" + }, + ":*" + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectXLarge21A68AC6" + } + ] + ] + } + ] + }, + { + "Action": [ + "codebuild:BatchPutCodeCoverages", + "codebuild:BatchPutTestCases", + "codebuild:CreateReport", + "codebuild:CreateReportGroup", + "codebuild:UpdateReport" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codebuild:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":report-group/", + { + "Ref": "MyProjectXLarge21A68AC6" + }, + "-*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "MyProjectXLargeRoleDefaultPolicyACC3F91E", + "Roles": [ + { + "Ref": "MyProjectXLargeRoleC17867F7" + } + ] + } + }, + "MyProjectXLarge21A68AC6": { + "Type": "AWS::CodeBuild::Project", + "Properties": { + "Artifacts": { + "Type": "NO_ARTIFACTS" + }, + "Cache": { + "Type": "NO_CACHE" + }, + "EncryptionKey": "alias/aws/s3", + "Environment": { + "ComputeType": "BUILD_GENERAL1_XLARGE", + "Image": "aws/codebuild/amazonlinux2-aarch64-standard:3.0", + "ImagePullCredentialsType": "CODEBUILD", + "PrivilegedMode": false, + "Type": "ARM_CONTAINER" + }, + "ServiceRole": { + "Fn::GetAtt": [ + "MyProjectXLargeRoleC17867F7", + "Arn" + ] + }, + "Source": { + "BuildSpec": "{\n \"version\": \"0.2\"\n}", + "Type": "NO_SOURCE" + } + } + }, + "MyProjectX2LargeRole65F64577": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "MyProjectX2LargeRoleDefaultPolicy241428C8": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectX2Large715B77CC" + }, + ":*" + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectX2Large715B77CC" + } + ] + ] + } + ] + }, + { + "Action": [ + "codebuild:BatchPutCodeCoverages", + "codebuild:BatchPutTestCases", + "codebuild:CreateReport", + "codebuild:CreateReportGroup", + "codebuild:UpdateReport" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codebuild:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":report-group/", + { + "Ref": "MyProjectX2Large715B77CC" + }, + "-*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "MyProjectX2LargeRoleDefaultPolicy241428C8", + "Roles": [ + { + "Ref": "MyProjectX2LargeRole65F64577" + } + ] + } + }, + "MyProjectX2Large715B77CC": { + "Type": "AWS::CodeBuild::Project", + "Properties": { + "Artifacts": { + "Type": "NO_ARTIFACTS" + }, + "Cache": { + "Type": "NO_CACHE" + }, + "EncryptionKey": "alias/aws/s3", + "Environment": { + "ComputeType": "BUILD_GENERAL1_2XLARGE", + "Image": "aws/codebuild/amazonlinux2-aarch64-standard:3.0", + "ImagePullCredentialsType": "CODEBUILD", + "PrivilegedMode": false, + "Type": "ARM_CONTAINER" + }, + "ServiceRole": { + "Fn::GetAtt": [ + "MyProjectX2LargeRole65F64577", + "Arn" + ] + }, + "Source": { + "BuildSpec": "{\n \"version\": \"0.2\"\n}", + "Type": "NO_SOURCE" + } + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integ.json new file mode 100644 index 0000000000000..1b19409d332b6 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "36.0.5", + "testCases": { + "integ-test-codebuild-project-arm/DefaultTest": { + "stacks": [ + "codebuild-project-arm" + ], + "assertionStack": "integ-test-codebuild-project-arm/DefaultTest/DeployAssert", + "assertionStackName": "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.assets.json new file mode 100644 index 0000000000000..f367aa992702d --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.5", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "source": { + "path": "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/manifest.json new file mode 100644 index 0000000000000..9a9ed7d53e31d --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/manifest.json @@ -0,0 +1,161 @@ +{ + "version": "36.0.5", + "artifacts": { + "codebuild-project-arm.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "codebuild-project-arm.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "codebuild-project-arm": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "codebuild-project-arm.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fb14db2f3f849c96db420afc9fd158b99550fa4ffa602209cd78e471a282fc4a.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "codebuild-project-arm.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "codebuild-project-arm.assets" + ], + "metadata": { + "/codebuild-project-arm/MyProjectMedium/Role/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectMediumRole1F3769C8" + } + ], + "/codebuild-project-arm/MyProjectMedium/Role/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectMediumRoleDefaultPolicy08D66D98" + } + ], + "/codebuild-project-arm/MyProjectMedium/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectMediumE40D9677" + } + ], + "/codebuild-project-arm/MyProjectXLarge/Role/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectXLargeRoleC17867F7" + } + ], + "/codebuild-project-arm/MyProjectXLarge/Role/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectXLargeRoleDefaultPolicyACC3F91E" + } + ], + "/codebuild-project-arm/MyProjectXLarge/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectXLarge21A68AC6" + } + ], + "/codebuild-project-arm/MyProjectX2Large/Role/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectX2LargeRole65F64577" + } + ], + "/codebuild-project-arm/MyProjectX2Large/Role/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectX2LargeRoleDefaultPolicy241428C8" + } + ], + "/codebuild-project-arm/MyProjectX2Large/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyProjectX2Large715B77CC" + } + ], + "/codebuild-project-arm/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/codebuild-project-arm/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "codebuild-project-arm" + }, + "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "integtestcodebuildprojectarmDefaultTestDeployAssert4EE92337.assets" + ], + "metadata": { + "/integ-test-codebuild-project-arm/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/integ-test-codebuild-project-arm/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "integ-test-codebuild-project-arm/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/tree.json new file mode 100644 index 0000000000000..a3bb52be1cc6d --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.js.snapshot/tree.json @@ -0,0 +1,746 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "codebuild-project-arm": { + "id": "codebuild-project-arm", + "path": "codebuild-project-arm", + "children": { + "MyProjectMedium": { + "id": "MyProjectMedium", + "path": "codebuild-project-arm/MyProjectMedium", + "children": { + "Role": { + "id": "Role", + "path": "codebuild-project-arm/MyProjectMedium/Role", + "children": { + "ImportRole": { + "id": "ImportRole", + "path": "codebuild-project-arm/MyProjectMedium/Role/ImportRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectMedium/Role/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "codebuild-project-arm/MyProjectMedium/Role/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectMedium/Role/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectMediumE40D9677" + }, + ":*" + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectMediumE40D9677" + } + ] + ] + } + ] + }, + { + "Action": [ + "codebuild:BatchPutCodeCoverages", + "codebuild:BatchPutTestCases", + "codebuild:CreateReport", + "codebuild:CreateReportGroup", + "codebuild:UpdateReport" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codebuild:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":report-group/", + { + "Ref": "MyProjectMediumE40D9677" + }, + "-*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "policyName": "MyProjectMediumRoleDefaultPolicy08D66D98", + "roles": [ + { + "Ref": "MyProjectMediumRole1F3769C8" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectMedium/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::CodeBuild::Project", + "aws:cdk:cloudformation:props": { + "artifacts": { + "type": "NO_ARTIFACTS" + }, + "cache": { + "type": "NO_CACHE" + }, + "encryptionKey": "alias/aws/s3", + "environment": { + "type": "ARM_CONTAINER", + "image": "aws/codebuild/amazonlinux2-aarch64-standard:3.0", + "imagePullCredentialsType": "CODEBUILD", + "privilegedMode": false, + "computeType": "BUILD_GENERAL1_MEDIUM" + }, + "serviceRole": { + "Fn::GetAtt": [ + "MyProjectMediumRole1F3769C8", + "Arn" + ] + }, + "source": { + "type": "NO_SOURCE", + "buildSpec": "{\n \"version\": \"0.2\"\n}" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_codebuild.CfnProject", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_codebuild.Project", + "version": "0.0.0" + } + }, + "MyProjectXLarge": { + "id": "MyProjectXLarge", + "path": "codebuild-project-arm/MyProjectXLarge", + "children": { + "Role": { + "id": "Role", + "path": "codebuild-project-arm/MyProjectXLarge/Role", + "children": { + "ImportRole": { + "id": "ImportRole", + "path": "codebuild-project-arm/MyProjectXLarge/Role/ImportRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectXLarge/Role/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "codebuild-project-arm/MyProjectXLarge/Role/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectXLarge/Role/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectXLarge21A68AC6" + }, + ":*" + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectXLarge21A68AC6" + } + ] + ] + } + ] + }, + { + "Action": [ + "codebuild:BatchPutCodeCoverages", + "codebuild:BatchPutTestCases", + "codebuild:CreateReport", + "codebuild:CreateReportGroup", + "codebuild:UpdateReport" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codebuild:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":report-group/", + { + "Ref": "MyProjectXLarge21A68AC6" + }, + "-*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "policyName": "MyProjectXLargeRoleDefaultPolicyACC3F91E", + "roles": [ + { + "Ref": "MyProjectXLargeRoleC17867F7" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectXLarge/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::CodeBuild::Project", + "aws:cdk:cloudformation:props": { + "artifacts": { + "type": "NO_ARTIFACTS" + }, + "cache": { + "type": "NO_CACHE" + }, + "encryptionKey": "alias/aws/s3", + "environment": { + "type": "ARM_CONTAINER", + "image": "aws/codebuild/amazonlinux2-aarch64-standard:3.0", + "imagePullCredentialsType": "CODEBUILD", + "privilegedMode": false, + "computeType": "BUILD_GENERAL1_XLARGE" + }, + "serviceRole": { + "Fn::GetAtt": [ + "MyProjectXLargeRoleC17867F7", + "Arn" + ] + }, + "source": { + "type": "NO_SOURCE", + "buildSpec": "{\n \"version\": \"0.2\"\n}" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_codebuild.CfnProject", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_codebuild.Project", + "version": "0.0.0" + } + }, + "MyProjectX2Large": { + "id": "MyProjectX2Large", + "path": "codebuild-project-arm/MyProjectX2Large", + "children": { + "Role": { + "id": "Role", + "path": "codebuild-project-arm/MyProjectX2Large/Role", + "children": { + "ImportRole": { + "id": "ImportRole", + "path": "codebuild-project-arm/MyProjectX2Large/Role/ImportRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectX2Large/Role/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "codebuild-project-arm/MyProjectX2Large/Role/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectX2Large/Role/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectX2Large715B77CC" + }, + ":*" + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/codebuild/", + { + "Ref": "MyProjectX2Large715B77CC" + } + ] + ] + } + ] + }, + { + "Action": [ + "codebuild:BatchPutCodeCoverages", + "codebuild:BatchPutTestCases", + "codebuild:CreateReport", + "codebuild:CreateReportGroup", + "codebuild:UpdateReport" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codebuild:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":report-group/", + { + "Ref": "MyProjectX2Large715B77CC" + }, + "-*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "policyName": "MyProjectX2LargeRoleDefaultPolicy241428C8", + "roles": [ + { + "Ref": "MyProjectX2LargeRole65F64577" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "codebuild-project-arm/MyProjectX2Large/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::CodeBuild::Project", + "aws:cdk:cloudformation:props": { + "artifacts": { + "type": "NO_ARTIFACTS" + }, + "cache": { + "type": "NO_CACHE" + }, + "encryptionKey": "alias/aws/s3", + "environment": { + "type": "ARM_CONTAINER", + "image": "aws/codebuild/amazonlinux2-aarch64-standard:3.0", + "imagePullCredentialsType": "CODEBUILD", + "privilegedMode": false, + "computeType": "BUILD_GENERAL1_2XLARGE" + }, + "serviceRole": { + "Fn::GetAtt": [ + "MyProjectX2LargeRole65F64577", + "Arn" + ] + }, + "source": { + "type": "NO_SOURCE", + "buildSpec": "{\n \"version\": \"0.2\"\n}" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_codebuild.CfnProject", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_codebuild.Project", + "version": "0.0.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "codebuild-project-arm/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "codebuild-project-arm/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + }, + "integ-test-codebuild-project-arm": { + "id": "integ-test-codebuild-project-arm", + "path": "integ-test-codebuild-project-arm", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "integ-test-codebuild-project-arm/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "integ-test-codebuild-project-arm/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "integ-test-codebuild-project-arm/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "integ-test-codebuild-project-arm/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "integ-test-codebuild-project-arm/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", + "version": "0.0.0" + } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.App", + "version": "0.0.0" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.ts new file mode 100644 index 0000000000000..bf40ca6e8fac8 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codebuild/test/integ.project-linux-arm.ts @@ -0,0 +1,48 @@ +import { App, Stack } from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +import { BuildSpec, ComputeType, LinuxBuildImage, Project } from 'aws-cdk-lib/aws-codebuild'; +import { IntegTest } from '@aws-cdk/integ-tests-alpha'; + +class AmazonLinuxArmTestStack extends Stack { + constructor(scope: Construct, id: string) { + super(scope, id); + + new Project(this, 'MyProjectMedium', { + buildSpec: BuildSpec.fromObject({ + version: '0.2', + }), + environment: { + buildImage: LinuxBuildImage.AMAZON_LINUX_2_ARM_3, + computeType: ComputeType.MEDIUM, + }, + }); + + new Project(this, 'MyProjectXLarge', { + buildSpec: BuildSpec.fromObject({ + version: '0.2', + }), + environment: { + buildImage: LinuxBuildImage.AMAZON_LINUX_2_ARM_3, + computeType: ComputeType.X_LARGE, + }, + }); + + new Project(this, 'MyProjectX2Large', { + buildSpec: BuildSpec.fromObject({ + version: '0.2', + }), + environment: { + buildImage: LinuxBuildImage.AMAZON_LINUX_2_ARM_3, + computeType: ComputeType.X2_LARGE, + }, + }); + } +} + +const app = new App(); + +const codebuildArm = new AmazonLinuxArmTestStack(app, 'codebuild-project-arm'); + +new IntegTest(app, 'integ-test-codebuild-project-arm', { + testCases: [codebuildArm], +}); diff --git a/packages/@aws-cdk/aws-location-alpha/README.md b/packages/@aws-cdk/aws-location-alpha/README.md index 33398554e31fd..810c29532a163 100644 --- a/packages/@aws-cdk/aws-location-alpha/README.md +++ b/packages/@aws-cdk/aws-location-alpha/README.md @@ -77,3 +77,30 @@ const geofenceCollection = new location.GeofenceCollection(this, 'GeofenceCollec geofenceCollection.grantRead(role); ``` + +## Route Calculator + +Route calculator resources allow you to find routes and estimate travel time based on up-to-date road network and live traffic information from your chosen data provider. + +For more information, see [Routes](https://docs.aws.amazon.com/location/latest/developerguide/route-concepts.html). + +To create a route calculator, define a `RouteCalculator`: + +```ts +new location.RouteCalculator(this, 'RouteCalculator', { + routeCalculatorName: 'MyRouteCalculator', // optional, defaults to a generated name + dataSource: location.DataSource.ESRI, +}); +``` + +Use the `grant()` or `grantRead()` method to grant the given identity permissions to perform actions +on the route calculator: + +```ts +declare const role: iam.Role; + +const routeCalculator = new location.RouteCalculator(this, 'RouteCalculator', { + dataSource: location.DataSource.ESRI, +}); +routeCalculator.grantRead(role); +``` diff --git a/packages/@aws-cdk/aws-location-alpha/lib/index.ts b/packages/@aws-cdk/aws-location-alpha/lib/index.ts index 2dbba33a53f09..7a5cee74e9bdd 100644 --- a/packages/@aws-cdk/aws-location-alpha/lib/index.ts +++ b/packages/@aws-cdk/aws-location-alpha/lib/index.ts @@ -1,4 +1,6 @@ export * from './geofence-collection'; export * from './place-index'; +export * from './route-calculator'; +export * from './util'; // AWS::Location CloudFormation Resources: diff --git a/packages/@aws-cdk/aws-location-alpha/lib/place-index.ts b/packages/@aws-cdk/aws-location-alpha/lib/place-index.ts index 34f35264b7ad4..026d8c5268a68 100644 --- a/packages/@aws-cdk/aws-location-alpha/lib/place-index.ts +++ b/packages/@aws-cdk/aws-location-alpha/lib/place-index.ts @@ -2,7 +2,7 @@ import * as iam from 'aws-cdk-lib/aws-iam'; import { ArnFormat, IResource, Lazy, Resource, Stack, Token } from 'aws-cdk-lib/core'; import { Construct } from 'constructs'; import { CfnPlaceIndex } from 'aws-cdk-lib/aws-location'; -import { generateUniqueId } from './util'; +import { DataSource, generateUniqueId } from './util'; /** * A Place Index @@ -59,25 +59,6 @@ export interface PlaceIndexProps { readonly description?: string; } -/** - * Data source for a place index - */ -export enum DataSource { - /** - * Esri - * - * @see https://docs.aws.amazon.com/location/latest/developerguide/esri.html - */ - ESRI = 'Esri', - - /** - * HERE - * - * @see https://docs.aws.amazon.com/location/latest/developerguide/HERE.html - */ - HERE = 'Here', -} - /** * Intend use for the results of an operation */ diff --git a/packages/@aws-cdk/aws-location-alpha/lib/route-calculator.ts b/packages/@aws-cdk/aws-location-alpha/lib/route-calculator.ts new file mode 100644 index 0000000000000..68544c461651c --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/lib/route-calculator.ts @@ -0,0 +1,158 @@ +import * as iam from 'aws-cdk-lib/aws-iam'; +import { ArnFormat, IResource, Lazy, Resource, Stack, Token } from 'aws-cdk-lib/core'; +import { Construct } from 'constructs'; +import { CfnRouteCalculator } from 'aws-cdk-lib/aws-location'; +import { generateUniqueId, DataSource } from './util'; + +/** + * A Route Calculator + */ +export interface IRouteCalculator extends IResource { + /** + * The name of the route calculator + * + * @attribute + */ + readonly routeCalculatorName: string; + + /** + * The Amazon Resource Name (ARN) of the route calculator resource + * + * @attribute Arn,CalculatorArn + */ + readonly routeCalculatorArn: string; +} + +/** + * Properties for a route calculator + */ +export interface RouteCalculatorProps { + /** + * A name for the route calculator + * + * Must be between 1 and 100 characters and contain only alphanumeric characters, + * hyphens, periods and underscores. + * + * @default - A name is automatically generated + */ + readonly routeCalculatorName?: string; + + /** + * Data source for the route calculator + */ + readonly dataSource: DataSource; + + /** + * A description for the route calculator + * + * @default - no description + */ + readonly description?: string; +} + +/** + * A Route Calculator + * + * @see https://docs.aws.amazon.com/location/latest/developerguide/places-concepts.html + */ +export class RouteCalculator extends Resource implements IRouteCalculator { + /** + * Use an existing route calculator by name + */ + public static fromRouteCalculatorName(scope: Construct, id: string, routeCalculatorName: string): IRouteCalculator { + const routeCalculatorArn = Stack.of(scope).formatArn({ + service: 'geo', + resource: 'route-calculator', + resourceName: routeCalculatorName, + }); + + return RouteCalculator.fromRouteCalculatorArn(scope, id, routeCalculatorArn); + } + + /** + * Use an existing route calculator by ARN + */ + public static fromRouteCalculatorArn(scope: Construct, id: string, routeCalculatorArn: string): IRouteCalculator { + const parsedArn = Stack.of(scope).splitArn(routeCalculatorArn, ArnFormat.SLASH_RESOURCE_NAME); + + if (!parsedArn.resourceName) { + throw new Error(`Route Calculator Arn ${routeCalculatorArn} does not have a resource name.`); + } + + class Import extends Resource implements IRouteCalculator { + public readonly routeCalculatorName = parsedArn.resourceName!; + public readonly routeCalculatorArn = routeCalculatorArn; + } + + return new Import(scope, id, { + account: parsedArn.account, + region: parsedArn.region, + }); + } + + public readonly routeCalculatorName: string; + + public readonly routeCalculatorArn: string; + + /** + * The timestamp for when the route calculator resource was created in ISO 8601 format + * + * @attribute + */ + public readonly routeCalculatorCreateTime: string; + + /** + * The timestamp for when the route calculator resource was last updated in ISO 8601 format + * + * @attribute + */ + public readonly routeCalculatorUpdateTime: string; + + constructor(scope: Construct, id: string, props: RouteCalculatorProps) { + + if (props.description && !Token.isUnresolved(props.description) && props.description.length > 1000) { + throw new Error(`\`description\` must be between 0 and 1000 characters. Received: ${props.description.length} characters`); + } + + if (props.routeCalculatorName && !Token.isUnresolved(props.routeCalculatorName) && !/^[-.\w]{1,100}$/.test(props.routeCalculatorName)) { + throw new Error(`Invalid route calculator name. The route calculator name must be between 1 and 100 characters and contain only alphanumeric characters, hyphens, periods and underscores. Received: ${props.routeCalculatorName}`); + } + + super(scope, id, { + physicalName: props.routeCalculatorName ?? Lazy.string({ produce: () => generateUniqueId(this) }), + }); + + const routeCalculator = new CfnRouteCalculator(this, 'Resource', { + calculatorName: this.physicalName, + dataSource: props.dataSource ?? DataSource.ESRI, + description: props.description, + }); + + this.routeCalculatorName = routeCalculator.ref; + this.routeCalculatorArn = routeCalculator.attrArn; + this.routeCalculatorCreateTime = routeCalculator.attrCreateTime; + this.routeCalculatorUpdateTime = routeCalculator.attrUpdateTime; + } + + /** + * Grant the given principal identity permissions to perform the actions on this route calculator. + */ + public grant(grantee: iam.IGrantable, ...actions: string[]): iam.Grant { + return iam.Grant.addToPrincipal({ + grantee: grantee, + actions: actions, + resourceArns: [this.routeCalculatorArn], + }); + } + + /** + * Grant the given identity permissions to access to a route calculator resource to calculate a route. + * + * @see https://docs.aws.amazon.com/location/latest/developerguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-calculate-route + */ + public grantRead(grantee: iam.IGrantable): iam.Grant { + return this.grant(grantee, + 'geo:CalculateRoute', + ); + } +} diff --git a/packages/@aws-cdk/aws-location-alpha/lib/util.ts b/packages/@aws-cdk/aws-location-alpha/lib/util.ts index ff0871f6836ff..01b2ea55246ce 100644 --- a/packages/@aws-cdk/aws-location-alpha/lib/util.ts +++ b/packages/@aws-cdk/aws-location-alpha/lib/util.ts @@ -8,3 +8,29 @@ export function generateUniqueId(context: IConstruct): string { } return name; } + +/** + * Data source for a place index + */ +export enum DataSource { + /** + * Esri + * + * @see https://docs.aws.amazon.com/location/latest/developerguide/esri.html + */ + ESRI = 'Esri', + + /** + * Grab provides routing functionality for Southeast Asia. + * + * @see https://docs.aws.amazon.com/location/latest/developerguide/grab.html + */ + GRAB = 'Grab', + + /** + * HERE + * + * @see https://docs.aws.amazon.com/location/latest/developerguide/HERE.html + */ + HERE = 'Here', +} diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/RouteCalculatorTestDefaultTestDeployAssert5893D6F4.assets.json b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/RouteCalculatorTestDefaultTestDeployAssert5893D6F4.assets.json new file mode 100644 index 0000000000000..97878c576a8a3 --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/RouteCalculatorTestDefaultTestDeployAssert5893D6F4.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "source": { + "path": "RouteCalculatorTestDefaultTestDeployAssert5893D6F4.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/RouteCalculatorTestDefaultTestDeployAssert5893D6F4.template.json b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/RouteCalculatorTestDefaultTestDeployAssert5893D6F4.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/RouteCalculatorTestDefaultTestDeployAssert5893D6F4.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk-integ-location-route-calculator.assets.json b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk-integ-location-route-calculator.assets.json new file mode 100644 index 0000000000000..35d71aad006c3 --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk-integ-location-route-calculator.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "9c3ad46df5bdc598d0888e79b52076902e574e459c6c7be174d971890d175b88": { + "source": { + "path": "cdk-integ-location-route-calculator.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "9c3ad46df5bdc598d0888e79b52076902e574e459c6c7be174d971890d175b88.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk-integ-location-route-calculator.template.json b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk-integ-location-route-calculator.template.json new file mode 100644 index 0000000000000..14dcd7dac3bb1 --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk-integ-location-route-calculator.template.json @@ -0,0 +1,45 @@ +{ + "Resources": { + "RouteCalculator0F2D109D": { + "Type": "AWS::Location::RouteCalculator", + "Properties": { + "CalculatorName": "cdkinteglocationroutecalculatorRouteCalculator916939B5", + "DataSource": "Esri" + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk.out b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk.out new file mode 100644 index 0000000000000..1f0068d32659a --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"36.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/integ.json b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/integ.json new file mode 100644 index 0000000000000..2ae63358d507b --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "36.0.0", + "testCases": { + "RouteCalculatorTest/DefaultTest": { + "stacks": [ + "cdk-integ-location-route-calculator" + ], + "assertionStack": "RouteCalculatorTest/DefaultTest/DeployAssert", + "assertionStackName": "RouteCalculatorTestDefaultTestDeployAssert5893D6F4" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/manifest.json b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/manifest.json new file mode 100644 index 0000000000000..70a6b73e03376 --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/manifest.json @@ -0,0 +1,113 @@ +{ + "version": "36.0.0", + "artifacts": { + "cdk-integ-location-route-calculator.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "cdk-integ-location-route-calculator.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "cdk-integ-location-route-calculator": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "cdk-integ-location-route-calculator.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/9c3ad46df5bdc598d0888e79b52076902e574e459c6c7be174d971890d175b88.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "cdk-integ-location-route-calculator.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "cdk-integ-location-route-calculator.assets" + ], + "metadata": { + "/cdk-integ-location-route-calculator/RouteCalculator/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "RouteCalculator0F2D109D" + } + ], + "/cdk-integ-location-route-calculator/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/cdk-integ-location-route-calculator/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "cdk-integ-location-route-calculator" + }, + "RouteCalculatorTestDefaultTestDeployAssert5893D6F4.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "RouteCalculatorTestDefaultTestDeployAssert5893D6F4.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "RouteCalculatorTestDefaultTestDeployAssert5893D6F4": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "RouteCalculatorTestDefaultTestDeployAssert5893D6F4.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "RouteCalculatorTestDefaultTestDeployAssert5893D6F4.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "RouteCalculatorTestDefaultTestDeployAssert5893D6F4.assets" + ], + "metadata": { + "/RouteCalculatorTest/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/RouteCalculatorTest/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "RouteCalculatorTest/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/tree.json b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/tree.json new file mode 100644 index 0000000000000..6deeb865fe4e6 --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.js.snapshot/tree.json @@ -0,0 +1,126 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "cdk-integ-location-route-calculator": { + "id": "cdk-integ-location-route-calculator", + "path": "cdk-integ-location-route-calculator", + "children": { + "RouteCalculator": { + "id": "RouteCalculator", + "path": "cdk-integ-location-route-calculator/RouteCalculator", + "children": { + "Resource": { + "id": "Resource", + "path": "cdk-integ-location-route-calculator/RouteCalculator/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Location::RouteCalculator", + "aws:cdk:cloudformation:props": { + "calculatorName": "cdkinteglocationroutecalculatorRouteCalculator916939B5", + "dataSource": "Esri" + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_location.CfnRouteCalculator", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "cdk-integ-location-route-calculator/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "cdk-integ-location-route-calculator/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + }, + "RouteCalculatorTest": { + "id": "RouteCalculatorTest", + "path": "RouteCalculatorTest", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "RouteCalculatorTest/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "RouteCalculatorTest/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "RouteCalculatorTest/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "RouteCalculatorTest/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "RouteCalculatorTest/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", + "version": "0.0.0" + } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.App", + "version": "0.0.0" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.ts b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.ts new file mode 100644 index 0000000000000..4044e333bb40f --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/integ.route-calculator.ts @@ -0,0 +1,21 @@ +import { App, Stack } from 'aws-cdk-lib'; +import * as integ from '@aws-cdk/integ-tests-alpha'; +import { Construct } from 'constructs'; +import { DataSource } from '../lib'; +import { RouteCalculator } from '../lib/route-calculator'; + +class TestStack extends Stack { + constructor(scope: Construct, id: string) { + super(scope, id); + + new RouteCalculator(this, 'RouteCalculator', { + dataSource: DataSource.ESRI, + }); + } +} + +const app = new App(); + +new integ.IntegTest(app, 'RouteCalculatorTest', { + testCases: [new TestStack(app, 'cdk-integ-location-route-calculator')], +}); diff --git a/packages/@aws-cdk/aws-location-alpha/test/place-index.test.ts b/packages/@aws-cdk/aws-location-alpha/test/place-index.test.ts index a600705339445..610de8421a424 100644 --- a/packages/@aws-cdk/aws-location-alpha/test/place-index.test.ts +++ b/packages/@aws-cdk/aws-location-alpha/test/place-index.test.ts @@ -1,7 +1,8 @@ import { Match, Template } from 'aws-cdk-lib/assertions'; import * as iam from 'aws-cdk-lib/aws-iam'; import { Stack } from 'aws-cdk-lib'; -import { DataSource, IntendedUse, PlaceIndex } from '../lib/place-index'; +import { IntendedUse, PlaceIndex } from '../lib/place-index'; +import { DataSource } from '../lib'; let stack: Stack; beforeEach(() => { diff --git a/packages/@aws-cdk/aws-location-alpha/test/route-calculator.test.ts b/packages/@aws-cdk/aws-location-alpha/test/route-calculator.test.ts new file mode 100644 index 0000000000000..85ed0dce2e6b6 --- /dev/null +++ b/packages/@aws-cdk/aws-location-alpha/test/route-calculator.test.ts @@ -0,0 +1,102 @@ +import { Match, Template } from 'aws-cdk-lib/assertions'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import { Stack } from 'aws-cdk-lib'; +import { DataSource } from '../lib'; +import { RouteCalculator } from '../lib/route-calculator'; + +let stack: Stack; +beforeEach(() => { + stack = new Stack(); +}); + +test('create a route calculator', () => { + new RouteCalculator(stack, 'RouteCalculator', { + dataSource: DataSource.ESRI, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::Location::RouteCalculator', { + DataSource: 'Esri', + CalculatorName: 'RouteCalculator', + }); +}); + +test('creates a route calculator with empty description', () => { + new RouteCalculator(stack, 'RouteCalculator', { + description: '', + dataSource: DataSource.ESRI, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::Location::RouteCalculator', { + Description: '', + }); +}); + +test('throws with invalid description', () => { + expect(() => new RouteCalculator(stack, 'RouteCalculator', { + description: 'a'.repeat(1001), + dataSource: DataSource.ESRI, + })).toThrow('`description` must be between 0 and 1000 characters. Received: 1001 characters'); +}); + +test('throws with invalid name', () => { + expect(() => new RouteCalculator(stack, 'RouteCalculator', { + routeCalculatorName: 'inv@lid', + dataSource: DataSource.ESRI, + })).toThrow(/Invalid route calculator name/); +}); + +test('grant read actions', () => { + const routeCalculator = new RouteCalculator(stack, 'RouteCalculator', { + dataSource: DataSource.HERE, + }); + + const role = new iam.Role(stack, 'Role', { + assumedBy: new iam.ServicePrincipal('foo'), + }); + + routeCalculator.grantRead(role); + + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', Match.objectLike({ + PolicyDocument: Match.objectLike({ + Statement: [ + { + Action: 'geo:CalculateRoute', + Effect: 'Allow', + Resource: { + 'Fn::GetAtt': [ + 'RouteCalculator0F2D109D', + 'Arn', + ], + }, + }, + ], + }), + })); +}); + +test('import from arn', () => { + const routeCalculatorArn = stack.formatArn({ + service: 'geo', + resource: 'route-calculator', + resourceName: 'MyRouteCalculator', + }); + const routeCalculator = RouteCalculator.fromRouteCalculatorArn(stack, 'RouteCalculator', routeCalculatorArn); + + // THEN + expect(routeCalculator.routeCalculatorName).toEqual('MyRouteCalculator'); + expect(routeCalculator.routeCalculatorArn).toEqual(routeCalculatorArn); +}); + +test('import from name', () => { + // WHEN + const routeCalculatorName = 'MyRouteCalculator'; + const routeCalculator = RouteCalculator.fromRouteCalculatorName(stack, 'RouteCalculator', routeCalculatorName); + + // THEN + expect(routeCalculator.routeCalculatorName).toEqual(routeCalculatorName); + expect(routeCalculator.routeCalculatorArn).toEqual(stack.formatArn({ + service: 'geo', + resource: 'route-calculator', + resourceName: 'MyRouteCalculator', + })); +}); diff --git a/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts b/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts index 3d32d529cd3ec..7d6e507d152e2 100644 --- a/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts +++ b/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts @@ -2,7 +2,7 @@ import { BuildSpec } from './build-spec'; import { ComputeType } from './compute-type'; import { EnvironmentType } from './environment-type'; import { runScriptLinuxBuildSpec } from './private/run-script-linux-build-spec'; -import { BuildEnvironment, IBuildImage, ImagePullPrincipalType, DockerImageOptions } from './project'; +import { BuildEnvironment, IBuildImage, ImagePullPrincipalType, DockerImageOptions, isLambdaComputeType } from './project'; import * as ecr from '../../aws-ecr'; import * as secretsmanager from '../../aws-secretsmanager'; @@ -103,17 +103,13 @@ export class LinuxArmBuildImage implements IBuildImage { } /** - * Validates by checking the BuildEnvironment computeType as aarch64 images only support ComputeType.SMALL and - * ComputeType.LARGE + * Validates by checking the BuildEnvironments' images are not Lambda ComputeTypes * @param buildEnvironment BuildEnvironment */ public validate(buildEnvironment: BuildEnvironment): string[] { const ret = []; - if (buildEnvironment.computeType && - buildEnvironment.computeType !== ComputeType.SMALL && - buildEnvironment.computeType !== ComputeType.LARGE) { - ret.push(`ARM images only support ComputeTypes '${ComputeType.SMALL}' and '${ComputeType.LARGE}' - ` + - `'${buildEnvironment.computeType}' was given`); + if (buildEnvironment.computeType && isLambdaComputeType(buildEnvironment.computeType)) { + ret.push(`ARM images do not support Lambda ComputeTypes, got ${buildEnvironment.computeType}`); } return ret; } diff --git a/packages/aws-cdk-lib/aws-codebuild/test/codebuild.test.ts b/packages/aws-cdk-lib/aws-codebuild/test/codebuild.test.ts index 3eb3ac3fe6894..e0923a70b1b3b 100644 --- a/packages/aws-cdk-lib/aws-codebuild/test/codebuild.test.ts +++ b/packages/aws-cdk-lib/aws-codebuild/test/codebuild.test.ts @@ -1751,12 +1751,12 @@ describe('Linux x86-64 Image', () => { }); describe('ARM image', () => { - describe('AMAZON_LINUX_2_ARM', () => { + describe('AMAZON_LINUX_2_ARM_3', () => { test('has type ARM_CONTAINER and default ComputeType LARGE', () => { const stack = new cdk.Stack(); new codebuild.PipelineProject(stack, 'Project', { environment: { - buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM, + buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM_3, }, }); @@ -1773,7 +1773,7 @@ describe('ARM image', () => { new codebuild.PipelineProject(stack, 'Project', { environment: { computeType: codebuild.ComputeType.SMALL, - buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM, + buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM_3, }, }); @@ -1785,17 +1785,22 @@ describe('ARM image', () => { }); }); - test('cannot be used in conjunction with ComputeType MEDIUM', () => { + test('can be used with ComputeType MEDIUM', () => { const stack = new cdk.Stack(); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM, - computeType: codebuild.ComputeType.MEDIUM, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_MEDIUM' was given/); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM_3, + computeType: codebuild.ComputeType.MEDIUM, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + 'Environment': { + 'Type': 'ARM_CONTAINER', + 'ComputeType': 'BUILD_GENERAL1_MEDIUM', + }, + }); }); test('can be used with ComputeType LARGE', () => { @@ -1803,7 +1808,7 @@ describe('ARM image', () => { new codebuild.PipelineProject(stack, 'Project', { environment: { computeType: codebuild.ComputeType.LARGE, - buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM, + buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM_3, }, }); @@ -1815,17 +1820,39 @@ describe('ARM image', () => { }); }); - test('cannot be used in conjunction with ComputeType X2_LARGE', () => { + test('can be used with ComputeType X_LARGE', () => { const stack = new cdk.Stack(); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + computeType: codebuild.ComputeType.X_LARGE, + buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM_3, + }, + }); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM, - computeType: codebuild.ComputeType.X2_LARGE, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_2XLARGE' was given/); + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + 'Environment': { + 'Type': 'ARM_CONTAINER', + 'ComputeType': 'BUILD_GENERAL1_XLARGE', + }, + }); + }); + + test('can be used with ComputeType X2_LARGE', () => { + const stack = new cdk.Stack(); + + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM_3, + computeType: codebuild.ComputeType.X2_LARGE, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + 'Environment': { + 'Type': 'ARM_CONTAINER', + 'ComputeType': 'BUILD_GENERAL1_2XLARGE', + }, + }); }); test('cannot be used in conjunction with ComputeType LAMBDA_1GB', () => { @@ -1834,11 +1861,11 @@ describe('ARM image', () => { expect(() => { new codebuild.PipelineProject(stack, 'Project', { environment: { - buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM, + buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_ARM_3, computeType: codebuild.ComputeType.LAMBDA_1GB, }, }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_LAMBDA_1GB' was given/); + }).toThrow('Invalid CodeBuild environment: ARM images do not support Lambda ComputeTypes, got BUILD_LAMBDA_1GB'); }); }); }); diff --git a/packages/aws-cdk-lib/aws-codebuild/test/linux-arm-build-image.test.ts b/packages/aws-cdk-lib/aws-codebuild/test/linux-arm-build-image.test.ts index 13c09bd069214..5653bb0ce1f95 100644 --- a/packages/aws-cdk-lib/aws-codebuild/test/linux-arm-build-image.test.ts +++ b/packages/aws-cdk-lib/aws-codebuild/test/linux-arm-build-image.test.ts @@ -38,17 +38,22 @@ describe('Linux ARM build image', () => { }); }); - test('cannot be used in conjunction with ComputeType MEDIUM', () => { + test('can be used with ComputeType MEDIUM', () => { const stack = new cdk.Stack(); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_1_0, - computeType: codebuild.ComputeType.MEDIUM, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_MEDIUM' was given/); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_1_0, + computeType: codebuild.ComputeType.MEDIUM, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_MEDIUM', + }, + }); }); test('can be used with ComputeType LARGE', () => { @@ -68,17 +73,39 @@ describe('Linux ARM build image', () => { }); }); - test('cannot be used in conjunction with ComputeType X2_LARGE', () => { + test('can be used with ComputeType X_LARGE', () => { const stack = new cdk.Stack(); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + computeType: codebuild.ComputeType.X_LARGE, + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_1_0, + }, + }); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_1_0, - computeType: codebuild.ComputeType.X2_LARGE, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_2XLARGE' was given/); + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_XLARGE', + }, + }); + }); + + test('can be used with ComputeType X2_LARGE', () => { + const stack = new cdk.Stack(); + + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_1_0, + computeType: codebuild.ComputeType.X2_LARGE, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_2XLARGE', + }, + }); }); }); @@ -116,17 +143,22 @@ describe('Linux ARM build image', () => { }); }); - test('cannot be used in conjunction with ComputeType MEDIUM', () => { + test('can be used with ComputeType MEDIUM', () => { const stack = new cdk.Stack(); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_2_0, - computeType: codebuild.ComputeType.MEDIUM, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_MEDIUM' was given/); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_2_0, + computeType: codebuild.ComputeType.MEDIUM, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_MEDIUM', + }, + }); }); test('can be used with ComputeType LARGE', () => { @@ -146,17 +178,39 @@ describe('Linux ARM build image', () => { }); }); - test('cannot be used in conjunction with ComputeType X2_LARGE', () => { + test('can be used with ComputeType X_LARGE', () => { const stack = new cdk.Stack(); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + computeType: codebuild.ComputeType.X_LARGE, + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_2_0, + }, + }); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_2_0, - computeType: codebuild.ComputeType.X2_LARGE, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_2XLARGE' was given/); + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_XLARGE', + }, + }); + }); + + test('can be used with ComputeType X2_LARGE', () => { + const stack = new cdk.Stack(); + + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_2_0, + computeType: codebuild.ComputeType.X2_LARGE, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_2XLARGE', + }, + }); }); }); @@ -194,17 +248,22 @@ describe('Linux ARM build image', () => { }); }); - test('cannot be used in conjunction with ComputeType MEDIUM', () => { + test('can be used with ComputeType MEDIUM', () => { const stack = new cdk.Stack(); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_3_0, - computeType: codebuild.ComputeType.MEDIUM, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_MEDIUM' was given/); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_3_0, + computeType: codebuild.ComputeType.MEDIUM, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_MEDIUM', + }, + }); }); test('can be used with ComputeType LARGE', () => { @@ -224,17 +283,39 @@ describe('Linux ARM build image', () => { }); }); - test('cannot be used in conjunction with ComputeType X2_LARGE', () => { + test('can be used with ComputeType X_LARGE', () => { const stack = new cdk.Stack(); + new codebuild.PipelineProject(stack, 'Project', { + environment: { + computeType: codebuild.ComputeType.X_LARGE, + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_3_0, + }, + }); - expect(() => { - new codebuild.PipelineProject(stack, 'Project', { - environment: { - buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_3_0, - computeType: codebuild.ComputeType.X2_LARGE, - }, - }); - }).toThrow(/ARM images only support ComputeTypes 'BUILD_GENERAL1_SMALL' and 'BUILD_GENERAL1_LARGE' - 'BUILD_GENERAL1_2XLARGE' was given/); + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_XLARGE', + }, + }); + }); + + test('can be used with ComputeType X2_LARGE', () => { + const stack = new cdk.Stack(); + + new codebuild.PipelineProject(stack, 'Project', { + environment: { + buildImage: codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_3_0, + computeType: codebuild.ComputeType.X2_LARGE, + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + Type: 'ARM_CONTAINER', + ComputeType: 'BUILD_GENERAL1_2XLARGE', + }, + }); }); }); diff --git a/yarn.lock b/yarn.lock index 2a7db95cf30bd..142c2b2d7a8c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -136,6 +136,15 @@ "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + "@aws-crypto/crc32c@3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" @@ -145,6 +154,15 @@ "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" +"@aws-crypto/crc32c@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" + integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + "@aws-crypto/ie11-detection@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" @@ -165,6 +183,18 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/sha1-browser@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" + integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== + dependencies: + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + "@aws-crypto/sha256-browser@3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" @@ -419,6 +449,55 @@ "@smithy/util-utf8" "^2.0.2" tslib "^2.5.0" +"@aws-sdk/client-cloudformation@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.637.0.tgz#c4f8b2599b62bcfac82a5aa0613da99608ddc10f" + integrity sha512-fjXVo7nDnp13yNq2xZywOuCC2x4Y4PLGN9fHyC4QTgoqmdieNoPVsFyVKUVhi79T0Emz+vd6AqmeuBbYeX/w6A== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + uuid "^9.0.1" + "@aws-sdk/client-cloudformation@^3.529.1": version "3.609.0" resolved "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.609.0.tgz#666d0490483fa840b5df0c6b73bbc90985e50aeb" @@ -557,6 +636,54 @@ fast-xml-parser "4.2.5" tslib "^2.5.0" +"@aws-sdk/client-codeartifact@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-codeartifact/-/client-codeartifact-3.637.0.tgz#a46fe5bc621253cd538b259678d1e196e5d3066b" + integrity sha512-gWuQi9hktfQ5rQE4MrQZYQoREK6xAFH0dyJeRAhUXSG3OFOmtzk+zYXcjaLCLzYfTpnx7iaYUSQo5nq/HmOZvQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-codepipeline@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-codepipeline/-/client-codepipeline-3.421.0.tgz#d5afaf6f3adaa5ca41770d7ec6a13a8662d53344" @@ -690,6 +817,53 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" +"@aws-sdk/client-cognito-identity@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.637.0.tgz#77c755a0faa53d94910b76fc34ac0aee59263855" + integrity sha512-391mca6yEfXVcSOTLGcxzlT0QCFfvoymLlVHfb//bzl806UUTq12cR2k+AnaCKLj+QSejmA7n6lwZWADm00Fvg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-dynamodb@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.421.0.tgz#f41ecf81a8b5192b5a3f24ec4746d6d7e0436a7b" @@ -827,6 +1001,54 @@ "@smithy/util-waiter" "^2.0.9" tslib "^2.5.0" +"@aws-sdk/client-ecr@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.637.0.tgz#ce6980c9dea69945484e590f7acc1c17dc618cd3" + integrity sha512-Ai9/NcHBYdfnJdbLyYhO+mGh2JLkkIcAQ1trijMyr1U3KVRdPsUofZapBygdeJz/4wmwH+CDqFGXQnq3sI9w7Q== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + "@aws-sdk/client-ecs@3.451.0": version "3.451.0" resolved "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.451.0.tgz#3e9a4b242615a5bc88d51dd710772ae724a59677" @@ -874,6 +1096,55 @@ tslib "^2.5.0" uuid "^8.3.2" +"@aws-sdk/client-ecs@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.637.0.tgz#a0c43af287ce02d7f5aeddcb078f0be9f7d00964" + integrity sha512-/PcQKx4kBoWBpSu+10HXfU4LtUjTq92mCcJXYhjtlI8sQwkA1zvPThW0bjLJ34mIXhxvHSnUXG1NrjNZQ9ps4g== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + uuid "^9.0.1" + "@aws-sdk/client-eks@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-eks/-/client-eks-3.421.0.tgz#b47f701498c7d3babff6f358a677128cd3ae864d" @@ -1011,6 +1282,54 @@ fast-xml-parser "4.2.5" tslib "^2.5.0" +"@aws-sdk/client-iam@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.637.0.tgz#a436709b9303bd7810315d0182935dc7504069d6" + integrity sha512-mo1gCm3yayuiFPCQkY5i5wbL6jjgCprpAfeMP5zFOcDsr7BqX9ijTrRzK+dx0SwiTdRKOW6zJaDiWA1UZgb60A== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + "@aws-sdk/client-kinesis@3.451.0": version "3.451.0" resolved "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.451.0.tgz#4ee6fbe2629dd331d52316b1d1137f0b2c403f62" @@ -1153,6 +1472,58 @@ "@smithy/util-waiter" "^2.0.9" tslib "^2.5.0" +"@aws-sdk/client-lambda@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.637.0.tgz#b038535f47bde2783f7785c16814091ee1ffe7ff" + integrity sha512-XVQn4p/9XNMEImxCY97WlA83Q63HRrDhks4kby5YGG2fZckaNJxXE+/FFYsznse8hXKLUJ1/aI3hZSnXTthq5g== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/eventstream-serde-browser" "^3.0.6" + "@smithy/eventstream-serde-config-resolver" "^3.0.3" + "@smithy/eventstream-serde-node" "^3.0.5" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + "@aws-sdk/client-rds@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-rds/-/client-rds-3.421.0.tgz#67e91a32e0a2694c66e6a93826ddb9e2ddc634b1" @@ -1463,6 +1834,70 @@ fast-xml-parser "4.2.5" tslib "^2.5.0" +"@aws-sdk/client-s3@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.637.0.tgz#2879bd8ddef84397b65fa9e61bca10bb4ba08211" + integrity sha512-y6UC94fsMvhKbf0dzfnjVP1HePeGjplfcYfilZU1COIJLyTkMcUv4XcT4I407CGIrvgEafONHkiC09ygqUauNA== + dependencies: + "@aws-crypto/sha1-browser" "5.2.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-bucket-endpoint" "3.620.0" + "@aws-sdk/middleware-expect-continue" "3.620.0" + "@aws-sdk/middleware-flexible-checksums" "3.620.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-location-constraint" "3.609.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-sdk-s3" "3.635.0" + "@aws-sdk/middleware-ssec" "3.609.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/signature-v4-multi-region" "3.635.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@aws-sdk/xml-builder" "3.609.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/eventstream-serde-browser" "^3.0.6" + "@smithy/eventstream-serde-config-resolver" "^3.0.3" + "@smithy/eventstream-serde-node" "^3.0.5" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-blob-browser" "^3.1.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/hash-stream-node" "^3.1.2" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/md5-js" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + "@aws-sdk/client-secrets-manager@3.451.0": version "3.451.0" resolved "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.451.0.tgz#f2f528ebe8b4d9514289e97d8b6c865256e5463a" @@ -1552,6 +1987,53 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" +"@aws-sdk/client-sns@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.637.0.tgz#36a63419e58310b6b2750c3a2e6fc6fe0f7bae46" + integrity sha512-6FDeWqTCeIPgImMyabqoFd9/EFS3XIaMYrqmHUTSPNlrhRkuJWh+3zS/S5a7tPxqkadOIqajf9UCzMCvjJru8g== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-ssm@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.421.0.tgz#0bb2c73a2028a6fcc7497cff4651392f0e412dd2" @@ -1689,6 +2171,51 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/client-sso-oidc@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz#d7e22ce6627c3285bf311e6c9e64c22b99bbd76a" + integrity sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-sso@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.421.0.tgz#794350d63bd6b327f4919460ae908a1a39585165" @@ -1857,6 +2384,50 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/client-sso@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz#ae152759a5e1e576e1df6b8f4edaf59796e1758e" + integrity sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-sts@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.421.0.tgz#1c7b3265be3acb609159533c24421da4e9466570" @@ -2039,6 +2610,52 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/client-sts@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz#6dcde6640d8a5e60dd4a2df8557284a0226d182c" + integrity sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.637.0" + "@aws-sdk/core" "3.635.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.637.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.4.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.15" + "@smithy/util-defaults-mode-node" "^3.0.15" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-synthetics@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/client-synthetics/-/client-synthetics-3.421.0.tgz#fbc848916f51255d883c1b3b5240f8975842daba" @@ -2115,6 +2732,22 @@ fast-xml-parser "4.2.5" tslib "^2.6.2" +"@aws-sdk/core@3.635.0": + version "3.635.0" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz#74b7d0d7fa3aa39f87ea5cf4e6c97d4d84f4ef14" + integrity sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg== + dependencies: + "@smithy/core" "^2.4.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/protocol-http" "^4.1.0" + "@smithy/signature-v4" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-cognito-identity@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.421.0.tgz#d06bf11df56896feb048e057b02e98b1870bd388" @@ -2126,6 +2759,17 @@ "@smithy/types" "^2.3.3" tslib "^2.5.0" +"@aws-sdk/credential-provider-cognito-identity@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.637.0.tgz#d21f068d8fdf94f065502192a92847c2d7d83d96" + integrity sha512-9qK1mF+EThtv3tsL1C/wb9MpWctJSkzjrLTFj+0Rtk8VYm6DlGepo/I6a2x3SeDmdBfHAFSrKFU39GqWDp1mwQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.637.0" + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-env@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.418.0.tgz#7b14169350d9c14c9f656da06edf46f40a224ed2" @@ -2166,6 +2810,16 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-env@3.620.1": + version "3.620.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz#d4692c49a65ebc11dae3f7f8b053fee9268a953c" + integrity sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-http@3.609.0": version "3.609.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.609.0.tgz#836c042a012bf1b9ff9df9ae9e3d876bb492c82e" @@ -2181,6 +2835,21 @@ "@smithy/util-stream" "^3.0.5" tslib "^2.6.2" +"@aws-sdk/credential-provider-http@3.635.0": + version "3.635.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz#083439af1336693049958e4b61695e4712b30fd4" + integrity sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-stream" "^3.1.3" + tslib "^2.6.2" + "@aws-sdk/credential-provider-ini@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.421.0.tgz#b58f8fd095c4389926d0e53ed2b775b184d03ec2" @@ -2246,6 +2915,23 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-ini@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz#dae0d8b05c8b9480da5a92beb4dd244985ecbd70" + integrity sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw== + dependencies: + "@aws-sdk/credential-provider-env" "3.620.1" + "@aws-sdk/credential-provider-http" "3.635.0" + "@aws-sdk/credential-provider-process" "3.620.1" + "@aws-sdk/credential-provider-sso" "3.637.0" + "@aws-sdk/credential-provider-web-identity" "3.621.0" + "@aws-sdk/types" "3.609.0" + "@smithy/credential-provider-imds" "^3.2.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-node@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.421.0.tgz#3d1793ee47d0335532eb01a23cbb7d5320dd3056" @@ -2315,6 +3001,24 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-node@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz#0ac6678ab31783adf5b1cf03add5d1da101ea946" + integrity sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA== + dependencies: + "@aws-sdk/credential-provider-env" "3.620.1" + "@aws-sdk/credential-provider-http" "3.635.0" + "@aws-sdk/credential-provider-ini" "3.637.0" + "@aws-sdk/credential-provider-process" "3.620.1" + "@aws-sdk/credential-provider-sso" "3.637.0" + "@aws-sdk/credential-provider-web-identity" "3.621.0" + "@aws-sdk/types" "3.609.0" + "@smithy/credential-provider-imds" "^3.2.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-process@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.418.0.tgz#1cb6d816bd471db3f9724715b007035ef18b5b2b" @@ -2359,6 +3063,17 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-process@3.620.1": + version "3.620.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz#10387cf85400420bb4bbda9cc56937dcc6d6d0ee" + integrity sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-sso@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.421.0.tgz#1863eabf232dd6add900e045e36a0e6c1213e31c" @@ -2411,6 +3126,19 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-sso@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz#13acf77579df026e89ced33501489defd06a0518" + integrity sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA== + dependencies: + "@aws-sdk/client-sso" "3.637.0" + "@aws-sdk/token-providers" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-web-identity@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.418.0.tgz#c2aed2a79bf193c1fef2b98391aaa9de7336aaaf" @@ -2451,6 +3179,16 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-web-identity@3.621.0": + version "3.621.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz#b25878c0a05dad60cd5f91e7e5a31a145c2f14be" + integrity sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-providers@3.421.0": version "3.421.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.421.0.tgz#567d4b7ae00809d7d4f8dce088e6ed5b5e622b7b" @@ -2472,6 +3210,28 @@ "@smithy/types" "^2.3.3" tslib "^2.5.0" +"@aws-sdk/credential-providers@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.637.0.tgz#372598b0a29cf3ce2362081400442825555be43e" + integrity sha512-yW1scL3Z7JsrTrmhjyZsB6tsMJ49UCO42BGlNWZAW+kN1vNJ+qbv6XYQJWR4gjpuD2rdmtGcEawcgllE2Bmigw== + dependencies: + "@aws-sdk/client-cognito-identity" "3.637.0" + "@aws-sdk/client-sso" "3.637.0" + "@aws-sdk/client-sts" "3.637.0" + "@aws-sdk/credential-provider-cognito-identity" "3.637.0" + "@aws-sdk/credential-provider-env" "3.620.1" + "@aws-sdk/credential-provider-http" "3.635.0" + "@aws-sdk/credential-provider-ini" "3.637.0" + "@aws-sdk/credential-provider-node" "3.637.0" + "@aws-sdk/credential-provider-process" "3.620.1" + "@aws-sdk/credential-provider-sso" "3.637.0" + "@aws-sdk/credential-provider-web-identity" "3.621.0" + "@aws-sdk/types" "3.609.0" + "@smithy/credential-provider-imds" "^3.2.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/endpoint-cache@3.310.0": version "3.310.0" resolved "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.310.0.tgz#e6f84bfcd55462966811390ef797145559bab15a" @@ -2506,6 +3266,19 @@ "@smithy/util-config-provider" "^2.0.0" tslib "^2.5.0" +"@aws-sdk/middleware-bucket-endpoint@3.620.0": + version "3.620.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.620.0.tgz#c5dc0e98b6209a91479cad6c2c74fbc5a3429fab" + integrity sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-arn-parser" "3.568.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/middleware-endpoint-discovery@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.418.0.tgz#a3cb94f433237abc3ad01d80ff4e8bc2cc872748" @@ -2538,6 +3311,16 @@ "@smithy/types" "^2.5.0" tslib "^2.5.0" +"@aws-sdk/middleware-expect-continue@3.620.0": + version "3.620.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.620.0.tgz#6a362c0f0696dc6749108a33de9998e0fa6b50ec" + integrity sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-flexible-checksums@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.418.0.tgz#a79f44739ec918d8947294d0acc52eb7eb358773" @@ -2566,6 +3349,20 @@ "@smithy/util-utf8" "^2.0.2" tslib "^2.5.0" +"@aws-sdk/middleware-flexible-checksums@3.620.0": + version "3.620.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.620.0.tgz#42cd48cdc0ad9639545be000bf537969210ce8c5" + integrity sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@aws-crypto/crc32c" "5.2.0" + "@aws-sdk/types" "3.609.0" + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/middleware-host-header@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.418.0.tgz#35d682e14f36c9d9d7464c7c1dd582bf6611436d" @@ -2606,6 +3403,16 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/middleware-host-header@3.620.0": + version "3.620.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz#b561d419a08a984ba364c193376b482ff5224d74" + integrity sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-location-constraint@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.418.0.tgz#e62e213a72ce583ba6135db51dcc60d07825b8ee" @@ -2624,6 +3431,15 @@ "@smithy/types" "^2.5.0" tslib "^2.5.0" +"@aws-sdk/middleware-location-constraint@3.609.0": + version "3.609.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz#7ed82d71e5ddcd50683ef2bbde10d1cc2492057e" + integrity sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-logger@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.418.0.tgz#08d7419f4220c36032a070a7dbb8bbf7e744a9ce" @@ -2696,7 +3512,17 @@ integrity sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w== dependencies: "@aws-sdk/types" "3.609.0" - "@smithy/protocol-http" "^4.0.3" + "@smithy/protocol-http" "^4.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.620.0": + version "3.620.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz#f8270dfff843fd756be971e5673f89c6a24c6513" + integrity sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.1.0" "@smithy/types" "^3.3.0" tslib "^2.6.2" @@ -2760,6 +3586,26 @@ "@smithy/types" "^2.5.0" tslib "^2.5.0" +"@aws-sdk/middleware-sdk-s3@3.635.0": + version "3.635.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.635.0.tgz#be7f61c6033a803cde59ec5a29db266b42fdbc01" + integrity sha512-RLdYJPEV4JL/7NBoFUs7VlP90X++5FlJdxHz0DzCjmiD3qCviKy+Cym3qg1gBgHwucs5XisuClxDrGokhAdTQw== + dependencies: + "@aws-sdk/core" "3.635.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-arn-parser" "3.568.0" + "@smithy/core" "^2.4.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/signature-v4" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/middleware-sdk-sts@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.418.0.tgz#f167f16050e055282ddd60226a2216c84873d464" @@ -2837,6 +3683,15 @@ "@smithy/types" "^2.5.0" tslib "^2.5.0" +"@aws-sdk/middleware-ssec@3.609.0": + version "3.609.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz#b87a8bc6133f3f6bdc6801183d0f9dad3f93cf9f" + integrity sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-user-agent@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.418.0.tgz#37426cf801332165fb170b1fd62dea8bb967a1ef" @@ -2881,6 +3736,17 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/middleware-user-agent@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz#2b00de72b00953a477bcc02a68d8cbb5e9670c44" + integrity sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug== + dependencies: + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.637.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/node-http-handler@^3.370.0": version "3.374.0" resolved "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.374.0.tgz#8cd58b4d9814713e26034c12eabc119c113a5bc4" @@ -2934,6 +3800,18 @@ "@smithy/util-middleware" "^3.0.3" tslib "^2.6.2" +"@aws-sdk/region-config-resolver@3.614.0": + version "3.614.0" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz#9cebb31a5bcfea2a41891fff7f28d0164cde179a" + integrity sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + "@aws-sdk/s3-request-presigner@3.451.0": version "3.451.0" resolved "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.451.0.tgz#1728993a547017f739c9c24af2d8e058e8873c4f" @@ -2970,6 +3848,18 @@ "@smithy/types" "^2.5.0" tslib "^2.5.0" +"@aws-sdk/signature-v4-multi-region@3.635.0": + version "3.635.0" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.635.0.tgz#76e8eb66bfd9b661b4f9768b18aca2e04dd781a2" + integrity sha512-J6QY4/invOkpogCHjSaDON1hF03viPpOnsrzVuCvJMmclS/iG62R4EY0wq1alYll0YmSdmKlpJwHMWwGtqK63Q== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.635.0" + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/signature-v4" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/token-providers@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.418.0.tgz#cbfac922df397e72daf6dbdd8c1e9a140df0aa0e" @@ -3108,6 +3998,17 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/token-providers@3.614.0": + version "3.614.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz#88da04f6d4ce916b0b0f6e045676d04201fb47fd" + integrity sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/types@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.418.0.tgz#c23213110b0c313d5546c810da032a441682f49a" @@ -3147,6 +4048,13 @@ dependencies: tslib "^2.5.0" +"@aws-sdk/util-arn-parser@3.568.0": + version "3.568.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz#6a19a8c6bbaa520b6be1c278b2b8c17875b91527" + integrity sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w== + dependencies: + tslib "^2.6.2" + "@aws-sdk/util-endpoints@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.418.0.tgz#462c976f054fe260562d4d2844152a04dd883fd7" @@ -3183,6 +4091,16 @@ "@smithy/util-endpoints" "^2.0.4" tslib "^2.6.2" +"@aws-sdk/util-endpoints@3.637.0": + version "3.637.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz#e20bcb69028039fdbc06e98a3028c7f8d8e8adaa" + integrity sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + "@smithy/util-endpoints" "^2.0.5" + tslib "^2.6.2" + "@aws-sdk/util-format-url@3.418.0": version "3.418.0" resolved "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.418.0.tgz#85035e704f5996189aeec2a7bd08265bcd87f1e1" @@ -3290,6 +4208,16 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@aws-sdk/util-user-agent-node@3.614.0": + version "3.614.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz#1e3f49a80f841a3f21647baed2adce01aac5beb5" + integrity sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/util-utf8-browser@^3.0.0": version "3.259.0" resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" @@ -3304,6 +4232,14 @@ dependencies: tslib "^2.5.0" +"@aws-sdk/xml-builder@3.609.0": + version "3.609.0" + resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz#eeb3d5cde000a23cfeeefe0354b6193440dc7d87" + integrity sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -5349,6 +6285,14 @@ "@smithy/util-base64" "^2.3.0" tslib "^2.6.2" +"@smithy/chunked-blob-reader-native@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz#f1104b30030f76f9aadcbd3cdca4377bd1ba2695" + integrity sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg== + dependencies: + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + "@smithy/chunked-blob-reader@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.2.0.tgz#192c1787bf3f4f87e2763803425f418e6e613e09" @@ -5356,6 +6300,13 @@ dependencies: tslib "^2.6.2" +"@smithy/chunked-blob-reader@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz#e5d3b04e9b273ba8b7ede47461e2aa96c8aa49e0" + integrity sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA== + dependencies: + tslib "^2.6.2" + "@smithy/config-resolver@^2.0.10", "@smithy/config-resolver@^2.0.18", "@smithy/config-resolver@^2.0.21", "@smithy/config-resolver@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz#54f40478bb61709b396960a3535866dba5422757" @@ -5378,6 +6329,17 @@ "@smithy/util-middleware" "^3.0.3" tslib "^2.6.2" +"@smithy/config-resolver@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz#727978bba7ace754c741c259486a19d3083431fd" + integrity sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + "@smithy/core@^1.1.0": version "1.4.2" resolved "https://registry.npmjs.org/@smithy/core/-/core-1.4.2.tgz#1c3ed886d403041ce5bd2d816448420c57baa19c" @@ -5406,6 +6368,22 @@ "@smithy/util-middleware" "^3.0.3" tslib "^2.6.2" +"@smithy/core@^2.4.0": + version "2.4.0" + resolved "https://registry.npmjs.org/@smithy/core/-/core-2.4.0.tgz#56e917b6ab2dffeba681a05395c40a757d681147" + integrity sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w== + dependencies: + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.15" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/credential-provider-imds@^2.0.0", "@smithy/credential-provider-imds@^2.3.0": version "2.3.0" resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz#326ce401b82e53f3c7ee4862a066136959a06166" @@ -5428,6 +6406,17 @@ "@smithy/url-parser" "^3.0.3" tslib "^2.6.2" +"@smithy/credential-provider-imds@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz#0e0e7ddaff1a8633cb927aee1056c0ab506b7ecf" + integrity sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + tslib "^2.6.2" + "@smithy/eventstream-codec@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz#63d74fa817188995eb55e792a38060b0ede98dc4" @@ -5438,6 +6427,16 @@ "@smithy/util-hex-encoding" "^2.2.0" tslib "^2.6.2" +"@smithy/eventstream-codec@^3.1.2": + version "3.1.2" + resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz#4a1c72b34400631b829241151984a1ad8c4f963c" + integrity sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-hex-encoding" "^3.0.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-browser@^2.0.13", "@smithy/eventstream-serde-browser@^2.0.9": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz#69c93cc0210f04caeb0770856ef88c9a82564e11" @@ -5447,6 +6446,15 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" +"@smithy/eventstream-serde-browser@^3.0.6": + version "3.0.6" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.6.tgz#a4ab4f7cfbd137bcaa54c375276f9214e568fd8f" + integrity sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ== + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.5" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-config-resolver@^2.0.13", "@smithy/eventstream-serde-config-resolver@^2.0.9": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz#23c8698ce594a128bcc556153efb7fecf6d04f87" @@ -5455,6 +6463,14 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" +"@smithy/eventstream-serde-config-resolver@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz#f852e096d0ad112363b4685e1d441088d1fce67a" + integrity sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-node@^2.0.13", "@smithy/eventstream-serde-node@^2.0.9": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz#b82870a838b1bd32ad6e0cf33a520191a325508e" @@ -5464,6 +6480,15 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" +"@smithy/eventstream-serde-node@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.5.tgz#2bbf5c9312a28f23bc55ae284efa9499f8b8f982" + integrity sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ== + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.5" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-universal@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz#a75e330040d5e2ca2ac0d8bccde3e390ac5afd38" @@ -5473,6 +6498,15 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" +"@smithy/eventstream-serde-universal@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.5.tgz#e1cc2f71f4d174a03e00ce4b563395a81dd17bec" + integrity sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ== + dependencies: + "@smithy/eventstream-codec" "^3.1.2" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/fetch-http-handler@^2.1.5", "@smithy/fetch-http-handler@^2.2.6", "@smithy/fetch-http-handler@^2.3.1", "@smithy/fetch-http-handler@^2.5.0": version "2.5.0" resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz#0b8e1562807fdf91fe7dd5cde620d7a03ddc10ac" @@ -5495,6 +6529,17 @@ "@smithy/util-base64" "^3.0.0" tslib "^2.6.2" +"@smithy/fetch-http-handler@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz#c754de7e0ff2541b73ac9ba7cc955940114b3d62" + integrity sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg== + dependencies: + "@smithy/protocol-http" "^4.1.0" + "@smithy/querystring-builder" "^3.0.3" + "@smithy/types" "^3.3.0" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + "@smithy/hash-blob-browser@^2.0.14", "@smithy/hash-blob-browser@^2.0.9": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.2.0.tgz#d26db0e88b8fc4b59ee487bd026363ea9b48cf3a" @@ -5505,6 +6550,16 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" +"@smithy/hash-blob-browser@^3.1.2": + version "3.1.2" + resolved "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz#90281c1f183d93686fb4f26107f1819644d68829" + integrity sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg== + dependencies: + "@smithy/chunked-blob-reader" "^3.0.0" + "@smithy/chunked-blob-reader-native" "^3.0.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/hash-node@^2.0.15", "@smithy/hash-node@^2.0.17", "@smithy/hash-node@^2.0.9": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz#df29e1e64811be905cb3577703b0e2d0b07fc5cc" @@ -5534,6 +6589,15 @@ "@smithy/util-utf8" "^2.3.0" tslib "^2.6.2" +"@smithy/hash-stream-node@^3.1.2": + version "3.1.2" + resolved "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz#89f0290ae44b113863878e75b10c484ff48af71c" + integrity sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/invalid-dependency@^2.0.13", "@smithy/invalid-dependency@^2.0.15", "@smithy/invalid-dependency@^2.0.9": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz#ee3d8980022cb5edb514ac187d159b3e773640f0" @@ -5573,6 +6637,15 @@ "@smithy/util-utf8" "^2.3.0" tslib "^2.6.2" +"@smithy/md5-js@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.3.tgz#55ee40aa24075b096c39f7910590c18ff7660c98" + integrity sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/middleware-content-length@^2.0.11", "@smithy/middleware-content-length@^2.0.15", "@smithy/middleware-content-length@^2.0.17": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz#a82e97bd83d8deab69e07fea4512563bedb9461a" @@ -5591,6 +6664,15 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@smithy/middleware-content-length@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz#1680aa4fb2a1c0505756103c9a5c2916307d9035" + integrity sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw== + dependencies: + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/middleware-endpoint@^2.0.9", "@smithy/middleware-endpoint@^2.2.0", "@smithy/middleware-endpoint@^2.2.3", "@smithy/middleware-endpoint@^2.5.1": version "2.5.1" resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz#1333c58304aff4d843e8ef4b85c8cb88975dd5ad" @@ -5617,6 +6699,19 @@ "@smithy/util-middleware" "^3.0.3" tslib "^2.6.2" +"@smithy/middleware-endpoint@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz#9b8a496d87a68ec43f3f1a0139868d6765a88119" + integrity sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw== + dependencies: + "@smithy/middleware-serde" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + "@smithy/middleware-retry@^2.0.12", "@smithy/middleware-retry@^2.0.20", "@smithy/middleware-retry@^2.0.24", "@smithy/middleware-retry@^2.3.1": version "2.3.1" resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.3.1.tgz#d6fdce94f2f826642c01b4448e97a509c4556ede" @@ -5632,6 +6727,21 @@ tslib "^2.6.2" uuid "^9.0.1" +"@smithy/middleware-retry@^3.0.15": + version "3.0.15" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz#9b96900cde70d8aafd267e13f4e79241be90e0c7" + integrity sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/service-error-classification" "^3.0.3" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + tslib "^2.6.2" + uuid "^9.0.1" + "@smithy/middleware-retry@^3.0.7": version "3.0.7" resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.7.tgz#b42d90b3ecc392fdfeda1eff9dc7a023ba11d34b" @@ -5699,6 +6809,16 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@smithy/node-config-provider@^3.1.4": + version "3.1.4" + resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz#05647bed666aa8036a1ad72323c1942e5d421be1" + integrity sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ== + dependencies: + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/node-http-handler@^1.0.2": version "1.1.0" resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.1.0.tgz#887cee930b520e08043c9f41e463f8d8f5dae127" @@ -5732,6 +6852,17 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@smithy/node-http-handler@^3.1.4": + version "3.1.4" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz#be4195e45639e690d522cd5f11513ea822ff9d5f" + integrity sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg== + dependencies: + "@smithy/abort-controller" "^3.1.1" + "@smithy/protocol-http" "^4.1.0" + "@smithy/querystring-builder" "^3.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/property-provider@^2.0.0", "@smithy/property-provider@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz#37e3525a3fa3e11749f86a4f89f0fd7765a6edb0" @@ -5772,6 +6903,14 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@smithy/protocol-http@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz#23519d8f45bf4f33960ea5415847bc2b620a010b" + integrity sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/querystring-builder@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.1.0.tgz#de6306104640ade34e59be33949db6cc64aa9d7f" @@ -5845,6 +6984,14 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@smithy/shared-ini-file-loader@^3.1.4": + version "3.1.4" + resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz#7dceaf5a5307a2ee347ace8aba17312a1a3ede15" + integrity sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/signature-v4@^2.0.0": version "2.3.0" resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.3.0.tgz#c30dd4028ae50c607db99459981cce8cdab7a3fd" @@ -5871,6 +7018,20 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@smithy/signature-v4@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz#251ff43dc1f4ad66776122732fea9e56efc56443" + integrity sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-uri-escape" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/smithy-client@^2.1.15", "@smithy/smithy-client@^2.1.18", "@smithy/smithy-client@^2.1.6", "@smithy/smithy-client@^2.5.1": version "2.5.1" resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.1.tgz#0fd2efff09dc65500d260e590f7541f8a387eae3" @@ -5895,6 +7056,25 @@ "@smithy/util-stream" "^3.0.5" tslib "^2.6.2" +"@smithy/smithy-client@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.2.0.tgz#6db94024e4bdaefa079ac68dbea23dafbea230c8" + integrity sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw== + dependencies: + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + "@smithy/util-stream" "^3.1.3" + tslib "^2.6.2" + +"@smithy/types@3.3.0", "@smithy/types@^3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" + integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== + dependencies: + tslib "^2.6.2" + "@smithy/types@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz#9dc65767b0ee3d6681704fcc67665d6fc9b6a34e" @@ -5909,13 +7089,6 @@ dependencies: tslib "^2.6.2" -"@smithy/types@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" - integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== - dependencies: - tslib "^2.6.2" - "@smithy/url-parser@^2.0.13", "@smithy/url-parser@^2.0.15", "@smithy/url-parser@^2.0.9", "@smithy/url-parser@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz#6fcda6116391a4f61fef5580eb540e128359b3c0" @@ -6021,6 +7194,17 @@ bowser "^2.11.0" tslib "^2.6.2" +"@smithy/util-defaults-mode-browser@^3.0.15": + version "3.0.15" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz#df73b9ae3dddc9126e0bb93ebc720b09d7163858" + integrity sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg== + dependencies: + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + bowser "^2.11.0" + tslib "^2.6.2" + "@smithy/util-defaults-mode-browser@^3.0.7": version "3.0.7" resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.7.tgz#5868ae56c9ae4a3532c175f9c0ee281a41065215" @@ -6045,6 +7229,19 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" +"@smithy/util-defaults-mode-node@^3.0.15": + version "3.0.15" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz#d52476e1f2e66525d918b51f8d5a9b0972bf518e" + integrity sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A== + dependencies: + "@smithy/config-resolver" "^3.0.5" + "@smithy/credential-provider-imds" "^3.2.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.2.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-defaults-mode-node@^3.0.7": version "3.0.7" resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.7.tgz#e802ca57df6b8543dc288524d3894a6c357b51fc" @@ -6076,6 +7273,15 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@smithy/util-endpoints@^2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz#e3a7a4d1c41250bfd2b2d890d591273a7d8934be" + integrity sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-hex-encoding@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz#87edb7c88c2f422cfca4bb21f1394ae9602c5085" @@ -6106,6 +7312,15 @@ "@smithy/types" "^3.3.0" tslib "^2.6.2" +"@smithy/util-retry@3.0.3", "@smithy/util-retry@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz#9b2ac0dbb1c81f69812a8affa4d772bebfc0e049" + integrity sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w== + dependencies: + "@smithy/service-error-classification" "^3.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-retry@^2.0.2", "@smithy/util-retry@^2.0.6", "@smithy/util-retry@^2.0.8", "@smithy/util-retry@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz#e8e019537ab47ba6b2e87e723ec51ee223422d85" @@ -6115,15 +7330,6 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@smithy/util-retry@^3.0.3": - version "3.0.3" - resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz#9b2ac0dbb1c81f69812a8affa4d772bebfc0e049" - integrity sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w== - dependencies: - "@smithy/service-error-classification" "^3.0.3" - "@smithy/types" "^3.3.0" - tslib "^2.6.2" - "@smithy/util-stream@^2.0.12", "@smithy/util-stream@^2.0.20", "@smithy/util-stream@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz#b1279e417992a0f74afa78d7501658f174ed7370" @@ -6152,6 +7358,20 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@smithy/util-stream@^3.1.3": + version "3.1.3" + resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz#699ee2397cc1d474e46d2034039d5263812dca64" + integrity sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw== + dependencies: + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/types" "^3.3.0" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/util-uri-escape@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz#a8c5edaf19c0efdb9b51661e840549cf600a1808" @@ -9729,6 +10949,13 @@ fast-xml-parser@4.2.5: dependencies: strnum "^1.0.5" +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"