@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,523 @@
1
+ /**
2
+ * S3 Advanced Features
3
+ * Object Lock, Transfer Acceleration, Access Points, Glacier, Inventory, Batch Operations, Event Notifications
4
+ */
5
+
6
+ export interface LifecyclePolicy {
7
+ id: string
8
+ transitions: Array<{ days: number; storageClass: string }>
9
+ expiration?: number
10
+ }
11
+
12
+ export interface VersioningConfig {
13
+ id: string
14
+ enabled: boolean
15
+ mfaDelete: boolean
16
+ }
17
+
18
+ export interface ReplicationRule {
19
+ id: string
20
+ sourceRegion: string
21
+ destRegion: string
22
+ destBucket: string
23
+ }
24
+
25
+ export interface IntelligentTieringConfig {
26
+ id: string
27
+ archiveDays: number
28
+ deepArchiveDays: number
29
+ }
30
+
31
+ export interface ObjectLockConfig {
32
+ id: string
33
+ bucketName: string
34
+ mode: 'COMPLIANCE' | 'GOVERNANCE'
35
+ retentionDays?: number
36
+ retentionYears?: number
37
+ legalHoldEnabled: boolean
38
+ }
39
+
40
+ export interface TransferAccelerationConfig {
41
+ id: string
42
+ bucketName: string
43
+ enabled: boolean
44
+ endpoint: string
45
+ }
46
+
47
+ export interface AccessPoint {
48
+ id: string
49
+ name: string
50
+ bucketName: string
51
+ vpcId?: string
52
+ publicAccessBlock: boolean
53
+ policy?: Record<string, any>
54
+ }
55
+
56
+ export interface GlacierArchiveConfig {
57
+ id: string
58
+ bucketName: string
59
+ archiveType: 'GLACIER' | 'DEEP_ARCHIVE'
60
+ transitionDays: number
61
+ restoreConfig?: {
62
+ tier: 'Expedited' | 'Standard' | 'Bulk'
63
+ days: number
64
+ }
65
+ }
66
+
67
+ export interface InventoryConfig {
68
+ id: string
69
+ sourceBucket: string
70
+ destinationBucket: string
71
+ schedule: 'Daily' | 'Weekly'
72
+ format: 'CSV' | 'ORC' | 'Parquet'
73
+ includedFields: string[]
74
+ prefix?: string
75
+ }
76
+
77
+ export interface BatchOperation {
78
+ id: string
79
+ operation: 'Copy' | 'Delete' | 'RestoreObject' | 'Tagging' | 'ACL' | 'ObjectLock'
80
+ manifestBucket: string
81
+ manifestKey: string
82
+ priority: number
83
+ status: 'pending' | 'in_progress' | 'completed' | 'failed'
84
+ totalObjects?: number
85
+ processedObjects?: number
86
+ }
87
+
88
+ export interface EventNotification {
89
+ id: string
90
+ bucketName: string
91
+ events: Array<'s3:ObjectCreated:*' | 's3:ObjectRemoved:*' | 's3:ObjectRestore:*' | 's3:Replication:*'>
92
+ destination: {
93
+ type: 'Lambda' | 'SQS' | 'SNS'
94
+ arn: string
95
+ }
96
+ filter?: {
97
+ prefix?: string
98
+ suffix?: string
99
+ }
100
+ }
101
+
102
+ export class StorageAdvancedManager {
103
+ private policies = new Map<string, LifecyclePolicy>()
104
+ private versioningConfigs = new Map<string, VersioningConfig>()
105
+ private replicationRules = new Map<string, ReplicationRule>()
106
+ private tieringConfigs = new Map<string, IntelligentTieringConfig>()
107
+ private objectLocks = new Map<string, ObjectLockConfig>()
108
+ private transferAcceleration = new Map<string, TransferAccelerationConfig>()
109
+ private accessPoints = new Map<string, AccessPoint>()
110
+ private glacierConfigs = new Map<string, GlacierArchiveConfig>()
111
+ private inventories = new Map<string, InventoryConfig>()
112
+ private batchOps = new Map<string, BatchOperation>()
113
+ private eventNotifications = new Map<string, EventNotification>()
114
+ private counter = 0
115
+
116
+ createLifecyclePolicy(transitions: Array<{ days: number; storageClass: string }>, expiration?: number): LifecyclePolicy {
117
+ const id = `lifecycle-${Date.now()}-${this.counter++}`
118
+ const policy = { id, transitions, expiration }
119
+ this.policies.set(id, policy)
120
+ return policy
121
+ }
122
+
123
+ enableVersioning(mfaDelete = false): VersioningConfig {
124
+ const id = `versioning-${Date.now()}-${this.counter++}`
125
+ const config = { id, enabled: true, mfaDelete }
126
+ this.versioningConfigs.set(id, config)
127
+ return config
128
+ }
129
+
130
+ createReplicationRule(sourceRegion: string, destRegion: string, destBucket: string): ReplicationRule {
131
+ const id = `replication-${Date.now()}-${this.counter++}`
132
+ const rule = { id, sourceRegion, destRegion, destBucket }
133
+ this.replicationRules.set(id, rule)
134
+ return rule
135
+ }
136
+
137
+ createIntelligentTiering(archiveDays: number, deepArchiveDays: number): IntelligentTieringConfig {
138
+ const id = `tiering-${Date.now()}-${this.counter++}`
139
+ const config = { id, archiveDays, deepArchiveDays }
140
+ this.tieringConfigs.set(id, config)
141
+ return config
142
+ }
143
+
144
+ /**
145
+ * Enable S3 Object Lock in compliance mode
146
+ */
147
+ enableObjectLock(options: {
148
+ bucketName: string
149
+ mode?: 'COMPLIANCE' | 'GOVERNANCE'
150
+ retentionDays?: number
151
+ retentionYears?: number
152
+ legalHoldEnabled?: boolean
153
+ }): ObjectLockConfig {
154
+ const id = `object-lock-${Date.now()}-${this.counter++}`
155
+ const config: ObjectLockConfig = {
156
+ id,
157
+ bucketName: options.bucketName,
158
+ mode: options.mode || 'COMPLIANCE',
159
+ retentionDays: options.retentionDays,
160
+ retentionYears: options.retentionYears,
161
+ legalHoldEnabled: options.legalHoldEnabled || false,
162
+ }
163
+ this.objectLocks.set(id, config)
164
+ return config
165
+ }
166
+
167
+ /**
168
+ * Enable S3 Transfer Acceleration
169
+ */
170
+ enableTransferAcceleration(bucketName: string): TransferAccelerationConfig {
171
+ const id = `transfer-accel-${Date.now()}-${this.counter++}`
172
+ const config: TransferAccelerationConfig = {
173
+ id,
174
+ bucketName,
175
+ enabled: true,
176
+ endpoint: `${bucketName}.s3-accelerate.amazonaws.com`,
177
+ }
178
+ this.transferAcceleration.set(id, config)
179
+ return config
180
+ }
181
+
182
+ /**
183
+ * Create S3 Access Point
184
+ */
185
+ createAccessPoint(options: {
186
+ name: string
187
+ bucketName: string
188
+ vpcId?: string
189
+ publicAccessBlock?: boolean
190
+ policy?: Record<string, any>
191
+ }): AccessPoint {
192
+ const id = `access-point-${Date.now()}-${this.counter++}`
193
+ const accessPoint: AccessPoint = {
194
+ id,
195
+ name: options.name,
196
+ bucketName: options.bucketName,
197
+ vpcId: options.vpcId,
198
+ publicAccessBlock: options.publicAccessBlock !== false,
199
+ policy: options.policy,
200
+ }
201
+ this.accessPoints.set(id, accessPoint)
202
+ return accessPoint
203
+ }
204
+
205
+ /**
206
+ * Configure Glacier Deep Archive
207
+ */
208
+ createGlacierArchive(options: {
209
+ bucketName: string
210
+ archiveType: 'GLACIER' | 'DEEP_ARCHIVE'
211
+ transitionDays: number
212
+ restoreTier?: 'Expedited' | 'Standard' | 'Bulk'
213
+ restoreDays?: number
214
+ }): GlacierArchiveConfig {
215
+ const id = `glacier-${Date.now()}-${this.counter++}`
216
+ const config: GlacierArchiveConfig = {
217
+ id,
218
+ bucketName: options.bucketName,
219
+ archiveType: options.archiveType,
220
+ transitionDays: options.transitionDays,
221
+ restoreConfig: options.restoreTier ? {
222
+ tier: options.restoreTier,
223
+ days: options.restoreDays || 7,
224
+ } : undefined,
225
+ }
226
+ this.glacierConfigs.set(id, config)
227
+ return config
228
+ }
229
+
230
+ /**
231
+ * Create S3 Inventory configuration
232
+ */
233
+ createInventory(options: {
234
+ sourceBucket: string
235
+ destinationBucket: string
236
+ schedule?: 'Daily' | 'Weekly'
237
+ format?: 'CSV' | 'ORC' | 'Parquet'
238
+ includedFields?: string[]
239
+ prefix?: string
240
+ }): InventoryConfig {
241
+ const id = `inventory-${Date.now()}-${this.counter++}`
242
+ const config: InventoryConfig = {
243
+ id,
244
+ sourceBucket: options.sourceBucket,
245
+ destinationBucket: options.destinationBucket,
246
+ schedule: options.schedule || 'Daily',
247
+ format: options.format || 'CSV',
248
+ includedFields: options.includedFields || ['Size', 'LastModifiedDate', 'StorageClass', 'ETag'],
249
+ prefix: options.prefix,
250
+ }
251
+ this.inventories.set(id, config)
252
+ return config
253
+ }
254
+
255
+ /**
256
+ * Create S3 Batch Operation
257
+ */
258
+ createBatchOperation(options: {
259
+ operation: 'Copy' | 'Delete' | 'RestoreObject' | 'Tagging' | 'ACL' | 'ObjectLock'
260
+ manifestBucket: string
261
+ manifestKey: string
262
+ priority?: number
263
+ }): BatchOperation {
264
+ const id = `batch-op-${Date.now()}-${this.counter++}`
265
+ const batchOp: BatchOperation = {
266
+ id,
267
+ operation: options.operation,
268
+ manifestBucket: options.manifestBucket,
269
+ manifestKey: options.manifestKey,
270
+ priority: options.priority || 10,
271
+ status: 'pending',
272
+ }
273
+ this.batchOps.set(id, batchOp)
274
+ return batchOp
275
+ }
276
+
277
+ /**
278
+ * Execute batch operation
279
+ */
280
+ executeBatchOperation(batchOpId: string): BatchOperation {
281
+ const batchOp = this.batchOps.get(batchOpId)
282
+ if (!batchOp) {
283
+ throw new Error(`Batch operation not found: ${batchOpId}`)
284
+ }
285
+ batchOp.status = 'in_progress'
286
+ batchOp.totalObjects = 1000 // Simulated
287
+ batchOp.processedObjects = 0
288
+ return batchOp
289
+ }
290
+
291
+ /**
292
+ * Get batch operation status
293
+ */
294
+ getBatchOperationStatus(batchOpId: string): BatchOperation | undefined {
295
+ return this.batchOps.get(batchOpId)
296
+ }
297
+
298
+ /**
299
+ * Create S3 Event Notification for Lambda
300
+ */
301
+ createLambdaNotification(options: {
302
+ bucketName: string
303
+ lambdaArn: string
304
+ events: Array<'s3:ObjectCreated:*' | 's3:ObjectRemoved:*' | 's3:ObjectRestore:*' | 's3:Replication:*'>
305
+ prefix?: string
306
+ suffix?: string
307
+ }): EventNotification {
308
+ const id = `event-${Date.now()}-${this.counter++}`
309
+ const notification: EventNotification = {
310
+ id,
311
+ bucketName: options.bucketName,
312
+ events: options.events,
313
+ destination: {
314
+ type: 'Lambda',
315
+ arn: options.lambdaArn,
316
+ },
317
+ filter: (options.prefix || options.suffix) ? {
318
+ prefix: options.prefix,
319
+ suffix: options.suffix,
320
+ } : undefined,
321
+ }
322
+ this.eventNotifications.set(id, notification)
323
+ return notification
324
+ }
325
+
326
+ /**
327
+ * Create S3 Event Notification for SQS
328
+ */
329
+ createSQSNotification(options: {
330
+ bucketName: string
331
+ queueArn: string
332
+ events: Array<'s3:ObjectCreated:*' | 's3:ObjectRemoved:*' | 's3:ObjectRestore:*' | 's3:Replication:*'>
333
+ prefix?: string
334
+ suffix?: string
335
+ }): EventNotification {
336
+ const id = `event-${Date.now()}-${this.counter++}`
337
+ const notification: EventNotification = {
338
+ id,
339
+ bucketName: options.bucketName,
340
+ events: options.events,
341
+ destination: {
342
+ type: 'SQS',
343
+ arn: options.queueArn,
344
+ },
345
+ filter: (options.prefix || options.suffix) ? {
346
+ prefix: options.prefix,
347
+ suffix: options.suffix,
348
+ } : undefined,
349
+ }
350
+ this.eventNotifications.set(id, notification)
351
+ return notification
352
+ }
353
+
354
+ /**
355
+ * Create S3 Event Notification for SNS
356
+ */
357
+ createSNSNotification(options: {
358
+ bucketName: string
359
+ topicArn: string
360
+ events: Array<'s3:ObjectCreated:*' | 's3:ObjectRemoved:*' | 's3:ObjectRestore:*' | 's3:Replication:*'>
361
+ prefix?: string
362
+ suffix?: string
363
+ }): EventNotification {
364
+ const id = `event-${Date.now()}-${this.counter++}`
365
+ const notification: EventNotification = {
366
+ id,
367
+ bucketName: options.bucketName,
368
+ events: options.events,
369
+ destination: {
370
+ type: 'SNS',
371
+ arn: options.topicArn,
372
+ },
373
+ filter: (options.prefix || options.suffix) ? {
374
+ prefix: options.prefix,
375
+ suffix: options.suffix,
376
+ } : undefined,
377
+ }
378
+ this.eventNotifications.set(id, notification)
379
+ return notification
380
+ }
381
+
382
+ /**
383
+ * Generate CloudFormation for Object Lock
384
+ */
385
+ generateObjectLockCF(config: ObjectLockConfig): any {
386
+ const cf: any = {
387
+ ObjectLockEnabled: 'Enabled',
388
+ ObjectLockConfiguration: {
389
+ ObjectLockEnabled: 'Enabled',
390
+ Rule: {
391
+ DefaultRetention: {
392
+ Mode: config.mode,
393
+ },
394
+ },
395
+ },
396
+ }
397
+
398
+ if (config.retentionDays) {
399
+ cf.ObjectLockConfiguration.Rule.DefaultRetention.Days = config.retentionDays
400
+ }
401
+ if (config.retentionYears) {
402
+ cf.ObjectLockConfiguration.Rule.DefaultRetention.Years = config.retentionYears
403
+ }
404
+
405
+ return cf
406
+ }
407
+
408
+ /**
409
+ * Generate CloudFormation for Transfer Acceleration
410
+ */
411
+ generateTransferAccelerationCF(config: TransferAccelerationConfig): any {
412
+ return {
413
+ AccelerateConfiguration: {
414
+ AccelerationStatus: config.enabled ? 'Enabled' : 'Suspended',
415
+ },
416
+ }
417
+ }
418
+
419
+ /**
420
+ * Generate CloudFormation for Access Point
421
+ */
422
+ generateAccessPointCF(accessPoint: AccessPoint): any {
423
+ return {
424
+ Type: 'AWS::S3::AccessPoint',
425
+ Properties: {
426
+ Name: accessPoint.name,
427
+ Bucket: accessPoint.bucketName,
428
+ ...(accessPoint.vpcId && {
429
+ VpcConfiguration: {
430
+ VpcId: accessPoint.vpcId,
431
+ },
432
+ }),
433
+ PublicAccessBlockConfiguration: accessPoint.publicAccessBlock ? {
434
+ BlockPublicAcls: true,
435
+ BlockPublicPolicy: true,
436
+ IgnorePublicAcls: true,
437
+ RestrictPublicBuckets: true,
438
+ } : undefined,
439
+ ...(accessPoint.policy && { Policy: accessPoint.policy }),
440
+ },
441
+ }
442
+ }
443
+
444
+ /**
445
+ * Generate CloudFormation for Inventory
446
+ */
447
+ generateInventoryCF(inventory: InventoryConfig): any {
448
+ return {
449
+ Type: 'AWS::S3::Bucket',
450
+ Properties: {
451
+ InventoryConfigurations: [
452
+ {
453
+ Id: inventory.id,
454
+ Destination: {
455
+ BucketArn: `arn:aws:s3:::${inventory.destinationBucket}`,
456
+ Format: inventory.format,
457
+ },
458
+ Enabled: true,
459
+ IncludedObjectVersions: 'Current',
460
+ OptionalFields: inventory.includedFields,
461
+ ScheduleFrequency: inventory.schedule,
462
+ ...(inventory.prefix && { Prefix: inventory.prefix }),
463
+ },
464
+ ],
465
+ },
466
+ }
467
+ }
468
+
469
+ /**
470
+ * Generate CloudFormation for Event Notification
471
+ */
472
+ generateEventNotificationCF(notification: EventNotification): any {
473
+ const configKey = notification.destination.type === 'Lambda'
474
+ ? 'LambdaConfigurations'
475
+ : notification.destination.type === 'SQS'
476
+ ? 'QueueConfigurations'
477
+ : 'TopicConfigurations'
478
+
479
+ const destKey = notification.destination.type === 'Lambda'
480
+ ? 'Function'
481
+ : notification.destination.type === 'SQS'
482
+ ? 'Queue'
483
+ : 'Topic'
484
+
485
+ const config: any = {
486
+ Event: notification.events[0],
487
+ [destKey]: notification.destination.arn,
488
+ }
489
+
490
+ if (notification.filter) {
491
+ config.Filter = {
492
+ S3Key: {
493
+ Rules: [
494
+ ...(notification.filter.prefix ? [{ Name: 'prefix', Value: notification.filter.prefix }] : []),
495
+ ...(notification.filter.suffix ? [{ Name: 'suffix', Value: notification.filter.suffix }] : []),
496
+ ],
497
+ },
498
+ }
499
+ }
500
+
501
+ return {
502
+ NotificationConfiguration: {
503
+ [configKey]: [config],
504
+ },
505
+ }
506
+ }
507
+
508
+ clear(): void {
509
+ this.policies.clear()
510
+ this.versioningConfigs.clear()
511
+ this.replicationRules.clear()
512
+ this.tieringConfigs.clear()
513
+ this.objectLocks.clear()
514
+ this.transferAcceleration.clear()
515
+ this.accessPoints.clear()
516
+ this.glacierConfigs.clear()
517
+ this.inventories.clear()
518
+ this.batchOps.clear()
519
+ this.eventNotifications.clear()
520
+ }
521
+ }
522
+
523
+ export const storageAdvancedManager: StorageAdvancedManager = new StorageAdvancedManager()