@stacksjs/ts-cloud-core 0.1.7 → 0.1.9

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 (225) hide show
  1. package/package.json +7 -6
  2. package/src/advanced-features.test.ts +465 -0
  3. package/src/aws/cloudformation.ts +421 -0
  4. package/src/aws/cloudfront.ts +158 -0
  5. package/src/aws/credentials.test.ts +132 -0
  6. package/src/aws/credentials.ts +545 -0
  7. package/src/aws/index.ts +87 -0
  8. package/src/aws/s3.test.ts +188 -0
  9. package/src/aws/s3.ts +1088 -0
  10. package/src/aws/signature.test.ts +670 -0
  11. package/src/aws/signature.ts +1155 -0
  12. package/src/backup/disaster-recovery.test.ts +726 -0
  13. package/src/backup/disaster-recovery.ts +500 -0
  14. package/src/backup/index.ts +34 -0
  15. package/src/backup/manager.test.ts +498 -0
  16. package/src/backup/manager.ts +432 -0
  17. package/src/cicd/circleci.ts +430 -0
  18. package/src/cicd/github-actions.ts +424 -0
  19. package/src/cicd/gitlab-ci.ts +255 -0
  20. package/src/cicd/index.ts +8 -0
  21. package/src/cli/history.ts +396 -0
  22. package/src/cli/index.ts +10 -0
  23. package/src/cli/progress.ts +458 -0
  24. package/src/cli/repl.ts +454 -0
  25. package/src/cli/suggestions.ts +327 -0
  26. package/src/cli/table.test.ts +319 -0
  27. package/src/cli/table.ts +332 -0
  28. package/src/cloudformation/builder.test.ts +327 -0
  29. package/src/cloudformation/builder.ts +378 -0
  30. package/src/cloudformation/builders/api-gateway.ts +449 -0
  31. package/src/cloudformation/builders/cache.ts +334 -0
  32. package/src/cloudformation/builders/cdn.ts +278 -0
  33. package/src/cloudformation/builders/compute.ts +485 -0
  34. package/src/cloudformation/builders/database.ts +392 -0
  35. package/src/cloudformation/builders/functions.ts +343 -0
  36. package/src/cloudformation/builders/messaging.ts +140 -0
  37. package/src/cloudformation/builders/monitoring.ts +300 -0
  38. package/src/cloudformation/builders/network.ts +264 -0
  39. package/src/cloudformation/builders/queue.ts +147 -0
  40. package/src/cloudformation/builders/security.ts +399 -0
  41. package/src/cloudformation/builders/storage.ts +285 -0
  42. package/src/cloudformation/index.ts +30 -0
  43. package/src/cloudformation/types.ts +173 -0
  44. package/src/compliance/aws-config.ts +543 -0
  45. package/src/compliance/cloudtrail.ts +376 -0
  46. package/src/compliance/compliance.test.ts +423 -0
  47. package/src/compliance/guardduty.ts +446 -0
  48. package/src/compliance/index.ts +66 -0
  49. package/src/compliance/security-hub.ts +456 -0
  50. package/src/containers/build-optimization.ts +416 -0
  51. package/src/containers/containers.test.ts +508 -0
  52. package/src/containers/image-scanning.ts +360 -0
  53. package/src/containers/index.ts +9 -0
  54. package/src/containers/registry.ts +293 -0
  55. package/src/containers/service-mesh.ts +520 -0
  56. package/src/database/database.test.ts +762 -0
  57. package/src/database/index.ts +9 -0
  58. package/src/database/migrations.ts +444 -0
  59. package/src/database/performance.ts +528 -0
  60. package/src/database/replicas.ts +534 -0
  61. package/src/database/users.ts +494 -0
  62. package/src/dependency-graph.ts +143 -0
  63. package/src/deployment/ab-testing.ts +582 -0
  64. package/src/deployment/blue-green.ts +452 -0
  65. package/src/deployment/canary.ts +500 -0
  66. package/src/deployment/deployment.test.ts +526 -0
  67. package/src/deployment/index.ts +61 -0
  68. package/src/deployment/progressive.ts +62 -0
  69. package/src/dns/dns.test.ts +641 -0
  70. package/src/dns/dnssec.ts +315 -0
  71. package/src/dns/index.ts +8 -0
  72. package/src/dns/resolver.ts +496 -0
  73. package/src/dns/routing.ts +593 -0
  74. package/src/email/advanced/analytics.ts +445 -0
  75. package/src/email/advanced/index.ts +11 -0
  76. package/src/email/advanced/rules.ts +465 -0
  77. package/src/email/advanced/scheduling.ts +352 -0
  78. package/src/email/advanced/search.ts +412 -0
  79. package/src/email/advanced/shared-mailboxes.ts +404 -0
  80. package/src/email/advanced/templates.ts +455 -0
  81. package/src/email/advanced/threading.ts +281 -0
  82. package/src/email/analytics.ts +467 -0
  83. package/src/email/bounce-handling.ts +425 -0
  84. package/src/email/email.test.ts +431 -0
  85. package/src/email/handlers/__tests__/inbound.test.ts +38 -0
  86. package/src/email/handlers/__tests__/outbound.test.ts +37 -0
  87. package/src/email/handlers/converter.ts +227 -0
  88. package/src/email/handlers/feedback.ts +228 -0
  89. package/src/email/handlers/inbound.ts +169 -0
  90. package/src/email/handlers/outbound.ts +178 -0
  91. package/src/email/index.ts +15 -0
  92. package/src/email/reputation.ts +303 -0
  93. package/src/email/templates.ts +352 -0
  94. package/src/errors/index.test.ts +434 -0
  95. package/src/errors/index.ts +416 -0
  96. package/src/health-checks/index.ts +40 -0
  97. package/src/index.ts +360 -0
  98. package/src/intrinsic-functions.ts +118 -0
  99. package/src/lambda/concurrency.ts +330 -0
  100. package/src/lambda/destinations.ts +345 -0
  101. package/src/lambda/dlq.ts +425 -0
  102. package/src/lambda/index.ts +11 -0
  103. package/src/lambda/lambda.test.ts +840 -0
  104. package/src/lambda/layers.ts +263 -0
  105. package/src/lambda/versions.ts +376 -0
  106. package/src/lambda/vpc.ts +399 -0
  107. package/src/local/config.ts +114 -0
  108. package/src/local/index.ts +6 -0
  109. package/src/local/mock-aws.ts +351 -0
  110. package/src/modules/ai.ts +340 -0
  111. package/src/modules/api.ts +478 -0
  112. package/src/modules/auth.ts +805 -0
  113. package/src/modules/cache.ts +417 -0
  114. package/src/modules/cdn.ts +1062 -0
  115. package/src/modules/communication.ts +1094 -0
  116. package/src/modules/compute.ts +3348 -0
  117. package/src/modules/database.ts +554 -0
  118. package/src/modules/deployment.ts +1079 -0
  119. package/src/modules/dns.ts +337 -0
  120. package/src/modules/email.ts +1538 -0
  121. package/src/modules/filesystem.ts +515 -0
  122. package/src/modules/index.ts +32 -0
  123. package/src/modules/messaging.ts +486 -0
  124. package/src/modules/monitoring.ts +2086 -0
  125. package/src/modules/network.ts +664 -0
  126. package/src/modules/parameter-store.ts +325 -0
  127. package/src/modules/permissions.ts +1081 -0
  128. package/src/modules/phone.ts +494 -0
  129. package/src/modules/queue.ts +1260 -0
  130. package/src/modules/redirects.ts +464 -0
  131. package/src/modules/registry.ts +699 -0
  132. package/src/modules/search.ts +401 -0
  133. package/src/modules/secrets.ts +416 -0
  134. package/src/modules/security.ts +731 -0
  135. package/src/modules/sms.ts +389 -0
  136. package/src/modules/storage.ts +1120 -0
  137. package/src/modules/workflow.ts +680 -0
  138. package/src/multi-account/config.ts +521 -0
  139. package/src/multi-account/index.ts +7 -0
  140. package/src/multi-account/manager.ts +427 -0
  141. package/src/multi-region/cross-region.ts +410 -0
  142. package/src/multi-region/index.ts +8 -0
  143. package/src/multi-region/manager.ts +483 -0
  144. package/src/multi-region/regions.ts +435 -0
  145. package/src/network-security/index.ts +48 -0
  146. package/src/observability/index.ts +9 -0
  147. package/src/observability/logs.ts +522 -0
  148. package/src/observability/metrics.ts +460 -0
  149. package/src/observability/observability.test.ts +782 -0
  150. package/src/observability/synthetics.ts +568 -0
  151. package/src/observability/xray.ts +358 -0
  152. package/src/phone/advanced/analytics.ts +349 -0
  153. package/src/phone/advanced/callbacks.ts +428 -0
  154. package/src/phone/advanced/index.ts +8 -0
  155. package/src/phone/advanced/ivr-builder.ts +504 -0
  156. package/src/phone/advanced/recording.ts +310 -0
  157. package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
  158. package/src/phone/handlers/incoming-call.ts +117 -0
  159. package/src/phone/handlers/missed-call.ts +116 -0
  160. package/src/phone/handlers/voicemail.ts +179 -0
  161. package/src/phone/index.ts +9 -0
  162. package/src/presets/api-backend.ts +134 -0
  163. package/src/presets/data-pipeline.ts +204 -0
  164. package/src/presets/extend.test.ts +295 -0
  165. package/src/presets/extend.ts +297 -0
  166. package/src/presets/fullstack-app.ts +144 -0
  167. package/src/presets/index.ts +27 -0
  168. package/src/presets/jamstack.ts +135 -0
  169. package/src/presets/microservices.ts +167 -0
  170. package/src/presets/ml-api.ts +208 -0
  171. package/src/presets/nodejs-server.ts +104 -0
  172. package/src/presets/nodejs-serverless.ts +114 -0
  173. package/src/presets/realtime-app.ts +184 -0
  174. package/src/presets/static-site.ts +64 -0
  175. package/src/presets/traditional-web-app.ts +339 -0
  176. package/src/presets/wordpress.ts +138 -0
  177. package/src/preview/github.test.ts +249 -0
  178. package/src/preview/github.ts +297 -0
  179. package/src/preview/index.ts +37 -0
  180. package/src/preview/manager.test.ts +440 -0
  181. package/src/preview/manager.ts +326 -0
  182. package/src/preview/notifications.test.ts +582 -0
  183. package/src/preview/notifications.ts +341 -0
  184. package/src/queue/batch-processing.ts +402 -0
  185. package/src/queue/dlq-monitoring.ts +402 -0
  186. package/src/queue/fifo.ts +342 -0
  187. package/src/queue/index.ts +9 -0
  188. package/src/queue/management.ts +428 -0
  189. package/src/queue/queue.test.ts +429 -0
  190. package/src/resource-mgmt/index.ts +39 -0
  191. package/src/resource-naming.ts +62 -0
  192. package/src/s3/index.ts +523 -0
  193. package/src/schema/cloud-config.schema.json +554 -0
  194. package/src/schema/index.ts +68 -0
  195. package/src/security/certificate-manager.ts +492 -0
  196. package/src/security/index.ts +9 -0
  197. package/src/security/scanning.ts +545 -0
  198. package/src/security/secrets-manager.ts +476 -0
  199. package/src/security/secrets-rotation.ts +456 -0
  200. package/src/security/security.test.ts +738 -0
  201. package/src/sms/advanced/ab-testing.ts +389 -0
  202. package/src/sms/advanced/analytics.ts +336 -0
  203. package/src/sms/advanced/campaigns.ts +523 -0
  204. package/src/sms/advanced/chatbot.ts +224 -0
  205. package/src/sms/advanced/index.ts +10 -0
  206. package/src/sms/advanced/link-tracking.ts +248 -0
  207. package/src/sms/advanced/mms.ts +308 -0
  208. package/src/sms/handlers/__tests__/send.test.ts +40 -0
  209. package/src/sms/handlers/delivery-status.ts +133 -0
  210. package/src/sms/handlers/receive.ts +162 -0
  211. package/src/sms/handlers/send.ts +174 -0
  212. package/src/sms/index.ts +9 -0
  213. package/src/stack-diff.ts +389 -0
  214. package/src/static-site/index.ts +85 -0
  215. package/src/template-builder.ts +110 -0
  216. package/src/template-validator.ts +574 -0
  217. package/src/utils/cache.ts +291 -0
  218. package/src/utils/diff.ts +269 -0
  219. package/src/utils/hash.ts +227 -0
  220. package/src/utils/index.ts +8 -0
  221. package/src/utils/parallel.ts +294 -0
  222. package/src/validators/credentials.test.ts +274 -0
  223. package/src/validators/credentials.ts +233 -0
  224. package/src/validators/quotas.test.ts +434 -0
  225. package/src/validators/quotas.ts +217 -0
@@ -0,0 +1,399 @@
1
+ /**
2
+ * Lambda VPC Configuration
3
+ * VPC networking for Lambda functions
4
+ */
5
+
6
+ export interface LambdaVPCConfig {
7
+ id: string
8
+ functionName: string
9
+ vpcId: string
10
+ subnetIds: string[]
11
+ securityGroupIds: string[]
12
+ ipv6Allowed?: boolean
13
+ }
14
+
15
+ export interface VPCEndpoint {
16
+ id: string
17
+ vpcId: string
18
+ serviceName: string
19
+ endpointType: 'Interface' | 'Gateway'
20
+ subnetIds?: string[]
21
+ securityGroupIds?: string[]
22
+ privateDnsEnabled?: boolean
23
+ }
24
+
25
+ export interface NetworkInterface {
26
+ id: string
27
+ functionName: string
28
+ networkInterfaceId: string
29
+ subnetId: string
30
+ privateIpAddress: string
31
+ status: 'creating' | 'available' | 'in-use' | 'deleting'
32
+ attachedAt?: Date
33
+ }
34
+
35
+ export interface VPCConnectivity {
36
+ id: string
37
+ functionName: string
38
+ hasInternetAccess: boolean
39
+ hasNATGateway: boolean
40
+ hasVPCEndpoints: boolean
41
+ endpoints: string[]
42
+ recommendations: string[]
43
+ }
44
+
45
+ /**
46
+ * Lambda VPC manager
47
+ */
48
+ export class LambdaVPCManager {
49
+ private vpcConfigs: Map<string, LambdaVPCConfig> = new Map()
50
+ private endpoints: Map<string, VPCEndpoint> = new Map()
51
+ private networkInterfaces: Map<string, NetworkInterface> = new Map()
52
+ private connectivity: Map<string, VPCConnectivity> = new Map()
53
+ private configCounter = 0
54
+ private endpointCounter = 0
55
+ private eniCounter = 0
56
+ private connectivityCounter = 0
57
+
58
+ /**
59
+ * Configure VPC
60
+ */
61
+ configureVPC(config: Omit<LambdaVPCConfig, 'id'>): LambdaVPCConfig {
62
+ const id = `vpc-config-${Date.now()}-${this.configCounter++}`
63
+
64
+ const vpcConfig: LambdaVPCConfig = {
65
+ id,
66
+ ...config,
67
+ }
68
+
69
+ this.vpcConfigs.set(id, vpcConfig)
70
+
71
+ // Simulate ENI creation
72
+ for (const subnetId of config.subnetIds) {
73
+ this.createNetworkInterface({
74
+ functionName: config.functionName,
75
+ subnetId,
76
+ })
77
+ }
78
+
79
+ return vpcConfig
80
+ }
81
+
82
+ /**
83
+ * Configure private VPC
84
+ */
85
+ configurePrivateVPC(options: {
86
+ functionName: string
87
+ vpcId: string
88
+ privateSubnetIds: string[]
89
+ securityGroupId: string
90
+ }): LambdaVPCConfig {
91
+ return this.configureVPC({
92
+ functionName: options.functionName,
93
+ vpcId: options.vpcId,
94
+ subnetIds: options.privateSubnetIds,
95
+ securityGroupIds: [options.securityGroupId],
96
+ ipv6Allowed: false,
97
+ })
98
+ }
99
+
100
+ /**
101
+ * Configure multi-AZ VPC
102
+ */
103
+ configureMultiAZVPC(options: {
104
+ functionName: string
105
+ vpcId: string
106
+ subnetIds: string[]
107
+ securityGroupIds: string[]
108
+ }): LambdaVPCConfig {
109
+ if (options.subnetIds.length < 2) {
110
+ throw new Error('Multi-AZ configuration requires at least 2 subnets')
111
+ }
112
+
113
+ return this.configureVPC({
114
+ functionName: options.functionName,
115
+ vpcId: options.vpcId,
116
+ subnetIds: options.subnetIds,
117
+ securityGroupIds: options.securityGroupIds,
118
+ })
119
+ }
120
+
121
+ /**
122
+ * Create VPC endpoint
123
+ */
124
+ createVPCEndpoint(endpoint: Omit<VPCEndpoint, 'id'>): VPCEndpoint {
125
+ const id = `endpoint-${Date.now()}-${this.endpointCounter++}`
126
+
127
+ const vpcEndpoint: VPCEndpoint = {
128
+ id,
129
+ ...endpoint,
130
+ }
131
+
132
+ this.endpoints.set(id, vpcEndpoint)
133
+
134
+ return vpcEndpoint
135
+ }
136
+
137
+ /**
138
+ * Create S3 VPC endpoint
139
+ */
140
+ createS3Endpoint(options: {
141
+ vpcId: string
142
+ routeTableIds: string[]
143
+ }): VPCEndpoint {
144
+ return this.createVPCEndpoint({
145
+ vpcId: options.vpcId,
146
+ serviceName: 'com.amazonaws.us-east-1.s3',
147
+ endpointType: 'Gateway',
148
+ privateDnsEnabled: false,
149
+ })
150
+ }
151
+
152
+ /**
153
+ * Create DynamoDB VPC endpoint
154
+ */
155
+ createDynamoDBEndpoint(options: {
156
+ vpcId: string
157
+ routeTableIds: string[]
158
+ }): VPCEndpoint {
159
+ return this.createVPCEndpoint({
160
+ vpcId: options.vpcId,
161
+ serviceName: 'com.amazonaws.us-east-1.dynamodb',
162
+ endpointType: 'Gateway',
163
+ privateDnsEnabled: false,
164
+ })
165
+ }
166
+
167
+ /**
168
+ * Create Secrets Manager VPC endpoint
169
+ */
170
+ createSecretsManagerEndpoint(options: {
171
+ vpcId: string
172
+ subnetIds: string[]
173
+ securityGroupIds: string[]
174
+ }): VPCEndpoint {
175
+ return this.createVPCEndpoint({
176
+ vpcId: options.vpcId,
177
+ serviceName: 'com.amazonaws.us-east-1.secretsmanager',
178
+ endpointType: 'Interface',
179
+ subnetIds: options.subnetIds,
180
+ securityGroupIds: options.securityGroupIds,
181
+ privateDnsEnabled: true,
182
+ })
183
+ }
184
+
185
+ /**
186
+ * Create network interface
187
+ */
188
+ private createNetworkInterface(options: {
189
+ functionName: string
190
+ subnetId: string
191
+ }): NetworkInterface {
192
+ const id = `eni-${Date.now()}-${this.eniCounter++}`
193
+
194
+ const networkInterface: NetworkInterface = {
195
+ id,
196
+ functionName: options.functionName,
197
+ networkInterfaceId: `eni-${Math.random().toString(36).substring(2, 15)}`,
198
+ subnetId: options.subnetId,
199
+ privateIpAddress: `10.0.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}`,
200
+ status: 'creating',
201
+ attachedAt: new Date(),
202
+ }
203
+
204
+ this.networkInterfaces.set(id, networkInterface)
205
+
206
+ // Simulate ENI becoming available
207
+ setTimeout(() => {
208
+ networkInterface.status = 'available'
209
+ }, 100)
210
+
211
+ return networkInterface
212
+ }
213
+
214
+ /**
215
+ * Analyze VPC connectivity
216
+ */
217
+ analyzeConnectivity(options: {
218
+ functionName: string
219
+ hasNATGateway?: boolean
220
+ hasInternetGateway?: boolean
221
+ }): VPCConnectivity {
222
+ const id = `connectivity-${Date.now()}-${this.connectivityCounter++}`
223
+
224
+ const config = Array.from(this.vpcConfigs.values()).find(
225
+ c => c.functionName === options.functionName
226
+ )
227
+
228
+ const vpcEndpoints = Array.from(this.endpoints.values())
229
+ .filter(e => e.vpcId === config?.vpcId)
230
+ .map(e => e.serviceName)
231
+
232
+ const recommendations: string[] = []
233
+
234
+ const hasNAT = options.hasNATGateway ?? false
235
+ const hasInternet = options.hasInternetGateway ?? false
236
+
237
+ if (!hasNAT && !hasInternet) {
238
+ recommendations.push('Add NAT Gateway for internet access')
239
+ }
240
+
241
+ if (!vpcEndpoints.includes('com.amazonaws.us-east-1.s3')) {
242
+ recommendations.push('Add S3 VPC endpoint to reduce NAT costs')
243
+ }
244
+
245
+ if (!vpcEndpoints.includes('com.amazonaws.us-east-1.dynamodb')) {
246
+ recommendations.push('Add DynamoDB VPC endpoint for private access')
247
+ }
248
+
249
+ const connectivity: VPCConnectivity = {
250
+ id,
251
+ functionName: options.functionName,
252
+ hasInternetAccess: hasNAT || hasInternet,
253
+ hasNATGateway: hasNAT,
254
+ hasVPCEndpoints: vpcEndpoints.length > 0,
255
+ endpoints: vpcEndpoints,
256
+ recommendations,
257
+ }
258
+
259
+ this.connectivity.set(id, connectivity)
260
+
261
+ return connectivity
262
+ }
263
+
264
+ /**
265
+ * Get VPC config
266
+ */
267
+ getVPCConfig(id: string): LambdaVPCConfig | undefined {
268
+ return this.vpcConfigs.get(id)
269
+ }
270
+
271
+ /**
272
+ * List VPC configs
273
+ */
274
+ listVPCConfigs(functionName?: string): LambdaVPCConfig[] {
275
+ const configs = Array.from(this.vpcConfigs.values())
276
+ return functionName
277
+ ? configs.filter(c => c.functionName === functionName)
278
+ : configs
279
+ }
280
+
281
+ /**
282
+ * Get network interfaces
283
+ */
284
+ getNetworkInterfaces(functionName: string): NetworkInterface[] {
285
+ return Array.from(this.networkInterfaces.values()).filter(
286
+ eni => eni.functionName === functionName
287
+ )
288
+ }
289
+
290
+ /**
291
+ * List VPC endpoints
292
+ */
293
+ listVPCEndpoints(vpcId?: string): VPCEndpoint[] {
294
+ const endpoints = Array.from(this.endpoints.values())
295
+ return vpcId ? endpoints.filter(e => e.vpcId === vpcId) : endpoints
296
+ }
297
+
298
+ /**
299
+ * Generate CloudFormation for VPC config
300
+ */
301
+ generateVPCConfigCF(config: LambdaVPCConfig): any {
302
+ return {
303
+ VpcConfig: {
304
+ SubnetIds: config.subnetIds,
305
+ SecurityGroupIds: config.securityGroupIds,
306
+ ...(config.ipv6Allowed && { Ipv6AllowedForDualStack: true }),
307
+ },
308
+ }
309
+ }
310
+
311
+ /**
312
+ * Generate CloudFormation for VPC endpoint
313
+ */
314
+ generateVPCEndpointCF(endpoint: VPCEndpoint): any {
315
+ return {
316
+ Type: 'AWS::EC2::VPCEndpoint',
317
+ Properties: {
318
+ VpcId: endpoint.vpcId,
319
+ ServiceName: endpoint.serviceName,
320
+ VpcEndpointType: endpoint.endpointType,
321
+ ...(endpoint.subnetIds && { SubnetIds: endpoint.subnetIds }),
322
+ ...(endpoint.securityGroupIds && {
323
+ SecurityGroupIds: endpoint.securityGroupIds,
324
+ }),
325
+ ...(endpoint.privateDnsEnabled !== undefined && {
326
+ PrivateDnsEnabled: endpoint.privateDnsEnabled,
327
+ }),
328
+ },
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Generate security group CloudFormation
334
+ */
335
+ generateSecurityGroupCF(options: {
336
+ groupName: string
337
+ vpcId: string
338
+ ingressRules?: Array<{
339
+ protocol: string
340
+ fromPort: number
341
+ toPort: number
342
+ cidrIp?: string
343
+ sourceSecurityGroupId?: string
344
+ }>
345
+ egressRules?: Array<{
346
+ protocol: string
347
+ fromPort: number
348
+ toPort: number
349
+ cidrIp?: string
350
+ }>
351
+ }): any {
352
+ return {
353
+ Type: 'AWS::EC2::SecurityGroup',
354
+ Properties: {
355
+ GroupName: options.groupName,
356
+ GroupDescription: `Security group for Lambda ${options.groupName}`,
357
+ VpcId: options.vpcId,
358
+ ...(options.ingressRules && {
359
+ SecurityGroupIngress: options.ingressRules.map(rule => ({
360
+ IpProtocol: rule.protocol,
361
+ FromPort: rule.fromPort,
362
+ ToPort: rule.toPort,
363
+ ...(rule.cidrIp && { CidrIp: rule.cidrIp }),
364
+ ...(rule.sourceSecurityGroupId && {
365
+ SourceSecurityGroupId: rule.sourceSecurityGroupId,
366
+ }),
367
+ })),
368
+ }),
369
+ ...(options.egressRules && {
370
+ SecurityGroupEgress: options.egressRules.map(rule => ({
371
+ IpProtocol: rule.protocol,
372
+ FromPort: rule.fromPort,
373
+ ToPort: rule.toPort,
374
+ CidrIp: rule.cidrIp || '0.0.0.0/0',
375
+ })),
376
+ }),
377
+ },
378
+ }
379
+ }
380
+
381
+ /**
382
+ * Clear all data
383
+ */
384
+ clear(): void {
385
+ this.vpcConfigs.clear()
386
+ this.endpoints.clear()
387
+ this.networkInterfaces.clear()
388
+ this.connectivity.clear()
389
+ this.configCounter = 0
390
+ this.endpointCounter = 0
391
+ this.eniCounter = 0
392
+ this.connectivityCounter = 0
393
+ }
394
+ }
395
+
396
+ /**
397
+ * Global Lambda VPC manager instance
398
+ */
399
+ export const lambdaVPCManager: LambdaVPCManager = new LambdaVPCManager()
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Local development configuration
3
+ * Configures ts-cloud to use LocalStack and local services
4
+ */
5
+
6
+ export interface LocalConfig {
7
+ enabled: boolean
8
+ localstackEndpoint: string
9
+ postgresUrl: string
10
+ redisUrl: string
11
+ dynamodbEndpoint: string
12
+ s3Endpoint: string
13
+ emailEndpoint: string
14
+ awsRegion: string
15
+ awsAccessKeyId: string
16
+ awsSecretAccessKey: string
17
+ }
18
+
19
+ /**
20
+ * Default local development configuration
21
+ */
22
+ export const defaultLocalConfig: LocalConfig = {
23
+ enabled: process.env.TS_CLOUD_LOCAL === 'true' || process.env.NODE_ENV === 'development',
24
+ localstackEndpoint: process.env.LOCALSTACK_ENDPOINT || 'http://localhost:4566',
25
+ postgresUrl: process.env.POSTGRES_URL || 'postgresql://tscloud:tscloud@localhost:5432/tscloud',
26
+ redisUrl: process.env.REDIS_URL || 'redis://localhost:6379',
27
+ dynamodbEndpoint: process.env.DYNAMODB_ENDPOINT || 'http://localhost:8000',
28
+ s3Endpoint: process.env.S3_ENDPOINT || 'http://localhost:9000',
29
+ emailEndpoint: process.env.EMAIL_ENDPOINT || 'smtp://localhost:1025',
30
+ awsRegion: process.env.AWS_REGION || 'us-east-1',
31
+ awsAccessKeyId: process.env.AWS_ACCESS_KEY_ID || 'test',
32
+ awsSecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || 'test',
33
+ }
34
+
35
+ /**
36
+ * Get local configuration
37
+ */
38
+ export function getLocalConfig(): LocalConfig {
39
+ return defaultLocalConfig
40
+ }
41
+
42
+ /**
43
+ * Check if running in local development mode
44
+ */
45
+ export function isLocalDevelopment(): boolean {
46
+ return defaultLocalConfig.enabled
47
+ }
48
+
49
+ /**
50
+ * Get AWS endpoint for service in local mode
51
+ */
52
+ export function getLocalEndpoint(service: string): string {
53
+ const config = getLocalConfig()
54
+
55
+ if (!config.enabled) {
56
+ return ''
57
+ }
58
+
59
+ switch (service.toLowerCase()) {
60
+ case 'dynamodb':
61
+ return config.dynamodbEndpoint
62
+ case 's3':
63
+ return config.s3Endpoint
64
+ case 'localstack':
65
+ case 'cloudformation':
66
+ case 'lambda':
67
+ case 'apigateway':
68
+ case 'sns':
69
+ case 'sqs':
70
+ case 'cloudwatch':
71
+ case 'iam':
72
+ case 'sts':
73
+ return config.localstackEndpoint
74
+ default:
75
+ return config.localstackEndpoint
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Get local credentials
81
+ */
82
+ export function getLocalCredentials(): {
83
+ accessKeyId: string
84
+ secretAccessKey: string
85
+ region: string
86
+ } {
87
+ const config = getLocalConfig()
88
+
89
+ return {
90
+ accessKeyId: config.awsAccessKeyId,
91
+ secretAccessKey: config.awsSecretAccessKey,
92
+ region: config.awsRegion,
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Create local environment variables for AWS CLI
98
+ */
99
+ export function getLocalEnvVars(): Record<string, string> {
100
+ const config = getLocalConfig()
101
+
102
+ if (!config.enabled) {
103
+ return {}
104
+ }
105
+
106
+ return {
107
+ AWS_ACCESS_KEY_ID: config.awsAccessKeyId,
108
+ AWS_SECRET_ACCESS_KEY: config.awsSecretAccessKey,
109
+ AWS_REGION: config.awsRegion,
110
+ AWS_ENDPOINT_URL: config.localstackEndpoint,
111
+ LOCALSTACK_ENDPOINT: config.localstackEndpoint,
112
+ TS_CLOUD_LOCAL: 'true',
113
+ }
114
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Local development and testing utilities
3
+ */
4
+
5
+ export * from './config'
6
+ export * from './mock-aws'