@stacksjs/ts-cloud 0.1.2 → 0.1.5
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.
- package/README.md +98 -13
- package/dist/aws/acm.d.ts +129 -0
- package/dist/aws/application-autoscaling.d.ts +282 -0
- package/dist/aws/bedrock.d.ts +2292 -0
- package/dist/aws/client.d.ts +79 -0
- package/dist/aws/cloudformation.d.ts +105 -0
- package/dist/aws/cloudfront.d.ts +265 -0
- package/dist/aws/cloudwatch-logs.d.ts +48 -0
- package/dist/aws/comprehend.d.ts +505 -0
- package/dist/aws/connect.d.ts +377 -0
- package/dist/aws/deploy-imap.d.ts +14 -0
- package/dist/aws/dynamodb.d.ts +176 -0
- package/dist/aws/ec2.d.ts +272 -0
- package/dist/aws/ecr.d.ts +149 -0
- package/dist/aws/ecs.d.ts +162 -0
- package/dist/aws/elasticache.d.ts +71 -0
- package/dist/aws/elbv2.d.ts +248 -0
- package/dist/aws/email.d.ts +175 -0
- package/dist/aws/eventbridge.d.ts +142 -0
- package/dist/aws/iam.d.ts +638 -0
- package/dist/aws/imap-server.d.ts +119 -0
- package/{src/aws/index.ts → dist/aws/index.d.ts} +62 -83
- package/{src/aws/kendra.ts → dist/aws/kendra.d.ts} +71 -386
- package/dist/aws/lambda.d.ts +232 -0
- package/dist/aws/opensearch.d.ts +87 -0
- package/dist/aws/personalize.d.ts +516 -0
- package/dist/aws/polly.d.ts +214 -0
- package/dist/aws/rds.d.ts +240 -0
- package/dist/aws/rekognition.d.ts +543 -0
- package/dist/aws/route53-domains.d.ts +113 -0
- package/dist/aws/route53.d.ts +215 -0
- package/dist/aws/s3.d.ts +212 -0
- package/dist/aws/scheduler.d.ts +140 -0
- package/dist/aws/secrets-manager.d.ts +170 -0
- package/dist/aws/ses.d.ts +288 -0
- package/dist/aws/setup-phone.d.ts +0 -0
- package/dist/aws/setup-sms.d.ts +115 -0
- package/dist/aws/sms.d.ts +304 -0
- package/dist/aws/smtp-server.d.ts +61 -0
- package/dist/aws/sns.d.ts +117 -0
- package/dist/aws/sqs.d.ts +65 -0
- package/dist/aws/ssm.d.ts +179 -0
- package/dist/aws/sts.d.ts +15 -0
- package/dist/aws/support.d.ts +104 -0
- package/dist/aws/test-imap.d.ts +0 -0
- package/dist/aws/textract.d.ts +403 -0
- package/dist/aws/transcribe.d.ts +60 -0
- package/dist/aws/translate.d.ts +358 -0
- package/dist/aws/voice.d.ts +219 -0
- package/dist/bin/cli.js +1724 -0
- package/dist/config.d.ts +7 -0
- package/dist/deploy/index.d.ts +2 -0
- package/dist/deploy/static-site-external-dns.d.ts +51 -0
- package/dist/deploy/static-site.d.ts +71 -0
- package/dist/dns/cloudflare.d.ts +52 -0
- package/dist/dns/godaddy.d.ts +38 -0
- package/dist/dns/index.d.ts +45 -0
- package/dist/dns/porkbun.d.ts +18 -0
- package/dist/dns/route53-adapter.d.ts +38 -0
- package/{src/dns/types.ts → dist/dns/types.d.ts} +26 -63
- package/dist/dns/validator.d.ts +78 -0
- package/dist/generators/index.d.ts +1 -0
- package/dist/generators/infrastructure.d.ts +30 -0
- package/{src/index.ts → dist/index.d.ts} +70 -93
- package/dist/index.js +7881 -0
- package/dist/push/apns.d.ts +60 -0
- package/dist/push/fcm.d.ts +117 -0
- package/dist/push/index.d.ts +14 -0
- package/dist/security/pre-deploy-scanner.d.ts +69 -0
- package/dist/ssl/acme-client.d.ts +67 -0
- package/dist/ssl/index.d.ts +2 -0
- package/dist/ssl/letsencrypt.d.ts +48 -0
- package/dist/types.d.ts +1 -0
- package/dist/utils/cli.d.ts +123 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/template.d.ts +23 -0
- package/package.json +8 -8
- package/bin/cli.ts +0 -133
- package/bin/commands/analytics.ts +0 -328
- package/bin/commands/api.ts +0 -379
- package/bin/commands/assets.ts +0 -221
- package/bin/commands/audit.ts +0 -501
- package/bin/commands/backup.ts +0 -682
- package/bin/commands/cache.ts +0 -294
- package/bin/commands/cdn.ts +0 -281
- package/bin/commands/config.ts +0 -202
- package/bin/commands/container.ts +0 -105
- package/bin/commands/cost.ts +0 -208
- package/bin/commands/database.ts +0 -401
- package/bin/commands/deploy.ts +0 -674
- package/bin/commands/domain.ts +0 -397
- package/bin/commands/email.ts +0 -423
- package/bin/commands/environment.ts +0 -285
- package/bin/commands/events.ts +0 -424
- package/bin/commands/firewall.ts +0 -145
- package/bin/commands/function.ts +0 -116
- package/bin/commands/generate.ts +0 -280
- package/bin/commands/git.ts +0 -139
- package/bin/commands/iam.ts +0 -464
- package/bin/commands/index.ts +0 -48
- package/bin/commands/init.ts +0 -120
- package/bin/commands/logs.ts +0 -148
- package/bin/commands/network.ts +0 -579
- package/bin/commands/notify.ts +0 -489
- package/bin/commands/queue.ts +0 -407
- package/bin/commands/scheduler.ts +0 -370
- package/bin/commands/secrets.ts +0 -54
- package/bin/commands/server.ts +0 -629
- package/bin/commands/shared.ts +0 -97
- package/bin/commands/ssl.ts +0 -138
- package/bin/commands/stack.ts +0 -325
- package/bin/commands/status.ts +0 -385
- package/bin/commands/storage.ts +0 -450
- package/bin/commands/team.ts +0 -96
- package/bin/commands/tunnel.ts +0 -489
- package/bin/commands/utils.ts +0 -202
- package/build.ts +0 -15
- package/cloud +0 -2
- package/src/aws/acm.ts +0 -768
- package/src/aws/application-autoscaling.ts +0 -845
- package/src/aws/bedrock.ts +0 -4074
- package/src/aws/client.ts +0 -878
- package/src/aws/cloudformation.ts +0 -896
- package/src/aws/cloudfront.ts +0 -1531
- package/src/aws/cloudwatch-logs.ts +0 -154
- package/src/aws/comprehend.ts +0 -839
- package/src/aws/connect.ts +0 -1056
- package/src/aws/deploy-imap.ts +0 -384
- package/src/aws/dynamodb.ts +0 -340
- package/src/aws/ec2.ts +0 -1385
- package/src/aws/ecr.ts +0 -621
- package/src/aws/ecs.ts +0 -615
- package/src/aws/elasticache.ts +0 -301
- package/src/aws/elbv2.ts +0 -942
- package/src/aws/email.ts +0 -928
- package/src/aws/eventbridge.ts +0 -248
- package/src/aws/iam.ts +0 -1689
- package/src/aws/imap-server.ts +0 -2100
- package/src/aws/lambda.ts +0 -786
- package/src/aws/opensearch.ts +0 -158
- package/src/aws/personalize.ts +0 -977
- package/src/aws/polly.ts +0 -559
- package/src/aws/rds.ts +0 -888
- package/src/aws/rekognition.ts +0 -846
- package/src/aws/route53-domains.ts +0 -359
- package/src/aws/route53.ts +0 -1046
- package/src/aws/s3.ts +0 -2318
- package/src/aws/scheduler.ts +0 -571
- package/src/aws/secrets-manager.ts +0 -769
- package/src/aws/ses.ts +0 -1081
- package/src/aws/setup-phone.ts +0 -104
- package/src/aws/setup-sms.ts +0 -580
- package/src/aws/sms.ts +0 -1735
- package/src/aws/smtp-server.ts +0 -531
- package/src/aws/sns.ts +0 -758
- package/src/aws/sqs.ts +0 -382
- package/src/aws/ssm.ts +0 -807
- package/src/aws/sts.ts +0 -92
- package/src/aws/support.ts +0 -391
- package/src/aws/test-imap.ts +0 -86
- package/src/aws/textract.ts +0 -780
- package/src/aws/transcribe.ts +0 -108
- package/src/aws/translate.ts +0 -641
- package/src/aws/voice.ts +0 -1379
- package/src/config.ts +0 -35
- package/src/deploy/index.ts +0 -7
- package/src/deploy/static-site-external-dns.ts +0 -906
- package/src/deploy/static-site.ts +0 -1125
- package/src/dns/godaddy.ts +0 -412
- package/src/dns/index.ts +0 -183
- package/src/dns/porkbun.ts +0 -362
- package/src/dns/route53-adapter.ts +0 -414
- package/src/dns/validator.ts +0 -369
- package/src/generators/index.ts +0 -5
- package/src/generators/infrastructure.ts +0 -1660
- package/src/push/apns.ts +0 -452
- package/src/push/fcm.ts +0 -506
- package/src/push/index.ts +0 -58
- package/src/ssl/acme-client.ts +0 -478
- package/src/ssl/index.ts +0 -7
- package/src/ssl/letsencrypt.ts +0 -747
- package/src/types.ts +0 -2
- package/src/utils/cli.ts +0 -398
- package/src/validation/index.ts +0 -5
- package/src/validation/template.ts +0 -405
- package/test/index.test.ts +0 -128
- package/tsconfig.json +0 -18
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Route53 DNS Provider Adapter
|
|
3
|
-
* Wraps the existing Route53Client to implement the DnsProvider interface
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Route53Client } from '../aws/route53'
|
|
7
|
-
import type {
|
|
8
|
-
CreateRecordResult,
|
|
9
|
-
DeleteRecordResult,
|
|
10
|
-
DnsProvider,
|
|
11
|
-
DnsRecord,
|
|
12
|
-
DnsRecordResult,
|
|
13
|
-
DnsRecordType,
|
|
14
|
-
ListRecordsResult,
|
|
15
|
-
} from './types'
|
|
16
|
-
|
|
17
|
-
export class Route53Provider implements DnsProvider {
|
|
18
|
-
readonly name = 'route53'
|
|
19
|
-
private client: Route53Client
|
|
20
|
-
private hostedZoneCache: Map<string, string> = new Map()
|
|
21
|
-
private providedHostedZoneId?: string
|
|
22
|
-
|
|
23
|
-
constructor(region: string = 'us-east-1', hostedZoneId?: string) {
|
|
24
|
-
this.client = new Route53Client(region)
|
|
25
|
-
this.providedHostedZoneId = hostedZoneId
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Get the root domain from a full domain name
|
|
30
|
-
*/
|
|
31
|
-
private getRootDomain(domain: string): string {
|
|
32
|
-
const parts = domain.replace(/\.$/, '').split('.')
|
|
33
|
-
if (parts.length >= 2) {
|
|
34
|
-
return parts.slice(-2).join('.')
|
|
35
|
-
}
|
|
36
|
-
return domain
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Get the hosted zone ID for a domain
|
|
41
|
-
*/
|
|
42
|
-
private async getHostedZoneId(domain: string): Promise<string | null> {
|
|
43
|
-
// If a hosted zone ID was provided, use it
|
|
44
|
-
if (this.providedHostedZoneId) {
|
|
45
|
-
return this.providedHostedZoneId
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const rootDomain = this.getRootDomain(domain)
|
|
49
|
-
|
|
50
|
-
// Check cache
|
|
51
|
-
const cached = this.hostedZoneCache.get(rootDomain)
|
|
52
|
-
if (cached) {
|
|
53
|
-
return cached
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Find the hosted zone
|
|
57
|
-
const zone = await this.client.findHostedZoneForDomain(domain)
|
|
58
|
-
if (zone) {
|
|
59
|
-
const zoneId = zone.Id.replace('/hostedzone/', '')
|
|
60
|
-
this.hostedZoneCache.set(rootDomain, zoneId)
|
|
61
|
-
return zoneId
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return null
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Ensure domain name ends with a dot (Route53 requirement)
|
|
69
|
-
*/
|
|
70
|
-
private normalizeName(name: string): string {
|
|
71
|
-
return name.endsWith('.') ? name : `${name}.`
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async createRecord(domain: string, record: DnsRecord): Promise<CreateRecordResult> {
|
|
75
|
-
try {
|
|
76
|
-
const hostedZoneId = await this.getHostedZoneId(domain)
|
|
77
|
-
if (!hostedZoneId) {
|
|
78
|
-
return {
|
|
79
|
-
success: false,
|
|
80
|
-
message: `No hosted zone found for domain: ${domain}`,
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const recordName = this.normalizeName(record.name)
|
|
85
|
-
let recordValue = record.content
|
|
86
|
-
|
|
87
|
-
// TXT records need to be quoted
|
|
88
|
-
if (record.type === 'TXT' && !recordValue.startsWith('"')) {
|
|
89
|
-
recordValue = `"${recordValue}"`
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// MX records need priority prefix
|
|
93
|
-
if (record.type === 'MX' && record.priority !== undefined) {
|
|
94
|
-
recordValue = `${record.priority} ${recordValue}`
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const result = await this.client.changeResourceRecordSets({
|
|
98
|
-
HostedZoneId: hostedZoneId,
|
|
99
|
-
ChangeBatch: {
|
|
100
|
-
Comment: `Created by ts-cloud DNS provider`,
|
|
101
|
-
Changes: [{
|
|
102
|
-
Action: 'CREATE',
|
|
103
|
-
ResourceRecordSet: {
|
|
104
|
-
Name: recordName,
|
|
105
|
-
Type: record.type,
|
|
106
|
-
TTL: record.ttl || 300,
|
|
107
|
-
ResourceRecords: [{ Value: recordValue }],
|
|
108
|
-
},
|
|
109
|
-
}],
|
|
110
|
-
},
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
success: true,
|
|
115
|
-
id: result.ChangeInfo?.Id,
|
|
116
|
-
message: 'Record created successfully',
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
return {
|
|
121
|
-
success: false,
|
|
122
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async upsertRecord(domain: string, record: DnsRecord): Promise<CreateRecordResult> {
|
|
128
|
-
try {
|
|
129
|
-
const hostedZoneId = await this.getHostedZoneId(domain)
|
|
130
|
-
if (!hostedZoneId) {
|
|
131
|
-
return {
|
|
132
|
-
success: false,
|
|
133
|
-
message: `No hosted zone found for domain: ${domain}`,
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const recordName = this.normalizeName(record.name)
|
|
138
|
-
let recordValue = record.content
|
|
139
|
-
|
|
140
|
-
// TXT records need to be quoted
|
|
141
|
-
if (record.type === 'TXT' && !recordValue.startsWith('"')) {
|
|
142
|
-
recordValue = `"${recordValue}"`
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// MX records need priority prefix
|
|
146
|
-
if (record.type === 'MX' && record.priority !== undefined) {
|
|
147
|
-
recordValue = `${record.priority} ${recordValue}`
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const result = await this.client.changeResourceRecordSets({
|
|
151
|
-
HostedZoneId: hostedZoneId,
|
|
152
|
-
ChangeBatch: {
|
|
153
|
-
Comment: `Upserted by ts-cloud DNS provider`,
|
|
154
|
-
Changes: [{
|
|
155
|
-
Action: 'UPSERT',
|
|
156
|
-
ResourceRecordSet: {
|
|
157
|
-
Name: recordName,
|
|
158
|
-
Type: record.type,
|
|
159
|
-
TTL: record.ttl || 300,
|
|
160
|
-
ResourceRecords: [{ Value: recordValue }],
|
|
161
|
-
},
|
|
162
|
-
}],
|
|
163
|
-
},
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
return {
|
|
167
|
-
success: true,
|
|
168
|
-
id: result.ChangeInfo?.Id,
|
|
169
|
-
message: 'Record upserted successfully',
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
173
|
-
return {
|
|
174
|
-
success: false,
|
|
175
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
async deleteRecord(domain: string, record: DnsRecord): Promise<DeleteRecordResult> {
|
|
181
|
-
try {
|
|
182
|
-
const hostedZoneId = await this.getHostedZoneId(domain)
|
|
183
|
-
if (!hostedZoneId) {
|
|
184
|
-
return {
|
|
185
|
-
success: false,
|
|
186
|
-
message: `No hosted zone found for domain: ${domain}`,
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const recordName = this.normalizeName(record.name)
|
|
191
|
-
let recordValue = record.content
|
|
192
|
-
|
|
193
|
-
// TXT records need to be quoted
|
|
194
|
-
if (record.type === 'TXT' && !recordValue.startsWith('"')) {
|
|
195
|
-
recordValue = `"${recordValue}"`
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// MX records need priority prefix
|
|
199
|
-
if (record.type === 'MX' && record.priority !== undefined) {
|
|
200
|
-
recordValue = `${record.priority} ${recordValue}`
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
await this.client.changeResourceRecordSets({
|
|
204
|
-
HostedZoneId: hostedZoneId,
|
|
205
|
-
ChangeBatch: {
|
|
206
|
-
Comment: `Deleted by ts-cloud DNS provider`,
|
|
207
|
-
Changes: [{
|
|
208
|
-
Action: 'DELETE',
|
|
209
|
-
ResourceRecordSet: {
|
|
210
|
-
Name: recordName,
|
|
211
|
-
Type: record.type,
|
|
212
|
-
TTL: record.ttl || 300,
|
|
213
|
-
ResourceRecords: [{ Value: recordValue }],
|
|
214
|
-
},
|
|
215
|
-
}],
|
|
216
|
-
},
|
|
217
|
-
})
|
|
218
|
-
|
|
219
|
-
return {
|
|
220
|
-
success: true,
|
|
221
|
-
message: 'Record deleted successfully',
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
catch (error) {
|
|
225
|
-
return {
|
|
226
|
-
success: false,
|
|
227
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
async listRecords(domain: string, type?: DnsRecordType): Promise<ListRecordsResult> {
|
|
233
|
-
try {
|
|
234
|
-
const hostedZoneId = await this.getHostedZoneId(domain)
|
|
235
|
-
if (!hostedZoneId) {
|
|
236
|
-
return {
|
|
237
|
-
success: false,
|
|
238
|
-
records: [],
|
|
239
|
-
message: `No hosted zone found for domain: ${domain}`,
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const result = await this.client.listResourceRecordSets({
|
|
244
|
-
HostedZoneId: hostedZoneId,
|
|
245
|
-
StartRecordType: type,
|
|
246
|
-
})
|
|
247
|
-
|
|
248
|
-
const records: DnsRecordResult[] = []
|
|
249
|
-
|
|
250
|
-
for (const rs of result.ResourceRecordSets) {
|
|
251
|
-
// Filter by type if specified
|
|
252
|
-
if (type && rs.Type !== type) {
|
|
253
|
-
continue
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Skip alias records for now (they don't have ResourceRecords)
|
|
257
|
-
if (rs.AliasTarget) {
|
|
258
|
-
continue
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
for (const rr of rs.ResourceRecords || []) {
|
|
262
|
-
let content = rr.Value
|
|
263
|
-
let priority: number | undefined
|
|
264
|
-
|
|
265
|
-
// Extract MX priority
|
|
266
|
-
if (rs.Type === 'MX') {
|
|
267
|
-
const parts = content.split(' ')
|
|
268
|
-
if (parts.length >= 2) {
|
|
269
|
-
priority = Number.parseInt(parts[0], 10)
|
|
270
|
-
content = parts.slice(1).join(' ')
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Remove TXT record quotes
|
|
275
|
-
if (rs.Type === 'TXT' && content.startsWith('"') && content.endsWith('"')) {
|
|
276
|
-
content = content.slice(1, -1)
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
records.push({
|
|
280
|
-
name: rs.Name.replace(/\.$/, ''),
|
|
281
|
-
type: rs.Type as DnsRecordType,
|
|
282
|
-
content,
|
|
283
|
-
ttl: rs.TTL,
|
|
284
|
-
priority,
|
|
285
|
-
})
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return {
|
|
290
|
-
success: true,
|
|
291
|
-
records,
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
catch (error) {
|
|
295
|
-
return {
|
|
296
|
-
success: false,
|
|
297
|
-
records: [],
|
|
298
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
async canManageDomain(domain: string): Promise<boolean> {
|
|
304
|
-
const hostedZoneId = await this.getHostedZoneId(domain)
|
|
305
|
-
return hostedZoneId !== null
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* List all domains (hosted zones) managed in Route53
|
|
310
|
-
*/
|
|
311
|
-
async listDomains(): Promise<string[]> {
|
|
312
|
-
try {
|
|
313
|
-
const result = await this.client.listHostedZones()
|
|
314
|
-
return result.HostedZones.map(z => z.Name.replace(/\.$/, ''))
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
return []
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Get the underlying Route53Client for advanced operations
|
|
323
|
-
*/
|
|
324
|
-
getRoute53Client(): Route53Client {
|
|
325
|
-
return this.client
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Create an alias record (Route53-specific feature)
|
|
330
|
-
* Useful for CloudFront, ALB, etc.
|
|
331
|
-
*/
|
|
332
|
-
async createAliasRecord(params: {
|
|
333
|
-
domain: string
|
|
334
|
-
name: string
|
|
335
|
-
targetHostedZoneId: string
|
|
336
|
-
targetDnsName: string
|
|
337
|
-
evaluateTargetHealth?: boolean
|
|
338
|
-
type?: 'A' | 'AAAA'
|
|
339
|
-
}): Promise<CreateRecordResult> {
|
|
340
|
-
try {
|
|
341
|
-
const hostedZoneId = await this.getHostedZoneId(params.domain)
|
|
342
|
-
if (!hostedZoneId) {
|
|
343
|
-
return {
|
|
344
|
-
success: false,
|
|
345
|
-
message: `No hosted zone found for domain: ${params.domain}`,
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
const result = await this.client.createAliasRecord({
|
|
350
|
-
HostedZoneId: hostedZoneId,
|
|
351
|
-
Name: this.normalizeName(params.name),
|
|
352
|
-
TargetHostedZoneId: params.targetHostedZoneId,
|
|
353
|
-
TargetDNSName: params.targetDnsName,
|
|
354
|
-
EvaluateTargetHealth: params.evaluateTargetHealth,
|
|
355
|
-
Type: params.type,
|
|
356
|
-
})
|
|
357
|
-
|
|
358
|
-
return {
|
|
359
|
-
success: true,
|
|
360
|
-
id: result.ChangeInfo?.Id,
|
|
361
|
-
message: 'Alias record created successfully',
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
catch (error) {
|
|
365
|
-
return {
|
|
366
|
-
success: false,
|
|
367
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Create CloudFront alias record (convenience method)
|
|
374
|
-
*/
|
|
375
|
-
async createCloudFrontAlias(params: {
|
|
376
|
-
domain: string
|
|
377
|
-
name: string
|
|
378
|
-
cloudFrontDomainName: string
|
|
379
|
-
}): Promise<CreateRecordResult> {
|
|
380
|
-
return this.createAliasRecord({
|
|
381
|
-
domain: params.domain,
|
|
382
|
-
name: params.name,
|
|
383
|
-
targetHostedZoneId: Route53Client.CloudFrontHostedZoneId,
|
|
384
|
-
targetDnsName: params.cloudFrontDomainName,
|
|
385
|
-
evaluateTargetHealth: false,
|
|
386
|
-
})
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Create ALB alias record (convenience method)
|
|
391
|
-
*/
|
|
392
|
-
async createAlbAlias(params: {
|
|
393
|
-
domain: string
|
|
394
|
-
name: string
|
|
395
|
-
albDnsName: string
|
|
396
|
-
region: string
|
|
397
|
-
}): Promise<CreateRecordResult> {
|
|
398
|
-
const hostedZoneId = Route53Client.ALBHostedZoneIds[params.region]
|
|
399
|
-
if (!hostedZoneId) {
|
|
400
|
-
return {
|
|
401
|
-
success: false,
|
|
402
|
-
message: `Unknown region for ALB: ${params.region}`,
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
return this.createAliasRecord({
|
|
407
|
-
domain: params.domain,
|
|
408
|
-
name: params.name,
|
|
409
|
-
targetHostedZoneId: hostedZoneId,
|
|
410
|
-
targetDnsName: params.albDnsName,
|
|
411
|
-
evaluateTargetHealth: true,
|
|
412
|
-
})
|
|
413
|
-
}
|
|
414
|
-
}
|