@stacksjs/ts-cloud 0.1.8 → 0.1.9
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/dist/bin/cli.js +1 -1
- package/package.json +18 -16
- package/src/aws/acm.ts +768 -0
- package/src/aws/application-autoscaling.ts +845 -0
- package/src/aws/bedrock.ts +4074 -0
- package/src/aws/client.ts +891 -0
- package/src/aws/cloudformation.ts +896 -0
- package/src/aws/cloudfront.ts +1531 -0
- package/src/aws/cloudwatch-logs.ts +154 -0
- package/src/aws/comprehend.ts +839 -0
- package/src/aws/connect.ts +1056 -0
- package/src/aws/deploy-imap.ts +384 -0
- package/src/aws/dynamodb.ts +340 -0
- package/src/aws/ec2.ts +1385 -0
- package/src/aws/ecr.ts +621 -0
- package/src/aws/ecs.ts +615 -0
- package/src/aws/elasticache.ts +301 -0
- package/src/aws/elbv2.ts +942 -0
- package/src/aws/email.ts +928 -0
- package/src/aws/eventbridge.ts +248 -0
- package/src/aws/iam.ts +1689 -0
- package/src/aws/imap-server.ts +2100 -0
- package/src/aws/index.ts +213 -0
- package/src/aws/kendra.ts +1097 -0
- package/src/aws/lambda.ts +786 -0
- package/src/aws/opensearch.ts +158 -0
- package/src/aws/personalize.ts +977 -0
- package/src/aws/polly.ts +559 -0
- package/src/aws/rds.ts +888 -0
- package/src/aws/rekognition.ts +846 -0
- package/src/aws/route53-domains.ts +359 -0
- package/src/aws/route53.ts +1046 -0
- package/src/aws/s3.ts +2334 -0
- package/src/aws/scheduler.ts +571 -0
- package/src/aws/secrets-manager.ts +769 -0
- package/src/aws/ses.ts +1081 -0
- package/src/aws/setup-phone.ts +104 -0
- package/src/aws/setup-sms.ts +580 -0
- package/src/aws/sms.ts +1735 -0
- package/src/aws/smtp-server.ts +531 -0
- package/src/aws/sns.ts +758 -0
- package/src/aws/sqs.ts +382 -0
- package/src/aws/ssm.ts +807 -0
- package/src/aws/sts.ts +92 -0
- package/src/aws/support.ts +391 -0
- package/src/aws/test-imap.ts +86 -0
- package/src/aws/textract.ts +780 -0
- package/src/aws/transcribe.ts +108 -0
- package/src/aws/translate.ts +641 -0
- package/src/aws/voice.ts +1379 -0
- package/src/config.ts +35 -0
- package/src/deploy/index.ts +7 -0
- package/src/deploy/static-site-external-dns.ts +945 -0
- package/src/deploy/static-site.ts +1175 -0
- package/src/dns/cloudflare.ts +548 -0
- package/src/dns/godaddy.ts +412 -0
- package/src/dns/index.ts +205 -0
- package/src/dns/porkbun.ts +362 -0
- package/src/dns/route53-adapter.ts +414 -0
- package/src/dns/types.ts +119 -0
- package/src/dns/validator.ts +369 -0
- package/src/generators/index.ts +5 -0
- package/src/generators/infrastructure.ts +1660 -0
- package/src/index.ts +163 -0
- package/src/push/apns.ts +452 -0
- package/src/push/fcm.ts +506 -0
- package/src/push/index.ts +58 -0
- package/src/security/pre-deploy-scanner.ts +655 -0
- package/src/ssl/acme-client.ts +478 -0
- package/src/ssl/index.ts +7 -0
- package/src/ssl/letsencrypt.ts +747 -0
- package/src/types.ts +2 -0
- package/src/utils/cli.ts +398 -0
- package/src/validation/index.ts +5 -0
- package/src/validation/template.ts +405 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route53 Domains Client - Domain registration management without AWS SDK
|
|
3
|
+
* Uses direct AWS API calls with Signature V4
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { AWSClient } from './client'
|
|
7
|
+
|
|
8
|
+
export interface Nameserver {
|
|
9
|
+
Name: string
|
|
10
|
+
GlueIps?: string[]
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface DomainDetail {
|
|
14
|
+
DomainName: string
|
|
15
|
+
Nameservers?: Nameserver[]
|
|
16
|
+
AutoRenew?: boolean
|
|
17
|
+
AdminContact?: ContactDetail
|
|
18
|
+
RegistrantContact?: ContactDetail
|
|
19
|
+
TechContact?: ContactDetail
|
|
20
|
+
AdminPrivacy?: boolean
|
|
21
|
+
RegistrantPrivacy?: boolean
|
|
22
|
+
TechPrivacy?: boolean
|
|
23
|
+
RegistrarName?: string
|
|
24
|
+
WhoIsServer?: string
|
|
25
|
+
RegistrarUrl?: string
|
|
26
|
+
AbuseContactEmail?: string
|
|
27
|
+
AbuseContactPhone?: string
|
|
28
|
+
RegistryDomainId?: string
|
|
29
|
+
CreationDate?: string
|
|
30
|
+
UpdatedDate?: string
|
|
31
|
+
ExpirationDate?: string
|
|
32
|
+
Reseller?: string
|
|
33
|
+
DnsSec?: string
|
|
34
|
+
StatusList?: string[]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ContactDetail {
|
|
38
|
+
FirstName?: string
|
|
39
|
+
LastName?: string
|
|
40
|
+
ContactType?: string
|
|
41
|
+
OrganizationName?: string
|
|
42
|
+
AddressLine1?: string
|
|
43
|
+
AddressLine2?: string
|
|
44
|
+
City?: string
|
|
45
|
+
State?: string
|
|
46
|
+
CountryCode?: string
|
|
47
|
+
ZipCode?: string
|
|
48
|
+
PhoneNumber?: string
|
|
49
|
+
Email?: string
|
|
50
|
+
Fax?: string
|
|
51
|
+
ExtraParams?: { Name: string, Value: string }[]
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface UpdateDomainNameserversResult {
|
|
55
|
+
OperationId: string
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface GetDomainDetailResult extends DomainDetail {}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Route53 Domains Client for domain registration management
|
|
62
|
+
* Note: Route53 Domains API is only available in us-east-1
|
|
63
|
+
*/
|
|
64
|
+
export class Route53DomainsClient {
|
|
65
|
+
private client: AWSClient
|
|
66
|
+
private region: string = 'us-east-1' // Route53 Domains is always us-east-1
|
|
67
|
+
|
|
68
|
+
constructor() {
|
|
69
|
+
this.client = new AWSClient()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get details about a specific domain
|
|
74
|
+
*/
|
|
75
|
+
async getDomainDetail(params: {
|
|
76
|
+
DomainName: string
|
|
77
|
+
}): Promise<GetDomainDetailResult> {
|
|
78
|
+
const body = JSON.stringify({
|
|
79
|
+
DomainName: params.DomainName,
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const result = await this.client.request({
|
|
83
|
+
service: 'route53domains',
|
|
84
|
+
region: this.region,
|
|
85
|
+
method: 'POST',
|
|
86
|
+
path: '/',
|
|
87
|
+
headers: {
|
|
88
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
89
|
+
'x-amz-target': 'Route53Domains_v20140515.GetDomainDetail',
|
|
90
|
+
},
|
|
91
|
+
body,
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
return this.parseDomainDetail(result)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Update the nameservers for a domain
|
|
99
|
+
*/
|
|
100
|
+
async updateDomainNameservers(params: {
|
|
101
|
+
DomainName: string
|
|
102
|
+
Nameservers: { Name: string, GlueIps?: string[] }[]
|
|
103
|
+
}): Promise<UpdateDomainNameserversResult> {
|
|
104
|
+
const body = JSON.stringify({
|
|
105
|
+
DomainName: params.DomainName,
|
|
106
|
+
Nameservers: params.Nameservers.map(ns => ({
|
|
107
|
+
Name: ns.Name,
|
|
108
|
+
...(ns.GlueIps && { GlueIps: ns.GlueIps }),
|
|
109
|
+
})),
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
const result = await this.client.request({
|
|
113
|
+
service: 'route53domains',
|
|
114
|
+
region: this.region,
|
|
115
|
+
method: 'POST',
|
|
116
|
+
path: '/',
|
|
117
|
+
headers: {
|
|
118
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
119
|
+
'x-amz-target': 'Route53Domains_v20140515.UpdateDomainNameservers',
|
|
120
|
+
},
|
|
121
|
+
body,
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
OperationId: result.OperationId || '',
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* List domains registered with Route53
|
|
131
|
+
*/
|
|
132
|
+
async listDomains(params?: {
|
|
133
|
+
Marker?: string
|
|
134
|
+
MaxItems?: number
|
|
135
|
+
SortCondition?: {
|
|
136
|
+
Name: 'DomainName' | 'Expiry'
|
|
137
|
+
SortOrder: 'ASC' | 'DESC'
|
|
138
|
+
}
|
|
139
|
+
}): Promise<{
|
|
140
|
+
Domains: { DomainName: string, AutoRenew?: boolean, TransferLock?: boolean, Expiry?: string }[]
|
|
141
|
+
NextPageMarker?: string
|
|
142
|
+
}> {
|
|
143
|
+
const requestBody: Record<string, any> = {}
|
|
144
|
+
|
|
145
|
+
if (params?.Marker) requestBody.Marker = params.Marker
|
|
146
|
+
if (params?.MaxItems) requestBody.MaxItems = params.MaxItems
|
|
147
|
+
if (params?.SortCondition) requestBody.SortCondition = params.SortCondition
|
|
148
|
+
|
|
149
|
+
const body = JSON.stringify(requestBody)
|
|
150
|
+
|
|
151
|
+
const result = await this.client.request({
|
|
152
|
+
service: 'route53domains',
|
|
153
|
+
region: this.region,
|
|
154
|
+
method: 'POST',
|
|
155
|
+
path: '/',
|
|
156
|
+
headers: {
|
|
157
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
158
|
+
'x-amz-target': 'Route53Domains_v20140515.ListDomains',
|
|
159
|
+
},
|
|
160
|
+
body,
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
Domains: result.Domains || [],
|
|
165
|
+
NextPageMarker: result.NextPageMarker,
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Check domain availability
|
|
171
|
+
*/
|
|
172
|
+
async checkDomainAvailability(params: {
|
|
173
|
+
DomainName: string
|
|
174
|
+
}): Promise<{
|
|
175
|
+
Availability: 'AVAILABLE' | 'AVAILABLE_RESERVED' | 'AVAILABLE_PREORDER' | 'UNAVAILABLE' | 'UNAVAILABLE_PREMIUM' | 'UNAVAILABLE_RESTRICTED' | 'RESERVED' | 'DONT_KNOW'
|
|
176
|
+
}> {
|
|
177
|
+
const body = JSON.stringify({
|
|
178
|
+
DomainName: params.DomainName,
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
const result = await this.client.request({
|
|
182
|
+
service: 'route53domains',
|
|
183
|
+
region: this.region,
|
|
184
|
+
method: 'POST',
|
|
185
|
+
path: '/',
|
|
186
|
+
headers: {
|
|
187
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
188
|
+
'x-amz-target': 'Route53Domains_v20140515.CheckDomainAvailability',
|
|
189
|
+
},
|
|
190
|
+
body,
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
Availability: result.Availability || 'DONT_KNOW',
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Get domain pricing information
|
|
200
|
+
*/
|
|
201
|
+
async getDomainPrice(params: {
|
|
202
|
+
DomainName: string
|
|
203
|
+
}): Promise<{
|
|
204
|
+
RegistrationPrice?: { Price: number, Currency: string }
|
|
205
|
+
RenewalPrice?: { Price: number, Currency: string }
|
|
206
|
+
TransferPrice?: { Price: number, Currency: string }
|
|
207
|
+
}> {
|
|
208
|
+
// Extract TLD from domain name
|
|
209
|
+
const tld = params.DomainName.split('.').slice(1).join('.')
|
|
210
|
+
|
|
211
|
+
const body = JSON.stringify({
|
|
212
|
+
Tld: tld,
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
const result = await this.client.request({
|
|
216
|
+
service: 'route53domains',
|
|
217
|
+
region: this.region,
|
|
218
|
+
method: 'POST',
|
|
219
|
+
path: '/',
|
|
220
|
+
headers: {
|
|
221
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
222
|
+
'x-amz-target': 'Route53Domains_v20140515.ListPrices',
|
|
223
|
+
},
|
|
224
|
+
body,
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
const prices = result.Prices?.[0] || {}
|
|
228
|
+
return {
|
|
229
|
+
RegistrationPrice: prices.RegistrationPrice ? {
|
|
230
|
+
Price: prices.RegistrationPrice.Price,
|
|
231
|
+
Currency: prices.RegistrationPrice.Currency,
|
|
232
|
+
} : undefined,
|
|
233
|
+
RenewalPrice: prices.RenewalPrice ? {
|
|
234
|
+
Price: prices.RenewalPrice.Price,
|
|
235
|
+
Currency: prices.RenewalPrice.Currency,
|
|
236
|
+
} : undefined,
|
|
237
|
+
TransferPrice: prices.TransferPrice ? {
|
|
238
|
+
Price: prices.TransferPrice.Price,
|
|
239
|
+
Currency: prices.TransferPrice.Currency,
|
|
240
|
+
} : undefined,
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Register a new domain
|
|
246
|
+
*/
|
|
247
|
+
async registerDomain(params: {
|
|
248
|
+
DomainName: string
|
|
249
|
+
DurationInYears: number
|
|
250
|
+
AutoRenew?: boolean
|
|
251
|
+
AdminContact: ContactDetail
|
|
252
|
+
RegistrantContact: ContactDetail
|
|
253
|
+
TechContact: ContactDetail
|
|
254
|
+
PrivacyProtectAdminContact?: boolean
|
|
255
|
+
PrivacyProtectRegistrantContact?: boolean
|
|
256
|
+
PrivacyProtectTechContact?: boolean
|
|
257
|
+
}): Promise<{
|
|
258
|
+
OperationId: string
|
|
259
|
+
}> {
|
|
260
|
+
const body = JSON.stringify({
|
|
261
|
+
DomainName: params.DomainName,
|
|
262
|
+
DurationInYears: params.DurationInYears,
|
|
263
|
+
AutoRenew: params.AutoRenew ?? true,
|
|
264
|
+
AdminContact: params.AdminContact,
|
|
265
|
+
RegistrantContact: params.RegistrantContact,
|
|
266
|
+
TechContact: params.TechContact,
|
|
267
|
+
PrivacyProtectAdminContact: params.PrivacyProtectAdminContact ?? true,
|
|
268
|
+
PrivacyProtectRegistrantContact: params.PrivacyProtectRegistrantContact ?? true,
|
|
269
|
+
PrivacyProtectTechContact: params.PrivacyProtectTechContact ?? true,
|
|
270
|
+
})
|
|
271
|
+
|
|
272
|
+
const result = await this.client.request({
|
|
273
|
+
service: 'route53domains',
|
|
274
|
+
region: this.region,
|
|
275
|
+
method: 'POST',
|
|
276
|
+
path: '/',
|
|
277
|
+
headers: {
|
|
278
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
279
|
+
'x-amz-target': 'Route53Domains_v20140515.RegisterDomain',
|
|
280
|
+
},
|
|
281
|
+
body,
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
return {
|
|
285
|
+
OperationId: result.OperationId || '',
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Get operation details (for tracking domain registration status)
|
|
291
|
+
*/
|
|
292
|
+
async getOperationDetail(params: {
|
|
293
|
+
OperationId: string
|
|
294
|
+
}): Promise<{
|
|
295
|
+
OperationId: string
|
|
296
|
+
Status: 'SUBMITTED' | 'IN_PROGRESS' | 'ERROR' | 'SUCCESSFUL' | 'FAILED'
|
|
297
|
+
Message?: string
|
|
298
|
+
DomainName?: string
|
|
299
|
+
Type?: string
|
|
300
|
+
SubmittedDate?: string
|
|
301
|
+
}> {
|
|
302
|
+
const body = JSON.stringify({
|
|
303
|
+
OperationId: params.OperationId,
|
|
304
|
+
})
|
|
305
|
+
|
|
306
|
+
const result = await this.client.request({
|
|
307
|
+
service: 'route53domains',
|
|
308
|
+
region: this.region,
|
|
309
|
+
method: 'POST',
|
|
310
|
+
path: '/',
|
|
311
|
+
headers: {
|
|
312
|
+
'content-type': 'application/x-amz-json-1.1',
|
|
313
|
+
'x-amz-target': 'Route53Domains_v20140515.GetOperationDetail',
|
|
314
|
+
},
|
|
315
|
+
body,
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
OperationId: result.OperationId || '',
|
|
320
|
+
Status: result.Status || 'SUBMITTED',
|
|
321
|
+
Message: result.Message,
|
|
322
|
+
DomainName: result.DomainName,
|
|
323
|
+
Type: result.Type,
|
|
324
|
+
SubmittedDate: result.SubmittedDate,
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Parse domain detail response
|
|
330
|
+
*/
|
|
331
|
+
private parseDomainDetail(result: any): GetDomainDetailResult {
|
|
332
|
+
return {
|
|
333
|
+
DomainName: result.DomainName || '',
|
|
334
|
+
Nameservers: result.Nameservers?.map((ns: any) => ({
|
|
335
|
+
Name: ns.Name,
|
|
336
|
+
GlueIps: ns.GlueIps,
|
|
337
|
+
})),
|
|
338
|
+
AutoRenew: result.AutoRenew,
|
|
339
|
+
AdminContact: result.AdminContact,
|
|
340
|
+
RegistrantContact: result.RegistrantContact,
|
|
341
|
+
TechContact: result.TechContact,
|
|
342
|
+
AdminPrivacy: result.AdminPrivacy,
|
|
343
|
+
RegistrantPrivacy: result.RegistrantPrivacy,
|
|
344
|
+
TechPrivacy: result.TechPrivacy,
|
|
345
|
+
RegistrarName: result.RegistrarName,
|
|
346
|
+
WhoIsServer: result.WhoIsServer,
|
|
347
|
+
RegistrarUrl: result.RegistrarUrl,
|
|
348
|
+
AbuseContactEmail: result.AbuseContactEmail,
|
|
349
|
+
AbuseContactPhone: result.AbuseContactPhone,
|
|
350
|
+
RegistryDomainId: result.RegistryDomainId,
|
|
351
|
+
CreationDate: result.CreationDate,
|
|
352
|
+
UpdatedDate: result.UpdatedDate,
|
|
353
|
+
ExpirationDate: result.ExpirationDate,
|
|
354
|
+
Reseller: result.Reseller,
|
|
355
|
+
DnsSec: result.DnsSec,
|
|
356
|
+
StatusList: result.StatusList,
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|