@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,337 @@
1
+ import type { Route53HostedZone, Route53RecordSet } from '@stacksjs/ts-cloud-aws-types'
2
+ import { Fn } from '../intrinsic-functions'
3
+ import { generateLogicalId, generateResourceName } from '../resource-naming'
4
+ import type { EnvironmentType } from '@stacksjs/ts-cloud-types'
5
+
6
+ export interface HostedZoneOptions {
7
+ domain: string
8
+ slug: string
9
+ environment: EnvironmentType
10
+ comment?: string
11
+ }
12
+
13
+ export interface RecordOptions {
14
+ hostedZoneId?: string
15
+ hostedZoneName?: string
16
+ name: string
17
+ type: 'A' | 'AAAA' | 'CNAME' | 'MX' | 'NS' | 'PTR' | 'SOA' | 'SPF' | 'SRV' | 'TXT'
18
+ ttl?: number
19
+ values?: string[]
20
+ aliasTarget?: AliasTarget
21
+ }
22
+
23
+ export interface AliasTarget {
24
+ dnsName: string
25
+ hostedZoneId: string
26
+ evaluateTargetHealth?: boolean
27
+ }
28
+
29
+ /**
30
+ * DNS Module - Route53 Management
31
+ * Provides clean API for creating and configuring Route53 resources
32
+ */
33
+ export class DNS {
34
+ /**
35
+ * Create a Route53 hosted zone
36
+ */
37
+ static createHostedZone(options: HostedZoneOptions): { zone: Route53HostedZone, logicalId: string } {
38
+ const { domain, slug, environment, comment } = options
39
+
40
+ const resourceName = generateResourceName({
41
+ slug,
42
+ environment,
43
+ resourceType: 'hostedzone',
44
+ })
45
+
46
+ const logicalId = generateLogicalId(`${resourceName}-${domain.replace(/\./g, '')}`)
47
+
48
+ const zone: Route53HostedZone = {
49
+ Type: 'AWS::Route53::HostedZone',
50
+ Properties: {
51
+ Name: domain,
52
+ HostedZoneConfig: {
53
+ Comment: comment || `Hosted zone for ${domain}`,
54
+ },
55
+ },
56
+ }
57
+
58
+ return { zone, logicalId }
59
+ }
60
+
61
+ /**
62
+ * Create a DNS record
63
+ */
64
+ static createRecord(options: RecordOptions): { record: Route53RecordSet, logicalId: string } {
65
+ const { hostedZoneId, hostedZoneName, name, type, ttl, values, aliasTarget } = options
66
+
67
+ const logicalId = generateLogicalId(`record-${name.replace(/\./g, '')}-${type}`)
68
+
69
+ const record: Route53RecordSet = {
70
+ Type: 'AWS::Route53::RecordSet',
71
+ Properties: {
72
+ Name: name,
73
+ Type: type,
74
+ },
75
+ }
76
+
77
+ // Set hosted zone reference
78
+ if (hostedZoneId) {
79
+ record.Properties.HostedZoneId = hostedZoneId
80
+ }
81
+ else if (hostedZoneName) {
82
+ record.Properties.HostedZoneName = hostedZoneName
83
+ }
84
+
85
+ // Configure record based on type
86
+ if (aliasTarget) {
87
+ // Alias record (no TTL, points to AWS resource)
88
+ record.Properties.AliasTarget = {
89
+ DNSName: aliasTarget.dnsName,
90
+ HostedZoneId: aliasTarget.hostedZoneId,
91
+ EvaluateTargetHealth: aliasTarget.evaluateTargetHealth ?? false,
92
+ }
93
+ }
94
+ else {
95
+ // Standard record (requires TTL and values)
96
+ record.Properties.TTL = ttl || 300
97
+ record.Properties.ResourceRecords = values || []
98
+ }
99
+
100
+ return { record, logicalId }
101
+ }
102
+
103
+ /**
104
+ * Create an A record that points to a CloudFront distribution
105
+ */
106
+ static createCloudFrontAlias(
107
+ domain: string,
108
+ distributionDomainName: string,
109
+ hostedZoneId: string,
110
+ ): { record: Route53RecordSet, logicalId: string } {
111
+ return DNS.createRecord({
112
+ hostedZoneId,
113
+ name: domain,
114
+ type: 'A',
115
+ aliasTarget: {
116
+ dnsName: distributionDomainName,
117
+ hostedZoneId: 'Z2FDTNDATAQYW2', // CloudFront hosted zone ID (constant)
118
+ evaluateTargetHealth: false,
119
+ },
120
+ })
121
+ }
122
+
123
+ /**
124
+ * Create an A record that points to an Application Load Balancer
125
+ */
126
+ static createAlbAlias(
127
+ domain: string,
128
+ albDomainName: string,
129
+ albHostedZoneId: string,
130
+ hostedZoneId: string,
131
+ ): { record: Route53RecordSet, logicalId: string } {
132
+ return DNS.createRecord({
133
+ hostedZoneId,
134
+ name: domain,
135
+ type: 'A',
136
+ aliasTarget: {
137
+ dnsName: albDomainName,
138
+ hostedZoneId: albHostedZoneId,
139
+ evaluateTargetHealth: true,
140
+ },
141
+ })
142
+ }
143
+
144
+ /**
145
+ * Create a CNAME record
146
+ */
147
+ static createCname(
148
+ name: string,
149
+ target: string,
150
+ hostedZoneId: string,
151
+ ttl = 300,
152
+ ): { record: Route53RecordSet, logicalId: string } {
153
+ return DNS.createRecord({
154
+ hostedZoneId,
155
+ name,
156
+ type: 'CNAME',
157
+ ttl,
158
+ values: [target],
159
+ })
160
+ }
161
+
162
+ /**
163
+ * Create www → non-www redirect using S3 and Route53
164
+ */
165
+ static createWwwRedirect(
166
+ domain: string,
167
+ hostedZoneId: string,
168
+ ): { record: Route53RecordSet, logicalId: string } {
169
+ return DNS.createRecord({
170
+ hostedZoneId,
171
+ name: `www.${domain}`,
172
+ type: 'CNAME',
173
+ ttl: 300,
174
+ values: [domain],
175
+ })
176
+ }
177
+
178
+ /**
179
+ * Create MX records for email
180
+ */
181
+ static createMxRecords(
182
+ domain: string,
183
+ mailServers: Array<{ priority: number, server: string }>,
184
+ hostedZoneId: string,
185
+ ttl = 300,
186
+ ): { record: Route53RecordSet, logicalId: string } {
187
+ return DNS.createRecord({
188
+ hostedZoneId,
189
+ name: domain,
190
+ type: 'MX',
191
+ ttl,
192
+ values: mailServers.map(mx => `${mx.priority} ${mx.server}`),
193
+ })
194
+ }
195
+
196
+ /**
197
+ * Create TXT record (useful for domain verification, SPF, DKIM, etc.)
198
+ */
199
+ static createTxtRecord(
200
+ name: string,
201
+ value: string,
202
+ hostedZoneId: string,
203
+ ttl = 300,
204
+ ): { record: Route53RecordSet, logicalId: string } {
205
+ return DNS.createRecord({
206
+ hostedZoneId,
207
+ name,
208
+ type: 'TXT',
209
+ ttl,
210
+ values: [`"${value}"`], // TXT values must be quoted
211
+ })
212
+ }
213
+
214
+ /**
215
+ * Create SPF record for email sending
216
+ */
217
+ static createSpfRecord(
218
+ domain: string,
219
+ spfValue: string,
220
+ hostedZoneId: string,
221
+ ): { record: Route53RecordSet, logicalId: string } {
222
+ return DNS.createTxtRecord(domain, spfValue, hostedZoneId)
223
+ }
224
+
225
+ /**
226
+ * Create DMARC record for email authentication
227
+ */
228
+ static createDmarcRecord(
229
+ domain: string,
230
+ policy: 'none' | 'quarantine' | 'reject',
231
+ email: string,
232
+ hostedZoneId: string,
233
+ ): { record: Route53RecordSet, logicalId: string } {
234
+ const dmarcValue = `v=DMARC1; p=${policy}; rua=mailto:${email}`
235
+ return DNS.createTxtRecord(`_dmarc.${domain}`, dmarcValue, hostedZoneId)
236
+ }
237
+
238
+ /**
239
+ * Create an A record pointing to an S3 website redirect bucket
240
+ * Used for www to non-www redirect (or vice versa)
241
+ */
242
+ static createS3WebsiteAlias(
243
+ domain: string,
244
+ s3WebsiteEndpoint: string,
245
+ s3HostedZoneId: string,
246
+ hostedZoneId: string,
247
+ ): { record: Route53RecordSet, logicalId: string } {
248
+ return DNS.createRecord({
249
+ hostedZoneId,
250
+ name: domain,
251
+ type: 'A',
252
+ aliasTarget: {
253
+ dnsName: s3WebsiteEndpoint,
254
+ hostedZoneId: s3HostedZoneId,
255
+ evaluateTargetHealth: false,
256
+ },
257
+ })
258
+ }
259
+
260
+ /**
261
+ * S3 Website Hosted Zone IDs by region
262
+ * These are required for alias records pointing to S3 website endpoints
263
+ */
264
+ static readonly S3WebsiteHostedZoneIds: Record<string, string> = {
265
+ 'us-east-1': 'Z3AQBSTGFYJSTF',
266
+ 'us-east-2': 'Z2O1EMRO9K5GLX',
267
+ 'us-west-1': 'Z2F56UZL2M1ACD',
268
+ 'us-west-2': 'Z3BJ6K6RIION7M',
269
+ 'af-south-1': 'Z83WF9RJE8B12',
270
+ 'ap-east-1': 'ZNB98KWMFR0R6',
271
+ 'ap-south-1': 'Z11RGJOFQNVJUP',
272
+ 'ap-south-2': 'Z02976202B4EZMXIPMXF7',
273
+ 'ap-northeast-1': 'Z2M4EHUR26P7ZW',
274
+ 'ap-northeast-2': 'Z3W03O7B5YMIYP',
275
+ 'ap-northeast-3': 'Z2YQB5RD63NC85',
276
+ 'ap-southeast-1': 'Z3O0J2DXBE1FTB',
277
+ 'ap-southeast-2': 'Z1WCIBER6CPFUU',
278
+ 'ap-southeast-3': 'Z01613992JD795ZI93075',
279
+ 'ca-central-1': 'Z1QDHH18159H29',
280
+ 'eu-central-1': 'Z21DNDUVLTQW6Q',
281
+ 'eu-central-2': 'Z030506016YDQGETNASS',
282
+ 'eu-west-1': 'Z1BKCTXD74EZPE',
283
+ 'eu-west-2': 'Z3GKZC51ZF0DB4',
284
+ 'eu-west-3': 'Z3R1K369G5AVDG',
285
+ 'eu-north-1': 'Z3BAZG2TWCNX0D',
286
+ 'eu-south-1': 'Z30OZKI7KPW7MI',
287
+ 'eu-south-2': 'Z0081959F7139GRJC19J',
288
+ 'me-south-1': 'Z1MPMWCPA7YB62',
289
+ 'me-central-1': 'Z06143092I8HRBER9VXCO',
290
+ 'sa-east-1': 'Z7KQH4QJS55SO',
291
+ }
292
+
293
+ /**
294
+ * Get S3 website endpoint for a bucket in a specific region
295
+ */
296
+ static getS3WebsiteEndpoint(bucketName: string, region: string): string {
297
+ return `${bucketName}.s3-website-${region}.amazonaws.com`
298
+ }
299
+
300
+ /**
301
+ * Create a store subdomain record (e.g., for Lemon Squeezy integration)
302
+ */
303
+ static createStoreRecord(
304
+ domain: string,
305
+ storeUrl: string,
306
+ hostedZoneId: string,
307
+ ): { record: Route53RecordSet, logicalId: string } {
308
+ return DNS.createCname(`store.${domain}`, storeUrl, hostedZoneId)
309
+ }
310
+
311
+ /**
312
+ * Create API subdomain record
313
+ */
314
+ static createApiRecord(
315
+ domain: string,
316
+ apiUrl: string,
317
+ hostedZoneId: string,
318
+ ): { record: Route53RecordSet, logicalId: string } {
319
+ return DNS.createCname(`api.${domain}`, apiUrl, hostedZoneId)
320
+ }
321
+
322
+ /**
323
+ * Create docs subdomain record
324
+ */
325
+ static createDocsRecord(
326
+ domain: string,
327
+ docsUrl: string,
328
+ hostedZoneId: string,
329
+ ): { record: Route53RecordSet, logicalId: string } {
330
+ return DNS.createCname(`docs.${domain}`, docsUrl, hostedZoneId)
331
+ }
332
+
333
+ /**
334
+ * CloudFront Hosted Zone ID (constant for all CloudFront distributions)
335
+ */
336
+ static readonly CloudFrontHostedZoneId = 'Z2FDTNDATAQYW2'
337
+ }