@macedon-technologies/batman 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +637 -0
- package/API.md +5671 -0
- package/LICENSE +202 -0
- package/README.md +86 -0
- package/lib/ApiConstructFile.d.ts +5 -0
- package/lib/ApiConstructFile.js +175 -0
- package/lib/ApiFunctionFile.d.ts +5 -0
- package/lib/ApiFunctionFile.js +30 -0
- package/lib/Application.d.ts +21 -0
- package/lib/Application.js +72 -0
- package/lib/ApplicationStackFile.d.ts +5 -0
- package/lib/ApplicationStackFile.js +26 -0
- package/lib/BaseApplicationStackFile.d.ts +5 -0
- package/lib/BaseApplicationStackFile.js +172 -0
- package/lib/BatmanProject.d.ts +25 -0
- package/lib/BatmanProject.js +101 -0
- package/lib/GitHubRolesFile.d.ts +9 -0
- package/lib/GitHubRolesFile.js +26 -0
- package/lib/GitHubRolesStackFile.d.ts +8 -0
- package/lib/GitHubRolesStackFile.js +165 -0
- package/lib/LocalDevAppFile.d.ts +10 -0
- package/lib/LocalDevAppFile.js +34 -0
- package/lib/MainFile.d.ts +24 -0
- package/lib/MainFile.js +64 -0
- package/lib/MainTestFile.d.ts +5 -0
- package/lib/MainTestFile.js +33 -0
- package/lib/PrCleanupWorkflow.d.ts +9 -0
- package/lib/PrCleanupWorkflow.js +100 -0
- package/lib/PrDeployWorkflow.d.ts +10 -0
- package/lib/PrDeployWorkflow.js +106 -0
- package/lib/ProductionDeployWorkflow.d.ts +11 -0
- package/lib/ProductionDeployWorkflow.js +68 -0
- package/lib/StagingDeployWorkflow.d.ts +11 -0
- package/lib/StagingDeployWorkflow.js +68 -0
- package/lib/StaticWebsiteConstructFile.d.ts +5 -0
- package/lib/StaticWebsiteConstructFile.js +198 -0
- package/lib/ViteReactProject.d.ts +45 -0
- package/lib/ViteReactProject.js +654 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +20 -0
- package/package.json +125 -0
|
@@ -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
|
+
}
|