@aws-cdk-testing/cli-integ 2.173.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +9 -0
- package/LICENSE +2 -1
- package/bin/query-github.js +3 -3
- package/bin/query-github.ts +56 -0
- package/bin/run-suite.js +3 -3
- package/bin/run-suite.ts +140 -0
- package/bin/stage-distribution.js +3 -2
- package/bin/stage-distribution.ts +267 -0
- package/bin/test-root.ts +3 -0
- package/lib/aws.js +9 -6
- package/lib/aws.ts +263 -0
- package/lib/corking.ts +33 -0
- package/lib/eventually.js +3 -3
- package/lib/eventually.ts +42 -0
- package/lib/files.js +3 -2
- package/lib/files.ts +80 -0
- package/lib/github.js +6 -5
- package/lib/github.ts +43 -0
- package/lib/index.ts +13 -0
- package/lib/integ-test.ts +81 -0
- package/lib/lists.ts +9 -0
- package/lib/memoize.ts +14 -0
- package/lib/npm.ts +41 -0
- package/lib/package-sources/release-source.js +3 -2
- package/lib/package-sources/release-source.ts +81 -0
- package/lib/package-sources/repo-source.ts +111 -0
- package/lib/package-sources/repo-tools/npm.js +5 -4
- package/lib/package-sources/repo-tools/npm.ts +48 -0
- package/lib/package-sources/source.ts +35 -0
- package/lib/package-sources/subprocess.ts +15 -0
- package/lib/resource-pool.js +2 -2
- package/lib/resource-pool.ts +140 -0
- package/lib/resources.ts +4 -0
- package/lib/shell.js +8 -5
- package/lib/shell.ts +168 -0
- package/lib/staging/codeartifact.js +11 -8
- package/lib/staging/codeartifact.ts +387 -0
- package/lib/staging/maven.js +5 -3
- package/lib/staging/maven.ts +95 -0
- package/lib/staging/npm.ts +62 -0
- package/lib/staging/nuget.ts +75 -0
- package/lib/staging/parallel-shell.js +2 -2
- package/lib/staging/parallel-shell.ts +51 -0
- package/lib/staging/pypi.ts +50 -0
- package/lib/staging/usage-dir.ts +99 -0
- package/lib/with-aws.js +3 -2
- package/lib/with-aws.ts +67 -0
- package/lib/with-cdk-app.js +23 -14
- package/lib/with-cdk-app.ts +742 -0
- package/lib/with-cli-lib.ts +134 -0
- package/lib/with-packages.ts +15 -0
- package/lib/with-sam.js +7 -4
- package/lib/with-sam.ts +288 -0
- package/lib/with-temporary-directory.ts +35 -0
- package/lib/with-timeout.ts +33 -0
- package/lib/xpmutex.js +2 -2
- package/lib/xpmutex.ts +218 -0
- package/package.json +84 -62
- package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
- package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
- package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
- package/tests/cli-integ-tests/bootstrapping.integtest.js +22 -13
- package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
- package/tests/cli-integ-tests/cli-lib.integtest.js +3 -2
- package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
- package/tests/cli-integ-tests/cli.integtest.js +76 -49
- package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
- package/tests/cli-integ-tests/garbage-collection.integtest.js +2 -2
- package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
- package/tests/init-csharp/init-csharp.integtest.ts +15 -0
- package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
- package/tests/init-go/init-go.integtest.ts +23 -0
- package/tests/init-java/init-java.integtest.ts +14 -0
- package/tests/init-javascript/init-javascript.integtest.ts +59 -0
- package/tests/init-python/init-python.integtest.ts +20 -0
- package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
- package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
- package/tests/tool-integrations/amplify.integtest.ts +43 -0
- package/tests/tool-integrations/with-tool-context.ts +14 -0
- package/tests/uberpackage/uberpackage.integtest.ts +11 -0
- package/resources/cdk-apps/cfn-include-app/.gitignore +0 -1
|
@@ -246,7 +246,7 @@ jest.setTimeout(2 * 60 * 60000); // Includes the time to acquire locks, worst-ca
|
|
|
246
246
|
fixture.log('Setup complete!');
|
|
247
247
|
// Artificially add tagging to the asset in the bootstrap bucket
|
|
248
248
|
const result = await fixture.aws.s3.send(new client_s3_1.ListObjectsV2Command({ Bucket: bootstrapBucketName }));
|
|
249
|
-
const key = result.Contents.filter((c) => c.Key
|
|
249
|
+
const key = result.Contents.filter((c) => { var _a; return ((_a = c.Key) === null || _a === void 0 ? void 0 : _a.split('.')[1]) == 'zip'; })[0].Key; // fancy footwork to make sure we have the asset key
|
|
250
250
|
await fixture.aws.s3.send(new client_s3_1.PutObjectTaggingCommand({
|
|
251
251
|
Bucket: bootstrapBucketName,
|
|
252
252
|
Key: key,
|
|
@@ -311,4 +311,4 @@ jest.setTimeout(2 * 60 * 60000); // Includes the time to acquire locks, worst-ca
|
|
|
311
311
|
],
|
|
312
312
|
});
|
|
313
313
|
}));
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0aW9uLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdhcmJhZ2UtY29sbGVjdGlvbi5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBK0Y7QUFDL0Ysa0RBQTRHO0FBQzVHLG1DQUFzRTtBQUV0RSxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUMzQyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCw4Q0FBOEMsRUFDOUMsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsSUFBQSxrQkFBWSxHQUFFLEVBQUUsQ0FBQztJQUN4RixPQUFPLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFFcEUsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ2hCLG1CQUFtQjtLQUNwQixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxtQkFBbUIsbUJBQW1CLEVBQUU7WUFDckQsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtR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QVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssZ0JBQWdCLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVySyxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QixrQkFBa0IsRUFBRSxHQUFHLEVBQUUsZ0ZBQWdGO1FBQ3pHLElBQUksRUFBRSxLQUFLO1FBQ1gsa0JBQWtCLEVBQUUsZ0JBQWdCO0tBQ3JDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUU1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDhCQUFpQixDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUVMLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7UUFDeEMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmF0Y2hHZXRJbWFnZUNvbW1hbmQsIExpc3RJbWFnZXNDb21tYW5kLCBQdXRJbWFnZUNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyJztcbmltcG9ydCB7IEdldE9iamVjdFRhZ2dpbmdDb21tYW5kLCBMaXN0T2JqZWN0c1YyQ29tbWFuZCwgUHV0T2JqZWN0VGFnZ2luZ0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCByYW5kb21TdHJpbmcsIHdpdGhvdXRCb290c3RyYXAgfSBmcm9tICcuLi8uLi9saWInO1xuXG5jb25zdCBTM19JU09MQVRFRF9UQUcgPSAnYXdzLWNkazppc29sYXRlZCc7XG5jb25zdCBFQ1JfSVNPTEFURURfVEFHID0gJ2F3cy1jZGsuaXNvbGF0ZWQnO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgczMgb2JqZWN0cycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG4gICAgY29uc3QgYm9vdHN0cmFwQnVja2V0TmFtZSA9IGBhd3MtY2RrLWdhcmJhZ2UtY29sbGVjdC1pbnRlZy10ZXN0LWJja3QtJHtyYW5kb21TdHJpbmcoKX1gO1xuICAgIGZpeHR1cmUucmVtZW1iZXJUb0RlbGV0ZUJ1Y2tldChib290c3RyYXBCdWNrZXROYW1lKTsgLy8ganVzdCBpbiBjYXNlXG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgYm9vdHN0cmFwQnVja2V0TmFtZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnU2V0dXAgY29tcGxldGUhJyk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Rlc3Ryb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdkb2NrZXItaW4tdXNlJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAwLFxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIC8vIGFzc2VydCB0aGF0IHRoZSBib290c3RyYXAgcmVwb3NpdG9yeSBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24ga2VlcHMgaW4gdXNlIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdFxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1RlYXJkb3duIGNvbXBsZXRlIScpO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiBrZWVwcyBpbiB1c2UgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnZWNyJyxcbiAgICAgIGJvb3RzdHJhcFN0YWNrTmFtZTogdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnR2FyYmFnZSBjb2xsZWN0aW9uIGNvbXBsZXRlIScpO1xuXG4gICAgLy8gYXNzZXJ0IHRoYXQgdGhlIGJvb3RzdHJhcCByZXBvc2l0b3J5IGlzIGVtcHR5XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IExpc3RJbWFnZXNDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmltYWdlSWRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdCBhbmQgaXMgdGFnZ2VkXG4gICAgYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUgfSkpXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuQ29udGVudHMpLnRvSGF2ZUxlbmd0aCgyKTsgLy8gYWxzbyB0aGUgQ0ZOIHRlbXBsYXRlXG4gICAgICAgIGNvbnN0IGtleSA9IHJlc3VsdC5Db250ZW50cyFbMF0uS2V5O1xuICAgICAgICBjb25zdCB0YWdzID0gYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgR2V0T2JqZWN0VGFnZ2luZ0NvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsIEtleToga2V5IH0pKTtcbiAgICAgICAgZXhwZWN0KHRhZ3MuVGFnU2V0KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDIpOyAvLyB0aGUgc2Vjb25kIHRhZyBjb21lcyBpbiBhcyBhIHNlY29uZCAnaWQnXG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gdW50YWdzIGluLXVzZSBzMyBvYmplY3RzJyxcbiAgd2l0aG91dEJvb3RzdHJhcChhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRvb2xraXRTdGFja05hbWUgPSBmaXh0dXJlLmJvb3RzdHJhcFN0YWNrTmFtZTtcbiAgICBjb25zdCBib290c3RyYXBCdWNrZXROYW1lID0gYGF3cy1jZGstZ2FyYmFnZS1jb2xsZWN0LWludGVnLXRlc3QtYmNrdC0ke3JhbmRvbVN0cmluZygpfWA7XG4gICAgZml4dHVyZS5yZW1lbWJlclRvRGVsZXRlQnVja2V0KGJvb3RzdHJhcEJ1Y2tldE5hbWUpOyAvLyBqdXN0IGluIGNhc2VcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrQm9vdHN0cmFwTW9kZXJuKHtcbiAgICAgIHRvb2xraXRTdGFja05hbWUsXG4gICAgICBib290c3RyYXBCdWNrZXROYW1lLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSB9KSk7XG4gICAgY29uc3Qga2V5ID0gcmVzdWx0LkNvbnRlbnRzIS5maWx0ZXIoKGMpID0+IGMuS2V5Py5zcGxpdCgnLicpWzFdID09ICd6aXAnKVswXS5LZXk7IC8vIGZhbmN5IGZvb3R3b3JrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBhc3NldCBrZXlcbiAgICBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBQdXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7XG4gICAgICBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgICBLZXk6IGtleSxcbiAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgVGFnU2V0OiBbe1xuICAgICAgICAgIEtleTogUzNfSVNPTEFURURfVEFHLFxuICAgICAgICAgIFZhbHVlOiAnMTIzNDUnLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgS2V5OiAnYm9ndXMnLFxuICAgICAgICAgIFZhbHVlOiAndmFsJyxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgaXNvbGF0ZWQgb2JqZWN0IHRhZyBpcyByZW1vdmVkIHdoaWxlIHRoZSBvdGhlciB0YWcgcmVtYWluc1xuICAgIGNvbnN0IG5ld1RhZ3MgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBHZXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSwgS2V5OiBrZXkgfSkpO1xuXG4gICAgZXhwZWN0KG5ld1RhZ3MuVGFnU2V0KS50b0VxdWFsKFt7XG4gICAgICBLZXk6ICdib2d1cycsXG4gICAgICBWYWx1ZTogJ3ZhbCcsXG4gICAgfV0pO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiB1bnRhZ3MgaW4tdXNlIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCBpbWFnZUlkcyA9IGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSk7XG4gICAgY29uc3QgZGlnZXN0ID0gaW1hZ2VJZHMuaW1hZ2VJZHMhWzBdLmltYWdlRGlnZXN0O1xuICAgIGNvbnN0IGltYWdlTWFuaWZlc3RzID0gYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IEJhdGNoR2V0SW1hZ2VDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLCBpbWFnZUlkczogW3sgaW1hZ2VEaWdlc3Q6IGRpZ2VzdCB9XSB9KSk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBpbWFnZU1hbmlmZXN0cy5pbWFnZXMhWzBdLmltYWdlTWFuaWZlc3Q7XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IFB1dEltYWdlQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSwgaW1hZ2VNYW5pZmVzdDogbWFuaWZlc3QsIGltYWdlRGlnZXN0OiBkaWdlc3QsIGltYWdlVGFnOiBgMC0ke0VDUl9JU09MQVRFRF9UQUd9LTEyMzQ1YCB9KSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDEpOyAvLyB0aGUgc2Vjb25kIHRhZyBoYXMgYmVlbiByZW1vdmVkXG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcbiJdfQ==
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0aW9uLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdhcmJhZ2UtY29sbGVjdGlvbi5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBK0Y7QUFDL0Ysa0RBQTRHO0FBQzVHLG1DQUFzRTtBQUV0RSxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUMzQyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCw4Q0FBOEMsRUFDOUMsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsSUFBQSxrQkFBWSxHQUFFLEVBQUUsQ0FBQztJQUN4RixPQUFPLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFFcEUsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ2hCLG1CQUFtQjtLQUNwQixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxtQkFBbUIsbUJBQW1CLEVBQUU7WUFDckQsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtR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QUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssZ0JBQWdCLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVySyxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QixrQkFBa0IsRUFBRSxHQUFHLEVBQUUsZ0ZBQWdGO1FBQ3pHLElBQUksRUFBRSxLQUFLO1FBQ1gsa0JBQWtCLEVBQUUsZ0JBQWdCO0tBQ3JDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUU1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDhCQUFpQixDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUVMLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7UUFDeEMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmF0Y2hHZXRJbWFnZUNvbW1hbmQsIExpc3RJbWFnZXNDb21tYW5kLCBQdXRJbWFnZUNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyJztcbmltcG9ydCB7IEdldE9iamVjdFRhZ2dpbmdDb21tYW5kLCBMaXN0T2JqZWN0c1YyQ29tbWFuZCwgUHV0T2JqZWN0VGFnZ2luZ0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCByYW5kb21TdHJpbmcsIHdpdGhvdXRCb290c3RyYXAgfSBmcm9tICcuLi8uLi9saWInO1xuXG5jb25zdCBTM19JU09MQVRFRF9UQUcgPSAnYXdzLWNkazppc29sYXRlZCc7XG5jb25zdCBFQ1JfSVNPTEFURURfVEFHID0gJ2F3cy1jZGsuaXNvbGF0ZWQnO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgczMgb2JqZWN0cycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG4gICAgY29uc3QgYm9vdHN0cmFwQnVja2V0TmFtZSA9IGBhd3MtY2RrLWdhcmJhZ2UtY29sbGVjdC1pbnRlZy10ZXN0LWJja3QtJHtyYW5kb21TdHJpbmcoKX1gO1xuICAgIGZpeHR1cmUucmVtZW1iZXJUb0RlbGV0ZUJ1Y2tldChib290c3RyYXBCdWNrZXROYW1lKTsgLy8ganVzdCBpbiBjYXNlXG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgYm9vdHN0cmFwQnVja2V0TmFtZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnU2V0dXAgY29tcGxldGUhJyk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Rlc3Ryb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdkb2NrZXItaW4tdXNlJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAwLFxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIC8vIGFzc2VydCB0aGF0IHRoZSBib290c3RyYXAgcmVwb3NpdG9yeSBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24ga2VlcHMgaW4gdXNlIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdFxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1RlYXJkb3duIGNvbXBsZXRlIScpO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiBrZWVwcyBpbiB1c2UgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnZWNyJyxcbiAgICAgIGJvb3RzdHJhcFN0YWNrTmFtZTogdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnR2FyYmFnZSBjb2xsZWN0aW9uIGNvbXBsZXRlIScpO1xuXG4gICAgLy8gYXNzZXJ0IHRoYXQgdGhlIGJvb3RzdHJhcCByZXBvc2l0b3J5IGlzIGVtcHR5XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IExpc3RJbWFnZXNDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmltYWdlSWRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdCBhbmQgaXMgdGFnZ2VkXG4gICAgYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUgfSkpXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuQ29udGVudHMpLnRvSGF2ZUxlbmd0aCgyKTsgLy8gYWxzbyB0aGUgQ0ZOIHRlbXBsYXRlXG4gICAgICAgIGNvbnN0IGtleSA9IHJlc3VsdC5Db250ZW50cyFbMF0uS2V5O1xuICAgICAgICBjb25zdCB0YWdzID0gYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgR2V0T2JqZWN0VGFnZ2luZ0NvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsIEtleToga2V5IH0pKTtcbiAgICAgICAgZXhwZWN0KHRhZ3MuVGFnU2V0KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDIpOyAvLyB0aGUgc2Vjb25kIHRhZyBjb21lcyBpbiBhcyBhIHNlY29uZCAnaWQnXG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gdW50YWdzIGluLXVzZSBzMyBvYmplY3RzJyxcbiAgd2l0aG91dEJvb3RzdHJhcChhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRvb2xraXRTdGFja05hbWUgPSBmaXh0dXJlLmJvb3RzdHJhcFN0YWNrTmFtZTtcbiAgICBjb25zdCBib290c3RyYXBCdWNrZXROYW1lID0gYGF3cy1jZGstZ2FyYmFnZS1jb2xsZWN0LWludGVnLXRlc3QtYmNrdC0ke3JhbmRvbVN0cmluZygpfWA7XG4gICAgZml4dHVyZS5yZW1lbWJlclRvRGVsZXRlQnVja2V0KGJvb3RzdHJhcEJ1Y2tldE5hbWUpOyAvLyBqdXN0IGluIGNhc2VcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrQm9vdHN0cmFwTW9kZXJuKHtcbiAgICAgIHRvb2xraXRTdGFja05hbWUsXG4gICAgICBib290c3RyYXBCdWNrZXROYW1lLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSB9KSk7XG4gICAgY29uc3Qga2V5ID0gcmVzdWx0LkNvbnRlbnRzIS5maWx0ZXIoKGMpID0+IGMuS2V5Py5zcGxpdCgnLicpWzFdID09ICd6aXAnKVswXS5LZXk7IC8vIGZhbmN5IGZvb3R3b3JrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBhc3NldCBrZXlcbiAgICBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBQdXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7XG4gICAgICBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgICBLZXk6IGtleSxcbiAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgVGFnU2V0OiBbe1xuICAgICAgICAgIEtleTogUzNfSVNPTEFURURfVEFHLFxuICAgICAgICAgIFZhbHVlOiAnMTIzNDUnLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgS2V5OiAnYm9ndXMnLFxuICAgICAgICAgIFZhbHVlOiAndmFsJyxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgaXNvbGF0ZWQgb2JqZWN0IHRhZyBpcyByZW1vdmVkIHdoaWxlIHRoZSBvdGhlciB0YWcgcmVtYWluc1xuICAgIGNvbnN0IG5ld1RhZ3MgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBHZXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSwgS2V5OiBrZXkgfSkpO1xuXG4gICAgZXhwZWN0KG5ld1RhZ3MuVGFnU2V0KS50b0VxdWFsKFt7XG4gICAgICBLZXk6ICdib2d1cycsXG4gICAgICBWYWx1ZTogJ3ZhbCcsXG4gICAgfV0pO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiB1bnRhZ3MgaW4tdXNlIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCBpbWFnZUlkcyA9IGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSk7XG4gICAgY29uc3QgZGlnZXN0ID0gaW1hZ2VJZHMuaW1hZ2VJZHMhWzBdLmltYWdlRGlnZXN0O1xuICAgIGNvbnN0IGltYWdlTWFuaWZlc3RzID0gYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IEJhdGNoR2V0SW1hZ2VDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLCBpbWFnZUlkczogW3sgaW1hZ2VEaWdlc3Q6IGRpZ2VzdCB9XSB9KSk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBpbWFnZU1hbmlmZXN0cy5pbWFnZXMhWzBdLmltYWdlTWFuaWZlc3Q7XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IFB1dEltYWdlQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSwgaW1hZ2VNYW5pZmVzdDogbWFuaWZlc3QsIGltYWdlRGlnZXN0OiBkaWdlc3QsIGltYWdlVGFnOiBgMC0ke0VDUl9JU09MQVRFRF9UQUd9LTEyMzQ1YCB9KSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDEpOyAvLyB0aGUgc2Vjb25kIHRhZyBoYXMgYmVlbiByZW1vdmVkXG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcbiJdfQ==
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { BatchGetImageCommand, ListImagesCommand, PutImageCommand } from '@aws-sdk/client-ecr';
|
|
2
|
+
import { GetObjectTaggingCommand, ListObjectsV2Command, PutObjectTaggingCommand } from '@aws-sdk/client-s3';
|
|
3
|
+
import { integTest, randomString, withoutBootstrap } from '../../lib';
|
|
4
|
+
|
|
5
|
+
const S3_ISOLATED_TAG = 'aws-cdk:isolated';
|
|
6
|
+
const ECR_ISOLATED_TAG = 'aws-cdk.isolated';
|
|
7
|
+
|
|
8
|
+
jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
|
|
9
|
+
|
|
10
|
+
integTest(
|
|
11
|
+
'Garbage Collection deletes unused s3 objects',
|
|
12
|
+
withoutBootstrap(async (fixture) => {
|
|
13
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
14
|
+
const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
|
|
15
|
+
fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
|
|
16
|
+
|
|
17
|
+
await fixture.cdkBootstrapModern({
|
|
18
|
+
toolkitStackName,
|
|
19
|
+
bootstrapBucketName,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
await fixture.cdkDeploy('lambda', {
|
|
23
|
+
options: [
|
|
24
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
25
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
26
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
27
|
+
'--force',
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
fixture.log('Setup complete!');
|
|
31
|
+
|
|
32
|
+
await fixture.cdkDestroy('lambda', {
|
|
33
|
+
options: [
|
|
34
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
35
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
36
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
37
|
+
'--force',
|
|
38
|
+
],
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await fixture.cdkGarbageCollect({
|
|
42
|
+
rollbackBufferDays: 0,
|
|
43
|
+
type: 's3',
|
|
44
|
+
bootstrapStackName: toolkitStackName,
|
|
45
|
+
});
|
|
46
|
+
fixture.log('Garbage collection complete!');
|
|
47
|
+
|
|
48
|
+
// assert that the bootstrap bucket is empty
|
|
49
|
+
await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
|
|
50
|
+
.then((result) => {
|
|
51
|
+
expect(result.Contents).toBeUndefined();
|
|
52
|
+
});
|
|
53
|
+
}),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
integTest(
|
|
57
|
+
'Garbage Collection deletes unused ecr images',
|
|
58
|
+
withoutBootstrap(async (fixture) => {
|
|
59
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
60
|
+
|
|
61
|
+
await fixture.cdkBootstrapModern({
|
|
62
|
+
toolkitStackName,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const repoName = await fixture.bootstrapRepoName();
|
|
66
|
+
|
|
67
|
+
await fixture.cdkDeploy('docker-in-use', {
|
|
68
|
+
options: [
|
|
69
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
70
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
71
|
+
'--force',
|
|
72
|
+
],
|
|
73
|
+
});
|
|
74
|
+
fixture.log('Setup complete!');
|
|
75
|
+
|
|
76
|
+
await fixture.cdkDestroy('docker-in-use', {
|
|
77
|
+
options: [
|
|
78
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
79
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
80
|
+
'--force',
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await fixture.cdkGarbageCollect({
|
|
85
|
+
rollbackBufferDays: 0,
|
|
86
|
+
type: 'ecr',
|
|
87
|
+
bootstrapStackName: toolkitStackName,
|
|
88
|
+
});
|
|
89
|
+
fixture.log('Garbage collection complete!');
|
|
90
|
+
|
|
91
|
+
// assert that the bootstrap repository is empty
|
|
92
|
+
await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
|
|
93
|
+
.then((result) => {
|
|
94
|
+
expect(result.imageIds).toEqual([]);
|
|
95
|
+
});
|
|
96
|
+
}),
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
integTest(
|
|
100
|
+
'Garbage Collection keeps in use s3 objects',
|
|
101
|
+
withoutBootstrap(async (fixture) => {
|
|
102
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
103
|
+
const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
|
|
104
|
+
fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
|
|
105
|
+
|
|
106
|
+
await fixture.cdkBootstrapModern({
|
|
107
|
+
toolkitStackName,
|
|
108
|
+
bootstrapBucketName,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
await fixture.cdkDeploy('lambda', {
|
|
112
|
+
options: [
|
|
113
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
114
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
115
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
116
|
+
'--force',
|
|
117
|
+
],
|
|
118
|
+
});
|
|
119
|
+
fixture.log('Setup complete!');
|
|
120
|
+
|
|
121
|
+
await fixture.cdkGarbageCollect({
|
|
122
|
+
rollbackBufferDays: 0,
|
|
123
|
+
type: 's3',
|
|
124
|
+
bootstrapStackName: toolkitStackName,
|
|
125
|
+
});
|
|
126
|
+
fixture.log('Garbage collection complete!');
|
|
127
|
+
|
|
128
|
+
// assert that the bootstrap bucket has the object
|
|
129
|
+
await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
|
|
130
|
+
.then((result) => {
|
|
131
|
+
expect(result.Contents).toHaveLength(1);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
await fixture.cdkDestroy('lambda', {
|
|
135
|
+
options: [
|
|
136
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
137
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
138
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
139
|
+
'--force',
|
|
140
|
+
],
|
|
141
|
+
});
|
|
142
|
+
fixture.log('Teardown complete!');
|
|
143
|
+
}),
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
integTest(
|
|
147
|
+
'Garbage Collection keeps in use ecr images',
|
|
148
|
+
withoutBootstrap(async (fixture) => {
|
|
149
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
150
|
+
|
|
151
|
+
await fixture.cdkBootstrapModern({
|
|
152
|
+
toolkitStackName,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const repoName = await fixture.bootstrapRepoName();
|
|
156
|
+
|
|
157
|
+
await fixture.cdkDeploy('docker-in-use', {
|
|
158
|
+
options: [
|
|
159
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
160
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
161
|
+
'--force',
|
|
162
|
+
],
|
|
163
|
+
});
|
|
164
|
+
fixture.log('Setup complete!');
|
|
165
|
+
|
|
166
|
+
await fixture.cdkGarbageCollect({
|
|
167
|
+
rollbackBufferDays: 0,
|
|
168
|
+
type: 'ecr',
|
|
169
|
+
bootstrapStackName: toolkitStackName,
|
|
170
|
+
});
|
|
171
|
+
fixture.log('Garbage collection complete!');
|
|
172
|
+
|
|
173
|
+
// assert that the bootstrap repository is empty
|
|
174
|
+
await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
|
|
175
|
+
.then((result) => {
|
|
176
|
+
expect(result.imageIds).toHaveLength(1);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
await fixture.cdkDestroy('docker-in-use', {
|
|
180
|
+
options: [
|
|
181
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
182
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
183
|
+
'--force',
|
|
184
|
+
],
|
|
185
|
+
});
|
|
186
|
+
}),
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
integTest(
|
|
190
|
+
'Garbage Collection tags unused s3 objects',
|
|
191
|
+
withoutBootstrap(async (fixture) => {
|
|
192
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
193
|
+
const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
|
|
194
|
+
fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
|
|
195
|
+
|
|
196
|
+
await fixture.cdkBootstrapModern({
|
|
197
|
+
toolkitStackName,
|
|
198
|
+
bootstrapBucketName,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
await fixture.cdkDeploy('lambda', {
|
|
202
|
+
options: [
|
|
203
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
204
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
205
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
206
|
+
'--force',
|
|
207
|
+
],
|
|
208
|
+
});
|
|
209
|
+
fixture.log('Setup complete!');
|
|
210
|
+
|
|
211
|
+
await fixture.cdkDestroy('lambda', {
|
|
212
|
+
options: [
|
|
213
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
214
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
215
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
216
|
+
'--force',
|
|
217
|
+
],
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
await fixture.cdkGarbageCollect({
|
|
221
|
+
rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
|
|
222
|
+
type: 's3',
|
|
223
|
+
bootstrapStackName: toolkitStackName,
|
|
224
|
+
});
|
|
225
|
+
fixture.log('Garbage collection complete!');
|
|
226
|
+
|
|
227
|
+
// assert that the bootstrap bucket has the object and is tagged
|
|
228
|
+
await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
|
|
229
|
+
.then(async (result) => {
|
|
230
|
+
expect(result.Contents).toHaveLength(2); // also the CFN template
|
|
231
|
+
const key = result.Contents![0].Key;
|
|
232
|
+
const tags = await fixture.aws.s3.send(new GetObjectTaggingCommand({ Bucket: bootstrapBucketName, Key: key }));
|
|
233
|
+
expect(tags.TagSet).toHaveLength(1);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
await fixture.cdkDestroy('lambda', {
|
|
237
|
+
options: [
|
|
238
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
239
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
240
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
241
|
+
'--force',
|
|
242
|
+
],
|
|
243
|
+
});
|
|
244
|
+
}),
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
integTest(
|
|
248
|
+
'Garbage Collection tags unused ecr images',
|
|
249
|
+
withoutBootstrap(async (fixture) => {
|
|
250
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
251
|
+
|
|
252
|
+
await fixture.cdkBootstrapModern({
|
|
253
|
+
toolkitStackName,
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
const repoName = await fixture.bootstrapRepoName();
|
|
257
|
+
|
|
258
|
+
await fixture.cdkDeploy('docker-in-use', {
|
|
259
|
+
options: [
|
|
260
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
261
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
262
|
+
'--force',
|
|
263
|
+
],
|
|
264
|
+
});
|
|
265
|
+
fixture.log('Setup complete!');
|
|
266
|
+
|
|
267
|
+
await fixture.cdkDestroy('docker-in-use', {
|
|
268
|
+
options: [
|
|
269
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
270
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
271
|
+
'--force',
|
|
272
|
+
],
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
await fixture.cdkGarbageCollect({
|
|
276
|
+
rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
|
|
277
|
+
type: 'ecr',
|
|
278
|
+
bootstrapStackName: toolkitStackName,
|
|
279
|
+
});
|
|
280
|
+
fixture.log('Garbage collection complete!');
|
|
281
|
+
|
|
282
|
+
await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
|
|
283
|
+
.then((result) => {
|
|
284
|
+
expect(result.imageIds).toHaveLength(2); // the second tag comes in as a second 'id'
|
|
285
|
+
});
|
|
286
|
+
}),
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
integTest(
|
|
290
|
+
'Garbage Collection untags in-use s3 objects',
|
|
291
|
+
withoutBootstrap(async (fixture) => {
|
|
292
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
293
|
+
const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
|
|
294
|
+
fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
|
|
295
|
+
|
|
296
|
+
await fixture.cdkBootstrapModern({
|
|
297
|
+
toolkitStackName,
|
|
298
|
+
bootstrapBucketName,
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
await fixture.cdkDeploy('lambda', {
|
|
302
|
+
options: [
|
|
303
|
+
'--context', `bootstrapBucket=${bootstrapBucketName}`,
|
|
304
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
305
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
306
|
+
'--force',
|
|
307
|
+
],
|
|
308
|
+
});
|
|
309
|
+
fixture.log('Setup complete!');
|
|
310
|
+
|
|
311
|
+
// Artificially add tagging to the asset in the bootstrap bucket
|
|
312
|
+
const result = await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }));
|
|
313
|
+
const key = result.Contents!.filter((c) => c.Key?.split('.')[1] == 'zip')[0].Key; // fancy footwork to make sure we have the asset key
|
|
314
|
+
await fixture.aws.s3.send(new PutObjectTaggingCommand({
|
|
315
|
+
Bucket: bootstrapBucketName,
|
|
316
|
+
Key: key,
|
|
317
|
+
Tagging: {
|
|
318
|
+
TagSet: [{
|
|
319
|
+
Key: S3_ISOLATED_TAG,
|
|
320
|
+
Value: '12345',
|
|
321
|
+
}, {
|
|
322
|
+
Key: 'bogus',
|
|
323
|
+
Value: 'val',
|
|
324
|
+
}],
|
|
325
|
+
},
|
|
326
|
+
}));
|
|
327
|
+
|
|
328
|
+
await fixture.cdkGarbageCollect({
|
|
329
|
+
rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
|
|
330
|
+
type: 's3',
|
|
331
|
+
bootstrapStackName: toolkitStackName,
|
|
332
|
+
});
|
|
333
|
+
fixture.log('Garbage collection complete!');
|
|
334
|
+
|
|
335
|
+
// assert that the isolated object tag is removed while the other tag remains
|
|
336
|
+
const newTags = await fixture.aws.s3.send(new GetObjectTaggingCommand({ Bucket: bootstrapBucketName, Key: key }));
|
|
337
|
+
|
|
338
|
+
expect(newTags.TagSet).toEqual([{
|
|
339
|
+
Key: 'bogus',
|
|
340
|
+
Value: 'val',
|
|
341
|
+
}]);
|
|
342
|
+
}),
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
integTest(
|
|
346
|
+
'Garbage Collection untags in-use ecr images',
|
|
347
|
+
withoutBootstrap(async (fixture) => {
|
|
348
|
+
const toolkitStackName = fixture.bootstrapStackName;
|
|
349
|
+
|
|
350
|
+
await fixture.cdkBootstrapModern({
|
|
351
|
+
toolkitStackName,
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
const repoName = await fixture.bootstrapRepoName();
|
|
355
|
+
|
|
356
|
+
await fixture.cdkDeploy('docker-in-use', {
|
|
357
|
+
options: [
|
|
358
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
359
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
360
|
+
'--force',
|
|
361
|
+
],
|
|
362
|
+
});
|
|
363
|
+
fixture.log('Setup complete!');
|
|
364
|
+
|
|
365
|
+
// Artificially add tagging to the asset in the bootstrap bucket
|
|
366
|
+
const imageIds = await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }));
|
|
367
|
+
const digest = imageIds.imageIds![0].imageDigest;
|
|
368
|
+
const imageManifests = await fixture.aws.ecr.send(new BatchGetImageCommand({ repositoryName: repoName, imageIds: [{ imageDigest: digest }] }));
|
|
369
|
+
const manifest = imageManifests.images![0].imageManifest;
|
|
370
|
+
await fixture.aws.ecr.send(new PutImageCommand({ repositoryName: repoName, imageManifest: manifest, imageDigest: digest, imageTag: `0-${ECR_ISOLATED_TAG}-12345` }));
|
|
371
|
+
|
|
372
|
+
await fixture.cdkGarbageCollect({
|
|
373
|
+
rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
|
|
374
|
+
type: 'ecr',
|
|
375
|
+
bootstrapStackName: toolkitStackName,
|
|
376
|
+
});
|
|
377
|
+
fixture.log('Garbage collection complete!');
|
|
378
|
+
|
|
379
|
+
await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
|
|
380
|
+
.then((result) => {
|
|
381
|
+
expect(result.imageIds).toHaveLength(1); // the second tag has been removed
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
await fixture.cdkDestroy('docker-in-use', {
|
|
385
|
+
options: [
|
|
386
|
+
'--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
|
|
387
|
+
'--toolkit-stack-name', toolkitStackName,
|
|
388
|
+
'--force',
|
|
389
|
+
],
|
|
390
|
+
});
|
|
391
|
+
}),
|
|
392
|
+
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
|
|
2
|
+
|
|
3
|
+
['app', 'sample-app'].forEach(template => {
|
|
4
|
+
integTest(`init C♯ ${template}`, withTemporaryDirectory(withPackages(async (context) => {
|
|
5
|
+
context.packages.assertJsiiPackagesAvailable();
|
|
6
|
+
|
|
7
|
+
const shell = ShellHelper.fromContext(context);
|
|
8
|
+
await context.packages.makeCliAvailable();
|
|
9
|
+
|
|
10
|
+
await shell.shell(['cdk', 'init', '-l', 'csharp', template]);
|
|
11
|
+
await context.packages.initializeDotnetPackages(context.integTestDir);
|
|
12
|
+
await shell.shell(['cdk', 'synth']);
|
|
13
|
+
})));
|
|
14
|
+
});
|
|
15
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
|
|
2
|
+
|
|
3
|
+
['app', 'sample-app'].forEach(template => {
|
|
4
|
+
integTest(`init F♯ ${template}`, withTemporaryDirectory(withPackages(async (context) => {
|
|
5
|
+
context.packages.assertJsiiPackagesAvailable();
|
|
6
|
+
|
|
7
|
+
const shell = ShellHelper.fromContext(context);
|
|
8
|
+
await context.packages.makeCliAvailable();
|
|
9
|
+
|
|
10
|
+
await shell.shell(['cdk', 'init', '-l', 'fsharp', template]);
|
|
11
|
+
await context.packages.initializeDotnetPackages(context.integTestDir);
|
|
12
|
+
await shell.shell(['cdk', 'synth']);
|
|
13
|
+
})));
|
|
14
|
+
});
|
|
15
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
|
|
2
|
+
|
|
3
|
+
['app', 'sample-app'].forEach(template => {
|
|
4
|
+
integTest(`init go ${template}`, withTemporaryDirectory(withPackages(async (context) => {
|
|
5
|
+
const isCanary = !!process.env.IS_CANARY;
|
|
6
|
+
context.packages.assertJsiiPackagesAvailable();
|
|
7
|
+
|
|
8
|
+
const shell = ShellHelper.fromContext(context);
|
|
9
|
+
await context.packages.makeCliAvailable();
|
|
10
|
+
|
|
11
|
+
await shell.shell(['cdk', 'init', '-l', 'go', template]);
|
|
12
|
+
|
|
13
|
+
// Canaries will use the generated go.mod as is
|
|
14
|
+
// For pipeline tests we replace the source with the locally build one
|
|
15
|
+
if (!isCanary) {
|
|
16
|
+
await shell.shell(['go', 'mod', 'edit', '-replace', 'github.com/aws/aws-cdk-go/awscdk/v2=$CODEBUILD_SRC_DIR/go/awscdk']);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
await shell.shell(['go', 'mod', 'tidy']);
|
|
20
|
+
await shell.shell(['go', 'test']);
|
|
21
|
+
await shell.shell(['cdk', 'synth']);
|
|
22
|
+
})));
|
|
23
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
|
|
2
|
+
|
|
3
|
+
['app', 'sample-app'].forEach(template => {
|
|
4
|
+
integTest(`init java ${template}`, withTemporaryDirectory(withPackages(async (context) => {
|
|
5
|
+
context.packages.assertJsiiPackagesAvailable();
|
|
6
|
+
|
|
7
|
+
const shell = ShellHelper.fromContext(context);
|
|
8
|
+
await context.packages.makeCliAvailable();
|
|
9
|
+
|
|
10
|
+
await shell.shell(['cdk', 'init', '-l', 'java', template]);
|
|
11
|
+
await shell.shell(['mvn', 'package']);
|
|
12
|
+
await shell.shell(['cdk', 'synth']);
|
|
13
|
+
})));
|
|
14
|
+
});
|