From 60699f4a712755451c144e4af6782c505f3a0b63 Mon Sep 17 00:00:00 2001 From: WinterYukky <49480575+WinterYukky@users.noreply.github.com> Date: Wed, 7 Jun 2023 00:48:37 +0900 Subject: [PATCH] feat(custom-resource): AwsCustomResource supports AWS SDK for JavaScript v3 (#25406) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What changes Add support of AWS SDK for JavaScript v3 to `AwsCustomResource`. It also continues to works with runtimes that use the AWS SDK for JavaScript v2 (e.g Node.js 16.x). **⚠️ This PR only add support, doesn' change custom resource default runtime version** ## Why need this change? Because AWS SDK for JavaScript v2 enters into maintenance mode in 2023. At least, we must upgrade Node.js runtime to 18 or higher version that using AWS SDK for JavaScript v3 in 2023. If not upgrade, when customers possibly can't use new AWS Service's APIs. ※ reference from [Document for AWS SDK for JavaScript v2](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/) > ### Version 2.x Support > We are formalizing our plans to enter AWS SDK for JavaScript v2 into maintenance mode in 2023. [AWS SDK for JavaScript v3](https://github.com/aws/aws-sdk-js-v3) is the latest and recommended version, which has been GA since December 2020. Here is [why and how you should use AWS SDK for JavaScript v3](https://aws.amazon.com/blogs/developer/why-and-how-you-should-use-aws-sdk-for-javascript-v3-on-node-js-18/). You can try our experimental migration scripts in [aws-sdk-js-codemod](https://www.npmjs.com/package/aws-sdk-js-codemod) to migrate your application from v2 to v3. To get help with your migration, please follow our general guidelines to [open an issue](https://github.com/aws/aws-sdk-js/issues/new/choose) and choose [guidance](https://github.com/aws/aws-sdk-js/issues/new?assignees=&labels=guidance%2C+needs-triage&template=---questions---help.md&title=). To give feedback on and report issues in the v3 repo, please refer to [Giving feedback and contributing](https://github.com/aws/aws-sdk-js-v3#giving-feedback-and-contributing). Watch this README and the [AWS Developer Tools Blog](https://aws.amazon.com/blogs/developer/) for updates and announcements regarding the maintenance plans and timelines. Please refer to the [AWS SDKs and Tools maintenance policy](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) for further details. ## Why don't change default runtime version? AWS Lambda uses AWS SDK for JavaScript v3 since Node.js 18.x runtime. This is major update so I think it has breaking changes. This is reason. So I plan this. 1. Add experimentally support AWS SDK for JavaScript v3 (this PR) 2. Announce experimentally support Node.js 18.x runtime for customers who wish to update 3. Change `AwsCustomResource`'s default runtime to Node.js 18.x in 2023 or Node.js 16.x EOL This plan allows time for transition before changing the default runtime for `AwsCustomResource`. ## Are there any changes to the props? Yes. The specification method for the AWS SDK for JavaScript v3 will now be supported. In AWS SDK for JavaScript v3, packages are installed for each service. Therefore, specify the package name for `service`. Also, `action` specifies the XxxClient operations provided in the package. Example of [SSM.getParameter](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/preview/client/ssm/): ```ts new AwsCustomResource(this, 'GetParameter', { resourceType: 'Custom::SSMParameter', onUpdate: { service: '@aws-sdk/client-ssm', // 'SSM' in v2 action: 'GetParameterCommand', // 'getParameter' in v2 parameters: { Name: 'foo', WithDecryption: true, }, physicalResourceId: PhysicalResourceId.fromResponse('Parameter.ARN'), }, }); ``` ## What actions do customers need to take when migrating? Nothing to do. To maintain backward compatibility, when customers provides AWS SDK for JavaScript v2 style parameters, then `AwsCustomResource` automatically convert the parameters to AWS SDK for JavaScript v3 style and handle it in lambda runtime code. Next example will be allowed. ```ts new AwsCustomResource(this, 'CostUsageReportDefinitions', { resourceType: 'Custom::CostUsageReportDefinitions', onUpdate: { service: 'CUR', // will convert to '@aws-sdk/client-cost-and-usage-report-service' action: 'describeReportDefinitions', // will convert to 'DescribeReportDefinitionsCommand' parameters: { MaxResults: 5, }, physicalResourceId: PhysicalResourceId.of('xxx'), }, }); ``` ## How can I use it before the default runtime changes? On hold. Considering overriding with [`regioninfo.Fact.register`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.region_info-readme.html#overriding-incorrect-information) or rewriting it like `addPropertyOverride` by customers. There are currently no plans to provide dedicated functions. ## Others - I added 3 packages for testing - @aws-sdk/client-s3 - @aws-sdk/credential-providers - aws-sdk-client-mock - I'm referring to part of the code at [aws-sdk-js-codemod](https://github.com/awslabs/aws-sdk-js-codemod). The license is from the same organization, so I don't think there's a problem, but I'll write it down for confirmation. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- .../integ-handlers/dependencies-sdk-v3.ts | 2 +- .../aws-sdk-v2-handler/index.js | 161 +++ .../aws-sdk-v3-handler/index.js | 139 +++ .../v2-to-v3/client-names-map.js | 35 + .../v2-to-v3/client-names.js | 340 ++++++ .../v2-to-v3/client-package-names-map.js | 127 ++ .../v2-to-v3/get-v3-client-package-name.js | 14 + .../index.js | 10 + .../shared.js | 106 ++ .../index.js | 256 ---- .../aws-cdk-sdk-js-v3.assets.json | 32 + .../aws-cdk-sdk-js-v3.template.json | 491 ++++++++ .../aws-cdk-sdk-js.assets.json | 10 +- .../aws-cdk-sdk-js.template.json | 10 +- .../integ.json | 3 +- .../manifest.json | 205 +++- .../tree.json | 819 +++++++++++-- .../integ.aws-custom-resource.ts | 162 +-- .../integ-handlers/dependencies-sdk-v3.ts | 5 +- .../aws-cdk-lib/custom-resources/README.md | 29 + .../runtime/aws-sdk-v2-handler/index.ts | 172 +++ .../runtime/aws-sdk-v3-handler/index.ts | 168 +++ .../v2-to-v3/client-names-map.ts | 32 + .../v2-to-v3/client-names.ts | 336 +++++ .../v2-to-v3/client-package-names-map.ts | 127 ++ .../v2-to-v3/get-v3-client-package-name.ts | 8 + .../lib/aws-custom-resource/runtime/index.ts | 283 +---- .../lib/aws-custom-resource/runtime/shared.ts | 112 ++ ...s-custom-resource-provider-sdk-v2.test.ts} | 40 +- .../runtime/aws-sdk-v2-handler.test.ts | 158 +++ .../runtime/aws-sdk-v3-handler.test.ts | 630 ++++++++++ .../aws-custom-resource/runtime/index.test.ts | 176 +-- .../runtime/shared.test.ts | 36 + packages/aws-cdk-lib/package.json | 3 + packages/aws-cdk/package.json | 16 +- yarn.lock | 1079 ++++++++++++++++- 36 files changed, 5386 insertions(+), 946 deletions(-) create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v2-handler/index.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/index.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names-map.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/index.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/shared.js delete mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce/index.js create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.assets.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.template.json create mode 100644 packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v2-handler/index.ts create mode 100644 packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/index.ts create mode 100644 packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names-map.ts create mode 100644 packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names.ts create mode 100644 packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.ts create mode 100644 packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.ts create mode 100644 packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/shared.ts rename packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/{aws-custom-resource-provider.test.ts => aws-custom-resource-provider-sdk-v2.test.ts} (93%) create mode 100644 packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v2-handler.test.ts create mode 100644 packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v3-handler.test.ts create mode 100644 packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/shared.test.ts diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts index c9e26a3e0715a..b165b0e5f9149 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts @@ -2,7 +2,7 @@ // @ts-ignore import { S3Client } from '@aws-sdk/client-s3'; // eslint-disable-line import/no-extraneous-dependencies, import/no-unresolved -const s3 = new S3Client(); +const s3 = new S3Client({}); export async function handler() { console.log(s3); diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v2-handler/index.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v2-handler/index.js new file mode 100644 index 0000000000000..ffb5d366a752e --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v2-handler/index.js @@ -0,0 +1,161 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = exports.forceSdkInstallation = void 0; +/* eslint-disable no-console */ +const child_process_1 = require("child_process"); +const fs = require("fs"); +const path_1 = require("path"); +const shared_1 = require("../shared"); +let latestSdkInstalled = false; +function forceSdkInstallation() { + latestSdkInstalled = false; +} +exports.forceSdkInstallation = forceSdkInstallation; +/** + * Installs latest AWS SDK v2 + */ +function installLatestSdk() { + console.log('Installing latest AWS SDK v2'); + // Both HOME and --prefix are needed here because /tmp is the only writable location + (0, child_process_1.execSync)('HOME=/tmp npm install aws-sdk@2 --production --no-package-lock --no-save --prefix /tmp'); + latestSdkInstalled = true; +} +// no currently patched services +const patchedServices = []; +/** + * Patches the AWS SDK by loading service models in the same manner as the actual SDK + */ +function patchSdk(awsSdk) { + const apiLoader = awsSdk.apiLoader; + patchedServices.forEach(({ serviceName, apiVersions }) => { + const lowerServiceName = serviceName.toLowerCase(); + if (!awsSdk.Service.hasService(lowerServiceName)) { + apiLoader.services[lowerServiceName] = {}; + awsSdk[serviceName] = awsSdk.Service.defineService(lowerServiceName, apiVersions); + } + else { + awsSdk.Service.addVersions(awsSdk[serviceName], apiVersions); + } + apiVersions.forEach(apiVersion => { + Object.defineProperty(apiLoader.services[lowerServiceName], apiVersion, { + get: function get() { + const modelFilePrefix = `aws-sdk-patch/${lowerServiceName}-${apiVersion}`; + const model = JSON.parse(fs.readFileSync((0, path_1.join)(__dirname, `${modelFilePrefix}.service.json`), 'utf-8')); + model.paginators = JSON.parse(fs.readFileSync((0, path_1.join)(__dirname, `${modelFilePrefix}.paginators.json`), 'utf-8')).pagination; + return model; + }, + enumerable: true, + configurable: true, + }); + }); + }); + return awsSdk; +} +/* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */ +async function handler(event, context) { + try { + let AWS; + if (!latestSdkInstalled && event.ResourceProperties.InstallLatestAwsSdk === 'true') { + try { + installLatestSdk(); + AWS = require('/tmp/node_modules/aws-sdk'); + } + catch (e) { + console.log(`Failed to install latest AWS SDK v2: ${e}`); + AWS = require('aws-sdk'); // Fallback to pre-installed version + } + } + else if (latestSdkInstalled) { + AWS = require('/tmp/node_modules/aws-sdk'); + } + else { + AWS = require('aws-sdk'); + } + try { + AWS = patchSdk(AWS); + } + catch (e) { + console.log(`Failed to patch AWS SDK: ${e}. Proceeding with the installed copy.`); + } + console.log(JSON.stringify({ ...event, ResponseURL: '...' })); + console.log('AWS SDK VERSION: ' + AWS.VERSION); + event.ResourceProperties.Create = (0, shared_1.decodeCall)(event.ResourceProperties.Create); + event.ResourceProperties.Update = (0, shared_1.decodeCall)(event.ResourceProperties.Update); + event.ResourceProperties.Delete = (0, shared_1.decodeCall)(event.ResourceProperties.Delete); + // Default physical resource id + let physicalResourceId; + switch (event.RequestType) { + case 'Create': + physicalResourceId = event.ResourceProperties.Create?.physicalResourceId?.id ?? + event.ResourceProperties.Update?.physicalResourceId?.id ?? + event.ResourceProperties.Delete?.physicalResourceId?.id ?? + event.LogicalResourceId; + break; + case 'Update': + case 'Delete': + physicalResourceId = event.ResourceProperties[event.RequestType]?.physicalResourceId?.id ?? event.PhysicalResourceId; + break; + } + let flatData = {}; + let data = {}; + const call = event.ResourceProperties[event.RequestType]; + if (call) { + let credentials; + if (call.assumedRoleArn) { + const timestamp = (new Date()).getTime(); + const params = { + RoleArn: call.assumedRoleArn, + RoleSessionName: `${timestamp}-${physicalResourceId}`.substring(0, 64), + }; + credentials = new AWS.ChainableTemporaryCredentials({ + params: params, + stsConfig: { stsRegionalEndpoints: 'regional' }, + }); + } + if (!Object.prototype.hasOwnProperty.call(AWS, call.service)) { + throw Error(`Service ${call.service} does not exist in AWS SDK version ${AWS.VERSION}.`); + } + const awsService = new AWS[call.service]({ + apiVersion: call.apiVersion, + credentials: credentials, + region: call.region, + }); + try { + const response = await awsService[call.action](call.parameters && (0, shared_1.decodeSpecialValues)(call.parameters, physicalResourceId)).promise(); + flatData = { + apiVersion: awsService.config.apiVersion, + region: awsService.config.region, + ...(0, shared_1.flatten)(response), + }; + let outputPaths; + if (call.outputPath) { + outputPaths = [call.outputPath]; + } + else if (call.outputPaths) { + outputPaths = call.outputPaths; + } + if (outputPaths) { + data = (0, shared_1.filterKeys)(flatData, (0, shared_1.startsWithOneOf)(outputPaths)); + } + else { + data = flatData; + } + } + catch (e) { + if (!call.ignoreErrorCodesMatching || !new RegExp(call.ignoreErrorCodesMatching).test(e.code)) { + throw e; + } + } + if (call.physicalResourceId?.responsePath) { + physicalResourceId = flatData[call.physicalResourceId.responsePath]; + } + } + await (0, shared_1.respond)(event, 'SUCCESS', 'OK', physicalResourceId, data); + } + catch (e) { + console.log(e); + await (0, shared_1.respond)(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {}); + } +} +exports.handler = handler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDL0IsaURBQXlDO0FBQ3pDLHlCQUF5QjtBQUN6QiwrQkFBNEI7QUFRNUIsc0NBQTJHO0FBRTNHLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBRS9CLFNBQWdCLG9CQUFvQjtJQUNsQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFDN0IsQ0FBQztBQUZELG9EQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQjtJQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDNUMsb0ZBQW9GO0lBQ3BGLElBQUEsd0JBQVEsRUFBQyx3RkFBd0YsQ0FBQyxDQUFDO0lBQ25HLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUM1QixDQUFDO0FBRUQsZ0NBQWdDO0FBQ2hDLE1BQU0sZUFBZSxHQUFxRCxFQUFFLENBQUM7QUFDN0U7O0dBRUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxNQUFXO0lBQzNCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7UUFDdkQsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDaEQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDbkY7YUFBTTtZQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMs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LENBQUM7aUJBQ2hDO2dCQUVELElBQUksV0FBVyxFQUFFO29CQUNmLElBQUksR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxFQUFFLElBQUEsd0JBQWUsRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2lCQUMzRDtxQkFBTTtvQkFDTCxJQUFJLEdBQUcsUUFBUSxDQUFDO2lCQUNqQjthQUNGO1lBQUMsT0FBTyxDQUFNLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzdGLE1BQU0sQ0FBQyxDQUFDO2lCQUNUO2FBQ0Y7WUFFRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUU7Z0JBQ3pDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDckU7U0FDRjtRQUVELE1BQU0sSUFBQSxnQkFBTyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2pFO0lBQUMsT0FBTyxDQUFNLEVBQUU7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsTUFBTSxJQUFBLGdCQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDMUY7QUFDSCxDQUFDO0FBOUdELDBCQThHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG4vLyBpbXBvcnQgdGhlIEFXU0xhbWJkYSBwYWNrYWdlIGV4cGxpY2l0bHksXG4vLyB3aGljaCBpcyBnbG9iYWxseSBhdmFpbGFibGUgaW4gdGhlIExhbWJkYSBydW50aW1lLFxuLy8gYXMgb3RoZXJ3aXNlIGxpbmtpbmcgdGhpcyByZXBvc2l0b3J5IHdpdGggbGluay1hbGwuc2hcbi8vIGZhaWxzIGluIHRoZSBDREsgYXBwIGV4ZWN1dGVkIHdpdGggdHMtbm9kZVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyxpbXBvcnQvbm8tdW5yZXNvbHZlZCAqL1xuaW1wb3J0ICogYXMgQVdTTGFtYmRhIGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQXdzU2RrQ2FsbCB9IGZyb20gJy4uLy4uL2F3cy1jdXN0b20tcmVzb3VyY2UnO1xuaW1wb3J0IHsgZGVjb2RlQ2FsbCwgZGVjb2RlU3BlY2lhbFZhbHVlcywgZmlsdGVyS2V5cywgZmxhdHRlbiwgcmVzcG9uZCwgc3RhcnRzV2l0aE9uZU9mIH0gZnJvbSAnLi4vc2hhcmVkJztcblxubGV0IGxhdGVzdFNka0luc3RhbGxlZCA9IGZhbHNlO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9yY2VTZGtJbnN0YWxsYXRpb24oKSB7XG4gIGxhdGVzdFNka0luc3RhbGxlZCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGxhdGVzdCBBV1MgU0RLIHYyXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxMYXRlc3RTZGsoKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKCdJbnN0YWxsaW5nIGxhdGVzdCBBV1MgU0RLIHYyJyk7XG4gIC8vIEJvdGggSE9NRSBhbmQgLS1wcmVmaXggYXJlIG5lZWRlZCBoZXJlIGJlY2F1c2UgL3RtcCBpcyB0aGUgb25seSB3cml0YWJsZSBsb2NhdGlvblxuICBleGVjU3luYygnSE9NRT0vdG1wIG5wbSBpbnN0YWxsIGF3cy1zZGtAMiAtLXByb2R1Y3Rpb24gLS1uby1wYWNrYWdlLWxvY2sgLS1uby1zYXZlIC0tcHJlZml4IC90bXAnKTtcbiAgbGF0ZXN0U2RrSW5zdGFsbGVkID0gdHJ1ZTtcbn1cblxuLy8gbm8gY3VycmVudGx5IHBhdGNoZWQgc2VydmljZXNcbmNvbnN0IHBhdGNoZWRTZXJ2aWNlczogeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBhcGlWZXJzaW9uczogc3RyaW5nW10gfVtdID0gW107XG4vKipcbiAqIFBhdGNoZXMgdGhlIEFXUyBTREsgYnkgbG9hZGluZyBzZXJ2aWNlIG1vZGVscyBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdGhlIGFjdHVhbCBTREtcbiAqL1xuZnVuY3Rpb24gcGF0Y2hTZGsoYXdzU2RrOiBhbnkpOiBhbnkge1xuICBjb25zdCBhcGlMb2FkZXIgPSBhd3NTZGsuYXBpTG9hZGVyO1xuICBwYXRjaGVkU2VydmljZXMuZm9yRWFjaCgoeyBzZXJ2aWNlTmFtZSwgYXBpVmVyc2lvbnMgfSkgPT4ge1xuICAgIGNvbnN0IGxvd2VyU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghYXdzU2RrLlNlcnZpY2UuaGFzU2VydmljZShsb3dlclNlcnZpY2VOYW1lKSkge1xuICAgICAgYXBpTG9hZGVyLnNlcnZpY2VzW2xvd2VyU2VydmljZU5hbWVdID0ge307XG4gICAgICBhd3NTZGtbc2VydmljZU5hbWVdID0gYXdzU2RrLlNlcnZpY2UuZGVmaW5lU2VydmljZShsb3dlclNlcnZpY2VOYW1lLCBhcGlWZXJzaW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3c1Nkay5TZXJ2aWNlLmFkZFZlcnNpb25zKGF3c1Nka1tzZXJ2aWNlTmFtZV0sIGFwaVZlcnNpb25zKTtcbiAgICB9XG4gICAgYXBpVmVyc2lvbnMuZm9yRWFjaChhcGlWZXJzaW9uID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcGlMb2FkZXIuc2VydmljZXNbbG93ZXJTZXJ2aWNlTmFtZV0sIGFwaVZlcnNpb24sIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWxGaWxlUHJlZml4ID0gYGF3cy1zZGstcGF0Y2gvJHtsb3dlclNlcnZpY2VOYW1lfS0ke2FwaVZlcnNpb259YDtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGpvaW4oX19kaXJuYW1lLCBgJHttb2RlbEZpbGVQcmVmaXh9LnNlcnZpY2UuanNvbmApLCAndXRmLTgnKSk7XG4gICAgICAgICAgbW9kZWwucGFnaW5hdG9ycyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGpvaW4oX19kaXJuYW1lLCBgJHttb2RlbEZpbGVQcmVmaXh9LnBhZ2luYXRvcnMuanNvbmApLCAndXRmLTgnKSkucGFnaW5hdGlvbjtcbiAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGF3c1Nkaztcbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cywgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogQVdTTGFtYmRhLkNsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgY29udGV4dDogQVdTTGFtYmRhLkNvbnRleHQpIHtcbiAgdHJ5IHtcbiAgICBsZXQgQVdTOiBhbnk7XG4gICAgaWYgKCFsYXRlc3RTZGtJbnN0YWxsZWQgJiYgZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkluc3RhbGxMYXRlc3RBd3NTZGsgPT09ICd0cnVlJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFsbExhdGVzdFNkaygpO1xuICAgICAgICBBV1MgPSByZXF1aXJlKCcvdG1wL25vZGVfbW9kdWxlcy9hd3Mtc2RrJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gaW5zdGFsbCBsYXRlc3QgQVdTIFNESyB2MjogJHtlfWApO1xuICAgICAgICBBV1MgPSByZXF1aXJlKCdhd3Mtc2RrJyk7IC8vIEZhbGxiYWNrIHRvIHByZS1pbnN0YWxsZWQgdmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGF0ZXN0U2RrSW5zdGFsbGVkKSB7XG4gICAgICBBV1MgPSByZXF1aXJlKCcvdG1wL25vZGVfbW9kdWxlcy9hd3Mtc2RrJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEFXUyA9IHJlcXVpcmUoJ2F3cy1zZGsnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIEFXUyA9IHBhdGNoU2RrKEFXUyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBwYXRjaCBBV1MgU0RLOiAke2V9LiBQcm9jZWVkaW5nIHdpdGggdGhlIGluc3RhbGxlZCBjb3B5LmApO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgLi4uZXZlbnQsIFJlc3BvbnNlVVJMOiAnLi4uJyB9KSk7XG4gICAgY29uc29sZS5sb2coJ0FXUyBTREsgVkVSU0lPTjogJyArIEFXUy5WRVJTSU9OKTtcblxuICAgIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5DcmVhdGUgPSBkZWNvZGVDYWxsKGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5DcmVhdGUpO1xuICAgIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5VcGRhdGUgPSBkZWNvZGVDYWxsKGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5VcGRhdGUpO1xuICAgIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5EZWxldGUgPSBkZWNvZGVDYWxsKGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5EZWxldGUpO1xuICAgIC8vIERlZmF1bHQgcGh5c2ljYWwgcmVzb3VyY2UgaWRcbiAgICBsZXQgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkNyZWF0ZT8ucGh5c2ljYWxSZXNvdXJjZUlkPy5pZCA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuVXBkYXRlPy5waHlzaWNhbFJlc291cmNlSWQ/LmlkID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5EZWxldGU/LnBoeXNpY2FsUmVzb3VyY2VJZD8uaWQgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuTG9naWNhbFJlc291cmNlSWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllc1tldmVudC5SZXF1ZXN0VHlwZV0/LnBoeXNpY2FsUmVzb3VyY2VJZD8uaWQgPz8gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgZmxhdERhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBsZXQgZGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGNvbnN0IGNhbGw6IEF3c1Nka0NhbGwgfCB1bmRlZmluZWQgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXNbZXZlbnQuUmVxdWVzdFR5cGVdO1xuXG4gICAgaWYgKGNhbGwpIHtcblxuICAgICAgbGV0IGNyZWRlbnRpYWxzO1xuICAgICAgaWYgKGNhbGwuYXNzdW1lZFJvbGVBcm4pIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgUm9sZUFybjogY2FsbC5hc3N1bWVkUm9sZUFybixcbiAgICAgICAgICBSb2xlU2Vzc2lvbk5hbWU6IGAke3RpbWVzdGFtcH0tJHtwaHlzaWNhbFJlc291cmNlSWR9YC5zdWJzdHJpbmcoMCwgNjQpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IEFXUy5DaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFscyh7XG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgc3RzQ29uZmlnOiB7IHN0c1JlZ2lvbmFsRW5kcG9pbnRzOiAncmVnaW9uYWwnIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChBV1MsIGNhbGwuc2VydmljZSkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYFNlcnZpY2UgJHtjYWxsLnNlcnZpY2V9IGRvZXMgbm90IGV4aXN0IGluIEFXUyBTREsgdmVyc2lvbiAke0FXUy5WRVJTSU9OfS5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF3c1NlcnZpY2UgPSBuZXcgKEFXUyBhcyBhbnkpW2NhbGwuc2VydmljZV0oe1xuICAgICAgICBhcGlWZXJzaW9uOiBjYWxsLmFwaVZlcnNpb24sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBjcmVkZW50aWFscyxcbiAgICAgICAgcmVnaW9uOiBjYWxsLnJlZ2lvbixcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF3c1NlcnZpY2VbY2FsbC5hY3Rpb25dKFxuICAgICAgICAgIGNhbGwucGFyYW1ldGVycyAmJiBkZWNvZGVTcGVjaWFsVmFsdWVzKGNhbGwucGFyYW1ldGVycywgcGh5c2ljYWxSZXNvdXJjZUlkKSkucHJvbWlzZSgpO1xuICAgICAgICBmbGF0RGF0YSA9IHtcbiAgICAgICAgICBhcGlWZXJzaW9uOiBhd3NTZXJ2aWNlLmNvbmZpZy5hcGlWZXJzaW9uLCAvLyBGb3IgdGVzdCBwdXJwb3NlczogY2hlY2sgaWYgYXBpVmVyc2lvbiB3YXMgY29ycmVjdGx5IHBhc3NlZC5cbiAgICAgICAgICByZWdpb246IGF3c1NlcnZpY2UuY29uZmlnLnJlZ2lvbiwgLy8gRm9yIHRlc3QgcHVycG9zZXM6IGNoZWNrIGlmIHJlZ2lvbiB3YXMgY29ycmVjdGx5IHBhc3NlZC5cbiAgICAgICAgICAuLi5mbGF0dGVuKHJlc3BvbnNlKSxcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgb3V0cHV0UGF0aHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2FsbC5vdXRwdXRQYXRoKSB7XG4gICAgICAgICAgb3V0cHV0UGF0aHMgPSBbY2FsbC5vdXRwdXRQYXRoXTtcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsLm91dHB1dFBhdGhzKSB7XG4gICAgICAgICAgb3V0cHV0UGF0aHMgPSBjYWxsLm91dHB1dFBhdGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG91dHB1dFBhdGhzKSB7XG4gICAgICAgICAgZGF0YSA9IGZpbHRlcktleXMoZmxhdERhdGEsIHN0YXJ0c1dpdGhPbmVPZihvdXRwdXRQYXRocykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGEgPSBmbGF0RGF0YTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmICghY2FsbC5pZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmcgfHwgIW5ldyBSZWdFeHAoY2FsbC5pZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmcpLnRlc3QoZS5jb2RlKSkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGwucGh5c2ljYWxSZXNvdXJjZUlkPy5yZXNwb25zZVBhdGgpIHtcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkID0gZmxhdERhdGFbY2FsbC5waHlzaWNhbFJlc291cmNlSWQucmVzcG9uc2VQYXRoXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCByZXNwb25kKGV2ZW50LCAnU1VDQ0VTUycsICdPSycsIHBoeXNpY2FsUmVzb3VyY2VJZCwgZGF0YSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIGF3YWl0IHJlc3BvbmQoZXZlbnQsICdGQUlMRUQnLCBlLm1lc3NhZ2UgfHwgJ0ludGVybmFsIEVycm9yJywgY29udGV4dC5sb2dTdHJlYW1OYW1lLCB7fSk7XG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/index.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/index.js new file mode 100644 index 0000000000000..8733b56d3e9ca --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/index.js @@ -0,0 +1,139 @@ +"use strict"; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = exports.forceSdkInstallation = void 0; +/* eslint-disable no-console */ +const child_process_1 = require("child_process"); +const get_v3_client_package_name_1 = require("./v2-to-v3/get-v3-client-package-name"); +const shared_1 = require("../shared"); +let installedSdk = {}; +function forceSdkInstallation() { + installedSdk = {}; +} +exports.forceSdkInstallation = forceSdkInstallation; +/** + * Installs latest AWS SDK v3 + */ +function installLatestSdk(packageName) { + console.log('Installing latest AWS SDK v3'); + // Both HOME and --prefix are needed here because /tmp is the only writable location + (0, child_process_1.execSync)(`HOME=/tmp npm install ${packageName} --omit=dev --no-package-lock --no-save --prefix /tmp`); + installedSdk = { + ...installedSdk, + [packageName]: true, + }; +} +async function loadAwsSdk(packageName, installLatestAwsSdk) { + var _a, _b, _c; + let awsSdk; + try { + if (!installedSdk[packageName] && installLatestAwsSdk === 'true') { + installLatestSdk(packageName); + awsSdk = await (_a = `/tmp/node_modules/${packageName}`, Promise.resolve().then(() => require(_a))).catch(async (e) => { + var _a; + console.log(`Failed to install latest AWS SDK v3: ${e}`); + return _a = packageName, Promise.resolve().then(() => require(_a)); // Fallback to pre-installed version + }); + } + else if (installedSdk[packageName]) { + awsSdk = await (_b = `/tmp/node_modules/${packageName}`, Promise.resolve().then(() => require(_b))); + } + else { + awsSdk = await (_c = packageName, Promise.resolve().then(() => require(_c))); + } + } + catch (error) { + throw Error(`Package ${packageName} does not exist.`); + } + return awsSdk; +} +/* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */ +async function handler(event, context) { + try { + event.ResourceProperties.Create = (0, shared_1.decodeCall)(event.ResourceProperties.Create); + event.ResourceProperties.Update = (0, shared_1.decodeCall)(event.ResourceProperties.Update); + event.ResourceProperties.Delete = (0, shared_1.decodeCall)(event.ResourceProperties.Delete); + let data = {}; + // Default physical resource id + let physicalResourceId; + switch (event.RequestType) { + case 'Create': + physicalResourceId = event.ResourceProperties.Create?.physicalResourceId?.id ?? + event.ResourceProperties.Update?.physicalResourceId?.id ?? + event.ResourceProperties.Delete?.physicalResourceId?.id ?? + event.LogicalResourceId; + break; + case 'Update': + case 'Delete': + physicalResourceId = event.ResourceProperties[event.RequestType]?.physicalResourceId?.id ?? event.PhysicalResourceId; + break; + } + const call = event.ResourceProperties[event.RequestType]; + if (call) { + // when provide v2 service name, transform it v3 package name. + const packageName = call.service.startsWith('@aws-sdk/') ? call.service : (0, get_v3_client_package_name_1.getV3ClientPackageName)(call.service); + let awsSdk = loadAwsSdk(packageName, event.ResourceProperties.InstallLatestAwsSdk); + console.log(JSON.stringify({ ...event, ResponseURL: '...' })); + let credentials; + if (call.assumedRoleArn) { + const timestamp = (new Date()).getTime(); + const params = { + RoleArn: call.assumedRoleArn, + RoleSessionName: `${timestamp}-${physicalResourceId}`.substring(0, 64), + }; + const { fromTemporaryCredentials } = await (_a = '@aws-sdk/credential-providers', Promise.resolve().then(() => require(_a))); + credentials = fromTemporaryCredentials({ + params, + }); + } + awsSdk = await awsSdk; + const ServiceClient = Object.entries(awsSdk).find(([name]) => name.endsWith('Client'))?.[1]; + const client = new ServiceClient({ + apiVersion: call.apiVersion, + credentials: credentials, + region: call.region, + }); + const commandName = call.action.endsWith('Command') ? call.action : `${call.action}Command`; + const Command = Object.entries(awsSdk).find(([name]) => name.toLowerCase() === commandName.toLowerCase())?.[1]; + let flatData = {}; + try { + // Command must pass input value https://github.com/aws/aws-sdk-js-v3/issues/424 + const response = await client.send(new Command((call.parameters && + (0, shared_1.decodeSpecialValues)(call.parameters, physicalResourceId)) ?? {})); + flatData = { + apiVersion: client.config.apiVersion, + region: await client.config.region().catch(() => undefined), + ...(0, shared_1.flatten)(response), + }; + let outputPaths; + if (call.outputPath) { + outputPaths = [call.outputPath]; + } + else if (call.outputPaths) { + outputPaths = call.outputPaths; + } + if (outputPaths) { + data = (0, shared_1.filterKeys)(flatData, (0, shared_1.startsWithOneOf)(outputPaths)); + } + else { + data = flatData; + } + } + catch (e) { + if (!call.ignoreErrorCodesMatching || !new RegExp(call.ignoreErrorCodesMatching).test(e.code)) { + throw e; + } + } + if (call.physicalResourceId?.responsePath) { + physicalResourceId = flatData[call.physicalResourceId.responsePath]; + } + } + await (0, shared_1.respond)(event, 'SUCCESS', 'OK', physicalResourceId, data); + } + catch (e) { + console.log(e); + await (0, shared_1.respond)(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {}); + } +} +exports.handler = handler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsK0JBQStCO0FBQy9CLGlEQUF5QztBQU96QyxzRkFBK0U7QUFFL0Usc0NBQTJHO0FBRTNHLElBQUksWUFBWSxHQUFtQyxFQUFFLENBQUM7QUFFdEQsU0FBZ0Isb0JBQW9CO0lBQ2xDLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUZELG9EQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFdBQW1CO0lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUM1QyxvRkFBb0Y7SUFDcEYsSUFBQSx3QkFBUSxFQUNOLHlCQUF5QixXQUFXLHVEQUF1RCxDQUM1RixDQUFDO0lBQ0YsWUFBWSxHQUFHO1FBQ2IsR0FBRyxZQUFZO1FBQ2YsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJO0tBQ3BCLENBQUM7QUFDSixDQUFDO0FBS0QsS0FBSyxVQUFVLFVBQVUsQ0FDdkIsV0FBbUIsRUFDbkIsbUJBQXNDOztJQUV0QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJO1FBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxtQkFBbUIsS0FBSyxNQUFNLEVBQUU7WUFDaEUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUIsTUFBTSxHQUFHLE1BQU0sTUFBTyxxQkFBcUIsV0FBVyxFQUFFLDZDQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUMxRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxZQUFjLFdBQVcsNENBQUUsQ0FBQyxvQ0FBb0M7WUFDbEUsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sR0FBRyxZ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RSxJQUFJLENBQUMsQ0FBQztLQUNqRTtJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLE1BQU0sSUFBQSxnQkFBTyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzFGO0FBQ0gsQ0FBQztBQTNHRCwwQkEyR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuLy8gaW1wb3J0IHRoZSBBV1NMYW1iZGEgcGFja2FnZSBleHBsaWNpdGx5LFxuLy8gd2hpY2ggaXMgZ2xvYmFsbHkgYXZhaWxhYmxlIGluIHRoZSBMYW1iZGEgcnVudGltZSxcbi8vIGFzIG90aGVyd2lzZSBsaW5raW5nIHRoaXMgcmVwb3NpdG9yeSB3aXRoIGxpbmstYWxsLnNoXG4vLyBmYWlscyBpbiB0aGUgQ0RLIGFwcCBleGVjdXRlZCB3aXRoIHRzLW5vZGVcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMsaW1wb3J0L25vLXVucmVzb2x2ZWQgKi9cbmltcG9ydCAqIGFzIEFXU0xhbWJkYSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGdldFYzQ2xpZW50UGFja2FnZU5hbWUgfSBmcm9tICcuL3YyLXRvLXYzL2dldC12My1jbGllbnQtcGFja2FnZS1uYW1lJztcbmltcG9ydCB7IEF3c1Nka0NhbGwgfSBmcm9tICcuLi8uLi9hd3MtY3VzdG9tLXJlc291cmNlJztcbmltcG9ydCB7IGRlY29kZUNhbGwsIGRlY29kZVNwZWNpYWxWYWx1ZXMsIGZpbHRlcktleXMsIGZsYXR0ZW4sIHJlc3BvbmQsIHN0YXJ0c1dpdGhPbmVPZiB9IGZyb20gJy4uL3NoYXJlZCc7XG5cbmxldCBpbnN0YWxsZWRTZGs6IHsgW3NlcnZpY2U6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gZm9yY2VTZGtJbnN0YWxsYXRpb24oKSB7XG4gIGluc3RhbGxlZFNkayA9IHt9O1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGxhdGVzdCBBV1MgU0RLIHYzXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxMYXRlc3RTZGsocGFja2FnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmxvZygnSW5zdGFsbGluZyBsYXRlc3QgQVdTIFNESyB2MycpO1xuICAvLyBCb3RoIEhPTUUgYW5kIC0tcHJlZml4IGFyZSBuZWVkZWQgaGVyZSBiZWNhdXNlIC90bXAgaXMgdGhlIG9ubHkgd3JpdGFibGUgbG9jYXRpb25cbiAgZXhlY1N5bmMoXG4gICAgYEhPTUU9L3RtcCBucG0gaW5zdGFsbCAke3BhY2thZ2VOYW1lfSAtLW9taXQ9ZGV2IC0tbm8tcGFja2FnZS1sb2NrIC0tbm8tc2F2ZSAtLXByZWZpeCAvdG1wYCxcbiAgKTtcbiAgaW5zdGFsbGVkU2RrID0ge1xuICAgIC4uLmluc3RhbGxlZFNkayxcbiAgICBbcGFja2FnZU5hbWVdOiB0cnVlLFxuICB9O1xufVxuXG5pbnRlcmZhY2UgQXdzU2RrIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5hc3luYyBmdW5jdGlvbiBsb2FkQXdzU2RrKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBpbnN0YWxsTGF0ZXN0QXdzU2RrPzogJ3RydWUnIHwgJ2ZhbHNlJyxcbikge1xuICBsZXQgYXdzU2RrOiBBd3NTZGs7XG4gIHRyeSB7XG4gICAgaWYgKCFpbnN0YWxsZWRTZGtbcGFja2FnZU5hbWVdICYmIGluc3RhbGxMYXRlc3RBd3NTZGsgPT09ICd0cnVlJykge1xuICAgICAgaW5zdGFsbExhdGVzdFNkayhwYWNrYWdlTmFtZSk7XG4gICAgICBhd3NTZGsgPSBhd2FpdCBpbXBvcnQoYC90bXAvbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9YCkuY2F0Y2goYXN5bmMgKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBpbnN0YWxsIGxhdGVzdCBBV1MgU0RLIHYzOiAke2V9YCk7XG4gICAgICAgIHJldHVybiBpbXBvcnQocGFja2FnZU5hbWUpOyAvLyBGYWxsYmFjayB0byBwcmUtaW5zdGFsbGVkIHZlcnNpb25cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbGVkU2RrW3BhY2thZ2VOYW1lXSkge1xuICAgICAgYXdzU2RrID0gYXdhaXQgaW1wb3J0KGAvdG1wL25vZGVfbW9kdWxlcy8ke3BhY2thZ2VOYW1lfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd3NTZGsgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBFcnJvcihgUGFja2FnZSAke3BhY2thZ2VOYW1lfSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgfVxuICByZXR1cm4gYXdzU2RrO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLCBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBBV1NMYW1iZGEuQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50LCBjb250ZXh0OiBBV1NMYW1iZGEuQ29udGV4dCkge1xuICB0cnkge1xuICAgIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5DcmVhdGUgPSBkZWNvZGVDYWxsKGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5DcmVhdGUpO1xuICAgIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5VcGRhdGUgPSBkZWNvZGVDYWxsKGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5VcGRhdGUpO1xuICAgIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5EZWxldGUgPSBkZWNvZGVDYWxsKGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5EZWxldGUpO1xuICAgIGxldCBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICAvLyBEZWZhdWx0IHBoeXNpY2FsIHJlc291cmNlIGlkXG4gICAgbGV0IHBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xuICAgIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5DcmVhdGU/LnBoeXNpY2FsUmVzb3VyY2VJZD8uaWQgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlVwZGF0ZT8ucGh5c2ljYWxSZXNvdXJjZUlkPy5pZCA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuRGVsZXRlPy5waHlzaWNhbFJlc291cmNlSWQ/LmlkID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXNbZXZlbnQuUmVxdWVzdFR5cGVdPy5waHlzaWNhbFJlc291cmNlSWQ/LmlkID8/IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGNhbGw6IEF3c1Nka0NhbGwgfCB1bmRlZmluZWQgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXNbZXZlbnQuUmVxdWVzdFR5cGVdO1xuICAgIGlmIChjYWxsKSB7XG4gICAgICAvLyB3aGVuIHByb3ZpZGUgdjIgc2VydmljZSBuYW1lLCB0cmFuc2Zvcm0gaXQgdjMgcGFja2FnZSBuYW1lLlxuICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBjYWxsLnNlcnZpY2Uuc3RhcnRzV2l0aCgnQGF3cy1zZGsvJykgPyBjYWxsLnNlcnZpY2UgOiBnZXRWM0NsaWVudFBhY2thZ2VOYW1lKGNhbGwuc2VydmljZSk7XG4gICAgICBsZXQgYXdzU2RrOiBBd3NTZGsgfCBQcm9taXNlPEF3c1Nkaz4gPSBsb2FkQXdzU2RrKFxuICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkluc3RhbGxMYXRlc3RBd3NTZGssXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IC4uLmV2ZW50LCBSZXNwb25zZVVSTDogJy4uLicgfSkpO1xuXG4gICAgICBsZXQgY3JlZGVudGlhbHM7XG4gICAgICBpZiAoY2FsbC5hc3N1bWVkUm9sZUFybikge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICBSb2xlQXJuOiBjYWxsLmFzc3VtZWRSb2xlQXJuLFxuICAgICAgICAgIFJvbGVTZXNzaW9uTmFtZTogYCR7dGltZXN0YW1wfS0ke3BoeXNpY2FsUmVzb3VyY2VJZH1gLnN1YnN0cmluZygwLCA2NCksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgeyBmcm9tVGVtcG9yYXJ5Q3JlZGVudGlhbHMgfSA9IGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY3JlZGVudGlhbC1wcm92aWRlcnMnIGFzIHN0cmluZyk7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gZnJvbVRlbXBvcmFyeUNyZWRlbnRpYWxzKHtcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBhd3NTZGsgPSBhd2FpdCBhd3NTZGs7XG4gICAgICBjb25zdCBTZXJ2aWNlQ2xpZW50ID0gT2JqZWN0LmVudHJpZXMoYXdzU2RrKS5maW5kKCAoW25hbWVdKSA9PiBuYW1lLmVuZHNXaXRoKCdDbGllbnQnKSApPy5bMV0gYXMge1xuICAgICAgICBuZXcgKGNvbmZpZzogYW55KToge1xuICAgICAgICAgIHNlbmQ6IChjb21tYW5kOiBhbnkpID0+IFByb21pc2U8YW55PlxuICAgICAgICAgIGNvbmZpZzogYW55XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh7XG4gICAgICAgIGFwaVZlcnNpb246IGNhbGwuYXBpVmVyc2lvbixcbiAgICAgICAgY3JlZGVudGlhbHM6IGNyZWRlbnRpYWxzLFxuICAgICAgICByZWdpb246IGNhbGwucmVnaW9uLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb21tYW5kTmFtZSA9IGNhbGwuYWN0aW9uLmVuZHNXaXRoKCdDb21tYW5kJykgPyBjYWxsLmFjdGlvbiA6IGAke2NhbGwuYWN0aW9ufUNvbW1hbmRgO1xuICAgICAgY29uc3QgQ29tbWFuZCA9IE9iamVjdC5lbnRyaWVzKGF3c1NkaykuZmluZChcbiAgICAgICAgKFtuYW1lXSkgPT4gbmFtZS50b0xvd2VyQ2FzZSgpID09PSBjb21tYW5kTmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgKT8uWzFdIGFzIHsgbmV3IChpbnB1dDogYW55KTogYW55IH07XG5cbiAgICAgIGxldCBmbGF0RGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ29tbWFuZCBtdXN0IHBhc3MgaW5wdXQgdmFsdWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzLXYzL2lzc3Vlcy80MjRcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgQ29tbWFuZChcbiAgICAgICAgICAgIChjYWxsLnBhcmFtZXRlcnMgJiZcbiAgICAgICAgICAgIGRlY29kZVNwZWNpYWxWYWx1ZXMoY2FsbC5wYXJhbWV0ZXJzLCBwaHlzaWNhbFJlc291cmNlSWQpKSA/PyB7fSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBmbGF0RGF0YSA9IHtcbiAgICAgICAgICBhcGlWZXJzaW9uOiBjbGllbnQuY29uZmlnLmFwaVZlcnNpb24sIC8vIEZvciB0ZXN0IHB1cnBvc2VzOiBjaGVjayBpZiBhcGlWZXJzaW9uIHdhcyBjb3JyZWN0bHkgcGFzc2VkLlxuICAgICAgICAgIHJlZ2lvbjogYXdhaXQgY2xpZW50LmNvbmZpZy5yZWdpb24oKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpLCAvLyBGb3IgdGVzdCBwdXJwb3NlczogY2hlY2sgaWYgcmVnaW9uIHdhcyBjb3JyZWN0bHkgcGFzc2VkLlxuICAgICAgICAgIC4uLmZsYXR0ZW4ocmVzcG9uc2UpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBvdXRwdXRQYXRoczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjYWxsLm91dHB1dFBhdGgpIHtcbiAgICAgICAgICBvdXRwdXRQYXRocyA9IFtjYWxsLm91dHB1dFBhdGhdO1xuICAgICAgICB9IGVsc2UgaWYgKGNhbGwub3V0cHV0UGF0aHMpIHtcbiAgICAgICAgICBvdXRwdXRQYXRocyA9IGNhbGwub3V0cHV0UGF0aHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3V0cHV0UGF0aHMpIHtcbiAgICAgICAgICBkYXRhID0gZmlsdGVyS2V5cyhmbGF0RGF0YSwgc3RhcnRzV2l0aE9uZU9mKG91dHB1dFBhdGhzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YSA9IGZsYXREYXRhO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKCFjYWxsLmlnbm9yZUVycm9yQ29kZXNNYXRjaGluZyB8fCAhbmV3IFJlZ0V4cChjYWxsLmlnbm9yZUVycm9yQ29kZXNNYXRjaGluZykudGVzdChlLmNvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FsbC5waHlzaWNhbFJlc291cmNlSWQ/LnJlc3BvbnNlUGF0aCkge1xuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQgPSBmbGF0RGF0YVtjYWxsLnBoeXNpY2FsUmVzb3VyY2VJZC5yZXNwb25zZVBhdGhdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHJlc3BvbmQoZXZlbnQsICdTVUNDRVNTJywgJ09LJywgcGh5c2ljYWxSZXNvdXJjZUlkLCBkYXRhKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gICAgYXdhaXQgcmVzcG9uZChldmVudCwgJ0ZBSUxFRCcsIGUubWVzc2FnZSB8fCAnSW50ZXJuYWwgRXJyb3InLCBjb250ZXh0LmxvZ1N0cmVhbU5hbWUsIHt9KTtcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names-map.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names-map.js new file mode 100644 index 0000000000000..d020e835f7aac --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names-map.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CLIENT_NAMES_MAP = void 0; +const client_names_1 = require("./client-names"); +exports.CLIENT_NAMES_MAP = { + ...client_names_1.CLIENT_NAMES.reduce((acc, name) => ({ ...acc, [name]: name }), {}), + AugmentedAIRuntime: 'SageMakerA2IRuntime', + CUR: 'CostAndUsageReportService', + CodeArtifact: 'Codeartifact', + CodeStarNotifications: 'CodestarNotifications', + CodeStarconnections: 'CodeStarConnections', + CognitoIdentityServiceProvider: 'CognitoIdentityProvider', + DMS: 'DatabaseMigrationService', + Discovery: 'ApplicationDiscoveryService', + ELB: 'ElasticLoadBalancing', + ELBv2: 'ElasticLoadBalancingV2', + EMRcontainers: 'EMRContainers', + ES: 'ElasticsearchService', + Finspacedata: 'FinspaceData', + ForecastQueryService: 'Forecastquery', + ForecastService: 'Forecast', + IVS: 'Ivs', + IdentityStore: 'Identitystore', + Iot: 'IoT', + IotData: 'IoTDataPlane', + KinesisVideoSignalingChannels: 'KinesisVideoSignaling', + LexRuntime: 'LexRuntimeService', + MQ: 'Mq', + RDSDataService: 'RDSData', + SESV2: 'SESv2', + SavingsPlans: 'Savingsplans', + StepFunctions: 'SFN', + TranscribeService: 'Transcribe', +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LW5hbWVzLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsaWVudC1uYW1lcy1tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQThDO0FBRWpDLFFBQUEsZ0JBQWdCLEdBQTJCO0lBQ3RELEdBQUcsMkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNyRSxrQkFBa0IsRUFBRSxxQkFBcUI7SUFDekMsR0FBRyxFQUFFLDJCQUEyQjtJQUNoQyxZQUFZLEVBQUUsY0FBYztJQUM1QixxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsbUJBQW1CLEVBQUUscUJBQXFCO0lBQzFDLDhCQUE4QixFQUFFLHlCQUF5QjtJQUN6RCxHQUFHLEVBQUUsMEJBQTBCO0lBQy9CLFNBQVMsRUFBRSw2QkFBNkI7SUFDeEMsR0FBRyxFQUFFLHNCQUFzQjtJQUMzQixLQUFLLEVBQUUsd0JBQXdCO0lBQy9CLGFBQWEsRUFBRSxlQUFlO0lBQzlCLEVBQUUsRUFBRSxzQkFBc0I7SUFDMUIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsb0JBQW9CLEVBQUUsZUFBZTtJQUNyQyxlQUFlLEVBQUUsVUFBVTtJQUMzQixHQUFHLEVBQUUsS0FBSztJQUNWLGFBQWEsRUFBRSxlQUFlO0lBQzlCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsT0FBTyxFQUFFLGNBQWM7SUFDdkIsNkJBQTZCLEVBQUUsdUJBQXVCO0lBQ3RELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsRUFBRSxFQUFFLElBQUk7SUFDUixjQUFjLEVBQUUsU0FBUztJQUN6QixLQUFLLEVBQUUsT0FBTztJQUNkLFlBQVksRUFBRSxjQUFjO0lBQzVCLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGlCQUFpQixFQUFFLFlBQVk7Q0FDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENMSUVOVF9OQU1FUyB9IGZyb20gJy4vY2xpZW50LW5hbWVzJztcblxuZXhwb3J0IGNvbnN0IENMSUVOVF9OQU1FU19NQVA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIC4uLkNMSUVOVF9OQU1FUy5yZWR1Y2UoKGFjYywgbmFtZSkgPT4gKHsgLi4uYWNjLCBbbmFtZV06IG5hbWUgfSksIHt9KSxcbiAgQXVnbWVudGVkQUlSdW50aW1lOiAnU2FnZU1ha2VyQTJJUnVudGltZScsXG4gIENVUjogJ0Nvc3RBbmRVc2FnZVJlcG9ydFNlcnZpY2UnLFxuICBDb2RlQXJ0aWZhY3Q6ICdDb2RlYXJ0aWZhY3QnLFxuICBDb2RlU3Rhck5vdGlmaWNhdGlvbnM6ICdDb2Rlc3Rhck5vdGlmaWNhdGlvbnMnLFxuICBDb2RlU3RhcmNvbm5lY3Rpb25zOiAnQ29kZVN0YXJDb25uZWN0aW9ucycsXG4gIENvZ25pdG9JZGVudGl0eVNlcnZpY2VQcm92aWRlcjogJ0NvZ25pdG9JZGVudGl0eVByb3ZpZGVyJyxcbiAgRE1TOiAnRGF0YWJhc2VNaWdyYXRpb25TZXJ2aWNlJyxcbiAgRGlzY292ZXJ5OiAnQXBwbGljYXRpb25EaXNjb3ZlcnlTZXJ2aWNlJyxcbiAgRUxCOiAnRWxhc3RpY0xvYWRCYWxhbmNpbmcnLFxuICBFTEJ2MjogJ0VsYXN0aWNMb2FkQmFsYW5jaW5nVjInLFxuICBFTVJjb250YWluZXJzOiAnRU1SQ29udGFpbmVycycsXG4gIEVTOiAnRWxhc3RpY3NlYXJjaFNlcnZpY2UnLFxuICBGaW5zcGFjZWRhdGE6ICdGaW5zcGFjZURhdGEnLFxuICBGb3JlY2FzdFF1ZXJ5U2VydmljZTogJ0ZvcmVjYXN0cXVlcnknLFxuICBGb3JlY2FzdFNlcnZpY2U6ICdGb3JlY2FzdCcsXG4gIElWUzogJ0l2cycsXG4gIElkZW50aXR5U3RvcmU6ICdJZGVudGl0eXN0b3JlJyxcbiAgSW90OiAnSW9UJyxcbiAgSW90RGF0YTogJ0lvVERhdGFQbGFuZScsXG4gIEtpbmVzaXNWaWRlb1NpZ25hbGluZ0NoYW5uZWxzOiAnS2luZXNpc1ZpZGVvU2lnbmFsaW5nJyxcbiAgTGV4UnVudGltZTogJ0xleFJ1bnRpbWVTZXJ2aWNlJyxcbiAgTVE6ICdNcScsXG4gIFJEU0RhdGFTZXJ2aWNlOiAnUkRTRGF0YScsXG4gIFNFU1YyOiAnU0VTdjInLFxuICBTYXZpbmdzUGxhbnM6ICdTYXZpbmdzcGxhbnMnLFxuICBTdGVwRnVuY3Rpb25zOiAnU0ZOJyxcbiAgVHJhbnNjcmliZVNlcnZpY2U6ICdUcmFuc2NyaWJlJyxcbn07Il19 \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names.js new file mode 100644 index 0000000000000..b3cb538a55dad --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-names.js @@ -0,0 +1,340 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CLIENT_NAMES = void 0; +exports.CLIENT_NAMES = [ + 'ACM', + 'ACMPCA', + 'APIGateway', + 'ARCZonalShift', + 'AccessAnalyzer', + 'Account', + 'AlexaForBusiness', + 'Amp', + 'Amplify', + 'AmplifyBackend', + 'AmplifyUIBuilder', + 'ApiGatewayManagementApi', + 'ApiGatewayV2', + 'AppConfig', + 'AppConfigData', + 'AppIntegrations', + 'AppMesh', + 'AppRunner', + 'AppStream', + 'AppSync', + 'Appflow', + 'ApplicationAutoScaling', + 'ApplicationCostProfiler', + 'ApplicationInsights', + 'Athena', + 'AuditManager', + 'AugmentedAIRuntime', + 'AutoScaling', + 'AutoScalingPlans', + 'Backup', + 'BackupGateway', + 'BackupStorage', + 'Batch', + 'Billingconductor', + 'Braket', + 'Budgets', + 'CUR', + 'Chime', + 'ChimeSDKIdentity', + 'ChimeSDKMediaPipelines', + 'ChimeSDKMeetings', + 'ChimeSDKMessaging', + 'ChimeSDKVoice', + 'Cloud9', + 'CloudControl', + 'CloudDirectory', + 'CloudFormation', + 'CloudFront', + 'CloudHSM', + 'CloudHSMV2', + 'CloudSearch', + 'CloudSearchDomain', + 'CloudTrail', + 'CloudWatch', + 'CloudWatchEvents', + 'CloudWatchLogs', + 'CodeArtifact', + 'CodeBuild', + 'CodeCatalyst', + 'CodeCommit', + 'CodeDeploy', + 'CodeGuruProfiler', + 'CodeGuruReviewer', + 'CodePipeline', + 'CodeStar', + 'CodeStarNotifications', + 'CodeStarconnections', + 'CognitoIdentity', + 'CognitoIdentityServiceProvider', + 'CognitoSync', + 'Comprehend', + 'ComprehendMedical', + 'ComputeOptimizer', + 'ConfigService', + 'Connect', + 'ConnectCampaigns', + 'ConnectCases', + 'ConnectContactLens', + 'ConnectParticipant', + 'ControlTower', + 'CostExplorer', + 'CustomerProfiles', + 'DAX', + 'DLM', + 'DMS', + 'DataBrew', + 'DataExchange', + 'DataPipeline', + 'DataSync', + 'Detective', + 'DevOpsGuru', + 'DeviceFarm', + 'DirectConnect', + 'DirectoryService', + 'Discovery', + 'DocDB', + 'DocDBElastic', + 'Drs', + 'DynamoDB', + 'DynamoDBStreams', + 'EBS', + 'EC2', + 'EC2InstanceConnect', + 'ECR', + 'ECRPUBLIC', + 'ECS', + 'EFS', + 'EKS', + 'ELB', + 'ELBv2', + 'EMR', + 'EMRServerless', + 'EMRcontainers', + 'ES', + 'ElastiCache', + 'ElasticBeanstalk', + 'ElasticInference', + 'ElasticTranscoder', + 'EventBridge', + 'Evidently', + 'FMS', + 'FSx', + 'Finspace', + 'Finspacedata', + 'Firehose', + 'Fis', + 'ForecastQueryService', + 'ForecastService', + 'FraudDetector', + 'GameLift', + 'GameSparks', + 'Glacier', + 'GlobalAccelerator', + 'Glue', + 'Grafana', + 'Greengrass', + 'GreengrassV2', + 'GroundStation', + 'GuardDuty', + 'Health', + 'HealthLake', + 'Honeycode', + 'IAM', + 'IVS', + 'IdentityStore', + 'Imagebuilder', + 'Inspector', + 'Inspector2', + 'IoT1ClickDevicesService', + 'IoT1ClickProjects', + 'IoTAnalytics', + 'IoTEvents', + 'IoTEventsData', + 'IoTFleetHub', + 'IoTFleetWise', + 'IoTJobsDataPlane', + 'IoTRoboRunner', + 'IoTSecureTunneling', + 'IoTSiteWise', + 'IoTThingsGraph', + 'IoTTwinMaker', + 'IoTWireless', + 'Iot', + 'IotData', + 'IotDeviceAdvisor', + 'Ivschat', + 'KMS', + 'Kafka', + 'KafkaConnect', + 'Kendra', + 'Keyspaces', + 'Kinesis', + 'KinesisAnalytics', + 'KinesisAnalyticsV2', + 'KinesisVideo', + 'KinesisVideoArchivedMedia', + 'KinesisVideoMedia', + 'KinesisVideoSignalingChannels', + 'KinesisVideoWebRTCStorage', + 'LakeFormation', + 'Lambda', + 'LexModelBuildingService', + 'LexModelsV2', + 'LexRuntime', + 'LexRuntimeV2', + 'LicenseManager', + 'LicenseManagerLinuxSubscriptions', + 'LicenseManagerUserSubscriptions', + 'Lightsail', + 'Location', + 'LookoutEquipment', + 'LookoutMetrics', + 'LookoutVision', + 'M2', + 'MQ', + 'MTurk', + 'MWAA', + 'MachineLearning', + 'Macie', + 'Macie2', + 'ManagedBlockchain', + 'MarketplaceCatalog', + 'MarketplaceCommerceAnalytics', + 'MarketplaceEntitlementService', + 'MarketplaceMetering', + 'MediaConnect', + 'MediaConvert', + 'MediaLive', + 'MediaPackage', + 'MediaPackageVod', + 'MediaStore', + 'MediaStoreData', + 'MediaTailor', + 'MemoryDB', + 'Mgn', + 'MigrationHub', + 'MigrationHubConfig', + 'MigrationHubOrchestrator', + 'MigrationHubRefactorSpaces', + 'MigrationHubStrategy', + 'Mobile', + 'Neptune', + 'NetworkFirewall', + 'NetworkManager', + 'Nimble', + 'OAM', + 'Omics', + 'OpenSearch', + 'OpenSearchServerless', + 'OpsWorks', + 'OpsWorksCM', + 'Organizations', + 'Outposts', + 'PI', + 'Panorama', + 'Personalize', + 'PersonalizeEvents', + 'PersonalizeRuntime', + 'Pinpoint', + 'PinpointEmail', + 'PinpointSMSVoice', + 'PinpointSMSVoiceV2', + 'Pipes', + 'Polly', + 'Pricing', + 'PrivateNetworks', + 'Proton', + 'QLDB', + 'QLDBSession', + 'QuickSight', + 'RAM', + 'RDS', + 'RDSDataService', + 'RUM', + 'Rbin', + 'Redshift', + 'RedshiftData', + 'RedshiftServerless', + 'Rekognition', + 'Resiliencehub', + 'ResourceExplorer2', + 'ResourceGroups', + 'ResourceGroupsTaggingAPI', + 'RoboMaker', + 'RolesAnywhere', + 'Route53', + 'Route53Domains', + 'Route53RecoveryCluster', + 'Route53RecoveryControlConfig', + 'Route53RecoveryReadiness', + 'Route53Resolver', + 'S3', + 'S3Control', + 'S3Outposts', + 'SES', + 'SESV2', + 'SMS', + 'SNS', + 'SQS', + 'SSM', + 'SSMContacts', + 'SSMIncidents', + 'SSO', + 'SSOAdmin', + 'SSOOIDC', + 'STS', + 'SWF', + 'SageMaker', + 'SageMakerFeatureStoreRuntime', + 'SageMakerGeospatial', + 'SageMakerMetrics', + 'SageMakerRuntime', + 'SagemakerEdge', + 'SavingsPlans', + 'Scheduler', + 'Schemas', + 'SecretsManager', + 'SecurityHub', + 'SecurityLake', + 'ServerlessApplicationRepository', + 'ServiceCatalog', + 'ServiceCatalogAppRegistry', + 'ServiceDiscovery', + 'ServiceQuotas', + 'Shield', + 'Signer', + 'SimSpaceWeaver', + 'SnowDeviceManagement', + 'Snowball', + 'SsmSap', + 'StepFunctions', + 'StorageGateway', + 'Support', + 'SupportApp', + 'Synthetics', + 'Textract', + 'TimestreamQuery', + 'TimestreamWrite', + 'TranscribeService', + 'Transfer', + 'Translate', + 'VoiceID', + 'WAF', + 'WAFRegional', + 'WAFV2', + 'WellArchitected', + 'Wisdom', + 'WorkDocs', + 'WorkLink', + 'WorkMail', + 'WorkMailMessageFlow', + 'WorkSpaces', + 'WorkSpacesWeb', + 'XRay', +]; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LW5hbWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xpZW50LW5hbWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFhLFFBQUEsWUFBWSxHQUFHO0lBQzFCLEtBQUs7SUFDTCxRQUFRO0lBQ1IsWUFBWTtJQUNaLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULGtCQUFrQjtJQUNsQixLQUFLO0lBQ0wsU0FBUztJQUNULGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxXQUFXO0lBQ1gsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULHdCQUF3QjtJQUN4Qix5QkFBeUI7SUFDekIscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLGVBQWU7SUFDZixlQUFlO0lBQ2YsT0FBTztJQUNQLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsU0FBUztJQUNULEtBQUs7SUFDTCxPQUFPO0lBQ1Asa0JBQWtCO0lBQ2xCLHdCQUF3QjtJQUN4QixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixRQUFRO0lBQ1IsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFVBQVU7SUFDVixZQUFZO0lBQ1osYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLFdBQVc7SUFDWCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxVQUFVO0lBQ1YsdUJBQXVCO0lBQ3ZCLHFCQUFxQjtJQUNyQixpQkFBaUI7SUFDakIsZ0NBQWdDO0lBQ2hDLGFBQWE7SUFDYixZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsU0FBUztJQUNULGtCQUFrQjtJQUNsQixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2QsY0FBYztJQUNkLGtCQUFrQjtJQUNsQixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxVQUFVO0lBQ1YsY0FBYztJQUNkLGNBQWM7SUFDZCxVQUFVO0lBQ1YsV0FBVztJQUNYLFlBQVk7SUFDWixZQUFZO0lBQ1osZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsT0FBTztJQUNQLGNBQWM7SUFDZCxLQUFLO0lBQ0wsVUFBVTtJQUNWLGlCQUFpQjtJQUNqQixLQUFLO0lBQ0wsS0FBSztJQUNMLG9CQUFvQjtJQUNwQixLQUFLO0lBQ0wsV0FBVztJQUNYLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsS0FBSztJQUNMLGVBQWU7SUFDZixlQUFlO0lBQ2YsSUFBSTtJQUNKLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsV0FBVztJQUNYLEtBQUs7SUFDTCxLQUFLO0lBQ0wsVUFBVTtJQUNWLGNBQWM7SUFDZCxVQUFVO0lBQ1YsS0FBSztJQUNMLHNCQUFzQjtJQUN0QixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLFVBQVU7SUFDVixZQUFZO0lBQ1osU0FBUztJQUNULG1CQUFtQjtJQUNuQixNQUFNO0lBQ04sU0FBUztJQUNULFlBQVk7SUFDWixjQUFjO0lBQ2QsZUFBZTtJQUNmLFdBQVc7SUFDWCxRQUFRO0lBQ1IsWUFBWTtJQUNaLFdBQVc7SUFDWCxLQUFLO0lBQ0wsS0FBSztJQUNMLGVBQWU7SUFDZixjQUFjO0lBQ2QsV0FBVztJQUNYLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCxXQUFXO0lBQ1gsZUFBZTtJQUNmLGFBQWE7SUFDYixjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsYUFBYTtJQUNiLEtBQUs7SUFDTCxTQUFTO0lBQ1Qsa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxLQUFLO0lBQ0wsT0FBTztJQUNQLGNBQWM7SUFDZCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLGNBQWM7SUFDZCwyQkFBMkI7SUFDM0IsbUJBQW1CO0lBQ25CLCtCQUErQjtJQUMvQiwyQkFBMkI7SUFDM0IsZUFBZTtJQUNmLFFBQVE7SUFDUix5QkFBeUI7SUFDekIsYUFBYTtJQUNiLFlBQVk7SUFDWixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGtDQUFrQztJQUNsQyxpQ0FBaUM7SUFDakMsV0FBVztJQUNYLFVBQVU7SUFDVixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixJQUFJO0lBQ0osSUFBSTtJQUNKLE9BQU87SUFDUCxNQUFNO0lBQ04saUJBQWlCO0lBQ2pCLE9BQU87SUFDUCxRQUFRO0lBQ1IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsY0FBYztJQUNkLFdBQVc7SUFDWCxjQUFjO0lBQ2QsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLFVBQVU7SUFDVixLQUFLO0lBQ0wsY0FBYztJQUNkLG9CQUFvQjtJQUNwQiwwQkFBMEI7SUFDMUIsNEJBQTRCO0lBQzVCLHNCQUFzQjtJQUN0QixRQUFRO0lBQ1IsU0FBUztJQUNULGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsUUFBUTtJQUNSLEtBQUs7SUFDTCxPQUFPO0lBQ1AsWUFBWTtJQUNaLHNCQUFzQjtJQUN0QixVQUFVO0lBQ1YsWUFBWTtJQUNaLGVBQWU7SUFDZixVQUFVO0lBQ1YsSUFBSTtJQUNKLFVBQVU7SUFDVixhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixVQUFVO0lBQ1YsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsaUJBQWlCO0lBQ2pCLFFBQVE7SUFDUixNQUFNO0lBQ04sYUFBYTtJQUNiLFlBQVk7SUFDWixLQUFLO0lBQ0wsS0FBSztJQUNMLGdCQUFnQjtJQUNoQixLQUFLO0lBQ0wsTUFBTTtJQUNOLFVBQVU7SUFDVixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLGFBQWE7SUFDYixlQUFlO0lBQ2YsbUJBQW1CO0lBQ25CLGdCQUFnQjtJQUNoQiwwQkFBMEI7SUFDMUIsV0FBVztJQUNYLGVBQWU7SUFDZixTQUFTO0lBQ1QsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtJQUN4Qiw4QkFBOEI7SUFDOUIsMEJBQTBCO0lBQzFCLGlCQUFpQjtJQUNqQixJQUFJO0lBQ0osV0FBVztJQUNYLFlBQVk7SUFDWixLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxhQUFhO0lBQ2IsY0FBYztJQUNkLEtBQUs7SUFDTCxVQUFVO0lBQ1YsU0FBUztJQUNULEtBQUs7SUFDTCxLQUFLO0lBQ0wsV0FBVztJQUNYLDhCQUE4QjtJQUM5QixxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLFdBQVc7SUFDWCxTQUFTO0lBQ1QsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsaUNBQWlDO0lBQ2pDLGdCQUFnQjtJQUNoQiwyQkFBMkI7SUFDM0Isa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixRQUFRO0lBQ1IsUUFBUTtJQUNSLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsVUFBVTtJQUNWLFFBQVE7SUFDUixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxZQUFZO0lBQ1osWUFBWTtJQUNaLFVBQVU7SUFDVixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxLQUFLO0lBQ0wsYUFBYTtJQUNiLE9BQU87SUFDUCxpQkFBaUI7SUFDakIsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLHFCQUFxQjtJQUNyQixZQUFZO0lBQ1osZUFBZTtJQUNmLE1BQU07Q0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IENMSUVOVF9OQU1FUyA9IFtcbiAgJ0FDTScsXG4gICdBQ01QQ0EnLFxuICAnQVBJR2F0ZXdheScsXG4gICdBUkNab25hbFNoaWZ0JyxcbiAgJ0FjY2Vzc0FuYWx5emVyJyxcbiAgJ0FjY291bnQnLFxuICAnQWxleGFGb3JCdXNpbmVzcycsXG4gICdBbXAnLFxuICAnQW1wbGlmeScsXG4gICdBbXBsaWZ5QmFja2VuZCcsXG4gICdBbXBsaWZ5VUlCdWlsZGVyJyxcbiAgJ0FwaUdhdGV3YXlNYW5hZ2VtZW50QXBpJyxcbiAgJ0FwaUdhdGV3YXlWMicsXG4gICdBcHBDb25maWcnLFxuICAnQXBwQ29uZmlnRGF0YScsXG4gICdBcHBJbnRlZ3JhdGlvbnMnLFxuICAnQXBwTWVzaCcsXG4gICdBcHBSdW5uZXInLFxuICAnQXBwU3RyZWFtJyxcbiAgJ0FwcFN5bmMnLFxuICAnQXBwZmxvdycsXG4gICdBcHBsaWNhdGlvbkF1dG9TY2FsaW5nJyxcbiAgJ0FwcGxpY2F0aW9uQ29zdFByb2ZpbGVyJyxcbiAgJ0FwcGxpY2F0aW9uSW5zaWdodHMnLFxuICAnQXRoZW5hJyxcbiAgJ0F1ZGl0TWFuYWdlcicsXG4gICdBdWdtZW50ZWRBSVJ1bnRpbWUnLFxuICAnQXV0b1NjYWxpbmcnLFxuICAnQXV0b1NjYWxpbmdQbGFucycsXG4gICdCYWNrdXAnLFxuICAnQmFja3VwR2F0ZXdheScsXG4gICdCYWNrdXBTdG9yYWdlJyxcbiAgJ0JhdGNoJyxcbiAgJ0JpbGxpbmdjb25kdWN0b3InLFxuICAnQnJha2V0JyxcbiAgJ0J1ZGdldHMnLFxuICAnQ1VSJyxcbiAgJ0NoaW1lJyxcbiAgJ0NoaW1lU0RLSWRlbnRpdHknLFxuICAnQ2hpbWVTREtNZWRpYVBpcGVsaW5lcycsXG4gICdDaGltZVNES01lZXRpbmdzJyxcbiAgJ0NoaW1lU0RLTWVzc2FnaW5nJyxcbiAgJ0NoaW1lU0RLVm9pY2UnLFxuICAnQ2xvdWQ5JyxcbiAgJ0Nsb3VkQ29udHJvbCcsXG4gICdDbG91ZERpcmVjdG9yeScsXG4gICdDbG91ZEZvcm1hdGlvbicsXG4gICdDbG91ZEZyb250JyxcbiAgJ0Nsb3VkSFNNJyxcbiAgJ0Nsb3VkSFNNVjInLFxuICAnQ2xvdWRTZWFyY2gnLFxuICAnQ2xvdWRTZWFyY2hEb21haW4nLFxuICAnQ2xvdWRUcmFpbCcsXG4gICdDbG91ZFdhdGNoJyxcbiAgJ0Nsb3VkV2F0Y2hFdmVudHMnLFxuICAnQ2xvdWRXYXRjaExvZ3MnLFxuICAnQ29kZUFydGlmYWN0JyxcbiAgJ0NvZGVCdWlsZCcsXG4gICdDb2RlQ2F0YWx5c3QnLFxuICAnQ29kZUNvbW1pdCcsXG4gICdDb2RlRGVwbG95JyxcbiAgJ0NvZGVHdXJ1UHJvZmlsZXInLFxuICAnQ29kZUd1cnVSZXZpZXdlcicsXG4gICdDb2RlUGlwZWxpbmUnLFxuICAnQ29kZVN0YXInLFxuICAnQ29kZVN0YXJOb3RpZmljYXRpb25zJyxcbiAgJ0NvZGVTdGFyY29ubmVjdGlvbnMnLFxuICAnQ29nbml0b0lkZW50aXR5JyxcbiAgJ0NvZ25pdG9JZGVudGl0eVNlcnZpY2VQcm92aWRlcicsXG4gICdDb2duaXRvU3luYycsXG4gICdDb21wcmVoZW5kJyxcbiAgJ0NvbXByZWhlbmRNZWRpY2FsJyxcbiAgJ0NvbXB1dGVPcHRpbWl6ZXInLFxuICAnQ29uZmlnU2VydmljZScsXG4gICdDb25uZWN0JyxcbiAgJ0Nvbm5lY3RDYW1wYWlnbnMnLFxuICAnQ29ubmVjdENhc2VzJyxcbiAgJ0Nvbm5lY3RDb250YWN0TGVucycsXG4gICdDb25uZWN0UGFydGljaXBhbnQnLFxuICAnQ29udHJvbFRvd2VyJyxcbiAgJ0Nvc3RFeHBsb3JlcicsXG4gICdDdXN0b21lclByb2ZpbGVzJyxcbiAgJ0RBWCcsXG4gICdETE0nLFxuICAnRE1TJyxcbiAgJ0RhdGFCcmV3JyxcbiAgJ0RhdGFFeGNoYW5nZScsXG4gICdEYXRhUGlwZWxpbmUnLFxuICAnRGF0YVN5bmMnLFxuICAnRGV0ZWN0aXZlJyxcbiAgJ0Rldk9wc0d1cnUnLFxuICAnRGV2aWNlRmFybScsXG4gICdEaXJlY3RDb25uZWN0JyxcbiAgJ0RpcmVjdG9yeVNlcnZpY2UnLFxuICAnRGlzY292ZXJ5JyxcbiAgJ0RvY0RCJyxcbiAgJ0RvY0RCRWxhc3RpYycsXG4gICdEcnMnLFxuICAnRHluYW1vREInLFxuICAnRHluYW1vREJTdHJlYW1zJyxcbiAgJ0VCUycsXG4gICdFQzInLFxuICAnRUMySW5zdGFuY2VDb25uZWN0JyxcbiAgJ0VDUicsXG4gICdFQ1JQVUJMSUMnLFxuICAnRUNTJyxcbiAgJ0VGUycsXG4gICdFS1MnLFxuICAnRUxCJyxcbiAgJ0VMQnYyJyxcbiAgJ0VNUicsXG4gICdFTVJTZXJ2ZXJsZXNzJyxcbiAgJ0VNUmNvbnRhaW5lcnMnLFxuICAnRVMnLFxuICAnRWxhc3RpQ2FjaGUnLFxuICAnRWxhc3RpY0JlYW5zdGFsaycsXG4gICdFbGFzdGljSW5mZXJlbmNlJyxcbiAgJ0VsYXN0aWNUcmFuc2NvZGVyJyxcbiAgJ0V2ZW50QnJpZGdlJyxcbiAgJ0V2aWRlbnRseScsXG4gICdGTVMnLFxuICAnRlN4JyxcbiAgJ0ZpbnNwYWNlJyxcbiAgJ0ZpbnNwYWNlZGF0YScsXG4gICdGaXJlaG9zZScsXG4gICdGaXMnLFxuICAnRm9yZWNhc3RRdWVyeVNlcnZpY2UnLFxuICAnRm9yZWNhc3RTZXJ2aWNlJyxcbiAgJ0ZyYXVkRGV0ZWN0b3InLFxuICAnR2FtZUxpZnQnLFxuICAnR2FtZVNwYXJrcycsXG4gICdHbGFjaWVyJyxcbiAgJ0dsb2JhbEFjY2VsZXJhdG9yJyxcbiAgJ0dsdWUnLFxuICAnR3JhZmFuYScsXG4gICdHcmVlbmdyYXNzJyxcbiAgJ0dyZWVuZ3Jhc3NWMicsXG4gICdHcm91bmRTdGF0aW9uJyxcbiAgJ0d1YXJkRHV0eScsXG4gICdIZWFsdGgnLFxuICAnSGVhbHRoTGFrZScsXG4gICdIb25leWNvZGUnLFxuICAnSUFNJyxcbiAgJ0lWUycsXG4gICdJZGVudGl0eVN0b3JlJyxcbiAgJ0ltYWdlYnVpbGRlcicsXG4gICdJbnNwZWN0b3InLFxuICAnSW5zcGVjdG9yMicsXG4gICdJb1QxQ2xpY2tEZXZpY2VzU2VydmljZScsXG4gICdJb1QxQ2xpY2tQcm9qZWN0cycsXG4gICdJb1RBbmFseXRpY3MnLFxuICAnSW9URXZlbnRzJyxcbiAgJ0lvVEV2ZW50c0RhdGEnLFxuICAnSW9URmxlZXRIdWInLFxuICAnSW9URmxlZXRXaXNlJyxcbiAgJ0lvVEpvYnNEYXRhUGxhbmUnLFxuICAnSW9UUm9ib1J1bm5lcicsXG4gICdJb1RTZWN1cmVUdW5uZWxpbmcnLFxuICAnSW9UU2l0ZVdpc2UnLFxuICAnSW9UVGhpbmdzR3JhcGgnLFxuICAnSW9UVHdpbk1ha2VyJyxcbiAgJ0lvVFdpcmVsZXNzJyxcbiAgJ0lvdCcsXG4gICdJb3REYXRhJyxcbiAgJ0lvdERldmljZUFkdmlzb3InLFxuICAnSXZzY2hhdCcsXG4gICdLTVMnLFxuICAnS2Fma2EnLFxuICAnS2Fma2FDb25uZWN0JyxcbiAgJ0tlbmRyYScsXG4gICdLZXlzcGFjZXMnLFxuICAnS2luZXNpcycsXG4gICdLaW5lc2lzQW5hbHl0aWNzJyxcbiAgJ0tpbmVzaXNBbmFseXRpY3NWMicsXG4gICdLaW5lc2lzVmlkZW8nLFxuICAnS2luZXNpc1ZpZGVvQXJjaGl2ZWRNZWRpYScsXG4gICdLaW5lc2lzVmlkZW9NZWRpYScsXG4gICdLaW5lc2lzVmlkZW9TaWduYWxpbmdDaGFubmVscycsXG4gICdLaW5lc2lzVmlkZW9XZWJSVENTdG9yYWdlJyxcbiAgJ0xha2VGb3JtYXRpb24nLFxuICAnTGFtYmRhJyxcbiAgJ0xleE1vZGVsQnVpbGRpbmdTZXJ2aWNlJyxcbiAgJ0xleE1vZGVsc1YyJyxcbiAgJ0xleFJ1bnRpbWUnLFxuICAnTGV4UnVudGltZVYyJyxcbiAgJ0xpY2Vuc2VNYW5hZ2VyJyxcbiAgJ0xpY2Vuc2VNYW5hZ2VyTGludXhTdWJzY3JpcHRpb25zJyxcbiAgJ0xpY2Vuc2VNYW5hZ2VyVXNlclN1YnNjcmlwdGlvbnMnLFxuICAnTGlnaHRzYWlsJyxcbiAgJ0xvY2F0aW9uJyxcbiAgJ0xvb2tvdXRFcXVpcG1lbnQnLFxuICAnTG9va291dE1ldHJpY3MnLFxuICAnTG9va291dFZpc2lvbicsXG4gICdNMicsXG4gICdNUScsXG4gICdNVHVyaycsXG4gICdNV0FBJyxcbiAgJ01hY2hpbmVMZWFybmluZycsXG4gICdNYWNpZScsXG4gICdNYWNpZTInLFxuICAnTWFuYWdlZEJsb2NrY2hhaW4nLFxuICAnTWFya2V0cGxhY2VDYXRhbG9nJyxcbiAgJ01hcmtldHBsYWNlQ29tbWVyY2VBbmFseXRpY3MnLFxuICAnTWFya2V0cGxhY2VFbnRpdGxlbWVudFNlcnZpY2UnLFxuICAnTWFya2V0cGxhY2VNZXRlcmluZycsXG4gICdNZWRpYUNvbm5lY3QnLFxuICAnTWVkaWFDb252ZXJ0JyxcbiAgJ01lZGlhTGl2ZScsXG4gICdNZWRpYVBhY2thZ2UnLFxuICAnTWVkaWFQYWNrYWdlVm9kJyxcbiAgJ01lZGlhU3RvcmUnLFxuICAnTWVkaWFTdG9yZURhdGEnLFxuICAnTWVkaWFUYWlsb3InLFxuICAnTWVtb3J5REInLFxuICAnTWduJyxcbiAgJ01pZ3JhdGlvbkh1YicsXG4gICdNaWdyYXRpb25IdWJDb25maWcnLFxuICAnTWlncmF0aW9uSHViT3JjaGVzdHJhdG9yJyxcbiAgJ01pZ3JhdGlvbkh1YlJlZmFjdG9yU3BhY2VzJyxcbiAgJ01pZ3JhdGlvbkh1YlN0cmF0ZWd5JyxcbiAgJ01vYmlsZScsXG4gICdOZXB0dW5lJyxcbiAgJ05ldHdvcmtGaXJld2FsbCcsXG4gICdOZXR3b3JrTWFuYWdlcicsXG4gICdOaW1ibGUnLFxuICAnT0FNJyxcbiAgJ09taWNzJyxcbiAgJ09wZW5TZWFyY2gnLFxuICAnT3BlblNlYXJjaFNlcnZlcmxlc3MnLFxuICAnT3BzV29ya3MnLFxuICAnT3BzV29ya3NDTScsXG4gICdPcmdhbml6YXRpb25zJyxcbiAgJ091dHBvc3RzJyxcbiAgJ1BJJyxcbiAgJ1Bhbm9yYW1hJyxcbiAgJ1BlcnNvbmFsaXplJyxcbiAgJ1BlcnNvbmFsaXplRXZlbnRzJyxcbiAgJ1BlcnNvbmFsaXplUnVudGltZScsXG4gICdQaW5wb2ludCcsXG4gICdQaW5wb2ludEVtYWlsJyxcbiAgJ1BpbnBvaW50U01TVm9pY2UnLFxuICAnUGlucG9pbnRTTVNWb2ljZVYyJyxcbiAgJ1BpcGVzJyxcbiAgJ1BvbGx5JyxcbiAgJ1ByaWNpbmcnLFxuICAnUHJpdmF0ZU5ldHdvcmtzJyxcbiAgJ1Byb3RvbicsXG4gICdRTERCJyxcbiAgJ1FMREJTZXNzaW9uJyxcbiAgJ1F1aWNrU2lnaHQnLFxuICAnUkFNJyxcbiAgJ1JEUycsXG4gICdSRFNEYXRhU2VydmljZScsXG4gICdSVU0nLFxuICAnUmJpbicsXG4gICdSZWRzaGlmdCcsXG4gICdSZWRzaGlmdERhdGEnLFxuICAnUmVkc2hpZnRTZXJ2ZXJsZXNzJyxcbiAgJ1Jla29nbml0aW9uJyxcbiAgJ1Jlc2lsaWVuY2VodWInLFxuICAnUmVzb3VyY2VFeHBsb3JlcjInLFxuICAnUmVzb3VyY2VHcm91cHMnLFxuICAnUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJJyxcbiAgJ1JvYm9NYWtlcicsXG4gICdSb2xlc0FueXdoZXJlJyxcbiAgJ1JvdXRlNTMnLFxuICAnUm91dGU1M0RvbWFpbnMnLFxuICAnUm91dGU1M1JlY292ZXJ5Q2x1c3RlcicsXG4gICdSb3V0ZTUzUmVjb3ZlcnlDb250cm9sQ29uZmlnJyxcbiAgJ1JvdXRlNTNSZWNvdmVyeVJlYWRpbmVzcycsXG4gICdSb3V0ZTUzUmVzb2x2ZXInLFxuICAnUzMnLFxuICAnUzNDb250cm9sJyxcbiAgJ1MzT3V0cG9zdHMnLFxuICAnU0VTJyxcbiAgJ1NFU1YyJyxcbiAgJ1NNUycsXG4gICdTTlMnLFxuICAnU1FTJyxcbiAgJ1NTTScsXG4gICdTU01Db250YWN0cycsXG4gICdTU01JbmNpZGVudHMnLFxuICAnU1NPJyxcbiAgJ1NTT0FkbWluJyxcbiAgJ1NTT09JREMnLFxuICAnU1RTJyxcbiAgJ1NXRicsXG4gICdTYWdlTWFrZXInLFxuICAnU2FnZU1ha2VyRmVhdHVyZVN0b3JlUnVudGltZScsXG4gICdTYWdlTWFrZXJHZW9zcGF0aWFsJyxcbiAgJ1NhZ2VNYWtlck1ldHJpY3MnLFxuICAnU2FnZU1ha2VyUnVudGltZScsXG4gICdTYWdlbWFrZXJFZGdlJyxcbiAgJ1NhdmluZ3NQbGFucycsXG4gICdTY2hlZHVsZXInLFxuICAnU2NoZW1hcycsXG4gICdTZWNyZXRzTWFuYWdlcicsXG4gICdTZWN1cml0eUh1YicsXG4gICdTZWN1cml0eUxha2UnLFxuICAnU2VydmVybGVzc0FwcGxpY2F0aW9uUmVwb3NpdG9yeScsXG4gICdTZXJ2aWNlQ2F0YWxvZycsXG4gICdTZXJ2aWNlQ2F0YWxvZ0FwcFJlZ2lzdHJ5JyxcbiAgJ1NlcnZpY2VEaXNjb3ZlcnknLFxuICAnU2VydmljZVF1b3RhcycsXG4gICdTaGllbGQnLFxuICAnU2lnbmVyJyxcbiAgJ1NpbVNwYWNlV2VhdmVyJyxcbiAgJ1Nub3dEZXZpY2VNYW5hZ2VtZW50JyxcbiAgJ1Nub3diYWxsJyxcbiAgJ1NzbVNhcCcsXG4gICdTdGVwRnVuY3Rpb25zJyxcbiAgJ1N0b3JhZ2VHYXRld2F5JyxcbiAgJ1N1cHBvcnQnLFxuICAnU3VwcG9ydEFwcCcsXG4gICdTeW50aGV0aWNzJyxcbiAgJ1RleHRyYWN0JyxcbiAgJ1RpbWVzdHJlYW1RdWVyeScsXG4gICdUaW1lc3RyZWFtV3JpdGUnLFxuICAnVHJhbnNjcmliZVNlcnZpY2UnLFxuICAnVHJhbnNmZXInLFxuICAnVHJhbnNsYXRlJyxcbiAgJ1ZvaWNlSUQnLFxuICAnV0FGJyxcbiAgJ1dBRlJlZ2lvbmFsJyxcbiAgJ1dBRlYyJyxcbiAgJ1dlbGxBcmNoaXRlY3RlZCcsXG4gICdXaXNkb20nLFxuICAnV29ya0RvY3MnLFxuICAnV29ya0xpbmsnLFxuICAnV29ya01haWwnLFxuICAnV29ya01haWxNZXNzYWdlRmxvdycsXG4gICdXb3JrU3BhY2VzJyxcbiAgJ1dvcmtTcGFjZXNXZWInLFxuICAnWFJheScsXG5dOyJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.js new file mode 100644 index 0000000000000..a0cf54750f3ee --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.js @@ -0,0 +1,127 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CLIENT_PACKAGE_NAMES_MAP = void 0; +const client_names_1 = require("./client-names"); +exports.CLIENT_PACKAGE_NAMES_MAP = { + ...client_names_1.CLIENT_NAMES.reduce((acc, name) => ({ + ...acc, + [name]: `client-${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}` + .replace('-chime-sdk', '-chime-sdk-') + .replace('client-amplify-', 'client-amplify') + .replace('client-cloud-', 'client-cloud') + .replace('client-code-', 'client-code') + .replace('client-connect-', 'client-connect') + .replace('client-data-', 'client-data') + .replace('client-io-t', 'client-iot-') + .replace('client-iot-fleet-', 'client-iotfleet') + .replace('client-lookout-', 'client-lookout') + .replace('client-media-', 'client-media') + .replace('client-migration-hub-', 'client-migrationhub') + .replace('client-pinpoint-sms', 'client-pinpoint-sms-') + .replace('client-route53', 'client-route53-') + .replace('client-sage-maker', 'client-sagemaker') + .replace('client-security-', 'client-security') + .replace('client-work-', 'client-work'), + }), {}), + AccessAnalyzer: 'client-accessanalyzer', + ACMPCA: 'client-acm-pca', + APIGateway: 'client-api-gateway', + ApiGatewayManagementApi: 'client-apigatewaymanagementapi', + ApiGatewayV2: 'client-apigatewayv2', + AppConfig: 'client-appconfig', + AppConfigData: 'client-appconfigdata', + AppIntegrations: 'client-appintegrations', + AppRunner: 'client-apprunner', + AppStream: 'client-appstream', + AppSync: 'client-appsync', + ApplicationCostProfiler: 'client-applicationcostprofiler', + ARCZonalShift: 'client-arc-zonal-shift', + AugmentedAIRuntime: 'client-sage-maker-a2iruntime', + AuditManager: 'client-auditmanager', + BackupStorage: 'client-backupstorage', + CUR: 'client-cost-and-usage-report-service', + CloudHSMV2: 'client-cloudhsm-v2', + CodeGuruProfiler: 'client-codeguruprofiler', + CodeStarconnections: 'client-codestar-connections', + CognitoIdentityServiceProvider: 'client-cognito-identity-provider', + ComprehendMedical: 'client-comprehendmedical', + ConnectContactLens: 'client-connect-contact-lens', + ControlTower: 'client-controltower', + DMS: 'client-database-migration-service', + DataPipeline: 'client-data-pipeline', + Discovery: 'client-application-discovery-service', + DevOpsGuru: 'client-devops-guru', + DynamoDB: 'client-dynamodb', + DynamoDBStreams: 'client-dynamodb-streams', + DocDB: 'client-docdb', + DocDBElastic: 'client-docdb-elastic', + EC2InstanceConnect: 'client-ec2-instance-connect', + ECRPUBLIC: 'client-ecr-public', + ELB: 'client-elastic-load-balancing', + ELBv2: 'client-elastic-load-balancing-v2', + ElastiCache: 'client-elasticache', + EMRcontainers: 'client-emr-containers', + EMRServerless: 'client-emr-serverless', + ES: 'client-elasticsearch-service', + EventBridge: 'client-eventbridge', + Finspacedata: 'client-finspace-data', + ForecastQueryService: 'client-forecastquery', + ForecastService: 'client-forecast', + FraudDetector: 'client-frauddetector', + GameLift: 'client-gamelift', + GameSparks: 'client-gamesparks', + GreengrassV2: 'client-greengrassv2', + GroundStation: 'client-groundstation', + GuardDuty: 'client-guardduty', + HealthLake: 'client-healthlake', + IdentityStore: 'client-identitystore', + IoTAnalytics: 'client-iotanalytics', + IotData: 'client-iot-data-plane', + IotDeviceAdvisor: 'client-iotdeviceadvisor', + IoTSecureTunneling: 'client-iotsecuretunneling', + IoTSiteWise: 'client-iotsitewise', + IoTThingsGraph: 'client-iotthingsgraph', + IoTTwinMaker: 'client-iottwinmaker', + IoTRoboRunner: 'client-iot-roborunner', + KafkaConnect: 'client-kafkaconnect', + KinesisVideoSignalingChannels: 'client-kinesis-video-signaling', + KinesisVideoWebRTCStorage: 'client-kinesis-video-webrtc-storage', + LakeFormation: 'client-lakeformation', + LexRuntime: 'client-lex-runtime-service', + ManagedBlockchain: 'client-managedblockchain', + MigrationHubConfig: 'client-migrationhub-config', + MigrationHubRefactorSpaces: 'client-migration-hub-refactor-spaces', + NetworkManager: 'client-networkmanager', + OpenSearch: 'client-opensearch', + OpenSearchServerless: 'client-opensearchserverless', + OpsWorks: 'client-opsworks', + OpsWorksCM: 'client-opsworkscm', + PrivateNetworks: 'client-privatenetworks', + QLDBSession: 'client-qldb-session', + QuickSight: 'client-quicksight', + ResourceExplorer2: 'client-resource-explorer-2', + RDSDataService: 'client-rds-data', + RoboMaker: 'client-robomaker', + RolesAnywhere: 'client-rolesanywhere', + Route53: 'client-route-53', + Route53Domains: 'client-route-53-domains', + Route53Resolver: 'client-route53resolver', + S3Control: 'client-s3-control', + SageMakerFeatureStoreRuntime: 'client-sagemaker-featurestore-runtime', + SavingsPlans: 'client-savingsplans', + SecurityHub: 'client-securityhub', + ServerlessApplicationRepository: 'client-serverlessapplicationrepository', + ServiceCatalogAppRegistry: 'client-service-catalog-appregistry', + ServiceDiscovery: 'client-servicediscovery', + SimSpaceWeaver: 'client-simspaceweaver', + SSMContacts: 'client-ssm-contacts', + SSMIncidents: 'client-ssm-incidents', + SSOAdmin: 'client-sso-admin', + SSOOIDC: 'client-sso-oidc', + StepFunctions: 'client-sfn', + TranscribeService: 'client-transcribe', + WAFRegional: 'client-waf-regional', + WellArchitected: 'client-wellarchitected', + WorkMailMessageFlow: 'client-workmailmessageflow', +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXBhY2thZ2UtbmFtZXMtbWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xpZW50LXBhY2thZ2UtbmFtZXMtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUE4QztBQUVqQyxRQUFBLHdCQUF3QixHQUEyQjtJQUM5RCxHQUFHLDJCQUFZLENBQUMsTUFBTSxDQUNwQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDZCxHQUFHLEdBQUc7UUFDTixDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTthQUN2RSxPQUFPLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQzthQUNwQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUM7YUFDNUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUM7YUFDeEMsT0FBTyxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUM7YUFDdEMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDO2FBQzVDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDO2FBQ3RDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDO2FBQ3JDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQzthQUMvQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUM7YUFDNUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUM7YUFDeEMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDO2FBQ3ZELE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxzQkFBc0IsQ0FBQzthQUN0RCxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUM7YUFDNUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDO2FBQ2hELE9BQU8sQ0FB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SUFDL0IsZUFBZSxFQUFFLHdCQUF3QjtJQUN6QyxXQUFXLEVBQUUscUJBQXFCO0lBQ2xDLFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsaUJBQWlCLEVBQUUsNEJBQTRCO0lBQy9DLGNBQWMsRUFBRSxpQkFBaUI7SUFDakMsU0FBUyxFQUFFLGtCQUFrQjtJQUM3QixhQUFhLEVBQUUsc0JBQXNCO0lBQ3JDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsY0FBYyxFQUFFLHlCQUF5QjtJQUN6QyxlQUFlLEVBQUUsd0JBQXdCO0lBQ3pDLFNBQVMsRUFBRSxtQkFBbUI7SUFDOUIsNEJBQTRCLEVBQUUsdUNBQXVDO0lBQ3JFLFlBQVksRUFBRSxxQkFBcUI7SUFDbkMsV0FBVyxFQUFFLG9CQUFvQjtJQUNqQywrQkFBK0IsRUFBRSx3Q0FBd0M7SUFDekUseUJBQXlCLEVBQUUsb0NBQW9DO0lBQy9ELGdCQUFnQixFQUFFLHlCQUF5QjtJQUMzQyxjQUFjLEVBQUUsdUJBQXVCO0lBQ3ZDLFdBQVcsRUFBRSxxQkFBcUI7SUFDbEMsWUFBWSxFQUFFLHNCQUFzQjtJQUNwQyxRQUFRLEVBQUUsa0JBQWtCO0lBQzVCLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsYUFBYSxFQUFFLFlBQVk7SUFDM0IsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLFdBQVcsRUFBRSxxQkFBcUI7SUFDbEMsZUFBZSxFQUFFLHdCQUF3QjtJQUN6QyxtQkFBbUIsRUFBRSw0QkFBNEI7Q0FDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENMSUVOVF9OQU1FUyB9IGZyb20gJy4vY2xpZW50LW5hbWVzJztcblxuZXhwb3J0IGNvbnN0IENMSUVOVF9QQUNLQUdFX05BTUVTX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgLi4uQ0xJRU5UX05BTUVTLnJlZHVjZShcbiAgICAoYWNjLCBuYW1lKSA9PiAoe1xuICAgICAgLi4uYWNjLFxuICAgICAgW25hbWVdOiBgY2xpZW50LSR7bmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpfWBcbiAgICAgICAgLnJlcGxhY2UoJy1jaGltZS1zZGsnLCAnLWNoaW1lLXNkay0nKVxuICAgICAgICAucmVwbGFjZSgnY2xpZW50LWFtcGxpZnktJywgJ2NsaWVudC1hbXBsaWZ5JylcbiAgICAgICAgLnJlcGxhY2UoJ2NsaWVudC1jbG91ZC0nLCAnY2xpZW50LWNsb3VkJylcbiAgICAgICAgLnJlcGxhY2UoJ2NsaWVudC1jb2RlLScsICdjbGllbnQtY29kZScpXG4gICAgICAgIC5yZXBsYWNlKCdjbGllbnQtY29ubmVjdC0nLCAnY2xpZW50LWNvbm5lY3QnKVxuICAgICAgICAucmVwbGFjZSgnY2xpZW50LWRhdGEtJywgJ2NsaWVudC1kYXRhJylcbiAgICAgICAgLnJlcGxhY2UoJ2NsaWVudC1pby10JywgJ2NsaWVudC1pb3QtJylcbiAgICAgICAgLnJlcGxhY2UoJ2NsaWVudC1pb3QtZmxlZXQtJywgJ2NsaWVudC1pb3RmbGVldCcpXG4gICAgICAgIC5yZXBsYWNlKCdjbGllbnQtbG9va291dC0nLCAnY2xpZW50LWxvb2tvdXQnKVxuICAgICAgICAucmVwbGFjZSgnY2xpZW50LW1lZGlhLScsICdjbGllbnQtbWVkaWEnKVxuICAgICAgICAucmVwbGFjZSgnY2xpZW50LW1pZ3JhdGlvbi1odWItJywgJ2NsaWVudC1taWdyYXRpb25odWInKVxuICAgICAgICAucmVwbGFjZSgnY2xpZW50LXBpbnBvaW50LXNtcycsICdjbGllbnQtcGlucG9pbnQtc21zLScpXG4gICAgICAgIC5yZXBsYWNlKCdjbGllbnQtcm91dGU1MycsICdjbGllbnQtcm91dGU1My0nKVxuICAgICAgICAucmVwbGFjZSgnY2xpZW50LXNhZ2UtbWFrZXInLCAnY2xpZW50LXNhZ2VtYWtlcicpXG4gICAgICAgIC5yZXBsYWNlKCdjbGllbnQtc2VjdXJpdHktJywgJ2NsaWVudC1zZWN1cml0eScpXG4gICAgICAgIC5yZXBsYWNlKCdjbGllbnQtd29yay0nLCAnY2xpZW50LXdvcmsnKSxcbiAgICB9KSxcbiAgICB7fSxcbiAgKSxcbiAgQWNjZXNzQW5hbHl6ZXI6ICdjbGllbnQtYWNjZXNzYW5hbHl6ZXInLFxuICBBQ01QQ0E6ICdjbGllbnQtYWNtLXBjYScsXG4gIEFQSUdhdGV3YXk6ICdjbGllbnQtYXBpLWdhdGV3YXknLFxuICBBcGlHYXRld2F5TWFuYWdlbWVudEFwaTogJ2NsaWVudC1hcGlnYXRld2F5bWFuYWdlbWVudGFwaScsXG4gIEFwaUdhdGV3YXlWMjogJ2NsaWVudC1hcGlnYXRld2F5djInLFxuICBBcHBDb25maWc6ICdjbGllbnQtYXBwY29uZmlnJyxcbiAgQXBwQ29uZmlnRGF0YTogJ2NsaWVudC1hcHBjb25maWdkYXRhJyxcbiAgQXBwSW50ZWdyYXRpb25zOiAnY2xpZW50LWFwcGludGVncmF0aW9ucycsXG4gIEFwcFJ1bm5lcjogJ2NsaWVudC1hcHBydW5uZXInLFxuICBBcHBTdHJlYW06ICdjbGllbnQtYXBwc3RyZWFtJyxcbiAgQXBwU3luYzogJ2NsaWVudC1hcHBzeW5jJyxcbiAgQXBwbGljYXRpb25Db3N0UHJvZmlsZXI6ICdjbGllbnQtYXBwbGljYXRpb25jb3N0cHJvZmlsZXInLFxuICBBUkNab25hbFNoaWZ0OiAnY2xpZW50LWFyYy16b25hbC1zaGlmdCcsXG4gIEF1Z21lbnRlZEFJUnVudGltZTogJ2NsaWVudC1zYWdlLW1ha2VyLWEyaXJ1bnRpbWUnLFxuICBBdWRpdE1hbmFnZXI6ICdjbGllbnQtYXVkaXRtYW5hZ2VyJyxcbiAgQmFja3VwU3RvcmFnZTogJ2NsaWVudC1iYWNrdXBzdG9yYWdlJyxcbiAgQ1VSOiAnY2xpZW50LWNvc3QtYW5kLXVzYWdlLXJlcG9ydC1zZXJ2aWNlJyxcbiAgQ2xvdWRIU01WMjogJ2NsaWVudC1jbG91ZGhzbS12MicsXG4gIENvZGVHdXJ1UHJvZmlsZXI6ICdjbGllbnQtY29kZWd1cnVwcm9maWxlcicsXG4gIENvZGVTdGFyY29ubmVjdGlvbnM6ICdjbGllbnQtY29kZXN0YXItY29ubmVjdGlvbnMnLFxuICBDb2duaXRvSWRlbnRpdHlTZXJ2aWNlUHJvdmlkZXI6ICdjbGllbnQtY29nbml0by1pZGVudGl0eS1wcm92aWRlcicsXG4gIENvbXByZWhlbmRNZWRpY2FsOiAnY2xpZW50LWNvbXByZWhlbmRtZWRpY2FsJyxcbiAgQ29ubmVjdENvbnRhY3RMZW5zOiAnY2xpZW50LWNvbm5lY3QtY29udGFjdC1sZW5zJyxcbiAgQ29udHJvbFRvd2VyOiAnY2xpZW50LWNvbnRyb2x0b3dlcicsXG4gIERNUzogJ2NsaWVudC1kYXRhYmFzZS1taWdyYXRpb24tc2VydmljZScsXG4gIERhdGFQaXBlbGluZTogJ2NsaWVudC1kYXRhLXBpcGVsaW5lJyxcbiAgRGlzY292ZXJ5OiAnY2xpZW50LWFwcGxpY2F0aW9uLWRpc2NvdmVyeS1zZXJ2aWNlJyxcbiAgRGV2T3BzR3VydTogJ2NsaWVudC1kZXZvcHMtZ3VydScsXG4gIER5bmFtb0RCOiAnY2xpZW50LWR5bmFtb2RiJyxcbiAgRHluYW1vREJTdHJlYW1zOiAnY2xpZW50LWR5bmFtb2RiLXN0cmVhbXMnLFxuICBEb2NEQjogJ2NsaWVudC1kb2NkYicsXG4gIERvY0RCRWxhc3RpYzogJ2NsaWVudC1kb2NkYi1lbGFzdGljJyxcbiAgRUMySW5zdGFuY2VDb25uZWN0OiAnY2xpZW50LWVjMi1pbnN0YW5jZS1jb25uZWN0JyxcbiAgRUNSUFVCTElDOiAnY2xpZW50LWVjci1wdWJsaWMnLFxuICBFTEI6ICdjbGllbnQtZWxhc3RpYy1sb2FkLWJhbGFuY2luZycsXG4gIEVMQnYyOiAnY2xpZW50LWVsYXN0aWMtbG9hZC1iYWxhbmNpbmctdjInLFxuICBFbGFzdGlDYWNoZTogJ2NsaWVudC1lbGFzdGljYWNoZScsXG4gIEVNUmNvbnRhaW5lcnM6ICdjbGllbnQtZW1yLWNvbnRhaW5lcnMnLFxuICBFTVJTZXJ2ZXJsZXNzOiAnY2xpZW50LWVtci1zZXJ2ZXJsZXNzJyxcbiAgRVM6ICdjbGllbnQtZWxhc3RpY3NlYXJjaC1zZXJ2aWNlJyxcbiAgRXZlbnRCcmlkZ2U6ICdjbGllbnQtZXZlbnRicmlkZ2UnLFxuICBGaW5zcGFjZWRhdGE6ICdjbGllbnQtZmluc3BhY2UtZGF0YScsXG4gIEZvcmVjYXN0UXVlcnlTZXJ2aWNlOiAnY2xpZW50LWZvcmVjYXN0cXVlcnknLFxuICBGb3JlY2FzdFNlcnZpY2U6ICdjbGllbnQtZm9yZWNhc3QnLFxuICBGcmF1ZERldGVjdG9yOiAnY2xpZW50LWZyYXVkZGV0ZWN0b3InLFxuICBHYW1lTGlmdDogJ2NsaWVudC1nYW1lbGlmdCcsXG4gIEdhbWVTcGFya3M6ICdjbGllbnQtZ2FtZXNwYXJrcycsXG4gIEdyZWVuZ3Jhc3NWMjogJ2NsaWVudC1ncmVlbmdyYXNzdjInLFxuICBHcm91bmRTdGF0aW9uOiAnY2xpZW50LWdyb3VuZHN0YXRpb24nLFxuICBHdWFyZER1dHk6ICdjbGllbnQtZ3VhcmRkdXR5JyxcbiAgSGVhbHRoTGFrZTogJ2NsaWVudC1oZWFsdGhsYWtlJyxcbiAgSWRlbnRpdHlTdG9yZTogJ2NsaWVudC1pZGVudGl0eXN0b3JlJyxcbiAgSW9UQW5hbHl0aWNzOiAnY2xpZW50LWlvdGFuYWx5dGljcycsXG4gIElvdERhdGE6ICdjbGllbnQtaW90LWRhdGEtcGxhbmUnLFxuICBJb3REZXZpY2VBZHZpc29yOiAnY2xpZW50LWlvdGRldmljZWFkdmlzb3InLFxuICBJb1RTZWN1cmVUdW5uZWxpbmc6ICdjbGllbnQtaW90c2VjdXJldHVubmVsaW5nJyxcbiAgSW9UU2l0ZVdpc2U6ICdjbGllbnQtaW90c2l0ZXdpc2UnLFxuICBJb1RUaGluZ3NHcmFwaDogJ2NsaWVudC1pb3R0aGluZ3NncmFwaCcsXG4gIElvVFR3aW5NYWtlcjogJ2NsaWVudC1pb3R0d2lubWFrZXInLFxuICBJb1RSb2JvUnVubmVyOiAnY2xpZW50LWlvdC1yb2JvcnVubmVyJyxcbiAgS2Fma2FDb25uZWN0OiAnY2xpZW50LWthZmthY29ubmVjdCcsXG4gIEtpbmVzaXNWaWRlb1NpZ25hbGluZ0NoYW5uZWxzOiAnY2xpZW50LWtpbmVzaXMtdmlkZW8tc2lnbmFsaW5nJyxcbiAgS2luZXNpc1ZpZGVvV2ViUlRDU3RvcmFnZTogJ2NsaWVudC1raW5lc2lzLXZpZGVvLXdlYnJ0Yy1zdG9yYWdlJyxcbiAgTGFrZUZvcm1hdGlvbjogJ2NsaWVudC1sYWtlZm9ybWF0aW9uJyxcbiAgTGV4UnVudGltZTogJ2NsaWVudC1sZXgtcnVudGltZS1zZXJ2aWNlJyxcbiAgTWFuYWdlZEJsb2NrY2hhaW46ICdjbGllbnQtbWFuYWdlZGJsb2NrY2hhaW4nLFxuICBNaWdyYXRpb25IdWJDb25maWc6ICdjbGllbnQtbWlncmF0aW9uaHViLWNvbmZpZycsXG4gIE1pZ3JhdGlvbkh1YlJlZmFjdG9yU3BhY2VzOiAnY2xpZW50LW1pZ3JhdGlvbi1odWItcmVmYWN0b3Itc3BhY2VzJyxcbiAgTmV0d29ya01hbmFnZXI6ICdjbGllbnQtbmV0d29ya21hbmFnZXInLFxuICBPcGVuU2VhcmNoOiAnY2xpZW50LW9wZW5zZWFyY2gnLFxuICBPcGVuU2VhcmNoU2VydmVybGVzczogJ2NsaWVudC1vcGVuc2VhcmNoc2VydmVybGVzcycsXG4gIE9wc1dvcmtzOiAnY2xpZW50LW9wc3dvcmtzJyxcbiAgT3BzV29ya3NDTTogJ2NsaWVudC1vcHN3b3Jrc2NtJyxcbiAgUHJpdmF0ZU5ldHdvcmtzOiAnY2xpZW50LXByaXZhdGVuZXR3b3JrcycsXG4gIFFMREJTZXNzaW9uOiAnY2xpZW50LXFsZGItc2Vzc2lvbicsXG4gIFF1aWNrU2lnaHQ6ICdjbGllbnQtcXVpY2tzaWdodCcsXG4gIFJlc291cmNlRXhwbG9yZXIyOiAnY2xpZW50LXJlc291cmNlLWV4cGxvcmVyLTInLFxuICBSRFNEYXRhU2VydmljZTogJ2NsaWVudC1yZHMtZGF0YScsXG4gIFJvYm9NYWtlcjogJ2NsaWVudC1yb2JvbWFrZXInLFxuICBSb2xlc0FueXdoZXJlOiAnY2xpZW50LXJvbGVzYW55d2hlcmUnLFxuICBSb3V0ZTUzOiAnY2xpZW50LXJvdXRlLTUzJyxcbiAgUm91dGU1M0RvbWFpbnM6ICdjbGllbnQtcm91dGUtNTMtZG9tYWlucycsXG4gIFJvdXRlNTNSZXNvbHZlcjogJ2NsaWVudC1yb3V0ZTUzcmVzb2x2ZXInLFxuICBTM0NvbnRyb2w6ICdjbGllbnQtczMtY29udHJvbCcsXG4gIFNhZ2VNYWtlckZlYXR1cmVTdG9yZVJ1bnRpbWU6ICdjbGllbnQtc2FnZW1ha2VyLWZlYXR1cmVzdG9yZS1ydW50aW1lJyxcbiAgU2F2aW5nc1BsYW5zOiAnY2xpZW50LXNhdmluZ3NwbGFucycsXG4gIFNlY3VyaXR5SHViOiAnY2xpZW50LXNlY3VyaXR5aHViJyxcbiAgU2VydmVybGVzc0FwcGxpY2F0aW9uUmVwb3NpdG9yeTogJ2NsaWVudC1zZXJ2ZXJsZXNzYXBwbGljYXRpb25yZXBvc2l0b3J5JyxcbiAgU2VydmljZUNhdGFsb2dBcHBSZWdpc3RyeTogJ2NsaWVudC1zZXJ2aWNlLWNhdGFsb2ctYXBwcmVnaXN0cnknLFxuICBTZXJ2aWNlRGlzY292ZXJ5OiAnY2xpZW50LXNlcnZpY2VkaXNjb3ZlcnknLFxuICBTaW1TcGFjZVdlYXZlcjogJ2NsaWVudC1zaW1zcGFjZXdlYXZlcicsXG4gIFNTTUNvbnRhY3RzOiAnY2xpZW50LXNzbS1jb250YWN0cycsXG4gIFNTTUluY2lkZW50czogJ2NsaWVudC1zc20taW5jaWRlbnRzJyxcbiAgU1NPQWRtaW46ICdjbGllbnQtc3NvLWFkbWluJyxcbiAgU1NPT0lEQzogJ2NsaWVudC1zc28tb2lkYycsXG4gIFN0ZXBGdW5jdGlvbnM6ICdjbGllbnQtc2ZuJyxcbiAgVHJhbnNjcmliZVNlcnZpY2U6ICdjbGllbnQtdHJhbnNjcmliZScsXG4gIFdBRlJlZ2lvbmFsOiAnY2xpZW50LXdhZi1yZWdpb25hbCcsXG4gIFdlbGxBcmNoaXRlY3RlZDogJ2NsaWVudC13ZWxsYXJjaGl0ZWN0ZWQnLFxuICBXb3JrTWFpbE1lc3NhZ2VGbG93OiAnY2xpZW50LXdvcmttYWlsbWVzc2FnZWZsb3cnLFxufTsiXX0= \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.js new file mode 100644 index 0000000000000..48aeb66ab0810 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getV3ClientPackageName = void 0; +// Refer to https://github.com/awslabs/aws-sdk-js-codemod +const client_package_names_map_1 = require("./client-package-names-map"); +// Returns v3 client package name for the provided v2 client name. +const getV3ClientPackageName = (clientName) => { + if (clientName in client_package_names_map_1.CLIENT_PACKAGE_NAMES_MAP) { + return `@aws-sdk/${client_package_names_map_1.CLIENT_PACKAGE_NAMES_MAP[clientName]}`; + } + throw new Error(`Client '${clientName}' is either deprecated or newly added. Please consider using the v3 package format (@aws-sdk/client-xxx).`); +}; +exports.getV3ClientPackageName = getV3ClientPackageName; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXYzLWNsaWVudC1wYWNrYWdlLW5hbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnZXQtdjMtY2xpZW50LXBhY2thZ2UtbmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5REFBeUQ7QUFDekQseUVBQXNFO0FBRXRFLGtFQUFrRTtBQUMzRCxNQUFNLHNCQUFzQixHQUFHLENBQUMsVUFBa0IsRUFBRSxFQUFFO0lBQzNELElBQUksVUFBVSxJQUFJLG1EQUF3QixFQUFFO1FBQUMsT0FBTyxZQUFZLG1EQUF3QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7S0FBQztJQUN4RyxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsVUFBVSwyR0FBMkcsQ0FBQyxDQUFDO0FBQ3BKLENBQUMsQ0FBQztBQUhXLFFBQUEsc0JBQXNCLDBCQUdqQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3NsYWJzL2F3cy1zZGstanMtY29kZW1vZFxuaW1wb3J0IHsgQ0xJRU5UX1BBQ0tBR0VfTkFNRVNfTUFQIH0gZnJvbSAnLi9jbGllbnQtcGFja2FnZS1uYW1lcy1tYXAnO1xuXG4vLyBSZXR1cm5zIHYzIGNsaWVudCBwYWNrYWdlIG5hbWUgZm9yIHRoZSBwcm92aWRlZCB2MiBjbGllbnQgbmFtZS5cbmV4cG9ydCBjb25zdCBnZXRWM0NsaWVudFBhY2thZ2VOYW1lID0gKGNsaWVudE5hbWU6IHN0cmluZykgPT4ge1xuICBpZiAoY2xpZW50TmFtZSBpbiBDTElFTlRfUEFDS0FHRV9OQU1FU19NQVApIHtyZXR1cm4gYEBhd3Mtc2RrLyR7Q0xJRU5UX1BBQ0tBR0VfTkFNRVNfTUFQW2NsaWVudE5hbWVdfWA7fVxuICB0aHJvdyBuZXcgRXJyb3IoYENsaWVudCAnJHtjbGllbnROYW1lfScgaXMgZWl0aGVyIGRlcHJlY2F0ZWQgb3IgbmV3bHkgYWRkZWQuIFBsZWFzZSBjb25zaWRlciB1c2luZyB0aGUgdjMgcGFja2FnZSBmb3JtYXQgKEBhd3Mtc2RrL2NsaWVudC14eHgpLmApO1xufTsiXX0= \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/index.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/index.js new file mode 100644 index 0000000000000..23771a70c1f51 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/index.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = exports.PHYSICAL_RESOURCE_ID_REFERENCE = void 0; +var shared_1 = require("./shared"); +Object.defineProperty(exports, "PHYSICAL_RESOURCE_ID_REFERENCE", { enumerable: true, get: function () { return shared_1.PHYSICAL_RESOURCE_ID_REFERENCE; } }); +const env = process.env.AWS_EXECUTION_ENV; +// eslint-disable-next-line @typescript-eslint/no-require-imports +const runtime = env && env >= 'AWS_Lambda_nodejs18.x' ? require('./aws-sdk-v3-handler') : require('./aws-sdk-v2-handler'); +exports.handler = runtime.handler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBMEQ7QUFBakQsd0hBQUEsOEJBQThCLE9BQUE7QUFFdkMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztBQUMxQyxpRUFBaUU7QUFDakUsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzdHLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBQSFlTSUNBTF9SRVNPVVJDRV9JRF9SRUZFUkVOQ0UgfSBmcm9tICcuL3NoYXJlZCc7XG5cbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52LkFXU19FWEVDVVRJT05fRU5WO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHJ1bnRpbWUgPSBlbnYgJiYgZW52ID49ICdBV1NfTGFtYmRhX25vZGVqczE4LngnID8gcmVxdWlyZSgnLi9hd3Mtc2RrLXYzLWhhbmRsZXInKSA6IHJlcXVpcmUoJy4vYXdzLXNkay12Mi1oYW5kbGVyJyk7XG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHJ1bnRpbWUuaGFuZGxlcjsiXX0= \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/shared.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/shared.js new file mode 100644 index 0000000000000..6c53eaeef8cd1 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc/shared.js @@ -0,0 +1,106 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.startsWithOneOf = exports.decodeCall = exports.respond = exports.filterKeys = exports.decodeSpecialValues = exports.flatten = exports.PHYSICAL_RESOURCE_ID_REFERENCE = void 0; +/** + * Serialized form of the physical resource id for use in the operation parameters + */ +exports.PHYSICAL_RESOURCE_ID_REFERENCE = 'PHYSICAL:RESOURCEID:'; +/** + * Flattens a nested object + * + * @param object the object to be flattened + * @returns a flat object with path as keys + */ +function flatten(object) { + return Object.assign({}, ...function _flatten(child, path = []) { + return [].concat(...Object.keys(child) + .map(key => { + const childKey = Buffer.isBuffer(child[key]) ? child[key].toString('utf8') : child[key]; + return typeof childKey === 'object' && childKey !== null + ? _flatten(childKey, path.concat([key])) + : ({ [path.concat([key]).join('.')]: childKey }); + })); + }(object)); +} +exports.flatten = flatten; +/** + * Decodes encoded special values (physicalResourceId) + */ +function decodeSpecialValues(object, physicalResourceId) { + return JSON.parse(JSON.stringify(object), (_k, v) => { + switch (v) { + case exports.PHYSICAL_RESOURCE_ID_REFERENCE: + return physicalResourceId; + default: + return v; + } + }); +} +exports.decodeSpecialValues = decodeSpecialValues; +/** + * Filters the keys of an object. + */ +function filterKeys(object, pred) { + return Object.entries(object) + .reduce((acc, [k, v]) => pred(k) + ? { ...acc, [k]: v } + : acc, {}); +} +exports.filterKeys = filterKeys; +function respond(event, responseStatus, reason, physicalResourceId, data) { + const responseBody = JSON.stringify({ + Status: responseStatus, + Reason: reason, + PhysicalResourceId: physicalResourceId, + StackId: event.StackId, + RequestId: event.RequestId, + LogicalResourceId: event.LogicalResourceId, + NoEcho: false, + Data: data, + }); + // eslint-disable-next-line no-console + console.log('Responding', responseBody); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const parsedUrl = require('url').parse(event.ResponseURL); + const requestOptions = { + hostname: parsedUrl.hostname, + path: parsedUrl.path, + method: 'PUT', + headers: { + 'content-type': '', + 'content-length': Buffer.byteLength(responseBody, 'utf8'), + }, + }; + return new Promise((resolve, reject) => { + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const request = require('https').request(requestOptions, resolve); + request.on('error', reject); + request.write(responseBody); + request.end(); + } + catch (e) { + reject(e); + } + }); +} +exports.respond = respond; +function decodeCall(call) { + if (!call) { + return undefined; + } + return JSON.parse(call); +} +exports.decodeCall = decodeCall; +function startsWithOneOf(searchStrings) { + return function (string) { + for (const searchString of searchStrings) { + if (string.startsWith(searchString)) { + return true; + } + } + return false; + }; +} +exports.startsWithOneOf = startsWithOneOf; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOztHQUVHO0FBQ1UsUUFBQSw4QkFBOEIsR0FBRyxzQkFBc0IsQ0FBQztBQUVyRTs7Ozs7R0FLRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxNQUFjO0lBQ3BDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDbEIsRUFBRSxFQUNGLEdBQUcsU0FBUyxRQUFRLENBQUMsS0FBVSxFQUFFLE9BQWlCLEVBQUU7UUFDbEQsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDbkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hGLE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJO2dCQUN0RCxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FDVixDQUFDO0FBQ0osQ0FBQztBQWJELDBCQWFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixtQkFBbUIs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QixlQUFlLENBQUMsYUFBdUI7SUFDckQsT0FBTyxVQUFTLE1BQWM7UUFDNUIsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7WUFDeEMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztBQUNKLENBQUM7QUFURCwwQ0FTQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMsaW1wb3J0L25vLXVucmVzb2x2ZWQgKi9cbmltcG9ydCAqIGFzIEFXU0xhbWJkYSBmcm9tICdhd3MtbGFtYmRhJztcbi8qKlxuICogU2VyaWFsaXplZCBmb3JtIG9mIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBpZCBmb3IgdXNlIGluIHRoZSBvcGVyYXRpb24gcGFyYW1ldGVyc1xuICovXG5leHBvcnQgY29uc3QgUEhZU0lDQUxfUkVTT1VSQ0VfSURfUkVGRVJFTkNFID0gJ1BIWVNJQ0FMOlJFU09VUkNFSUQ6JztcblxuLyoqXG4gKiBGbGF0dGVucyBhIG5lc3RlZCBvYmplY3RcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgZmxhdHRlbmVkXG4gKiBAcmV0dXJucyBhIGZsYXQgb2JqZWN0IHdpdGggcGF0aCBhcyBrZXlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iamVjdDogb2JqZWN0KTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIC4uLmZ1bmN0aW9uIF9mbGF0dGVuKGNoaWxkOiBhbnksIHBhdGg6IHN0cmluZ1tdID0gW10pOiBhbnkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhjaGlsZClcbiAgICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkS2V5ID0gQnVmZmVyLmlzQnVmZmVyKGNoaWxkW2tleV0pID8gY2hpbGRba2V5XS50b1N0cmluZygndXRmOCcpIDogY2hpbGRba2V5XTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGNoaWxkS2V5ID09PSAnb2JqZWN0JyAmJiBjaGlsZEtleSAhPT0gbnVsbFxuICAgICAgICAgICAgPyBfZmxhdHRlbihjaGlsZEtleSwgcGF0aC5jb25jYXQoW2tleV0pKVxuICAgICAgICAgICAgOiAoeyBbcGF0aC5jb25jYXQoW2tleV0pLmpvaW4oJy4nKV06IGNoaWxkS2V5IH0pO1xuICAgICAgICB9KSk7XG4gICAgfShvYmplY3QpLFxuICApO1xufVxuXG4vKipcbiAqIERlY29kZXMgZW5jb2RlZCBzcGVjaWFsIHZhbHVlcyAocGh5c2ljYWxSZXNvdXJjZUlkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU3BlY2lhbFZhbHVlcyhvYmplY3Q6IG9iamVjdCwgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSwgKF9rLCB2KSA9PiB7XG4gICAgc3dpdGNoICh2KSB7XG4gICAgICBjYXNlIFBIWVNJQ0FMX1JFU09VUkNFX0lEX1JFRkVSRU5DRTpcbiAgICAgICAgcmV0dXJuIHBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogRmlsdGVycyB0aGUga2V5cyBvZiBhbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJLZXlzKG9iamVjdDogb2JqZWN0LCBwcmVkOiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW4pIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iamVjdClcbiAgICAucmVkdWNlKFxuICAgICAgKGFjYywgW2ssIHZdKSA9PiBwcmVkKGspXG4gICAgICAgID8geyAuLi5hY2MsIFtrXTogdiB9XG4gICAgICAgIDogYWNjLFxuICAgICAge30sXG4gICAgKTtcbn1cblxudHlwZSBFdmVudCA9IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnRcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbmQoZXZlbnQ6IEV2ZW50LCByZXNwb25zZVN0YXR1czogc3RyaW5nLCByZWFzb246IHN0cmluZywgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICBjb25zdCByZXNwb25zZUJvZHkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgU3RhdHVzOiByZXNwb25zZVN0YXR1cyxcbiAgICBSZWFzb246IHJlYXNvbixcbiAgICBQaHlzaWNhbFJlc291cmNlSWQ6IHBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICBTdGFja0lkOiBldmVudC5TdGFja0lkLFxuICAgIFJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICBOb0VjaG86IGZhbHNlLFxuICAgIERhdGE6IGRhdGEsXG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKCdSZXNwb25kaW5nJywgcmVzcG9uc2VCb2R5KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXJzZWRVcmwgPSByZXF1aXJlKCd1cmwnKS5wYXJzZShldmVudC5SZXNwb25zZVVSTCk7XG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgIGhvc3RuYW1lOiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnY29udGVudC10eXBlJzogJycsXG4gICAgICAnY29udGVudC1sZW5ndGgnOiBCdWZmZXIuYnl0ZUxlbmd0aChyZXNwb25zZUJvZHksICd1dGY4JyksXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoJ2h0dHBzJykucmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgcmVzb2x2ZSk7XG4gICAgICByZXF1ZXN0Lm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICByZXF1ZXN0LndyaXRlKHJlc3BvbnNlQm9keSk7XG4gICAgICByZXF1ZXN0LmVuZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQ2FsbChjYWxsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgaWYgKCFjYWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgcmV0dXJuIEpTT04ucGFyc2UoY2FsbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydHNXaXRoT25lT2Yoc2VhcmNoU3RyaW5nczogc3RyaW5nW10pOiAoc3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW4ge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHNlYXJjaFN0cmluZyBvZiBzZWFyY2hTdHJpbmdzKSB7XG4gICAgICBpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufSJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce/index.js b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce/index.js deleted file mode 100644 index 8237c98f2cc96..0000000000000 --- a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/asset.a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce/index.js +++ /dev/null @@ -1,256 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.handler = exports.forceSdkInstallation = exports.flatten = exports.PHYSICAL_RESOURCE_ID_REFERENCE = void 0; -/* eslint-disable no-console */ -const child_process_1 = require("child_process"); -const fs = require("fs"); -const path_1 = require("path"); -/** - * Serialized form of the physical resource id for use in the operation parameters - */ -exports.PHYSICAL_RESOURCE_ID_REFERENCE = 'PHYSICAL:RESOURCEID:'; -/** - * Flattens a nested object - * - * @param object the object to be flattened - * @returns a flat object with path as keys - */ -function flatten(object) { - return Object.assign({}, ...function _flatten(child, path = []) { - return [].concat(...Object.keys(child) - .map(key => { - const childKey = Buffer.isBuffer(child[key]) ? child[key].toString('utf8') : child[key]; - return typeof childKey === 'object' && childKey !== null - ? _flatten(childKey, path.concat([key])) - : ({ [path.concat([key]).join('.')]: childKey }); - })); - }(object)); -} -exports.flatten = flatten; -/** - * Decodes encoded special values (physicalResourceId) - */ -function decodeSpecialValues(object, physicalResourceId) { - return JSON.parse(JSON.stringify(object), (_k, v) => { - switch (v) { - case exports.PHYSICAL_RESOURCE_ID_REFERENCE: - return physicalResourceId; - default: - return v; - } - }); -} -/** - * Filters the keys of an object. - */ -function filterKeys(object, pred) { - return Object.entries(object) - .reduce((acc, [k, v]) => pred(k) - ? { ...acc, [k]: v } - : acc, {}); -} -let latestSdkInstalled = false; -function forceSdkInstallation() { - latestSdkInstalled = false; -} -exports.forceSdkInstallation = forceSdkInstallation; -/** - * Installs latest AWS SDK v2 - */ -function installLatestSdk() { - console.log('Installing latest AWS SDK v2'); - // Both HOME and --prefix are needed here because /tmp is the only writable location - (0, child_process_1.execSync)('HOME=/tmp npm install aws-sdk@2 --production --no-package-lock --no-save --prefix /tmp'); - latestSdkInstalled = true; -} -// no currently patched services -const patchedServices = []; -/** - * Patches the AWS SDK by loading service models in the same manner as the actual SDK - */ -function patchSdk(awsSdk) { - const apiLoader = awsSdk.apiLoader; - patchedServices.forEach(({ serviceName, apiVersions }) => { - const lowerServiceName = serviceName.toLowerCase(); - if (!awsSdk.Service.hasService(lowerServiceName)) { - apiLoader.services[lowerServiceName] = {}; - awsSdk[serviceName] = awsSdk.Service.defineService(lowerServiceName, apiVersions); - } - else { - awsSdk.Service.addVersions(awsSdk[serviceName], apiVersions); - } - apiVersions.forEach(apiVersion => { - Object.defineProperty(apiLoader.services[lowerServiceName], apiVersion, { - get: function get() { - const modelFilePrefix = `aws-sdk-patch/${lowerServiceName}-${apiVersion}`; - const model = JSON.parse(fs.readFileSync((0, path_1.join)(__dirname, `${modelFilePrefix}.service.json`), 'utf-8')); - model.paginators = JSON.parse(fs.readFileSync((0, path_1.join)(__dirname, `${modelFilePrefix}.paginators.json`), 'utf-8')).pagination; - return model; - }, - enumerable: true, - configurable: true, - }); - }); - }); - return awsSdk; -} -/* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */ -async function handler(event, context) { - try { - let AWS; - if (!latestSdkInstalled && event.ResourceProperties.InstallLatestAwsSdk === 'true') { - try { - installLatestSdk(); - AWS = require('/tmp/node_modules/aws-sdk'); - } - catch (e) { - console.log(`Failed to install latest AWS SDK v2: ${e}`); - AWS = require('aws-sdk'); // Fallback to pre-installed version - } - } - else if (latestSdkInstalled) { - AWS = require('/tmp/node_modules/aws-sdk'); - } - else { - AWS = require('aws-sdk'); - } - try { - AWS = patchSdk(AWS); - } - catch (e) { - console.log(`Failed to patch AWS SDK: ${e}. Proceeding with the installed copy.`); - } - console.log(JSON.stringify({ ...event, ResponseURL: '...' })); - console.log('AWS SDK VERSION: ' + AWS.VERSION); - event.ResourceProperties.Create = decodeCall(event.ResourceProperties.Create); - event.ResourceProperties.Update = decodeCall(event.ResourceProperties.Update); - event.ResourceProperties.Delete = decodeCall(event.ResourceProperties.Delete); - // Default physical resource id - let physicalResourceId; - switch (event.RequestType) { - case 'Create': - physicalResourceId = event.ResourceProperties.Create?.physicalResourceId?.id ?? - event.ResourceProperties.Update?.physicalResourceId?.id ?? - event.ResourceProperties.Delete?.physicalResourceId?.id ?? - event.LogicalResourceId; - break; - case 'Update': - case 'Delete': - physicalResourceId = event.ResourceProperties[event.RequestType]?.physicalResourceId?.id ?? event.PhysicalResourceId; - break; - } - let flatData = {}; - let data = {}; - const call = event.ResourceProperties[event.RequestType]; - if (call) { - let credentials; - if (call.assumedRoleArn) { - const timestamp = (new Date()).getTime(); - const params = { - RoleArn: call.assumedRoleArn, - RoleSessionName: `${timestamp}-${physicalResourceId}`.substring(0, 64), - }; - credentials = new AWS.ChainableTemporaryCredentials({ - params: params, - stsConfig: { stsRegionalEndpoints: 'regional' }, - }); - } - if (!Object.prototype.hasOwnProperty.call(AWS, call.service)) { - throw Error(`Service ${call.service} does not exist in AWS SDK version ${AWS.VERSION}.`); - } - const awsService = new AWS[call.service]({ - apiVersion: call.apiVersion, - credentials: credentials, - region: call.region, - }); - try { - const response = await awsService[call.action](call.parameters && decodeSpecialValues(call.parameters, physicalResourceId)).promise(); - flatData = { - apiVersion: awsService.config.apiVersion, - region: awsService.config.region, - ...flatten(response), - }; - let outputPaths; - if (call.outputPath) { - outputPaths = [call.outputPath]; - } - else if (call.outputPaths) { - outputPaths = call.outputPaths; - } - if (outputPaths) { - data = filterKeys(flatData, startsWithOneOf(outputPaths)); - } - else { - data = flatData; - } - } - catch (e) { - if (!call.ignoreErrorCodesMatching || !new RegExp(call.ignoreErrorCodesMatching).test(e.code)) { - throw e; - } - } - if (call.physicalResourceId?.responsePath) { - physicalResourceId = flatData[call.physicalResourceId.responsePath]; - } - } - await respond('SUCCESS', 'OK', physicalResourceId, data); - } - catch (e) { - console.log(e); - await respond('FAILED', e.message || 'Internal Error', context.logStreamName, {}); - } - function respond(responseStatus, reason, physicalResourceId, data) { - const responseBody = JSON.stringify({ - Status: responseStatus, - Reason: reason, - PhysicalResourceId: physicalResourceId, - StackId: event.StackId, - RequestId: event.RequestId, - LogicalResourceId: event.LogicalResourceId, - NoEcho: false, - Data: data, - }); - console.log('Responding', responseBody); - // eslint-disable-next-line @typescript-eslint/no-require-imports - const parsedUrl = require('url').parse(event.ResponseURL); - const requestOptions = { - hostname: parsedUrl.hostname, - path: parsedUrl.path, - method: 'PUT', - headers: { - 'content-type': '', - 'content-length': Buffer.byteLength(responseBody, 'utf8'), - }, - }; - return new Promise((resolve, reject) => { - try { - // eslint-disable-next-line @typescript-eslint/no-require-imports - const request = require('https').request(requestOptions, resolve); - request.on('error', reject); - request.write(responseBody); - request.end(); - } - catch (e) { - reject(e); - } - }); - } -} -exports.handler = handler; -function decodeCall(call) { - if (!call) { - return undefined; - } - return JSON.parse(call); -} -function startsWithOneOf(searchStrings) { - return function (string) { - for (const searchString of searchStrings) { - if (string.startsWith(searchString)) { - return true; - } - } - return false; - }; -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDL0IsaURBQXlDO0FBQ3pDLHlCQUF5QjtBQUN6QiwrQkFBNEI7QUFTNUI7O0dBRUc7QUFDVSxRQUFBLDhCQUE4QixHQUFHLHNCQUFzQixDQUFDO0FBRXJFOzs7OztHQUtHO0FBQ0gsU0FBZ0IsT0FBTyxDQUFDLE1BQWM7SUFDcEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUNsQixFQUFFLEVBQ0YsR0FBRyxTQUFTLFFBQVEsQ0FBQyxLQUFVLEVBQUUsT0FBaUIsRUFBRTtRQUNsRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNuQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDVCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEYsT0FBTyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUk7Z0JBQ3RELENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUNWLENBQUM7QUFDSixDQUFDO0FBYkQsMEJBYUM7QUFFRDs7R0FFRztBQUNILFNBQVMsbUJBQW1CLENBQUMsTUFBYyxFQUFFLGtCQUEwQjtJQUNyRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsRCxRQUFRLENBQUMsRUFBRTtZQUNULEtBQUssc0NBQThCO2dCQUNqQyxPQUFPLGtCQUFrQixDQUFDO1lBQzVCO2dCQUNFLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsVUFBVSxDQUFDLE1BQWMsRUFBRSxJQUE4QjtJQUNoRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1NBQzFCLE1BQU0sQ0FDTCxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUNwQixDQUFDLENBQUMsR0FBRyxFQUNQLEVBQUUsQ0FDSCxDQUFDO0FBQ04sQ0FBQztBQUVELElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBRS9CLFNBQWdCLG9CQUFvQjtJQUNsQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFDN0IsQ0FBQztBQUZELG9EQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQjtJQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDNUMsb0ZBQW9GO0lBQ3BGLElBQUEsd0JBQVEsRUFBQyx3RkFBd0YsQ0FBQyxDQUFDO0lBQ25HLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUM1QixDQUFDO0FBRUQsZ0NBQWdDO0FBQ2hDLE1BQU0sZUFBZSxHQUFxRCxFQUFFLENBQUM7QUFDN0U7O0dBRUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxNQUFXO0lBQzNCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7UUFDdkQsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDaEQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDbkY7YUFBTTtZQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUM5RDtRQUNELFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsVUFBVSxFQUFFO2dCQUN0RSxHQUFHLEVBQUUsU0FBUyxHQUFHO29CQUNmLE1BQU0sZUFBZSxHQUFHLGlCQUFpQixnQkFBZ0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDMUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUEsV0FBSSxFQUFDLFNBQVMsRUFBRSxHQUFHLGVBQWUsZUFBZSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdkcsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLEdBQUcsZUFBZSxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO29CQUMxSCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2dCQUNELFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELDZGQUE2RjtBQUN0RixLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtELEVBQUUsT0FBMEI7SUFDMUcsSUFBSTtRQUNGLElBQUksR0FBUSxDQUFDO1FBQ2IsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsS0FBSyxNQUFNLEVBQUU7WUFDbEYsSUFBSTtnQkFDRixnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuQixHQUFHLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7YUFDNUM7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxHQUFHLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsb0NBQW9DO2FBQy9EO1NBQ0Y7YUFBTSxJQUFJLGtCQUFrQixFQUFFO1lBQzdCLEdBQUcsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ0wsR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMxQjtRQUNELElBQUk7WUFDRixHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDbkY7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRS9DLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlFLCtCQUErQjtRQUMvQixJQUFJLGtCQUEwQixDQUFDO1FBQy9CLFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN6QixLQUFLLFFBQVE7Z0JBQ1gsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxFQUFFO29CQUN2RCxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLEVBQUU7b0JBQ3ZELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtvQkFDdkQsS0FBSyxDQUFDLGlCQUFpQixDQUFDO2dCQUM3QyxNQUFNO1lBQ1IsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFFBQVE7Z0JBQ1gsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDO2dCQUNySCxNQUFNO1NBQ1Q7UUFFRCxJQUFJLFFBQVEsR0FBOEIsRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxHQUE4QixFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEdBQTJCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakYsSUFBSSxJQUFJLEVBQUU7WUFFUixJQUFJLFdBQVcsQ0FBQztZQUNoQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUV6QyxNQUFNLE1BQU0sR0FBRztvQkFDYixPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7b0JBQzVCLGVBQWUsRUFBRSxHQUFHLFNBQVMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2lCQUN2RSxDQUFDO2dCQUVGLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQztvQkFDbEQsTUFBTSxFQUFFLE1BQU07b0JBQ2QsU0FBUyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFO2lCQUNoRCxDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDNUQsTUFBTSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsT0FBTyxzQ0FBc0MsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7YUFDMUY7WUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFLLEdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTthQUNwQixDQUFDLENBQUM7WUFFSCxJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDNUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDekYsUUFBUSxHQUFHO29CQUNULFVBQVUsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVU7b0JBQ3hDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ2hDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztpQkFDckIsQ0FBQztnQkFFRixJQUFJLFdBQWlDLENBQUM7Z0JBQ3RDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNqQztxQkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQzNCLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2lCQUNoQztnQkFFRCxJQUFJLFdBQVcsRUFBRTtvQkFDZixJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztpQkFDM0Q7cUJBQU07b0JBQ0wsSUFBSSxHQUFHLFFBQVEsQ0FBQztpQkFDakI7YUFDRjtZQUFDLE9BQU8sQ0FBTSxFQUFFO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM3RixNQUFNLENBQUMsQ0FBQztpQkFDVDthQUNGO1lBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFO2dCQUN6QyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7UUFFRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzFEO0lBQUMsT0FBTyxDQUFNLEVBQUU7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsTUFBTSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUNuRjtJQUVELFNBQVMsT0FBTyxDQUFDLGNBQXNCLEVBQUUsTUFBYyxFQUFFLGtCQUEwQixFQUFFLElBQVM7UUFDNUYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNsQyxNQUFNLEVBQUUsY0FBYztZQUN0QixNQUFNLEVBQUUsTUFBTTtZQUNkLGtCQUFrQixFQUFFLGtCQUFrQjtZQUN0QyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDMUMsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXhDLGlFQUFpRTtRQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxNQUFNLGNBQWMsR0FBRztZQUNyQixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7WUFDNUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1lBQ3BCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUM7YUFDMUQ7U0FDRixDQUFDO1FBRUYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJO2dCQUNGLGlFQUFpRTtnQkFDakUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM1QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDZjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQXJKRCwwQkFxSkM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUF3QjtJQUMxQyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7S0FBRTtJQUNoQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLGFBQXVCO0lBQzlDLE9BQU8sVUFBUyxNQUFjO1FBQzVCLEtBQUssTUFBTSxZQUFZLElBQUksYUFBYSxFQUFFO1lBQ3hDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbi8vIGltcG9ydCB0aGUgQVdTTGFtYmRhIHBhY2thZ2UgZXhwbGljaXRseSxcbi8vIHdoaWNoIGlzIGdsb2JhbGx5IGF2YWlsYWJsZSBpbiB0aGUgTGFtYmRhIHJ1bnRpbWUsXG4vLyBhcyBvdGhlcndpc2UgbGlua2luZyB0aGlzIHJlcG9zaXRvcnkgd2l0aCBsaW5rLWFsbC5zaFxuLy8gZmFpbHMgaW4gdGhlIENESyBhcHAgZXhlY3V0ZWQgd2l0aCB0cy1ub2RlXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLGltcG9ydC9uby11bnJlc29sdmVkICovXG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBBd3NTZGtDYWxsIH0gZnJvbSAnLi4vYXdzLWN1c3RvbS1yZXNvdXJjZSc7XG5cbi8qKlxuICogU2VyaWFsaXplZCBmb3JtIG9mIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBpZCBmb3IgdXNlIGluIHRoZSBvcGVyYXRpb24gcGFyYW1ldGVyc1xuICovXG5leHBvcnQgY29uc3QgUEhZU0lDQUxfUkVTT1VSQ0VfSURfUkVGRVJFTkNFID0gJ1BIWVNJQ0FMOlJFU09VUkNFSUQ6JztcblxuLyoqXG4gKiBGbGF0dGVucyBhIG5lc3RlZCBvYmplY3RcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgZmxhdHRlbmVkXG4gKiBAcmV0dXJucyBhIGZsYXQgb2JqZWN0IHdpdGggcGF0aCBhcyBrZXlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iamVjdDogb2JqZWN0KTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIC4uLmZ1bmN0aW9uIF9mbGF0dGVuKGNoaWxkOiBhbnksIHBhdGg6IHN0cmluZ1tdID0gW10pOiBhbnkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhjaGlsZClcbiAgICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkS2V5ID0gQnVmZmVyLmlzQnVmZmVyKGNoaWxkW2tleV0pID8gY2hpbGRba2V5XS50b1N0cmluZygndXRmOCcpIDogY2hpbGRba2V5XTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGNoaWxkS2V5ID09PSAnb2JqZWN0JyAmJiBjaGlsZEtleSAhPT0gbnVsbFxuICAgICAgICAgICAgPyBfZmxhdHRlbihjaGlsZEtleSwgcGF0aC5jb25jYXQoW2tleV0pKVxuICAgICAgICAgICAgOiAoeyBbcGF0aC5jb25jYXQoW2tleV0pLmpvaW4oJy4nKV06IGNoaWxkS2V5IH0pO1xuICAgICAgICB9KSk7XG4gICAgfShvYmplY3QpLFxuICApO1xufVxuXG4vKipcbiAqIERlY29kZXMgZW5jb2RlZCBzcGVjaWFsIHZhbHVlcyAocGh5c2ljYWxSZXNvdXJjZUlkKVxuICovXG5mdW5jdGlvbiBkZWNvZGVTcGVjaWFsVmFsdWVzKG9iamVjdDogb2JqZWN0LCBwaHlzaWNhbFJlc291cmNlSWQ6IHN0cmluZykge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3QpLCAoX2ssIHYpID0+IHtcbiAgICBzd2l0Y2ggKHYpIHtcbiAgICAgIGNhc2UgUEhZU0lDQUxfUkVTT1VSQ0VfSURfUkVGRVJFTkNFOlxuICAgICAgICByZXR1cm4gcGh5c2ljYWxSZXNvdXJjZUlkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBGaWx0ZXJzIHRoZSBrZXlzIG9mIGFuIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZmlsdGVyS2V5cyhvYmplY3Q6IG9iamVjdCwgcHJlZDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhvYmplY3QpXG4gICAgLnJlZHVjZShcbiAgICAgIChhY2MsIFtrLCB2XSkgPT4gcHJlZChrKVxuICAgICAgICA/IHsgLi4uYWNjLCBba106IHYgfVxuICAgICAgICA6IGFjYyxcbiAgICAgIHt9LFxuICAgICk7XG59XG5cbmxldCBsYXRlc3RTZGtJbnN0YWxsZWQgPSBmYWxzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlU2RrSW5zdGFsbGF0aW9uKCkge1xuICBsYXRlc3RTZGtJbnN0YWxsZWQgPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBJbnN0YWxscyBsYXRlc3QgQVdTIFNESyB2MlxuICovXG5mdW5jdGlvbiBpbnN0YWxsTGF0ZXN0U2RrKCk6IHZvaWQge1xuICBjb25zb2xlLmxvZygnSW5zdGFsbGluZyBsYXRlc3QgQVdTIFNESyB2MicpO1xuICAvLyBCb3RoIEhPTUUgYW5kIC0tcHJlZml4IGFyZSBuZWVkZWQgaGVyZSBiZWNhdXNlIC90bXAgaXMgdGhlIG9ubHkgd3JpdGFibGUgbG9jYXRpb25cbiAgZXhlY1N5bmMoJ0hPTUU9L3RtcCBucG0gaW5zdGFsbCBhd3Mtc2RrQDIgLS1wcm9kdWN0aW9uIC0tbm8tcGFja2FnZS1sb2NrIC0tbm8tc2F2ZSAtLXByZWZpeCAvdG1wJyk7XG4gIGxhdGVzdFNka0luc3RhbGxlZCA9IHRydWU7XG59XG5cbi8vIG5vIGN1cnJlbnRseSBwYXRjaGVkIHNlcnZpY2VzXG5jb25zdCBwYXRjaGVkU2VydmljZXM6IHsgc2VydmljZU5hbWU6IHN0cmluZzsgYXBpVmVyc2lvbnM6IHN0cmluZ1tdIH1bXSA9IFtdO1xuLyoqXG4gKiBQYXRjaGVzIHRoZSBBV1MgU0RLIGJ5IGxvYWRpbmcgc2VydmljZSBtb2RlbHMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBhY3R1YWwgU0RLXG4gKi9cbmZ1bmN0aW9uIHBhdGNoU2RrKGF3c1NkazogYW55KTogYW55IHtcbiAgY29uc3QgYXBpTG9hZGVyID0gYXdzU2RrLmFwaUxvYWRlcjtcbiAgcGF0Y2hlZFNlcnZpY2VzLmZvckVhY2goKHsgc2VydmljZU5hbWUsIGFwaVZlcnNpb25zIH0pID0+IHtcbiAgICBjb25zdCBsb3dlclNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIWF3c1Nkay5TZXJ2aWNlLmhhc1NlcnZpY2UobG93ZXJTZXJ2aWNlTmFtZSkpIHtcbiAgICAgIGFwaUxvYWRlci5zZXJ2aWNlc1tsb3dlclNlcnZpY2VOYW1lXSA9IHt9O1xuICAgICAgYXdzU2RrW3NlcnZpY2VOYW1lXSA9IGF3c1Nkay5TZXJ2aWNlLmRlZmluZVNlcnZpY2UobG93ZXJTZXJ2aWNlTmFtZSwgYXBpVmVyc2lvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd3NTZGsuU2VydmljZS5hZGRWZXJzaW9ucyhhd3NTZGtbc2VydmljZU5hbWVdLCBhcGlWZXJzaW9ucyk7XG4gICAgfVxuICAgIGFwaVZlcnNpb25zLmZvckVhY2goYXBpVmVyc2lvbiA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBpTG9hZGVyLnNlcnZpY2VzW2xvd2VyU2VydmljZU5hbWVdLCBhcGlWZXJzaW9uLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsRmlsZVByZWZpeCA9IGBhd3Mtc2RrLXBhdGNoLyR7bG93ZXJTZXJ2aWNlTmFtZX0tJHthcGlWZXJzaW9ufWA7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhqb2luKF9fZGlybmFtZSwgYCR7bW9kZWxGaWxlUHJlZml4fS5zZXJ2aWNlLmpzb25gKSwgJ3V0Zi04JykpO1xuICAgICAgICAgIG1vZGVsLnBhZ2luYXRvcnMgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhqb2luKF9fZGlybmFtZSwgYCR7bW9kZWxGaWxlUHJlZml4fS5wYWdpbmF0b3JzLmpzb25gKSwgJ3V0Zi04JykpLnBhZ2luYXRpb247XG4gICAgICAgICAgcmV0dXJuIG1vZGVsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBhd3NTZGs7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIGNvbnRleHQ6IEFXU0xhbWJkYS5Db250ZXh0KSB7XG4gIHRyeSB7XG4gICAgbGV0IEFXUzogYW55O1xuICAgIGlmICghbGF0ZXN0U2RrSW5zdGFsbGVkICYmIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5JbnN0YWxsTGF0ZXN0QXdzU2RrID09PSAndHJ1ZScpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluc3RhbGxMYXRlc3RTZGsoKTtcbiAgICAgICAgQVdTID0gcmVxdWlyZSgnL3RtcC9ub2RlX21vZHVsZXMvYXdzLXNkaycpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGluc3RhbGwgbGF0ZXN0IEFXUyBTREsgdjI6ICR7ZX1gKTtcbiAgICAgICAgQVdTID0gcmVxdWlyZSgnYXdzLXNkaycpOyAvLyBGYWxsYmFjayB0byBwcmUtaW5zdGFsbGVkIHZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxhdGVzdFNka0luc3RhbGxlZCkge1xuICAgICAgQVdTID0gcmVxdWlyZSgnL3RtcC9ub2RlX21vZHVsZXMvYXdzLXNkaycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBBV1MgPSByZXF1aXJlKCdhd3Mtc2RrJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBBV1MgPSBwYXRjaFNkayhBV1MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gcGF0Y2ggQVdTIFNESzogJHtlfS4gUHJvY2VlZGluZyB3aXRoIHRoZSBpbnN0YWxsZWQgY29weS5gKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IC4uLmV2ZW50LCBSZXNwb25zZVVSTDogJy4uLicgfSkpO1xuICAgIGNvbnNvbGUubG9nKCdBV1MgU0RLIFZFUlNJT046ICcgKyBBV1MuVkVSU0lPTik7XG5cbiAgICBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuQ3JlYXRlID0gZGVjb2RlQ2FsbChldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuQ3JlYXRlKTtcbiAgICBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuVXBkYXRlID0gZGVjb2RlQ2FsbChldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuVXBkYXRlKTtcbiAgICBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuRGVsZXRlID0gZGVjb2RlQ2FsbChldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuRGVsZXRlKTtcbiAgICAvLyBEZWZhdWx0IHBoeXNpY2FsIHJlc291cmNlIGlkXG4gICAgbGV0IHBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xuICAgIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5DcmVhdGU/LnBoeXNpY2FsUmVzb3VyY2VJZD8uaWQgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlVwZGF0ZT8ucGh5c2ljYWxSZXNvdXJjZUlkPy5pZCA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuRGVsZXRlPy5waHlzaWNhbFJlc291cmNlSWQ/LmlkID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXNbZXZlbnQuUmVxdWVzdFR5cGVdPy5waHlzaWNhbFJlc291cmNlSWQ/LmlkID8/IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGV0IGZsYXREYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgbGV0IGRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBjb25zdCBjYWxsOiBBd3NTZGtDYWxsIHwgdW5kZWZpbmVkID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzW2V2ZW50LlJlcXVlc3RUeXBlXTtcblxuICAgIGlmIChjYWxsKSB7XG5cbiAgICAgIGxldCBjcmVkZW50aWFscztcbiAgICAgIGlmIChjYWxsLmFzc3VtZWRSb2xlQXJuKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIFJvbGVBcm46IGNhbGwuYXNzdW1lZFJvbGVBcm4sXG4gICAgICAgICAgUm9sZVNlc3Npb25OYW1lOiBgJHt0aW1lc3RhbXB9LSR7cGh5c2ljYWxSZXNvdXJjZUlkfWAuc3Vic3RyaW5nKDAsIDY0KSxcbiAgICAgICAgfTtcblxuICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBBV1MuQ2hhaW5hYmxlVGVtcG9yYXJ5Q3JlZGVudGlhbHMoe1xuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIHN0c0NvbmZpZzogeyBzdHNSZWdpb25hbEVuZHBvaW50czogJ3JlZ2lvbmFsJyB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoQVdTLCBjYWxsLnNlcnZpY2UpKSB7XG4gICAgICAgIHRocm93IEVycm9yKGBTZXJ2aWNlICR7Y2FsbC5zZXJ2aWNlfSBkb2VzIG5vdCBleGlzdCBpbiBBV1MgU0RLIHZlcnNpb24gJHtBV1MuVkVSU0lPTn0uYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBhd3NTZXJ2aWNlID0gbmV3IChBV1MgYXMgYW55KVtjYWxsLnNlcnZpY2VdKHtcbiAgICAgICAgYXBpVmVyc2lvbjogY2FsbC5hcGlWZXJzaW9uLFxuICAgICAgICBjcmVkZW50aWFsczogY3JlZGVudGlhbHMsXG4gICAgICAgIHJlZ2lvbjogY2FsbC5yZWdpb24sXG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhd3NTZXJ2aWNlW2NhbGwuYWN0aW9uXShcbiAgICAgICAgICBjYWxsLnBhcmFtZXRlcnMgJiYgZGVjb2RlU3BlY2lhbFZhbHVlcyhjYWxsLnBhcmFtZXRlcnMsIHBoeXNpY2FsUmVzb3VyY2VJZCkpLnByb21pc2UoKTtcbiAgICAgICAgZmxhdERhdGEgPSB7XG4gICAgICAgICAgYXBpVmVyc2lvbjogYXdzU2VydmljZS5jb25maWcuYXBpVmVyc2lvbiwgLy8gRm9yIHRlc3QgcHVycG9zZXM6IGNoZWNrIGlmIGFwaVZlcnNpb24gd2FzIGNvcnJlY3RseSBwYXNzZWQuXG4gICAgICAgICAgcmVnaW9uOiBhd3NTZXJ2aWNlLmNvbmZpZy5yZWdpb24sIC8vIEZvciB0ZXN0IHB1cnBvc2VzOiBjaGVjayBpZiByZWdpb24gd2FzIGNvcnJlY3RseSBwYXNzZWQuXG4gICAgICAgICAgLi4uZmxhdHRlbihyZXNwb25zZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG91dHB1dFBhdGhzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNhbGwub3V0cHV0UGF0aCkge1xuICAgICAgICAgIG91dHB1dFBhdGhzID0gW2NhbGwub3V0cHV0UGF0aF07XG4gICAgICAgIH0gZWxzZSBpZiAoY2FsbC5vdXRwdXRQYXRocykge1xuICAgICAgICAgIG91dHB1dFBhdGhzID0gY2FsbC5vdXRwdXRQYXRocztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvdXRwdXRQYXRocykge1xuICAgICAgICAgIGRhdGEgPSBmaWx0ZXJLZXlzKGZsYXREYXRhLCBzdGFydHNXaXRoT25lT2Yob3V0cHV0UGF0aHMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhID0gZmxhdERhdGE7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoIWNhbGwuaWdub3JlRXJyb3JDb2Rlc01hdGNoaW5nIHx8ICFuZXcgUmVnRXhwKGNhbGwuaWdub3JlRXJyb3JDb2Rlc01hdGNoaW5nKS50ZXN0KGUuY29kZSkpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYWxsLnBoeXNpY2FsUmVzb3VyY2VJZD8ucmVzcG9uc2VQYXRoKSB7XG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZCA9IGZsYXREYXRhW2NhbGwucGh5c2ljYWxSZXNvdXJjZUlkLnJlc3BvbnNlUGF0aF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcmVzcG9uZCgnU1VDQ0VTUycsICdPSycsIHBoeXNpY2FsUmVzb3VyY2VJZCwgZGF0YSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIGF3YWl0IHJlc3BvbmQoJ0ZBSUxFRCcsIGUubWVzc2FnZSB8fCAnSW50ZXJuYWwgRXJyb3InLCBjb250ZXh0LmxvZ1N0cmVhbU5hbWUsIHt9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3BvbmQocmVzcG9uc2VTdGF0dXM6IHN0cmluZywgcmVhc29uOiBzdHJpbmcsIHBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICBjb25zdCByZXNwb25zZUJvZHkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBTdGF0dXM6IHJlc3BvbnNlU3RhdHVzLFxuICAgICAgUmVhc29uOiByZWFzb24sXG4gICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IHBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICAgIFN0YWNrSWQ6IGV2ZW50LlN0YWNrSWQsXG4gICAgICBSZXF1ZXN0SWQ6IGV2ZW50LlJlcXVlc3RJZCxcbiAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICAgIE5vRWNobzogZmFsc2UsXG4gICAgICBEYXRhOiBkYXRhLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ1Jlc3BvbmRpbmcnLCByZXNwb25zZUJvZHkpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBwYXJzZWRVcmwgPSByZXF1aXJlKCd1cmwnKS5wYXJzZShldmVudC5SZXNwb25zZVVSTCk7XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBob3N0bmFtZTogcGFyc2VkVXJsLmhvc3RuYW1lLFxuICAgICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsXG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnY29udGVudC10eXBlJzogJycsXG4gICAgICAgICdjb250ZW50LWxlbmd0aCc6IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlc3BvbnNlQm9keSwgJ3V0ZjgnKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWlyZSgnaHR0cHMnKS5yZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCByZXNvbHZlKTtcbiAgICAgICAgcmVxdWVzdC5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICByZXF1ZXN0LndyaXRlKHJlc3BvbnNlQm9keSk7XG4gICAgICAgIHJlcXVlc3QuZW5kKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWNvZGVDYWxsKGNhbGw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBpZiAoIWNhbGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICByZXR1cm4gSlNPTi5wYXJzZShjYWxsKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRzV2l0aE9uZU9mKHNlYXJjaFN0cmluZ3M6IHN0cmluZ1tdKTogKHN0cmluZzogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZWFyY2hTdHJpbmcgb2Ygc2VhcmNoU3RyaW5ncykge1xuICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKHNlYXJjaFN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.assets.json b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.assets.json new file mode 100644 index 0000000000000..02737f57779ed --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.assets.json @@ -0,0 +1,32 @@ +{ + "version": "31.0.0", + "files": { + "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc": { + "source": { + "path": "asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "3da2061ab19826d53e1313fbcfc6b6f457e955f6fb922c2e400c4c407756cc17": { + "source": { + "path": "aws-cdk-sdk-js-v3.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "3da2061ab19826d53e1313fbcfc6b6f457e955f6fb922c2e400c4c407756cc17.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/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.template.json b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.template.json new file mode 100644 index 0000000000000..c65a68b0f06ed --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js-v3.template.json @@ -0,0 +1,491 @@ +{ + "Resources": { + "TopicBFC7AF6E": { + "Type": "AWS::SNS::Topic" + }, + "Publish2E9BDF73": { + "Type": "Custom::SNSPublisher", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "AWS679f53fac002430cb0da5b7982bd22872D164C4C", + "Arn" + ] + }, + "Create": { + "Fn::Join": [ + "", + [ + "{\"service\":\"SNS\",\"action\":\"publish\",\"parameters\":{\"Message\":\"hello\",\"TopicArn\":\"", + { + "Ref": "TopicBFC7AF6E" + }, + "\"},\"physicalResourceId\":{\"id\":\"", + { + "Ref": "TopicBFC7AF6E" + }, + "\"}}" + ] + ] + }, + "Update": { + "Fn::Join": [ + "", + [ + "{\"service\":\"SNS\",\"action\":\"publish\",\"parameters\":{\"Message\":\"hello\",\"TopicArn\":\"", + { + "Ref": "TopicBFC7AF6E" + }, + "\"},\"physicalResourceId\":{\"id\":\"", + { + "Ref": "TopicBFC7AF6E" + }, + "\"}}" + ] + ] + }, + "InstallLatestAwsSdk": "false" + }, + "DependsOn": [ + "PublishCustomResourcePolicyDF696FCA" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "PublishCustomResourcePolicyDF696FCA": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "sns:Publish", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "PublishCustomResourcePolicyDF696FCA", + "Roles": [ + { + "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ] + } + }, + "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "AWS679f53fac002430cb0da5b7982bd22872D164C4C": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc.zip" + }, + "Role": { + "Fn::GetAtt": [ + "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "Timeout": 120 + }, + "DependsOn": [ + "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + ] + }, + "ListTopicsCE1E0341": { + "Type": "Custom::AWS", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "AWS679f53fac002430cb0da5b7982bd22872D164C4C", + "Arn" + ] + }, + "Create": "{\"service\":\"SNS\",\"action\":\"listTopics\",\"physicalResourceId\":{\"responsePath\":\"Topics.0.TopicArn\"}}", + "Update": "{\"service\":\"SNS\",\"action\":\"listTopics\",\"physicalResourceId\":{\"responsePath\":\"Topics.0.TopicArn\"}}", + "InstallLatestAwsSdk": "false" + }, + "DependsOn": [ + "ListTopicsCustomResourcePolicy31A8396A", + "TopicBFC7AF6E" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "ListTopicsCustomResourcePolicy31A8396A": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "sns:ListTopics", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ListTopicsCustomResourcePolicy31A8396A", + "Roles": [ + { + "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ] + }, + "DependsOn": [ + "TopicBFC7AF6E" + ] + }, + "Utf8Parameter6C885A19": { + "Type": "AWS::SSM::Parameter", + "Properties": { + "Type": "String", + "Value": "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ!\"#¤%&/()=?`´^*+~_-.,:;<>|" + } + }, + "GetParameter42B0A00E": { + "Type": "Custom::SSMParameter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "AWS679f53fac002430cb0da5b7982bd22872D164C4C", + "Arn" + ] + }, + "Create": { + "Fn::Join": [ + "", + [ + "{\"service\":\"SSM\",\"action\":\"getParameter\",\"parameters\":{\"Name\":\"", + { + "Ref": "Utf8Parameter6C885A19" + }, + "\",\"WithDecryption\":true},\"physicalResourceId\":{\"responsePath\":\"Parameter.ARN\"}}" + ] + ] + }, + "Update": { + "Fn::Join": [ + "", + [ + "{\"service\":\"SSM\",\"action\":\"getParameter\",\"parameters\":{\"Name\":\"", + { + "Ref": "Utf8Parameter6C885A19" + }, + "\",\"WithDecryption\":true},\"physicalResourceId\":{\"responsePath\":\"Parameter.ARN\"}}" + ] + ] + }, + "InstallLatestAwsSdk": "false" + }, + "DependsOn": [ + "GetParameterCustomResourcePolicyD8E5D455" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "GetParameterCustomResourcePolicyD8E5D455": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "ssm:GetParameter", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "GetParameterCustomResourcePolicyD8E5D455", + "Roles": [ + { + "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ] + } + }, + "CustomRole6D8E6809": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "CustomRoleDefaultPolicyC5C189DF": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "ssm:*", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "CustomRoleDefaultPolicyC5C189DF", + "Roles": [ + { + "Ref": "CustomRole6D8E6809" + } + ] + } + }, + "GetParameterNoPolicyFCF7AA3B": { + "Type": "Custom::SSMParameter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "AWS679f53fac002430cb0da5b7982bd22872D164C4C", + "Arn" + ] + }, + "Create": { + "Fn::Join": [ + "", + [ + "{\"service\":\"SSM\",\"action\":\"getParameter\",\"parameters\":{\"Name\":\"", + { + "Ref": "Utf8Parameter6C885A19" + }, + "\",\"WithDecryption\":true},\"physicalResourceId\":{\"responsePath\":\"Parameter.ARN\"}}" + ] + ] + }, + "Update": { + "Fn::Join": [ + "", + [ + "{\"service\":\"SSM\",\"action\":\"getParameter\",\"parameters\":{\"Name\":\"", + { + "Ref": "Utf8Parameter6C885A19" + }, + "\",\"WithDecryption\":true},\"physicalResourceId\":{\"responsePath\":\"Parameter.ARN\"}}" + ] + ] + }, + "InstallLatestAwsSdk": "false" + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + } + }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, + "Outputs": { + "MessageId": { + "Value": { + "Fn::GetAtt": [ + "Publish2E9BDF73", + "MessageId" + ] + } + }, + "TopicArn": { + "Value": { + "Fn::GetAtt": [ + "ListTopicsCE1E0341", + "Topics.0.TopicArn" + ] + } + }, + "ParameterValue": { + "Value": { + "Fn::GetAtt": [ + "GetParameter42B0A00E", + "Parameter.Value" + ] + } + }, + "ParameterValueNoPolicy": { + "Value": { + "Fn::GetAtt": [ + "GetParameterNoPolicyFCF7AA3B", + "Parameter.Value" + ] + } + } + }, + "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/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.assets.json b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.assets.json index 99de43f95da00..4b584e76695b9 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.assets.json @@ -1,20 +1,20 @@ { "version": "31.0.0", "files": { - "a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce": { + "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc": { "source": { - "path": "asset.a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce", + "path": "asset.23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc", "packaging": "zip" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce.zip", + "objectKey": "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "0fa9053f5d98b6f6966fb0261401f1e34d3f1e932afcd963ab41a0448b0f2e5f": { + "82f36f0354a6f7dbe1644fcba5e6e022c3c4625d74ce49f26184cc81fc4b44bb": { "source": { "path": "aws-cdk-sdk-js.template.json", "packaging": "file" @@ -22,7 +22,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "0fa9053f5d98b6f6966fb0261401f1e34d3f1e932afcd963ab41a0448b0f2e5f.json", + "objectKey": "82f36f0354a6f7dbe1644fcba5e6e022c3c4625d74ce49f26184cc81fc4b44bb.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.template.json b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.template.json index e0f3cbf3f1add..8b27fc7cddb87 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/aws-cdk-sdk-js.template.json @@ -44,7 +44,7 @@ ] ] }, - "InstallLatestAwsSdk": false + "InstallLatestAwsSdk": "false" }, "DependsOn": [ "PublishCustomResourcePolicyDF696FCA" @@ -111,7 +111,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce.zip" + "S3Key": "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc.zip" }, "Role": { "Fn::GetAtt": [ @@ -146,7 +146,7 @@ }, "Create": "{\"service\":\"SNS\",\"action\":\"listTopics\",\"physicalResourceId\":{\"responsePath\":\"Topics.0.TopicArn\"}}", "Update": "{\"service\":\"SNS\",\"action\":\"listTopics\",\"physicalResourceId\":{\"responsePath\":\"Topics.0.TopicArn\"}}", - "InstallLatestAwsSdk": false + "InstallLatestAwsSdk": "false" }, "DependsOn": [ "ListTopicsCustomResourcePolicy31A8396A", @@ -219,7 +219,7 @@ ] ] }, - "InstallLatestAwsSdk": false + "InstallLatestAwsSdk": "false" }, "DependsOn": [ "GetParameterCustomResourcePolicyD8E5D455" @@ -319,7 +319,7 @@ ] ] }, - "InstallLatestAwsSdk": false + "InstallLatestAwsSdk": "false" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/integ.json index caf6ea388ffe2..d2b3505f461f2 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/integ.json @@ -3,7 +3,8 @@ "testCases": { "AwsCustomResourceTest/DefaultTest": { "stacks": [ - "aws-cdk-sdk-js" + "aws-cdk-sdk-js", + "aws-cdk-sdk-js-v3" ], "assertionStack": "AwsCustomResourceTest/DefaultTest/DeployAssert", "assertionStackName": "AwsCustomResourceTestDefaultTestDeployAssert289A7DC5" diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/manifest.json index c6a5e9e9c04a0..b0a5f8bc4f80e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/manifest.json @@ -17,7 +17,7 @@ "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}/0fa9053f5d98b6f6966fb0261401f1e34d3f1e932afcd963ab41a0448b0f2e5f.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/82f36f0354a6f7dbe1644fcba5e6e022c3c4625d74ce49f26184cc81fc4b44bb.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -39,6 +39,12 @@ "data": "TopicBFC7AF6E" } ], + "/aws-cdk-sdk-js/Publish": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], "/aws-cdk-sdk-js/Publish/Resource/Default": [ { "type": "aws:cdk:logicalId", @@ -69,6 +75,12 @@ "data": "AWS679f53fac002430cb0da5b7982bd22872D164C4C" } ], + "/aws-cdk-sdk-js/ListTopics": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], "/aws-cdk-sdk-js/ListTopics/Resource/Default": [ { "type": "aws:cdk:logicalId", @@ -87,6 +99,12 @@ "data": "Utf8Parameter6C885A19" } ], + "/aws-cdk-sdk-js/GetParameter": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], "/aws-cdk-sdk-js/GetParameter/Resource/Default": [ { "type": "aws:cdk:logicalId", @@ -111,6 +129,12 @@ "data": "CustomRoleDefaultPolicyC5C189DF" } ], + "/aws-cdk-sdk-js/GetParameterNoPolicy": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], "/aws-cdk-sdk-js/GetParameterNoPolicy/Resource/Default": [ { "type": "aws:cdk:logicalId", @@ -156,6 +180,185 @@ }, "displayName": "aws-cdk-sdk-js" }, + "aws-cdk-sdk-js-v3.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "aws-cdk-sdk-js-v3.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "aws-cdk-sdk-js-v3": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "aws-cdk-sdk-js-v3.template.json", + "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}/3da2061ab19826d53e1313fbcfc6b6f457e955f6fb922c2e400c4c407756cc17.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "aws-cdk-sdk-js-v3.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": [ + "aws-cdk-sdk-js-v3.assets" + ], + "metadata": { + "/aws-cdk-sdk-js-v3/Topic/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "TopicBFC7AF6E" + } + ], + "/aws-cdk-sdk-js-v3/Publish": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], + "/aws-cdk-sdk-js-v3/Publish/Resource/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "Publish2E9BDF73" + } + ], + "/aws-cdk-sdk-js-v3/Publish/CustomResourcePolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "PublishCustomResourcePolicyDF696FCA" + } + ], + "/aws-cdk-sdk-js-v3/DefaultCrNodeVersionMap": [ + { + "type": "aws:cdk:logicalId", + "data": "DefaultCrNodeVersionMap" + } + ], + "/aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/ServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ], + "/aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "AWS679f53fac002430cb0da5b7982bd22872D164C4C" + } + ], + "/aws-cdk-sdk-js-v3/ListTopics": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], + "/aws-cdk-sdk-js-v3/ListTopics/Resource/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "ListTopicsCE1E0341" + } + ], + "/aws-cdk-sdk-js-v3/ListTopics/CustomResourcePolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "ListTopicsCustomResourcePolicy31A8396A" + } + ], + "/aws-cdk-sdk-js-v3/Utf8Parameter/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "Utf8Parameter6C885A19" + } + ], + "/aws-cdk-sdk-js-v3/GetParameter": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], + "/aws-cdk-sdk-js-v3/GetParameter/Resource/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "GetParameter42B0A00E" + } + ], + "/aws-cdk-sdk-js-v3/GetParameter/CustomResourcePolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "GetParameterCustomResourcePolicyD8E5D455" + } + ], + "/aws-cdk-sdk-js-v3/CustomRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "CustomRole6D8E6809" + } + ], + "/aws-cdk-sdk-js-v3/CustomRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "CustomRoleDefaultPolicyC5C189DF" + } + ], + "/aws-cdk-sdk-js-v3/GetParameterNoPolicy": [ + { + "type": "aws:cdk:warning", + "data": "installLatestAwsSdk was not specified, and defaults to true. You probably do not want this. Set the global context flag '@aws-cdk/customresources:installLatestAwsSdkDefault' to false to switch this behavior off project-wide, or set the property explicitly to true if you know you need to call APIs that are not in Lambda's built-in SDK version." + } + ], + "/aws-cdk-sdk-js-v3/GetParameterNoPolicy/Resource/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "GetParameterNoPolicyFCF7AA3B" + } + ], + "/aws-cdk-sdk-js-v3/MessageId": [ + { + "type": "aws:cdk:logicalId", + "data": "MessageId" + } + ], + "/aws-cdk-sdk-js-v3/TopicArn": [ + { + "type": "aws:cdk:logicalId", + "data": "TopicArn" + } + ], + "/aws-cdk-sdk-js-v3/ParameterValue": [ + { + "type": "aws:cdk:logicalId", + "data": "ParameterValue" + } + ], + "/aws-cdk-sdk-js-v3/ParameterValueNoPolicy": [ + { + "type": "aws:cdk:logicalId", + "data": "ParameterValueNoPolicy" + } + ], + "/aws-cdk-sdk-js-v3/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/aws-cdk-sdk-js-v3/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "aws-cdk-sdk-js-v3" + }, "AwsCustomResourceTestDefaultTestDeployAssert289A7DC5.assets": { "type": "cdk:asset-manifest", "properties": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/tree.json index b1860b4e8489f..2119d70713c31 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.js.snapshot/tree.json @@ -20,14 +20,14 @@ "aws:cdk:cloudformation:props": {} }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_sns.CfnTopic", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_sns.Topic", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Publish": { @@ -38,8 +38,8 @@ "id": "Provider", "path": "aws-cdk-sdk-js/Publish/Provider", "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.SingletonFunction", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Resource": { @@ -50,14 +50,14 @@ "id": "Default", "path": "aws-cdk-sdk-js/Publish/Resource/Default", "constructInfo": { - "fqn": "aws-cdk-lib.CfnResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.CustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "CustomResourcePolicy": { @@ -89,28 +89,28 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.custom_resources.AwsCustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "DefaultCrNodeVersionMap": { "id": "DefaultCrNodeVersionMap", "path": "aws-cdk-sdk-js/DefaultCrNodeVersionMap", "constructInfo": { - "fqn": "aws-cdk-lib.CfnMapping", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "AWS679f53fac002430cb0da5b7982bd2287": { @@ -125,8 +125,8 @@ "id": "ImportServiceRole", "path": "aws-cdk-sdk-js/AWS679f53fac002430cb0da5b7982bd2287/ServiceRole/ImportServiceRole", "constructInfo": { - "fqn": "aws-cdk-lib.Resource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Resource": { @@ -164,14 +164,14 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Code": { @@ -182,22 +182,22 @@ "id": "Stage", "path": "aws-cdk-sdk-js/AWS679f53fac002430cb0da5b7982bd2287/Code/Stage", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "AssetBucket": { "id": "AssetBucket", "path": "aws-cdk-sdk-js/AWS679f53fac002430cb0da5b7982bd2287/Code/AssetBucket", "constructInfo": { - "fqn": "aws-cdk-lib.aws_s3.BucketBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_s3_assets.Asset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Resource": { @@ -210,7 +210,7 @@ "s3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "s3Key": "a9d3d4d1afa000946b9863b3e7578a5a5ad86d88274b3639938aa2baebf822ce.zip" + "s3Key": "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc.zip" }, "role": { "Fn::GetAtt": [ @@ -232,14 +232,14 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.Function", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "ListTopics": { @@ -250,8 +250,8 @@ "id": "Provider", "path": "aws-cdk-sdk-js/ListTopics/Provider", "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.SingletonFunction", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Resource": { @@ -262,14 +262,14 @@ "id": "Default", "path": "aws-cdk-sdk-js/ListTopics/Resource/Default", "constructInfo": { - "fqn": "aws-cdk-lib.CfnResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.CustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "CustomResourcePolicy": { @@ -301,20 +301,20 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.custom_resources.AwsCustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Utf8Parameter": { @@ -332,14 +332,14 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ssm.CfnParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ssm.StringParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "GetParameter": { @@ -350,8 +350,8 @@ "id": "Provider", "path": "aws-cdk-sdk-js/GetParameter/Provider", "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.SingletonFunction", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Resource": { @@ -362,14 +362,14 @@ "id": "Default", "path": "aws-cdk-sdk-js/GetParameter/Resource/Default", "constructInfo": { - "fqn": "aws-cdk-lib.CfnResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.CustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "CustomResourcePolicy": { @@ -401,20 +401,20 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.custom_resources.AwsCustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "CustomRole": { @@ -425,8 +425,8 @@ "id": "ImportCustomRole", "path": "aws-cdk-sdk-js/CustomRole/ImportCustomRole", "constructInfo": { - "fqn": "aws-cdk-lib.Resource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Resource": { @@ -450,8 +450,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "DefaultPolicy": { @@ -483,20 +483,20 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "GetParameterNoPolicy": { @@ -507,8 +507,8 @@ "id": "Provider", "path": "aws-cdk-sdk-js/GetParameterNoPolicy/Provider", "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.SingletonFunction", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "Resource": { @@ -519,116 +519,693 @@ "id": "Default", "path": "aws-cdk-sdk-js/GetParameterNoPolicy/Resource/Default", "constructInfo": { - "fqn": "aws-cdk-lib.CfnResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.CustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.custom_resources.AwsCustomResource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "MessageId": { "id": "MessageId", "path": "aws-cdk-sdk-js/MessageId", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "TopicArn": { "id": "TopicArn", "path": "aws-cdk-sdk-js/TopicArn", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "ParameterValue": { "id": "ParameterValue", "path": "aws-cdk-sdk-js/ParameterValue", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "ParameterValueNoPolicy": { "id": "ParameterValueNoPolicy", "path": "aws-cdk-sdk-js/ParameterValueNoPolicy", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "aws-cdk-sdk-js/BootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, "CheckBootstrapVersion": { "id": "CheckBootstrapVersion", "path": "aws-cdk-sdk-js/CheckBootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.Stack", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, - "AwsCustomResourceTest": { - "id": "AwsCustomResourceTest", - "path": "AwsCustomResourceTest", + "aws-cdk-sdk-js-v3": { + "id": "aws-cdk-sdk-js-v3", + "path": "aws-cdk-sdk-js-v3", "children": { - "DefaultTest": { - "id": "DefaultTest", - "path": "AwsCustomResourceTest/DefaultTest", + "Topic": { + "id": "Topic", + "path": "aws-cdk-sdk-js-v3/Topic", "children": { - "Default": { - "id": "Default", - "path": "AwsCustomResourceTest/DefaultTest/Default", + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/Topic/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::SNS::Topic", + "aws:cdk:cloudformation:props": {} + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Publish": { + "id": "Publish", + "path": "aws-cdk-sdk-js-v3/Publish", + "children": { + "Provider": { + "id": "Provider", + "path": "aws-cdk-sdk-js-v3/Publish/Provider", "constructInfo": { "fqn": "constructs.Construct", "version": "10.1.270" } }, - "DeployAssert": { - "id": "DeployAssert", - "path": "AwsCustomResourceTest/DefaultTest/DeployAssert", + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/Publish/Resource", "children": { - "BootstrapVersion": { - "id": "BootstrapVersion", - "path": "AwsCustomResourceTest/DefaultTest/DeployAssert/BootstrapVersion", + "Default": { + "id": "Default", + "path": "aws-cdk-sdk-js-v3/Publish/Resource/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "CustomResourcePolicy": { + "id": "CustomResourcePolicy", + "path": "aws-cdk-sdk-js-v3/Publish/CustomResourcePolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/Publish/CustomResourcePolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": "sns:Publish", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "policyName": "PublishCustomResourcePolicyDF696FCA", + "roles": [ + { + "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ] + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "DefaultCrNodeVersionMap": { + "id": "DefaultCrNodeVersionMap", + "path": "aws-cdk-sdk-js-v3/DefaultCrNodeVersionMap", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "AWS679f53fac002430cb0da5b7982bd2287": { + "id": "AWS679f53fac002430cb0da5b7982bd2287", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287", + "children": { + "ServiceRole": { + "id": "ServiceRole", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/ServiceRole", + "children": { + "ImportServiceRole": { + "id": "ImportServiceRole", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/ServiceRole/ImportServiceRole", "constructInfo": { - "fqn": "aws-cdk-lib.CfnParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } }, - "CheckBootstrapVersion": { - "id": "CheckBootstrapVersion", - "path": "AwsCustomResourceTest/DefaultTest/DeployAssert/CheckBootstrapVersion", + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/ServiceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "managedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Code": { + "id": "Code", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/Code", + "children": { + "Stage": { + "id": "Stage", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/Code/Stage", "constructInfo": { - "fqn": "aws-cdk-lib.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/Code/AssetBucket", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/AWS679f53fac002430cb0da5b7982bd2287/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Function", + "aws:cdk:cloudformation:props": { + "code": { + "s3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "s3Key": "23d29b729b3751f91b095338f026c42c76c18bfc53c9a2e0d26df46b864f3bbc.zip" + }, + "role": { + "Fn::GetAtt": [ + "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2", + "Arn" + ] + }, + "handler": "index.handler", + "runtime": "nodejs18.x", + "timeout": 120 } }, "constructInfo": { - "fqn": "aws-cdk-lib.Stack", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "ListTopics": { + "id": "ListTopics", + "path": "aws-cdk-sdk-js-v3/ListTopics", + "children": { + "Provider": { + "id": "Provider", + "path": "aws-cdk-sdk-js-v3/ListTopics/Provider", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/ListTopics/Resource", + "children": { + "Default": { + "id": "Default", + "path": "aws-cdk-sdk-js-v3/ListTopics/Resource/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "CustomResourcePolicy": { + "id": "CustomResourcePolicy", + "path": "aws-cdk-sdk-js-v3/ListTopics/CustomResourcePolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/ListTopics/CustomResourcePolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": "sns:ListTopics", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "policyName": "ListTopicsCustomResourcePolicy31A8396A", + "roles": [ + { + "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ] + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Utf8Parameter": { + "id": "Utf8Parameter", + "path": "aws-cdk-sdk-js-v3/Utf8Parameter", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/Utf8Parameter/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::SSM::Parameter", + "aws:cdk:cloudformation:props": { + "type": "String", + "value": "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ!\"#¤%&/()=?`´^*+~_-.,:;<>|" + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "GetParameter": { + "id": "GetParameter", + "path": "aws-cdk-sdk-js-v3/GetParameter", + "children": { + "Provider": { + "id": "Provider", + "path": "aws-cdk-sdk-js-v3/GetParameter/Provider", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/GetParameter/Resource", + "children": { + "Default": { + "id": "Default", + "path": "aws-cdk-sdk-js-v3/GetParameter/Resource/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "CustomResourcePolicy": { + "id": "CustomResourcePolicy", + "path": "aws-cdk-sdk-js-v3/GetParameter/CustomResourcePolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/GetParameter/CustomResourcePolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": "ssm:GetParameter", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "policyName": "GetParameterCustomResourcePolicyD8E5D455", + "roles": [ + { + "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ] + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "CustomRole": { + "id": "CustomRole", + "path": "aws-cdk-sdk-js-v3/CustomRole", + "children": { + "ImportCustomRole": { + "id": "ImportCustomRole", + "path": "aws-cdk-sdk-js-v3/CustomRole/ImportCustomRole", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/CustomRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "aws-cdk-sdk-js-v3/CustomRole/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/CustomRole/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": "ssm:*", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "policyName": "CustomRoleDefaultPolicyC5C189DF", + "roles": [ + { + "Ref": "CustomRole6D8E6809" + } + ] + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "GetParameterNoPolicy": { + "id": "GetParameterNoPolicy", + "path": "aws-cdk-sdk-js-v3/GetParameterNoPolicy", + "children": { + "Provider": { + "id": "Provider", + "path": "aws-cdk-sdk-js-v3/GetParameterNoPolicy/Provider", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-sdk-js-v3/GetParameterNoPolicy/Resource", + "children": { + "Default": { + "id": "Default", + "path": "aws-cdk-sdk-js-v3/GetParameterNoPolicy/Resource/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "MessageId": { + "id": "MessageId", + "path": "aws-cdk-sdk-js-v3/MessageId", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "TopicArn": { + "id": "TopicArn", + "path": "aws-cdk-sdk-js-v3/TopicArn", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "ParameterValue": { + "id": "ParameterValue", + "path": "aws-cdk-sdk-js-v3/ParameterValue", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "ParameterValueNoPolicy": { + "id": "ParameterValueNoPolicy", + "path": "aws-cdk-sdk-js-v3/ParameterValueNoPolicy", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "aws-cdk-sdk-js-v3/BootstrapVersion", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "aws-cdk-sdk-js-v3/CheckBootstrapVersion", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "AwsCustomResourceTest": { + "id": "AwsCustomResourceTest", + "path": "AwsCustomResourceTest", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "AwsCustomResourceTest/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "AwsCustomResourceTest/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "AwsCustomResourceTest/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "AwsCustomResourceTest/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "AwsCustomResourceTest/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.270" } } }, @@ -653,8 +1230,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.App", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.1.270" } } } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.ts b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.ts index d5250fa5bf3e8..17198b33b54e8 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/custom-resources/test/aws-custom-resource/integ.aws-custom-resource.ts @@ -2,90 +2,110 @@ import * as iam from 'aws-cdk-lib/aws-iam'; import * as sns from 'aws-cdk-lib/aws-sns'; import * as ssm from 'aws-cdk-lib/aws-ssm'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as cdk from 'aws-cdk-lib'; import * as integ from '@aws-cdk/integ-tests-alpha'; import { AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId } from 'aws-cdk-lib/custom-resources'; +import { Construct } from 'constructs'; -const app = new cdk.App(); +interface AwsCdkSdkJsStackProps { + readonly runtime?: lambda.Runtime; +} -const stack = new cdk.Stack(app, 'aws-cdk-sdk-js'); +class AwsCdkSdkJsStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: AwsCdkSdkJsStackProps) { + super(scope, id); + const topic = new sns.Topic(this, 'Topic'); -const topic = new sns.Topic(stack, 'Topic'); + const snsPublish = new AwsCustomResource(this, 'Publish', { + resourceType: 'Custom::SNSPublisher', + onUpdate: { + service: 'SNS', + action: 'publish', + parameters: { + Message: 'hello', + TopicArn: topic.topicArn, + }, + physicalResourceId: PhysicalResourceId.of(topic.topicArn), + }, + policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: AwsCustomResourcePolicy.ANY_RESOURCE }), + }); -const snsPublish = new AwsCustomResource(stack, 'Publish', { - resourceType: 'Custom::SNSPublisher', - onUpdate: { - service: 'SNS', - action: 'publish', - parameters: { - Message: 'hello', - TopicArn: topic.topicArn, - }, - physicalResourceId: PhysicalResourceId.of(topic.topicArn), - }, - policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: AwsCustomResourcePolicy.ANY_RESOURCE }), -}); + const listTopics = new AwsCustomResource(this, 'ListTopics', { + onUpdate: { + service: 'SNS', + action: 'listTopics', + physicalResourceId: PhysicalResourceId.fromResponse('Topics.0.TopicArn'), + }, + policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: AwsCustomResourcePolicy.ANY_RESOURCE }), + }); + listTopics.node.addDependency(topic); -const listTopics = new AwsCustomResource(stack, 'ListTopics', { - onUpdate: { - service: 'SNS', - action: 'listTopics', - physicalResourceId: PhysicalResourceId.fromResponse('Topics.0.TopicArn'), - }, - policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: AwsCustomResourcePolicy.ANY_RESOURCE }), -}); -listTopics.node.addDependency(topic); + const ssmParameter = new ssm.StringParameter(this, 'Utf8Parameter', { + stringValue: 'ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ!"#¤%&/()=?`´^*+~_-.,:;<>|', + }); + const getParameter = new AwsCustomResource(this, 'GetParameter', { + resourceType: 'Custom::SSMParameter', + onUpdate: { + service: 'SSM', + action: 'getParameter', + parameters: { + Name: ssmParameter.parameterName, + WithDecryption: true, + }, + physicalResourceId: PhysicalResourceId.fromResponse('Parameter.ARN'), + }, + policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: AwsCustomResourcePolicy.ANY_RESOURCE }), + }); -const ssmParameter = new ssm.StringParameter(stack, 'Utf8Parameter', { - stringValue: 'ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ!"#¤%&/()=?`´^*+~_-.,:;<>|', -}); -const getParameter = new AwsCustomResource(stack, 'GetParameter', { - resourceType: 'Custom::SSMParameter', - onUpdate: { - service: 'SSM', - action: 'getParameter', - parameters: { - Name: ssmParameter.parameterName, - WithDecryption: true, - }, - physicalResourceId: PhysicalResourceId.fromResponse('Parameter.ARN'), - }, - policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: AwsCustomResourcePolicy.ANY_RESOURCE }), -}); + const customRole = new iam.Role(this, 'CustomRole', { + assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), + }); + customRole.addToPolicy( + new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + resources: ['*'], + actions: [ + 'ssm:*', + ], + }), + ); + const getParameterNoPolicy = new AwsCustomResource(this, 'GetParameterNoPolicy', { + resourceType: 'Custom::SSMParameter', + onUpdate: { + service: 'SSM', + action: 'getParameter', + parameters: { + Name: ssmParameter.parameterName, + WithDecryption: true, + }, + physicalResourceId: PhysicalResourceId.fromResponse('Parameter.ARN'), + }, + role: customRole, + }); -const customRole = new iam.Role(stack, 'CustomRole', { - assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), -}); -customRole.addToPolicy( - new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, - resources: ['*'], - actions: [ - 'ssm:*', - ], - }), -); -const getParameterNoPolicy = new AwsCustomResource(stack, 'GetParameterNoPolicy', { - resourceType: 'Custom::SSMParameter', - onUpdate: { - service: 'SSM', - action: 'getParameter', - parameters: { - Name: ssmParameter.parameterName, - WithDecryption: true, - }, - physicalResourceId: PhysicalResourceId.fromResponse('Parameter.ARN'), - }, - role: customRole, -}); + new cdk.CfnOutput(this, 'MessageId', { value: snsPublish.getResponseField('MessageId') }); + new cdk.CfnOutput(this, 'TopicArn', { value: listTopics.getResponseField('Topics.0.TopicArn') }); + new cdk.CfnOutput(this, 'ParameterValue', { value: getParameter.getResponseField('Parameter.Value') }); + new cdk.CfnOutput(this, 'ParameterValueNoPolicy', { value: getParameterNoPolicy.getResponseField('Parameter.Value') }); -new cdk.CfnOutput(stack, 'MessageId', { value: snsPublish.getResponseField('MessageId') }); -new cdk.CfnOutput(stack, 'TopicArn', { value: listTopics.getResponseField('Topics.0.TopicArn') }); -new cdk.CfnOutput(stack, 'ParameterValue', { value: getParameter.getResponseField('Parameter.Value') }); -new cdk.CfnOutput(stack, 'ParameterValueNoPolicy', { value: getParameterNoPolicy.getResponseField('Parameter.Value') }); + if (props?.runtime) { + const awsCustomResourceProviderId ='AWS679f53fac002430cb0da5b7982bd2287'; + const provider = this.node.findChild(awsCustomResourceProviderId).node.defaultChild as lambda.CfnFunction; + provider.runtime = props.runtime.name; + } + } +} + +const app = new cdk.App(); new integ.IntegTest(app, 'AwsCustomResourceTest', { - testCases: [stack], + testCases: [ + new AwsCdkSdkJsStack(app, 'aws-cdk-sdk-js'), + new AwsCdkSdkJsStack(app, 'aws-cdk-sdk-js-v3', { + runtime: lambda.Runtime.NODEJS_18_X, + }), + ], }); app.synth(); diff --git a/packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts b/packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts index c9e26a3e0715a..fe5e9259d5eb7 100644 --- a/packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts +++ b/packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts @@ -1,8 +1,7 @@ /* eslint-disable no-console */ -// @ts-ignore -import { S3Client } from '@aws-sdk/client-s3'; // eslint-disable-line import/no-extraneous-dependencies, import/no-unresolved +import { S3Client } from '@aws-sdk/client-s3'; -const s3 = new S3Client(); +const s3 = new S3Client({}); export async function handler() { console.log(s3); diff --git a/packages/aws-cdk-lib/custom-resources/README.md b/packages/aws-cdk-lib/custom-resources/README.md index 7e46a0fb02d2e..940e6303e0e83 100644 --- a/packages/aws-cdk-lib/custom-resources/README.md +++ b/packages/aws-cdk-lib/custom-resources/README.md @@ -624,6 +624,35 @@ const getParameter = new cr.AwsCustomResource(this, 'AssociateVPCWithHostedZone' }); ``` +#### Using AWS SDK for JavaScript v3 + +`AwsCustomResource` experimentally supports AWS SDK for JavaScript v3 (NODEJS_18_X or higher). In AWS SDK for JavaScript v3, packages are installed for each service. Therefore, specify the package name for `service`. Also, `action` specifies the XxxClient operations provided in the package. This example is the same as `SSM.getParameter` in v2. + +```ts +import * as regionInfo from 'aws-cdk-lib/region-info'; + +// change custom resource default runtime +regionInfo.Fact.register({ + region: 'us-east-1', // your region + name: regionInfo.FactName.DEFAULT_CR_NODE_VERSION, + value: lambda.Runtime.NODEJS_18_X.name, +}, true); +new AwsCustomResource(this, 'GetParameter', { + resourceType: 'Custom::SSMParameter', + onUpdate: { + service: '@aws-sdk/client-ssm', // 'SSM' in v2 + action: 'GetParameterCommand', // 'getParameter' in v2 + parameters: { + Name: 'foo', + WithDecryption: true, + }, + physicalResourceId: PhysicalResourceId.fromResponse('Parameter.ARN'), + }, +}); +``` + +If you are using `NODEJS_18_X` or higher, you can also use the existing AWS SDK for JavaScript v2 style. + --- This module is part of the [AWS Cloud Development Kit](https://github.com/aws/aws-cdk) project. diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v2-handler/index.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v2-handler/index.ts new file mode 100644 index 0000000000000..b608d161a12f7 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v2-handler/index.ts @@ -0,0 +1,172 @@ +/* eslint-disable no-console */ +import { execSync } from 'child_process'; +import * as fs from 'fs'; +import { join } from 'path'; +// import the AWSLambda package explicitly, +// which is globally available in the Lambda runtime, +// as otherwise linking this repository with link-all.sh +// fails in the CDK app executed with ts-node +/* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */ +import * as AWSLambda from 'aws-lambda'; +import { AwsSdkCall } from '../../aws-custom-resource'; +import { decodeCall, decodeSpecialValues, filterKeys, flatten, respond, startsWithOneOf } from '../shared'; + +let latestSdkInstalled = false; + +export function forceSdkInstallation() { + latestSdkInstalled = false; +} + +/** + * Installs latest AWS SDK v2 + */ +function installLatestSdk(): void { + console.log('Installing latest AWS SDK v2'); + // Both HOME and --prefix are needed here because /tmp is the only writable location + execSync('HOME=/tmp npm install aws-sdk@2 --production --no-package-lock --no-save --prefix /tmp'); + latestSdkInstalled = true; +} + +// no currently patched services +const patchedServices: { serviceName: string; apiVersions: string[] }[] = []; +/** + * Patches the AWS SDK by loading service models in the same manner as the actual SDK + */ +function patchSdk(awsSdk: any): any { + const apiLoader = awsSdk.apiLoader; + patchedServices.forEach(({ serviceName, apiVersions }) => { + const lowerServiceName = serviceName.toLowerCase(); + if (!awsSdk.Service.hasService(lowerServiceName)) { + apiLoader.services[lowerServiceName] = {}; + awsSdk[serviceName] = awsSdk.Service.defineService(lowerServiceName, apiVersions); + } else { + awsSdk.Service.addVersions(awsSdk[serviceName], apiVersions); + } + apiVersions.forEach(apiVersion => { + Object.defineProperty(apiLoader.services[lowerServiceName], apiVersion, { + get: function get() { + const modelFilePrefix = `aws-sdk-patch/${lowerServiceName}-${apiVersion}`; + const model = JSON.parse(fs.readFileSync(join(__dirname, `${modelFilePrefix}.service.json`), 'utf-8')); + model.paginators = JSON.parse(fs.readFileSync(join(__dirname, `${modelFilePrefix}.paginators.json`), 'utf-8')).pagination; + return model; + }, + enumerable: true, + configurable: true, + }); + }); + }); + return awsSdk; +} + +/* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */ +export async function handler(event: AWSLambda.CloudFormationCustomResourceEvent, context: AWSLambda.Context) { + try { + let AWS: any; + if (!latestSdkInstalled && event.ResourceProperties.InstallLatestAwsSdk === 'true') { + try { + installLatestSdk(); + AWS = require('/tmp/node_modules/aws-sdk'); + } catch (e) { + console.log(`Failed to install latest AWS SDK v2: ${e}`); + AWS = require('aws-sdk'); // Fallback to pre-installed version + } + } else if (latestSdkInstalled) { + AWS = require('/tmp/node_modules/aws-sdk'); + } else { + AWS = require('aws-sdk'); + } + try { + AWS = patchSdk(AWS); + } catch (e) { + console.log(`Failed to patch AWS SDK: ${e}. Proceeding with the installed copy.`); + } + + console.log(JSON.stringify({ ...event, ResponseURL: '...' })); + console.log('AWS SDK VERSION: ' + AWS.VERSION); + + event.ResourceProperties.Create = decodeCall(event.ResourceProperties.Create); + event.ResourceProperties.Update = decodeCall(event.ResourceProperties.Update); + event.ResourceProperties.Delete = decodeCall(event.ResourceProperties.Delete); + // Default physical resource id + let physicalResourceId: string; + switch (event.RequestType) { + case 'Create': + physicalResourceId = event.ResourceProperties.Create?.physicalResourceId?.id ?? + event.ResourceProperties.Update?.physicalResourceId?.id ?? + event.ResourceProperties.Delete?.physicalResourceId?.id ?? + event.LogicalResourceId; + break; + case 'Update': + case 'Delete': + physicalResourceId = event.ResourceProperties[event.RequestType]?.physicalResourceId?.id ?? event.PhysicalResourceId; + break; + } + + let flatData: { [key: string]: string } = {}; + let data: { [key: string]: string } = {}; + const call: AwsSdkCall | undefined = event.ResourceProperties[event.RequestType]; + + if (call) { + + let credentials; + if (call.assumedRoleArn) { + const timestamp = (new Date()).getTime(); + + const params = { + RoleArn: call.assumedRoleArn, + RoleSessionName: `${timestamp}-${physicalResourceId}`.substring(0, 64), + }; + + credentials = new AWS.ChainableTemporaryCredentials({ + params: params, + stsConfig: { stsRegionalEndpoints: 'regional' }, + }); + } + + if (!Object.prototype.hasOwnProperty.call(AWS, call.service)) { + throw Error(`Service ${call.service} does not exist in AWS SDK version ${AWS.VERSION}.`); + } + const awsService = new (AWS as any)[call.service]({ + apiVersion: call.apiVersion, + credentials: credentials, + region: call.region, + }); + + try { + const response = await awsService[call.action]( + call.parameters && decodeSpecialValues(call.parameters, physicalResourceId)).promise(); + flatData = { + apiVersion: awsService.config.apiVersion, // For test purposes: check if apiVersion was correctly passed. + region: awsService.config.region, // For test purposes: check if region was correctly passed. + ...flatten(response), + }; + + let outputPaths: string[] | undefined; + if (call.outputPath) { + outputPaths = [call.outputPath]; + } else if (call.outputPaths) { + outputPaths = call.outputPaths; + } + + if (outputPaths) { + data = filterKeys(flatData, startsWithOneOf(outputPaths)); + } else { + data = flatData; + } + } catch (e: any) { + if (!call.ignoreErrorCodesMatching || !new RegExp(call.ignoreErrorCodesMatching).test(e.code)) { + throw e; + } + } + + if (call.physicalResourceId?.responsePath) { + physicalResourceId = flatData[call.physicalResourceId.responsePath]; + } + } + + await respond(event, 'SUCCESS', 'OK', physicalResourceId, data); + } catch (e: any) { + console.log(e); + await respond(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {}); + } +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/index.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/index.ts new file mode 100644 index 0000000000000..8190853561083 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/index.ts @@ -0,0 +1,168 @@ +/* eslint-disable no-console */ +import { execSync } from 'child_process'; +// import the AWSLambda package explicitly, +// which is globally available in the Lambda runtime, +// as otherwise linking this repository with link-all.sh +// fails in the CDK app executed with ts-node +/* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */ +import * as AWSLambda from 'aws-lambda'; +import { getV3ClientPackageName } from './v2-to-v3/get-v3-client-package-name'; +import { AwsSdkCall } from '../../aws-custom-resource'; +import { decodeCall, decodeSpecialValues, filterKeys, flatten, respond, startsWithOneOf } from '../shared'; + +let installedSdk: { [service: string]: boolean } = {}; + +export function forceSdkInstallation() { + installedSdk = {}; +} + +/** + * Installs latest AWS SDK v3 + */ +function installLatestSdk(packageName: string): void { + console.log('Installing latest AWS SDK v3'); + // Both HOME and --prefix are needed here because /tmp is the only writable location + execSync( + `HOME=/tmp npm install ${packageName} --omit=dev --no-package-lock --no-save --prefix /tmp`, + ); + installedSdk = { + ...installedSdk, + [packageName]: true, + }; +} + +interface AwsSdk { + [key: string]: any +} +async function loadAwsSdk( + packageName: string, + installLatestAwsSdk?: 'true' | 'false', +) { + let awsSdk: AwsSdk; + try { + if (!installedSdk[packageName] && installLatestAwsSdk === 'true') { + installLatestSdk(packageName); + awsSdk = await import(`/tmp/node_modules/${packageName}`).catch(async (e) => { + console.log(`Failed to install latest AWS SDK v3: ${e}`); + return import(packageName); // Fallback to pre-installed version + }); + } else if (installedSdk[packageName]) { + awsSdk = await import(`/tmp/node_modules/${packageName}`); + } else { + awsSdk = await import(packageName); + } + } catch (error) { + throw Error(`Package ${packageName} does not exist.`); + } + return awsSdk; +} + +/* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */ +export async function handler(event: AWSLambda.CloudFormationCustomResourceEvent, context: AWSLambda.Context) { + try { + event.ResourceProperties.Create = decodeCall(event.ResourceProperties.Create); + event.ResourceProperties.Update = decodeCall(event.ResourceProperties.Update); + event.ResourceProperties.Delete = decodeCall(event.ResourceProperties.Delete); + let data: { [key: string]: string } = {}; + + // Default physical resource id + let physicalResourceId: string; + switch (event.RequestType) { + case 'Create': + physicalResourceId = event.ResourceProperties.Create?.physicalResourceId?.id ?? + event.ResourceProperties.Update?.physicalResourceId?.id ?? + event.ResourceProperties.Delete?.physicalResourceId?.id ?? + event.LogicalResourceId; + break; + case 'Update': + case 'Delete': + physicalResourceId = event.ResourceProperties[event.RequestType]?.physicalResourceId?.id ?? event.PhysicalResourceId; + break; + } + const call: AwsSdkCall | undefined = event.ResourceProperties[event.RequestType]; + if (call) { + // when provide v2 service name, transform it v3 package name. + const packageName = call.service.startsWith('@aws-sdk/') ? call.service : getV3ClientPackageName(call.service); + let awsSdk: AwsSdk | Promise = loadAwsSdk( + packageName, + event.ResourceProperties.InstallLatestAwsSdk, + ); + + console.log(JSON.stringify({ ...event, ResponseURL: '...' })); + + let credentials; + if (call.assumedRoleArn) { + const timestamp = (new Date()).getTime(); + + const params = { + RoleArn: call.assumedRoleArn, + RoleSessionName: `${timestamp}-${physicalResourceId}`.substring(0, 64), + }; + + const { fromTemporaryCredentials } = await import('@aws-sdk/credential-providers' as string); + credentials = fromTemporaryCredentials({ + params, + }); + } + + awsSdk = await awsSdk; + const ServiceClient = Object.entries(awsSdk).find( ([name]) => name.endsWith('Client') )?.[1] as { + new (config: any): { + send: (command: any) => Promise + config: any + } + }; + const client = new ServiceClient({ + apiVersion: call.apiVersion, + credentials: credentials, + region: call.region, + }); + const commandName = call.action.endsWith('Command') ? call.action : `${call.action}Command`; + const Command = Object.entries(awsSdk).find( + ([name]) => name.toLowerCase() === commandName.toLowerCase(), + )?.[1] as { new (input: any): any }; + + let flatData: { [key: string]: string } = {}; + try { + // Command must pass input value https://github.com/aws/aws-sdk-js-v3/issues/424 + const response = await client.send( + new Command( + (call.parameters && + decodeSpecialValues(call.parameters, physicalResourceId)) ?? {}, + ), + ); + flatData = { + apiVersion: client.config.apiVersion, // For test purposes: check if apiVersion was correctly passed. + region: await client.config.region().catch(() => undefined), // For test purposes: check if region was correctly passed. + ...flatten(response), + }; + + let outputPaths: string[] | undefined; + if (call.outputPath) { + outputPaths = [call.outputPath]; + } else if (call.outputPaths) { + outputPaths = call.outputPaths; + } + + if (outputPaths) { + data = filterKeys(flatData, startsWithOneOf(outputPaths)); + } else { + data = flatData; + } + } catch (e: any) { + if (!call.ignoreErrorCodesMatching || !new RegExp(call.ignoreErrorCodesMatching).test(e.code)) { + throw e; + } + } + + if (call.physicalResourceId?.responsePath) { + physicalResourceId = flatData[call.physicalResourceId.responsePath]; + } + } + + await respond(event, 'SUCCESS', 'OK', physicalResourceId, data); + } catch (e: any) { + console.log(e); + await respond(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {}); + } +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names-map.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names-map.ts new file mode 100644 index 0000000000000..8df87a44f9997 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names-map.ts @@ -0,0 +1,32 @@ +import { CLIENT_NAMES } from './client-names'; + +export const CLIENT_NAMES_MAP: Record = { + ...CLIENT_NAMES.reduce((acc, name) => ({ ...acc, [name]: name }), {}), + AugmentedAIRuntime: 'SageMakerA2IRuntime', + CUR: 'CostAndUsageReportService', + CodeArtifact: 'Codeartifact', + CodeStarNotifications: 'CodestarNotifications', + CodeStarconnections: 'CodeStarConnections', + CognitoIdentityServiceProvider: 'CognitoIdentityProvider', + DMS: 'DatabaseMigrationService', + Discovery: 'ApplicationDiscoveryService', + ELB: 'ElasticLoadBalancing', + ELBv2: 'ElasticLoadBalancingV2', + EMRcontainers: 'EMRContainers', + ES: 'ElasticsearchService', + Finspacedata: 'FinspaceData', + ForecastQueryService: 'Forecastquery', + ForecastService: 'Forecast', + IVS: 'Ivs', + IdentityStore: 'Identitystore', + Iot: 'IoT', + IotData: 'IoTDataPlane', + KinesisVideoSignalingChannels: 'KinesisVideoSignaling', + LexRuntime: 'LexRuntimeService', + MQ: 'Mq', + RDSDataService: 'RDSData', + SESV2: 'SESv2', + SavingsPlans: 'Savingsplans', + StepFunctions: 'SFN', + TranscribeService: 'Transcribe', +}; \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names.ts new file mode 100644 index 0000000000000..7bc4b260eb637 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-names.ts @@ -0,0 +1,336 @@ +export const CLIENT_NAMES = [ + 'ACM', + 'ACMPCA', + 'APIGateway', + 'ARCZonalShift', + 'AccessAnalyzer', + 'Account', + 'AlexaForBusiness', + 'Amp', + 'Amplify', + 'AmplifyBackend', + 'AmplifyUIBuilder', + 'ApiGatewayManagementApi', + 'ApiGatewayV2', + 'AppConfig', + 'AppConfigData', + 'AppIntegrations', + 'AppMesh', + 'AppRunner', + 'AppStream', + 'AppSync', + 'Appflow', + 'ApplicationAutoScaling', + 'ApplicationCostProfiler', + 'ApplicationInsights', + 'Athena', + 'AuditManager', + 'AugmentedAIRuntime', + 'AutoScaling', + 'AutoScalingPlans', + 'Backup', + 'BackupGateway', + 'BackupStorage', + 'Batch', + 'Billingconductor', + 'Braket', + 'Budgets', + 'CUR', + 'Chime', + 'ChimeSDKIdentity', + 'ChimeSDKMediaPipelines', + 'ChimeSDKMeetings', + 'ChimeSDKMessaging', + 'ChimeSDKVoice', + 'Cloud9', + 'CloudControl', + 'CloudDirectory', + 'CloudFormation', + 'CloudFront', + 'CloudHSM', + 'CloudHSMV2', + 'CloudSearch', + 'CloudSearchDomain', + 'CloudTrail', + 'CloudWatch', + 'CloudWatchEvents', + 'CloudWatchLogs', + 'CodeArtifact', + 'CodeBuild', + 'CodeCatalyst', + 'CodeCommit', + 'CodeDeploy', + 'CodeGuruProfiler', + 'CodeGuruReviewer', + 'CodePipeline', + 'CodeStar', + 'CodeStarNotifications', + 'CodeStarconnections', + 'CognitoIdentity', + 'CognitoIdentityServiceProvider', + 'CognitoSync', + 'Comprehend', + 'ComprehendMedical', + 'ComputeOptimizer', + 'ConfigService', + 'Connect', + 'ConnectCampaigns', + 'ConnectCases', + 'ConnectContactLens', + 'ConnectParticipant', + 'ControlTower', + 'CostExplorer', + 'CustomerProfiles', + 'DAX', + 'DLM', + 'DMS', + 'DataBrew', + 'DataExchange', + 'DataPipeline', + 'DataSync', + 'Detective', + 'DevOpsGuru', + 'DeviceFarm', + 'DirectConnect', + 'DirectoryService', + 'Discovery', + 'DocDB', + 'DocDBElastic', + 'Drs', + 'DynamoDB', + 'DynamoDBStreams', + 'EBS', + 'EC2', + 'EC2InstanceConnect', + 'ECR', + 'ECRPUBLIC', + 'ECS', + 'EFS', + 'EKS', + 'ELB', + 'ELBv2', + 'EMR', + 'EMRServerless', + 'EMRcontainers', + 'ES', + 'ElastiCache', + 'ElasticBeanstalk', + 'ElasticInference', + 'ElasticTranscoder', + 'EventBridge', + 'Evidently', + 'FMS', + 'FSx', + 'Finspace', + 'Finspacedata', + 'Firehose', + 'Fis', + 'ForecastQueryService', + 'ForecastService', + 'FraudDetector', + 'GameLift', + 'GameSparks', + 'Glacier', + 'GlobalAccelerator', + 'Glue', + 'Grafana', + 'Greengrass', + 'GreengrassV2', + 'GroundStation', + 'GuardDuty', + 'Health', + 'HealthLake', + 'Honeycode', + 'IAM', + 'IVS', + 'IdentityStore', + 'Imagebuilder', + 'Inspector', + 'Inspector2', + 'IoT1ClickDevicesService', + 'IoT1ClickProjects', + 'IoTAnalytics', + 'IoTEvents', + 'IoTEventsData', + 'IoTFleetHub', + 'IoTFleetWise', + 'IoTJobsDataPlane', + 'IoTRoboRunner', + 'IoTSecureTunneling', + 'IoTSiteWise', + 'IoTThingsGraph', + 'IoTTwinMaker', + 'IoTWireless', + 'Iot', + 'IotData', + 'IotDeviceAdvisor', + 'Ivschat', + 'KMS', + 'Kafka', + 'KafkaConnect', + 'Kendra', + 'Keyspaces', + 'Kinesis', + 'KinesisAnalytics', + 'KinesisAnalyticsV2', + 'KinesisVideo', + 'KinesisVideoArchivedMedia', + 'KinesisVideoMedia', + 'KinesisVideoSignalingChannels', + 'KinesisVideoWebRTCStorage', + 'LakeFormation', + 'Lambda', + 'LexModelBuildingService', + 'LexModelsV2', + 'LexRuntime', + 'LexRuntimeV2', + 'LicenseManager', + 'LicenseManagerLinuxSubscriptions', + 'LicenseManagerUserSubscriptions', + 'Lightsail', + 'Location', + 'LookoutEquipment', + 'LookoutMetrics', + 'LookoutVision', + 'M2', + 'MQ', + 'MTurk', + 'MWAA', + 'MachineLearning', + 'Macie', + 'Macie2', + 'ManagedBlockchain', + 'MarketplaceCatalog', + 'MarketplaceCommerceAnalytics', + 'MarketplaceEntitlementService', + 'MarketplaceMetering', + 'MediaConnect', + 'MediaConvert', + 'MediaLive', + 'MediaPackage', + 'MediaPackageVod', + 'MediaStore', + 'MediaStoreData', + 'MediaTailor', + 'MemoryDB', + 'Mgn', + 'MigrationHub', + 'MigrationHubConfig', + 'MigrationHubOrchestrator', + 'MigrationHubRefactorSpaces', + 'MigrationHubStrategy', + 'Mobile', + 'Neptune', + 'NetworkFirewall', + 'NetworkManager', + 'Nimble', + 'OAM', + 'Omics', + 'OpenSearch', + 'OpenSearchServerless', + 'OpsWorks', + 'OpsWorksCM', + 'Organizations', + 'Outposts', + 'PI', + 'Panorama', + 'Personalize', + 'PersonalizeEvents', + 'PersonalizeRuntime', + 'Pinpoint', + 'PinpointEmail', + 'PinpointSMSVoice', + 'PinpointSMSVoiceV2', + 'Pipes', + 'Polly', + 'Pricing', + 'PrivateNetworks', + 'Proton', + 'QLDB', + 'QLDBSession', + 'QuickSight', + 'RAM', + 'RDS', + 'RDSDataService', + 'RUM', + 'Rbin', + 'Redshift', + 'RedshiftData', + 'RedshiftServerless', + 'Rekognition', + 'Resiliencehub', + 'ResourceExplorer2', + 'ResourceGroups', + 'ResourceGroupsTaggingAPI', + 'RoboMaker', + 'RolesAnywhere', + 'Route53', + 'Route53Domains', + 'Route53RecoveryCluster', + 'Route53RecoveryControlConfig', + 'Route53RecoveryReadiness', + 'Route53Resolver', + 'S3', + 'S3Control', + 'S3Outposts', + 'SES', + 'SESV2', + 'SMS', + 'SNS', + 'SQS', + 'SSM', + 'SSMContacts', + 'SSMIncidents', + 'SSO', + 'SSOAdmin', + 'SSOOIDC', + 'STS', + 'SWF', + 'SageMaker', + 'SageMakerFeatureStoreRuntime', + 'SageMakerGeospatial', + 'SageMakerMetrics', + 'SageMakerRuntime', + 'SagemakerEdge', + 'SavingsPlans', + 'Scheduler', + 'Schemas', + 'SecretsManager', + 'SecurityHub', + 'SecurityLake', + 'ServerlessApplicationRepository', + 'ServiceCatalog', + 'ServiceCatalogAppRegistry', + 'ServiceDiscovery', + 'ServiceQuotas', + 'Shield', + 'Signer', + 'SimSpaceWeaver', + 'SnowDeviceManagement', + 'Snowball', + 'SsmSap', + 'StepFunctions', + 'StorageGateway', + 'Support', + 'SupportApp', + 'Synthetics', + 'Textract', + 'TimestreamQuery', + 'TimestreamWrite', + 'TranscribeService', + 'Transfer', + 'Translate', + 'VoiceID', + 'WAF', + 'WAFRegional', + 'WAFV2', + 'WellArchitected', + 'Wisdom', + 'WorkDocs', + 'WorkLink', + 'WorkMail', + 'WorkMailMessageFlow', + 'WorkSpaces', + 'WorkSpacesWeb', + 'XRay', +]; \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.ts new file mode 100644 index 0000000000000..79043c27ba157 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/client-package-names-map.ts @@ -0,0 +1,127 @@ +import { CLIENT_NAMES } from './client-names'; + +export const CLIENT_PACKAGE_NAMES_MAP: Record = { + ...CLIENT_NAMES.reduce( + (acc, name) => ({ + ...acc, + [name]: `client-${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}` + .replace('-chime-sdk', '-chime-sdk-') + .replace('client-amplify-', 'client-amplify') + .replace('client-cloud-', 'client-cloud') + .replace('client-code-', 'client-code') + .replace('client-connect-', 'client-connect') + .replace('client-data-', 'client-data') + .replace('client-io-t', 'client-iot-') + .replace('client-iot-fleet-', 'client-iotfleet') + .replace('client-lookout-', 'client-lookout') + .replace('client-media-', 'client-media') + .replace('client-migration-hub-', 'client-migrationhub') + .replace('client-pinpoint-sms', 'client-pinpoint-sms-') + .replace('client-route53', 'client-route53-') + .replace('client-sage-maker', 'client-sagemaker') + .replace('client-security-', 'client-security') + .replace('client-work-', 'client-work'), + }), + {}, + ), + AccessAnalyzer: 'client-accessanalyzer', + ACMPCA: 'client-acm-pca', + APIGateway: 'client-api-gateway', + ApiGatewayManagementApi: 'client-apigatewaymanagementapi', + ApiGatewayV2: 'client-apigatewayv2', + AppConfig: 'client-appconfig', + AppConfigData: 'client-appconfigdata', + AppIntegrations: 'client-appintegrations', + AppRunner: 'client-apprunner', + AppStream: 'client-appstream', + AppSync: 'client-appsync', + ApplicationCostProfiler: 'client-applicationcostprofiler', + ARCZonalShift: 'client-arc-zonal-shift', + AugmentedAIRuntime: 'client-sage-maker-a2iruntime', + AuditManager: 'client-auditmanager', + BackupStorage: 'client-backupstorage', + CUR: 'client-cost-and-usage-report-service', + CloudHSMV2: 'client-cloudhsm-v2', + CodeGuruProfiler: 'client-codeguruprofiler', + CodeStarconnections: 'client-codestar-connections', + CognitoIdentityServiceProvider: 'client-cognito-identity-provider', + ComprehendMedical: 'client-comprehendmedical', + ConnectContactLens: 'client-connect-contact-lens', + ControlTower: 'client-controltower', + DMS: 'client-database-migration-service', + DataPipeline: 'client-data-pipeline', + Discovery: 'client-application-discovery-service', + DevOpsGuru: 'client-devops-guru', + DynamoDB: 'client-dynamodb', + DynamoDBStreams: 'client-dynamodb-streams', + DocDB: 'client-docdb', + DocDBElastic: 'client-docdb-elastic', + EC2InstanceConnect: 'client-ec2-instance-connect', + ECRPUBLIC: 'client-ecr-public', + ELB: 'client-elastic-load-balancing', + ELBv2: 'client-elastic-load-balancing-v2', + ElastiCache: 'client-elasticache', + EMRcontainers: 'client-emr-containers', + EMRServerless: 'client-emr-serverless', + ES: 'client-elasticsearch-service', + EventBridge: 'client-eventbridge', + Finspacedata: 'client-finspace-data', + ForecastQueryService: 'client-forecastquery', + ForecastService: 'client-forecast', + FraudDetector: 'client-frauddetector', + GameLift: 'client-gamelift', + GameSparks: 'client-gamesparks', + GreengrassV2: 'client-greengrassv2', + GroundStation: 'client-groundstation', + GuardDuty: 'client-guardduty', + HealthLake: 'client-healthlake', + IdentityStore: 'client-identitystore', + IoTAnalytics: 'client-iotanalytics', + IotData: 'client-iot-data-plane', + IotDeviceAdvisor: 'client-iotdeviceadvisor', + IoTSecureTunneling: 'client-iotsecuretunneling', + IoTSiteWise: 'client-iotsitewise', + IoTThingsGraph: 'client-iotthingsgraph', + IoTTwinMaker: 'client-iottwinmaker', + IoTRoboRunner: 'client-iot-roborunner', + KafkaConnect: 'client-kafkaconnect', + KinesisVideoSignalingChannels: 'client-kinesis-video-signaling', + KinesisVideoWebRTCStorage: 'client-kinesis-video-webrtc-storage', + LakeFormation: 'client-lakeformation', + LexRuntime: 'client-lex-runtime-service', + ManagedBlockchain: 'client-managedblockchain', + MigrationHubConfig: 'client-migrationhub-config', + MigrationHubRefactorSpaces: 'client-migration-hub-refactor-spaces', + NetworkManager: 'client-networkmanager', + OpenSearch: 'client-opensearch', + OpenSearchServerless: 'client-opensearchserverless', + OpsWorks: 'client-opsworks', + OpsWorksCM: 'client-opsworkscm', + PrivateNetworks: 'client-privatenetworks', + QLDBSession: 'client-qldb-session', + QuickSight: 'client-quicksight', + ResourceExplorer2: 'client-resource-explorer-2', + RDSDataService: 'client-rds-data', + RoboMaker: 'client-robomaker', + RolesAnywhere: 'client-rolesanywhere', + Route53: 'client-route-53', + Route53Domains: 'client-route-53-domains', + Route53Resolver: 'client-route53resolver', + S3Control: 'client-s3-control', + SageMakerFeatureStoreRuntime: 'client-sagemaker-featurestore-runtime', + SavingsPlans: 'client-savingsplans', + SecurityHub: 'client-securityhub', + ServerlessApplicationRepository: 'client-serverlessapplicationrepository', + ServiceCatalogAppRegistry: 'client-service-catalog-appregistry', + ServiceDiscovery: 'client-servicediscovery', + SimSpaceWeaver: 'client-simspaceweaver', + SSMContacts: 'client-ssm-contacts', + SSMIncidents: 'client-ssm-incidents', + SSOAdmin: 'client-sso-admin', + SSOOIDC: 'client-sso-oidc', + StepFunctions: 'client-sfn', + TranscribeService: 'client-transcribe', + WAFRegional: 'client-waf-regional', + WellArchitected: 'client-wellarchitected', + WorkMailMessageFlow: 'client-workmailmessageflow', +}; \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.ts new file mode 100644 index 0000000000000..766a80f25f8ce --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/aws-sdk-v3-handler/v2-to-v3/get-v3-client-package-name.ts @@ -0,0 +1,8 @@ +// Refer to https://github.com/awslabs/aws-sdk-js-codemod +import { CLIENT_PACKAGE_NAMES_MAP } from './client-package-names-map'; + +// Returns v3 client package name for the provided v2 client name. +export const getV3ClientPackageName = (clientName: string) => { + if (clientName in CLIENT_PACKAGE_NAMES_MAP) {return `@aws-sdk/${CLIENT_PACKAGE_NAMES_MAP[clientName]}`;} + throw new Error(`Client '${clientName}' is either deprecated or newly added. Please consider using the v3 package format (@aws-sdk/client-xxx).`); +}; \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/index.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/index.ts index 9b36837f75747..9676ca5369a80 100644 --- a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/index.ts +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/index.ts @@ -1,279 +1,6 @@ -/* eslint-disable no-console */ -import { execSync } from 'child_process'; -import * as fs from 'fs'; -import { join } from 'path'; -// import the AWSLambda package explicitly, -// which is globally available in the Lambda runtime, -// as otherwise linking this repository with link-all.sh -// fails in the CDK app executed with ts-node -/* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */ -import * as AWSLambda from 'aws-lambda'; -import { AwsSdkCall } from '../aws-custom-resource'; +export { PHYSICAL_RESOURCE_ID_REFERENCE } from './shared'; -/** - * Serialized form of the physical resource id for use in the operation parameters - */ -export const PHYSICAL_RESOURCE_ID_REFERENCE = 'PHYSICAL:RESOURCEID:'; - -/** - * Flattens a nested object - * - * @param object the object to be flattened - * @returns a flat object with path as keys - */ -export function flatten(object: object): { [key: string]: any } { - return Object.assign( - {}, - ...function _flatten(child: any, path: string[] = []): any { - return [].concat(...Object.keys(child) - .map(key => { - const childKey = Buffer.isBuffer(child[key]) ? child[key].toString('utf8') : child[key]; - return typeof childKey === 'object' && childKey !== null - ? _flatten(childKey, path.concat([key])) - : ({ [path.concat([key]).join('.')]: childKey }); - })); - }(object), - ); -} - -/** - * Decodes encoded special values (physicalResourceId) - */ -function decodeSpecialValues(object: object, physicalResourceId: string) { - return JSON.parse(JSON.stringify(object), (_k, v) => { - switch (v) { - case PHYSICAL_RESOURCE_ID_REFERENCE: - return physicalResourceId; - default: - return v; - } - }); -} - -/** - * Filters the keys of an object. - */ -function filterKeys(object: object, pred: (key: string) => boolean) { - return Object.entries(object) - .reduce( - (acc, [k, v]) => pred(k) - ? { ...acc, [k]: v } - : acc, - {}, - ); -} - -let latestSdkInstalled = false; - -export function forceSdkInstallation() { - latestSdkInstalled = false; -} - -/** - * Installs latest AWS SDK v2 - */ -function installLatestSdk(): void { - console.log('Installing latest AWS SDK v2'); - // Both HOME and --prefix are needed here because /tmp is the only writable location - execSync('HOME=/tmp npm install aws-sdk@2 --production --no-package-lock --no-save --prefix /tmp'); - latestSdkInstalled = true; -} - -// no currently patched services -const patchedServices: { serviceName: string; apiVersions: string[] }[] = []; -/** - * Patches the AWS SDK by loading service models in the same manner as the actual SDK - */ -function patchSdk(awsSdk: any): any { - const apiLoader = awsSdk.apiLoader; - patchedServices.forEach(({ serviceName, apiVersions }) => { - const lowerServiceName = serviceName.toLowerCase(); - if (!awsSdk.Service.hasService(lowerServiceName)) { - apiLoader.services[lowerServiceName] = {}; - awsSdk[serviceName] = awsSdk.Service.defineService(lowerServiceName, apiVersions); - } else { - awsSdk.Service.addVersions(awsSdk[serviceName], apiVersions); - } - apiVersions.forEach(apiVersion => { - Object.defineProperty(apiLoader.services[lowerServiceName], apiVersion, { - get: function get() { - const modelFilePrefix = `aws-sdk-patch/${lowerServiceName}-${apiVersion}`; - const model = JSON.parse(fs.readFileSync(join(__dirname, `${modelFilePrefix}.service.json`), 'utf-8')); - model.paginators = JSON.parse(fs.readFileSync(join(__dirname, `${modelFilePrefix}.paginators.json`), 'utf-8')).pagination; - return model; - }, - enumerable: true, - configurable: true, - }); - }); - }); - return awsSdk; -} - -/* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */ -export async function handler(event: AWSLambda.CloudFormationCustomResourceEvent, context: AWSLambda.Context) { - try { - let AWS: any; - if (!latestSdkInstalled && event.ResourceProperties.InstallLatestAwsSdk === 'true') { - try { - installLatestSdk(); - AWS = require('/tmp/node_modules/aws-sdk'); - } catch (e) { - console.log(`Failed to install latest AWS SDK v2: ${e}`); - AWS = require('aws-sdk'); // Fallback to pre-installed version - } - } else if (latestSdkInstalled) { - AWS = require('/tmp/node_modules/aws-sdk'); - } else { - AWS = require('aws-sdk'); - } - try { - AWS = patchSdk(AWS); - } catch (e) { - console.log(`Failed to patch AWS SDK: ${e}. Proceeding with the installed copy.`); - } - - console.log(JSON.stringify({ ...event, ResponseURL: '...' })); - console.log('AWS SDK VERSION: ' + AWS.VERSION); - - event.ResourceProperties.Create = decodeCall(event.ResourceProperties.Create); - event.ResourceProperties.Update = decodeCall(event.ResourceProperties.Update); - event.ResourceProperties.Delete = decodeCall(event.ResourceProperties.Delete); - // Default physical resource id - let physicalResourceId: string; - switch (event.RequestType) { - case 'Create': - physicalResourceId = event.ResourceProperties.Create?.physicalResourceId?.id ?? - event.ResourceProperties.Update?.physicalResourceId?.id ?? - event.ResourceProperties.Delete?.physicalResourceId?.id ?? - event.LogicalResourceId; - break; - case 'Update': - case 'Delete': - physicalResourceId = event.ResourceProperties[event.RequestType]?.physicalResourceId?.id ?? event.PhysicalResourceId; - break; - } - - let flatData: { [key: string]: string } = {}; - let data: { [key: string]: string } = {}; - const call: AwsSdkCall | undefined = event.ResourceProperties[event.RequestType]; - - if (call) { - - let credentials; - if (call.assumedRoleArn) { - const timestamp = (new Date()).getTime(); - - const params = { - RoleArn: call.assumedRoleArn, - RoleSessionName: `${timestamp}-${physicalResourceId}`.substring(0, 64), - }; - - credentials = new AWS.ChainableTemporaryCredentials({ - params: params, - stsConfig: { stsRegionalEndpoints: 'regional' }, - }); - } - - if (!Object.prototype.hasOwnProperty.call(AWS, call.service)) { - throw Error(`Service ${call.service} does not exist in AWS SDK version ${AWS.VERSION}.`); - } - const awsService = new (AWS as any)[call.service]({ - apiVersion: call.apiVersion, - credentials: credentials, - region: call.region, - }); - - try { - const response = await awsService[call.action]( - call.parameters && decodeSpecialValues(call.parameters, physicalResourceId)).promise(); - flatData = { - apiVersion: awsService.config.apiVersion, // For test purposes: check if apiVersion was correctly passed. - region: awsService.config.region, // For test purposes: check if region was correctly passed. - ...flatten(response), - }; - - let outputPaths: string[] | undefined; - if (call.outputPath) { - outputPaths = [call.outputPath]; - } else if (call.outputPaths) { - outputPaths = call.outputPaths; - } - - if (outputPaths) { - data = filterKeys(flatData, startsWithOneOf(outputPaths)); - } else { - data = flatData; - } - } catch (e: any) { - if (!call.ignoreErrorCodesMatching || !new RegExp(call.ignoreErrorCodesMatching).test(e.code)) { - throw e; - } - } - - if (call.physicalResourceId?.responsePath) { - physicalResourceId = flatData[call.physicalResourceId.responsePath]; - } - } - - await respond('SUCCESS', 'OK', physicalResourceId, data); - } catch (e: any) { - console.log(e); - await respond('FAILED', e.message || 'Internal Error', context.logStreamName, {}); - } - - function respond(responseStatus: string, reason: string, physicalResourceId: string, data: any) { - const responseBody = JSON.stringify({ - Status: responseStatus, - Reason: reason, - PhysicalResourceId: physicalResourceId, - StackId: event.StackId, - RequestId: event.RequestId, - LogicalResourceId: event.LogicalResourceId, - NoEcho: false, - Data: data, - }); - - console.log('Responding', responseBody); - - // eslint-disable-next-line @typescript-eslint/no-require-imports - const parsedUrl = require('url').parse(event.ResponseURL); - const requestOptions = { - hostname: parsedUrl.hostname, - path: parsedUrl.path, - method: 'PUT', - headers: { - 'content-type': '', - 'content-length': Buffer.byteLength(responseBody, 'utf8'), - }, - }; - - return new Promise((resolve, reject) => { - try { - // eslint-disable-next-line @typescript-eslint/no-require-imports - const request = require('https').request(requestOptions, resolve); - request.on('error', reject); - request.write(responseBody); - request.end(); - } catch (e) { - reject(e); - } - }); - } -} - -function decodeCall(call: string | undefined) { - if (!call) { return undefined; } - return JSON.parse(call); -} - -function startsWithOneOf(searchStrings: string[]): (string: string) => boolean { - return function(string: string): boolean { - for (const searchString of searchStrings) { - if (string.startsWith(searchString)) { - return true; - } - } - return false; - }; -} +const env = process.env.AWS_EXECUTION_ENV; +// eslint-disable-next-line @typescript-eslint/no-require-imports +const runtime = env && env >= 'AWS_Lambda_nodejs18.x' ? require('./aws-sdk-v3-handler') : require('./aws-sdk-v2-handler'); +export const handler = runtime.handler; \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/shared.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/shared.ts new file mode 100644 index 0000000000000..c7989e10f1530 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/runtime/shared.ts @@ -0,0 +1,112 @@ +/* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */ +import * as AWSLambda from 'aws-lambda'; +/** + * Serialized form of the physical resource id for use in the operation parameters + */ +export const PHYSICAL_RESOURCE_ID_REFERENCE = 'PHYSICAL:RESOURCEID:'; + +/** + * Flattens a nested object + * + * @param object the object to be flattened + * @returns a flat object with path as keys + */ +export function flatten(object: object): { [key: string]: any } { + return Object.assign( + {}, + ...function _flatten(child: any, path: string[] = []): any { + return [].concat(...Object.keys(child) + .map(key => { + const childKey = Buffer.isBuffer(child[key]) ? child[key].toString('utf8') : child[key]; + return typeof childKey === 'object' && childKey !== null + ? _flatten(childKey, path.concat([key])) + : ({ [path.concat([key]).join('.')]: childKey }); + })); + }(object), + ); +} + +/** + * Decodes encoded special values (physicalResourceId) + */ +export function decodeSpecialValues(object: object, physicalResourceId: string) { + return JSON.parse(JSON.stringify(object), (_k, v) => { + switch (v) { + case PHYSICAL_RESOURCE_ID_REFERENCE: + return physicalResourceId; + default: + return v; + } + }); +} + +/** + * Filters the keys of an object. + */ +export function filterKeys(object: object, pred: (key: string) => boolean) { + return Object.entries(object) + .reduce( + (acc, [k, v]) => pred(k) + ? { ...acc, [k]: v } + : acc, + {}, + ); +} + +type Event = AWSLambda.CloudFormationCustomResourceEvent + +export function respond(event: Event, responseStatus: string, reason: string, physicalResourceId: string, data: any) { + const responseBody = JSON.stringify({ + Status: responseStatus, + Reason: reason, + PhysicalResourceId: physicalResourceId, + StackId: event.StackId, + RequestId: event.RequestId, + LogicalResourceId: event.LogicalResourceId, + NoEcho: false, + Data: data, + }); + + // eslint-disable-next-line no-console + console.log('Responding', responseBody); + + // eslint-disable-next-line @typescript-eslint/no-require-imports + const parsedUrl = require('url').parse(event.ResponseURL); + const requestOptions = { + hostname: parsedUrl.hostname, + path: parsedUrl.path, + method: 'PUT', + headers: { + 'content-type': '', + 'content-length': Buffer.byteLength(responseBody, 'utf8'), + }, + }; + + return new Promise((resolve, reject) => { + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const request = require('https').request(requestOptions, resolve); + request.on('error', reject); + request.write(responseBody); + request.end(); + } catch (e) { + reject(e); + } + }); +} + +export function decodeCall(call: string | undefined) { + if (!call) { return undefined; } + return JSON.parse(call); +} + +export function startsWithOneOf(searchStrings: string[]): (string: string) => boolean { + return function(string: string): boolean { + for (const searchString of searchStrings) { + if (string.startsWith(searchString)) { + return true; + } + } + return false; + }; +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/aws-custom-resource-provider.test.ts b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/aws-custom-resource-provider-sdk-v2.test.ts similarity index 93% rename from packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/aws-custom-resource-provider.test.ts rename to packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/aws-custom-resource-provider-sdk-v2.test.ts index 2fdd122128ef3..232e63d1de337 100644 --- a/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/aws-custom-resource-provider.test.ts +++ b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/aws-custom-resource-provider-sdk-v2.test.ts @@ -4,7 +4,7 @@ import * as fs from 'fs-extra'; import * as nock from 'nock'; import * as sinon from 'sinon'; import { AwsSdkCall, PhysicalResourceId } from '../../lib'; -import { flatten, handler, forceSdkInstallation } from '../../lib/aws-custom-resource/runtime'; +import { handler, forceSdkInstallation } from '../../lib/aws-custom-resource/runtime/aws-sdk-v2-handler'; // This test performs an 'npm install' which may take longer than the default // 5s timeout @@ -383,41 +383,6 @@ test('can specify apiVersion and region', async () => { expect(request.isDone()).toBeTruthy(); }); -test('flatten correctly flattens a nested object', () => { - expect(flatten({ - a: { b: 'c' }, - d: [ - { e: 'f' }, - { g: 'h', i: 1, j: null, k: { l: false } }, - ], - })).toEqual({ - 'a.b': 'c', - 'd.0.e': 'f', - 'd.1.g': 'h', - 'd.1.i': 1, - 'd.1.j': null, - 'd.1.k.l': false, - }); -}); - -test('flatten correctly flattens an object with buffers', () => { - expect(flatten({ - body: Buffer.from('body'), - nested: { - buffer: Buffer.from('buffer'), - array: [ - Buffer.from('array.0'), - Buffer.from('array.1'), - ], - }, - })).toEqual({ - 'body': 'body', - 'nested.buffer': 'buffer', - 'nested.array.0': 'array.0', - 'nested.array.1': 'array.1', - }); -}); - test('installs the latest SDK', async () => { const tmpPath = '/tmp/node_modules/aws-sdk'; @@ -497,5 +462,4 @@ test('invalid service name throws explicit error', async () => { await handler(event, {} as AWSLambda.Context); expect(request.isDone()).toBeTruthy(); -}); - +}); \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v2-handler.test.ts b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v2-handler.test.ts new file mode 100644 index 0000000000000..a00afd7599f42 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v2-handler.test.ts @@ -0,0 +1,158 @@ +import * as AWS from 'aws-sdk'; +import { PhysicalResourceId } from '../../../lib'; +import { handler } from '../../../lib/aws-custom-resource/runtime/aws-sdk-v2-handler'; + +/* eslint-disable no-console */ +console.log = jest.fn(); + +jest.mock('aws-sdk', () => { + return { + ...jest.requireActual('aws-sdk'), + SSM: jest.fn(() => { + return { + config: { + apiVersion: 'apiVersion', + region: 'eu-west-1', + }, + getParameter: () => { + return { + promise: async () => {}, + }; + }, + }; + }), + }; +}); + +jest.mock('https', () => { + return { + request: (_: any, callback: () => void) => { + return { + on: () => undefined, + write: () => true, + end: callback, + }; + }, + }; +}); + +afterEach(() => { + jest.clearAllMocks(); +}); + +test('SDK global credentials are never set', async () => { + // WHEN + await handler({ + LogicalResourceId: 'logicalResourceId', + RequestId: 'requestId', + RequestType: 'Create', + ResponseURL: 'responseUrl', + ResourceProperties: { + Create: JSON.stringify({ + action: 'getParameter', + assumedRoleArn: 'arn:aws:iam::123456789012:role/CoolRole', + parameters: { + Name: 'foo', + }, + physicalResourceId: PhysicalResourceId.of('id'), + service: 'SSM', + }), + ServiceToken: 'serviceToken', + }, + ResourceType: 'resourceType', + ServiceToken: 'serviceToken', + StackId: 'stackId', + }, {} as AWSLambda.Context); + + // THEN + expect(AWS.config).toBeInstanceOf(AWS.Config); + expect(AWS.config.credentials).toBeNull(); +}); + +test('SDK credentials are not persisted across subsequent invocations', async () => { + // GIVEN + const mockCreds = new AWS.ChainableTemporaryCredentials(); + jest.spyOn(AWS, 'ChainableTemporaryCredentials').mockReturnValue(mockCreds); + + // WHEN + await handler({ + LogicalResourceId: 'logicalResourceId', + RequestId: 'requestId', + RequestType: 'Create', + ResponseURL: 'responseUrl', + ResourceProperties: { + Create: JSON.stringify({ + action: 'getParameter', + parameters: { + Name: 'foo', + }, + physicalResourceId: PhysicalResourceId.of('id'), + service: 'SSM', + }), + ServiceToken: 'serviceToken', + }, + ResourceType: 'resourceType', + ServiceToken: 'serviceToken', + StackId: 'stackId', + }, {} as AWSLambda.Context); + + await handler({ + LogicalResourceId: 'logicalResourceId', + RequestId: 'requestId', + RequestType: 'Create', + ResponseURL: 'responseUrl', + ResourceProperties: { + Create: JSON.stringify({ + action: 'getParameter', + assumedRoleArn: 'arn:aws:iam::123456789012:role/CoolRole', + parameters: { + Name: 'foo', + }, + physicalResourceId: PhysicalResourceId.of('id'), + service: 'SSM', + }), + ServiceToken: 'serviceToken', + }, + ResourceType: 'resourceType', + ServiceToken: 'serviceToken', + StackId: 'stackId', + }, {} as AWSLambda.Context); + + await handler({ + LogicalResourceId: 'logicalResourceId', + RequestId: 'requestId', + RequestType: 'Create', + ResponseURL: 'responseUrl', + ResourceProperties: { + Create: JSON.stringify({ + action: 'getParameter', + parameters: { + Name: 'foo', + }, + physicalResourceId: PhysicalResourceId.of('id'), + service: 'SSM', + }), + ServiceToken: 'serviceToken', + }, + ResourceType: 'resourceType', + ServiceToken: 'serviceToken', + StackId: 'stackId', + }, {} as AWSLambda.Context); + + // THEN + expect(AWS.SSM).toHaveBeenNthCalledWith(1, { + apiVersion: undefined, + credentials: undefined, + region: undefined, + }); + expect(AWS.SSM).toHaveBeenNthCalledWith(2, { + apiVersion: undefined, + credentials: mockCreds, + region: undefined, + }); + expect(AWS.SSM).toHaveBeenNthCalledWith(3, { + apiVersion: undefined, + credentials: undefined, + region: undefined, + }); +}); \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v3-handler.test.ts b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v3-handler.test.ts new file mode 100644 index 0000000000000..9e99b261c9104 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/aws-sdk-v3-handler.test.ts @@ -0,0 +1,630 @@ +process.env.AWS_REGION = 'us-east-1'; + +import * as S3 from '@aws-sdk/client-s3'; +import { mockClient } from 'aws-sdk-client-mock'; +import * as fs from 'fs-extra'; +import * as nock from 'nock'; +import { AwsSdkCall, PhysicalResourceId } from '../../../lib'; +import { handler, forceSdkInstallation } from '../../../lib/aws-custom-resource/runtime/aws-sdk-v3-handler'; + +// This test performs an 'npm install' which may take longer than the default +// 5s timeout +jest.setTimeout(60_000); + +/* eslint-disable no-console */ +console.log = jest.fn(); + +const eventCommon = { + ServiceToken: 'token', + ResponseURL: 'https://localhost', + StackId: 'stackId', + RequestId: 'requestId', + LogicalResourceId: 'logicalResourceId', + ResourceType: 'Custom::AWS', +}; + +function createRequest(bodyPredicate: (body: AWSLambda.CloudFormationCustomResourceResponse) => boolean) { + return nock('https://localhost') + .put('/', bodyPredicate) + .reply(200); +} + +const s3MockClient = mockClient(S3.S3Client); + +beforeEach(() => { + s3MockClient.reset(); +}); + +afterEach(() => { + s3MockClient.reset(); + nock.cleanAll(); +}); + +/* eslint-disable no-console */ +console.log = jest.fn(); + +jest.mock('@aws-sdk/credential-providers', () => { + return { + fromTemporaryCredentials: jest.fn(() => ({})), + }; +}); + +jest.mock('https', () => { + return { + ...jest.requireActual('https'), + request: (_: any, callback: () => void) => { + return { + on: () => undefined, + write: () => true, + end: callback, + }; + }, + }; +}); + +afterEach(() => { + jest.clearAllMocks(); +}); + +test('create event with physical resource id path', async () => { + s3MockClient.on(S3.ListObjectsCommand).resolves({ + Contents: [ + { + Key: 'first-key', + ETag: 'first-key-etag', + }, + { + Key: 'second-key', + ETag: 'second-key-etag', + }, + ], + } as S3.ListObjectsCommandOutput); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'ListObjectsCommand', + parameters: { + Bucket: 'my-bucket', + }, + physicalResourceId: PhysicalResourceId.fromResponse('Contents.1.ETag'), + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'second-key-etag' && + body.Data!['Contents.0.Key'] === 'first-key', + ); + + await handler(event, {} as AWSLambda.Context); + const commandCalls = s3MockClient.commandCalls(S3.ListObjectsCommand); + expect(commandCalls[0].args[0].input).toEqual({ + Bucket: 'my-bucket', + }); + + expect(request.isDone()).toBeTruthy(); +}); + +test('update event with physical resource id', async () => { + s3MockClient.on(S3.GetObjectCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceUpdateEvent = { + ...eventCommon, + RequestType: 'Update', + PhysicalResourceId: 'physicalResourceId', + OldResourceProperties: {}, + ResourceProperties: { + ServiceToken: 'token', + Update: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'GetObjectCommand', + parameters: { + Bucket: 'hello', + Key: 'key', + }, + physicalResourceId: PhysicalResourceId.of('key'), + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'key', + ); + + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); +}); + +test('delete event', async () => { + s3MockClient.on(S3.ListObjectsCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceDeleteEvent = { + ...eventCommon, + RequestType: 'Delete', + PhysicalResourceId: 'physicalResourceId', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'ListObjectsCommand', + parameters: { + Bucket: 'my-bucket', + }, + physicalResourceId: PhysicalResourceId.fromResponse('Contents.1.ETag'), + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'physicalResourceId' && + Object.keys(body.Data!).length === 0, + ); + + await handler(event, {} as AWSLambda.Context); + + const commandCalls = s3MockClient.commandCalls(S3.ListObjectsCommand); + expect(commandCalls.length).toBe(0); + + expect(request.isDone()).toBeTruthy(); +}); + +test('delete event with Delete call and no physical resource id in call', async () => { + s3MockClient.on(S3.DeleteObjectCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceDeleteEvent = { + ...eventCommon, + RequestType: 'Delete', + PhysicalResourceId: 'physicalResourceId', + ResourceProperties: { + ServiceToken: 'token', + Delete: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'DeleteObjectCommand', + parameters: { + Bucket: 'my-bucket', + Key: 'my-object', + }, + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'physicalResourceId', + ); + + await handler(event, {} as AWSLambda.Context); + + const commandCalls = s3MockClient.commandCalls(S3.DeleteObjectCommand); + expect(commandCalls[0].args[0].input).toMatchObject({ + Bucket: 'my-bucket', + Key: 'my-object', + }); + + expect(request.isDone()).toBeTruthy(); +}); + +test('create event with Delete call only', async () => { + s3MockClient.on(S3.DeleteObjectCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Delete: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'DeleteObjectCommand', + parameters: { + Bucket: 'my-bucket', + Key: 'my-object', + }, + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'logicalResourceId', + ); + + await handler(event, {} as AWSLambda.Context); + + const commandCalls = s3MockClient.commandCalls(S3.DeleteObjectCommand); + expect(commandCalls.length).toBe(0); + + expect(request.isDone()).toBeTruthy(); +}); + +test('catch errors', async () => { + const error: NodeJS.ErrnoException = new Error(); + error.code = 'NoSuchBucket'; + s3MockClient.on(S3.ListObjectsCommand).rejects(error); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'ListObjectsCommand', + parameters: { + Bucket: 'my-bucket', + }, + physicalResourceId: PhysicalResourceId.of('physicalResourceId'), + ignoreErrorCodesMatching: 'NoSuchBucket', + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'physicalResourceId' && + Object.keys(body.Data!).length === 0, + ); + + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); +}); + +test('restrict output path', async () => { + s3MockClient.on(S3.ListObjectsCommand).resolves({ + Contents: [ + { + Key: 'first-key', + ETag: 'first-key-etag', + }, + { + Key: 'second-key', + ETag: 'second-key-etag', + }, + ], + } as S3.ListObjectsCommandOutput); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'ListObjectsCommand', + parameters: { + Bucket: 'my-bucket', + }, + physicalResourceId: PhysicalResourceId.of('id'), + outputPath: 'Contents.0', + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'id' && + body.Data!['Contents.0.Key'] === 'first-key' && + body.Data!['Contents.1.Key'] === undefined, + ); + + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); +}); + +test('restrict output paths', async () => { + s3MockClient.on(S3.ListObjectsCommand).resolves({ + Contents: [ + { + Key: 'first-key', + ETag: 'first-key-etag', + }, + { + Key: 'second-key', + ETag: 'second-key-etag', + }, + ], + } as S3.ListObjectsCommandOutput); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'ListObjectsCommand', + parameters: { + Bucket: 'my-bucket', + }, + physicalResourceId: PhysicalResourceId.of('id'), + outputPaths: ['Contents.0.Key', 'Contents.1.Key'], + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.PhysicalResourceId === 'id' && + JSON.stringify(body.Data) === JSON.stringify({ + 'Contents.0.Key': 'first-key', + 'Contents.1.Key': 'second-key', + }), + ); + + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); +}); + +test('can specify apiVersion and region', async () => { + s3MockClient.on(S3.GetObjectCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'GetObjectCommand', + parameters: { + Bucket: 'my-bucket', + Key: 'key', + }, + apiVersion: '2010-03-31', + region: 'eu-west-1', + physicalResourceId: PhysicalResourceId.of('id'), + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS' && + body.Data!.apiVersion === '2010-03-31' && + body.Data!.region === 'eu-west-1', + ); + + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); +}); + +test('installs the latest SDK', async () => { + const tmpPath = '/tmp/node_modules/@aws-sdk/client-s3'; + + // Symlink to normal SDK to be able to call mockClient() + await fs.ensureDir('/tmp/node_modules/@aws-sdk'); + await fs.symlink(require.resolve('@aws-sdk/client-s3'), tmpPath); + + const localAwsSdk: typeof S3 = await import(tmpPath); + const localS3MockClient = mockClient(localAwsSdk.S3Client); + + // Now remove the symlink and let the handler install it + await fs.unlink(tmpPath); + + localS3MockClient.on(localAwsSdk.GetObjectCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'GetObjectCommand', + parameters: { + Bucket: 'my-bucket', + Key: 'key', + }, + physicalResourceId: PhysicalResourceId.of('id'), + } as AwsSdkCall), + InstallLatestAwsSdk: 'true', + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS', + ); + + // Reset to 'false' so that the next run will reinstall aws-sdk + forceSdkInstallation(); + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); + + expect(() => require.resolve(tmpPath)).not.toThrow(); + + // clean up aws-sdk install + await fs.remove(tmpPath); +}); + +test('SDK credentials are not persisted across subsequent invocations', async () => { + // GIVEN + s3MockClient.on(S3.GetObjectCommand).resolves({}); + const credentialProviders = await import('@aws-sdk/credential-providers' as string); + const mockCreds = credentialProviders.fromTemporaryCredentials({ + params: { RoleArn: 'arn:aws:iam::123456789012:role/CoolRole' }, + }); + const credentialProviderMock = jest.spyOn(credentialProviders, 'fromTemporaryCredentials').mockReturnValue(mockCreds); + credentialProviderMock.mockClear(); + + // WHEN + await handler({ + LogicalResourceId: 'logicalResourceId', + RequestId: 'requestId', + RequestType: 'Create', + ResponseURL: 'responseUrl', + ResourceProperties: { + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'GetObjectCommand', + parameters: { + Bucket: 'foo', + Key: 'bar', + }, + physicalResourceId: PhysicalResourceId.of('id'), + }), + ServiceToken: 'serviceToken', + }, + ResourceType: 'resourceType', + ServiceToken: 'serviceToken', + StackId: 'stackId', + }, {} as AWSLambda.Context); + expect(credentialProviderMock).not.toBeCalled(); + credentialProviderMock.mockClear(); + + await handler({ + LogicalResourceId: 'logicalResourceId', + RequestId: 'requestId', + RequestType: 'Create', + ResponseURL: 'responseUrl', + ResourceProperties: { + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'GetObjectCommand', + assumedRoleArn: 'arn:aws:iam::123456789012:role/CoolRole', + parameters: { + Bucket: 'foo', + Key: 'bar', + }, + physicalResourceId: PhysicalResourceId.of('id'), + }), + ServiceToken: 'serviceToken', + }, + ResourceType: 'resourceType', + ServiceToken: 'serviceToken', + StackId: 'stackId', + }, {} as AWSLambda.Context); + expect(credentialProviderMock).toBeCalled(); + credentialProviderMock.mockClear(); + + await handler({ + LogicalResourceId: 'logicalResourceId', + RequestId: 'requestId', + RequestType: 'Create', + ResponseURL: 'responseUrl', + ResourceProperties: { + Create: JSON.stringify({ + service: '@aws-sdk/client-s3', + action: 'GetObjectCommand', + parameters: { + Bucket: 'foo', + Key: 'bar', + }, + physicalResourceId: PhysicalResourceId.of('id'), + }), + ServiceToken: 'serviceToken', + }, + ResourceType: 'resourceType', + ServiceToken: 'serviceToken', + StackId: 'stackId', + }, {} as AWSLambda.Context); + expect(credentialProviderMock).not.toBeCalled(); + + // THEN + expect(await s3MockClient.call(0).thisValue.config.credentials()).not.toBe(mockCreds); + expect(await s3MockClient.call(1).thisValue.config.credentials()).toBe(mockCreds); + expect(await s3MockClient.call(2).thisValue.config.credentials()).not.toBe(mockCreds); +}); + +test('Being able to call the AWS SDK v2 format', async () => { + s3MockClient.on(S3.GetObjectCommand).resolves({}); + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: 'S3', + action: 'getObject', + parameters: { + Bucket: 'foo', + Key: 'bar', + }, + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'SUCCESS', + ); + + await handler(event, {} as AWSLambda.Context); + const commandCalls = s3MockClient.commandCalls(S3.GetObjectCommand); + expect(commandCalls[0].args[0].input).toEqual({ + Bucket: 'foo', + Key: 'bar', + }); + + expect(request.isDone()).toBeTruthy(); +}); + +test('invalid v3 package name throws explicit error', async () => { + s3MockClient.on(S3.GetObjectCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: '@aws-sdk/client-thisisnotarealservice', + action: 'GetObjectCommand', + parameters: { + Bucket: 'my-bucket', + Key: 'key', + }, + physicalResourceId: PhysicalResourceId.of('id'), + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'FAILED' && + body.Reason!.startsWith('Package @aws-sdk/client-thisisnotarealservice does not exist.'), + ); + + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); +}); + +test('invalid v2 service name throws explicit error', async () => { + s3MockClient.on(S3.GetObjectCommand).resolves({}); + + const event: AWSLambda.CloudFormationCustomResourceCreateEvent = { + ...eventCommon, + RequestType: 'Create', + ResourceProperties: { + ServiceToken: 'token', + Create: JSON.stringify({ + service: 'thisisnotarealservice', + action: 'getObject', + parameters: { + Bucket: 'my-bucket', + Key: 'key', + }, + physicalResourceId: PhysicalResourceId.of('id'), + } as AwsSdkCall), + }, + }; + + const request = createRequest(body => + body.Status === 'FAILED' && + body.Reason!.startsWith('Client \'thisisnotarealservice\' is either deprecated or newly added. Please consider using the v3 package format (@aws-sdk/client-xxx).'), + ); + + await handler(event, {} as AWSLambda.Context); + + expect(request.isDone()).toBeTruthy(); +}); \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/index.test.ts b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/index.test.ts index f16812a7d0c30..a6e16d1eef1e9 100644 --- a/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/index.test.ts +++ b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/index.test.ts @@ -1,158 +1,24 @@ -import * as AWS from 'aws-sdk'; -import { PhysicalResourceId } from '../../../lib'; -import { handler } from '../../../lib/aws-custom-resource/runtime/index'; - -/* eslint-disable no-console */ -console.log = jest.fn(); - -jest.mock('aws-sdk', () => { - return { - ...jest.requireActual('aws-sdk'), - SSM: jest.fn(() => { - return { - config: { - apiVersion: 'apiVersion', - region: 'eu-west-1', - }, - getParameter: () => { - return { - promise: async () => {}, - }; - }, - }; - }), - }; -}); - -jest.mock('https', () => { - return { - request: (_: any, callback: () => void) => { - return { - on: () => undefined, - write: () => true, - end: callback, - }; - }, - }; -}); - -afterEach(() => { - jest.clearAllMocks(); -}); - -test('SDK global credentials are never set', async () => { - // WHEN - await handler({ - LogicalResourceId: 'logicalResourceId', - RequestId: 'requestId', - RequestType: 'Create', - ResponseURL: 'responseUrl', - ResourceProperties: { - Create: JSON.stringify({ - action: 'getParameter', - assumedRoleArn: 'arn:aws:iam::123456789012:role/CoolRole', - parameters: { - Name: 'foo', - }, - physicalResourceId: PhysicalResourceId.of('id'), - service: 'SSM', - }), - ServiceToken: 'serviceToken', - }, - ResourceType: 'resourceType', - ServiceToken: 'serviceToken', - StackId: 'stackId', - }, {} as AWSLambda.Context); - - // THEN - expect(AWS.config).toBeInstanceOf(AWS.Config); - expect(AWS.config.credentials).toBeNull(); -}); - -test('SDK credentials are not persisted across subsequent invocations', async () => { - // GIVEN - const mockCreds = new AWS.ChainableTemporaryCredentials(); - jest.spyOn(AWS, 'ChainableTemporaryCredentials').mockReturnValue(mockCreds); - - // WHEN - await handler({ - LogicalResourceId: 'logicalResourceId', - RequestId: 'requestId', - RequestType: 'Create', - ResponseURL: 'responseUrl', - ResourceProperties: { - Create: JSON.stringify({ - action: 'getParameter', - parameters: { - Name: 'foo', - }, - physicalResourceId: PhysicalResourceId.of('id'), - service: 'SSM', - }), - ServiceToken: 'serviceToken', - }, - ResourceType: 'resourceType', - ServiceToken: 'serviceToken', - StackId: 'stackId', - }, {} as AWSLambda.Context); - - await handler({ - LogicalResourceId: 'logicalResourceId', - RequestId: 'requestId', - RequestType: 'Create', - ResponseURL: 'responseUrl', - ResourceProperties: { - Create: JSON.stringify({ - action: 'getParameter', - assumedRoleArn: 'arn:aws:iam::123456789012:role/CoolRole', - parameters: { - Name: 'foo', - }, - physicalResourceId: PhysicalResourceId.of('id'), - service: 'SSM', - }), - ServiceToken: 'serviceToken', - }, - ResourceType: 'resourceType', - ServiceToken: 'serviceToken', - StackId: 'stackId', - }, {} as AWSLambda.Context); - - await handler({ - LogicalResourceId: 'logicalResourceId', - RequestId: 'requestId', - RequestType: 'Create', - ResponseURL: 'responseUrl', - ResourceProperties: { - Create: JSON.stringify({ - action: 'getParameter', - parameters: { - Name: 'foo', - }, - physicalResourceId: PhysicalResourceId.of('id'), - service: 'SSM', - }), - ServiceToken: 'serviceToken', - }, - ResourceType: 'resourceType', - ServiceToken: 'serviceToken', - StackId: 'stackId', - }, {} as AWSLambda.Context); - - // THEN - expect(AWS.SSM).toHaveBeenNthCalledWith(1, { - apiVersion: undefined, - credentials: undefined, - region: undefined, +describe('index', () =>{ + beforeEach(() => { + // Reset because the module is cached and does not re-read environment variables + jest.resetModules(); }); - expect(AWS.SSM).toHaveBeenNthCalledWith(2, { - apiVersion: undefined, - credentials: mockCreds, - region: undefined, + it('nodejs16.x runtime should use AWS SDK v2', async ()=> { + process.env.AWS_EXECUTION_ENV = 'AWS_Lambda_nodejs16.x'; + const expected = await import('../../../lib/aws-custom-resource/runtime/aws-sdk-v2-handler'); + const runtime = await import('../../../lib/aws-custom-resource/runtime'); + expect(runtime.handler).toStrictEqual(expected.handler); }); - expect(AWS.SSM).toHaveBeenNthCalledWith(3, { - apiVersion: undefined, - credentials: undefined, - region: undefined, + it('nodejs18.x runtime should use AWS SDK v3', async ()=> { + process.env.AWS_EXECUTION_ENV = 'AWS_Lambda_nodejs18.x'; + const expected = await import('../../../lib/aws-custom-resource/runtime/aws-sdk-v3-handler'); + const runtime = await import('../../../lib/aws-custom-resource/runtime'); + expect(runtime.handler).toStrictEqual(expected.handler); }); -}); + it('nodejs18.x newer runtime should use AWS SDK v3', async ()=> { + process.env.AWS_EXECUTION_ENV = 'AWS_Lambda_nodejs20.x'; + const expected = await import('../../../lib/aws-custom-resource/runtime/aws-sdk-v3-handler'); + const runtime = await import('../../../lib/aws-custom-resource/runtime'); + expect(runtime.handler).toStrictEqual(expected.handler); + }); +}); \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/shared.test.ts b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/shared.test.ts new file mode 100644 index 0000000000000..62496f03e7270 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/test/aws-custom-resource/runtime/shared.test.ts @@ -0,0 +1,36 @@ +import { flatten } from '../../../lib/aws-custom-resource/runtime/shared'; + +test('flatten correctly flattens a nested object', () => { + expect(flatten({ + a: { b: 'c' }, + d: [ + { e: 'f' }, + { g: 'h', i: 1, j: null, k: { l: false } }, + ], + })).toEqual({ + 'a.b': 'c', + 'd.0.e': 'f', + 'd.1.g': 'h', + 'd.1.i': 1, + 'd.1.j': null, + 'd.1.k.l': false, + }); +}); + +test('flatten correctly flattens an object with buffers', () => { + expect(flatten({ + body: Buffer.from('body'), + nested: { + buffer: Buffer.from('buffer'), + array: [ + Buffer.from('array.0'), + Buffer.from('array.1'), + ], + }, + })).toEqual({ + 'body': 'body', + 'nested.buffer': 'buffer', + 'nested.array.0': 'array.0', + 'nested.array.1': 'array.1', + }); +}); \ No newline at end of file diff --git a/packages/aws-cdk-lib/package.json b/packages/aws-cdk-lib/package.json index ea93c9a65a67d..1f88b38c64b28 100644 --- a/packages/aws-cdk-lib/package.json +++ b/packages/aws-cdk-lib/package.json @@ -137,11 +137,14 @@ "@aws-cdk/cfn2ts": "0.0.0", "@aws-cdk/cfnspec": "0.0.0", "@aws-cdk/pkglint": "0.0.0", + "@aws-sdk/client-s3": "^3.321.1", + "@aws-sdk/credential-providers": "^3.321.1", "@types/aws-lambda": "^8.10.115", "@types/jest": "^29.5.1", "@types/lodash": "^4.14.194", "@types/punycode": "^2.1.0", "aws-sdk": "^2.1379.0", + "aws-sdk-client-mock": "^2.1.1", "aws-sdk-mock": "5.6.0", "cdk8s": "^2.7.68", "constructs": "^10.0.0", diff --git a/packages/aws-cdk/package.json b/packages/aws-cdk/package.json index 4f9690ef2111f..05682ee09e2c7 100644 --- a/packages/aws-cdk/package.json +++ b/packages/aws-cdk/package.json @@ -61,7 +61,8 @@ }, "license": "Apache-2.0", "devDependencies": { - "aws-cdk-lib": "0.0.0", + "@aws-cdk/cdk-build-tools": "0.0.0", + "@aws-cdk/pkglint": "0.0.0", "@octokit/rest": "^18.12.0", "@types/archiver": "^5.3.2", "@types/fs-extra": "^9.0.13", @@ -76,21 +77,20 @@ "@types/uuid": "^8.3.4", "@types/wrap-ansi": "^3.0.0", "@types/yargs": "^15.0.15", + "aws-cdk-lib": "0.0.0", "aws-sdk-mock": "5.6.0", - "@aws-cdk/cdk-build-tools": "0.0.0", + "axios": "^0.27.2", + "constructs": "^10.0.0", + "fast-check": "^2.25.0", "jest": "^29.5.0", "madge": "^5.0.2", - "constructs": "^10.0.0", "make-runnable": "^1.4.1", "mockery": "^2.1.0", "nock": "^13.3.1", - "@aws-cdk/pkglint": "0.0.0", "sinon": "^9.2.4", "ts-jest": "^29.1.0", "ts-mock-imports": "^1.3.8", - "xml-js": "^1.6.11", - "axios": "^0.27.2", - "fast-check": "^2.25.0" + "xml-js": "^1.6.11" }, "dependencies": { "@aws-cdk/cloud-assembly-schema": "0.0.0", @@ -102,8 +102,8 @@ "aws-sdk": "^2.1379.0", "camelcase": "^6.3.0", "cdk-assets": "0.0.0", - "chokidar": "^3.5.3", "chalk": "^4", + "chokidar": "^3.5.3", "decamelize": "^5.0.1", "fs-extra": "^9.1.0", "glob": "^7.2.3", diff --git a/yarn.lock b/yarn.lock index 6006e14b41c86..f1fbba94e0496 100644 --- a/yarn.lock +++ b/yarn.lock @@ -55,6 +55,1018 @@ resolved "https://registry.npmjs.org/@aws-cdk/lambda-layer-kubectl-v24/-/lambda-layer-kubectl-v24-2.0.195.tgz#750d627032388ac896e430efd80f1c98150f8fab" integrity sha512-PA/z81pTWceoLVk8R+YuiRwxxNJA5KA7GWHVCGTaMuIppY17ZJMEp1ldZbtsLxxpJcoJmiDuDWndrVqSzQazzQ== +"@aws-crypto/crc32@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" + integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/crc32c@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" + integrity sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@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" + integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha1-browser@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz#f9083c00782b24714f528b1a1fef2174002266a3" + integrity sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@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" + integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/sha256-js" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" + integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" + integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/util@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" + integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/abort-controller@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.310.0.tgz#0da2d29b823daa03b7c1f0b43de1f030583b4f51" + integrity sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/chunked-blob-reader@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.310.0.tgz#2ada1b024a2745c2fe7e869606fab781325f981e" + integrity sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/client-cognito-identity@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.326.0.tgz#82178ae8180be88aa8bac61ec21f3a2d48f793d9" + integrity sha512-nLYQUFoQYchApuYVi3t4mHM2qdiZ/Fe9zfoXdLoHxNZA7/8k7bpBwGPzHen+232ZHnxGOrqvVrpWhF2Jsawqsg== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.326.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.326.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.325.0" + "@aws-sdk/middleware-endpoint" "3.325.0" + "@aws-sdk/middleware-host-header" "3.325.0" + "@aws-sdk/middleware-logger" "3.325.0" + "@aws-sdk/middleware-recursion-detection" "3.325.0" + "@aws-sdk/middleware-retry" "3.325.0" + "@aws-sdk/middleware-serde" "3.325.0" + "@aws-sdk/middleware-signing" "3.325.0" + "@aws-sdk/middleware-stack" "3.325.0" + "@aws-sdk/middleware-user-agent" "3.325.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.321.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.325.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.325.0" + "@aws-sdk/util-defaults-mode-node" "3.325.0" + "@aws-sdk/util-endpoints" "3.319.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/client-s3@^3.321.1": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.326.0.tgz#5a23233874db31687b5f2e89a5fbc4d88f449c75" + integrity sha512-fRlwZoerdRw+xHf6n+xFc0rRDmofjVdJl2hRD+nqXk8IVp5pRbG0OqtJGT/0KRc0Eoobk66+nHvh2dvEPdIGlw== + dependencies: + "@aws-crypto/sha1-browser" "3.0.0" + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.326.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.326.0" + "@aws-sdk/eventstream-serde-browser" "3.310.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.310.0" + "@aws-sdk/eventstream-serde-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-blob-browser" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/hash-stream-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/md5-js" "3.310.0" + "@aws-sdk/middleware-bucket-endpoint" "3.310.0" + "@aws-sdk/middleware-content-length" "3.325.0" + "@aws-sdk/middleware-endpoint" "3.325.0" + "@aws-sdk/middleware-expect-continue" "3.325.0" + "@aws-sdk/middleware-flexible-checksums" "3.326.0" + "@aws-sdk/middleware-host-header" "3.325.0" + "@aws-sdk/middleware-location-constraint" "3.325.0" + "@aws-sdk/middleware-logger" "3.325.0" + "@aws-sdk/middleware-recursion-detection" "3.325.0" + "@aws-sdk/middleware-retry" "3.325.0" + "@aws-sdk/middleware-sdk-s3" "3.326.0" + "@aws-sdk/middleware-serde" "3.325.0" + "@aws-sdk/middleware-signing" "3.325.0" + "@aws-sdk/middleware-ssec" "3.325.0" + "@aws-sdk/middleware-stack" "3.325.0" + "@aws-sdk/middleware-user-agent" "3.325.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.321.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4-multi-region" "3.310.0" + "@aws-sdk/smithy-client" "3.325.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.325.0" + "@aws-sdk/util-defaults-mode-node" "3.325.0" + "@aws-sdk/util-endpoints" "3.319.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-stream-browser" "3.310.0" + "@aws-sdk/util-stream-node" "3.321.1" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/util-waiter" "3.310.0" + "@aws-sdk/xml-builder" "3.310.0" + fast-xml-parser "4.1.2" + tslib "^2.5.0" + +"@aws-sdk/client-sso-oidc@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.326.0.tgz#0ca864e6ae3bfe0beb66b0b5a066e3c4bdb92b5d" + integrity sha512-JLxIiWDKYUExYOzsxSPV8nf9w4mmgkkZ495GtSF6YnZhh0Ryxp3yB7KjsEgF3opOVo7uXkkgz4y30GWFzD1pEg== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.325.0" + "@aws-sdk/middleware-endpoint" "3.325.0" + "@aws-sdk/middleware-host-header" "3.325.0" + "@aws-sdk/middleware-logger" "3.325.0" + "@aws-sdk/middleware-recursion-detection" "3.325.0" + "@aws-sdk/middleware-retry" "3.325.0" + "@aws-sdk/middleware-serde" "3.325.0" + "@aws-sdk/middleware-stack" "3.325.0" + "@aws-sdk/middleware-user-agent" "3.325.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.321.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.325.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.325.0" + "@aws-sdk/util-defaults-mode-node" "3.325.0" + "@aws-sdk/util-endpoints" "3.319.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/client-sso@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.326.0.tgz#50e090b2c0f5b91a79f3f0d6087f9ee8c50071f9" + integrity sha512-dLV9JyTvalh/0vIMd+eJ93n4lvmXcBqXuSFJkyFnyFN/HAB/zC8XB3ccZ1DbwydWMpyVevW6h8+z2gGcq6mweQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.325.0" + "@aws-sdk/middleware-endpoint" "3.325.0" + "@aws-sdk/middleware-host-header" "3.325.0" + "@aws-sdk/middleware-logger" "3.325.0" + "@aws-sdk/middleware-recursion-detection" "3.325.0" + "@aws-sdk/middleware-retry" "3.325.0" + "@aws-sdk/middleware-serde" "3.325.0" + "@aws-sdk/middleware-stack" "3.325.0" + "@aws-sdk/middleware-user-agent" "3.325.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.321.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.325.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.325.0" + "@aws-sdk/util-defaults-mode-node" "3.325.0" + "@aws-sdk/util-endpoints" "3.319.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/client-sts@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.326.0.tgz#997d00d633910843f667c296ba9780f7e1cd905f" + integrity sha512-kVxqOqfoTsObH085AbD6MVdizju03h9bmxDNRXm8ehGtQUDN6B3aqZ78Hp4DryBC87W8SdlehzuRkByW8gQL4A== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.326.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.325.0" + "@aws-sdk/middleware-endpoint" "3.325.0" + "@aws-sdk/middleware-host-header" "3.325.0" + "@aws-sdk/middleware-logger" "3.325.0" + "@aws-sdk/middleware-recursion-detection" "3.325.0" + "@aws-sdk/middleware-retry" "3.325.0" + "@aws-sdk/middleware-sdk-sts" "3.326.0" + "@aws-sdk/middleware-serde" "3.325.0" + "@aws-sdk/middleware-signing" "3.325.0" + "@aws-sdk/middleware-stack" "3.325.0" + "@aws-sdk/middleware-user-agent" "3.325.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.321.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.325.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.325.0" + "@aws-sdk/util-defaults-mode-node" "3.325.0" + "@aws-sdk/util-endpoints" "3.319.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + fast-xml-parser "4.1.2" + tslib "^2.5.0" + +"@aws-sdk/config-resolver@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.310.0.tgz#c02dce96546d5cd25551bc89907b27224e16ca7f" + integrity sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g== + dependencies: + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-config-provider" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-cognito-identity@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.326.0.tgz#a6fa1401561efb56c1397e7598d1ab7ee18d5a23" + integrity sha512-TgeWiRXCglqMcqNhbKQkDAF+Wpynq2cP+z/lZyDBKDsude+3Zi5w1ZzeVae+/zege0Mhn+wxKCqCsXYTGiD7BA== + dependencies: + "@aws-sdk/client-cognito-identity" "3.326.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-env@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.310.0.tgz#c52694fb276341db6ce4e816cf9ca90fa5830dad" + integrity sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A== + dependencies: + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-imds@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.310.0.tgz#d8fb1223fee7e289a81e28177fe55dedf4d2745e" + integrity sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w== + dependencies: + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-ini@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.326.0.tgz#33fa09ff113f6d8af8d319340818b90b48969df5" + integrity sha512-6iaDk2W1HOtQMMynbSy3VHumfGG8jkbAZ0tXPAbIXxN7w65GObOsamOkUBRp+Y6A+JuZYJyu1CRFHASENluJOA== + dependencies: + "@aws-sdk/credential-provider-env" "3.310.0" + "@aws-sdk/credential-provider-imds" "3.310.0" + "@aws-sdk/credential-provider-process" "3.310.0" + "@aws-sdk/credential-provider-sso" "3.326.0" + "@aws-sdk/credential-provider-web-identity" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-node@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.326.0.tgz#2fceaf68396cec53faa371bdfc896f6c0fcdb29d" + integrity sha512-7wopivXUgx5rcUSSUD4Zf5UQtFZEw/AFh1/DBjA/gWFjwKVdNUN0WxciV3g7zhIhZp2ffe4hTtlmHl3GuDR+zA== + dependencies: + "@aws-sdk/credential-provider-env" "3.310.0" + "@aws-sdk/credential-provider-imds" "3.310.0" + "@aws-sdk/credential-provider-ini" "3.326.0" + "@aws-sdk/credential-provider-process" "3.310.0" + "@aws-sdk/credential-provider-sso" "3.326.0" + "@aws-sdk/credential-provider-web-identity" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-process@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.310.0.tgz#0b2ee77f0c48262442d2768044d72332a4ad8884" + integrity sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA== + dependencies: + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-sso@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.326.0.tgz#15aa55bc4dab561b57ca9026aa73006506a3d630" + integrity sha512-GYCcFH6wsXdV6ULYUC5oZDtigaoPdDxOG8/ny1QQvNCo0MhQ35v+2xYf+84FgtQDPba0B/or4ErzHdPkPHM39g== + dependencies: + "@aws-sdk/client-sso" "3.326.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/token-providers" "3.326.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-web-identity@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.310.0.tgz#c9fa09b0068027e58d31178e3fa06bf4e9ae9d36" + integrity sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw== + dependencies: + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/credential-providers@^3.321.1": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.326.0.tgz#56194f8491c00ece9e52095eaee15f21ecd0a33c" + integrity sha512-HGFVuv6pwvloF0E9OD9paipjTFbC3Rs/JZmQ78QKKS9toP4J1En4vhu/LNQIpPDGoZBLuFIe5bEId3oAKLgdUA== + dependencies: + "@aws-sdk/client-cognito-identity" "3.326.0" + "@aws-sdk/client-sso" "3.326.0" + "@aws-sdk/client-sts" "3.326.0" + "@aws-sdk/credential-provider-cognito-identity" "3.326.0" + "@aws-sdk/credential-provider-env" "3.310.0" + "@aws-sdk/credential-provider-imds" "3.310.0" + "@aws-sdk/credential-provider-ini" "3.326.0" + "@aws-sdk/credential-provider-node" "3.326.0" + "@aws-sdk/credential-provider-process" "3.310.0" + "@aws-sdk/credential-provider-sso" "3.326.0" + "@aws-sdk/credential-provider-web-identity" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-codec@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.310.0.tgz#a5def3633f7ccdc3d477fd0b05e2eb31c5598ed9" + integrity sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-browser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.310.0.tgz#02aef0262b5f740a1c8ffbdeb8459542f90c14dd" + integrity sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-config-resolver@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.310.0.tgz#e4e2358f36b9eb6d37da0a0f0d3fc32da91ad6b4" + integrity sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-node@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.310.0.tgz#6e0fbc400bac677c77b946fd2a5cb00b57503c0e" + integrity sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-serde-universal@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.310.0.tgz#d0f95eaafb8fd09d9a21aec8f23b7f3cee2bb19a" + integrity sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw== + dependencies: + "@aws-sdk/eventstream-codec" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/fetch-http-handler@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.310.0.tgz#f31006b7b3103683d72e177cd27d80354f7a37c4" + integrity sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/querystring-builder" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/hash-blob-browser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.310.0.tgz#762a56ae655e3bcd0ba46bbc39e8b370b1067629" + integrity sha512-OoR8p0cbypToysLT0v3o2oyjy6+DKrY7GNCAzHOHJK9xmqXCt+DsjKoPeiY7o1sWX2aN6Plmvubj/zWxMKEn/A== + dependencies: + "@aws-sdk/chunked-blob-reader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/hash-node@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.310.0.tgz#4c1c89b9a2da3bb9783de84f0b762cc055b90d67" + integrity sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ== + dependencies: + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-buffer-from" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/hash-stream-node@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.310.0.tgz#3845d813a7de476c56fac492a50ffa8af265f120" + integrity sha512-ZoXdybNgvMz1Hl6k/e32xVL3jmG5p2IEk5mTtLfFEuskTJ74Z+VMYKkkF1whyy7KQfH83H+TQGnsGtlRCchQKw== + dependencies: + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/invalid-dependency@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.310.0.tgz#b96da9b9f63b12d1c390f9a06eeb28840fcb5b3c" + integrity sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/is-array-buffer@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz#f87a79f1b858c88744f07e8d8d0a791df204017e" + integrity sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/md5-js@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.310.0.tgz#14e3d570d92808e68ccc0db8d7492ebdb93f15b5" + integrity sha512-x5sRBUrEfLWAS1EhwbbDQ7cXq6uvBxh3qR2XAsnGvFFceTeAadk7cVogWxlk3PC+OCeeym7c3/6Bv2HQ2f1YyQ== + dependencies: + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-bucket-endpoint@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.310.0.tgz#5dd9b028498a0492c3e773c0aca10d6ded929fc6" + integrity sha512-uJJfHI7v4AgbJZRLtyI8ap2QRWkBokGc3iyUoQ+dVNT3/CE2ZCu694A6W+H0dRqg79dIE+f9CRNdtLGa/Ehhvg== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-arn-parser" "3.310.0" + "@aws-sdk/util-config-provider" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-content-length@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.325.0.tgz#1dbdc41766df195cc4d054d58b36ee78f26b990d" + integrity sha512-t38VBKCpNqSKqSu0OfWMJs7cwaRHFGQxIF9lV8JMCM/2lyUpN4JcfuzSTK+MFN2eDZEHp5DiNg8w07GXXusRYg== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-endpoint@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.325.0.tgz#78ad5239f3b4a91a5efd9a548582cb8d3878cb60" + integrity sha512-3CavuOHCKiWUnCtzrUFbhbEP26qIgzzRs5C3vpOJhDUhugBubIWgPGGRLpbnIro+P4XJPwM3pMziNzhKVuSDlQ== + dependencies: + "@aws-sdk/middleware-serde" "3.325.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-expect-continue@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.325.0.tgz#d012dc55ca75c02028c76b04e875103d27abce78" + integrity sha512-Hj4D+zeet4gdUpSiMeHZfIzcnXkZI2krGyUw4U1psPzCqOp7WP5307g+1NWXOlVu3H3tF5r3rEgthQOQj2zNfA== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-flexible-checksums@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.326.0.tgz#12fed82236931170eee7de19e2fd1c7a2495d24f" + integrity sha512-MtcvSU+wKu4/a/trIJmb4Tfb682U9uP5YYA5aXzdhxOxG11wj86uBIeQrdbUxhtTXMgmvwn1193dvTi91EUEaQ== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@aws-crypto/crc32c" "3.0.0" + "@aws-sdk/is-array-buffer" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-host-header@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.325.0.tgz#8f3a93948bd7c94ef39fc72a6c8b952dc8736675" + integrity sha512-IN28gsxcRy4J+FxxCHvzb2NORBx8uMA+h9QYS4BBZfpKVYIZh+mudHgYcdNHWlKXmlTGjhWBNWTeByhzuSKAiA== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-location-constraint@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.325.0.tgz#6ea3226c0fab5abe1c661ef717a5f737a0a0c06b" + integrity sha512-T2OrpXXY9I1nHvIGSlQD6qj1FDG3WDFSu65+Bh4pMl+zVh0IqIEajiK++TfrdQl+sJxRGQd/euoeXXL4JYw9JA== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-logger@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.325.0.tgz#a1208c66d215ad904c02fb46c9e192e1e5caa74c" + integrity sha512-S8rWgTpN2b/+UDDm+yZMFM6rw1zwO8KT0GAIQbAhB96shyD5eKen/UfihCTB7YMvbD2piebymwJTvxv6bn1VqQ== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-recursion-detection@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.325.0.tgz#1b22e3eafa5992628277d991dfc0b81b40eebeaa" + integrity sha512-2l1ABF7KePsoKz8KaNvD2uxo1zHqkFHK4PL/wW/FbcwOcE08f0R7qX++st/bPpVjXX/j/5vWTnNNgJOIOrZhyw== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-retry@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.325.0.tgz#8809c8bc603585b15ffb45b75bc90face3613319" + integrity sha512-oQM5AI3vkNQuCakBMgdohOcvRnVYcBBlv+KzCCj07ue9gk0x2dHOZY2pqTQ2CYilRqS/X1PtLogJXoyHP5Wvwg== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/service-error-classification" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + tslib "^2.5.0" + uuid "^8.3.2" + +"@aws-sdk/middleware-sdk-s3@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.326.0.tgz#44af369a3ef84a934a0c4e79c14da3e34f6e68f8" + integrity sha512-IyonHEiDMn0fdYWxA/TAnNj8M/xG5EJWvoOKcakl891f+JPaWeRsV2oE1fIjqM/waM3jqNXLDTrm06QfAYmgBQ== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-arn-parser" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-sdk-sts@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.326.0.tgz#4b0c983f966d079e2a1cd949c57af1c5f0a3ee30" + integrity sha512-suOkuXxyAfOH0hznK63ZU10EoytKX5YPs9amO416VbgYFtuIeliCmntYfnl1jUvutp0fctGGpEGE9OnoYI+fhw== + dependencies: + "@aws-sdk/middleware-signing" "3.325.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-serde@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.325.0.tgz#512ae03fbfa9266133aceafc010c6a9167ffb2f1" + integrity sha512-QAZYaFfAw1a06Vg39JiYIq0kSJ6EuUPOiKfK/Goj0cBv78lrXWuKdf04UF3U8Rqk/4mamnsTqUSwf4NoKkF0hw== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-signing@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.325.0.tgz#46eea6805ca10ad4a4db8269e0bb3d31f906b887" + integrity sha512-SOwPwaCE3vSCGwFzkIlnOUSkeCUzKTyIQnFVjlQkqGuMxMX/iDaQQGaX+HUbuGIuULCEQqjZH4dLKZcor8eVZw== + dependencies: + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-ssec@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.325.0.tgz#15752b41889de437cad844d168d80a486b6ad385" + integrity sha512-hxmvvWVfVrbfUw8pDEPlsR6Sb+IUdhq0cOJc7SL5XO9ddRXJ5DjT2Z2ao9FB424hJgAcOrqIO5ECjdIRs+O4FQ== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-stack@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.325.0.tgz#3b592c7a6c32d2795746d050024585f588097621" + integrity sha512-cZWehA4grGvX1IKlY9atJgD0bq3ew7YRJgY7GA6DSgsU7GrZ61Qvi+H7IuGx5AdeAwaTnbnTGN4qCaA2EfxNhA== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/middleware-user-agent@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.325.0.tgz#9ad9172b0002c7ad792839064b4f553ee14b2657" + integrity sha512-2aIdGId4o8eIStm1J1aWZwNDf6nvrwg5Nx7BomLAxKZ4lkH8knzXDtxaZR4ElcTsBlBcYxz2gbsrScMyKRDTGA== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-endpoints" "3.319.0" + tslib "^2.5.0" + +"@aws-sdk/node-config-provider@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.310.0.tgz#ba8fb41af2db0316291ba9002267627553ec65ac" + integrity sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng== + dependencies: + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/node-http-handler@3.321.1": + version "3.321.1" + resolved "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.321.1.tgz#2de9380f3ce17f5b8b5d3c1300c8cd37d0ddddc5" + integrity sha512-DdQBrtFFDNtzphJIN3s93Vf+qd9LHSzH6WTQRrWoXhTDMHDzSI2Cn+c5KWfk89Nggp/n3+OTwUPQeCiBT5EBuw== + dependencies: + "@aws-sdk/abort-controller" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/querystring-builder" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/property-provider@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.310.0.tgz#5fae8a4c11bda052afa9747d47b031f1c4f0f246" + integrity sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/protocol-http@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.310.0.tgz#855c3314cba7ff3024a9a9701ca3c641691d997e" + integrity sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/querystring-builder@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.310.0.tgz#5307ea52c3a4a1ae6818bbb6987cc6fce68b043f" + integrity sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A== + dependencies: + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-uri-escape" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/querystring-parser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.310.0.tgz#438183927e0b06e7c2ee004a1681b8d37c22e104" + integrity sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/service-error-classification@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.310.0.tgz#352c1db426dcf54a44393bc9a0607dde796b2abb" + integrity sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw== + +"@aws-sdk/shared-ini-file-loader@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.310.0.tgz#07e9c8e8e8bb0de7ed19b8cea908c920a493c9c9" + integrity sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/signature-v4-multi-region@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.310.0.tgz#36eb96aa9170994ed1c5551952d2ec2d5e40c4c7" + integrity sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng== + dependencies: + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/signature-v4@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.310.0.tgz#ad26426d3f72fa18e6808a36f827beb72d12bf2d" + integrity sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q== + dependencies: + "@aws-sdk/is-array-buffer" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + "@aws-sdk/util-uri-escape" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/smithy-client@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.325.0.tgz#339f0ffa2824c5197a81831f9ff8a14d609517ec" + integrity sha512-sqDFuhjxd8+Q9qI8MmXe/g1/FgoViwetv14K+bpHK7pGlOIvDyT7TboDNClfgqSLdgTDCEaoC3JRSi9Y5RgbmA== + dependencies: + "@aws-sdk/middleware-stack" "3.325.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/token-providers@3.326.0": + version "3.326.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.326.0.tgz#64383933415b84aabc15d084f2792e22c4b783cb" + integrity sha512-Ghe4K6KgMWb5sx5HUzshJGjTMHUbzrxrjCwpEj2DHSMFivpy6LADS0+Ch3WR7w9CIu2V2tK20YrCPj4JC64dvA== + dependencies: + "@aws-sdk/client-sso-oidc" "3.326.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/types@3.310.0", "@aws-sdk/types@^3.222.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz#b83a0580feb38b58417abb8b4ed3eae1a0cb7bc1" + integrity sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/url-parser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz#928c9eac2e3d74c3c5db4c6e364a1de00185dcaa" + integrity sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw== + dependencies: + "@aws-sdk/querystring-parser" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-arn-parser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz#861ff8810851be52a320ec9e4786f15b5fc74fba" + integrity sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-base64@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz#d0fd49aff358c5a6e771d0001c63b1f97acbe34c" + integrity sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg== + dependencies: + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-body-length-browser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz#3fca9d2f73c058edf1907e4a1d99a392fdd23eca" + integrity sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-body-length-node@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz#4846ae72834ab0636f29f89fc1878520f6543fed" + integrity sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-buffer-from@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz#7a72cb965984d3c6a7e256ae6cf1621f52e54a57" + integrity sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw== + dependencies: + "@aws-sdk/is-array-buffer" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-config-provider@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz#ff21f73d4774cfd7bd16ae56f905828600dda95f" + integrity sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-defaults-mode-browser@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.325.0.tgz#1ebe9b06c08adaba835c566da2cbf393cfaa504a" + integrity sha512-gcowpXTo8E8N3jxD2KW+csiicJ7HPkhWnpL925xgwe0oq091OpATsKFrBOL18h72VfRWf4FAsR9lVwxSQ78zSA== + dependencies: + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + bowser "^2.11.0" + tslib "^2.5.0" + +"@aws-sdk/util-defaults-mode-node@3.325.0": + version "3.325.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.325.0.tgz#81ab64bcf41045adaf05f743387fe938d826e8b7" + integrity sha512-/5uoOrgNxoUxv3AwsdXjMA3f6KJA6fi69otA0RiINjilCdcbOxq5GI11AFEyRio/+e+imriX4+UYjsguUR+f4g== + dependencies: + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-imds" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-endpoints@3.319.0": + version "3.319.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.319.0.tgz#9be64762a8fae9eaac004cd3fa95576b3cb6ee38" + integrity sha512-3I64UMoYA2e2++oOUJXRcFtYLpLylnZFRltWfPo1B3dLlf+MIWat9djT+mMus+hW1ntLsvAIVu1hLVePJC0gvw== + dependencies: + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-hex-encoding@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz#19294c78986c90ae33f04491487863dc1d33bd87" + integrity sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz#b071baf050301adee89051032bd4139bba32cc40" + integrity sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-middleware@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.310.0.tgz#713c5bfa296f4cf707150a0a1e911afd50dcf939" + integrity sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-retry@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.310.0.tgz#4cdc35e2dfdacf2d928ab474ba8b67bbadd6be3c" + integrity sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA== + dependencies: + "@aws-sdk/service-error-classification" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-stream-browser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.310.0.tgz#223e60f7711f7a20fdc944e1b72c8dd4c1da28cf" + integrity sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w== + dependencies: + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-stream-node@3.321.1": + version "3.321.1" + resolved "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.321.1.tgz#57bbd20ab89f2452da37b9ad60dfdb2eb9fcc2e0" + integrity sha512-jvfff1zeA8q16hQWSC0BGwcHJPCwoh+bwiuAjihfl9q1tFLYuqaTzJzzkL1bntUsbW+y/ac5DO7fWcYPq0jWkw== + dependencies: + "@aws-sdk/node-http-handler" "3.321.1" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-uri-escape@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz#9f942f09a715d8278875013a416295746b6085ba" + integrity sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-user-agent-browser@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.310.0.tgz#48d463a93351b78b678df324f3518a9798029c44" + integrity sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw== + dependencies: + "@aws-sdk/types" "3.310.0" + bowser "^2.11.0" + tslib "^2.5.0" + +"@aws-sdk/util-user-agent-node@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.310.0.tgz#ebefbedc5a4759adc958885741628ec0de1ab197" + integrity sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg== + dependencies: + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@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" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-utf8@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz#4a7b9dcebb88e830d3811aeb21e9a6df4273afb4" + integrity sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA== + dependencies: + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/util-waiter@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.310.0.tgz#a410739cfc637af9ccea21de079d00652e9b8363" + integrity sha512-AV5j3guH/Y4REu+Qh3eXQU9igljHuU4XjX2sADAgf54C0kkhcCCkkiuzk3IsX089nyJCqIcj5idbjdvpnH88Vw== + dependencies: + "@aws-sdk/abort-controller" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" + +"@aws-sdk/xml-builder@3.310.0": + version "3.310.0" + resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz#f0236f2103b438d16117e0939a6305ad69b7ff76" + integrity sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw== + dependencies: + tslib "^2.5.0" + "@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" @@ -1789,6 +2801,13 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/samsam@^5.3.1": version "5.3.1" resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" @@ -1807,6 +2826,15 @@ lodash.get "^4.4.2" type-detect "^4.0.8" +"@sinonjs/samsam@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" + integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + "@sinonjs/text-encoding@^0.7.1": version "0.7.2" resolved "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" @@ -2121,6 +3149,13 @@ resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== +"@types/sinon@^10.0.10": + version "10.0.14" + resolved "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.14.tgz#6bd18b088ea5ef1e5153fa37d0b68e91eff09e22" + integrity sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ== + dependencies: + "@types/sinonjs__fake-timers" "*" + "@types/sinon@^9.0.11": version "9.0.11" resolved "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.11.tgz#7af202dda5253a847b511c929d8b6dda170562eb" @@ -2767,6 +3802,15 @@ available-typed-arrays@^1.0.5: resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +aws-sdk-client-mock@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-2.1.1.tgz#52e5e580fd5654492f9b477153928e373034798e" + integrity sha512-UuxXmICU4nmXTRm2BzLZdXmnyI+5NEBb5McRDkObasXVxXChvLm0Ci/PGENh4sCD+Es64SJiz70mtY48JROk0A== + dependencies: + "@types/sinon" "^10.0.10" + sinon "^14.0.2" + tslib "^2.1.0" + aws-sdk-mock@5.6.0: version "5.6.0" resolved "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-5.6.0.tgz#8cd44e2e8d65f7f38dea8d1ad073fa38f9c719d8" @@ -2950,6 +3994,11 @@ bluebird@^3.5.0: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + boxen@^7.0.0: version "7.1.0" resolved "https://registry.npmjs.org/boxen/-/boxen-7.1.0.tgz#ba10a9ef4e73a9e220105b5f8c07a56d359a4cb4" @@ -5000,6 +6049,13 @@ fast-memoize@^2.5.2: resolved "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== +fast-xml-parser@4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz#5a98c18238d28a57bbdfa9fe4cda01211fff8f4a" + integrity sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg== + 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" @@ -8277,7 +9333,7 @@ nise@^4.0.4: just-extend "^4.0.2" path-to-regexp "^1.7.0" -nise@^5.1.0: +nise@^5.1.0, nise@^5.1.2: version "5.1.4" resolved "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0" integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg== @@ -10410,6 +11466,18 @@ sinon@^11.1.1: nise "^5.1.0" supports-color "^7.2.0" +sinon@^14.0.2: + version "14.0.2" + resolved "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" + integrity sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "^9.1.2" + "@sinonjs/samsam" "^7.0.1" + diff "^5.0.0" + nise "^5.1.2" + supports-color "^7.2.0" + sinon@^9.2.4: version "9.2.4" resolved "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz#e55af4d3b174a4443a8762fa8421c2976683752b" @@ -10835,6 +11903,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -11164,12 +12237,12 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==