@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.
Files changed (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +321 -0
  3. package/package.json +31 -0
  4. package/src/advanced-features.test.ts +465 -0
  5. package/src/aws/cloudformation.ts +421 -0
  6. package/src/aws/cloudfront.ts +158 -0
  7. package/src/aws/credentials.test.ts +132 -0
  8. package/src/aws/credentials.ts +545 -0
  9. package/src/aws/index.ts +87 -0
  10. package/src/aws/s3.test.ts +188 -0
  11. package/src/aws/s3.ts +1088 -0
  12. package/src/aws/signature.test.ts +670 -0
  13. package/src/aws/signature.ts +1155 -0
  14. package/src/backup/disaster-recovery.test.ts +726 -0
  15. package/src/backup/disaster-recovery.ts +500 -0
  16. package/src/backup/index.ts +34 -0
  17. package/src/backup/manager.test.ts +498 -0
  18. package/src/backup/manager.ts +432 -0
  19. package/src/cicd/circleci.ts +430 -0
  20. package/src/cicd/github-actions.ts +424 -0
  21. package/src/cicd/gitlab-ci.ts +255 -0
  22. package/src/cicd/index.ts +8 -0
  23. package/src/cli/history.ts +396 -0
  24. package/src/cli/index.ts +10 -0
  25. package/src/cli/progress.ts +458 -0
  26. package/src/cli/repl.ts +454 -0
  27. package/src/cli/suggestions.ts +327 -0
  28. package/src/cli/table.test.ts +319 -0
  29. package/src/cli/table.ts +332 -0
  30. package/src/cloudformation/builder.test.ts +327 -0
  31. package/src/cloudformation/builder.ts +378 -0
  32. package/src/cloudformation/builders/api-gateway.ts +449 -0
  33. package/src/cloudformation/builders/cache.ts +334 -0
  34. package/src/cloudformation/builders/cdn.ts +278 -0
  35. package/src/cloudformation/builders/compute.ts +485 -0
  36. package/src/cloudformation/builders/database.ts +392 -0
  37. package/src/cloudformation/builders/functions.ts +343 -0
  38. package/src/cloudformation/builders/messaging.ts +140 -0
  39. package/src/cloudformation/builders/monitoring.ts +300 -0
  40. package/src/cloudformation/builders/network.ts +264 -0
  41. package/src/cloudformation/builders/queue.ts +147 -0
  42. package/src/cloudformation/builders/security.ts +399 -0
  43. package/src/cloudformation/builders/storage.ts +285 -0
  44. package/src/cloudformation/index.ts +30 -0
  45. package/src/cloudformation/types.ts +173 -0
  46. package/src/compliance/aws-config.ts +543 -0
  47. package/src/compliance/cloudtrail.ts +376 -0
  48. package/src/compliance/compliance.test.ts +423 -0
  49. package/src/compliance/guardduty.ts +446 -0
  50. package/src/compliance/index.ts +66 -0
  51. package/src/compliance/security-hub.ts +456 -0
  52. package/src/containers/build-optimization.ts +416 -0
  53. package/src/containers/containers.test.ts +508 -0
  54. package/src/containers/image-scanning.ts +360 -0
  55. package/src/containers/index.ts +9 -0
  56. package/src/containers/registry.ts +293 -0
  57. package/src/containers/service-mesh.ts +520 -0
  58. package/src/database/database.test.ts +762 -0
  59. package/src/database/index.ts +9 -0
  60. package/src/database/migrations.ts +444 -0
  61. package/src/database/performance.ts +528 -0
  62. package/src/database/replicas.ts +534 -0
  63. package/src/database/users.ts +494 -0
  64. package/src/dependency-graph.ts +143 -0
  65. package/src/deployment/ab-testing.ts +582 -0
  66. package/src/deployment/blue-green.ts +452 -0
  67. package/src/deployment/canary.ts +500 -0
  68. package/src/deployment/deployment.test.ts +526 -0
  69. package/src/deployment/index.ts +61 -0
  70. package/src/deployment/progressive.ts +62 -0
  71. package/src/dns/dns.test.ts +641 -0
  72. package/src/dns/dnssec.ts +315 -0
  73. package/src/dns/index.ts +8 -0
  74. package/src/dns/resolver.ts +496 -0
  75. package/src/dns/routing.ts +593 -0
  76. package/src/email/advanced/analytics.ts +445 -0
  77. package/src/email/advanced/index.ts +11 -0
  78. package/src/email/advanced/rules.ts +465 -0
  79. package/src/email/advanced/scheduling.ts +352 -0
  80. package/src/email/advanced/search.ts +412 -0
  81. package/src/email/advanced/shared-mailboxes.ts +404 -0
  82. package/src/email/advanced/templates.ts +455 -0
  83. package/src/email/advanced/threading.ts +281 -0
  84. package/src/email/analytics.ts +467 -0
  85. package/src/email/bounce-handling.ts +425 -0
  86. package/src/email/email.test.ts +431 -0
  87. package/src/email/handlers/__tests__/inbound.test.ts +38 -0
  88. package/src/email/handlers/__tests__/outbound.test.ts +37 -0
  89. package/src/email/handlers/converter.ts +227 -0
  90. package/src/email/handlers/feedback.ts +228 -0
  91. package/src/email/handlers/inbound.ts +169 -0
  92. package/src/email/handlers/outbound.ts +178 -0
  93. package/src/email/index.ts +15 -0
  94. package/src/email/reputation.ts +303 -0
  95. package/src/email/templates.ts +352 -0
  96. package/src/errors/index.test.ts +434 -0
  97. package/src/errors/index.ts +416 -0
  98. package/src/health-checks/index.ts +40 -0
  99. package/src/index.ts +360 -0
  100. package/src/intrinsic-functions.ts +118 -0
  101. package/src/lambda/concurrency.ts +330 -0
  102. package/src/lambda/destinations.ts +345 -0
  103. package/src/lambda/dlq.ts +425 -0
  104. package/src/lambda/index.ts +11 -0
  105. package/src/lambda/lambda.test.ts +840 -0
  106. package/src/lambda/layers.ts +263 -0
  107. package/src/lambda/versions.ts +376 -0
  108. package/src/lambda/vpc.ts +399 -0
  109. package/src/local/config.ts +114 -0
  110. package/src/local/index.ts +6 -0
  111. package/src/local/mock-aws.ts +351 -0
  112. package/src/modules/ai.ts +340 -0
  113. package/src/modules/api.ts +478 -0
  114. package/src/modules/auth.ts +805 -0
  115. package/src/modules/cache.ts +417 -0
  116. package/src/modules/cdn.ts +1062 -0
  117. package/src/modules/communication.ts +1094 -0
  118. package/src/modules/compute.ts +3348 -0
  119. package/src/modules/database.ts +554 -0
  120. package/src/modules/deployment.ts +1079 -0
  121. package/src/modules/dns.ts +337 -0
  122. package/src/modules/email.ts +1538 -0
  123. package/src/modules/filesystem.ts +515 -0
  124. package/src/modules/index.ts +32 -0
  125. package/src/modules/messaging.ts +486 -0
  126. package/src/modules/monitoring.ts +2086 -0
  127. package/src/modules/network.ts +664 -0
  128. package/src/modules/parameter-store.ts +325 -0
  129. package/src/modules/permissions.ts +1081 -0
  130. package/src/modules/phone.ts +494 -0
  131. package/src/modules/queue.ts +1260 -0
  132. package/src/modules/redirects.ts +464 -0
  133. package/src/modules/registry.ts +699 -0
  134. package/src/modules/search.ts +401 -0
  135. package/src/modules/secrets.ts +416 -0
  136. package/src/modules/security.ts +731 -0
  137. package/src/modules/sms.ts +389 -0
  138. package/src/modules/storage.ts +1120 -0
  139. package/src/modules/workflow.ts +680 -0
  140. package/src/multi-account/config.ts +521 -0
  141. package/src/multi-account/index.ts +7 -0
  142. package/src/multi-account/manager.ts +427 -0
  143. package/src/multi-region/cross-region.ts +410 -0
  144. package/src/multi-region/index.ts +8 -0
  145. package/src/multi-region/manager.ts +483 -0
  146. package/src/multi-region/regions.ts +435 -0
  147. package/src/network-security/index.ts +48 -0
  148. package/src/observability/index.ts +9 -0
  149. package/src/observability/logs.ts +522 -0
  150. package/src/observability/metrics.ts +460 -0
  151. package/src/observability/observability.test.ts +782 -0
  152. package/src/observability/synthetics.ts +568 -0
  153. package/src/observability/xray.ts +358 -0
  154. package/src/phone/advanced/analytics.ts +349 -0
  155. package/src/phone/advanced/callbacks.ts +428 -0
  156. package/src/phone/advanced/index.ts +8 -0
  157. package/src/phone/advanced/ivr-builder.ts +504 -0
  158. package/src/phone/advanced/recording.ts +310 -0
  159. package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
  160. package/src/phone/handlers/incoming-call.ts +117 -0
  161. package/src/phone/handlers/missed-call.ts +116 -0
  162. package/src/phone/handlers/voicemail.ts +179 -0
  163. package/src/phone/index.ts +9 -0
  164. package/src/presets/api-backend.ts +134 -0
  165. package/src/presets/data-pipeline.ts +204 -0
  166. package/src/presets/extend.test.ts +295 -0
  167. package/src/presets/extend.ts +297 -0
  168. package/src/presets/fullstack-app.ts +144 -0
  169. package/src/presets/index.ts +27 -0
  170. package/src/presets/jamstack.ts +135 -0
  171. package/src/presets/microservices.ts +167 -0
  172. package/src/presets/ml-api.ts +208 -0
  173. package/src/presets/nodejs-server.ts +104 -0
  174. package/src/presets/nodejs-serverless.ts +114 -0
  175. package/src/presets/realtime-app.ts +184 -0
  176. package/src/presets/static-site.ts +64 -0
  177. package/src/presets/traditional-web-app.ts +339 -0
  178. package/src/presets/wordpress.ts +138 -0
  179. package/src/preview/github.test.ts +249 -0
  180. package/src/preview/github.ts +297 -0
  181. package/src/preview/index.ts +37 -0
  182. package/src/preview/manager.test.ts +440 -0
  183. package/src/preview/manager.ts +326 -0
  184. package/src/preview/notifications.test.ts +582 -0
  185. package/src/preview/notifications.ts +341 -0
  186. package/src/queue/batch-processing.ts +402 -0
  187. package/src/queue/dlq-monitoring.ts +402 -0
  188. package/src/queue/fifo.ts +342 -0
  189. package/src/queue/index.ts +9 -0
  190. package/src/queue/management.ts +428 -0
  191. package/src/queue/queue.test.ts +429 -0
  192. package/src/resource-mgmt/index.ts +39 -0
  193. package/src/resource-naming.ts +62 -0
  194. package/src/s3/index.ts +523 -0
  195. package/src/schema/cloud-config.schema.json +554 -0
  196. package/src/schema/index.ts +68 -0
  197. package/src/security/certificate-manager.ts +492 -0
  198. package/src/security/index.ts +9 -0
  199. package/src/security/scanning.ts +545 -0
  200. package/src/security/secrets-manager.ts +476 -0
  201. package/src/security/secrets-rotation.ts +456 -0
  202. package/src/security/security.test.ts +738 -0
  203. package/src/sms/advanced/ab-testing.ts +389 -0
  204. package/src/sms/advanced/analytics.ts +336 -0
  205. package/src/sms/advanced/campaigns.ts +523 -0
  206. package/src/sms/advanced/chatbot.ts +224 -0
  207. package/src/sms/advanced/index.ts +10 -0
  208. package/src/sms/advanced/link-tracking.ts +248 -0
  209. package/src/sms/advanced/mms.ts +308 -0
  210. package/src/sms/handlers/__tests__/send.test.ts +40 -0
  211. package/src/sms/handlers/delivery-status.ts +133 -0
  212. package/src/sms/handlers/receive.ts +162 -0
  213. package/src/sms/handlers/send.ts +174 -0
  214. package/src/sms/index.ts +9 -0
  215. package/src/stack-diff.ts +389 -0
  216. package/src/static-site/index.ts +85 -0
  217. package/src/template-builder.ts +110 -0
  218. package/src/template-validator.ts +574 -0
  219. package/src/utils/cache.ts +291 -0
  220. package/src/utils/diff.ts +269 -0
  221. package/src/utils/hash.ts +227 -0
  222. package/src/utils/index.ts +8 -0
  223. package/src/utils/parallel.ts +294 -0
  224. package/src/validators/credentials.test.ts +274 -0
  225. package/src/validators/credentials.ts +233 -0
  226. package/src/validators/quotas.test.ts +434 -0
  227. package/src/validators/quotas.ts +217 -0
  228. package/test/ai.test.ts +327 -0
  229. package/test/api.test.ts +511 -0
  230. package/test/auth.test.ts +632 -0
  231. package/test/cache.test.ts +406 -0
  232. package/test/cdn.test.ts +247 -0
  233. package/test/compute.test.ts +861 -0
  234. package/test/database.test.ts +523 -0
  235. package/test/deployment.test.ts +499 -0
  236. package/test/dns.test.ts +270 -0
  237. package/test/email.test.ts +439 -0
  238. package/test/filesystem.test.ts +382 -0
  239. package/test/integration.test.ts +350 -0
  240. package/test/messaging.test.ts +514 -0
  241. package/test/monitoring.test.ts +634 -0
  242. package/test/network.test.ts +425 -0
  243. package/test/permissions.test.ts +488 -0
  244. package/test/queue.test.ts +484 -0
  245. package/test/registry.test.ts +306 -0
  246. package/test/security.test.ts +462 -0
  247. package/test/storage.test.ts +463 -0
  248. package/test/template-validator.test.ts +559 -0
  249. package/test/workflow.test.ts +592 -0
  250. package/tsconfig.json +16 -0
  251. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,416 @@
1
+ /**
2
+ * Secrets Manager Module
3
+ * Clean API for AWS Secrets Manager
4
+ */
5
+
6
+ import type { SecretsManagerSecret, SecretsManagerSecretTargetAttachment, SecretsManagerRotationSchedule } from '@stacksjs/ts-cloud-aws-types'
7
+ import type { EnvironmentType } from '@stacksjs/ts-cloud-types'
8
+ import { generateLogicalId, generateResourceName } from '../resource-naming'
9
+
10
+ export interface SecretOptions {
11
+ slug: string
12
+ environment: string
13
+ secretName?: string
14
+ description?: string
15
+ secretString?: string
16
+ kmsKeyId?: string
17
+ tags?: Record<string, string>
18
+ }
19
+
20
+ export interface GeneratedSecretOptions {
21
+ slug: string
22
+ environment: string
23
+ secretName?: string
24
+ description?: string
25
+ excludeCharacters?: string
26
+ excludeLowercase?: boolean
27
+ excludeNumbers?: boolean
28
+ excludePunctuation?: boolean
29
+ excludeUppercase?: boolean
30
+ passwordLength?: number
31
+ requireEachIncludedType?: boolean
32
+ kmsKeyId?: string
33
+ tags?: Record<string, string>
34
+ }
35
+
36
+ export interface SecretTargetAttachmentOptions {
37
+ slug: string
38
+ environment: string
39
+ secretId: string
40
+ targetId: string
41
+ targetType: 'AWS::RDS::DBInstance' | 'AWS::RDS::DBCluster' | 'AWS::Redshift::Cluster' | 'AWS::DocDB::DBInstance' | 'AWS::DocDB::DBCluster'
42
+ }
43
+
44
+ export interface SecretRotationOptions {
45
+ slug: string
46
+ environment: string
47
+ secretId: string
48
+ rotationLambdaArn?: string
49
+ automaticallyAfterDays?: number
50
+ rotationType?: string
51
+ kmsKeyArn?: string
52
+ vpcSecurityGroupIds?: string
53
+ vpcSubnetIds?: string
54
+ }
55
+
56
+ /**
57
+ * Secrets Manager Module
58
+ */
59
+ export class Secrets {
60
+ /**
61
+ * Create a secret with explicit value
62
+ */
63
+ static createSecret(options: SecretOptions): {
64
+ secret: SecretsManagerSecret
65
+ logicalId: string
66
+ } {
67
+ const {
68
+ slug,
69
+ environment,
70
+ secretName,
71
+ description,
72
+ secretString,
73
+ kmsKeyId,
74
+ tags,
75
+ } = options
76
+
77
+ const resourceName = secretName || generateResourceName({
78
+ slug,
79
+ environment: environment as EnvironmentType,
80
+ resourceType: 'secret',
81
+ })
82
+
83
+ const logicalId = generateLogicalId(resourceName)
84
+
85
+ const secret: SecretsManagerSecret = {
86
+ Type: 'AWS::SecretsManager::Secret',
87
+ Properties: {
88
+ Name: resourceName,
89
+ Description: description,
90
+ SecretString: secretString,
91
+ Tags: [
92
+ { Key: 'Name', Value: resourceName },
93
+ { Key: 'Environment', Value: environment },
94
+ ...(tags ? Object.entries(tags).map(([Key, Value]) => ({ Key, Value })) : []),
95
+ ],
96
+ },
97
+ }
98
+
99
+ if (kmsKeyId) {
100
+ secret.Properties.KmsKeyId = kmsKeyId
101
+ }
102
+
103
+ return { secret, logicalId }
104
+ }
105
+
106
+ /**
107
+ * Create a secret with auto-generated value
108
+ */
109
+ static createGeneratedSecret(options: GeneratedSecretOptions): {
110
+ secret: SecretsManagerSecret
111
+ logicalId: string
112
+ } {
113
+ const {
114
+ slug,
115
+ environment,
116
+ secretName,
117
+ description,
118
+ excludeCharacters,
119
+ excludeLowercase,
120
+ excludeNumbers,
121
+ excludePunctuation,
122
+ excludeUppercase,
123
+ passwordLength,
124
+ requireEachIncludedType,
125
+ kmsKeyId,
126
+ tags,
127
+ } = options
128
+
129
+ const resourceName = secretName || generateResourceName({
130
+ slug,
131
+ environment: environment as EnvironmentType,
132
+ resourceType: 'secret',
133
+ })
134
+
135
+ const logicalId = generateLogicalId(resourceName)
136
+
137
+ const secret: SecretsManagerSecret = {
138
+ Type: 'AWS::SecretsManager::Secret',
139
+ Properties: {
140
+ Name: resourceName,
141
+ Description: description,
142
+ GenerateSecretString: {
143
+ ExcludeCharacters: excludeCharacters,
144
+ ExcludeLowercase: excludeLowercase,
145
+ ExcludeNumbers: excludeNumbers,
146
+ ExcludePunctuation: excludePunctuation,
147
+ ExcludeUppercase: excludeUppercase,
148
+ PasswordLength: passwordLength || 32,
149
+ RequireEachIncludedType: requireEachIncludedType !== false,
150
+ },
151
+ Tags: [
152
+ { Key: 'Name', Value: resourceName },
153
+ { Key: 'Environment', Value: environment },
154
+ ...(tags ? Object.entries(tags).map(([Key, Value]) => ({ Key, Value })) : []),
155
+ ],
156
+ },
157
+ }
158
+
159
+ if (kmsKeyId) {
160
+ secret.Properties.KmsKeyId = kmsKeyId
161
+ }
162
+
163
+ return { secret, logicalId }
164
+ }
165
+
166
+ /**
167
+ * Create a database secret with username and password
168
+ */
169
+ static createDatabaseSecret(options: {
170
+ slug: string
171
+ environment: string
172
+ secretName?: string
173
+ username: string
174
+ dbname?: string
175
+ engine?: string
176
+ host?: string
177
+ port?: number
178
+ kmsKeyId?: string
179
+ }): {
180
+ secret: SecretsManagerSecret
181
+ logicalId: string
182
+ } {
183
+ const {
184
+ slug,
185
+ environment,
186
+ secretName,
187
+ username,
188
+ dbname,
189
+ engine,
190
+ host,
191
+ port,
192
+ kmsKeyId,
193
+ } = options
194
+
195
+ const resourceName = secretName || generateResourceName({
196
+ slug,
197
+ environment: environment as EnvironmentType,
198
+ resourceType: 'db-secret',
199
+ })
200
+
201
+ const logicalId = generateLogicalId(resourceName)
202
+
203
+ const secretTemplate: Record<string, any> = {
204
+ username,
205
+ }
206
+
207
+ if (dbname)
208
+ secretTemplate.dbname = dbname
209
+ if (engine)
210
+ secretTemplate.engine = engine
211
+ if (host)
212
+ secretTemplate.host = host
213
+ if (port)
214
+ secretTemplate.port = port
215
+
216
+ const secret: SecretsManagerSecret = {
217
+ Type: 'AWS::SecretsManager::Secret',
218
+ Properties: {
219
+ Name: resourceName,
220
+ Description: `Database credentials for ${username}`,
221
+ GenerateSecretString: {
222
+ SecretStringTemplate: JSON.stringify(secretTemplate),
223
+ GenerateStringKey: 'password',
224
+ PasswordLength: 32,
225
+ ExcludeCharacters: '"@/\\',
226
+ RequireEachIncludedType: true,
227
+ },
228
+ Tags: [
229
+ { Key: 'Name', Value: resourceName },
230
+ { Key: 'Environment', Value: environment },
231
+ { Key: 'Type', Value: 'database' },
232
+ ],
233
+ },
234
+ }
235
+
236
+ if (kmsKeyId) {
237
+ secret.Properties.KmsKeyId = kmsKeyId
238
+ }
239
+
240
+ return { secret, logicalId }
241
+ }
242
+
243
+ /**
244
+ * Attach secret to RDS database for automatic rotation
245
+ */
246
+ static attachToDatabase(options: SecretTargetAttachmentOptions): {
247
+ attachment: SecretsManagerSecretTargetAttachment
248
+ logicalId: string
249
+ } {
250
+ const {
251
+ slug,
252
+ environment,
253
+ secretId,
254
+ targetId,
255
+ targetType,
256
+ } = options
257
+
258
+ const resourceName = generateResourceName({
259
+ slug,
260
+ environment: environment as EnvironmentType,
261
+ resourceType: 'secret-attachment',
262
+ })
263
+
264
+ const logicalId = generateLogicalId(resourceName)
265
+
266
+ const attachment: SecretsManagerSecretTargetAttachment = {
267
+ Type: 'AWS::SecretsManager::SecretTargetAttachment',
268
+ Properties: {
269
+ SecretId: secretId,
270
+ TargetId: targetId,
271
+ TargetType: targetType,
272
+ },
273
+ }
274
+
275
+ return { attachment, logicalId }
276
+ }
277
+
278
+ /**
279
+ * Enable automatic rotation for a secret
280
+ */
281
+ static enableRotation(options: SecretRotationOptions): {
282
+ rotation: SecretsManagerRotationSchedule
283
+ logicalId: string
284
+ } {
285
+ const {
286
+ slug,
287
+ environment,
288
+ secretId,
289
+ rotationLambdaArn,
290
+ automaticallyAfterDays,
291
+ rotationType,
292
+ kmsKeyArn,
293
+ vpcSecurityGroupIds,
294
+ vpcSubnetIds,
295
+ } = options
296
+
297
+ const resourceName = generateResourceName({
298
+ slug,
299
+ environment: environment as EnvironmentType,
300
+ resourceType: 'secret-rotation',
301
+ })
302
+
303
+ const logicalId = generateLogicalId(resourceName)
304
+
305
+ const rotation: SecretsManagerRotationSchedule = {
306
+ Type: 'AWS::SecretsManager::RotationSchedule',
307
+ Properties: {
308
+ SecretId: secretId,
309
+ RotationRules: {
310
+ AutomaticallyAfterDays: automaticallyAfterDays || 30,
311
+ },
312
+ },
313
+ }
314
+
315
+ if (rotationLambdaArn) {
316
+ rotation.Properties.RotationLambdaARN = rotationLambdaArn
317
+ }
318
+ else if (rotationType) {
319
+ // Use hosted rotation Lambda
320
+ rotation.Properties.HostedRotationLambda = {
321
+ RotationType: rotationType,
322
+ KmsKeyArn: kmsKeyArn,
323
+ VpcSecurityGroupIds: vpcSecurityGroupIds,
324
+ VpcSubnetIds: vpcSubnetIds,
325
+ }
326
+ }
327
+
328
+ return { rotation, logicalId }
329
+ }
330
+
331
+ /**
332
+ * Common secret types
333
+ */
334
+ static readonly SecretTypes = {
335
+ /**
336
+ * API key secret (32 chars, alphanumeric only)
337
+ */
338
+ apiKey: (slug: string, environment: string, serviceName: string): { secret: SecretsManagerSecret; logicalId: string } => {
339
+ return Secrets.createGeneratedSecret({
340
+ slug,
341
+ environment,
342
+ secretName: `${slug}-${environment}-${serviceName}-api-key`,
343
+ description: `API key for ${serviceName}`,
344
+ passwordLength: 32,
345
+ excludePunctuation: true,
346
+ excludeLowercase: false,
347
+ excludeUppercase: false,
348
+ excludeNumbers: false,
349
+ })
350
+ },
351
+
352
+ /**
353
+ * OAuth client secret (strong password)
354
+ */
355
+ oauthClientSecret: (slug: string, environment: string, clientName: string): { secret: SecretsManagerSecret; logicalId: string } => {
356
+ return Secrets.createGeneratedSecret({
357
+ slug,
358
+ environment,
359
+ secretName: `${slug}-${environment}-${clientName}-oauth-secret`,
360
+ description: `OAuth client secret for ${clientName}`,
361
+ passwordLength: 64,
362
+ excludeCharacters: '"\'`\\/@',
363
+ requireEachIncludedType: true,
364
+ })
365
+ },
366
+
367
+ /**
368
+ * JWT signing secret
369
+ */
370
+ jwtSecret: (slug: string, environment: string): { secret: SecretsManagerSecret; logicalId: string } => {
371
+ return Secrets.createGeneratedSecret({
372
+ slug,
373
+ environment,
374
+ secretName: `${slug}-${environment}-jwt-secret`,
375
+ description: 'JWT signing secret',
376
+ passwordLength: 64,
377
+ excludePunctuation: true,
378
+ })
379
+ },
380
+
381
+ /**
382
+ * Encryption key (base64-compatible)
383
+ */
384
+ encryptionKey: (slug: string, environment: string): { secret: SecretsManagerSecret; logicalId: string } => {
385
+ return Secrets.createGeneratedSecret({
386
+ slug,
387
+ environment,
388
+ secretName: `${slug}-${environment}-encryption-key`,
389
+ description: 'Data encryption key',
390
+ passwordLength: 64,
391
+ excludeCharacters: '+/=',
392
+ excludePunctuation: true,
393
+ })
394
+ },
395
+ }
396
+
397
+ /**
398
+ * Common rotation types for hosted rotation
399
+ */
400
+ static readonly RotationTypes = {
401
+ MySQLSingleUser: 'MySQLSingleUser',
402
+ MySQLMultiUser: 'MySQLMultiUser',
403
+ PostgreSQLSingleUser: 'PostgreSQLSingleUser',
404
+ PostgreSQLMultiUser: 'PostgreSQLMultiUser',
405
+ OracleSingleUser: 'OracleSingleUser',
406
+ OracleMultiUser: 'OracleMultiUser',
407
+ MariaDBSingleUser: 'MariaDBSingleUser',
408
+ MariaDBMultiUser: 'MariaDBMultiUser',
409
+ SQLServerSingleUser: 'SQLServerSingleUser',
410
+ SQLServerMultiUser: 'SQLServerMultiUser',
411
+ RedshiftSingleUser: 'RedshiftSingleUser',
412
+ RedshiftMultiUser: 'RedshiftMultiUser',
413
+ MongoDBSingleUser: 'MongoDBSingleUser',
414
+ MongoDBMultiUser: 'MongoDBMultiUser',
415
+ }
416
+ }