@stacksjs/ts-cloud-core 0.1.8 → 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,478 @@
1
+ import type {
2
+ ApiGatewayAuthorizer,
3
+ ApiGatewayDeployment,
4
+ ApiGatewayHttpApi,
5
+ ApiGatewayRestApi,
6
+ ApiGatewayStage,
7
+ } from '@stacksjs/ts-cloud-aws-types'
8
+ import type { EnvironmentType } from '@stacksjs/ts-cloud-types'
9
+ import { Fn } from '../intrinsic-functions'
10
+ import { generateLogicalId, generateResourceName } from '../resource-naming'
11
+
12
+ export interface RestApiOptions {
13
+ slug: string
14
+ environment: EnvironmentType
15
+ name?: string
16
+ apiName?: string // Alias for name
17
+ description?: string
18
+ endpointType?: 'EDGE' | 'REGIONAL' | 'PRIVATE'
19
+ binaryMediaTypes?: string[]
20
+ compressionSize?: number
21
+ }
22
+
23
+ export interface HttpApiOptions {
24
+ slug: string
25
+ environment: EnvironmentType
26
+ name?: string
27
+ description?: string
28
+ corsEnabled?: boolean
29
+ corsOrigins?: string[]
30
+ corsMethods?: string[]
31
+ corsHeaders?: string[]
32
+ corsMaxAge?: number
33
+ corsAllowCredentials?: boolean
34
+ }
35
+
36
+ export interface WebSocketApiOptions {
37
+ slug: string
38
+ environment: EnvironmentType
39
+ name?: string
40
+ description?: string
41
+ }
42
+
43
+ export interface StageOptions {
44
+ slug: string
45
+ environment: EnvironmentType
46
+ stageName?: string
47
+ description?: string
48
+ cacheEnabled?: boolean
49
+ cacheSize?: '0.5' | '1.6' | '6.1' | '13.5' | '28.4' | '58.2' | '118' | '237'
50
+ variables?: Record<string, string>
51
+ throttling?: {
52
+ burstLimit?: number
53
+ rateLimit?: number
54
+ }
55
+ }
56
+
57
+ export interface AuthorizerOptions {
58
+ slug: string
59
+ environment: EnvironmentType
60
+ name?: string
61
+ type: 'TOKEN' | 'REQUEST' | 'COGNITO_USER_POOLS'
62
+ functionArn?: string
63
+ identitySource?: string
64
+ userPoolArns?: string[]
65
+ ttl?: number
66
+ }
67
+
68
+ /**
69
+ * API Gateway Module - REST, HTTP, and WebSocket APIs
70
+ * Provides clean API for creating and configuring API Gateway resources
71
+ */
72
+ export class ApiGateway {
73
+ /**
74
+ * Create a REST API
75
+ */
76
+ static createRestApi(options: RestApiOptions): {
77
+ restApi: ApiGatewayRestApi
78
+ logicalId: string
79
+ } {
80
+ const {
81
+ slug,
82
+ environment,
83
+ name,
84
+ description,
85
+ endpointType = 'REGIONAL',
86
+ binaryMediaTypes,
87
+ compressionSize,
88
+ } = options
89
+
90
+ const resourceName = name || generateResourceName({
91
+ slug,
92
+ environment,
93
+ resourceType: 'rest-api',
94
+ })
95
+
96
+ const logicalId = generateLogicalId(resourceName)
97
+
98
+ const restApi: ApiGatewayRestApi = {
99
+ Type: 'AWS::ApiGateway::RestApi',
100
+ Properties: {
101
+ Name: resourceName,
102
+ Description: description || `REST API for ${slug} ${environment}`,
103
+ EndpointConfiguration: {
104
+ Types: [endpointType],
105
+ },
106
+ Tags: [
107
+ { Key: 'Name', Value: resourceName },
108
+ { Key: 'Environment', Value: environment },
109
+ ],
110
+ },
111
+ }
112
+
113
+ if (binaryMediaTypes && binaryMediaTypes.length > 0) {
114
+ restApi.Properties.BinaryMediaTypes = binaryMediaTypes
115
+ }
116
+
117
+ if (compressionSize !== undefined) {
118
+ restApi.Properties.MinimumCompressionSize = compressionSize
119
+ }
120
+
121
+ return { restApi, logicalId }
122
+ }
123
+
124
+ /**
125
+ * Create an HTTP API (cheaper and simpler than REST API)
126
+ */
127
+ static createHttpApi(options: HttpApiOptions): {
128
+ httpApi: ApiGatewayHttpApi
129
+ logicalId: string
130
+ } {
131
+ const {
132
+ slug,
133
+ environment,
134
+ name,
135
+ description,
136
+ corsEnabled = true,
137
+ corsOrigins = ['*'],
138
+ corsMethods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
139
+ corsHeaders = ['*'],
140
+ corsMaxAge = 86400,
141
+ corsAllowCredentials = false,
142
+ } = options
143
+
144
+ const resourceName = name || generateResourceName({
145
+ slug,
146
+ environment,
147
+ resourceType: 'http-api',
148
+ })
149
+
150
+ const logicalId = generateLogicalId(resourceName)
151
+
152
+ const httpApi: ApiGatewayHttpApi = {
153
+ Type: 'AWS::ApiGatewayV2::Api',
154
+ Properties: {
155
+ Name: resourceName,
156
+ Description: description || `HTTP API for ${slug} ${environment}`,
157
+ ProtocolType: 'HTTP',
158
+ Tags: {
159
+ Name: resourceName,
160
+ Environment: environment,
161
+ },
162
+ },
163
+ }
164
+
165
+ if (corsEnabled) {
166
+ httpApi.Properties.CorsConfiguration = {
167
+ AllowOrigins: corsOrigins,
168
+ AllowMethods: corsMethods,
169
+ AllowHeaders: corsHeaders,
170
+ MaxAge: corsMaxAge,
171
+ AllowCredentials: corsAllowCredentials,
172
+ }
173
+ }
174
+
175
+ return { httpApi, logicalId }
176
+ }
177
+
178
+ /**
179
+ * Create a WebSocket API
180
+ */
181
+ static createWebSocketApi(options: WebSocketApiOptions): {
182
+ webSocketApi: ApiGatewayHttpApi
183
+ logicalId: string
184
+ } {
185
+ const {
186
+ slug,
187
+ environment,
188
+ name,
189
+ description,
190
+ } = options
191
+
192
+ const resourceName = name || generateResourceName({
193
+ slug,
194
+ environment,
195
+ resourceType: 'ws-api',
196
+ })
197
+
198
+ const logicalId = generateLogicalId(resourceName)
199
+
200
+ const webSocketApi: ApiGatewayHttpApi = {
201
+ Type: 'AWS::ApiGatewayV2::Api',
202
+ Properties: {
203
+ Name: resourceName,
204
+ Description: description || `WebSocket API for ${slug} ${environment}`,
205
+ ProtocolType: 'WEBSOCKET',
206
+ Tags: {
207
+ Name: resourceName,
208
+ Environment: environment,
209
+ },
210
+ },
211
+ }
212
+
213
+ return { webSocketApi, logicalId }
214
+ }
215
+
216
+ /**
217
+ * Create a deployment for REST API
218
+ */
219
+ static createDeployment(
220
+ restApiLogicalId: string,
221
+ options: {
222
+ slug: string
223
+ environment: EnvironmentType
224
+ description?: string
225
+ },
226
+ ): {
227
+ deployment: ApiGatewayDeployment
228
+ logicalId: string
229
+ } {
230
+ const { slug, environment, description } = options
231
+
232
+ const resourceName = generateResourceName({
233
+ slug,
234
+ environment,
235
+ resourceType: 'api-deployment',
236
+ })
237
+
238
+ const logicalId = generateLogicalId(resourceName)
239
+
240
+ const deployment: ApiGatewayDeployment = {
241
+ Type: 'AWS::ApiGateway::Deployment',
242
+ Properties: {
243
+ RestApiId: Fn.Ref(restApiLogicalId) as unknown as string,
244
+ Description: description || `Deployment for ${resourceName}`,
245
+ },
246
+ }
247
+
248
+ return { deployment, logicalId }
249
+ }
250
+
251
+ /**
252
+ * Create a stage for REST API
253
+ */
254
+ static createStage(
255
+ restApiLogicalId: string,
256
+ deploymentLogicalId: string,
257
+ options: StageOptions,
258
+ ): {
259
+ stage: ApiGatewayStage
260
+ logicalId: string
261
+ } {
262
+ const {
263
+ slug,
264
+ environment,
265
+ stageName,
266
+ description,
267
+ cacheEnabled = false,
268
+ cacheSize = '0.5',
269
+ variables,
270
+ throttling,
271
+ } = options
272
+
273
+ const resourceName = generateResourceName({
274
+ slug,
275
+ environment,
276
+ resourceType: 'api-stage',
277
+ })
278
+
279
+ const logicalId = generateLogicalId(resourceName)
280
+
281
+ const stage: ApiGatewayStage = {
282
+ Type: 'AWS::ApiGateway::Stage',
283
+ Properties: {
284
+ StageName: stageName || environment,
285
+ RestApiId: Fn.Ref(restApiLogicalId) as unknown as string,
286
+ DeploymentId: Fn.Ref(deploymentLogicalId) as unknown as string,
287
+ Description: description,
288
+ CacheClusterEnabled: cacheEnabled,
289
+ Tags: [
290
+ { Key: 'Name', Value: resourceName },
291
+ { Key: 'Environment', Value: environment },
292
+ ],
293
+ },
294
+ }
295
+
296
+ if (cacheEnabled) {
297
+ stage.Properties.CacheClusterSize = cacheSize
298
+ }
299
+
300
+ if (variables) {
301
+ stage.Properties.Variables = variables
302
+ }
303
+
304
+ if (throttling) {
305
+ stage.Properties.MethodSettings = [
306
+ {
307
+ HttpMethod: '*',
308
+ ResourcePath: '/*',
309
+ ThrottlingBurstLimit: throttling.burstLimit,
310
+ ThrottlingRateLimit: throttling.rateLimit,
311
+ },
312
+ ]
313
+ }
314
+
315
+ return { stage, logicalId }
316
+ }
317
+
318
+ /**
319
+ * Create an authorizer for REST API
320
+ */
321
+ static createAuthorizer(
322
+ restApiLogicalId: string,
323
+ options: AuthorizerOptions,
324
+ ): {
325
+ authorizer: ApiGatewayAuthorizer
326
+ logicalId: string
327
+ } {
328
+ const {
329
+ slug,
330
+ environment,
331
+ name,
332
+ type,
333
+ functionArn,
334
+ identitySource,
335
+ userPoolArns,
336
+ ttl = 300,
337
+ } = options
338
+
339
+ const resourceName = name || generateResourceName({
340
+ slug,
341
+ environment,
342
+ resourceType: 'api-authorizer',
343
+ })
344
+
345
+ const logicalId = generateLogicalId(resourceName)
346
+
347
+ const authorizer: ApiGatewayAuthorizer = {
348
+ Type: 'AWS::ApiGateway::Authorizer',
349
+ Properties: {
350
+ Name: resourceName,
351
+ Type: type,
352
+ RestApiId: Fn.Ref(restApiLogicalId) as unknown as string,
353
+ AuthorizerResultTtlInSeconds: ttl,
354
+ },
355
+ }
356
+
357
+ if (type === 'TOKEN' || type === 'REQUEST') {
358
+ if (!functionArn) {
359
+ throw new Error('Lambda authorizer requires functionArn')
360
+ }
361
+ authorizer.Properties.AuthorizerUri = functionArn
362
+ authorizer.Properties.IdentitySource = identitySource || 'method.request.header.Authorization'
363
+ }
364
+
365
+ if (type === 'COGNITO_USER_POOLS') {
366
+ if (!userPoolArns || userPoolArns.length === 0) {
367
+ throw new Error('Cognito authorizer requires userPoolArns')
368
+ }
369
+ authorizer.Properties.ProviderARNs = userPoolArns
370
+ authorizer.Properties.IdentitySource = identitySource || 'method.request.header.Authorization'
371
+ }
372
+
373
+ return { authorizer, logicalId }
374
+ }
375
+
376
+ /**
377
+ * Enable CORS on HTTP API
378
+ */
379
+ static setCors(
380
+ httpApi: ApiGatewayHttpApi,
381
+ options: {
382
+ origins?: string[]
383
+ methods?: string[]
384
+ headers?: string[]
385
+ maxAge?: number
386
+ allowCredentials?: boolean
387
+ } = {},
388
+ ): ApiGatewayHttpApi {
389
+ const {
390
+ origins = ['*'],
391
+ methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
392
+ headers = ['*'],
393
+ maxAge = 86400,
394
+ allowCredentials = false,
395
+ } = options
396
+
397
+ httpApi.Properties.CorsConfiguration = {
398
+ AllowOrigins: origins,
399
+ AllowMethods: methods,
400
+ AllowHeaders: headers,
401
+ MaxAge: maxAge,
402
+ AllowCredentials: allowCredentials,
403
+ }
404
+
405
+ return httpApi
406
+ }
407
+
408
+ /**
409
+ * Add throttling to stage
410
+ */
411
+ static addThrottling(
412
+ stage: ApiGatewayStage,
413
+ burstLimit: number = 5000,
414
+ rateLimit: number = 10000,
415
+ ): ApiGatewayStage {
416
+ if (!stage.Properties.MethodSettings) {
417
+ stage.Properties.MethodSettings = []
418
+ }
419
+
420
+ stage.Properties.MethodSettings.push({
421
+ HttpMethod: '*',
422
+ ResourcePath: '/*',
423
+ ThrottlingBurstLimit: burstLimit,
424
+ ThrottlingRateLimit: rateLimit,
425
+ })
426
+
427
+ return stage
428
+ }
429
+
430
+ /**
431
+ * Enable caching on stage
432
+ */
433
+ static enableCaching(
434
+ stage: ApiGatewayStage,
435
+ cacheSize: '0.5' | '1.6' | '6.1' | '13.5' | '28.4' | '58.2' | '118' | '237' = '0.5',
436
+ ttl: number = 300,
437
+ ): ApiGatewayStage {
438
+ stage.Properties.CacheClusterEnabled = true
439
+ stage.Properties.CacheClusterSize = cacheSize
440
+
441
+ if (!stage.Properties.MethodSettings) {
442
+ stage.Properties.MethodSettings = []
443
+ }
444
+
445
+ stage.Properties.MethodSettings.push({
446
+ HttpMethod: '*',
447
+ ResourcePath: '/*',
448
+ CachingEnabled: true,
449
+ CacheTtlInSeconds: ttl,
450
+ })
451
+
452
+ return stage
453
+ }
454
+
455
+ /**
456
+ * Common cache sizes (in GB)
457
+ */
458
+ static readonly CacheSizes = {
459
+ Small: '0.5',
460
+ Medium: '1.6',
461
+ Large: '6.1',
462
+ XLarge: '13.5',
463
+ XXLarge: '28.4',
464
+ XXXLarge: '58.2',
465
+ Huge: '118',
466
+ Massive: '237',
467
+ } as const
468
+
469
+ /**
470
+ * Common throttling presets
471
+ */
472
+ static readonly ThrottlingPresets = {
473
+ Light: { burstLimit: 100, rateLimit: 50 },
474
+ Medium: { burstLimit: 500, rateLimit: 250 },
475
+ Heavy: { burstLimit: 2000, rateLimit: 1000 },
476
+ Default: { burstLimit: 5000, rateLimit: 10000 },
477
+ } as const
478
+ }