@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.
Files changed (41) hide show
  1. package/.jsii +637 -0
  2. package/API.md +5671 -0
  3. package/LICENSE +202 -0
  4. package/README.md +86 -0
  5. package/lib/ApiConstructFile.d.ts +5 -0
  6. package/lib/ApiConstructFile.js +175 -0
  7. package/lib/ApiFunctionFile.d.ts +5 -0
  8. package/lib/ApiFunctionFile.js +30 -0
  9. package/lib/Application.d.ts +21 -0
  10. package/lib/Application.js +72 -0
  11. package/lib/ApplicationStackFile.d.ts +5 -0
  12. package/lib/ApplicationStackFile.js +26 -0
  13. package/lib/BaseApplicationStackFile.d.ts +5 -0
  14. package/lib/BaseApplicationStackFile.js +172 -0
  15. package/lib/BatmanProject.d.ts +25 -0
  16. package/lib/BatmanProject.js +101 -0
  17. package/lib/GitHubRolesFile.d.ts +9 -0
  18. package/lib/GitHubRolesFile.js +26 -0
  19. package/lib/GitHubRolesStackFile.d.ts +8 -0
  20. package/lib/GitHubRolesStackFile.js +165 -0
  21. package/lib/LocalDevAppFile.d.ts +10 -0
  22. package/lib/LocalDevAppFile.js +34 -0
  23. package/lib/MainFile.d.ts +24 -0
  24. package/lib/MainFile.js +64 -0
  25. package/lib/MainTestFile.d.ts +5 -0
  26. package/lib/MainTestFile.js +33 -0
  27. package/lib/PrCleanupWorkflow.d.ts +9 -0
  28. package/lib/PrCleanupWorkflow.js +100 -0
  29. package/lib/PrDeployWorkflow.d.ts +10 -0
  30. package/lib/PrDeployWorkflow.js +106 -0
  31. package/lib/ProductionDeployWorkflow.d.ts +11 -0
  32. package/lib/ProductionDeployWorkflow.js +68 -0
  33. package/lib/StagingDeployWorkflow.d.ts +11 -0
  34. package/lib/StagingDeployWorkflow.js +68 -0
  35. package/lib/StaticWebsiteConstructFile.d.ts +5 -0
  36. package/lib/StaticWebsiteConstructFile.js +198 -0
  37. package/lib/ViteReactProject.d.ts +45 -0
  38. package/lib/ViteReactProject.js +654 -0
  39. package/lib/index.d.ts +5 -0
  40. package/lib/index.js +20 -0
  41. package/package.json +125 -0
@@ -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,5 @@
1
+ import { SampleFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ export declare class MainTestFile extends SampleFile {
4
+ constructor(project: AwsCdkTypeScriptApp);
5
+ }
@@ -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=
@@ -0,0 +1,5 @@
1
+ import { SampleFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ export declare class StaticWebsiteConstructFile extends SampleFile {
4
+ constructor(project: AwsCdkTypeScriptApp);
5
+ }