@macedon-technologies/batman 1.9.2 → 1.11.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/.jsii +19 -112
- package/API.md +51 -10
- package/lib/BatmanProject.js +4 -132
- package/lib/BootcampApplication.js +3 -3
- package/lib/BootcampApplicationStackFile.js +14 -6
- package/lib/BootcampBaseApplicationStackFile.d.ts +5 -0
- package/lib/BootcampBaseApplicationStackFile.js +200 -0
- package/lib/BootcampProject.d.ts +3 -25
- package/lib/BootcampProject.js +6 -133
- package/lib/CodeOwnersFile.js +1 -1
- package/lib/ProductionDeployWorkflow.js +1 -1
- package/lib/StagingDeployWorkflow.js +1 -1
- package/lib/utils.d.ts +1 -0
- package/lib/utils.js +132 -1
- package/package.json +8 -8
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.BootcampApplication = void 0;
|
|
4
4
|
const ApiConstructFile_1 = require("./ApiConstructFile");
|
|
5
5
|
const ApiFunctionFile_1 = require("./ApiFunctionFile");
|
|
6
|
-
const BaseApplicationStackFile_1 = require("./BaseApplicationStackFile");
|
|
7
6
|
const BootcampApplicationStackFile_1 = require("./BootcampApplicationStackFile");
|
|
7
|
+
const BootcampBaseApplicationStackFile_1 = require("./BootcampBaseApplicationStackFile");
|
|
8
8
|
const CodeRabbitFile_1 = require("./CodeRabbitFile");
|
|
9
9
|
const GitHubRolesStackFile_1 = require("./GitHubRolesStackFile");
|
|
10
10
|
const LocalDevAppFile_1 = require("./LocalDevAppFile");
|
|
@@ -36,7 +36,7 @@ class BootcampApplication {
|
|
|
36
36
|
new GitHubRolesStackFile_1.GitHubRolesStackFile(project, {
|
|
37
37
|
githubRepository: options.githubRepository,
|
|
38
38
|
});
|
|
39
|
-
new
|
|
39
|
+
new BootcampBaseApplicationStackFile_1.BootcampBaseApplicationStackFile(project);
|
|
40
40
|
new BootcampApplicationStackFile_1.BootcampApplicationStackFile(project);
|
|
41
41
|
// Create construct files
|
|
42
42
|
new ApiConstructFile_1.ApiConstructFile(project);
|
|
@@ -73,4 +73,4 @@ class BootcampApplication {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
exports.BootcampApplication = BootcampApplication;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9vdGNhbXBBcHBsaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Cb290Y2FtcEFwcGxpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlEQUFzRDtBQUN0RCx1REFBb0Q7QUFDcEQsaUZBQThFO0FBQzlFLHlGQUFzRjtBQUN0RixxREFBa0Q7QUFDbEQsaUVBQThEO0FBQzlELHVEQUFvRDtBQUNwRCx5Q0FBeUQ7QUFDekQsaURBQThDO0FBQzlDLDJEQUF3RDtBQUN4RCx5REFBc0Q7QUFDdEQseUVBQXNFO0FBQ3RFLG1FQUFnRTtBQUNoRSw2RUFBMEU7QUFjMUU7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtJQUM5QixZQUFZLE9BQTRCLEVBQUUsT0FBMkI7UUFDbkUsZ0NBQWdDO1FBRWhDLElBQUksbUJBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDcEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3pCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztZQUNoQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztTQUN2QyxDQUFDLENBQUM7UUFFSCxJQUFJLGlDQUFlLENBQUMsT0FBTyxFQUFFO1lBQzNCLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSTtZQUN6QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7U0FDakIsQ0FBQyxDQUFDO1FBRUgscUJBQXFCO1FBQ3JCLElBQUksMkNBQW9CLENBQUMsT0FBTyxFQUFFO1lBQ2hDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxtRUFBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFJLDJEQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLHlCQUF5QjtRQUN6QixJQUFJLG1DQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksdURBQTBCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEMsdUJBQXVCO1FBQ3ZCLElBQUksaUNBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QixvQkFBb0I7UUFDcEIsSUFBSSwyQkFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFCLHNCQUFzQjtRQUN0QixJQUFJLCtCQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUIsa0NBQWtDO1FBQ2xDLElBQUksbUNBQWdCLENBQUMsT0FBTyxFQUFFO1lBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtZQUN4QyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQzdCLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CO1NBQ3JELENBQUMsQ0FBQztRQUVILElBQUkscUNBQWlCLENBQUMsT0FBTyxFQUFFO1lBQzdCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtZQUN4QyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQzdCLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxJQUFJLDZDQUFxQixDQUFDLE9BQU8sRUFBRTtZQUNqQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7WUFDNUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNqQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDekIsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7U0FDekQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxtREFBd0IsQ0FBQyxPQUFPLEVBQUU7WUFDcEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1lBQ3pDLFNBQVMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDOUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3pCLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpFRCxrREFpRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuaW1wb3J0IHsgQXBpQ29uc3RydWN0RmlsZSB9IGZyb20gJy4vQXBpQ29uc3RydWN0RmlsZSc7XG5pbXBvcnQgeyBBcGlGdW5jdGlvbkZpbGUgfSBmcm9tICcuL0FwaUZ1bmN0aW9uRmlsZSc7XG5pbXBvcnQgeyBCb290Y2FtcEFwcGxpY2F0aW9uU3RhY2tGaWxlIH0gZnJvbSAnLi9Cb290Y2FtcEFwcGxpY2F0aW9uU3RhY2tGaWxlJztcbmltcG9ydCB7IEJvb3RjYW1wQmFzZUFwcGxpY2F0aW9uU3RhY2tGaWxlIH0gZnJvbSAnLi9Cb290Y2FtcEJhc2VBcHBsaWNhdGlvblN0YWNrRmlsZSc7XG5pbXBvcnQgeyBDb2RlUmFiYml0RmlsZSB9IGZyb20gJy4vQ29kZVJhYmJpdEZpbGUnO1xuaW1wb3J0IHsgR2l0SHViUm9sZXNTdGFja0ZpbGUgfSBmcm9tICcuL0dpdEh1YlJvbGVzU3RhY2tGaWxlJztcbmltcG9ydCB7IExvY2FsRGV2QXBwRmlsZSB9IGZyb20gJy4vTG9jYWxEZXZBcHBGaWxlJztcbmltcG9ydCB7IEVudmlyb25tZW50Q29uZmlnLCBNYWluRmlsZSB9IGZyb20gJy4vTWFpbkZpbGUnO1xuaW1wb3J0IHsgTWFpblRlc3RGaWxlIH0gZnJvbSAnLi9NYWluVGVzdEZpbGUnO1xuaW1wb3J0IHsgUHJDbGVhbnVwV29ya2Zsb3cgfSBmcm9tICcuL1ByQ2xlYW51cFdvcmtmbG93JztcbmltcG9ydCB7IFByRGVwbG95V29ya2Zsb3cgfSBmcm9tICcuL1ByRGVwbG95V29ya2Zsb3cnO1xuaW1wb3J0IHsgUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93IH0gZnJvbSAnLi9Qcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cnO1xuaW1wb3J0IHsgU3RhZ2luZ0RlcGxveVdvcmtmbG93IH0gZnJvbSAnLi9TdGFnaW5nRGVwbG95V29ya2Zsb3cnO1xuaW1wb3J0IHsgU3RhdGljV2Vic2l0ZUNvbnN0cnVjdEZpbGUgfSBmcm9tICcuL1N0YXRpY1dlYnNpdGVDb25zdHJ1Y3RGaWxlJztcblxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkVudmlyb25tZW50Q29uZmlnIGV4dGVuZHMgRW52aXJvbm1lbnRDb25maWcge1xuICByZWFkb25seSBnaXRodWJBY3Rpb25Sb2xlQXJuOiBgYXJuOmF3czppYW06OiR7c3RyaW5nfTpyb2xlLyR7c3RyaW5nfWA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25PcHRpb25zIHtcbiAgcmVhZG9ubHkgZ2l0aHViUmVwb3NpdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBkZXY6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG4gIHJlYWRvbmx5IHN0YWdpbmc6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG4gIHJlYWRvbmx5IHByb2Q6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxUYWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBcHBsaWNhdGlvbiBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIGFsbCBzdGFuZGFyZCBwcm9qZWN0IGZpbGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBCb290Y2FtcEFwcGxpY2F0aW9uIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCwgb3B0aW9uczogQXBwbGljYXRpb25PcHRpb25zKSB7XG4gICAgLy8gQ3JlYXRlIG1haW4gZW50cnkgcG9pbnQgZmlsZXNcblxuICAgIG5ldyBNYWluRmlsZShwcm9qZWN0LCB7XG4gICAgICBwcm9qZWN0TmFtZTogcHJvamVjdC5uYW1lLFxuICAgICAgZGV2OiBvcHRpb25zLmRldixcbiAgICAgIHN0YWdpbmc6IG9wdGlvbnMuc3RhZ2luZyxcbiAgICAgIHByb2Q6IG9wdGlvbnMucHJvZCxcbiAgICAgIGFkZGl0aW9uYWxUYWdzOiBvcHRpb25zLmFkZGl0aW9uYWxUYWdzLFxuICAgIH0pO1xuXG4gICAgbmV3IExvY2FsRGV2QXBwRmlsZShwcm9qZWN0LCB7XG4gICAgICBwcm9qZWN0TmFtZTogcHJvamVjdC5uYW1lLFxuICAgICAgZGV2OiBvcHRpb25zLmRldixcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBzdGFjayBmaWxlc1xuICAgIG5ldyBHaXRIdWJSb2xlc1N0YWNrRmlsZShwcm9qZWN0LCB7XG4gICAgICBnaXRodWJSZXBvc2l0b3J5OiBvcHRpb25zLmdpdGh1YlJlcG9zaXRvcnksXG4gICAgfSk7XG5cbiAgICBuZXcgQm9vdGNhbXBCYXNlQXBwbGljYXRpb25TdGFja0ZpbGUocHJvamVjdCk7XG4gICAgbmV3IEJvb3RjYW1wQXBwbGljYXRpb25TdGFja0ZpbGUocHJvamVjdCk7XG5cbiAgICAvLyBDcmVhdGUgY29uc3RydWN0IGZpbGVzXG4gICAgbmV3IEFwaUNvbnN0cnVjdEZpbGUocHJvamVjdCk7XG4gICAgbmV3IFN0YXRpY1dlYnNpdGVDb25zdHJ1Y3RGaWxlKHByb2plY3QpO1xuXG4gICAgLy8gQ3JlYXRlIGhhbmRsZXIgZmlsZXNcbiAgICBuZXcgQXBpRnVuY3Rpb25GaWxlKHByb2plY3QpO1xuXG4gICAgLy8gQ3JlYXRlIHRlc3QgZmlsZXNcbiAgICBuZXcgTWFpblRlc3RGaWxlKHByb2plY3QpO1xuXG4gICAgLy8gQ3JlYXRlIGNvbmZpZyBmaWxlc1xuICAgIG5ldyBDb2RlUmFiYml0RmlsZShwcm9qZWN0KTtcblxuICAgIC8vIENyZWF0ZSBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3NcbiAgICBuZXcgUHJEZXBsb3lXb3JrZmxvdyhwcm9qZWN0LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLmRldi5naXRodWJBY3Rpb25Sb2xlQXJuLFxuICAgICAgYXdzUmVnaW9uOiBvcHRpb25zLmRldi5yZWdpb24sXG4gICAgICBjbGVya1B1Ymxpc2hhYmxlS2V5OiBvcHRpb25zLmRldi5jbGVya1B1Ymxpc2hhYmxlS2V5LFxuICAgIH0pO1xuXG4gICAgbmV3IFByQ2xlYW51cFdvcmtmbG93KHByb2plY3QsIHtcbiAgICAgIHJvbGVBcm46IG9wdGlvbnMuZGV2LmdpdGh1YkFjdGlvblJvbGVBcm4sXG4gICAgICBhd3NSZWdpb246IG9wdGlvbnMuZGV2LnJlZ2lvbixcbiAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG4gICAgfSk7XG5cbiAgICBuZXcgU3RhZ2luZ0RlcGxveVdvcmtmbG93KHByb2plY3QsIHtcbiAgICAgIHJvbGVBcm46IG9wdGlvbnMuc3RhZ2luZy5naXRodWJBY3Rpb25Sb2xlQXJuLFxuICAgICAgYXdzUmVnaW9uOiBvcHRpb25zLnN0YWdpbmcucmVnaW9uLFxuICAgICAgcHJvamVjdE5hbWU6IHByb2plY3QubmFtZSxcbiAgICAgIGNsZXJrUHVibGlzaGFibGVLZXk6IG9wdGlvbnMuc3RhZ2luZy5jbGVya1B1Ymxpc2hhYmxlS2V5LFxuICAgIH0pO1xuXG4gICAgbmV3IFByb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyhwcm9qZWN0LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLnByb2QuZ2l0aHViQWN0aW9uUm9sZUFybixcbiAgICAgIGF3c1JlZ2lvbjogb3B0aW9ucy5wcm9kLnJlZ2lvbixcbiAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG4gICAgICBjbGVya1B1Ymxpc2hhYmxlS2V5OiBvcHRpb25zLnByb2QuY2xlcmtQdWJsaXNoYWJsZUtleSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -27,6 +27,9 @@ export interface ApplicationStackProps extends BaseApplicationStackProps {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export class ApplicationStack extends BaseApplicationStack<ApplicationStackProps> {
|
|
30
|
+
private databaseName: string;
|
|
31
|
+
private username: string;
|
|
32
|
+
|
|
30
33
|
constructor(scope: Construct, id: string, props: ApplicationStackProps) {
|
|
31
34
|
super(scope, id, props);
|
|
32
35
|
// extend the stack by adding constructs here
|
|
@@ -62,15 +65,18 @@ export class ApplicationStack extends BaseApplicationStack<ApplicationStackProps
|
|
|
62
65
|
logger: true,
|
|
63
66
|
});
|
|
64
67
|
|
|
68
|
+
this.databaseName = this.getDatabaseName('${project.name}');
|
|
69
|
+
this.username = this.getUsername('${project.name}');
|
|
70
|
+
|
|
65
71
|
const sqlDatabase = new Database(this, '${project.name}-db', {
|
|
66
|
-
databaseName:
|
|
72
|
+
databaseName: this.databaseName,
|
|
67
73
|
provider: provider,
|
|
68
74
|
});
|
|
69
75
|
|
|
70
76
|
const role = new Role(this, 'Role', {
|
|
71
77
|
provider: provider,
|
|
72
|
-
roleName:
|
|
73
|
-
databaseName:
|
|
78
|
+
roleName: this.username,
|
|
79
|
+
databaseName: this.databaseName,
|
|
74
80
|
enableIamAuth: true,
|
|
75
81
|
});
|
|
76
82
|
role.node.addDependency(sqlDatabase);
|
|
@@ -78,8 +84,10 @@ export class ApplicationStack extends BaseApplicationStack<ApplicationStackProps
|
|
|
78
84
|
|
|
79
85
|
// Add environment variables pointing to the proxy endpoint
|
|
80
86
|
this.api.lambdaFunction.addEnvironment('DB_ENDPOINT', this.props.database.proxyEndpoint);
|
|
81
|
-
this.api.lambdaFunction.addEnvironment('DB_USER',
|
|
87
|
+
this.api.lambdaFunction.addEnvironment('DB_USER', this.username);
|
|
82
88
|
this.api.lambdaFunction.addEnvironment('DB_PORT', this.props.database.port.toString());
|
|
89
|
+
this.api.lambdaFunction.addEnvironment('DB_DATABASE_NAME', this.databaseName);
|
|
90
|
+
|
|
83
91
|
|
|
84
92
|
// Grant Lambda IAM auth to connect through the proxy
|
|
85
93
|
this.api.lambdaFunction.addToRolePolicy(new PolicyStatement({
|
|
@@ -91,7 +99,7 @@ export class ApplicationStack extends BaseApplicationStack<ApplicationStackProps
|
|
|
91
99
|
resource: 'dbuser',
|
|
92
100
|
partition: 'aws',
|
|
93
101
|
arnFormat: ArnFormat.COLON_RESOURCE_NAME,
|
|
94
|
-
resourceName: \`\${Fn.importValue('BootcampDbProxyId')}
|
|
102
|
+
resourceName: \`\${Fn.importValue('BootcampDbProxyId')}/\${this.username}\`,
|
|
95
103
|
})],
|
|
96
104
|
effect: Effect.ALLOW,
|
|
97
105
|
}));
|
|
@@ -102,4 +110,4 @@ export class ApplicationStack extends BaseApplicationStack<ApplicationStackProps
|
|
|
102
110
|
}
|
|
103
111
|
}
|
|
104
112
|
exports.BootcampApplicationStackFile = BootcampApplicationStackFile;
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9vdGNhbXBBcHBsaWNhdGlvblN0YWNrRmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Cb290Y2FtcEFwcGxpY2F0aW9uU3RhY2tGaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUdwQyxNQUFhLDRCQUE2QixTQUFRLG1CQUFVO0lBQzFELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRTtZQUMvQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnREE0RGdDLE9BQU8sQ0FBQyxJQUFJO3dDQUNwQixPQUFPLENBQUMsSUFBSTs7OENBRU4sT0FBTyxDQUFDLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxQ3pEO1NBQ0ksQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBMUdELG9FQTBHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbXBsZUZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuZXhwb3J0IGNsYXNzIEJvb3RjYW1wQXBwbGljYXRpb25TdGFja0ZpbGUgZXh0ZW5kcyBTYW1wbGVGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCkge1xuICAgIHN1cGVyKHByb2plY3QsICdzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHMnLCB7XG4gICAgICBjb250ZW50czogYGltcG9ydCB7IEFybiwgQXJuRm9ybWF0LCBGbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwLCBTdWJuZXRUeXBlLCBWcGMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBEYXRhYmFzZUluc3RhbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJkcyc7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgRGF0YWJhc2UsIFByb3ZpZGVyLCBSb2xlIH0gZnJvbSAnY2RrLXJkcy1zcWwnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNlQXBwbGljYXRpb25TdGFjaywgQmFzZUFwcGxpY2F0aW9uU3RhY2tQcm9wcyB9IGZyb20gJy4vQmFzZUFwcGxpY2F0aW9uU3RhY2snO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uU3RhY2tQcm9wcyBleHRlbmRzIEJhc2VBcHBsaWNhdGlvblN0YWNrUHJvcHMge1xuICByZWFkb25seSBkYXRhYmFzZToge1xuICAgIHByb3h5RW5kcG9pbnQ6IHN0cmluZztcbiAgICByb290U2VjcmV0QXJuOiBcXGBhcm46YXdzOnNlY3JldHNtYW5hZ2VyOlxcJHtzdHJpbmd9OlxcJHtzdHJpbmd9OnNlY3JldDpcXCR7c3RyaW5nfS1cXCR7c3RyaW5nfS1cXCR7c3RyaW5nfVxcYDtcbiAgICBpbnN0YW5jZUlkZW50aWZpZXI6IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgZGF0YWJhc2VFbmRwb2ludEFkZHJlc3M6IHN0cmluZztcbiAgICBzZWN1cml0eUdyb3VwOiBcXGBzZy1cXCR7c3RyaW5nfVxcYDtcbiAgfTtcbiAgcmVhZG9ubHkgdnBjSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uU3RhY2sgZXh0ZW5kcyBCYXNlQXBwbGljYXRpb25TdGFjazxBcHBsaWNhdGlvblN0YWNrUHJvcHM+IHtcbiAgcHJpdmF0ZSBkYXRhYmFzZU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBcHBsaWNhdGlvblN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICAvLyBleHRlbmQgdGhlIHN0YWNrIGJ5IGFkZGluZyBjb25zdHJ1Y3RzIGhlcmVcbiAgICB0aGlzLmNyZWF0ZURhdGFiYXNlKCk7XG4gIH1cbiAgXG4gIHByb3RlY3RlZCBjcmVhdGVWcGMoKSB7XG4gICAgdGhpcy52cGMgPSBWcGMuZnJvbUxvb2t1cCh0aGlzLCAnVnBjJywge1xuICAgICAgdnBjSWQ6IHRoaXMucHJvcHMudnBjSWQsXG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZURhdGFiYXNlKCkge1xuXG4gICAgY29uc3QgZGF0YWJhc2VTZWN1cml0eUdyb3VwID0gU2VjdXJpdHlHcm91cC5mcm9tU2VjdXJpdHlHcm91cElkKHRoaXMsICdEYXRhYmFzZVNlY3VyaXR5R3JvdXAnLCB0aGlzLnByb3BzLmRhdGFiYXNlLnNlY3VyaXR5R3JvdXApO1xuXG4gICAgY29uc3QgZGF0YWJhc2UgPSBEYXRhYmFzZUluc3RhbmNlLmZyb21EYXRhYmFzZUluc3RhbmNlQXR0cmlidXRlcyh0aGlzLCAnRGF0YWJhc2UnLCB7XG4gICAgICBpbnN0YW5jZUVuZHBvaW50QWRkcmVzczogdGhpcy5wcm9wcy5kYXRhYmFzZS5kYXRhYmFzZUVuZHBvaW50QWRkcmVzcyxcbiAgICAgIHBvcnQ6IHRoaXMucHJvcHMuZGF0YWJhc2UucG9ydCxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbZGF0YWJhc2VTZWN1cml0eUdyb3VwXSxcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogdGhpcy5wcm9wcy5kYXRhYmFzZS5pbnN0YW5jZUlkZW50aWZpZXIsXG5cbiAgICB9KTtcblxuICAgIGNvbnN0IHNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0Q29tcGxldGVBcm4odGhpcywgJ0RhdGFiYXNlUm9vdFNlY3JldCcsIHRoaXMucHJvcHMuZGF0YWJhc2Uucm9vdFNlY3JldEFybik7XG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnUHJvdmlkZXInLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgY2x1c3RlcjogZGF0YWJhc2UsXG4gICAgICBzZWNyZXQ6IHNlY3JldCxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTLFxuICAgICAgfSxcbiAgICAgIGxvZ2dlcjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YWJhc2VOYW1lID0gdGhpcy5nZXREYXRhYmFzZU5hbWUoJyR7cHJvamVjdC5uYW1lfScpO1xuICAgIHRoaXMudXNlcm5hbWUgPSB0aGlzLmdldFVzZXJuYW1lKCcke3Byb2plY3QubmFtZX0nKTtcblxuICAgIGNvbnN0IHNxbERhdGFiYXNlID0gbmV3IERhdGFiYXNlKHRoaXMsICcke3Byb2plY3QubmFtZX0tZGInLCB7XG4gICAgICBkYXRhYmFzZU5hbWU6IHRoaXMuZGF0YWJhc2VOYW1lLFxuICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgcm9sZSA9IG5ldyBSb2xlKHRoaXMsICdSb2xlJywge1xuICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyLFxuICAgICAgcm9sZU5hbWU6IHRoaXMudXNlcm5hbWUsXG4gICAgICBkYXRhYmFzZU5hbWU6IHRoaXMuZGF0YWJhc2VOYW1lLFxuICAgICAgZW5hYmxlSWFtQXV0aDogdHJ1ZSxcbiAgICB9KTtcbiAgICByb2xlLm5vZGUuYWRkRGVwZW5kZW5jeShzcWxEYXRhYmFzZSk7XG5cblxuICAgIC8vIEFkZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcG9pbnRpbmcgdG8gdGhlIHByb3h5IGVuZHBvaW50XG4gICAgdGhpcy5hcGkubGFtYmRhRnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoJ0RCX0VORFBPSU5UJywgdGhpcy5wcm9wcy5kYXRhYmFzZS5wcm94eUVuZHBvaW50KTtcbiAgICB0aGlzLmFwaS5sYW1iZGFGdW5jdGlvbi5hZGRFbnZpcm9ubWVudCgnREJfVVNFUicsIHRoaXMudXNlcm5hbWUpO1xuICAgIHRoaXMuYXBpLmxhbWJkYUZ1bmN0aW9uLmFkZEVudmlyb25tZW50KCdEQl9QT1JUJywgdGhpcy5wcm9wcy5kYXRhYmFzZS5wb3J0LnRvU3RyaW5nKCkpO1xuICAgIHRoaXMuYXBpLmxhbWJkYUZ1bmN0aW9uLmFkZEVudmlyb25tZW50KCdEQl9EQVRBQkFTRV9OQU1FJywgdGhpcy5kYXRhYmFzZU5hbWUpO1xuICAgIFxuXG4gICAgLy8gR3JhbnQgTGFtYmRhIElBTSBhdXRoIHRvIGNvbm5lY3QgdGhyb3VnaCB0aGUgcHJveHlcbiAgICB0aGlzLmFwaS5sYW1iZGFGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbJ3Jkcy1kYjpjb25uZWN0J10sXG4gICAgICByZXNvdXJjZXM6IFtBcm4uZm9ybWF0KHtcbiAgICAgICAgYWNjb3VudDogU3RhY2sub2YodGhpcykuYWNjb3VudCxcbiAgICAgICAgcmVnaW9uOiBTdGFjay5vZih0aGlzKS5yZWdpb24sXG4gICAgICAgIHNlcnZpY2U6ICdyZHMtZGInLFxuICAgICAgICByZXNvdXJjZTogJ2RidXNlcicsXG4gICAgICAgIHBhcnRpdGlvbjogJ2F3cycsXG4gICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICAgIHJlc291cmNlTmFtZTogXFxgXFwke0ZuLmltcG9ydFZhbHVlKCdCb290Y2FtcERiUHJveHlJZCcpfS9cXCR7dGhpcy51c2VybmFtZX1cXGAsXG4gICAgICB9KV0sXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICB9KSk7XG4gIH1cbn1cbmAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BootcampBaseApplicationStackFile = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
class BootcampBaseApplicationStackFile extends projen_1.TextFile {
|
|
6
|
+
constructor(project) {
|
|
7
|
+
super(project, 'src/stacks/BaseApplicationStack.ts', {
|
|
8
|
+
marker: true,
|
|
9
|
+
readonly: true,
|
|
10
|
+
lines: [
|
|
11
|
+
'import fs from \'fs\';',
|
|
12
|
+
'import path from \'path\';',
|
|
13
|
+
'import { Aspects, CfnOutput, Stack, StackProps } from \'aws-cdk-lib\';',
|
|
14
|
+
'import { IVpc, Vpc } from \'aws-cdk-lib/aws-ec2\';',
|
|
15
|
+
'import { HostedZone, IHostedZone } from \'aws-cdk-lib/aws-route53\';',
|
|
16
|
+
'import { Secret } from \'aws-cdk-lib/aws-secretsmanager\';',
|
|
17
|
+
'import { Construct } from \'constructs\';',
|
|
18
|
+
'import { DatadogLambda } from \'datadog-cdk-constructs-v2\';',
|
|
19
|
+
'import { DataDogAspect } from \'../aspects/DataDogAspect\';',
|
|
20
|
+
'import { Api } from \'../constructs/Api\';',
|
|
21
|
+
'import { StaticWebsite } from \'../constructs/StaticWebsite\';',
|
|
22
|
+
'',
|
|
23
|
+
'export interface BaseApplicationStackProps extends StackProps {',
|
|
24
|
+
'',
|
|
25
|
+
' readonly datadog?: {',
|
|
26
|
+
' /**',
|
|
27
|
+
' * The version of the Datadog Node.js Lambda layer to use.',
|
|
28
|
+
' *',
|
|
29
|
+
' * @default 128',
|
|
30
|
+
' */',
|
|
31
|
+
' readonly nodeLayerVersion?: number;',
|
|
32
|
+
'',
|
|
33
|
+
' /**',
|
|
34
|
+
' * The name of the project/service for Datadog tagging purposes.',
|
|
35
|
+
' *',
|
|
36
|
+
' * @default - uses the stack ID',
|
|
37
|
+
' */',
|
|
38
|
+
' readonly projectName?: string;',
|
|
39
|
+
' };',
|
|
40
|
+
' /**',
|
|
41
|
+
' * The domain name of the Route 53 hosted zone to use.',
|
|
42
|
+
' *',
|
|
43
|
+
' * @example \'macedon.sandbox.defiance.ai\'',
|
|
44
|
+
' */',
|
|
45
|
+
' readonly hostedZoneDomainName: string;',
|
|
46
|
+
'',
|
|
47
|
+
' /**',
|
|
48
|
+
' * The ARN of the Secrets Manager secret that contains the Datadog API key.',
|
|
49
|
+
' */',
|
|
50
|
+
' readonly datadogSecretArn: `arn:aws:secretsmanager:${string}:${string}:secret:${string}`;',
|
|
51
|
+
'',
|
|
52
|
+
' /**',
|
|
53
|
+
' * The Clerk JWT verification key or URL.',
|
|
54
|
+
' */',
|
|
55
|
+
' readonly clerkJwtVerificationKey: `https://${string}/.well-known/jwks.json`;',
|
|
56
|
+
'',
|
|
57
|
+
' /**',
|
|
58
|
+
' * The N8N endpoint base URL.',
|
|
59
|
+
' *',
|
|
60
|
+
' * @example \'https://workflow.sandbox.defiance.ai/\'',
|
|
61
|
+
' */',
|
|
62
|
+
' readonly n8nEndpoint: string;',
|
|
63
|
+
'',
|
|
64
|
+
' /**',
|
|
65
|
+
' * The name of the VPC to create.',
|
|
66
|
+
' *',
|
|
67
|
+
' * @default \'${id}-vpc\'',
|
|
68
|
+
' */',
|
|
69
|
+
' readonly vpcName?: string;',
|
|
70
|
+
'',
|
|
71
|
+
' /**',
|
|
72
|
+
' * The hostname for the static website. This will be added to the hostedzone.',
|
|
73
|
+
' *',
|
|
74
|
+
' * @example \'myboi\'',
|
|
75
|
+
' * @default \'mvp\'',
|
|
76
|
+
' */',
|
|
77
|
+
' readonly hostname: string;',
|
|
78
|
+
'}',
|
|
79
|
+
'',
|
|
80
|
+
'export class BaseApplicationStack<TProps extends BaseApplicationStackProps> extends Stack {',
|
|
81
|
+
' protected datadog: DatadogLambda;',
|
|
82
|
+
' protected hostedZone: IHostedZone;',
|
|
83
|
+
' protected vpc: IVpc;',
|
|
84
|
+
' protected api: Api;',
|
|
85
|
+
'',
|
|
86
|
+
' constructor(scope: Construct, private id: string, protected props: TProps) {',
|
|
87
|
+
' super(scope, id, props);',
|
|
88
|
+
'',
|
|
89
|
+
' if (!this.props.clerkJwtVerificationKey) {',
|
|
90
|
+
' throw new Error(\'clerkJwtVerificationKey is required\');',
|
|
91
|
+
' }',
|
|
92
|
+
'',
|
|
93
|
+
' this.createDatadogExtension();',
|
|
94
|
+
' if (!this.datadog) {',
|
|
95
|
+
' throw new Error(\'Datadog extension creation failed\');',
|
|
96
|
+
' }',
|
|
97
|
+
'',
|
|
98
|
+
' this.createHostedZone();',
|
|
99
|
+
' if (!this.hostedZone) {',
|
|
100
|
+
' throw new Error(\'HostedZone creation failed\');',
|
|
101
|
+
' }',
|
|
102
|
+
'',
|
|
103
|
+
' this.createVpc();',
|
|
104
|
+
'',
|
|
105
|
+
' this.createApi();',
|
|
106
|
+
' if (!this.api) {',
|
|
107
|
+
' throw new Error(\'API creation failed\');',
|
|
108
|
+
' }',
|
|
109
|
+
'',
|
|
110
|
+
' this.createStaticWebsite();',
|
|
111
|
+
'',
|
|
112
|
+
' this.createOutputs();',
|
|
113
|
+
' Aspects.of(this).add(new DataDogAspect({ datadog: this.datadog }));',
|
|
114
|
+
' }',
|
|
115
|
+
'',
|
|
116
|
+
' protected createStaticWebsite() {',
|
|
117
|
+
' new StaticWebsite(this, \'StaticWebsite\', {',
|
|
118
|
+
' hostedZone: this.hostedZone,',
|
|
119
|
+
' api: this.api.restApi,',
|
|
120
|
+
' hostname: this.props.hostname,',
|
|
121
|
+
' });',
|
|
122
|
+
' }',
|
|
123
|
+
'',
|
|
124
|
+
' protected createApi() {',
|
|
125
|
+
' this.api = new Api(this, \'Api\', {',
|
|
126
|
+
' vpc: this.vpc,',
|
|
127
|
+
' clerkJwtVerificationKey: this.props.clerkJwtVerificationKey,',
|
|
128
|
+
' n8nEndpoint: this.props.n8nEndpoint,',
|
|
129
|
+
' });',
|
|
130
|
+
' }',
|
|
131
|
+
'',
|
|
132
|
+
' protected createVpc() {',
|
|
133
|
+
' this.vpc = new Vpc(this, \'VPC\', {',
|
|
134
|
+
' vpcName: this.props.vpcName || `${this.id}-vpc`,',
|
|
135
|
+
' maxAzs: 3,',
|
|
136
|
+
' natGateways: 1,',
|
|
137
|
+
' });',
|
|
138
|
+
' }',
|
|
139
|
+
'',
|
|
140
|
+
' protected createHostedZone() {',
|
|
141
|
+
' this.hostedZone = HostedZone.fromLookup(this, \'HostedZone\', {',
|
|
142
|
+
' domainName: this.props.hostedZoneDomainName,',
|
|
143
|
+
' });',
|
|
144
|
+
' }',
|
|
145
|
+
'',
|
|
146
|
+
' protected createOutputs() {',
|
|
147
|
+
' new CfnOutput(this, \'WebsiteUrl\', {',
|
|
148
|
+
' value: `https://${this.props.hostname}.${this.hostedZone.zoneName}`,',
|
|
149
|
+
' description: \'The URL of the static website\',',
|
|
150
|
+
' exportName: `${this.id.replace(/\\//, \'-\')}-WebsiteUrl`,',
|
|
151
|
+
' });',
|
|
152
|
+
' }',
|
|
153
|
+
'',
|
|
154
|
+
' protected createDatadogExtension() {',
|
|
155
|
+
' const datadogApiSecret = Secret.fromSecretCompleteArn(this, \'DatadogApiKey\', this.props.datadogSecretArn);',
|
|
156
|
+
' this.datadog = new DatadogLambda(this, \'Datadog\', {',
|
|
157
|
+
' apiKeySecret: datadogApiSecret,',
|
|
158
|
+
' service: this.props.datadog?.projectName || this.id,',
|
|
159
|
+
' nodeLayerVersion: this.props.datadog?.nodeLayerVersion || 128,',
|
|
160
|
+
' extensionLayerVersion: 86,',
|
|
161
|
+
' });',
|
|
162
|
+
' }',
|
|
163
|
+
'',
|
|
164
|
+
' /**',
|
|
165
|
+
' * Adds the current branch name (cleaned with \'/\' -> \'-\') if not on the main branch',
|
|
166
|
+
' * @param prefix',
|
|
167
|
+
' * @private',
|
|
168
|
+
' */',
|
|
169
|
+
' private addBranchName(prefix: string) {',
|
|
170
|
+
' const dbOverride = process.env.DB_OVERRIDE;',
|
|
171
|
+
' if (dbOverride) {',
|
|
172
|
+
' return `${prefix}-${dbOverride}`;',
|
|
173
|
+
' }',
|
|
174
|
+
' ',
|
|
175
|
+
' const head = fs.readFileSync(path.join(process.cwd(), \'.git\', \'HEAD\'), \'utf8\').trim();',
|
|
176
|
+
' const branch = head.startsWith(\'ref: \') ? head.replace(\'ref: refs/heads/\', \'\') : head; // detached HEAD returns a SHA',
|
|
177
|
+
' ',
|
|
178
|
+
' if (branch !== \'main\') {',
|
|
179
|
+
' console.log(\'branch: \', branch);',
|
|
180
|
+
' const cleanBranchName = branch.replace(/\\//gi, \'-\');',
|
|
181
|
+
' return `${prefix}-${cleanBranchName}`;',
|
|
182
|
+
' }',
|
|
183
|
+
' ',
|
|
184
|
+
' return prefix;',
|
|
185
|
+
' }',
|
|
186
|
+
' ',
|
|
187
|
+
' protected getDatabaseName(databaseName: string) {',
|
|
188
|
+
' return this.addBranchName(databaseName);',
|
|
189
|
+
' }',
|
|
190
|
+
' ',
|
|
191
|
+
' protected getUsername(username: string) {',
|
|
192
|
+
' return this.addBranchName(username);',
|
|
193
|
+
' }',
|
|
194
|
+
'}',
|
|
195
|
+
],
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.BootcampBaseApplicationStackFile = BootcampBaseApplicationStackFile;
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9vdGNhbXBCYXNlQXBwbGljYXRpb25TdGFja0ZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQm9vdGNhbXBCYXNlQXBwbGljYXRpb25TdGFja0ZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWtDO0FBR2xDLE1BQWEsZ0NBQWlDLFNBQVEsaUJBQVE7SUFDNUQsWUFBWSxPQUE0QjtRQUN0QyxLQUFLLENBQUMsT0FBTyxFQUFFLG9DQUFvQyxFQUFFO1lBQ25ELE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUU7Z0JBQ0wsd0JBQXdCO2dCQUN4Qiw0QkFBNEI7Z0JBQzVCLHdFQUF3RTtnQkFDeEUsb0RBQW9EO2dCQUNwRCxzRUFBc0U7Z0JBQ3RFLDREQUE0RDtnQkFDNUQsMkNBQTJDO2dCQUMzQyw4REFBOEQ7Z0JBQzlELDZEQUE2RDtnQkFDN0QsNENBQTRDO2dCQUM1QyxnRUFBZ0U7Z0JBQ2hFLEVBQUU7Z0JBQ0YsaUVBQWlFO2dCQUNqRSxFQUFFO2dCQUNGLHdCQUF3QjtnQkFDeEIsU0FBUztnQkFDVCxnRUFBZ0U7Z0JBQ2hFLFFBQVE7Z0JBQ1IscUJBQXFCO2dCQUNyQixTQUFTO2dCQUNULHlDQUF5QztnQkFDekMsRUFBRTtnQkFDRixTQUFTO2dCQUNULHNFQUFzRTtnQkFDdEUsUUFBUTtnQkFDUixxQ0FBcUM7Z0JBQ3JDLFNBQVM7Z0JBQ1Qsb0NBQW9DO2dCQUNwQyxNQUFNO2dCQUNOLE9BQU87Z0JBQ1AsMERBQTBEO2dCQUMxRCxNQUFNO2dCQUNOLCtDQUErQztnQkFDL0MsT0FBTztnQkFDUCwwQ0FBMEM7Z0JBQzFDLEVBQUU7Z0JBQ0YsT0FBTztnQkFDUCwrRUFBK0U7Z0JBQy9FLE9BQU87Z0JBQ1AsNkZBQTZGO2dCQUM3RixFQUFFO2dCQUNGLE9BQU87Z0JBQ1AsNkNBQTZDO2dCQUM3QyxPQUFPO2dCQUNQLGdGQUFnRjtnQkFDaEYsRUFBRTtnQkFDRixPQUFPO2dCQUNQLGlDQUFpQztnQkFDakMsTUFBTTtnQkFDTix5REFBeUQ7Z0JBQ3pELE9BQU87Z0JBQ1AsaUNBQWlDO2dCQUNqQyxFQUFFO2dCQUNGLE9BQU87Z0JBQ1AscUNBQXFDO2dCQUNyQyxNQUFNO2dCQUNOLDZCQUE2QjtnQkFDN0IsT0FBTztnQkFDUCw4QkFBOEI7Z0JBQzlCLEVBQUU7Z0JBQ0YsT0FBTztnQkFDUCxpRkFBaUY7Z0JBQ2pGLE1BQU07Z0JBQ04seUJBQXlCO2dCQUN6Qix1QkFBdUI7Z0JBQ3ZCLE9BQU87Z0JBQ1AsOEJBQThCO2dCQUM5QixHQUFHO2dCQUNILEVBQUU7Z0JBQ0YsNkZBQTZGO2dCQUM3RixxQ0FBcUM7Z0JBQ3JDLHNDQUFzQztnQkFDdEMsd0JBQXdCO2dCQUN4Qix1QkFBdUI7Z0JBQ3ZCLEVBQUU7Z0JBQ0YsZ0ZBQWdGO2dCQUNoRiw4QkFBOEI7Z0JBQzlCLEVBQUU7Z0JBQ0YsZ0RBQWdEO2dCQUNoRCxpRUFBaUU7Z0JBQ2pFLE9BQU87Z0JBQ1AsRUFBRTtnQkFDRixvQ0FBb0M7Z0JBQ3BDLDBCQUEwQjtnQkFDMUIsK0RBQStEO2dCQUMvRCxPQUFPO2dCQUNQLEVBQUU7Z0JBQ0YsOEJBQThCO2dCQUM5Qiw2QkFBNkI7Z0JBQzdCLHdEQUF3RDtnQkFDeEQsT0FBTztnQkFDUCxFQUFFO2dCQUNGLHVCQUF1QjtnQkFDdkIsRUFBRTtnQkFDRix1QkFBdUI7Z0JBQ3ZCLHNCQUFzQjtnQkFDdEIsaURBQWlEO2dCQUNqRCxPQUFPO2dCQUNQLEVBQUU7Z0JBQ0YsaUNBQWlDO2dCQUNqQyxFQUFFO2dCQUNGLDJCQUEyQjtnQkFDM0IseUVBQXlFO2dCQUN6RSxLQUFLO2dCQUNMLEVBQUU7Z0JBQ0YscUNBQXFDO2dCQUNyQyxrREFBa0Q7Z0JBQ2xELG9DQUFvQztnQkFDcEMsOEJBQThCO2dCQUM5QixzQ0FBc0M7Z0JBQ3RDLFNBQVM7Z0JBQ1QsS0FBSztnQkFDTCxFQUFFO2dCQUNGLDJCQUEyQjtnQkFDM0IseUNBQXlDO2dCQUN6QyxzQkFBc0I7Z0JBQ3RCLG9FQUFvRTtnQkFDcEUsNENBQTRDO2dCQUM1QyxTQUFTO2dCQUNULEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRiwyQkFBMkI7Z0JBQzNCLHlDQUF5QztnQkFDekMsd0RBQXdEO2dCQUN4RCxrQkFBa0I7Z0JBQ2xCLHVCQUF1QjtnQkFDdkIsU0FBUztnQkFDVCxLQUFLO2dCQUNMLEVBQUU7Z0JBQ0Ysa0NBQWtDO2dCQUNsQyxxRUFBcUU7Z0JBQ3JFLG9EQUFvRDtnQkFDcEQsU0FBUztnQkFDVCxLQUFLO2dCQUNMLEVBQUU7Z0JBQ0YsK0JBQStCO2dCQUMvQiwyQ0FBMkM7Z0JBQzNDLDRFQUE0RTtnQkFDNUUsdURBQXVEO2dCQUN2RCxrRUFBa0U7Z0JBQ2xFLFNBQVM7Z0JBQ1QsS0FBSztnQkFDTCxFQUFFO2dCQUNGLHdDQUF3QztnQkFDeEMsa0hBQWtIO2dCQUNsSCwyREFBMkQ7Z0JBQzNELHVDQUF1QztnQkFDdkMsNERBQTREO2dCQUM1RCxzRUFBc0U7Z0JBQ3RFLGtDQUFrQztnQkFDbEMsU0FBUztnQkFDVCxLQUFLO2dCQUNMLEVBQUU7Z0JBQ0YsT0FBTztnQkFDUCwyRkFBMkY7Z0JBQzNGLG9CQUFvQjtnQkFDcEIsZUFBZTtnQkFDZixNQUFNO2dCQUNOLDJDQUEyQztnQkFDM0MsaURBQWlEO2dCQUNqRCx1QkFBdUI7Z0JBQ3ZCLHlDQUF5QztnQkFDekMsT0FBTztnQkFDUCxJQUFJO2dCQUNKLGtHQUFrRztnQkFDbEcsaUlBQWlJO2dCQUNqSSxJQUFJO2dCQUNKLGdDQUFnQztnQkFDaEMsMENBQTBDO2dCQUMxQywrREFBK0Q7Z0JBQy9ELDhDQUE4QztnQkFDOUMsT0FBTztnQkFDUCxJQUFJO2dCQUNKLG9CQUFvQjtnQkFDcEIsS0FBSztnQkFDTCxJQUFJO2dCQUNKLHFEQUFxRDtnQkFDckQsOENBQThDO2dCQUM5QyxLQUFLO2dCQUNMLElBQUk7Z0JBQ0osNkNBQTZDO2dCQUM3QywwQ0FBMEM7Z0JBQzFDLEtBQUs7Z0JBQ0wsR0FBRzthQUNKO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBak1ELDRFQWlNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRleHRGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5cbmV4cG9ydCBjbGFzcyBCb290Y2FtcEJhc2VBcHBsaWNhdGlvblN0YWNrRmlsZSBleHRlbmRzIFRleHRGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCkge1xuICAgIHN1cGVyKHByb2plY3QsICdzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBsaW5lczogW1xuICAgICAgICAnaW1wb3J0IGZzIGZyb20gXFwnZnNcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCBwYXRoIGZyb20gXFwncGF0aFxcJzsnLFxuICAgICAgICAnaW1wb3J0IHsgQXNwZWN0cywgQ2ZuT3V0cHV0LCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gXFwnYXdzLWNkay1saWJcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IElWcGMsIFZwYyB9IGZyb20gXFwnYXdzLWNkay1saWIvYXdzLWVjMlxcJzsnLFxuICAgICAgICAnaW1wb3J0IHsgSG9zdGVkWm9uZSwgSUhvc3RlZFpvbmUgfSBmcm9tIFxcJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFxcJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclxcJzsnLFxuICAgICAgICAnaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcXCdjb25zdHJ1Y3RzXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBEYXRhZG9nTGFtYmRhIH0gZnJvbSBcXCdkYXRhZG9nLWNkay1jb25zdHJ1Y3RzLXYyXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBEYXRhRG9nQXNwZWN0IH0gZnJvbSBcXCcuLi9hc3BlY3RzL0RhdGFEb2dBc3BlY3RcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IEFwaSB9IGZyb20gXFwnLi4vY29uc3RydWN0cy9BcGlcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IFN0YXRpY1dlYnNpdGUgfSBmcm9tIFxcJy4uL2NvbnN0cnVjdHMvU3RhdGljV2Vic2l0ZVxcJzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2V4cG9ydCBpbnRlcmZhY2UgQmFzZUFwcGxpY2F0aW9uU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMgeycsXG4gICAgICAgICcnLFxuICAgICAgICAnICByZWFkb25seSBkYXRhZG9nPzogeycsXG4gICAgICAgICcgICAgLyoqJyxcbiAgICAgICAgJyAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgRGF0YWRvZyBOb2RlLmpzIExhbWJkYSBsYXllciB0byB1c2UuJyxcbiAgICAgICAgJyAgICAgKicsXG4gICAgICAgICcgICAgICogQGRlZmF1bHQgMTI4JyxcbiAgICAgICAgJyAgICAgKi8nLFxuICAgICAgICAnICAgIHJlYWRvbmx5IG5vZGVMYXllclZlcnNpb24/OiBudW1iZXI7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgLyoqJyxcbiAgICAgICAgJyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC9zZXJ2aWNlIGZvciBEYXRhZG9nIHRhZ2dpbmcgcHVycG9zZXMuJyxcbiAgICAgICAgJyAgICAgKicsXG4gICAgICAgICcgICAgICogQGRlZmF1bHQgLSB1c2VzIHRoZSBzdGFjayBJRCcsXG4gICAgICAgICcgICAgICovJyxcbiAgICAgICAgJyAgICByZWFkb25seSBwcm9qZWN0TmFtZT86IHN0cmluZzsnLFxuICAgICAgICAnICB9OycsXG4gICAgICAgICcgIC8qKicsXG4gICAgICAgICcgICAqIFRoZSBkb21haW4gbmFtZSBvZiB0aGUgUm91dGUgNTMgaG9zdGVkIHpvbmUgdG8gdXNlLicsXG4gICAgICAgICcgICAqJyxcbiAgICAgICAgJyAgICogQGV4YW1wbGUgXFwnbWFjZWRvbi5zYW5kYm94LmRlZmlhbmNlLmFpXFwnJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgaG9zdGVkWm9uZURvbWFpbk5hbWU6IHN0cmluZzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIEFSTiBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCB0aGF0IGNvbnRhaW5zIHRoZSBEYXRhZG9nIEFQSSBrZXkuJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgZGF0YWRvZ1NlY3JldEFybjogYGFybjphd3M6c2VjcmV0c21hbmFnZXI6JHtzdHJpbmd9OiR7c3RyaW5nfTpzZWNyZXQ6JHtzdHJpbmd9YDsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIENsZXJrIEpXVCB2ZXJpZmljYXRpb24ga2V5IG9yIFVSTC4nLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSBjbGVya0p3dFZlcmlmaWNhdGlvbktleTogYGh0dHBzOi8vJHtzdHJpbmd9Ly53ZWxsLWtub3duL2p3a3MuanNvbmA7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIC8qKicsXG4gICAgICAgICcgICAqIFRoZSBOOE4gZW5kcG9pbnQgYmFzZSBVUkwuJyxcbiAgICAgICAgJyAgIConLFxuICAgICAgICAnICAgKiBAZXhhbXBsZSBcXCdodHRwczovL3dvcmtmbG93LnNhbmRib3guZGVmaWFuY2UuYWkvXFwnJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgbjhuRW5kcG9pbnQ6IHN0cmluZzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIG5hbWUgb2YgdGhlIFZQQyB0byBjcmVhdGUuJyxcbiAgICAgICAgJyAgIConLFxuICAgICAgICAnICAgKiBAZGVmYXVsdCBcXCcke2lkfS12cGNcXCcnLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSB2cGNOYW1lPzogc3RyaW5nOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBUaGUgaG9zdG5hbWUgZm9yIHRoZSBzdGF0aWMgd2Vic2l0ZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBob3N0ZWR6b25lLicsXG4gICAgICAgICcgICAqJyxcbiAgICAgICAgJyAgICogQGV4YW1wbGUgXFwnbXlib2lcXCcnLFxuICAgICAgICAnICAgKiBAZGVmYXVsdCBcXCdtdnBcXCcnLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSBob3N0bmFtZTogc3RyaW5nOycsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgY2xhc3MgQmFzZUFwcGxpY2F0aW9uU3RhY2s8VFByb3BzIGV4dGVuZHMgQmFzZUFwcGxpY2F0aW9uU3RhY2tQcm9wcz4gZXh0ZW5kcyBTdGFjayB7JyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGRhdGFkb2c6IERhdGFkb2dMYW1iZGE7JyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lOycsXG4gICAgICAgICcgIHByb3RlY3RlZCB2cGM6IElWcGM7JyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGFwaTogQXBpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBwcml2YXRlIGlkOiBzdHJpbmcsIHByb3RlY3RlZCBwcm9wczogVFByb3BzKSB7JyxcbiAgICAgICAgJyAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICBpZiAoIXRoaXMucHJvcHMuY2xlcmtKd3RWZXJpZmljYXRpb25LZXkpIHsnLFxuICAgICAgICAnICAgICAgdGhyb3cgbmV3IEVycm9yKFxcJ2NsZXJrSnd0VmVyaWZpY2F0aW9uS2V5IGlzIHJlcXVpcmVkXFwnKTsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICB0aGlzLmNyZWF0ZURhdGFkb2dFeHRlbnNpb24oKTsnLFxuICAgICAgICAnICAgIGlmICghdGhpcy5kYXRhZG9nKSB7JyxcbiAgICAgICAgJyAgICAgIHRocm93IG5ldyBFcnJvcihcXCdEYXRhZG9nIGV4dGVuc2lvbiBjcmVhdGlvbiBmYWlsZWRcXCcpOycsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIHRoaXMuY3JlYXRlSG9zdGVkWm9uZSgpOycsXG4gICAgICAgICcgICAgaWYgKCF0aGlzLmhvc3RlZFpvbmUpIHsnLFxuICAgICAgICAnICAgICAgdGhyb3cgbmV3IEVycm9yKFxcJ0hvc3RlZFpvbmUgY3JlYXRpb24gZmFpbGVkXFwnKTsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICB0aGlzLmNyZWF0ZVZwYygpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIHRoaXMuY3JlYXRlQXBpKCk7JyxcbiAgICAgICAgJyAgICBpZiAoIXRoaXMuYXBpKSB7JyxcbiAgICAgICAgJyAgICAgIHRocm93IG5ldyBFcnJvcihcXCdBUEkgY3JlYXRpb24gZmFpbGVkXFwnKTsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICB0aGlzLmNyZWF0ZVN0YXRpY1dlYnNpdGUoKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICB0aGlzLmNyZWF0ZU91dHB1dHMoKTsnLFxuICAgICAgICAnICAgIEFzcGVjdHMub2YodGhpcykuYWRkKG5ldyBEYXRhRG9nQXNwZWN0KHsgZGF0YWRvZzogdGhpcy5kYXRhZG9nIH0pKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIHByb3RlY3RlZCBjcmVhdGVTdGF0aWNXZWJzaXRlKCkgeycsXG4gICAgICAgICcgICAgbmV3IFN0YXRpY1dlYnNpdGUodGhpcywgXFwnU3RhdGljV2Vic2l0ZVxcJywgeycsXG4gICAgICAgICcgICAgICBob3N0ZWRab25lOiB0aGlzLmhvc3RlZFpvbmUsJyxcbiAgICAgICAgJyAgICAgIGFwaTogdGhpcy5hcGkucmVzdEFwaSwnLFxuICAgICAgICAnICAgICAgaG9zdG5hbWU6IHRoaXMucHJvcHMuaG9zdG5hbWUsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIHByb3RlY3RlZCBjcmVhdGVBcGkoKSB7JyxcbiAgICAgICAgJyAgICB0aGlzLmFwaSA9IG5ldyBBcGkodGhpcywgXFwnQXBpXFwnLCB7JyxcbiAgICAgICAgJyAgICAgIHZwYzogdGhpcy52cGMsJyxcbiAgICAgICAgJyAgICAgIGNsZXJrSnd0VmVyaWZpY2F0aW9uS2V5OiB0aGlzLnByb3BzLmNsZXJrSnd0VmVyaWZpY2F0aW9uS2V5LCcsXG4gICAgICAgICcgICAgICBuOG5FbmRwb2ludDogdGhpcy5wcm9wcy5uOG5FbmRwb2ludCwnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGNyZWF0ZVZwYygpIHsnLFxuICAgICAgICAnICAgIHRoaXMudnBjID0gbmV3IFZwYyh0aGlzLCBcXCdWUENcXCcsIHsnLFxuICAgICAgICAnICAgICAgdnBjTmFtZTogdGhpcy5wcm9wcy52cGNOYW1lIHx8IGAke3RoaXMuaWR9LXZwY2AsJyxcbiAgICAgICAgJyAgICAgIG1heEF6czogMywnLFxuICAgICAgICAnICAgICAgbmF0R2F0ZXdheXM6IDEsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIHByb3RlY3RlZCBjcmVhdGVIb3N0ZWRab25lKCkgeycsXG4gICAgICAgICcgICAgdGhpcy5ob3N0ZWRab25lID0gSG9zdGVkWm9uZS5mcm9tTG9va3VwKHRoaXMsIFxcJ0hvc3RlZFpvbmVcXCcsIHsnLFxuICAgICAgICAnICAgICAgZG9tYWluTmFtZTogdGhpcy5wcm9wcy5ob3N0ZWRab25lRG9tYWluTmFtZSwnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGNyZWF0ZU91dHB1dHMoKSB7JyxcbiAgICAgICAgJyAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFxcJ1dlYnNpdGVVcmxcXCcsIHsnLFxuICAgICAgICAnICAgICAgdmFsdWU6IGBodHRwczovLyR7dGhpcy5wcm9wcy5ob3N0bmFtZX0uJHt0aGlzLmhvc3RlZFpvbmUuem9uZU5hbWV9YCwnLFxuICAgICAgICAnICAgICAgZGVzY3JpcHRpb246IFxcJ1RoZSBVUkwgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlXFwnLCcsXG4gICAgICAgICcgICAgICBleHBvcnROYW1lOiBgJHt0aGlzLmlkLnJlcGxhY2UoL1xcXFwvLywgXFwnLVxcJyl9LVdlYnNpdGVVcmxgLCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICBwcm90ZWN0ZWQgY3JlYXRlRGF0YWRvZ0V4dGVuc2lvbigpIHsnLFxuICAgICAgICAnICAgIGNvbnN0IGRhdGFkb2dBcGlTZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldENvbXBsZXRlQXJuKHRoaXMsIFxcJ0RhdGFkb2dBcGlLZXlcXCcsIHRoaXMucHJvcHMuZGF0YWRvZ1NlY3JldEFybik7JyxcbiAgICAgICAgJyAgICB0aGlzLmRhdGFkb2cgPSBuZXcgRGF0YWRvZ0xhbWJkYSh0aGlzLCBcXCdEYXRhZG9nXFwnLCB7JyxcbiAgICAgICAgJyAgICAgIGFwaUtleVNlY3JldDogZGF0YWRvZ0FwaVNlY3JldCwnLFxuICAgICAgICAnICAgICAgc2VydmljZTogdGhpcy5wcm9wcy5kYXRhZG9nPy5wcm9qZWN0TmFtZSB8fCB0aGlzLmlkLCcsXG4gICAgICAgICcgICAgICBub2RlTGF5ZXJWZXJzaW9uOiB0aGlzLnByb3BzLmRhdGFkb2c/Lm5vZGVMYXllclZlcnNpb24gfHwgMTI4LCcsXG4gICAgICAgICcgICAgICBleHRlbnNpb25MYXllclZlcnNpb246IDg2LCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBBZGRzIHRoZSBjdXJyZW50IGJyYW5jaCBuYW1lIChjbGVhbmVkIHdpdGggXFwnL1xcJyAtPiBcXCctXFwnKSBpZiBub3Qgb24gdGhlIG1haW4gYnJhbmNoJyxcbiAgICAgICAgJyAgICogQHBhcmFtIHByZWZpeCcsXG4gICAgICAgICcgICAqIEBwcml2YXRlJyxcbiAgICAgICAgJyAgKi8nLFxuICAgICAgICAnICBwcml2YXRlIGFkZEJyYW5jaE5hbWUocHJlZml4OiBzdHJpbmcpIHsnLFxuICAgICAgICAnICAgIGNvbnN0IGRiT3ZlcnJpZGUgPSBwcm9jZXNzLmVudi5EQl9PVkVSUklERTsnLFxuICAgICAgICAnICAgIGlmIChkYk92ZXJyaWRlKSB7JyxcbiAgICAgICAgJyAgICAgIHJldHVybiBgJHtwcmVmaXh9LSR7ZGJPdmVycmlkZX1gOycsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcgICcsXG4gICAgICAgICcgICAgY29uc3QgaGVhZCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXFwnLmdpdFxcJywgXFwnSEVBRFxcJyksIFxcJ3V0ZjhcXCcpLnRyaW0oKTsnLFxuICAgICAgICAnICAgIGNvbnN0IGJyYW5jaCA9IGhlYWQuc3RhcnRzV2l0aChcXCdyZWY6IFxcJykgPyBoZWFkLnJlcGxhY2UoXFwncmVmOiByZWZzL2hlYWRzL1xcJywgXFwnXFwnKSA6IGhlYWQ7IC8vIGRldGFjaGVkIEhFQUQgcmV0dXJucyBhIFNIQScsXG4gICAgICAgICcgICcsXG4gICAgICAgICcgICAgaWYgKGJyYW5jaCAhPT0gXFwnbWFpblxcJykgeycsXG4gICAgICAgICcgICAgICBjb25zb2xlLmxvZyhcXCdicmFuY2g6IFxcJywgYnJhbmNoKTsnLFxuICAgICAgICAnICAgICAgY29uc3QgY2xlYW5CcmFuY2hOYW1lID0gYnJhbmNoLnJlcGxhY2UoL1xcXFwvL2dpLCBcXCctXFwnKTsnLFxuICAgICAgICAnICAgICAgcmV0dXJuIGAke3ByZWZpeH0tJHtjbGVhbkJyYW5jaE5hbWV9YDsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnICAnLFxuICAgICAgICAnICAgIHJldHVybiBwcmVmaXg7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcgICcsXG4gICAgICAgICcgIHByb3RlY3RlZCBnZXREYXRhYmFzZU5hbWUoZGF0YWJhc2VOYW1lOiBzdHJpbmcpIHsnLFxuICAgICAgICAnICAgIHJldHVybiB0aGlzLmFkZEJyYW5jaE5hbWUoZGF0YWJhc2VOYW1lKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJyAgJyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGdldFVzZXJuYW1lKHVzZXJuYW1lOiBzdHJpbmcpIHsnLFxuICAgICAgICAnICAgIHJldHVybiB0aGlzLmFkZEJyYW5jaE5hbWUodXNlcm5hbWUpOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnfScsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
package/lib/BootcampProject.d.ts
CHANGED
|
@@ -1,28 +1,6 @@
|
|
|
1
|
-
import { AwsCdkTypeScriptApp
|
|
2
|
-
import {
|
|
3
|
-
export interface BootcampProjectOptions extends
|
|
4
|
-
/**
|
|
5
|
-
* Development environment configuration
|
|
6
|
-
*/
|
|
7
|
-
readonly dev: ApplicationEnvironmentConfig;
|
|
8
|
-
/**
|
|
9
|
-
* Development environment configuration
|
|
10
|
-
*/
|
|
11
|
-
readonly staging: ApplicationEnvironmentConfig;
|
|
12
|
-
/**
|
|
13
|
-
* Production environment configuration
|
|
14
|
-
*/
|
|
15
|
-
readonly prod: ApplicationEnvironmentConfig;
|
|
16
|
-
/**
|
|
17
|
-
* Additional tags to apply to all stacks
|
|
18
|
-
*/
|
|
19
|
-
readonly additionalTags?: {
|
|
20
|
-
[key: string]: string;
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Additional code owners to add to the CODEOWNERS file
|
|
24
|
-
*/
|
|
25
|
-
readonly additionalCodeOwners?: string[];
|
|
1
|
+
import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
|
|
2
|
+
import { BatmanProjectOptions } from './BatmanProject';
|
|
3
|
+
export interface BootcampProjectOptions extends BatmanProjectOptions {
|
|
26
4
|
}
|
|
27
5
|
export declare class BootcampProject extends AwsCdkTypeScriptApp {
|
|
28
6
|
constructor(options: BootcampProjectOptions);
|