@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,5 @@
1
+ import { TextFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ export declare class BaseApplicationStackFile extends TextFile {
4
+ constructor(project: AwsCdkTypeScriptApp);
5
+ }
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseApplicationStackFile = void 0;
4
+ const projen_1 = require("projen");
5
+ class BaseApplicationStackFile extends projen_1.TextFile {
6
+ constructor(project) {
7
+ super(project, 'src/stacks/BaseApplicationStack.ts', {
8
+ marker: true,
9
+ readonly: true,
10
+ lines: [
11
+ 'import { CfnOutput, Stack, StackProps } from \'aws-cdk-lib\';',
12
+ 'import { Vpc } from \'aws-cdk-lib/aws-ec2\';',
13
+ 'import { Function } from \'aws-cdk-lib/aws-lambda\';',
14
+ 'import { HostedZone, IHostedZone } from \'aws-cdk-lib/aws-route53\';',
15
+ 'import { Secret } from \'aws-cdk-lib/aws-secretsmanager\';',
16
+ 'import { Construct } from \'constructs\';',
17
+ 'import { DatadogLambda } from \'datadog-cdk-constructs-v2\';',
18
+ 'import { Api } from \'../constructs/Api\';',
19
+ 'import { StaticWebsite } from \'../constructs/StaticWebsite\';',
20
+ '',
21
+ 'export interface BaseApplicationStackProps extends StackProps {',
22
+ '',
23
+ ' readonly datadog?: {',
24
+ ' /**',
25
+ ' * The version of the Datadog Node.js Lambda layer to use.',
26
+ ' *',
27
+ ' * @default 128',
28
+ ' */',
29
+ ' readonly nodeLayerVersion?: number;',
30
+ '',
31
+ ' /**',
32
+ ' * The name of the project/service for Datadog tagging purposes.',
33
+ ' *',
34
+ ' * @default - uses the stack ID',
35
+ ' */',
36
+ ' readonly projectName?: string;',
37
+ ' };',
38
+ ' /**',
39
+ ' * The domain name of the Route 53 hosted zone to use.',
40
+ ' *',
41
+ ' * @example \'macedon.sandbox.defiance.ai\'',
42
+ ' */',
43
+ ' readonly hostedZoneDomainName: string;',
44
+ '',
45
+ ' /**',
46
+ ' * The ARN of the Secrets Manager secret that contains the Datadog API key.',
47
+ ' */',
48
+ ' readonly datadogSecretArn: `arn:aws:secretsmanager:${string}:${string}:secret:${string}`;',
49
+ '',
50
+ ' /**',
51
+ ' * The Clerk JWT verification key or URL.',
52
+ ' */',
53
+ ' readonly clerkJwtVerificationKey: `https://${string}/.well-known/jwks.json`;',
54
+ '',
55
+ ' /**',
56
+ ' * The N8N endpoint base URL.',
57
+ ' *',
58
+ ' * @example \'https://workflow.sandbox.defiance.ai/\'',
59
+ ' */',
60
+ ' readonly n8nEndpoint: string;',
61
+ '',
62
+ ' /**',
63
+ ' * The name of the VPC to create.',
64
+ ' *',
65
+ ' * @default \'${id}-vpc\'',
66
+ ' */',
67
+ ' readonly vpcName?: string;',
68
+ '',
69
+ ' /**',
70
+ ' * The hostname for the static website. This will be added to the hostedzone.',
71
+ ' *',
72
+ ' * @example \'myboi\'',
73
+ ' * @default \'mvp\'',
74
+ ' */',
75
+ ' readonly hostname: string;',
76
+ '}',
77
+ '',
78
+ 'export class BaseApplicationStack extends Stack {',
79
+ ' protected datadog: DatadogLambda;',
80
+ ' protected hostedZone: IHostedZone;',
81
+ ' protected vpc: Vpc;',
82
+ ' protected api: Api;',
83
+ '',
84
+ ' constructor(scope: Construct, private id: string, private props: BaseApplicationStackProps) {',
85
+ ' super(scope, id, props);',
86
+ '',
87
+ ' if (!this.props.clerkJwtVerificationKey) {',
88
+ ' throw new Error(\'clerkJwtVerificationKey is required\');',
89
+ ' }',
90
+ '',
91
+ ' this.createDatadogExtension();',
92
+ ' if (!this.datadog) {',
93
+ ' throw new Error(\'Datadog extension creation failed\');',
94
+ ' }',
95
+ '',
96
+ ' this.createHostedZone();',
97
+ ' if (!this.hostedZone) {',
98
+ ' throw new Error(\'HostedZone creation failed\');',
99
+ ' }',
100
+ '',
101
+ ' this.createVpc();',
102
+ '',
103
+ ' this.createApi();',
104
+ ' if (!this.api) {',
105
+ ' throw new Error(\'API creation failed\');',
106
+ ' }',
107
+ '',
108
+ ' this.createStaticWebsite();',
109
+ '',
110
+ ' this.registerLambdaFunctionsInDatadog();',
111
+ ' this.createOutputs();',
112
+ ' }',
113
+ '',
114
+ ' protected createStaticWebsite() {',
115
+ ' new StaticWebsite(this, \'StaticWebsite\', {',
116
+ ' hostedZone: this.hostedZone,',
117
+ ' api: this.api.restApi,',
118
+ ' hostname: this.props.hostname,',
119
+ ' });',
120
+ ' }',
121
+ '',
122
+ ' protected createApi() {',
123
+ ' this.api = new Api(this, \'Api\', {',
124
+ ' vpc: this.vpc,',
125
+ ' clerkJwtVerificationKey: this.props.clerkJwtVerificationKey,',
126
+ ' n8nEndpoint: this.props.n8nEndpoint,',
127
+ ' });',
128
+ ' }',
129
+ '',
130
+ ' protected createVpc() {',
131
+ ' this.vpc = new Vpc(this, \'VPC\', {',
132
+ ' vpcName: this.props.vpcName || `${this.id}-vpc`,',
133
+ ' maxAzs: 3,',
134
+ ' natGateways: 1,',
135
+ ' });',
136
+ ' }',
137
+ '',
138
+ ' protected createHostedZone() {',
139
+ ' this.hostedZone = HostedZone.fromLookup(this, \'HostedZone\', {',
140
+ ' domainName: this.props.hostedZoneDomainName,',
141
+ ' });',
142
+ ' }',
143
+ '',
144
+ ' protected createOutputs() {',
145
+ ' new CfnOutput(this, \'WebsiteUrl\', {',
146
+ ' value: `https://${this.props.hostname}.${this.hostedZone.zoneName}`,',
147
+ ' description: \'The URL of the static website\',',
148
+ ' exportName: `${this.id.replace(/\\//, \'-\')}-WebsiteUrl`,',
149
+ ' });',
150
+ ' }',
151
+ '',
152
+ ' protected registerLambdaFunctionsInDatadog(...funcs: Function[]) {',
153
+ ' this.datadog.addLambdaFunctions(funcs);',
154
+ ' }',
155
+ '',
156
+ ' protected createDatadogExtension() {',
157
+ ' const datadogApiSecret = Secret.fromSecretCompleteArn(this, \'DatadogApiKey\', this.props.datadogSecretArn);',
158
+ ' this.datadog = new DatadogLambda(this, \'Datadog\', {',
159
+ ' apiKeySecret: datadogApiSecret,',
160
+ ' service: this.props.datadog?.projectName || this.id,',
161
+ ' nodeLayerVersion: this.props.datadog?.nodeLayerVersion || 128,',
162
+ ' extensionLayerVersion: 86,',
163
+ ' });',
164
+ ' }',
165
+ '}',
166
+ '',
167
+ ],
168
+ });
169
+ }
170
+ }
171
+ exports.BaseApplicationStackFile = BaseApplicationStackFile;
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUFwcGxpY2F0aW9uU3RhY2tGaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Jhc2VBcHBsaWNhdGlvblN0YWNrRmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBa0M7QUFHbEMsTUFBYSx3QkFBeUIsU0FBUSxpQkFBUTtJQUNwRCxZQUFZLE9BQTRCO1FBQ3RDLEtBQUssQ0FBQyxPQUFPLEVBQUUsb0NBQW9DLEVBQUU7WUFDbkQsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRTtnQkFDTCwrREFBK0Q7Z0JBQy9ELDhDQUE4QztnQkFDOUMsc0RBQXNEO2dCQUN0RCxzRUFBc0U7Z0JBQ3RFLDREQUE0RDtnQkFDNUQsMkNBQTJDO2dCQUMzQyw4REFBOEQ7Z0JBQzlELDRDQUE0QztnQkFDNUMsZ0VBQWdFO2dCQUNoRSxFQUFFO2dCQUNGLGlFQUFpRTtnQkFDakUsRUFBRTtnQkFDRix3QkFBd0I7Z0JBQ3hCLFNBQVM7Z0JBQ1QsZ0VBQWdFO2dCQUNoRSxRQUFRO2dCQUNSLHFCQUFxQjtnQkFDckIsU0FBUztnQkFDVCx5Q0FBeUM7Z0JBQ3pDLEVBQUU7Z0JBQ0YsU0FBUztnQkFDVCxzRUFBc0U7Z0JBQ3RFLFFBQVE7Z0JBQ1IscUNBQXFDO2dCQUNyQyxTQUFTO2dCQUNULG9DQUFvQztnQkFDcEMsTUFBTTtnQkFDTixPQUFPO2dCQUNQLDBEQUEwRDtnQkFDMUQsTUFBTTtnQkFDTiwrQ0FBK0M7Z0JBQy9DLE9BQU87Z0JBQ1AsMENBQTBDO2dCQUMxQyxFQUFFO2dCQUNGLE9BQU87Z0JBQ1AsK0VBQStFO2dCQUMvRSxPQUFPO2dCQUNQLDZGQUE2RjtnQkFDN0YsRUFBRTtnQkFDRixPQUFPO2dCQUNQLDZDQUE2QztnQkFDN0MsT0FBTztnQkFDUCxnRkFBZ0Y7Z0JBQ2hGLEVBQUU7Z0JBQ0YsT0FBTztnQkFDUCxpQ0FBaUM7Z0JBQ2pDLE1BQU07Z0JBQ04seURBQXlEO2dCQUN6RCxPQUFPO2dCQUNQLGlDQUFpQztnQkFDakMsRUFBRTtnQkFDRixPQUFPO2dCQUNQLHFDQUFxQztnQkFDckMsTUFBTTtnQkFDTiw2QkFBNkI7Z0JBQzdCLE9BQU87Z0JBQ1AsOEJBQThCO2dCQUM5QixFQUFFO2dCQUNGLE9BQU87Z0JBQ1AsaUZBQWlGO2dCQUNqRixNQUFNO2dCQUNOLHlCQUF5QjtnQkFDekIsdUJBQXVCO2dCQUN2QixPQUFPO2dCQUNQLDhCQUE4QjtnQkFDOUIsR0FBRztnQkFDSCxFQUFFO2dCQUNGLG1EQUFtRDtnQkFDbkQscUNBQXFDO2dCQUNyQyxzQ0FBc0M7Z0JBQ3RDLHVCQUF1QjtnQkFDdkIsdUJBQXVCO2dCQUN2QixFQUFFO2dCQUNGLGlHQUFpRztnQkFDakcsOEJBQThCO2dCQUM5QixFQUFFO2dCQUNGLGdEQUFnRDtnQkFDaEQsaUVBQWlFO2dCQUNqRSxPQUFPO2dCQUNQLEVBQUU7Z0JBQ0Ysb0NBQW9DO2dCQUNwQywwQkFBMEI7Z0JBQzFCLCtEQUErRDtnQkFDL0QsT0FBTztnQkFDUCxFQUFFO2dCQUNGLDhCQUE4QjtnQkFDOUIsNkJBQTZCO2dCQUM3Qix3REFBd0Q7Z0JBQ3hELE9BQU87Z0JBQ1AsRUFBRTtnQkFDRix1QkFBdUI7Z0JBQ3ZCLEVBQUU7Z0JBQ0YsdUJBQXVCO2dCQUN2QixzQkFBc0I7Z0JBQ3RCLGlEQUFpRDtnQkFDakQsT0FBTztnQkFDUCxFQUFFO2dCQUNGLGlDQUFpQztnQkFDakMsRUFBRTtnQkFDRiw4Q0FBOEM7Z0JBQzlDLDJCQUEyQjtnQkFDM0IsS0FBSztnQkFDTCxFQUFFO2dCQUNGLHFDQUFxQztnQkFDckMsa0RBQWtEO2dCQUNsRCxvQ0FBb0M7Z0JBQ3BDLDhCQUE4QjtnQkFDOUIsc0NBQXNDO2dCQUN0QyxTQUFTO2dCQUNULEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRiwyQkFBMkI7Z0JBQzNCLHlDQUF5QztnQkFDekMsc0JBQXNCO2dCQUN0QixvRUFBb0U7Z0JBQ3BFLDRDQUE0QztnQkFDNUMsU0FBUztnQkFDVCxLQUFLO2dCQUNMLEVBQUU7Z0JBQ0YsMkJBQTJCO2dCQUMzQix5Q0FBeUM7Z0JBQ3pDLHdEQUF3RDtnQkFDeEQsa0JBQWtCO2dCQUNsQix1QkFBdUI7Z0JBQ3ZCLFNBQVM7Z0JBQ1QsS0FBSztnQkFDTCxFQUFFO2dCQUNGLGtDQUFrQztnQkFDbEMscUVBQXFFO2dCQUNyRSxvREFBb0Q7Z0JBQ3BELFNBQVM7Z0JBQ1QsS0FBSztnQkFDTCxFQUFFO2dCQUNGLCtCQUErQjtnQkFDL0IsMkNBQTJDO2dCQUMzQyw0RUFBNEU7Z0JBQzVFLHVEQUF1RDtnQkFDdkQsa0VBQWtFO2dCQUNsRSxTQUFTO2dCQUNULEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRixzRUFBc0U7Z0JBQ3RFLDZDQUE2QztnQkFDN0MsS0FBSztnQkFDTCxFQUFFO2dCQUNGLHdDQUF3QztnQkFDeEMsa0hBQWtIO2dCQUNsSCwyREFBMkQ7Z0JBQzNELHVDQUF1QztnQkFDdkMsNERBQTREO2dCQUM1RCxzRUFBc0U7Z0JBQ3RFLGtDQUFrQztnQkFDbEMsU0FBUztnQkFDVCxLQUFLO2dCQUNMLEdBQUc7Z0JBQ0gsRUFBRTthQUNIO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBcktELDREQXFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRleHRGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5cbmV4cG9ydCBjbGFzcyBCYXNlQXBwbGljYXRpb25TdGFja0ZpbGUgZXh0ZW5kcyBUZXh0RmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnc3JjL3N0YWNrcy9CYXNlQXBwbGljYXRpb25TdGFjay50cycsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgJ2ltcG9ydCB7IENmbk91dHB1dCwgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tIFxcJ2F3cy1jZGstbGliXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBWcGMgfSBmcm9tIFxcJ2F3cy1jZGstbGliL2F3cy1lYzJcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSBcXCdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBIb3N0ZWRab25lLCBJSG9zdGVkWm9uZSB9IGZyb20gXFwnYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IFNlY3JldCB9IGZyb20gXFwnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFxcJ2NvbnN0cnVjdHNcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IERhdGFkb2dMYW1iZGEgfSBmcm9tIFxcJ2RhdGFkb2ctY2RrLWNvbnN0cnVjdHMtdjJcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IEFwaSB9IGZyb20gXFwnLi4vY29uc3RydWN0cy9BcGlcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IFN0YXRpY1dlYnNpdGUgfSBmcm9tIFxcJy4uL2NvbnN0cnVjdHMvU3RhdGljV2Vic2l0ZVxcJzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2V4cG9ydCBpbnRlcmZhY2UgQmFzZUFwcGxpY2F0aW9uU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMgeycsXG4gICAgICAgICcnLFxuICAgICAgICAnICByZWFkb25seSBkYXRhZG9nPzogeycsXG4gICAgICAgICcgICAgLyoqJyxcbiAgICAgICAgJyAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgRGF0YWRvZyBOb2RlLmpzIExhbWJkYSBsYXllciB0byB1c2UuJyxcbiAgICAgICAgJyAgICAgKicsXG4gICAgICAgICcgICAgICogQGRlZmF1bHQgMTI4JyxcbiAgICAgICAgJyAgICAgKi8nLFxuICAgICAgICAnICAgIHJlYWRvbmx5IG5vZGVMYXllclZlcnNpb24/OiBudW1iZXI7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgLyoqJyxcbiAgICAgICAgJyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC9zZXJ2aWNlIGZvciBEYXRhZG9nIHRhZ2dpbmcgcHVycG9zZXMuJyxcbiAgICAgICAgJyAgICAgKicsXG4gICAgICAgICcgICAgICogQGRlZmF1bHQgLSB1c2VzIHRoZSBzdGFjayBJRCcsXG4gICAgICAgICcgICAgICovJyxcbiAgICAgICAgJyAgICByZWFkb25seSBwcm9qZWN0TmFtZT86IHN0cmluZzsnLFxuICAgICAgICAnICB9OycsXG4gICAgICAgICcgIC8qKicsXG4gICAgICAgICcgICAqIFRoZSBkb21haW4gbmFtZSBvZiB0aGUgUm91dGUgNTMgaG9zdGVkIHpvbmUgdG8gdXNlLicsXG4gICAgICAgICcgICAqJyxcbiAgICAgICAgJyAgICogQGV4YW1wbGUgXFwnbWFjZWRvbi5zYW5kYm94LmRlZmlhbmNlLmFpXFwnJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgaG9zdGVkWm9uZURvbWFpbk5hbWU6IHN0cmluZzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIEFSTiBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCB0aGF0IGNvbnRhaW5zIHRoZSBEYXRhZG9nIEFQSSBrZXkuJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgZGF0YWRvZ1NlY3JldEFybjogYGFybjphd3M6c2VjcmV0c21hbmFnZXI6JHtzdHJpbmd9OiR7c3RyaW5nfTpzZWNyZXQ6JHtzdHJpbmd9YDsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIENsZXJrIEpXVCB2ZXJpZmljYXRpb24ga2V5IG9yIFVSTC4nLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSBjbGVya0p3dFZlcmlmaWNhdGlvbktleTogYGh0dHBzOi8vJHtzdHJpbmd9Ly53ZWxsLWtub3duL2p3a3MuanNvbmA7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIC8qKicsXG4gICAgICAgICcgICAqIFRoZSBOOE4gZW5kcG9pbnQgYmFzZSBVUkwuJyxcbiAgICAgICAgJyAgIConLFxuICAgICAgICAnICAgKiBAZXhhbXBsZSBcXCdodHRwczovL3dvcmtmbG93LnNhbmRib3guZGVmaWFuY2UuYWkvXFwnJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgbjhuRW5kcG9pbnQ6IHN0cmluZzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIG5hbWUgb2YgdGhlIFZQQyB0byBjcmVhdGUuJyxcbiAgICAgICAgJyAgIConLFxuICAgICAgICAnICAgKiBAZGVmYXVsdCBcXCcke2lkfS12cGNcXCcnLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSB2cGNOYW1lPzogc3RyaW5nOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBUaGUgaG9zdG5hbWUgZm9yIHRoZSBzdGF0aWMgd2Vic2l0ZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBob3N0ZWR6b25lLicsXG4gICAgICAgICcgICAqJyxcbiAgICAgICAgJyAgICogQGV4YW1wbGUgXFwnbXlib2lcXCcnLFxuICAgICAgICAnICAgKiBAZGVmYXVsdCBcXCdtdnBcXCcnLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSBob3N0bmFtZTogc3RyaW5nOycsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgY2xhc3MgQmFzZUFwcGxpY2F0aW9uU3RhY2sgZXh0ZW5kcyBTdGFjayB7JyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGRhdGFkb2c6IERhdGFkb2dMYW1iZGE7JyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lOycsXG4gICAgICAgICcgIHByb3RlY3RlZCB2cGM6IFZwYzsnLFxuICAgICAgICAnICBwcm90ZWN0ZWQgYXBpOiBBcGk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIHByaXZhdGUgaWQ6IHN0cmluZywgcHJpdmF0ZSBwcm9wczogQmFzZUFwcGxpY2F0aW9uU3RhY2tQcm9wcykgeycsXG4gICAgICAgICcgICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgaWYgKCF0aGlzLnByb3BzLmNsZXJrSnd0VmVyaWZpY2F0aW9uS2V5KSB7JyxcbiAgICAgICAgJyAgICAgIHRocm93IG5ldyBFcnJvcihcXCdjbGVya0p3dFZlcmlmaWNhdGlvbktleSBpcyByZXF1aXJlZFxcJyk7JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgdGhpcy5jcmVhdGVEYXRhZG9nRXh0ZW5zaW9uKCk7JyxcbiAgICAgICAgJyAgICBpZiAoIXRoaXMuZGF0YWRvZykgeycsXG4gICAgICAgICcgICAgICB0aHJvdyBuZXcgRXJyb3IoXFwnRGF0YWRvZyBleHRlbnNpb24gY3JlYXRpb24gZmFpbGVkXFwnKTsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICB0aGlzLmNyZWF0ZUhvc3RlZFpvbmUoKTsnLFxuICAgICAgICAnICAgIGlmICghdGhpcy5ob3N0ZWRab25lKSB7JyxcbiAgICAgICAgJyAgICAgIHRocm93IG5ldyBFcnJvcihcXCdIb3N0ZWRab25lIGNyZWF0aW9uIGZhaWxlZFxcJyk7JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgdGhpcy5jcmVhdGVWcGMoKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICB0aGlzLmNyZWF0ZUFwaSgpOycsXG4gICAgICAgICcgICAgaWYgKCF0aGlzLmFwaSkgeycsXG4gICAgICAgICcgICAgICB0aHJvdyBuZXcgRXJyb3IoXFwnQVBJIGNyZWF0aW9uIGZhaWxlZFxcJyk7JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgdGhpcy5jcmVhdGVTdGF0aWNXZWJzaXRlKCk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgdGhpcy5yZWdpc3RlckxhbWJkYUZ1bmN0aW9uc0luRGF0YWRvZygpOycsXG4gICAgICAgICcgICAgdGhpcy5jcmVhdGVPdXRwdXRzKCk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICBwcm90ZWN0ZWQgY3JlYXRlU3RhdGljV2Vic2l0ZSgpIHsnLFxuICAgICAgICAnICAgIG5ldyBTdGF0aWNXZWJzaXRlKHRoaXMsIFxcJ1N0YXRpY1dlYnNpdGVcXCcsIHsnLFxuICAgICAgICAnICAgICAgaG9zdGVkWm9uZTogdGhpcy5ob3N0ZWRab25lLCcsXG4gICAgICAgICcgICAgICBhcGk6IHRoaXMuYXBpLnJlc3RBcGksJyxcbiAgICAgICAgJyAgICAgIGhvc3RuYW1lOiB0aGlzLnByb3BzLmhvc3RuYW1lLCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICBwcm90ZWN0ZWQgY3JlYXRlQXBpKCkgeycsXG4gICAgICAgICcgICAgdGhpcy5hcGkgPSBuZXcgQXBpKHRoaXMsIFxcJ0FwaVxcJywgeycsXG4gICAgICAgICcgICAgICB2cGM6IHRoaXMudnBjLCcsXG4gICAgICAgICcgICAgICBjbGVya0p3dFZlcmlmaWNhdGlvbktleTogdGhpcy5wcm9wcy5jbGVya0p3dFZlcmlmaWNhdGlvbktleSwnLFxuICAgICAgICAnICAgICAgbjhuRW5kcG9pbnQ6IHRoaXMucHJvcHMubjhuRW5kcG9pbnQsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIHByb3RlY3RlZCBjcmVhdGVWcGMoKSB7JyxcbiAgICAgICAgJyAgICB0aGlzLnZwYyA9IG5ldyBWcGModGhpcywgXFwnVlBDXFwnLCB7JyxcbiAgICAgICAgJyAgICAgIHZwY05hbWU6IHRoaXMucHJvcHMudnBjTmFtZSB8fCBgJHt0aGlzLmlkfS12cGNgLCcsXG4gICAgICAgICcgICAgICBtYXhBenM6IDMsJyxcbiAgICAgICAgJyAgICAgIG5hdEdhdGV3YXlzOiAxLCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICBwcm90ZWN0ZWQgY3JlYXRlSG9zdGVkWm9uZSgpIHsnLFxuICAgICAgICAnICAgIHRoaXMuaG9zdGVkWm9uZSA9IEhvc3RlZFpvbmUuZnJvbUxvb2t1cCh0aGlzLCBcXCdIb3N0ZWRab25lXFwnLCB7JyxcbiAgICAgICAgJyAgICAgIGRvbWFpbk5hbWU6IHRoaXMucHJvcHMuaG9zdGVkWm9uZURvbWFpbk5hbWUsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIHByb3RlY3RlZCBjcmVhdGVPdXRwdXRzKCkgeycsXG4gICAgICAgICcgICAgbmV3IENmbk91dHB1dCh0aGlzLCBcXCdXZWJzaXRlVXJsXFwnLCB7JyxcbiAgICAgICAgJyAgICAgIHZhbHVlOiBgaHR0cHM6Ly8ke3RoaXMucHJvcHMuaG9zdG5hbWV9LiR7dGhpcy5ob3N0ZWRab25lLnpvbmVOYW1lfWAsJyxcbiAgICAgICAgJyAgICAgIGRlc2NyaXB0aW9uOiBcXCdUaGUgVVJMIG9mIHRoZSBzdGF0aWMgd2Vic2l0ZVxcJywnLFxuICAgICAgICAnICAgICAgZXhwb3J0TmFtZTogYCR7dGhpcy5pZC5yZXBsYWNlKC9cXFxcLy8sIFxcJy1cXCcpfS1XZWJzaXRlVXJsYCwnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgcHJvdGVjdGVkIHJlZ2lzdGVyTGFtYmRhRnVuY3Rpb25zSW5EYXRhZG9nKC4uLmZ1bmNzOiBGdW5jdGlvbltdKSB7JyxcbiAgICAgICAgJyAgICB0aGlzLmRhdGFkb2cuYWRkTGFtYmRhRnVuY3Rpb25zKGZ1bmNzKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIHByb3RlY3RlZCBjcmVhdGVEYXRhZG9nRXh0ZW5zaW9uKCkgeycsXG4gICAgICAgICcgICAgY29uc3QgZGF0YWRvZ0FwaVNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0Q29tcGxldGVBcm4odGhpcywgXFwnRGF0YWRvZ0FwaUtleVxcJywgdGhpcy5wcm9wcy5kYXRhZG9nU2VjcmV0QXJuKTsnLFxuICAgICAgICAnICAgIHRoaXMuZGF0YWRvZyA9IG5ldyBEYXRhZG9nTGFtYmRhKHRoaXMsIFxcJ0RhdGFkb2dcXCcsIHsnLFxuICAgICAgICAnICAgICAgYXBpS2V5U2VjcmV0OiBkYXRhZG9nQXBpU2VjcmV0LCcsXG4gICAgICAgICcgICAgICBzZXJ2aWNlOiB0aGlzLnByb3BzLmRhdGFkb2c/LnByb2plY3ROYW1lIHx8IHRoaXMuaWQsJyxcbiAgICAgICAgJyAgICAgIG5vZGVMYXllclZlcnNpb246IHRoaXMucHJvcHMuZGF0YWRvZz8ubm9kZUxheWVyVmVyc2lvbiB8fCAxMjgsJyxcbiAgICAgICAgJyAgICAgIGV4dGVuc2lvbkxheWVyVmVyc2lvbjogODYsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import { AwsCdkTypeScriptApp, AwsCdkTypeScriptAppOptions } from 'projen/lib/awscdk';
2
+ import { ApplicationEnvironmentConfig } from './Application';
3
+ export interface BatmanProjectOptions extends AwsCdkTypeScriptAppOptions {
4
+ /**
5
+ * Development environment configuration
6
+ */
7
+ readonly dev: ApplicationEnvironmentConfig;
8
+ /**
9
+ * Development environment configuration
10
+ */
11
+ readonly staging: ApplicationEnvironmentConfig;
12
+ /**
13
+ * Production environment configuration
14
+ */
15
+ readonly prod: ApplicationEnvironmentConfig;
16
+ /**
17
+ * Additional tags to apply to all stacks
18
+ */
19
+ readonly additionalTags?: {
20
+ [key: string]: string;
21
+ };
22
+ }
23
+ export declare class BatmanProject extends AwsCdkTypeScriptApp {
24
+ constructor(options: BatmanProjectOptions);
25
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BatmanProject = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const awscdk_1 = require("projen/lib/awscdk");
7
+ const Application_1 = require("./Application");
8
+ const GitHubRolesFile_1 = require("./GitHubRolesFile");
9
+ const ViteReactProject_1 = require("./ViteReactProject");
10
+ class BatmanProject extends awscdk_1.AwsCdkTypeScriptApp {
11
+ constructor(options) {
12
+ super({
13
+ ...options,
14
+ cdkVersion: options.cdkVersion || '2.224.0',
15
+ defaultReleaseBranch: options.defaultReleaseBranch || 'main',
16
+ name: options.name,
17
+ projenrcTs: true,
18
+ buildWorkflow: false,
19
+ deps: [
20
+ '@types/aws-lambda',
21
+ '@types/express',
22
+ '@types/pg',
23
+ 'pg',
24
+ '@aws-sdk/rds-signer',
25
+ '@matthewbonig/secret',
26
+ 'datadog-cdk-constructs-v2',
27
+ '@cdklabs/aws-lambda-rust',
28
+ '@aws-lambda-powertools/parameters',
29
+ 'jsonwebtoken',
30
+ '@aws-sdk/client-secrets-manager',
31
+ 'express',
32
+ 'serverless-http',
33
+ ...options.deps || [],
34
+ ],
35
+ devDeps: [
36
+ '@types/jsonwebtoken',
37
+ 'nodemon',
38
+ 'concurrently',
39
+ '@macedon-technologies/batman@^1.0.0',
40
+ ...options.devDeps || [],
41
+ ],
42
+ gitignore: [
43
+ 'src/constructs/handler/clerk-authorizer/target/**',
44
+ ...options.gitignore || [],
45
+ ],
46
+ tsconfig: {
47
+ ...options.tsconfig,
48
+ compilerOptions: {
49
+ ...options.tsconfig?.compilerOptions,
50
+ isolatedModules: true,
51
+ allowImportingTsExtensions: true,
52
+ },
53
+ },
54
+ sampleCode: false,
55
+ minNodeVersion: options.minNodeVersion || '22',
56
+ });
57
+ // Create standard project files
58
+ const PRIMARY_ACCOUNT = '015955817263';
59
+ const PRIMARY_REGION = 'us-east-1';
60
+ new Application_1.Application(this, {
61
+ githubRepository: `macedon-technologies/${options.name}`,
62
+ clerkPublishableKey: 'pk_test_aW50ZW5zZS1sZWVjaC0yMi5jbGVyay5hY2NvdW50cy5kZXYk',
63
+ dev: {
64
+ ...options.dev,
65
+ },
66
+ staging: {
67
+ ...options.staging,
68
+ },
69
+ prod: {
70
+ ...options.dev,
71
+ },
72
+ additionalTags: options.additionalTags,
73
+ });
74
+ new GitHubRolesFile_1.GitHubRolesFile(this, {
75
+ account: PRIMARY_ACCOUNT,
76
+ primaryRegion: PRIMARY_REGION,
77
+ });
78
+ const viteReact = new ViteReactProject_1.ViteReactProject({
79
+ name: 'web',
80
+ defaultReleaseBranch: 'main',
81
+ parent: this,
82
+ outdir: 'web',
83
+ });
84
+ viteReact.addConfigField('something', 'number');
85
+ viteReact.addConfigField('somethingElse', 'string');
86
+ const concurrently = (...args) => {
87
+ return `concurrently ${args.map(a => `"${a}"`).join(' ')}`;
88
+ };
89
+ this.addTask('dev', {
90
+ exec: concurrently('nodemon --watch ./src/constructs/handler --watch ./local/dev.ts ./local/dev.ts', viteReact.devCommand),
91
+ });
92
+ this.addTask('cdk:dev', {
93
+ exec: 'yarn cdk -a "npx ts-node -P tsconfig.json --prefer-ts-exts src/LocalDevApp.ts"',
94
+ receiveArgs: true,
95
+ });
96
+ }
97
+ }
98
+ exports.BatmanProject = BatmanProject;
99
+ _a = JSII_RTTI_SYMBOL_1;
100
+ BatmanProject[_a] = { fqn: "@macedon-technologies/batman.BatmanProject", version: "1.0.16" };
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0bWFuUHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9CYXRtYW5Qcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQW9GO0FBQ3BGLCtDQUEwRTtBQUMxRSx1REFBb0Q7QUFDcEQseURBQXNEO0FBMEJ0RCxNQUFhLGFBQWMsU0FBUSw0QkFBbUI7SUFDcEQsWUFBWSxPQUE2QjtRQUN2QyxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxTQUFTO1lBQzNDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxNQUFNO1lBQzVELElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQixhQUFhLEVBQUUsS0FBSztZQUNwQixJQUFJLEVBQUU7Z0JBQ0osbUJBQW1CO2dCQUNuQixnQkFBZ0I7Z0JBQ2hCLFdBQVc7Z0JBQ1gsSUFBSTtnQkFDSixxQkFBcUI7Z0JBQ3JCLHNCQUFzQjtnQkFDdEIsMkJBQTJCO2dCQUMzQiwwQkFBMEI7Z0JBQzFCLG1DQUFtQztnQkFDbkMsY0FBYztnQkFDZCxpQ0FBaUM7Z0JBQ2pDLFNBQVM7Z0JBQ1QsaUJBQWlCO2dCQUNqQixHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRTthQUN0QjtZQUNELE9BQU8sRUFBRTtnQkFDUCxxQkFBcUI7Z0JBQ3JCLFNBQVM7Z0JBQ1QsY0FBYztnQkFDZCxxQ0FBcUM7Z0JBQ3JDLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO2FBQ3pCO1lBQ0QsU0FBUyxFQUFFO2dCQUNULG1EQUFtRDtnQkFDbkQsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUU7YUFDM0I7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxPQUFPLENBQUMsUUFBUTtnQkFDbkIsZUFBZSxFQUFFO29CQUNmLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxlQUFlO29CQUNwQyxlQUFlLEVBQUUsSUFBSTtvQkFDckIsMEJBQTBCLEVBQUUsSUFBSTtpQkFDakM7YUFDRjtZQUNELFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUk7U0FDL0MsQ0FBQyxDQUFDO1FBR0gsZ0NBQWdDO1FBQ2hDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN2QyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUM7UUFFbkMsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRTtZQUNwQixnQkFBZ0IsRUFBRSx3QkFBd0IsT0FBTyxDQUFDLElBQUksRUFBRTtZQUN4RCxtQkFBbUIsRUFBRSwwREFBMEQ7WUFDL0UsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7YUFDZjtZQUNELE9BQU8sRUFBRTtnQkFDUCxHQUFHLE9BQU8sQ0FBQyxPQUFPO2FBQ25CO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLEdBQUcsT0FBTyxDQUFDLEdBQUc7YUFDZjtZQUNELGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztTQUN2QyxDQUFDLENBQUM7UUFFSCxJQUFJLGlDQUFlLENBQUMsSUFBSSxFQUFFO1lBQ3hCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLGFBQWEsRUFBRSxjQUFjO1NBQzlCLENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLElBQUksbUNBQWdCLENBQUM7WUFDckMsSUFBSSxFQUFFLEtBQUs7WUFDWCxvQkFBb0IsRUFBRSxNQUFNO1lBQzVCLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxTQUFTLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVwRCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBYyxFQUFFLEVBQUU7WUFDekMsT0FBTyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNsQixJQUFJLEVBQUUsWUFBWSxDQUNoQixnRkFBZ0YsRUFDaEYsU0FBUyxDQUFDLFVBQVUsQ0FDckI7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN0QixJQUFJLEVBQUUsZ0ZBQWdGO1lBQ3RGLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztJQUdMLENBQUM7O0FBbkdILHNDQW9HQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAsIEF3c0Nka1R5cGVTY3JpcHRBcHBPcHRpb25zIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuaW1wb3J0IHsgQXBwbGljYXRpb24sIEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWcgfSBmcm9tICcuL0FwcGxpY2F0aW9uJztcbmltcG9ydCB7IEdpdEh1YlJvbGVzRmlsZSB9IGZyb20gJy4vR2l0SHViUm9sZXNGaWxlJztcbmltcG9ydCB7IFZpdGVSZWFjdFByb2plY3QgfSBmcm9tICcuL1ZpdGVSZWFjdFByb2plY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhdG1hblByb2plY3RPcHRpb25zIGV4dGVuZHMgQXdzQ2RrVHlwZVNjcmlwdEFwcE9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXY6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG5cbiAgLyoqXG4gICAqIERldmVsb3BtZW50IGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHN0YWdpbmc6IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZDogQXBwbGljYXRpb25FbnZpcm9ubWVudENvbmZpZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCB0YWdzIHRvIGFwcGx5IHRvIGFsbCBzdGFja3NcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxUYWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuXG5leHBvcnQgY2xhc3MgQmF0bWFuUHJvamVjdCBleHRlbmRzIEF3c0Nka1R5cGVTY3JpcHRBcHAge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCYXRtYW5Qcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjZGtWZXJzaW9uOiBvcHRpb25zLmNka1ZlcnNpb24gfHwgJzIuMjI0LjAnLFxuICAgICAgZGVmYXVsdFJlbGVhc2VCcmFuY2g6IG9wdGlvbnMuZGVmYXVsdFJlbGVhc2VCcmFuY2ggfHwgJ21haW4nLFxuICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgcHJvamVucmNUczogdHJ1ZSxcbiAgICAgIGJ1aWxkV29ya2Zsb3c6IGZhbHNlLFxuICAgICAgZGVwczogW1xuICAgICAgICAnQHR5cGVzL2F3cy1sYW1iZGEnLFxuICAgICAgICAnQHR5cGVzL2V4cHJlc3MnLFxuICAgICAgICAnQHR5cGVzL3BnJyxcbiAgICAgICAgJ3BnJyxcbiAgICAgICAgJ0Bhd3Mtc2RrL3Jkcy1zaWduZXInLFxuICAgICAgICAnQG1hdHRoZXdib25pZy9zZWNyZXQnLFxuICAgICAgICAnZGF0YWRvZy1jZGstY29uc3RydWN0cy12MicsXG4gICAgICAgICdAY2RrbGFicy9hd3MtbGFtYmRhLXJ1c3QnLFxuICAgICAgICAnQGF3cy1sYW1iZGEtcG93ZXJ0b29scy9wYXJhbWV0ZXJzJyxcbiAgICAgICAgJ2pzb253ZWJ0b2tlbicsXG4gICAgICAgICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJyxcbiAgICAgICAgJ2V4cHJlc3MnLFxuICAgICAgICAnc2VydmVybGVzcy1odHRwJyxcbiAgICAgICAgLi4ub3B0aW9ucy5kZXBzIHx8IFtdLFxuICAgICAgXSxcbiAgICAgIGRldkRlcHM6IFtcbiAgICAgICAgJ0B0eXBlcy9qc29ud2VidG9rZW4nLFxuICAgICAgICAnbm9kZW1vbicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAnQG1hY2Vkb24tdGVjaG5vbG9naWVzL2JhdG1hbkBeMS4wLjAnLFxuICAgICAgICAuLi5vcHRpb25zLmRldkRlcHMgfHwgW10sXG4gICAgICBdLFxuICAgICAgZ2l0aWdub3JlOiBbXG4gICAgICAgICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL2NsZXJrLWF1dGhvcml6ZXIvdGFyZ2V0LyoqJyxcbiAgICAgICAgLi4ub3B0aW9ucy5naXRpZ25vcmUgfHwgW10sXG4gICAgICBdLFxuICAgICAgdHNjb25maWc6IHtcbiAgICAgICAgLi4ub3B0aW9ucy50c2NvbmZpZyxcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgLi4ub3B0aW9ucy50c2NvbmZpZz8uY29tcGlsZXJPcHRpb25zLFxuICAgICAgICAgIGlzb2xhdGVkTW9kdWxlczogdHJ1ZSxcbiAgICAgICAgICBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzYW1wbGVDb2RlOiBmYWxzZSxcbiAgICAgIG1pbk5vZGVWZXJzaW9uOiBvcHRpb25zLm1pbk5vZGVWZXJzaW9uIHx8ICcyMicsXG4gICAgfSk7XG5cblxuICAgIC8vIENyZWF0ZSBzdGFuZGFyZCBwcm9qZWN0IGZpbGVzXG4gICAgY29uc3QgUFJJTUFSWV9BQ0NPVU5UID0gJzAxNTk1NTgxNzI2Myc7XG4gICAgY29uc3QgUFJJTUFSWV9SRUdJT04gPSAndXMtZWFzdC0xJztcblxuICAgIG5ldyBBcHBsaWNhdGlvbih0aGlzLCB7XG4gICAgICBnaXRodWJSZXBvc2l0b3J5OiBgbWFjZWRvbi10ZWNobm9sb2dpZXMvJHtvcHRpb25zLm5hbWV9YCxcbiAgICAgIGNsZXJrUHVibGlzaGFibGVLZXk6ICdwa190ZXN0X2FXNTBaVzV6WlMxc1pXVmphQzB5TWk1amJHVnlheTVoWTJOdmRXNTBjeTVrWlhZaycsXG4gICAgICBkZXY6IHtcbiAgICAgICAgLi4ub3B0aW9ucy5kZXYsXG4gICAgICB9LFxuICAgICAgc3RhZ2luZzoge1xuICAgICAgICAuLi5vcHRpb25zLnN0YWdpbmcsXG4gICAgICB9LFxuICAgICAgcHJvZDoge1xuICAgICAgICAuLi5vcHRpb25zLmRldixcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsVGFnczogb3B0aW9ucy5hZGRpdGlvbmFsVGFncyxcbiAgICB9KTtcblxuICAgIG5ldyBHaXRIdWJSb2xlc0ZpbGUodGhpcywge1xuICAgICAgYWNjb3VudDogUFJJTUFSWV9BQ0NPVU5ULFxuICAgICAgcHJpbWFyeVJlZ2lvbjogUFJJTUFSWV9SRUdJT04sXG4gICAgfSk7XG5cbiAgICBjb25zdCB2aXRlUmVhY3QgPSBuZXcgVml0ZVJlYWN0UHJvamVjdCh7XG4gICAgICBuYW1lOiAnd2ViJyxcbiAgICAgIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiAnbWFpbicsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBvdXRkaXI6ICd3ZWInLFxuICAgIH0pO1xuICAgIHZpdGVSZWFjdC5hZGRDb25maWdGaWVsZCgnc29tZXRoaW5nJywgJ251bWJlcicpO1xuICAgIHZpdGVSZWFjdC5hZGRDb25maWdGaWVsZCgnc29tZXRoaW5nRWxzZScsICdzdHJpbmcnKTtcblxuICAgIGNvbnN0IGNvbmN1cnJlbnRseSA9ICguLi5hcmdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgcmV0dXJuIGBjb25jdXJyZW50bHkgJHthcmdzLm1hcChhID0+IGBcIiR7YX1cImApLmpvaW4oJyAnKX1gO1xuICAgIH07XG5cbiAgICB0aGlzLmFkZFRhc2soJ2RldicsIHtcbiAgICAgIGV4ZWM6IGNvbmN1cnJlbnRseShcbiAgICAgICAgJ25vZGVtb24gLS13YXRjaCAuL3NyYy9jb25zdHJ1Y3RzL2hhbmRsZXIgLS13YXRjaCAuL2xvY2FsL2Rldi50cyAuL2xvY2FsL2Rldi50cycsXG4gICAgICAgIHZpdGVSZWFjdC5kZXZDb21tYW5kLFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkVGFzaygnY2RrOmRldicsIHtcbiAgICAgIGV4ZWM6ICd5YXJuIGNkayAtYSBcIm5weCB0cy1ub2RlIC1QIHRzY29uZmlnLmpzb24gLS1wcmVmZXItdHMtZXh0cyBzcmMvTG9jYWxEZXZBcHAudHNcIicsXG4gICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICB9KTtcblxuXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import { SampleFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ export interface GitHubRolesFileOptions {
4
+ readonly account: string;
5
+ readonly primaryRegion: string;
6
+ }
7
+ export declare class GitHubRolesFile extends SampleFile {
8
+ constructor(project: AwsCdkTypeScriptApp, options: GitHubRolesFileOptions);
9
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubRolesFile = void 0;
4
+ const projen_1 = require("projen");
5
+ class GitHubRolesFile extends projen_1.SampleFile {
6
+ constructor(project, options) {
7
+ super(project, 'src/GitHubRoles.ts', {
8
+ contents: `import { App } from 'aws-cdk-lib';
9
+ import { GitHubRolesStack } from './stacks/GitHubRolesStack';
10
+
11
+ const app = new App();
12
+
13
+ new GitHubRolesStack(app, 'GitHubRolesStack', {
14
+ env: {
15
+ account: '${options.account}',
16
+ region: '${options.primaryRegion}',
17
+ },
18
+ });
19
+
20
+ app.synth();
21
+ `,
22
+ });
23
+ }
24
+ }
25
+ exports.GitHubRolesFile = GitHubRolesFile;
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUm9sZXNGaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dpdEh1YlJvbGVzRmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFRcEMsTUFBYSxlQUFnQixTQUFRLG1CQUFVO0lBQzdDLFlBQVksT0FBNEIsRUFBRSxPQUErQjtRQUN2RSxLQUFLLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFO1lBQ25DLFFBQVEsRUFBRTs7Ozs7OztnQkFPQSxPQUFPLENBQUMsT0FBTztlQUNoQixPQUFPLENBQUMsYUFBYTs7Ozs7Q0FLbkM7U0FDSSxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFuQkQsMENBbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2FtcGxlRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YlJvbGVzRmlsZU9wdGlvbnMge1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByaW1hcnlSZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdpdEh1YlJvbGVzRmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwLCBvcHRpb25zOiBHaXRIdWJSb2xlc0ZpbGVPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgJ3NyYy9HaXRIdWJSb2xlcy50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgaW1wb3J0IHsgQXBwIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgR2l0SHViUm9sZXNTdGFjayB9IGZyb20gJy4vc3RhY2tzL0dpdEh1YlJvbGVzU3RhY2snO1xuXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5cbm5ldyBHaXRIdWJSb2xlc1N0YWNrKGFwcCwgJ0dpdEh1YlJvbGVzU3RhY2snLCB7XG4gIGVudjoge1xuICAgIGFjY291bnQ6ICcke29wdGlvbnMuYWNjb3VudH0nLFxuICAgIHJlZ2lvbjogJyR7b3B0aW9ucy5wcmltYXJ5UmVnaW9ufScsXG4gIH0sXG59KTtcblxuYXBwLnN5bnRoKCk7XG5gLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ import { SampleFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ export interface GitHubRolesStackFileOptions {
4
+ readonly githubRepository: string;
5
+ }
6
+ export declare class GitHubRolesStackFile extends SampleFile {
7
+ constructor(project: AwsCdkTypeScriptApp, options: GitHubRolesStackFileOptions);
8
+ }
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubRolesStackFile = void 0;
4
+ const projen_1 = require("projen");
5
+ class GitHubRolesStackFile extends projen_1.SampleFile {
6
+ constructor(project, options) {
7
+ super(project, 'src/stacks/GitHubRolesStack.ts', {
8
+ contents: `import { CfnOutput, Stack, StackProps } from 'aws-cdk-lib';
9
+ import { OpenIdConnectProvider, Role, WebIdentityPrincipal, PolicyStatement, Effect } from 'aws-cdk-lib/aws-iam';
10
+ import { Construct } from 'constructs';
11
+
12
+ export class GitHubRolesStack extends Stack {
13
+ private githubOidcProvider: OpenIdConnectProvider;
14
+ private githubActionsRole: Role;
15
+
16
+ constructor(scope: Construct, id: string, props?: StackProps) {
17
+ super(scope, id, props);
18
+
19
+ this.createOidcProvider();
20
+ if (!this.githubOidcProvider) {
21
+ throw new Error('Failed to create GitHub OIDC provider');
22
+ }
23
+
24
+ this.createGitHubActionsRole();
25
+ if (!this.githubActionsRole) {
26
+ throw new Error('Failed to create GitHub Actions role');
27
+ }
28
+
29
+ this.addRolePermissions();
30
+ this.createOutputs();
31
+ }
32
+
33
+ protected createOidcProvider() {
34
+ this.githubOidcProvider = new OpenIdConnectProvider(this, 'GitHubOidcProvider', {
35
+ url: 'https://token.actions.githubusercontent.com',
36
+ clientIds: ['sts.amazonaws.com'],
37
+ thumbprints: ['6938fd4d98bab03faadb97b34396831e3780aea1'],
38
+ });
39
+ }
40
+
41
+ protected createGitHubActionsRole() {
42
+ this.githubActionsRole = new Role(this, 'GitHubActionsRole', {
43
+ assumedBy: new WebIdentityPrincipal(
44
+ this.githubOidcProvider.openIdConnectProviderArn,
45
+ {
46
+ StringEquals: {
47
+ 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com',
48
+ },
49
+ StringLike: {
50
+ 'token.actions.githubusercontent.com:sub': 'repo:${options.githubRepository}:*',
51
+ },
52
+ },
53
+ ),
54
+ description: 'Role for GitHub Actions to deploy AWS resources',
55
+ });
56
+ }
57
+
58
+ protected addRolePermissions() {
59
+ // Add permissions for API Gateway
60
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
61
+ effect: Effect.ALLOW,
62
+ actions: [
63
+ 'apigateway:*',
64
+ ],
65
+ resources: ['*'],
66
+ }));
67
+
68
+ // Add permissions for S3 Buckets
69
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
70
+ effect: Effect.ALLOW,
71
+ actions: [
72
+ 's3:*',
73
+ ],
74
+ resources: ['*'],
75
+ }));
76
+
77
+ // Add permissions for CloudFront distributions
78
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
79
+ effect: Effect.ALLOW,
80
+ actions: [
81
+ 'cloudfront:*',
82
+ ],
83
+ resources: ['*'],
84
+ }));
85
+
86
+ // Add permissions for ACM Certificates
87
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
88
+ effect: Effect.ALLOW,
89
+ actions: [
90
+ 'acm:*',
91
+ ],
92
+ resources: ['*'],
93
+ }));
94
+
95
+ // Add permissions for Route53 DNS entries
96
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
97
+ effect: Effect.ALLOW,
98
+ actions: [
99
+ 'route53:*',
100
+ ],
101
+ resources: ['*'],
102
+ }));
103
+
104
+ // Add permissions for Lambda functions
105
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
106
+ effect: Effect.ALLOW,
107
+ actions: [
108
+ 'lambda:*',
109
+ ],
110
+ resources: ['*'],
111
+ }));
112
+
113
+ // Add permissions for IAM roles
114
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
115
+ effect: Effect.ALLOW,
116
+ actions: [
117
+ 'iam:*',
118
+ ],
119
+ resources: ['*'],
120
+ }));
121
+
122
+ // Add CloudFormation permissions needed for CDK deployments
123
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
124
+ effect: Effect.ALLOW,
125
+ actions: [
126
+ 'cloudformation:*',
127
+ ],
128
+ resources: ['*'],
129
+ }));
130
+
131
+ // Add SSM permissions for CDK context and parameters
132
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
133
+ effect: Effect.ALLOW,
134
+ actions: [
135
+ 'ssm:GetParameter',
136
+ 'ssm:GetParameters',
137
+ 'ssm:GetParametersByPath',
138
+ ],
139
+ resources: ['*'],
140
+ }));
141
+
142
+ // Add STS permissions for assuming roles
143
+ this.githubActionsRole.addToPolicy(new PolicyStatement({
144
+ effect: Effect.ALLOW,
145
+ actions: [
146
+ 'sts:AssumeRole',
147
+ ],
148
+ resources: ['*'],
149
+ }));
150
+ }
151
+
152
+ protected createOutputs() {
153
+ new CfnOutput(this, 'GitHubActionsRoleArn', {
154
+ value: this.githubActionsRole.roleArn,
155
+ description: 'The ARN of the GitHub Actions IAM Role',
156
+ exportName: 'GitHubActionsRoleArn',
157
+ });
158
+ }
159
+ }
160
+ `,
161
+ });
162
+ }
163
+ }
164
+ exports.GitHubRolesStackFile = GitHubRolesStackFile;
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUm9sZXNTdGFja0ZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvR2l0SHViUm9sZXNTdGFja0ZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBT3BDLE1BQWEsb0JBQXFCLFNBQVEsbUJBQVU7SUFDbEQsWUFBWSxPQUE0QixFQUFFLE9BQW9DO1FBQzVFLEtBQUssQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUU7WUFDL0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0RBMEMrQyxPQUFPLENBQUMsZ0JBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThHdEY7U0FDSSxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE5SkQsb0RBOEpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2FtcGxlRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YlJvbGVzU3RhY2tGaWxlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGdpdGh1YlJlcG9zaXRvcnk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdpdEh1YlJvbGVzU3RhY2tGaWxlIGV4dGVuZHMgU2FtcGxlRmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHAsIG9wdGlvbnM6IEdpdEh1YlJvbGVzU3RhY2tGaWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHByb2plY3QsICdzcmMvc3RhY2tzL0dpdEh1YlJvbGVzU3RhY2sudHMnLCB7XG4gICAgICBjb250ZW50czogYGltcG9ydCB7IENmbk91dHB1dCwgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBPcGVuSWRDb25uZWN0UHJvdmlkZXIsIFJvbGUsIFdlYklkZW50aXR5UHJpbmNpcGFsLCBQb2xpY3lTdGF0ZW1lbnQsIEVmZmVjdCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBjbGFzcyBHaXRIdWJSb2xlc1N0YWNrIGV4dGVuZHMgU3RhY2sge1xuICBwcml2YXRlIGdpdGh1Yk9pZGNQcm92aWRlcjogT3BlbklkQ29ubmVjdFByb3ZpZGVyO1xuICBwcml2YXRlIGdpdGh1YkFjdGlvbnNSb2xlOiBSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jcmVhdGVPaWRjUHJvdmlkZXIoKTtcbiAgICBpZiAoIXRoaXMuZ2l0aHViT2lkY1Byb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgR2l0SHViIE9JREMgcHJvdmlkZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZUdpdEh1YkFjdGlvbnNSb2xlKCk7XG4gICAgaWYgKCF0aGlzLmdpdGh1YkFjdGlvbnNSb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgR2l0SHViIEFjdGlvbnMgcm9sZScpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUm9sZVBlcm1pc3Npb25zKCk7XG4gICAgdGhpcy5jcmVhdGVPdXRwdXRzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT2lkY1Byb3ZpZGVyKCkge1xuICAgIHRoaXMuZ2l0aHViT2lkY1Byb3ZpZGVyID0gbmV3IE9wZW5JZENvbm5lY3RQcm92aWRlcih0aGlzLCAnR2l0SHViT2lkY1Byb3ZpZGVyJywge1xuICAgICAgdXJsOiAnaHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbScsXG4gICAgICBjbGllbnRJZHM6IFsnc3RzLmFtYXpvbmF3cy5jb20nXSxcbiAgICAgIHRodW1icHJpbnRzOiBbJzY5MzhmZDRkOThiYWIwM2ZhYWRiOTdiMzQzOTY4MzFlMzc4MGFlYTEnXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVHaXRIdWJBY3Rpb25zUm9sZSgpIHtcbiAgICB0aGlzLmdpdGh1YkFjdGlvbnNSb2xlID0gbmV3IFJvbGUodGhpcywgJ0dpdEh1YkFjdGlvbnNSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgV2ViSWRlbnRpdHlQcmluY2lwYWwoXG4gICAgICAgIHRoaXMuZ2l0aHViT2lkY1Byb3ZpZGVyLm9wZW5JZENvbm5lY3RQcm92aWRlckFybixcbiAgICAgICAge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgJ3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tOmF1ZCc6ICdzdHMuYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBTdHJpbmdMaWtlOiB7XG4gICAgICAgICAgICAndG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb206c3ViJzogJ3JlcG86JHtvcHRpb25zLmdpdGh1YlJlcG9zaXRvcnl9OionLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgZGVzY3JpcHRpb246ICdSb2xlIGZvciBHaXRIdWIgQWN0aW9ucyB0byBkZXBsb3kgQVdTIHJlc291cmNlcycsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkUm9sZVBlcm1pc3Npb25zKCkge1xuICAgIC8vIEFkZCBwZXJtaXNzaW9ucyBmb3IgQVBJIEdhdGV3YXlcbiAgICB0aGlzLmdpdGh1YkFjdGlvbnNSb2xlLmFkZFRvUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdhcGlnYXRld2F5OionLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQWRkIHBlcm1pc3Npb25zIGZvciBTMyBCdWNrZXRzXG4gICAgdGhpcy5naXRodWJBY3Rpb25zUm9sZS5hZGRUb1BvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnczM6KicsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBBZGQgcGVybWlzc2lvbnMgZm9yIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uc1xuICAgIHRoaXMuZ2l0aHViQWN0aW9uc1JvbGUuYWRkVG9Qb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2Nsb3VkZnJvbnQ6KicsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBBZGQgcGVybWlzc2lvbnMgZm9yIEFDTSBDZXJ0aWZpY2F0ZXNcbiAgICB0aGlzLmdpdGh1YkFjdGlvbnNSb2xlLmFkZFRvUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdhY206KicsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBBZGQgcGVybWlzc2lvbnMgZm9yIFJvdXRlNTMgRE5TIGVudHJpZXNcbiAgICB0aGlzLmdpdGh1YkFjdGlvbnNSb2xlLmFkZFRvUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdyb3V0ZTUzOionLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQWRkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgZnVuY3Rpb25zXG4gICAgdGhpcy5naXRodWJBY3Rpb25zUm9sZS5hZGRUb1BvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnbGFtYmRhOionLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQWRkIHBlcm1pc3Npb25zIGZvciBJQU0gcm9sZXNcbiAgICB0aGlzLmdpdGh1YkFjdGlvbnNSb2xlLmFkZFRvUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdpYW06KicsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBBZGQgQ2xvdWRGb3JtYXRpb24gcGVybWlzc2lvbnMgbmVlZGVkIGZvciBDREsgZGVwbG95bWVudHNcbiAgICB0aGlzLmdpdGh1YkFjdGlvbnNSb2xlLmFkZFRvUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdjbG91ZGZvcm1hdGlvbjoqJyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcblxuICAgIC8vIEFkZCBTU00gcGVybWlzc2lvbnMgZm9yIENESyBjb250ZXh0IGFuZCBwYXJhbWV0ZXJzXG4gICAgdGhpcy5naXRodWJBY3Rpb25zUm9sZS5hZGRUb1BvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnc3NtOkdldFBhcmFtZXRlcicsXG4gICAgICAgICdzc206R2V0UGFyYW1ldGVycycsXG4gICAgICAgICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBBZGQgU1RTIHBlcm1pc3Npb25zIGZvciBhc3N1bWluZyByb2xlc1xuICAgIHRoaXMuZ2l0aHViQWN0aW9uc1JvbGUuYWRkVG9Qb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ3N0czpBc3N1bWVSb2xlJyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVPdXRwdXRzKCkge1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgJ0dpdEh1YkFjdGlvbnNSb2xlQXJuJywge1xuICAgICAgdmFsdWU6IHRoaXMuZ2l0aHViQWN0aW9uc1JvbGUucm9sZUFybixcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIEFSTiBvZiB0aGUgR2l0SHViIEFjdGlvbnMgSUFNIFJvbGUnLFxuICAgICAgZXhwb3J0TmFtZTogJ0dpdEh1YkFjdGlvbnNSb2xlQXJuJyxcbiAgICB9KTtcbiAgfVxufVxuYCxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { SampleFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ import { EnvironmentConfig } from './MainFile';
4
+ export interface LocalDevAppFileOptions {
5
+ readonly projectName: string;
6
+ readonly dev: EnvironmentConfig;
7
+ }
8
+ export declare class LocalDevAppFile extends SampleFile {
9
+ constructor(project: AwsCdkTypeScriptApp, options: LocalDevAppFileOptions);
10
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalDevAppFile = void 0;
4
+ const projen_1 = require("projen");
5
+ class LocalDevAppFile extends projen_1.SampleFile {
6
+ constructor(project, options) {
7
+ super(project, 'src/LocalDevApp.ts', {
8
+ contents: `import { App } from 'aws-cdk-lib';
9
+ import { ApplicationStack } from './stacks/ApplicationStack';
10
+
11
+ const app = new App();
12
+
13
+ let context = app.node.tryGetContext('local-dev-prefix');
14
+ if (!context) {
15
+ throw new Error("Context variable 'local-dev-prefix' is required for local development stack. Provide it like: \`yarn cdk:dev --context local-dev-prefix=your-handle diff\`");
16
+ }
17
+ new ApplicationStack(app, \`${options.projectName}-dev-\${context}\`, {
18
+ env: {
19
+ account: '${options.dev.account}',
20
+ region: '${options.dev.region}',
21
+ },
22
+ hostedZoneDomainName: '${options.dev.hostedZoneDomainName}',
23
+ hostname: context, // there should be a way to block anon-dev...
24
+ datadogSecretArn: '${options.dev.datadogSecretArn}',
25
+ clerkJwtVerificationKey: '${options.dev.clerkJwtVerificationKey}',
26
+ n8nEndpoint: '${options.dev.n8nEndpoint}',
27
+ });
28
+ app.synth();
29
+ `,
30
+ });
31
+ }
32
+ }
33
+ exports.LocalDevAppFile = LocalDevAppFile;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9jYWxEZXZBcHBGaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0xvY2FsRGV2QXBwRmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFTcEMsTUFBYSxlQUFnQixTQUFRLG1CQUFVO0lBQzdDLFlBQVksT0FBNEIsRUFBRSxPQUErQjtRQUN2RSxLQUFLLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFO1lBQ25DLFFBQVEsRUFBRTs7Ozs7Ozs7OzhCQVNjLE9BQU8sQ0FBQyxXQUFXOztnQkFFakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPO2VBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTs7MkJBRU4sT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0I7O3VCQUVwQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQjs4QkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUI7a0JBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVzs7O0NBR3hDO1NBQ0ksQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBM0JELDBDQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbXBsZUZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcbmltcG9ydCB7IEVudmlyb25tZW50Q29uZmlnIH0gZnJvbSAnLi9NYWluRmlsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxEZXZBcHBGaWxlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRldjogRW52aXJvbm1lbnRDb25maWc7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2NhbERldkFwcEZpbGUgZXh0ZW5kcyBTYW1wbGVGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCwgb3B0aW9uczogTG9jYWxEZXZBcHBGaWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHByb2plY3QsICdzcmMvTG9jYWxEZXZBcHAudHMnLCB7XG4gICAgICBjb250ZW50czogYGltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RhY2sgfSBmcm9tICcuL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrJztcblxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuXG5sZXQgY29udGV4dCA9IGFwcC5ub2RlLnRyeUdldENvbnRleHQoJ2xvY2FsLWRldi1wcmVmaXgnKTtcbmlmICghY29udGV4dCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IHZhcmlhYmxlICdsb2NhbC1kZXYtcHJlZml4JyBpcyByZXF1aXJlZCBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgc3RhY2suIFByb3ZpZGUgaXQgbGlrZTogXFxgeWFybiBjZGs6ZGV2IC0tY29udGV4dCBsb2NhbC1kZXYtcHJlZml4PXlvdXItaGFuZGxlIGRpZmZcXGBcIik7XG59XG5uZXcgQXBwbGljYXRpb25TdGFjayhhcHAsIFxcYCR7b3B0aW9ucy5wcm9qZWN0TmFtZX0tZGV2LVxcJHtjb250ZXh0fVxcYCwge1xuICBlbnY6IHtcbiAgICBhY2NvdW50OiAnJHtvcHRpb25zLmRldi5hY2NvdW50fScsXG4gICAgcmVnaW9uOiAnJHtvcHRpb25zLmRldi5yZWdpb259JyxcbiAgfSxcbiAgaG9zdGVkWm9uZURvbWFpbk5hbWU6ICcke29wdGlvbnMuZGV2Lmhvc3RlZFpvbmVEb21haW5OYW1lfScsXG4gIGhvc3RuYW1lOiBjb250ZXh0LCAvLyB0aGVyZSBzaG91bGQgYmUgYSB3YXkgdG8gYmxvY2sgYW5vbi1kZXYuLi5cbiAgZGF0YWRvZ1NlY3JldEFybjogJyR7b3B0aW9ucy5kZXYuZGF0YWRvZ1NlY3JldEFybn0nLFxuICBjbGVya0p3dFZlcmlmaWNhdGlvbktleTogJyR7b3B0aW9ucy5kZXYuY2xlcmtKd3RWZXJpZmljYXRpb25LZXl9JyxcbiAgbjhuRW5kcG9pbnQ6ICcke29wdGlvbnMuZGV2Lm44bkVuZHBvaW50fScsXG59KTtcbmFwcC5zeW50aCgpO1xuYCxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,24 @@
1
+ import { SampleFile } from 'projen';
2
+ import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
+ export interface EnvironmentConfig {
4
+ readonly hostedZoneDomainName: string;
5
+ readonly hostname: string;
6
+ readonly datadogSecretArn: string;
7
+ readonly clerkJwtVerificationKey: string;
8
+ readonly n8nEndpoint: string;
9
+ readonly account: string;
10
+ readonly region: string;
11
+ readonly clerkPublishableKey: string;
12
+ }
13
+ export interface MainFileOptions {
14
+ readonly projectName: string;
15
+ readonly dev: EnvironmentConfig;
16
+ readonly staging: EnvironmentConfig;
17
+ readonly prod: EnvironmentConfig;
18
+ readonly additionalTags?: {
19
+ [key: string]: string;
20
+ };
21
+ }
22
+ export declare class MainFile extends SampleFile {
23
+ constructor(project: AwsCdkTypeScriptApp, options: MainFileOptions);
24
+ }