@stacksjs/ts-cloud-core 0.1.1
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/LICENSE.md +21 -0
- package/README.md +321 -0
- package/package.json +31 -0
- package/src/advanced-features.test.ts +465 -0
- package/src/aws/cloudformation.ts +421 -0
- package/src/aws/cloudfront.ts +158 -0
- package/src/aws/credentials.test.ts +132 -0
- package/src/aws/credentials.ts +545 -0
- package/src/aws/index.ts +87 -0
- package/src/aws/s3.test.ts +188 -0
- package/src/aws/s3.ts +1088 -0
- package/src/aws/signature.test.ts +670 -0
- package/src/aws/signature.ts +1155 -0
- package/src/backup/disaster-recovery.test.ts +726 -0
- package/src/backup/disaster-recovery.ts +500 -0
- package/src/backup/index.ts +34 -0
- package/src/backup/manager.test.ts +498 -0
- package/src/backup/manager.ts +432 -0
- package/src/cicd/circleci.ts +430 -0
- package/src/cicd/github-actions.ts +424 -0
- package/src/cicd/gitlab-ci.ts +255 -0
- package/src/cicd/index.ts +8 -0
- package/src/cli/history.ts +396 -0
- package/src/cli/index.ts +10 -0
- package/src/cli/progress.ts +458 -0
- package/src/cli/repl.ts +454 -0
- package/src/cli/suggestions.ts +327 -0
- package/src/cli/table.test.ts +319 -0
- package/src/cli/table.ts +332 -0
- package/src/cloudformation/builder.test.ts +327 -0
- package/src/cloudformation/builder.ts +378 -0
- package/src/cloudformation/builders/api-gateway.ts +449 -0
- package/src/cloudformation/builders/cache.ts +334 -0
- package/src/cloudformation/builders/cdn.ts +278 -0
- package/src/cloudformation/builders/compute.ts +485 -0
- package/src/cloudformation/builders/database.ts +392 -0
- package/src/cloudformation/builders/functions.ts +343 -0
- package/src/cloudformation/builders/messaging.ts +140 -0
- package/src/cloudformation/builders/monitoring.ts +300 -0
- package/src/cloudformation/builders/network.ts +264 -0
- package/src/cloudformation/builders/queue.ts +147 -0
- package/src/cloudformation/builders/security.ts +399 -0
- package/src/cloudformation/builders/storage.ts +285 -0
- package/src/cloudformation/index.ts +30 -0
- package/src/cloudformation/types.ts +173 -0
- package/src/compliance/aws-config.ts +543 -0
- package/src/compliance/cloudtrail.ts +376 -0
- package/src/compliance/compliance.test.ts +423 -0
- package/src/compliance/guardduty.ts +446 -0
- package/src/compliance/index.ts +66 -0
- package/src/compliance/security-hub.ts +456 -0
- package/src/containers/build-optimization.ts +416 -0
- package/src/containers/containers.test.ts +508 -0
- package/src/containers/image-scanning.ts +360 -0
- package/src/containers/index.ts +9 -0
- package/src/containers/registry.ts +293 -0
- package/src/containers/service-mesh.ts +520 -0
- package/src/database/database.test.ts +762 -0
- package/src/database/index.ts +9 -0
- package/src/database/migrations.ts +444 -0
- package/src/database/performance.ts +528 -0
- package/src/database/replicas.ts +534 -0
- package/src/database/users.ts +494 -0
- package/src/dependency-graph.ts +143 -0
- package/src/deployment/ab-testing.ts +582 -0
- package/src/deployment/blue-green.ts +452 -0
- package/src/deployment/canary.ts +500 -0
- package/src/deployment/deployment.test.ts +526 -0
- package/src/deployment/index.ts +61 -0
- package/src/deployment/progressive.ts +62 -0
- package/src/dns/dns.test.ts +641 -0
- package/src/dns/dnssec.ts +315 -0
- package/src/dns/index.ts +8 -0
- package/src/dns/resolver.ts +496 -0
- package/src/dns/routing.ts +593 -0
- package/src/email/advanced/analytics.ts +445 -0
- package/src/email/advanced/index.ts +11 -0
- package/src/email/advanced/rules.ts +465 -0
- package/src/email/advanced/scheduling.ts +352 -0
- package/src/email/advanced/search.ts +412 -0
- package/src/email/advanced/shared-mailboxes.ts +404 -0
- package/src/email/advanced/templates.ts +455 -0
- package/src/email/advanced/threading.ts +281 -0
- package/src/email/analytics.ts +467 -0
- package/src/email/bounce-handling.ts +425 -0
- package/src/email/email.test.ts +431 -0
- package/src/email/handlers/__tests__/inbound.test.ts +38 -0
- package/src/email/handlers/__tests__/outbound.test.ts +37 -0
- package/src/email/handlers/converter.ts +227 -0
- package/src/email/handlers/feedback.ts +228 -0
- package/src/email/handlers/inbound.ts +169 -0
- package/src/email/handlers/outbound.ts +178 -0
- package/src/email/index.ts +15 -0
- package/src/email/reputation.ts +303 -0
- package/src/email/templates.ts +352 -0
- package/src/errors/index.test.ts +434 -0
- package/src/errors/index.ts +416 -0
- package/src/health-checks/index.ts +40 -0
- package/src/index.ts +360 -0
- package/src/intrinsic-functions.ts +118 -0
- package/src/lambda/concurrency.ts +330 -0
- package/src/lambda/destinations.ts +345 -0
- package/src/lambda/dlq.ts +425 -0
- package/src/lambda/index.ts +11 -0
- package/src/lambda/lambda.test.ts +840 -0
- package/src/lambda/layers.ts +263 -0
- package/src/lambda/versions.ts +376 -0
- package/src/lambda/vpc.ts +399 -0
- package/src/local/config.ts +114 -0
- package/src/local/index.ts +6 -0
- package/src/local/mock-aws.ts +351 -0
- package/src/modules/ai.ts +340 -0
- package/src/modules/api.ts +478 -0
- package/src/modules/auth.ts +805 -0
- package/src/modules/cache.ts +417 -0
- package/src/modules/cdn.ts +1062 -0
- package/src/modules/communication.ts +1094 -0
- package/src/modules/compute.ts +3348 -0
- package/src/modules/database.ts +554 -0
- package/src/modules/deployment.ts +1079 -0
- package/src/modules/dns.ts +337 -0
- package/src/modules/email.ts +1538 -0
- package/src/modules/filesystem.ts +515 -0
- package/src/modules/index.ts +32 -0
- package/src/modules/messaging.ts +486 -0
- package/src/modules/monitoring.ts +2086 -0
- package/src/modules/network.ts +664 -0
- package/src/modules/parameter-store.ts +325 -0
- package/src/modules/permissions.ts +1081 -0
- package/src/modules/phone.ts +494 -0
- package/src/modules/queue.ts +1260 -0
- package/src/modules/redirects.ts +464 -0
- package/src/modules/registry.ts +699 -0
- package/src/modules/search.ts +401 -0
- package/src/modules/secrets.ts +416 -0
- package/src/modules/security.ts +731 -0
- package/src/modules/sms.ts +389 -0
- package/src/modules/storage.ts +1120 -0
- package/src/modules/workflow.ts +680 -0
- package/src/multi-account/config.ts +521 -0
- package/src/multi-account/index.ts +7 -0
- package/src/multi-account/manager.ts +427 -0
- package/src/multi-region/cross-region.ts +410 -0
- package/src/multi-region/index.ts +8 -0
- package/src/multi-region/manager.ts +483 -0
- package/src/multi-region/regions.ts +435 -0
- package/src/network-security/index.ts +48 -0
- package/src/observability/index.ts +9 -0
- package/src/observability/logs.ts +522 -0
- package/src/observability/metrics.ts +460 -0
- package/src/observability/observability.test.ts +782 -0
- package/src/observability/synthetics.ts +568 -0
- package/src/observability/xray.ts +358 -0
- package/src/phone/advanced/analytics.ts +349 -0
- package/src/phone/advanced/callbacks.ts +428 -0
- package/src/phone/advanced/index.ts +8 -0
- package/src/phone/advanced/ivr-builder.ts +504 -0
- package/src/phone/advanced/recording.ts +310 -0
- package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
- package/src/phone/handlers/incoming-call.ts +117 -0
- package/src/phone/handlers/missed-call.ts +116 -0
- package/src/phone/handlers/voicemail.ts +179 -0
- package/src/phone/index.ts +9 -0
- package/src/presets/api-backend.ts +134 -0
- package/src/presets/data-pipeline.ts +204 -0
- package/src/presets/extend.test.ts +295 -0
- package/src/presets/extend.ts +297 -0
- package/src/presets/fullstack-app.ts +144 -0
- package/src/presets/index.ts +27 -0
- package/src/presets/jamstack.ts +135 -0
- package/src/presets/microservices.ts +167 -0
- package/src/presets/ml-api.ts +208 -0
- package/src/presets/nodejs-server.ts +104 -0
- package/src/presets/nodejs-serverless.ts +114 -0
- package/src/presets/realtime-app.ts +184 -0
- package/src/presets/static-site.ts +64 -0
- package/src/presets/traditional-web-app.ts +339 -0
- package/src/presets/wordpress.ts +138 -0
- package/src/preview/github.test.ts +249 -0
- package/src/preview/github.ts +297 -0
- package/src/preview/index.ts +37 -0
- package/src/preview/manager.test.ts +440 -0
- package/src/preview/manager.ts +326 -0
- package/src/preview/notifications.test.ts +582 -0
- package/src/preview/notifications.ts +341 -0
- package/src/queue/batch-processing.ts +402 -0
- package/src/queue/dlq-monitoring.ts +402 -0
- package/src/queue/fifo.ts +342 -0
- package/src/queue/index.ts +9 -0
- package/src/queue/management.ts +428 -0
- package/src/queue/queue.test.ts +429 -0
- package/src/resource-mgmt/index.ts +39 -0
- package/src/resource-naming.ts +62 -0
- package/src/s3/index.ts +523 -0
- package/src/schema/cloud-config.schema.json +554 -0
- package/src/schema/index.ts +68 -0
- package/src/security/certificate-manager.ts +492 -0
- package/src/security/index.ts +9 -0
- package/src/security/scanning.ts +545 -0
- package/src/security/secrets-manager.ts +476 -0
- package/src/security/secrets-rotation.ts +456 -0
- package/src/security/security.test.ts +738 -0
- package/src/sms/advanced/ab-testing.ts +389 -0
- package/src/sms/advanced/analytics.ts +336 -0
- package/src/sms/advanced/campaigns.ts +523 -0
- package/src/sms/advanced/chatbot.ts +224 -0
- package/src/sms/advanced/index.ts +10 -0
- package/src/sms/advanced/link-tracking.ts +248 -0
- package/src/sms/advanced/mms.ts +308 -0
- package/src/sms/handlers/__tests__/send.test.ts +40 -0
- package/src/sms/handlers/delivery-status.ts +133 -0
- package/src/sms/handlers/receive.ts +162 -0
- package/src/sms/handlers/send.ts +174 -0
- package/src/sms/index.ts +9 -0
- package/src/stack-diff.ts +389 -0
- package/src/static-site/index.ts +85 -0
- package/src/template-builder.ts +110 -0
- package/src/template-validator.ts +574 -0
- package/src/utils/cache.ts +291 -0
- package/src/utils/diff.ts +269 -0
- package/src/utils/hash.ts +227 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/parallel.ts +294 -0
- package/src/validators/credentials.test.ts +274 -0
- package/src/validators/credentials.ts +233 -0
- package/src/validators/quotas.test.ts +434 -0
- package/src/validators/quotas.ts +217 -0
- package/test/ai.test.ts +327 -0
- package/test/api.test.ts +511 -0
- package/test/auth.test.ts +632 -0
- package/test/cache.test.ts +406 -0
- package/test/cdn.test.ts +247 -0
- package/test/compute.test.ts +861 -0
- package/test/database.test.ts +523 -0
- package/test/deployment.test.ts +499 -0
- package/test/dns.test.ts +270 -0
- package/test/email.test.ts +439 -0
- package/test/filesystem.test.ts +382 -0
- package/test/integration.test.ts +350 -0
- package/test/messaging.test.ts +514 -0
- package/test/monitoring.test.ts +634 -0
- package/test/network.test.ts +425 -0
- package/test/permissions.test.ts +488 -0
- package/test/queue.test.ts +484 -0
- package/test/registry.test.ts +306 -0
- package/test/security.test.ts +462 -0
- package/test/storage.test.ts +463 -0
- package/test/template-validator.test.ts +559 -0
- package/test/workflow.test.ts +592 -0
- package/tsconfig.json +16 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import type { CloudConfig } from '@stacksjs/ts-cloud-types'
|
|
2
|
+
import type { CloudFormationTemplate, CloudFormationResource } from './types'
|
|
3
|
+
import { Fn } from './types'
|
|
4
|
+
import { addNetworkResources } from './builders/network'
|
|
5
|
+
import { addStorageResources } from './builders/storage'
|
|
6
|
+
import { addComputeResources } from './builders/compute'
|
|
7
|
+
import { addDatabaseResources } from './builders/database'
|
|
8
|
+
import { addFunctionResources } from './builders/functions'
|
|
9
|
+
import { addCacheResources } from './builders/cache'
|
|
10
|
+
import { addQueueResources } from './builders/queue'
|
|
11
|
+
import { addMessagingResources } from './builders/messaging'
|
|
12
|
+
import { addCDNResources } from './builders/cdn'
|
|
13
|
+
import { addApiGatewayResources } from './builders/api-gateway'
|
|
14
|
+
import { addMonitoringResources } from './builders/monitoring'
|
|
15
|
+
import { addSecurityResources } from './builders/security'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* CloudFormation Template Builder
|
|
19
|
+
* Converts-cloudConfig to CloudFormation templates
|
|
20
|
+
*/
|
|
21
|
+
export class CloudFormationBuilder {
|
|
22
|
+
protected template: CloudFormationTemplate
|
|
23
|
+
private config: CloudConfig
|
|
24
|
+
private resourceDependencies: Map<string, Set<string>>
|
|
25
|
+
|
|
26
|
+
constructor(config: CloudConfig) {
|
|
27
|
+
this.config = config
|
|
28
|
+
this.resourceDependencies = new Map()
|
|
29
|
+
this.template = {
|
|
30
|
+
AWSTemplateFormatVersion: '2010-09-09',
|
|
31
|
+
Description: `Infrastructure for ${config.project.name} (${config.project.slug})`,
|
|
32
|
+
Resources: {},
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Build the complete CloudFormation template
|
|
38
|
+
*/
|
|
39
|
+
build(): CloudFormationTemplate {
|
|
40
|
+
this.addParameters()
|
|
41
|
+
this.addMappings()
|
|
42
|
+
this.addConditions()
|
|
43
|
+
this.addResources()
|
|
44
|
+
this.initializeOutputs()
|
|
45
|
+
this.resolveDependencies()
|
|
46
|
+
|
|
47
|
+
return this.template
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Add parameters to the template
|
|
52
|
+
*/
|
|
53
|
+
private addParameters(): void {
|
|
54
|
+
this.template.Parameters = {
|
|
55
|
+
Environment: {
|
|
56
|
+
Type: 'String',
|
|
57
|
+
Default: 'production',
|
|
58
|
+
AllowedValues: ['development', 'staging', 'production'],
|
|
59
|
+
Description: 'Environment name',
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Add mappings to the template
|
|
66
|
+
*/
|
|
67
|
+
private addMappings(): void {
|
|
68
|
+
// Region-specific AMI mappings
|
|
69
|
+
this.template.Mappings = {
|
|
70
|
+
RegionMap: {
|
|
71
|
+
'us-east-1': { AMI: 'ami-0c55b159cbfafe1f0' },
|
|
72
|
+
'us-west-2': { AMI: 'ami-0d1cd67c26f5fca19' },
|
|
73
|
+
'eu-west-1': { AMI: 'ami-0bbc25e23a7640b9b' },
|
|
74
|
+
// Add more regions as needed
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Add conditions to the template
|
|
81
|
+
*/
|
|
82
|
+
private addConditions(): void {
|
|
83
|
+
this.template.Conditions = {
|
|
84
|
+
IsProduction: Fn.equals(Fn.ref('Environment'), 'production'),
|
|
85
|
+
HasDomain: Fn.not([Fn.equals(this.config.environments?.production?.domain || '', '')]),
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Add all resources to the template
|
|
91
|
+
*/
|
|
92
|
+
private addResources(): void {
|
|
93
|
+
const { infrastructure } = this.config
|
|
94
|
+
|
|
95
|
+
if (!infrastructure) {
|
|
96
|
+
return
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Network resources
|
|
100
|
+
if (infrastructure.network) {
|
|
101
|
+
this.addNetworkResources(infrastructure.network)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Storage resources
|
|
105
|
+
if (infrastructure.storage) {
|
|
106
|
+
this.addStorageResources(infrastructure.storage)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Compute resources
|
|
110
|
+
if (infrastructure.compute) {
|
|
111
|
+
this.addComputeResources(infrastructure.compute)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Database resources
|
|
115
|
+
if (infrastructure.databases) {
|
|
116
|
+
this.addDatabaseResources(infrastructure.databases)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Cache resources
|
|
120
|
+
if (infrastructure.cache) {
|
|
121
|
+
this.addCacheResources(infrastructure.cache)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// CDN resources
|
|
125
|
+
if (infrastructure.cdn) {
|
|
126
|
+
this.addCDNResources(infrastructure.cdn)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// API Gateway resources
|
|
130
|
+
if (infrastructure.apiGateway) {
|
|
131
|
+
this.addApiGatewayResources(infrastructure.apiGateway)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Lambda functions
|
|
135
|
+
if (infrastructure.functions) {
|
|
136
|
+
this.addFunctionResources(infrastructure.functions)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Queue resources
|
|
140
|
+
if (infrastructure.queues) {
|
|
141
|
+
this.addQueueResources(infrastructure.queues)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Messaging resources
|
|
145
|
+
if (infrastructure.messaging) {
|
|
146
|
+
this.addMessagingResources(infrastructure.messaging)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Monitoring resources
|
|
150
|
+
if (infrastructure.monitoring) {
|
|
151
|
+
this.addMonitoringResources(infrastructure.monitoring)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Security resources
|
|
155
|
+
if (infrastructure.security) {
|
|
156
|
+
this.addSecurityResources(infrastructure.security)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Initialize default outputs in the template
|
|
162
|
+
*/
|
|
163
|
+
private initializeOutputs(): void {
|
|
164
|
+
this.template.Outputs = {
|
|
165
|
+
StackName: {
|
|
166
|
+
Description: 'Stack name',
|
|
167
|
+
Value: Fn.ref('AWS::StackName'),
|
|
168
|
+
Export: {
|
|
169
|
+
Name: Fn.sub('${AWS::StackName}-Name'),
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
Region: {
|
|
173
|
+
Description: 'AWS Region',
|
|
174
|
+
Value: Fn.ref('AWS::Region'),
|
|
175
|
+
Export: {
|
|
176
|
+
Name: Fn.sub('${AWS::StackName}-Region'),
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Add domain output if configured
|
|
182
|
+
if (this.config.environments?.production?.domain) {
|
|
183
|
+
this.template.Outputs.Domain = {
|
|
184
|
+
Description: 'Production domain',
|
|
185
|
+
Value: this.config.environments.production.domain,
|
|
186
|
+
Condition: 'HasDomain',
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Add a resource to the template
|
|
193
|
+
*/
|
|
194
|
+
addResource(
|
|
195
|
+
logicalId: string,
|
|
196
|
+
type: string,
|
|
197
|
+
properties: Record<string, any>,
|
|
198
|
+
options?: {
|
|
199
|
+
dependsOn?: string | string[]
|
|
200
|
+
condition?: string
|
|
201
|
+
deletionPolicy?: 'Delete' | 'Retain' | 'Snapshot'
|
|
202
|
+
updateReplacePolicy?: 'Delete' | 'Retain' | 'Snapshot'
|
|
203
|
+
},
|
|
204
|
+
): void {
|
|
205
|
+
const resource: CloudFormationResource = {
|
|
206
|
+
Type: type,
|
|
207
|
+
Properties: properties,
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (options?.dependsOn) {
|
|
211
|
+
resource.DependsOn = options.dependsOn
|
|
212
|
+
this.trackDependency(logicalId, options.dependsOn)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (options?.condition) {
|
|
216
|
+
resource.Condition = options.condition
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (options?.deletionPolicy) {
|
|
220
|
+
resource.DeletionPolicy = options.deletionPolicy
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (options?.updateReplacePolicy) {
|
|
224
|
+
resource.UpdateReplacePolicy = options.updateReplacePolicy
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
this.template.Resources[logicalId] = resource
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Add or merge outputs to the template
|
|
232
|
+
*/
|
|
233
|
+
addOutputs(outputs: Record<string, any>): void {
|
|
234
|
+
this.template.Outputs = {
|
|
235
|
+
...this.template.Outputs,
|
|
236
|
+
...outputs,
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Get the current outputs
|
|
242
|
+
*/
|
|
243
|
+
getOutputs(): Record<string, any> {
|
|
244
|
+
return this.template.Outputs || {}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Check if a resource exists in the template
|
|
249
|
+
*/
|
|
250
|
+
hasResource(logicalId: string): boolean {
|
|
251
|
+
return logicalId in this.template.Resources
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Get a resource from the template
|
|
256
|
+
*/
|
|
257
|
+
getResource(logicalId: string): CloudFormationResource | undefined {
|
|
258
|
+
return this.template.Resources[logicalId]
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Track resource dependencies for cycle detection
|
|
263
|
+
*/
|
|
264
|
+
private trackDependency(resource: string, dependencies: string | string[]): void {
|
|
265
|
+
if (!this.resourceDependencies.has(resource)) {
|
|
266
|
+
this.resourceDependencies.set(resource, new Set())
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const deps = Array.isArray(dependencies) ? dependencies : [dependencies]
|
|
270
|
+
deps.forEach(dep => this.resourceDependencies.get(resource)!.add(dep))
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Resolve and validate resource dependencies
|
|
275
|
+
* Detects circular dependencies and reorders if needed
|
|
276
|
+
*/
|
|
277
|
+
private resolveDependencies(): void {
|
|
278
|
+
// Topological sort to detect cycles
|
|
279
|
+
const visited = new Set<string>()
|
|
280
|
+
const recursionStack = new Set<string>()
|
|
281
|
+
|
|
282
|
+
const visit = (resource: string): boolean => {
|
|
283
|
+
if (recursionStack.has(resource)) {
|
|
284
|
+
throw new Error(`Circular dependency detected involving resource: ${resource}`)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (visited.has(resource)) {
|
|
288
|
+
return true
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
visited.add(resource)
|
|
292
|
+
recursionStack.add(resource)
|
|
293
|
+
|
|
294
|
+
const deps = this.resourceDependencies.get(resource)
|
|
295
|
+
if (deps) {
|
|
296
|
+
for (const dep of deps) {
|
|
297
|
+
visit(dep)
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
recursionStack.delete(resource)
|
|
302
|
+
return true
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
for (const resource of this.resourceDependencies.keys()) {
|
|
306
|
+
visit(resource)
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Generate a logical ID from a name
|
|
312
|
+
*/
|
|
313
|
+
toLogicalId(name: string): string {
|
|
314
|
+
return name
|
|
315
|
+
.split(/[-_\s]/)
|
|
316
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
|
|
317
|
+
.join('')
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Call resource builder functions
|
|
322
|
+
*/
|
|
323
|
+
private addNetworkResources(network: any): void {
|
|
324
|
+
addNetworkResources(this as any, network)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
private addStorageResources(storage: any): void {
|
|
328
|
+
addStorageResources(this as any, storage)
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private addComputeResources(compute: any): void {
|
|
332
|
+
addComputeResources(this as any, compute)
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
private addDatabaseResources(database: any): void {
|
|
336
|
+
addDatabaseResources(this as any, database)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
private addFunctionResources(functions: any): void {
|
|
340
|
+
addFunctionResources(this as any, functions)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
private addCacheResources(cache: any): void {
|
|
344
|
+
addCacheResources(this as any, cache)
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
private addQueueResources(queue: any): void {
|
|
348
|
+
addQueueResources(this as any, queue)
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
private addMessagingResources(messaging: any): void {
|
|
352
|
+
addMessagingResources(this as any, messaging)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
private addCDNResources(cdn: any): void {
|
|
356
|
+
addCDNResources(this as any, cdn)
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
private addApiGatewayResources(apiGateway: any): void {
|
|
360
|
+
addApiGatewayResources(this as any, apiGateway)
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
private addMonitoringResources(monitoring: any): void {
|
|
364
|
+
addMonitoringResources(this as any, monitoring)
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private addSecurityResources(security: any): void {
|
|
368
|
+
addSecurityResources(this as any, security)
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Main function to convert CloudConfig to CloudFormation template
|
|
374
|
+
*/
|
|
375
|
+
export function buildCloudFormationTemplate(config: CloudConfig): CloudFormationTemplate {
|
|
376
|
+
const builder = new CloudFormationBuilder(config)
|
|
377
|
+
return builder.build()
|
|
378
|
+
}
|