@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,460 @@
1
+ /**
2
+ * Custom CloudWatch Metrics
3
+ * Application and business metrics collection
4
+ */
5
+
6
+ export interface MetricNamespace {
7
+ id: string
8
+ name: string
9
+ description?: string
10
+ metrics: CustomMetric[]
11
+ }
12
+
13
+ export interface CustomMetric {
14
+ id: string
15
+ name: string
16
+ namespace: string
17
+ unit: MetricUnit
18
+ dimensions?: MetricDimension[]
19
+ statisticValues?: MetricStatistic[]
20
+ alarms?: MetricAlarm[]
21
+ }
22
+
23
+ export type MetricUnit =
24
+ | 'Seconds'
25
+ | 'Microseconds'
26
+ | 'Milliseconds'
27
+ | 'Bytes'
28
+ | 'Kilobytes'
29
+ | 'Megabytes'
30
+ | 'Gigabytes'
31
+ | 'Terabytes'
32
+ | 'Bits'
33
+ | 'Kilobits'
34
+ | 'Megabits'
35
+ | 'Gigabits'
36
+ | 'Terabits'
37
+ | 'Percent'
38
+ | 'Count'
39
+ | 'Bytes/Second'
40
+ | 'Kilobytes/Second'
41
+ | 'Megabytes/Second'
42
+ | 'Gigabytes/Second'
43
+ | 'Terabytes/Second'
44
+ | 'Bits/Second'
45
+ | 'Kilobits/Second'
46
+ | 'Megabits/Second'
47
+ | 'Gigabits/Second'
48
+ | 'Terabits/Second'
49
+ | 'Count/Second'
50
+ | 'None'
51
+
52
+ export interface MetricDimension {
53
+ name: string
54
+ value: string
55
+ }
56
+
57
+ export interface MetricStatistic {
58
+ sampleCount: number
59
+ sum: number
60
+ minimum: number
61
+ maximum: number
62
+ timestamp: Date
63
+ }
64
+
65
+ export interface MetricAlarm {
66
+ id: string
67
+ name: string
68
+ description?: string
69
+ comparisonOperator: 'GreaterThanThreshold' | 'GreaterThanOrEqualToThreshold' | 'LessThanThreshold' | 'LessThanOrEqualToThreshold'
70
+ evaluationPeriods: number
71
+ threshold: number
72
+ period: number // seconds
73
+ statistic: 'Average' | 'Sum' | 'Minimum' | 'Maximum' | 'SampleCount'
74
+ treatMissingData?: 'notBreaching' | 'breaching' | 'ignore' | 'missing'
75
+ actionsEnabled?: boolean
76
+ alarmActions?: string[] // SNS topic ARNs
77
+ okActions?: string[]
78
+ insufficientDataActions?: string[]
79
+ }
80
+
81
+ /**
82
+ * Metrics manager
83
+ */
84
+ export class MetricsManager {
85
+ private namespaces: Map<string, MetricNamespace> = new Map()
86
+ private metrics: Map<string, CustomMetric> = new Map()
87
+ private namespaceCounter = 0
88
+ private metricCounter = 0
89
+ private alarmCounter = 0
90
+
91
+ /**
92
+ * Create metric namespace
93
+ */
94
+ createNamespace(namespace: Omit<MetricNamespace, 'id'>): MetricNamespace {
95
+ const id = `namespace-${Date.now()}-${this.namespaceCounter++}`
96
+
97
+ const metricNamespace: MetricNamespace = {
98
+ id,
99
+ ...namespace,
100
+ }
101
+
102
+ this.namespaces.set(id, metricNamespace)
103
+
104
+ return metricNamespace
105
+ }
106
+
107
+ /**
108
+ * Create custom metric
109
+ */
110
+ createMetric(metric: Omit<CustomMetric, 'id'>): CustomMetric {
111
+ const id = `metric-${Date.now()}-${this.metricCounter++}`
112
+
113
+ const customMetric: CustomMetric = {
114
+ id,
115
+ ...metric,
116
+ }
117
+
118
+ this.metrics.set(id, customMetric)
119
+
120
+ return customMetric
121
+ }
122
+
123
+ /**
124
+ * Create business metric (e.g., orders, signups, revenue)
125
+ */
126
+ createBusinessMetric(options: {
127
+ name: string
128
+ namespace: string
129
+ unit: MetricUnit
130
+ description?: string
131
+ }): CustomMetric {
132
+ return this.createMetric({
133
+ name: options.name,
134
+ namespace: options.namespace,
135
+ unit: options.unit,
136
+ dimensions: [
137
+ { name: 'Environment', value: 'production' },
138
+ { name: 'Type', value: 'Business' },
139
+ ],
140
+ })
141
+ }
142
+
143
+ /**
144
+ * Create application metric (e.g., cache hits, queue depth)
145
+ */
146
+ createApplicationMetric(options: {
147
+ name: string
148
+ namespace: string
149
+ unit: MetricUnit
150
+ serviceName: string
151
+ }): CustomMetric {
152
+ return this.createMetric({
153
+ name: options.name,
154
+ namespace: options.namespace,
155
+ unit: options.unit,
156
+ dimensions: [
157
+ { name: 'Service', value: options.serviceName },
158
+ { name: 'Type', value: 'Application' },
159
+ ],
160
+ })
161
+ }
162
+
163
+ /**
164
+ * Create performance metric
165
+ */
166
+ createPerformanceMetric(options: {
167
+ name: string
168
+ namespace: string
169
+ operation: string
170
+ }): CustomMetric {
171
+ return this.createMetric({
172
+ name: options.name,
173
+ namespace: options.namespace,
174
+ unit: 'Milliseconds',
175
+ dimensions: [
176
+ { name: 'Operation', value: options.operation },
177
+ { name: 'Type', value: 'Performance' },
178
+ ],
179
+ })
180
+ }
181
+
182
+ /**
183
+ * Create error metric
184
+ */
185
+ createErrorMetric(options: {
186
+ name: string
187
+ namespace: string
188
+ errorType: string
189
+ }): CustomMetric {
190
+ return this.createMetric({
191
+ name: options.name,
192
+ namespace: options.namespace,
193
+ unit: 'Count',
194
+ dimensions: [
195
+ { name: 'ErrorType', value: options.errorType },
196
+ { name: 'Type', value: 'Error' },
197
+ ],
198
+ })
199
+ }
200
+
201
+ /**
202
+ * Create metric alarm
203
+ */
204
+ createAlarm(metricId: string, alarm: Omit<MetricAlarm, 'id'>): MetricAlarm {
205
+ const metric = this.metrics.get(metricId)
206
+
207
+ if (!metric) {
208
+ throw new Error(`Metric not found: ${metricId}`)
209
+ }
210
+
211
+ const id = `alarm-${Date.now()}-${this.alarmCounter++}`
212
+
213
+ const metricAlarm: MetricAlarm = {
214
+ id,
215
+ ...alarm,
216
+ }
217
+
218
+ if (!metric.alarms) {
219
+ metric.alarms = []
220
+ }
221
+
222
+ metric.alarms.push(metricAlarm)
223
+
224
+ return metricAlarm
225
+ }
226
+
227
+ /**
228
+ * Create high error rate alarm
229
+ */
230
+ createErrorRateAlarm(options: {
231
+ metricId: string
232
+ name: string
233
+ threshold: number // errors per minute
234
+ snsTopicArn?: string
235
+ }): MetricAlarm {
236
+ return this.createAlarm(options.metricId, {
237
+ name: options.name,
238
+ description: `Alert when error rate exceeds ${options.threshold} errors/min`,
239
+ comparisonOperator: 'GreaterThanThreshold',
240
+ evaluationPeriods: 2,
241
+ threshold: options.threshold,
242
+ period: 60,
243
+ statistic: 'Sum',
244
+ treatMissingData: 'notBreaching',
245
+ actionsEnabled: true,
246
+ alarmActions: options.snsTopicArn ? [options.snsTopicArn] : undefined,
247
+ })
248
+ }
249
+
250
+ /**
251
+ * Create latency alarm
252
+ */
253
+ createLatencyAlarm(options: {
254
+ metricId: string
255
+ name: string
256
+ thresholdMs: number
257
+ snsTopicArn?: string
258
+ }): MetricAlarm {
259
+ return this.createAlarm(options.metricId, {
260
+ name: options.name,
261
+ description: `Alert when latency exceeds ${options.thresholdMs}ms`,
262
+ comparisonOperator: 'GreaterThanThreshold',
263
+ evaluationPeriods: 3,
264
+ threshold: options.thresholdMs,
265
+ period: 300,
266
+ statistic: 'Average',
267
+ treatMissingData: 'notBreaching',
268
+ actionsEnabled: true,
269
+ alarmActions: options.snsTopicArn ? [options.snsTopicArn] : undefined,
270
+ })
271
+ }
272
+
273
+ /**
274
+ * Create throughput alarm
275
+ */
276
+ createThroughputAlarm(options: {
277
+ metricId: string
278
+ name: string
279
+ minimumThreshold: number
280
+ snsTopicArn?: string
281
+ }): MetricAlarm {
282
+ return this.createAlarm(options.metricId, {
283
+ name: options.name,
284
+ description: `Alert when throughput drops below ${options.minimumThreshold}`,
285
+ comparisonOperator: 'LessThanThreshold',
286
+ evaluationPeriods: 2,
287
+ threshold: options.minimumThreshold,
288
+ period: 300,
289
+ statistic: 'Sum',
290
+ treatMissingData: 'breaching',
291
+ actionsEnabled: true,
292
+ alarmActions: options.snsTopicArn ? [options.snsTopicArn] : undefined,
293
+ })
294
+ }
295
+
296
+ /**
297
+ * Create composite alarm (multiple conditions)
298
+ */
299
+ createCompositeAlarm(options: {
300
+ name: string
301
+ description?: string
302
+ alarmRule: string
303
+ actionsEnabled?: boolean
304
+ alarmActions?: string[]
305
+ }): any {
306
+ return {
307
+ name: options.name,
308
+ description: options.description,
309
+ alarmRule: options.alarmRule,
310
+ actionsEnabled: options.actionsEnabled ?? true,
311
+ alarmActions: options.alarmActions,
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Get namespace
317
+ */
318
+ getNamespace(id: string): MetricNamespace | undefined {
319
+ return this.namespaces.get(id)
320
+ }
321
+
322
+ /**
323
+ * List namespaces
324
+ */
325
+ listNamespaces(): MetricNamespace[] {
326
+ return Array.from(this.namespaces.values())
327
+ }
328
+
329
+ /**
330
+ * Get metric
331
+ */
332
+ getMetric(id: string): CustomMetric | undefined {
333
+ return this.metrics.get(id)
334
+ }
335
+
336
+ /**
337
+ * List metrics
338
+ */
339
+ listMetrics(): CustomMetric[] {
340
+ return Array.from(this.metrics.values())
341
+ }
342
+
343
+ /**
344
+ * Generate CloudFormation for metric alarm
345
+ */
346
+ generateAlarmCF(metric: CustomMetric, alarm: MetricAlarm): any {
347
+ return {
348
+ Type: 'AWS::CloudWatch::Alarm',
349
+ Properties: {
350
+ AlarmName: alarm.name,
351
+ AlarmDescription: alarm.description,
352
+ ComparisonOperator: alarm.comparisonOperator,
353
+ EvaluationPeriods: alarm.evaluationPeriods,
354
+ MetricName: metric.name,
355
+ Namespace: metric.namespace,
356
+ Period: alarm.period,
357
+ Statistic: alarm.statistic,
358
+ Threshold: alarm.threshold,
359
+ TreatMissingData: alarm.treatMissingData || 'notBreaching',
360
+ ActionsEnabled: alarm.actionsEnabled ?? true,
361
+ ...(alarm.alarmActions && { AlarmActions: alarm.alarmActions }),
362
+ ...(alarm.okActions && { OKActions: alarm.okActions }),
363
+ ...(alarm.insufficientDataActions && {
364
+ InsufficientDataActions: alarm.insufficientDataActions,
365
+ }),
366
+ ...(metric.dimensions && {
367
+ Dimensions: metric.dimensions.map(d => ({
368
+ Name: d.name,
369
+ Value: d.value,
370
+ })),
371
+ }),
372
+ },
373
+ }
374
+ }
375
+
376
+ /**
377
+ * Generate CloudFormation for composite alarm
378
+ */
379
+ generateCompositeAlarmCF(alarm: any): any {
380
+ return {
381
+ Type: 'AWS::CloudWatch::CompositeAlarm',
382
+ Properties: {
383
+ AlarmName: alarm.name,
384
+ AlarmDescription: alarm.description,
385
+ AlarmRule: alarm.alarmRule,
386
+ ActionsEnabled: alarm.actionsEnabled,
387
+ ...(alarm.alarmActions && { AlarmActions: alarm.alarmActions }),
388
+ },
389
+ }
390
+ }
391
+
392
+ /**
393
+ * Generate dashboard widget for metric
394
+ */
395
+ generateDashboardWidget(metric: CustomMetric): any {
396
+ return {
397
+ type: 'metric',
398
+ properties: {
399
+ metrics: [
400
+ [
401
+ metric.namespace,
402
+ metric.name,
403
+ ...(metric.dimensions?.flatMap(d => [d.name, d.value]) || []),
404
+ ],
405
+ ],
406
+ period: 300,
407
+ stat: 'Average',
408
+ region: 'us-east-1',
409
+ title: metric.name,
410
+ },
411
+ }
412
+ }
413
+
414
+ /**
415
+ * Publish a custom metric value directly
416
+ */
417
+ publishCustomMetric(
418
+ namespace: string,
419
+ name: string,
420
+ value: number,
421
+ dimensions: Record<string, string> = {},
422
+ unit: string = 'Count'
423
+ ): {
424
+ id: string
425
+ namespace: string
426
+ name: string
427
+ dimensions: Record<string, string>
428
+ value: number
429
+ unit: string
430
+ timestamp: Date
431
+ } {
432
+ const id = `metric-${Date.now()}-${this.metricCounter++}`
433
+ const metric = {
434
+ id,
435
+ namespace,
436
+ name,
437
+ dimensions,
438
+ value,
439
+ unit,
440
+ timestamp: new Date(),
441
+ }
442
+ return metric
443
+ }
444
+
445
+ /**
446
+ * Clear all data
447
+ */
448
+ clear(): void {
449
+ this.namespaces.clear()
450
+ this.metrics.clear()
451
+ this.namespaceCounter = 0
452
+ this.metricCounter = 0
453
+ this.alarmCounter = 0
454
+ }
455
+ }
456
+
457
+ /**
458
+ * Global metrics manager instance
459
+ */
460
+ export const metricsManager: MetricsManager = new MetricsManager()