@macedon-technologies/batman 1.0.16
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 +637 -0
- package/API.md +5671 -0
- package/LICENSE +202 -0
- package/README.md +86 -0
- package/lib/ApiConstructFile.d.ts +5 -0
- package/lib/ApiConstructFile.js +175 -0
- package/lib/ApiFunctionFile.d.ts +5 -0
- package/lib/ApiFunctionFile.js +30 -0
- package/lib/Application.d.ts +21 -0
- package/lib/Application.js +72 -0
- package/lib/ApplicationStackFile.d.ts +5 -0
- package/lib/ApplicationStackFile.js +26 -0
- package/lib/BaseApplicationStackFile.d.ts +5 -0
- package/lib/BaseApplicationStackFile.js +172 -0
- package/lib/BatmanProject.d.ts +25 -0
- package/lib/BatmanProject.js +101 -0
- package/lib/GitHubRolesFile.d.ts +9 -0
- package/lib/GitHubRolesFile.js +26 -0
- package/lib/GitHubRolesStackFile.d.ts +8 -0
- package/lib/GitHubRolesStackFile.js +165 -0
- package/lib/LocalDevAppFile.d.ts +10 -0
- package/lib/LocalDevAppFile.js +34 -0
- package/lib/MainFile.d.ts +24 -0
- package/lib/MainFile.js +64 -0
- package/lib/MainTestFile.d.ts +5 -0
- package/lib/MainTestFile.js +33 -0
- package/lib/PrCleanupWorkflow.d.ts +9 -0
- package/lib/PrCleanupWorkflow.js +100 -0
- package/lib/PrDeployWorkflow.d.ts +10 -0
- package/lib/PrDeployWorkflow.js +106 -0
- package/lib/ProductionDeployWorkflow.d.ts +11 -0
- package/lib/ProductionDeployWorkflow.js +68 -0
- package/lib/StagingDeployWorkflow.d.ts +11 -0
- package/lib/StagingDeployWorkflow.js +68 -0
- package/lib/StaticWebsiteConstructFile.d.ts +5 -0
- package/lib/StaticWebsiteConstructFile.js +198 -0
- package/lib/ViteReactProject.d.ts +45 -0
- package/lib/ViteReactProject.js +654 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +20 -0
- package/package.json +125 -0
package/lib/MainFile.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MainFile = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
class MainFile extends projen_1.SampleFile {
|
|
6
|
+
constructor(project, options) {
|
|
7
|
+
super(project, 'src/main.ts', {
|
|
8
|
+
contents: `import { App, Tags } from 'aws-cdk-lib';
|
|
9
|
+
import { ApplicationStack } from './stacks/ApplicationStack';
|
|
10
|
+
|
|
11
|
+
const app = new App();
|
|
12
|
+
|
|
13
|
+
const devStack = new ApplicationStack(app, '${options.projectName}-dev', {
|
|
14
|
+
env: {
|
|
15
|
+
account: '${options.dev.account}',
|
|
16
|
+
region: '${options.dev.region}',
|
|
17
|
+
},
|
|
18
|
+
hostedZoneDomainName: '${options.dev.hostedZoneDomainName}',
|
|
19
|
+
hostname: '${options.dev.hostname}',
|
|
20
|
+
datadogSecretArn: '${options.dev.datadogSecretArn}',
|
|
21
|
+
clerkJwtVerificationKey: '${options.dev.clerkJwtVerificationKey}',
|
|
22
|
+
n8nEndpoint: '${options.dev.n8nEndpoint}',
|
|
23
|
+
});
|
|
24
|
+
Tags.of(devStack).add('client', '${options.projectName}');
|
|
25
|
+
Tags.of(devStack).add('env', 'dev');
|
|
26
|
+
${options.additionalTags ? Object.entries(options.additionalTags).map(([key, value]) => `Tags.of(devStack).add('${key}', '${value}');`).join('\n') : ''}
|
|
27
|
+
|
|
28
|
+
const stagingStack = new ApplicationStack(app, '${options.projectName}-staging', {
|
|
29
|
+
env: {
|
|
30
|
+
account: '${options.staging.account}',
|
|
31
|
+
region: '${options.staging.region}',
|
|
32
|
+
},
|
|
33
|
+
hostedZoneDomainName: '${options.staging.hostedZoneDomainName}',
|
|
34
|
+
hostname: '${options.staging.hostname}',
|
|
35
|
+
datadogSecretArn: '${options.staging.datadogSecretArn}',
|
|
36
|
+
clerkJwtVerificationKey: '${options.staging.clerkJwtVerificationKey}',
|
|
37
|
+
n8nEndpoint: '${options.staging.n8nEndpoint}',
|
|
38
|
+
});
|
|
39
|
+
Tags.of(stagingStack).add('client', '${options.projectName}');
|
|
40
|
+
Tags.of(stagingStack).add('env', 'staging');
|
|
41
|
+
${options.additionalTags ? Object.entries(options.additionalTags).map(([key, value]) => `Tags.of(stagingStack).add('${key}', '${value}');`).join('\n') : ''}
|
|
42
|
+
|
|
43
|
+
const prodStack = new ApplicationStack(app, '${options.projectName}-prod', {
|
|
44
|
+
env: {
|
|
45
|
+
account: '${options.prod.account}',
|
|
46
|
+
region: '${options.prod.region}',
|
|
47
|
+
},
|
|
48
|
+
hostedZoneDomainName: '${options.prod.hostedZoneDomainName}',
|
|
49
|
+
hostname: '${options.prod.hostname}',
|
|
50
|
+
datadogSecretArn: '${options.prod.datadogSecretArn}',
|
|
51
|
+
clerkJwtVerificationKey: '${options.prod.clerkJwtVerificationKey}',
|
|
52
|
+
n8nEndpoint: '${options.prod.n8nEndpoint}',
|
|
53
|
+
});
|
|
54
|
+
Tags.of(prodStack).add('client', '${options.projectName}');
|
|
55
|
+
Tags.of(prodStack).add('env', 'prod');
|
|
56
|
+
${options.additionalTags ? Object.entries(options.additionalTags).map(([key, value]) => `Tags.of(prodStack).add('${key}', '${value}');`).join('\n') : ''}
|
|
57
|
+
|
|
58
|
+
app.synth();
|
|
59
|
+
`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.MainFile = MainFile;
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFpbkZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWFpbkZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBc0JwQyxNQUFhLFFBQVMsU0FBUSxtQkFBVTtJQUN0QyxZQUFZLE9BQTRCLEVBQUUsT0FBd0I7UUFDaEUsS0FBSyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUU7WUFDNUIsUUFBUSxFQUFFOzs7Ozs4Q0FLOEIsT0FBTyxDQUFDLFdBQVc7O2dCQUVqRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU87ZUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNOzsyQkFFTixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQjtlQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7dUJBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7OEJBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCO2tCQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVc7O21DQUVOLE9BQU8sQ0FBQyxXQUFXOztFQUVwRCxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsMEJBQTBCLEdBQUcsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7a0RBRXJHLE9BQU8sQ0FBQyxXQUFXOztnQkFFckQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPO2VBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTTs7MkJBRVYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0I7ZUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRO3VCQUNoQixPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQjs4QkFDekIsT0FBTyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUI7a0JBQ25ELE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVzs7dUNBRU4sT0FBTyxDQUFDLFdBQVc7O0VBRXhELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyw4QkFBOEIsR0FBRyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzsrQ0FFNUcsT0FBTyxDQUFDLFdBQVc7O2dCQUVsRCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU87ZUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNOzsyQkFFUCxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtlQUM3QyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVE7dUJBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7OEJBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCO2tCQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVc7O29DQUVOLE9BQU8sQ0FBQyxXQUFXOztFQUVyRCxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsMkJBQTJCLEdBQUcsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7O0NBR3ZKO1NBQ0ksQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBekRELDRCQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbXBsZUZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudENvbmZpZyB7XG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVEb21haW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3RuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRhdGFkb2dTZWNyZXRBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgY2xlcmtKd3RWZXJpZmljYXRpb25LZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgbjhuRW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgY2xlcmtQdWJsaXNoYWJsZUtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1haW5GaWxlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRldjogRW52aXJvbm1lbnRDb25maWc7XG4gIHJlYWRvbmx5IHN0YWdpbmc6IEVudmlyb25tZW50Q29uZmlnO1xuICByZWFkb25seSBwcm9kOiBFbnZpcm9ubWVudENvbmZpZztcbiAgcmVhZG9ubHkgYWRkaXRpb25hbFRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgY2xhc3MgTWFpbkZpbGUgZXh0ZW5kcyBTYW1wbGVGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCwgb3B0aW9uczogTWFpbkZpbGVPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgJ3NyYy9tYWluLnRzJywge1xuICAgICAgY29udGVudHM6IGBpbXBvcnQgeyBBcHAsIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblN0YWNrIH0gZnJvbSAnLi9zdGFja3MvQXBwbGljYXRpb25TdGFjayc7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxuY29uc3QgZGV2U3RhY2sgPSBuZXcgQXBwbGljYXRpb25TdGFjayhhcHAsICcke29wdGlvbnMucHJvamVjdE5hbWV9LWRldicsIHtcbiAgZW52OiB7XG4gICAgYWNjb3VudDogJyR7b3B0aW9ucy5kZXYuYWNjb3VudH0nLFxuICAgIHJlZ2lvbjogJyR7b3B0aW9ucy5kZXYucmVnaW9ufScsXG4gIH0sXG4gIGhvc3RlZFpvbmVEb21haW5OYW1lOiAnJHtvcHRpb25zLmRldi5ob3N0ZWRab25lRG9tYWluTmFtZX0nLFxuICBob3N0bmFtZTogJyR7b3B0aW9ucy5kZXYuaG9zdG5hbWV9JyxcbiAgZGF0YWRvZ1NlY3JldEFybjogJyR7b3B0aW9ucy5kZXYuZGF0YWRvZ1NlY3JldEFybn0nLFxuICBjbGVya0p3dFZlcmlmaWNhdGlvbktleTogJyR7b3B0aW9ucy5kZXYuY2xlcmtKd3RWZXJpZmljYXRpb25LZXl9JyxcbiAgbjhuRW5kcG9pbnQ6ICcke29wdGlvbnMuZGV2Lm44bkVuZHBvaW50fScsXG59KTtcblRhZ3Mub2YoZGV2U3RhY2spLmFkZCgnY2xpZW50JywgJyR7b3B0aW9ucy5wcm9qZWN0TmFtZX0nKTtcblRhZ3Mub2YoZGV2U3RhY2spLmFkZCgnZW52JywgJ2RldicpO1xuJHtvcHRpb25zLmFkZGl0aW9uYWxUYWdzID8gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5hZGRpdGlvbmFsVGFncykubWFwKChba2V5LCB2YWx1ZV0pID0+IGBUYWdzLm9mKGRldlN0YWNrKS5hZGQoJyR7a2V5fScsICcke3ZhbHVlfScpO2ApLmpvaW4oJ1xcbicpIDogJyd9XG5cbmNvbnN0IHN0YWdpbmdTdGFjayA9IG5ldyBBcHBsaWNhdGlvblN0YWNrKGFwcCwgJyR7b3B0aW9ucy5wcm9qZWN0TmFtZX0tc3RhZ2luZycsIHtcbiAgZW52OiB7XG4gICAgYWNjb3VudDogJyR7b3B0aW9ucy5zdGFnaW5nLmFjY291bnR9JyxcbiAgICByZWdpb246ICcke29wdGlvbnMuc3RhZ2luZy5yZWdpb259JyxcbiAgfSxcbiAgaG9zdGVkWm9uZURvbWFpbk5hbWU6ICcke29wdGlvbnMuc3RhZ2luZy5ob3N0ZWRab25lRG9tYWluTmFtZX0nLFxuICBob3N0bmFtZTogJyR7b3B0aW9ucy5zdGFnaW5nLmhvc3RuYW1lfScsXG4gIGRhdGFkb2dTZWNyZXRBcm46ICcke29wdGlvbnMuc3RhZ2luZy5kYXRhZG9nU2VjcmV0QXJufScsXG4gIGNsZXJrSnd0VmVyaWZpY2F0aW9uS2V5OiAnJHtvcHRpb25zLnN0YWdpbmcuY2xlcmtKd3RWZXJpZmljYXRpb25LZXl9JyxcbiAgbjhuRW5kcG9pbnQ6ICcke29wdGlvbnMuc3RhZ2luZy5uOG5FbmRwb2ludH0nLFxufSk7XG5UYWdzLm9mKHN0YWdpbmdTdGFjaykuYWRkKCdjbGllbnQnLCAnJHtvcHRpb25zLnByb2plY3ROYW1lfScpO1xuVGFncy5vZihzdGFnaW5nU3RhY2spLmFkZCgnZW52JywgJ3N0YWdpbmcnKTtcbiR7b3B0aW9ucy5hZGRpdGlvbmFsVGFncyA/IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYWRkaXRpb25hbFRhZ3MpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgVGFncy5vZihzdGFnaW5nU3RhY2spLmFkZCgnJHtrZXl9JywgJyR7dmFsdWV9Jyk7YCkuam9pbignXFxuJykgOiAnJ31cblxuY29uc3QgcHJvZFN0YWNrID0gbmV3IEFwcGxpY2F0aW9uU3RhY2soYXBwLCAnJHtvcHRpb25zLnByb2plY3ROYW1lfS1wcm9kJywge1xuICBlbnY6IHtcbiAgICBhY2NvdW50OiAnJHtvcHRpb25zLnByb2QuYWNjb3VudH0nLFxuICAgIHJlZ2lvbjogJyR7b3B0aW9ucy5wcm9kLnJlZ2lvbn0nLFxuICB9LFxuICBob3N0ZWRab25lRG9tYWluTmFtZTogJyR7b3B0aW9ucy5wcm9kLmhvc3RlZFpvbmVEb21haW5OYW1lfScsXG4gIGhvc3RuYW1lOiAnJHtvcHRpb25zLnByb2QuaG9zdG5hbWV9JyxcbiAgZGF0YWRvZ1NlY3JldEFybjogJyR7b3B0aW9ucy5wcm9kLmRhdGFkb2dTZWNyZXRBcm59JyxcbiAgY2xlcmtKd3RWZXJpZmljYXRpb25LZXk6ICcke29wdGlvbnMucHJvZC5jbGVya0p3dFZlcmlmaWNhdGlvbktleX0nLFxuICBuOG5FbmRwb2ludDogJyR7b3B0aW9ucy5wcm9kLm44bkVuZHBvaW50fScsXG59KTtcblRhZ3Mub2YocHJvZFN0YWNrKS5hZGQoJ2NsaWVudCcsICcke29wdGlvbnMucHJvamVjdE5hbWV9Jyk7XG5UYWdzLm9mKHByb2RTdGFjaykuYWRkKCdlbnYnLCAncHJvZCcpO1xuJHtvcHRpb25zLmFkZGl0aW9uYWxUYWdzID8gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5hZGRpdGlvbmFsVGFncykubWFwKChba2V5LCB2YWx1ZV0pID0+IGBUYWdzLm9mKHByb2RTdGFjaykuYWRkKCcke2tleX0nLCAnJHt2YWx1ZX0nKTtgKS5qb2luKCdcXG4nKSA6ICcnfVxuXG5hcHAuc3ludGgoKTtcbmAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MainTestFile = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
class MainTestFile extends projen_1.SampleFile {
|
|
6
|
+
constructor(project) {
|
|
7
|
+
super(project, 'test/main.test.ts', {
|
|
8
|
+
contents: `import { App } from 'aws-cdk-lib';
|
|
9
|
+
import { Template } from 'aws-cdk-lib/assertions';
|
|
10
|
+
import { ApplicationStack } from '../src/stacks/ApplicationStack';
|
|
11
|
+
|
|
12
|
+
test('Snapshot', () => {
|
|
13
|
+
const app = new App();
|
|
14
|
+
const stack = new ApplicationStack(app, 'test', {
|
|
15
|
+
env: {
|
|
16
|
+
account: '123456789012',
|
|
17
|
+
region: 'us-east-1',
|
|
18
|
+
},
|
|
19
|
+
hostedZoneDomainName: 'test.example.com',
|
|
20
|
+
hostname: 'test',
|
|
21
|
+
datadogSecretArn: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:test-AbCdEf',
|
|
22
|
+
clerkJwtVerificationKey: 'https://test.clerk.accounts.dev/.well-known/jwks.json',
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const template = Template.fromStack(stack);
|
|
26
|
+
expect(template.toJSON()).toMatchSnapshot();
|
|
27
|
+
});
|
|
28
|
+
`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.MainTestFile = MainTestFile;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFpblRlc3RGaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL01haW5UZXN0RmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFHcEMsTUFBYSxZQUFhLFNBQVEsbUJBQVU7SUFDMUMsWUFBWSxPQUE0QjtRQUN0QyxLQUFLLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFO1lBQ2xDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQmY7U0FDSSxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExQkQsb0NBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2FtcGxlRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgY2xhc3MgTWFpblRlc3RGaWxlIGV4dGVuZHMgU2FtcGxlRmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBzdXBlcihwcm9qZWN0LCAndGVzdC9tYWluLnRlc3QudHMnLCB7XG4gICAgICBjb250ZW50czogYGltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblN0YWNrIH0gZnJvbSAnLi4vc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrJztcblxudGVzdCgnU25hcHNob3QnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXBwbGljYXRpb25TdGFjayhhcHAsICd0ZXN0Jywge1xuICAgIGVudjoge1xuICAgICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgIH0sXG4gICAgaG9zdGVkWm9uZURvbWFpbk5hbWU6ICd0ZXN0LmV4YW1wbGUuY29tJyxcbiAgICBob3N0bmFtZTogJ3Rlc3QnLFxuICAgIGRhdGFkb2dTZWNyZXRBcm46ICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0OnRlc3QtQWJDZEVmJyxcbiAgICBjbGVya0p3dFZlcmlmaWNhdGlvbktleTogJ2h0dHBzOi8vdGVzdC5jbGVyay5hY2NvdW50cy5kZXYvLndlbGwta25vd24vandrcy5qc29uJyxcbiAgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICBleHBlY3QodGVtcGxhdGUudG9KU09OKCkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xufSk7XG5gLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { YamlFile } from 'projen';
|
|
2
|
+
import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
|
|
3
|
+
export interface PrCleanupWorkflowOptions {
|
|
4
|
+
readonly roleArn: string;
|
|
5
|
+
readonly awsRegion: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class PrCleanupWorkflow extends YamlFile {
|
|
8
|
+
constructor(project: AwsCdkTypeScriptApp, options: PrCleanupWorkflowOptions);
|
|
9
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrCleanupWorkflow = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
class PrCleanupWorkflow extends projen_1.YamlFile {
|
|
6
|
+
constructor(project, options) {
|
|
7
|
+
super(project, '.github/workflows/pr-cleanup.yml', {
|
|
8
|
+
marker: true,
|
|
9
|
+
readonly: true,
|
|
10
|
+
obj: {
|
|
11
|
+
name: 'PR Cleanup',
|
|
12
|
+
on: {
|
|
13
|
+
pull_request: {
|
|
14
|
+
types: ['closed'],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
permissions: {
|
|
18
|
+
'id-token': 'write',
|
|
19
|
+
'contents': 'read',
|
|
20
|
+
'pull-requests': 'write',
|
|
21
|
+
},
|
|
22
|
+
jobs: {
|
|
23
|
+
cleanup: {
|
|
24
|
+
'runs-on': 'ubuntu-latest',
|
|
25
|
+
'steps': [
|
|
26
|
+
{
|
|
27
|
+
name: 'Checkout',
|
|
28
|
+
uses: 'actions/checkout@v5',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Configure AWS credentials',
|
|
32
|
+
uses: 'aws-actions/configure-aws-credentials@v4',
|
|
33
|
+
with: {
|
|
34
|
+
'role-to-assume': options.roleArn,
|
|
35
|
+
'aws-region': options.awsRegion,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Delete CloudFormation stack',
|
|
40
|
+
id: 'delete-stack',
|
|
41
|
+
env: {
|
|
42
|
+
BRANCH_NAME: '${{ github.head_ref }}',
|
|
43
|
+
},
|
|
44
|
+
run: [
|
|
45
|
+
'# Strip conventional commit prefix (feat/, fix/, chore/, etc.)',
|
|
46
|
+
'CLEAN_BRANCH_NAME=${BRANCH_NAME#*/}',
|
|
47
|
+
'echo "Original branch: $BRANCH_NAME"',
|
|
48
|
+
'echo "Clean branch: $CLEAN_BRANCH_NAME"',
|
|
49
|
+
'STACK_NAME="alfred-dev-$CLEAN_BRANCH_NAME"',
|
|
50
|
+
'echo "Deleting stack: $STACK_NAME"',
|
|
51
|
+
'',
|
|
52
|
+
'# Initiate stack deletion',
|
|
53
|
+
'aws cloudformation delete-stack --stack-name $STACK_NAME',
|
|
54
|
+
'',
|
|
55
|
+
'# Wait for stack deletion to complete',
|
|
56
|
+
'echo "Waiting for stack deletion to complete..."',
|
|
57
|
+
'aws cloudformation wait stack-delete-complete --stack-name $STACK_NAME',
|
|
58
|
+
'',
|
|
59
|
+
'echo "Stack deletion completed successfully"',
|
|
60
|
+
].join('\n'),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'Comment PR - Success',
|
|
64
|
+
uses: 'actions/github-script@v7',
|
|
65
|
+
if: 'success()',
|
|
66
|
+
with: {
|
|
67
|
+
script: [
|
|
68
|
+
'github.rest.issues.createComment({',
|
|
69
|
+
' issue_number: context.issue.number,',
|
|
70
|
+
' owner: context.repo.owner,',
|
|
71
|
+
' repo: context.repo.repo,',
|
|
72
|
+
' body: \'🧹 Successfully cleaned up AWS resources for branch `${{ github.head_ref }}`\'',
|
|
73
|
+
'})',
|
|
74
|
+
].join('\n'),
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'Comment PR - Failure',
|
|
79
|
+
uses: 'actions/github-script@v7',
|
|
80
|
+
if: 'failure()',
|
|
81
|
+
with: {
|
|
82
|
+
script: [
|
|
83
|
+
'github.rest.issues.createComment({',
|
|
84
|
+
' issue_number: context.issue.number,',
|
|
85
|
+
' owner: context.repo.owner,',
|
|
86
|
+
' repo: context.repo.repo,',
|
|
87
|
+
' body: \'❌ Failed to clean up AWS resources for branch `${{ github.head_ref }}`. Please check the [workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.\'',
|
|
88
|
+
'})',
|
|
89
|
+
].join('\n'),
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.PrCleanupWorkflow = PrCleanupWorkflow;
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJDbGVhbnVwV29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUHJDbGVhbnVwV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWtDO0FBUWxDLE1BQWEsaUJBQWtCLFNBQVEsaUJBQVE7SUFDN0MsWUFBWSxPQUE0QixFQUFFLE9BQWlDO1FBQ3pFLEtBQUssQ0FBQyxPQUFPLEVBQUUsa0NBQWtDLEVBQUU7WUFDakQsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsRUFBRTtnQkFDSCxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsRUFBRSxFQUFFO29CQUNGLFlBQVksRUFBRTt3QkFDWixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7cUJBQ2xCO2lCQUNGO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsT0FBTztvQkFDbkIsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLGVBQWUsRUFBRSxPQUFPO2lCQUN6QjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLFNBQVMsRUFBRSxlQUFlO3dCQUMxQixPQUFPLEVBQUU7NEJBQ1A7Z0NBQ0UsSUFBSSxFQUFFLFVBQVU7Z0NBQ2hCLElBQUksRUFBRSxxQkFBcUI7NkJBQzVCOzRCQUNEO2dDQUNFLElBQUksRUFBRSwyQkFBMkI7Z0NBQ2pDLElBQUksRUFBRSwwQ0FBMEM7Z0NBQ2hELElBQUksRUFBRTtvQ0FDSixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsT0FBTztvQ0FDakMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lDQUNoQzs2QkFDRjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsNkJBQTZCO2dDQUNuQyxFQUFFLEVBQUUsY0FBYztnQ0FDbEIsR0FBRyxFQUFFO29DQUNILFdBQVcsRUFBRSx3QkFBd0I7aUNBQ3RDO2dDQUNELEdBQUcsRUFBRTtvQ0FDSCxnRUFBZ0U7b0NBQ2hFLHFDQUFxQztvQ0FDckMsc0NBQXNDO29DQUN0Qyx5Q0FBeUM7b0NBQ3pDLDRDQUE0QztvQ0FDNUMsb0NBQW9DO29DQUNwQyxFQUFFO29DQUNGLDJCQUEyQjtvQ0FDM0IsMERBQTBEO29DQUMxRCxFQUFFO29DQUNGLHVDQUF1QztvQ0FDdkMsa0RBQWtEO29DQUNsRCx3RUFBd0U7b0NBQ3hFLEVBQUU7b0NBQ0YsOENBQThDO2lDQUMvQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7NkJBQ2I7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLHNCQUFzQjtnQ0FDNUIsSUFBSSxFQUFFLDBCQUEwQjtnQ0FDaEMsRUFBRSxFQUFFLFdBQVc7Z0NBQ2YsSUFBSSxFQUFFO29DQUNKLE1BQU0sRUFBRTt3Q0FDTixvQ0FBb0M7d0NBQ3BDLHVDQUF1Qzt3Q0FDdkMsOEJBQThCO3dDQUM5Qiw0QkFBNEI7d0NBQzVCLDBGQUEwRjt3Q0FDMUYsSUFBSTtxQ0FDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUNBQ2I7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLHNCQUFzQjtnQ0FDNUIsSUFBSSxFQUFFLDBCQUEwQjtnQ0FDaEMsRUFBRSxFQUFFLFdBQVc7Z0NBQ2YsSUFBSSxFQUFFO29DQUNKLE1BQU0sRUFBRTt3Q0FDTixvQ0FBb0M7d0NBQ3BDLHVDQUF1Qzt3Q0FDdkMsOEJBQThCO3dDQUM5Qiw0QkFBNEI7d0NBQzVCLHVOQUF1Tjt3Q0FDdk4sSUFBSTtxQ0FDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUNBQ2I7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdGRCw4Q0E2RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBZYW1sRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByQ2xlYW51cFdvcmtmbG93T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzUmVnaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBQckNsZWFudXBXb3JrZmxvdyBleHRlbmRzIFlhbWxGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCwgb3B0aW9uczogUHJDbGVhbnVwV29ya2Zsb3dPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgJy5naXRodWIvd29ya2Zsb3dzL3ByLWNsZWFudXAueW1sJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgbmFtZTogJ1BSIENsZWFudXAnLFxuICAgICAgICBvbjoge1xuICAgICAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICAgICAgdHlwZXM6IFsnY2xvc2VkJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgICAgICdjb250ZW50cyc6ICdyZWFkJyxcbiAgICAgICAgICAncHVsbC1yZXF1ZXN0cyc6ICd3cml0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGpvYnM6IHtcbiAgICAgICAgICBjbGVhbnVwOiB7XG4gICAgICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgICAgICdzdGVwcyc6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgICAgICAgICAgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyZSBBV1MgY3JlZGVudGlhbHMnLFxuICAgICAgICAgICAgICAgIHVzZXM6ICdhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQHY0JyxcbiAgICAgICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IG9wdGlvbnMuYXdzUmVnaW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRGVsZXRlIENsb3VkRm9ybWF0aW9uIHN0YWNrJyxcbiAgICAgICAgICAgICAgICBpZDogJ2RlbGV0ZS1zdGFjaycsXG4gICAgICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgICBCUkFOQ0hfTkFNRTogJyR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICAgICAnIyBTdHJpcCBjb252ZW50aW9uYWwgY29tbWl0IHByZWZpeCAoZmVhdC8sIGZpeC8sIGNob3JlLywgZXRjLiknLFxuICAgICAgICAgICAgICAgICAgJ0NMRUFOX0JSQU5DSF9OQU1FPSR7QlJBTkNIX05BTUUjKi99JyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiT3JpZ2luYWwgYnJhbmNoOiAkQlJBTkNIX05BTUVcIicsXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIkNsZWFuIGJyYW5jaDogJENMRUFOX0JSQU5DSF9OQU1FXCInLFxuICAgICAgICAgICAgICAgICAgJ1NUQUNLX05BTUU9XCJhbGZyZWQtZGV2LSRDTEVBTl9CUkFOQ0hfTkFNRVwiJyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiRGVsZXRpbmcgc3RhY2s6ICRTVEFDS19OQU1FXCInLFxuICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAnIyBJbml0aWF0ZSBzdGFjayBkZWxldGlvbicsXG4gICAgICAgICAgICAgICAgICAnYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFjayAtLXN0YWNrLW5hbWUgJFNUQUNLX05BTUUnLFxuICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAnIyBXYWl0IGZvciBzdGFjayBkZWxldGlvbiB0byBjb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIldhaXRpbmcgZm9yIHN0YWNrIGRlbGV0aW9uIHRvIGNvbXBsZXRlLi4uXCInLFxuICAgICAgICAgICAgICAgICAgJ2F3cyBjbG91ZGZvcm1hdGlvbiB3YWl0IHN0YWNrLWRlbGV0ZS1jb21wbGV0ZSAtLXN0YWNrLW5hbWUgJFNUQUNLX05BTUUnLFxuICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIlN0YWNrIGRlbGV0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb21tZW50IFBSIC0gU3VjY2VzcycsXG4gICAgICAgICAgICAgICAgdXNlczogJ2FjdGlvbnMvZ2l0aHViLXNjcmlwdEB2NycsXG4gICAgICAgICAgICAgICAgaWY6ICdzdWNjZXNzKCknLFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgIHNjcmlwdDogW1xuICAgICAgICAgICAgICAgICAgICAnZ2l0aHViLnJlc3QuaXNzdWVzLmNyZWF0ZUNvbW1lbnQoeycsXG4gICAgICAgICAgICAgICAgICAgICcgIGlzc3VlX251bWJlcjogY29udGV4dC5pc3N1ZS5udW1iZXIsJyxcbiAgICAgICAgICAgICAgICAgICAgJyAgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwnLFxuICAgICAgICAgICAgICAgICAgICAnICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywnLFxuICAgICAgICAgICAgICAgICAgICAnICBib2R5OiBcXCfwn6e5IFN1Y2Nlc3NmdWxseSBjbGVhbmVkIHVwIEFXUyByZXNvdXJjZXMgZm9yIGJyYW5jaCBgJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fWBcXCcnLFxuICAgICAgICAgICAgICAgICAgICAnfSknLFxuICAgICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbW1lbnQgUFIgLSBGYWlsdXJlJyxcbiAgICAgICAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9naXRodWItc2NyaXB0QHY3JyxcbiAgICAgICAgICAgICAgICBpZjogJ2ZhaWx1cmUoKScsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgc2NyaXB0OiBbXG4gICAgICAgICAgICAgICAgICAgICdnaXRodWIucmVzdC5pc3N1ZXMuY3JlYXRlQ29tbWVudCh7JyxcbiAgICAgICAgICAgICAgICAgICAgJyAgaXNzdWVfbnVtYmVyOiBjb250ZXh0Lmlzc3VlLm51bWJlciwnLFxuICAgICAgICAgICAgICAgICAgICAnICBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLCcsXG4gICAgICAgICAgICAgICAgICAgICcgIHJlcG86IGNvbnRleHQucmVwby5yZXBvLCcsXG4gICAgICAgICAgICAgICAgICAgICcgIGJvZHk6IFxcJ+KdjCBGYWlsZWQgdG8gY2xlYW4gdXAgQVdTIHJlc291cmNlcyBmb3IgYnJhbmNoIGAke3sgZ2l0aHViLmhlYWRfcmVmIH19YC4gUGxlYXNlIGNoZWNrIHRoZSBbd29ya2Zsb3cgcnVuXSgke3sgZ2l0aHViLnNlcnZlcl91cmwgfX0vJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19L2FjdGlvbnMvcnVucy8ke3sgZ2l0aHViLnJ1bl9pZCB9fSkgZm9yIGRldGFpbHMuXFwnJyxcbiAgICAgICAgICAgICAgICAgICAgJ30pJyxcbiAgICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { YamlFile } from 'projen';
|
|
2
|
+
import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
|
|
3
|
+
export interface PrDeployWorkflowOptions {
|
|
4
|
+
readonly roleArn: string;
|
|
5
|
+
readonly awsRegion: string;
|
|
6
|
+
readonly clerkPublishableKey: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class PrDeployWorkflow extends YamlFile {
|
|
9
|
+
constructor(project: AwsCdkTypeScriptApp, options: PrDeployWorkflowOptions);
|
|
10
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrDeployWorkflow = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
class PrDeployWorkflow extends projen_1.YamlFile {
|
|
6
|
+
constructor(project, options) {
|
|
7
|
+
super(project, '.github/workflows/pr-deploy.yml', {
|
|
8
|
+
marker: true,
|
|
9
|
+
readonly: true,
|
|
10
|
+
obj: {
|
|
11
|
+
name: 'PR Deploy',
|
|
12
|
+
on: {
|
|
13
|
+
pull_request: {
|
|
14
|
+
types: ['opened', 'synchronize', 'reopened'],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
permissions: {
|
|
18
|
+
'id-token': 'write',
|
|
19
|
+
'contents': 'read',
|
|
20
|
+
'pull-requests': 'write',
|
|
21
|
+
},
|
|
22
|
+
jobs: {
|
|
23
|
+
deploy: {
|
|
24
|
+
'runs-on': 'ubuntu-latest',
|
|
25
|
+
'steps': [
|
|
26
|
+
{
|
|
27
|
+
name: 'Checkout',
|
|
28
|
+
uses: 'actions/checkout@v5',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Setup Node.js',
|
|
32
|
+
uses: 'actions/setup-node@v5',
|
|
33
|
+
with: {
|
|
34
|
+
'node-version': '24',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Configure AWS credentials',
|
|
39
|
+
uses: 'aws-actions/configure-aws-credentials@v4',
|
|
40
|
+
with: {
|
|
41
|
+
'role-to-assume': options.roleArn,
|
|
42
|
+
'aws-region': options.awsRegion,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'Install dependencies',
|
|
47
|
+
run: 'yarn install --frozen-lockfile',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'Update config.json',
|
|
51
|
+
run: `jq '.clerkPublishableKey = "${options.clerkPublishableKey}"' web/public/config.json > tmp.json && mv tmp.json web/public/config.json`,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'Deploy to AWS',
|
|
55
|
+
id: 'deploy',
|
|
56
|
+
env: {
|
|
57
|
+
BRANCH_NAME: '${{ github.head_ref }}',
|
|
58
|
+
},
|
|
59
|
+
run: [
|
|
60
|
+
'# Strip conventional commit prefix (feat/, fix/, chore/, etc.)',
|
|
61
|
+
'CLEAN_BRANCH_NAME=${BRANCH_NAME#*/}',
|
|
62
|
+
'echo "Original branch: $BRANCH_NAME"',
|
|
63
|
+
'echo "Clean branch: $CLEAN_BRANCH_NAME"',
|
|
64
|
+
'yarn cdk:dev --context local-dev-prefix=$CLEAN_BRANCH_NAME deploy --require-approval never --outputs-file cdk-outputs.json',
|
|
65
|
+
].join('\n'),
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'Extract outputs',
|
|
69
|
+
id: 'outputs',
|
|
70
|
+
run: [
|
|
71
|
+
'WEBSITE_URL=$(jq -r \'.[] | .WebsiteUrl // empty\' cdk-outputs.json)',
|
|
72
|
+
'echo "website_url=$WEBSITE_URL" >> $GITHUB_OUTPUT',
|
|
73
|
+
'echo "Website URL: $WEBSITE_URL"',
|
|
74
|
+
].join('\n'),
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'Comment PR',
|
|
78
|
+
uses: 'actions/github-script@v7',
|
|
79
|
+
if: 'success()',
|
|
80
|
+
with: {
|
|
81
|
+
script: [
|
|
82
|
+
'const websiteUrl = \'${{ steps.outputs.outputs.website_url }}\';',
|
|
83
|
+
'let body = \'✅ Successfully deployed branch `${{ github.head_ref }}` to AWS dev environment\\n\\n\';',
|
|
84
|
+
'',
|
|
85
|
+
'if (websiteUrl) {',
|
|
86
|
+
' body += `🌐 **Website URL:** ${websiteUrl}`;',
|
|
87
|
+
'}',
|
|
88
|
+
'',
|
|
89
|
+
'github.rest.issues.createComment({',
|
|
90
|
+
' issue_number: context.issue.number,',
|
|
91
|
+
' owner: context.repo.owner,',
|
|
92
|
+
' repo: context.repo.repo,',
|
|
93
|
+
' body: body',
|
|
94
|
+
'})',
|
|
95
|
+
].join('\n'),
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.PrDeployWorkflow = PrDeployWorkflow;
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJEZXBsb3lXb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QckRlcGxveVdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQVNsQyxNQUFhLGdCQUFpQixTQUFRLGlCQUFRO0lBQzVDLFlBQVksT0FBNEIsRUFBRSxPQUFnQztRQUN4RSxLQUFLLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFO1lBQ2hELE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEVBQUUsRUFBRTtvQkFDRixZQUFZLEVBQUU7d0JBQ1osS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7cUJBQzdDO2lCQUNGO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsT0FBTztvQkFDbkIsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLGVBQWUsRUFBRSxPQUFPO2lCQUN6QjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osTUFBTSxFQUFFO3dCQUNOLFNBQVMsRUFBRSxlQUFlO3dCQUMxQixPQUFPLEVBQUU7NEJBQ1A7Z0NBQ0UsSUFBSSxFQUFFLFVBQVU7Z0NBQ2hCLElBQUksRUFBRSxxQkFBcUI7NkJBQzVCOzRCQUNEO2dDQUNFLElBQUksRUFBRSxlQUFlO2dDQUNyQixJQUFJLEVBQUUsdUJBQXVCO2dDQUM3QixJQUFJLEVBQUU7b0NBQ0osY0FBYyxFQUFFLElBQUk7aUNBQ3JCOzZCQUNGOzRCQUNEO2dDQUNFLElBQUksRUFBRSwyQkFBMkI7Z0NBQ2pDLElBQUksRUFBRSwwQ0FBMEM7Z0NBQ2hELElBQUksRUFBRTtvQ0FDSixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsT0FBTztvQ0FDakMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lDQUNoQzs2QkFDRjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsc0JBQXNCO2dDQUM1QixHQUFHLEVBQUUsZ0NBQWdDOzZCQUN0Qzs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsb0JBQW9CO2dDQUMxQixHQUFHLEVBQUUsK0JBQStCLE9BQU8sQ0FBQyxtQkFBbUIsNEVBQTRFOzZCQUM1STs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsZUFBZTtnQ0FDckIsRUFBRSxFQUFFLFFBQVE7Z0NBQ1osR0FBRyxFQUFFO29DQUNILFdBQVcsRUFBRSx3QkFBd0I7aUNBQ3RDO2dDQUNELEdBQUcsRUFBRTtvQ0FDSCxnRUFBZ0U7b0NBQ2hFLHFDQUFxQztvQ0FDckMsc0NBQXNDO29DQUN0Qyx5Q0FBeUM7b0NBQ3pDLDRIQUE0SDtpQ0FDN0gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzZCQUNiOzRCQUNEO2dDQUNFLElBQUksRUFBRSxpQkFBaUI7Z0NBQ3ZCLEVBQUUsRUFBRSxTQUFTO2dDQUNiLEdBQUcsRUFBRTtvQ0FDSCxzRUFBc0U7b0NBQ3RFLG1EQUFtRDtvQ0FDbkQsa0NBQWtDO2lDQUNuQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7NkJBQ2I7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLFlBQVk7Z0NBQ2xCLElBQUksRUFBRSwwQkFBMEI7Z0NBQ2hDLEVBQUUsRUFBRSxXQUFXO2dDQUNmLElBQUksRUFBRTtvQ0FDSixNQUFNLEVBQUU7d0NBQ04sa0VBQWtFO3dDQUNsRSxzR0FBc0c7d0NBQ3RHLEVBQUU7d0NBQ0YsbUJBQW1CO3dDQUNuQixnREFBZ0Q7d0NBQ2hELEdBQUc7d0NBQ0gsRUFBRTt3Q0FDRixvQ0FBb0M7d0NBQ3BDLHVDQUF1Qzt3Q0FDdkMsOEJBQThCO3dDQUM5Qiw0QkFBNEI7d0NBQzVCLGNBQWM7d0NBQ2QsSUFBSTtxQ0FDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUNBQ2I7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW5HRCw0Q0FtR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBZYW1sRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByRGVwbG95V29ya2Zsb3dPcHRpb25zIHtcbiAgcmVhZG9ubHkgcm9sZUFybjogc3RyaW5nO1xuICByZWFkb25seSBhd3NSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgY2xlcmtQdWJsaXNoYWJsZUtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUHJEZXBsb3lXb3JrZmxvdyBleHRlbmRzIFlhbWxGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCwgb3B0aW9uczogUHJEZXBsb3lXb3JrZmxvd09wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnLmdpdGh1Yi93b3JrZmxvd3MvcHItZGVwbG95LnltbCcsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6ICdQUiBEZXBsb3knLFxuICAgICAgICBvbjoge1xuICAgICAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ3N5bmNocm9uaXplJywgJ3Jlb3BlbmVkJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgICAgICdjb250ZW50cyc6ICdyZWFkJyxcbiAgICAgICAgICAncHVsbC1yZXF1ZXN0cyc6ICd3cml0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGpvYnM6IHtcbiAgICAgICAgICBkZXBsb3k6IHtcbiAgICAgICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAgICAgJ3N0ZXBzJzogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICAgICAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgICAgICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NScsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ25vZGUtdmVyc2lvbic6ICcyNCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmUgQVdTIGNyZWRlbnRpYWxzJyxcbiAgICAgICAgICAgICAgICB1c2VzOiAnYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0B2NCcsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiBvcHRpb25zLmF3c1JlZ2lvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBydW46ICd5YXJuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZSBjb25maWcuanNvbicsXG4gICAgICAgICAgICAgICAgcnVuOiBganEgJy5jbGVya1B1Ymxpc2hhYmxlS2V5ID0gXCIke29wdGlvbnMuY2xlcmtQdWJsaXNoYWJsZUtleX1cIicgd2ViL3B1YmxpYy9jb25maWcuanNvbiA+IHRtcC5qc29uICYmIG12IHRtcC5qc29uIHdlYi9wdWJsaWMvY29uZmlnLmpzb25gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0RlcGxveSB0byBBV1MnLFxuICAgICAgICAgICAgICAgIGlkOiAnZGVwbG95JyxcbiAgICAgICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAgIEJSQU5DSF9OQU1FOiAnJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgICAgICcjIFN0cmlwIGNvbnZlbnRpb25hbCBjb21taXQgcHJlZml4IChmZWF0LywgZml4LywgY2hvcmUvLCBldGMuKScsXG4gICAgICAgICAgICAgICAgICAnQ0xFQU5fQlJBTkNIX05BTUU9JHtCUkFOQ0hfTkFNRSMqL30nLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJPcmlnaW5hbCBicmFuY2g6ICRCUkFOQ0hfTkFNRVwiJyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiQ2xlYW4gYnJhbmNoOiAkQ0xFQU5fQlJBTkNIX05BTUVcIicsXG4gICAgICAgICAgICAgICAgICAneWFybiBjZGs6ZGV2IC0tY29udGV4dCBsb2NhbC1kZXYtcHJlZml4PSRDTEVBTl9CUkFOQ0hfTkFNRSBkZXBsb3kgLS1yZXF1aXJlLWFwcHJvdmFsIG5ldmVyIC0tb3V0cHV0cy1maWxlIGNkay1vdXRwdXRzLmpzb24nLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRXh0cmFjdCBvdXRwdXRzJyxcbiAgICAgICAgICAgICAgICBpZDogJ291dHB1dHMnLFxuICAgICAgICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgICAgICAgJ1dFQlNJVEVfVVJMPSQoanEgLXIgXFwnLltdIHwgLldlYnNpdGVVcmwgLy8gZW1wdHlcXCcgY2RrLW91dHB1dHMuanNvbiknLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJ3ZWJzaXRlX3VybD0kV0VCU0lURV9VUkxcIiA+PiAkR0lUSFVCX09VVFBVVCcsXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIldlYnNpdGUgVVJMOiAkV0VCU0lURV9VUkxcIicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb21tZW50IFBSJyxcbiAgICAgICAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9naXRodWItc2NyaXB0QHY3JyxcbiAgICAgICAgICAgICAgICBpZjogJ3N1Y2Nlc3MoKScsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgc2NyaXB0OiBbXG4gICAgICAgICAgICAgICAgICAgICdjb25zdCB3ZWJzaXRlVXJsID0gXFwnJHt7IHN0ZXBzLm91dHB1dHMub3V0cHV0cy53ZWJzaXRlX3VybCB9fVxcJzsnLFxuICAgICAgICAgICAgICAgICAgICAnbGV0IGJvZHkgPSBcXCfinIUgU3VjY2Vzc2Z1bGx5IGRlcGxveWVkIGJyYW5jaCBgJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fWAgdG8gQVdTIGRldiBlbnZpcm9ubWVudFxcXFxuXFxcXG5cXCc7JyxcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICdpZiAod2Vic2l0ZVVybCkgeycsXG4gICAgICAgICAgICAgICAgICAgICcgIGJvZHkgKz0gYPCfjJAgKipXZWJzaXRlIFVSTDoqKiAke3dlYnNpdGVVcmx9YDsnLFxuICAgICAgICAgICAgICAgICAgICAnfScsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnZ2l0aHViLnJlc3QuaXNzdWVzLmNyZWF0ZUNvbW1lbnQoeycsXG4gICAgICAgICAgICAgICAgICAgICcgIGlzc3VlX251bWJlcjogY29udGV4dC5pc3N1ZS5udW1iZXIsJyxcbiAgICAgICAgICAgICAgICAgICAgJyAgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwnLFxuICAgICAgICAgICAgICAgICAgICAnICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywnLFxuICAgICAgICAgICAgICAgICAgICAnICBib2R5OiBib2R5JyxcbiAgICAgICAgICAgICAgICAgICAgJ30pJyxcbiAgICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { YamlFile } from 'projen';
|
|
2
|
+
import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
|
|
3
|
+
export interface ProductionDeployWorkflowOptions {
|
|
4
|
+
readonly roleArn: string;
|
|
5
|
+
readonly awsRegion: string;
|
|
6
|
+
readonly projectName: string;
|
|
7
|
+
readonly clerkPublishableKey: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class ProductionDeployWorkflow extends YamlFile {
|
|
10
|
+
constructor(project: AwsCdkTypeScriptApp, options: ProductionDeployWorkflowOptions);
|
|
11
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ProductionDeployWorkflow = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const projen_1 = require("projen");
|
|
7
|
+
class ProductionDeployWorkflow extends projen_1.YamlFile {
|
|
8
|
+
constructor(project, options) {
|
|
9
|
+
super(project, '.github/workflows/production-deploy.yml', {
|
|
10
|
+
marker: true,
|
|
11
|
+
readonly: true,
|
|
12
|
+
obj: {
|
|
13
|
+
name: 'Production Deploy',
|
|
14
|
+
on: {
|
|
15
|
+
push: {
|
|
16
|
+
tags: ['*'],
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
permissions: {
|
|
20
|
+
'id-token': 'write',
|
|
21
|
+
'contents': 'read',
|
|
22
|
+
},
|
|
23
|
+
jobs: {
|
|
24
|
+
deploy: {
|
|
25
|
+
'runs-on': 'ubuntu-latest',
|
|
26
|
+
'steps': [
|
|
27
|
+
{
|
|
28
|
+
name: 'Checkout',
|
|
29
|
+
uses: 'actions/checkout@v5',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'Setup Node.js',
|
|
33
|
+
uses: 'actions/setup-node@v5',
|
|
34
|
+
with: {
|
|
35
|
+
'node-version': '24',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Configure AWS credentials',
|
|
40
|
+
uses: 'aws-actions/configure-aws-credentials@v4',
|
|
41
|
+
with: {
|
|
42
|
+
'role-to-assume': options.roleArn,
|
|
43
|
+
'aws-region': options.awsRegion,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Install dependencies',
|
|
48
|
+
run: 'yarn install --frozen-lockfile',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'Update config.json',
|
|
52
|
+
run: `jq '.clerkPublishableKey = "${options.clerkPublishableKey}"' web/public/config.json > tmp.json && mv tmp.json web/public/config.json`,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'Deploy to production',
|
|
56
|
+
run: `yarn cdk deploy -e ${options.projectName}-prod --require-approval never`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.ProductionDeployWorkflow = ProductionDeployWorkflow;
|
|
66
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
67
|
+
ProductionDeployWorkflow[_a] = { fqn: "@macedon-technologies/batman.ProductionDeployWorkflow", version: "1.0.16" };
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQVVsQyxNQUFhLHdCQUF5QixTQUFRLGlCQUFRO0lBQ3BELFlBQVksT0FBNEIsRUFBRSxPQUF3QztRQUNoRixLQUFLLENBQUMsT0FBTyxFQUFFLHlDQUF5QyxFQUFFO1lBQ3hELE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsRUFBRSxFQUFFO29CQUNGLElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUM7cUJBQ1o7aUJBQ0Y7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxPQUFPO29CQUNuQixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRTt3QkFDTixTQUFTLEVBQUUsZUFBZTt3QkFDMUIsT0FBTyxFQUFFOzRCQUNQO2dDQUNFLElBQUksRUFBRSxVQUFVO2dDQUNoQixJQUFJLEVBQUUscUJBQXFCOzZCQUM1Qjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsZUFBZTtnQ0FDckIsSUFBSSxFQUFFLHVCQUF1QjtnQ0FDN0IsSUFBSSxFQUFFO29DQUNKLGNBQWMsRUFBRSxJQUFJO2lDQUNyQjs2QkFDRjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsMkJBQTJCO2dDQUNqQyxJQUFJLEVBQUUsMENBQTBDO2dDQUNoRCxJQUFJLEVBQUU7b0NBQ0osZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLE9BQU87b0NBQ2pDLFlBQVksRUFBRSxPQUFPLENBQUMsU0FBUztpQ0FDaEM7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLHNCQUFzQjtnQ0FDNUIsR0FBRyxFQUFFLGdDQUFnQzs2QkFDdEM7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLG9CQUFvQjtnQ0FDMUIsR0FBRyxFQUFFLCtCQUErQixPQUFPLENBQUMsbUJBQW1CLDRFQUE0RTs2QkFDNUk7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLHNCQUFzQjtnQ0FDNUIsR0FBRyxFQUFFLHNCQUFzQixPQUFPLENBQUMsV0FBVyxnQ0FBZ0M7NkJBQy9FO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQXhESCw0REF5REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBZYW1sRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd09wdGlvbnMge1xuICByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF3c1JlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBwcm9qZWN0TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBjbGVya1B1Ymxpc2hhYmxlS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgZXh0ZW5kcyBZYW1sRmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHAsIG9wdGlvbnM6IFByb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd09wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnLmdpdGh1Yi93b3JrZmxvd3MvcHJvZHVjdGlvbi1kZXBsb3kueW1sJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgbmFtZTogJ1Byb2R1Y3Rpb24gRGVwbG95JyxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBwdXNoOiB7XG4gICAgICAgICAgICB0YWdzOiBbJyonXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAgICAgJ2NvbnRlbnRzJzogJ3JlYWQnLFxuICAgICAgICB9LFxuICAgICAgICBqb2JzOiB7XG4gICAgICAgICAgZGVwbG95OiB7XG4gICAgICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgICAgICdzdGVwcyc6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgICAgICAgICAgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NldHVwIE5vZGUuanMnLFxuICAgICAgICAgICAgICAgIHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjUnLFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdub2RlLXZlcnNpb24nOiAnMjQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29uZmlndXJlIEFXUyBjcmVkZW50aWFscycsXG4gICAgICAgICAgICAgICAgdXNlczogJ2F3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAdjQnLFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICAgICAgICAgICdhd3MtcmVnaW9uJzogb3B0aW9ucy5hd3NSZWdpb24sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgcnVuOiAneWFybiBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdVcGRhdGUgY29uZmlnLmpzb24nLFxuICAgICAgICAgICAgICAgIHJ1bjogYGpxICcuY2xlcmtQdWJsaXNoYWJsZUtleSA9IFwiJHtvcHRpb25zLmNsZXJrUHVibGlzaGFibGVLZXl9XCInIHdlYi9wdWJsaWMvY29uZmlnLmpzb24gPiB0bXAuanNvbiAmJiBtdiB0bXAuanNvbiB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdEZXBsb3kgdG8gcHJvZHVjdGlvbicsXG4gICAgICAgICAgICAgICAgcnVuOiBgeWFybiBjZGsgZGVwbG95IC1lICR7b3B0aW9ucy5wcm9qZWN0TmFtZX0tcHJvZCAtLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXJgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { YamlFile } from 'projen';
|
|
2
|
+
import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
|
|
3
|
+
export interface StagingDeployWorkflowOptions {
|
|
4
|
+
readonly roleArn: string;
|
|
5
|
+
readonly awsRegion: string;
|
|
6
|
+
readonly projectName: string;
|
|
7
|
+
readonly clerkPublishableKey: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class StagingDeployWorkflow extends YamlFile {
|
|
10
|
+
constructor(project: AwsCdkTypeScriptApp, options: StagingDeployWorkflowOptions);
|
|
11
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.StagingDeployWorkflow = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const projen_1 = require("projen");
|
|
7
|
+
class StagingDeployWorkflow extends projen_1.YamlFile {
|
|
8
|
+
constructor(project, options) {
|
|
9
|
+
super(project, '.github/workflows/staging-deploy.yml', {
|
|
10
|
+
marker: true,
|
|
11
|
+
readonly: true,
|
|
12
|
+
obj: {
|
|
13
|
+
name: 'Staging Deploy',
|
|
14
|
+
on: {
|
|
15
|
+
push: {
|
|
16
|
+
branches: ['main'],
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
permissions: {
|
|
20
|
+
'id-token': 'write',
|
|
21
|
+
'contents': 'read',
|
|
22
|
+
},
|
|
23
|
+
jobs: {
|
|
24
|
+
deploy: {
|
|
25
|
+
'runs-on': 'ubuntu-latest',
|
|
26
|
+
'steps': [
|
|
27
|
+
{
|
|
28
|
+
name: 'Checkout',
|
|
29
|
+
uses: 'actions/checkout@v5',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'Setup Node.js',
|
|
33
|
+
uses: 'actions/setup-node@v5',
|
|
34
|
+
with: {
|
|
35
|
+
'node-version': '24',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Configure AWS credentials',
|
|
40
|
+
uses: 'aws-actions/configure-aws-credentials@v4',
|
|
41
|
+
with: {
|
|
42
|
+
'role-to-assume': options.roleArn,
|
|
43
|
+
'aws-region': options.awsRegion,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Install dependencies',
|
|
48
|
+
run: 'yarn install --frozen-lockfile',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'Update config.json',
|
|
52
|
+
run: `jq '.clerkPublishableKey = "${options.clerkPublishableKey}"' web/public/config.json > tmp.json && mv tmp.json web/public/config.json`,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'Deploy to staging',
|
|
56
|
+
run: `yarn cdk deploy -e ${options.projectName}-staging --require-approval never`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.StagingDeployWorkflow = StagingDeployWorkflow;
|
|
66
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
67
|
+
StagingDeployWorkflow[_a] = { fqn: "@macedon-technologies/batman.StagingDeployWorkflow", version: "1.0.16" };
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2luZ0RlcGxveVdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1N0YWdpbmdEZXBsb3lXb3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQVVsQyxNQUFhLHFCQUFzQixTQUFRLGlCQUFRO0lBQ2pELFlBQVksT0FBNEIsRUFBRSxPQUFxQztRQUM3RSxLQUFLLENBQUMsT0FBTyxFQUFFLHNDQUFzQyxFQUFFO1lBQ3JELE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsRUFBRSxFQUFFO29CQUNGLElBQUksRUFBRTt3QkFDSixRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7cUJBQ25CO2lCQUNGO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsT0FBTztvQkFDbkIsVUFBVSxFQUFFLE1BQU07aUJBQ25CO2dCQUNELElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUU7d0JBQ04sU0FBUyxFQUFFLGVBQWU7d0JBQzFCLE9BQU8sRUFBRTs0QkFDUDtnQ0FDRSxJQUFJLEVBQUUsVUFBVTtnQ0FDaEIsSUFBSSxFQUFFLHFCQUFxQjs2QkFDNUI7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLGVBQWU7Z0NBQ3JCLElBQUksRUFBRSx1QkFBdUI7Z0NBQzdCLElBQUksRUFBRTtvQ0FDSixjQUFjLEVBQUUsSUFBSTtpQ0FDckI7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLDJCQUEyQjtnQ0FDakMsSUFBSSxFQUFFLDBDQUEwQztnQ0FDaEQsSUFBSSxFQUFFO29DQUNKLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxPQUFPO29DQUNqQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFNBQVM7aUNBQ2hDOzZCQUNGOzRCQUNEO2dDQUNFLElBQUksRUFBRSxzQkFBc0I7Z0NBQzVCLEdBQUcsRUFBRSxnQ0FBZ0M7NkJBQ3RDOzRCQUNEO2dDQUNFLElBQUksRUFBRSxvQkFBb0I7Z0NBQzFCLEdBQUcsRUFBRSwrQkFBK0IsT0FBTyxDQUFDLG1CQUFtQiw0RUFBNEU7NkJBQzVJOzRCQUNEO2dDQUNFLElBQUksRUFBRSxtQkFBbUI7Z0NBQ3pCLEdBQUcsRUFBRSxzQkFBc0IsT0FBTyxDQUFDLFdBQVcsbUNBQW1DOzZCQUNsRjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF4REgsc0RBeURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWWFtbEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGFnaW5nRGVwbG95V29ya2Zsb3dPcHRpb25zIHtcbiAgcmVhZG9ubHkgcm9sZUFybjogc3RyaW5nO1xuICByZWFkb25seSBhd3NSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvamVjdE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY2xlcmtQdWJsaXNoYWJsZUtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhZ2luZ0RlcGxveVdvcmtmbG93IGV4dGVuZHMgWWFtbEZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwLCBvcHRpb25zOiBTdGFnaW5nRGVwbG95V29ya2Zsb3dPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgJy5naXRodWIvd29ya2Zsb3dzL3N0YWdpbmctZGVwbG95LnltbCcsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6ICdTdGFnaW5nIERlcGxveScsXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgcHVzaDoge1xuICAgICAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgICAgICAnY29udGVudHMnOiAncmVhZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGpvYnM6IHtcbiAgICAgICAgICBkZXBsb3k6IHtcbiAgICAgICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAgICAgJ3N0ZXBzJzogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICAgICAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgICAgICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NScsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ25vZGUtdmVyc2lvbic6ICcyNCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmUgQVdTIGNyZWRlbnRpYWxzJyxcbiAgICAgICAgICAgICAgICB1c2VzOiAnYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0B2NCcsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiBvcHRpb25zLmF3c1JlZ2lvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBydW46ICd5YXJuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZSBjb25maWcuanNvbicsXG4gICAgICAgICAgICAgICAgcnVuOiBganEgJy5jbGVya1B1Ymxpc2hhYmxlS2V5ID0gXCIke29wdGlvbnMuY2xlcmtQdWJsaXNoYWJsZUtleX1cIicgd2ViL3B1YmxpYy9jb25maWcuanNvbiA+IHRtcC5qc29uICYmIG12IHRtcC5qc29uIHdlYi9wdWJsaWMvY29uZmlnLmpzb25gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0RlcGxveSB0byBzdGFnaW5nJyxcbiAgICAgICAgICAgICAgICBydW46IGB5YXJuIGNkayBkZXBsb3kgLWUgJHtvcHRpb25zLnByb2plY3ROYW1lfS1zdGFnaW5nIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlcmAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|