@stacksjs/ts-cloud 0.1.3 → 0.1.6
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
package/bin/commands/domain.ts
DELETED
|
@@ -1,397 +0,0 @@
|
|
|
1
|
-
import type { CLI } from '@stacksjs/clapp'
|
|
2
|
-
import * as cli from '../../src/utils/cli'
|
|
3
|
-
import { ACMClient } from '../../src/aws/acm'
|
|
4
|
-
import { UnifiedDnsValidator } from '../../src/dns'
|
|
5
|
-
import { getDnsProvider, resolveDnsProviderConfig } from './shared'
|
|
6
|
-
|
|
7
|
-
export function registerDomainCommands(app: CLI): void {
|
|
8
|
-
app
|
|
9
|
-
.command('domain:list', 'List all domains')
|
|
10
|
-
.option('--provider <provider>', 'DNS provider: porkbun, godaddy, or route53')
|
|
11
|
-
.action(async (options?: { provider?: string }) => {
|
|
12
|
-
cli.header('Domains')
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
const provider = getDnsProvider(options?.provider)
|
|
16
|
-
const providerName = resolveDnsProviderConfig(options?.provider)?.provider || 'unknown'
|
|
17
|
-
|
|
18
|
-
const spinner = new cli.Spinner(`Fetching domains from ${providerName}...`)
|
|
19
|
-
spinner.start()
|
|
20
|
-
|
|
21
|
-
const domains = await provider.listDomains()
|
|
22
|
-
spinner.succeed(`Found ${domains.length} domain(s)`)
|
|
23
|
-
|
|
24
|
-
if (domains.length === 0) {
|
|
25
|
-
cli.info('No domains found in this provider')
|
|
26
|
-
return
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Format domains for table display
|
|
30
|
-
const domainRows = domains.map(d => [
|
|
31
|
-
d,
|
|
32
|
-
'Active',
|
|
33
|
-
'-',
|
|
34
|
-
providerName.charAt(0).toUpperCase() + providerName.slice(1),
|
|
35
|
-
])
|
|
36
|
-
|
|
37
|
-
cli.table(
|
|
38
|
-
['Domain', 'Status', 'SSL', 'Provider'],
|
|
39
|
-
domainRows,
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
cli.error(`Failed to list domains: ${error instanceof Error ? error.message : String(error)}`)
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
app
|
|
48
|
-
.command('domain:add <domain>', 'Add a new domain')
|
|
49
|
-
.option('--provider <provider>', 'DNS provider: porkbun, godaddy, or route53')
|
|
50
|
-
.action(async (domain: string, options?: { provider?: string }) => {
|
|
51
|
-
cli.header(`Adding Domain: ${domain}`)
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
-
const provider = getDnsProvider(options?.provider)
|
|
55
|
-
const providerName = resolveDnsProviderConfig(options?.provider)?.provider || 'unknown'
|
|
56
|
-
|
|
57
|
-
// Check if provider can manage the domain
|
|
58
|
-
const spinner = new cli.Spinner(`Checking if ${providerName} can manage ${domain}...`)
|
|
59
|
-
spinner.start()
|
|
60
|
-
|
|
61
|
-
const canManage = await provider.canManageDomain(domain)
|
|
62
|
-
|
|
63
|
-
if (canManage) {
|
|
64
|
-
spinner.succeed(`Domain ${domain} is already available in ${providerName}`)
|
|
65
|
-
cli.info('\nThe domain is ready to use. You can now:')
|
|
66
|
-
cli.info(` - Add DNS records: cloud dns:add ${domain} A 192.168.1.1`)
|
|
67
|
-
cli.info(` - Generate SSL: cloud domain:ssl ${domain}`)
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
spinner.warn(`Domain ${domain} is not available in ${providerName}`)
|
|
71
|
-
cli.info('\nTo add this domain:')
|
|
72
|
-
if (providerName === 'route53') {
|
|
73
|
-
cli.info(' - Create a hosted zone in Route53 for this domain')
|
|
74
|
-
cli.info(' - Update nameservers at your registrar to point to Route53')
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
cli.info(` - Ensure the domain is registered with ${providerName}`)
|
|
78
|
-
cli.info(' - Enable API access for the domain in your provider dashboard')
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
cli.error(`Failed to check domain: ${error instanceof Error ? error.message : String(error)}`)
|
|
84
|
-
}
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
app
|
|
88
|
-
.command('domain:ssl <domain>', 'Generate SSL certificate via ACM with DNS validation')
|
|
89
|
-
.option('--provider <provider>', 'DNS provider for validation: porkbun, godaddy, or route53')
|
|
90
|
-
.option('--region <region>', 'AWS region for ACM (default: us-east-1 for CloudFront compatibility)')
|
|
91
|
-
.option('--wait', 'Wait for certificate validation to complete')
|
|
92
|
-
.action(async (domain: string, options?: { provider?: string, region?: string, wait?: boolean }) => {
|
|
93
|
-
cli.header(`Generating SSL Certificate for ${domain}`)
|
|
94
|
-
|
|
95
|
-
try {
|
|
96
|
-
const dnsConfig = resolveDnsProviderConfig(options?.provider)
|
|
97
|
-
if (!dnsConfig) {
|
|
98
|
-
throw new Error('No DNS provider configured')
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const region = options?.region || 'us-east-1'
|
|
102
|
-
const providerName = dnsConfig.provider
|
|
103
|
-
|
|
104
|
-
cli.info(`DNS Provider: ${providerName}`)
|
|
105
|
-
cli.info(`ACM Region: ${region}`)
|
|
106
|
-
|
|
107
|
-
// Use UnifiedDnsValidator for complete certificate workflow
|
|
108
|
-
const validator = new UnifiedDnsValidator(dnsConfig, region)
|
|
109
|
-
const spinner = new cli.Spinner('Requesting certificate and creating validation records...')
|
|
110
|
-
spinner.start()
|
|
111
|
-
|
|
112
|
-
const result = await validator.findOrCreateCertificate({
|
|
113
|
-
domainName: domain,
|
|
114
|
-
subjectAlternativeNames: [`*.${domain}`],
|
|
115
|
-
waitForValidation: options?.wait ?? true,
|
|
116
|
-
maxWaitMinutes: 10,
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
if (result.isNew) {
|
|
120
|
-
spinner.succeed('Certificate requested and validation records created')
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
spinner.succeed('Found existing valid certificate')
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
cli.info(`Certificate ARN: ${result.certificateArn}`)
|
|
127
|
-
cli.info(`Status: ${result.status}`)
|
|
128
|
-
|
|
129
|
-
if (result.status === 'issued') {
|
|
130
|
-
cli.success('\nSSL Certificate is ready!')
|
|
131
|
-
cli.info('\nYou can now use this certificate with:')
|
|
132
|
-
cli.info(' - CloudFront distributions')
|
|
133
|
-
cli.info(' - Application Load Balancers')
|
|
134
|
-
cli.info(' - API Gateway custom domains')
|
|
135
|
-
}
|
|
136
|
-
else if (result.status === 'pending') {
|
|
137
|
-
cli.info('\nDNS validation records have been created.')
|
|
138
|
-
cli.info('Certificate validation may take a few more minutes.')
|
|
139
|
-
cli.info(`\nCheck status with: cloud domain:verify ${domain}`)
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
cli.error('\nCertificate validation failed. Check ACM console for details.')
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
cli.error(`Failed to generate SSL: ${error instanceof Error ? error.message : String(error)}`)
|
|
147
|
-
}
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
app
|
|
151
|
-
.command('domain:verify <domain>', 'Verify domain ownership and SSL status')
|
|
152
|
-
.option('--provider <provider>', 'DNS provider: porkbun, godaddy, or route53')
|
|
153
|
-
.action(async (domain: string, options?: { provider?: string }) => {
|
|
154
|
-
cli.header(`Verifying Domain: ${domain}`)
|
|
155
|
-
|
|
156
|
-
try {
|
|
157
|
-
const provider = getDnsProvider(options?.provider)
|
|
158
|
-
const providerName = resolveDnsProviderConfig(options?.provider)?.provider || 'unknown'
|
|
159
|
-
|
|
160
|
-
// Check domain ownership
|
|
161
|
-
const spinner = new cli.Spinner('Checking domain ownership...')
|
|
162
|
-
spinner.start()
|
|
163
|
-
|
|
164
|
-
const canManage = await provider.canManageDomain(domain)
|
|
165
|
-
|
|
166
|
-
if (!canManage) {
|
|
167
|
-
spinner.fail('Domain not found in provider')
|
|
168
|
-
cli.error(`Domain ${domain} is not available in ${providerName}`)
|
|
169
|
-
return
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
spinner.succeed('Domain ownership verified')
|
|
173
|
-
|
|
174
|
-
// Get DNS records
|
|
175
|
-
spinner.text = 'Fetching DNS records...'
|
|
176
|
-
spinner.start()
|
|
177
|
-
|
|
178
|
-
const recordsResult = await provider.listRecords(domain)
|
|
179
|
-
const records = recordsResult.records || []
|
|
180
|
-
spinner.succeed(`Found ${records.length} DNS record(s)`)
|
|
181
|
-
|
|
182
|
-
// Check for SSL certificate in ACM
|
|
183
|
-
spinner.text = 'Checking SSL certificate status...'
|
|
184
|
-
spinner.start()
|
|
185
|
-
|
|
186
|
-
const acm = new ACMClient('us-east-1')
|
|
187
|
-
let sslStatus = 'Not found'
|
|
188
|
-
let certArn = ''
|
|
189
|
-
|
|
190
|
-
try {
|
|
191
|
-
const certsResult = await acm.listCertificates()
|
|
192
|
-
const domainCert = certsResult.CertificateSummaryList.find(
|
|
193
|
-
c => c.DomainName === domain || c.DomainName === `*.${domain}`,
|
|
194
|
-
)
|
|
195
|
-
if (domainCert) {
|
|
196
|
-
certArn = domainCert.CertificateArn || ''
|
|
197
|
-
const details = await acm.describeCertificate({ CertificateArn: certArn })
|
|
198
|
-
sslStatus = details.Status || 'Unknown'
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
catch {
|
|
202
|
-
// ACM not accessible or no certs
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
spinner.succeed('SSL check complete')
|
|
206
|
-
|
|
207
|
-
cli.info('\nVerification details:')
|
|
208
|
-
cli.info(` - Provider: ${providerName}`)
|
|
209
|
-
cli.info(` - DNS records found: ${records.length}`)
|
|
210
|
-
cli.info(` - Domain managed: Yes`)
|
|
211
|
-
cli.info(` - SSL certificate: ${sslStatus}`)
|
|
212
|
-
if (certArn) {
|
|
213
|
-
cli.info(` - Certificate ARN: ${certArn}`)
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// Show record summary by type
|
|
217
|
-
const recordTypes = new Map<string, number>()
|
|
218
|
-
for (const record of records) {
|
|
219
|
-
const count = recordTypes.get(record.type) || 0
|
|
220
|
-
recordTypes.set(record.type, count + 1)
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
if (recordTypes.size > 0) {
|
|
224
|
-
cli.info('\nRecord summary:')
|
|
225
|
-
for (const [type, count] of recordTypes) {
|
|
226
|
-
cli.info(` - ${type}: ${count}`)
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
cli.error(`Failed to verify domain: ${error instanceof Error ? error.message : String(error)}`)
|
|
232
|
-
}
|
|
233
|
-
})
|
|
234
|
-
|
|
235
|
-
app
|
|
236
|
-
.command('dns:records <domain>', 'List DNS records for a domain')
|
|
237
|
-
.option('--provider <provider>', 'DNS provider: porkbun, godaddy, or route53')
|
|
238
|
-
.option('--type <type>', 'Filter by record type (A, AAAA, CNAME, TXT, MX, etc.)')
|
|
239
|
-
.action(async (domain: string, options?: { provider?: string, type?: string }) => {
|
|
240
|
-
cli.header(`DNS Records for ${domain}`)
|
|
241
|
-
|
|
242
|
-
try {
|
|
243
|
-
const provider = getDnsProvider(options?.provider)
|
|
244
|
-
const providerName = resolveDnsProviderConfig(options?.provider)?.provider || 'unknown'
|
|
245
|
-
|
|
246
|
-
const spinner = new cli.Spinner(`Fetching records from ${providerName}...`)
|
|
247
|
-
spinner.start()
|
|
248
|
-
|
|
249
|
-
const result = await provider.listRecords(domain)
|
|
250
|
-
let records = result.records || []
|
|
251
|
-
spinner.succeed(`Found ${records.length} record(s)`)
|
|
252
|
-
|
|
253
|
-
// Filter by type if specified
|
|
254
|
-
if (options?.type) {
|
|
255
|
-
const filterType = options.type.toUpperCase()
|
|
256
|
-
records = records.filter(r => r.type.toUpperCase() === filterType)
|
|
257
|
-
cli.info(`Filtered to ${records.length} ${filterType} record(s)`)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
if (records.length === 0) {
|
|
261
|
-
cli.info('No records found')
|
|
262
|
-
return
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// Format records for table display
|
|
266
|
-
const recordRows = records.map(r => [
|
|
267
|
-
r.type,
|
|
268
|
-
r.name || '@',
|
|
269
|
-
r.content.length > 50 ? `${r.content.substring(0, 47)}...` : r.content,
|
|
270
|
-
String(r.ttl || 300),
|
|
271
|
-
])
|
|
272
|
-
|
|
273
|
-
cli.table(
|
|
274
|
-
['Type', 'Name', 'Value', 'TTL'],
|
|
275
|
-
recordRows,
|
|
276
|
-
)
|
|
277
|
-
}
|
|
278
|
-
catch (error) {
|
|
279
|
-
cli.error(`Failed to list records: ${error instanceof Error ? error.message : String(error)}`)
|
|
280
|
-
}
|
|
281
|
-
})
|
|
282
|
-
|
|
283
|
-
app
|
|
284
|
-
.command('dns:add <domain> <type> <value>', 'Add DNS record')
|
|
285
|
-
.option('--provider <provider>', 'DNS provider: porkbun, godaddy, or route53')
|
|
286
|
-
.option('--name <name>', 'Record name (subdomain)', { default: '@' })
|
|
287
|
-
.option('--ttl <seconds>', 'Time to live in seconds', { default: '300' })
|
|
288
|
-
.action(async (domain: string, type: string, value: string, options?: { provider?: string, name?: string, ttl?: string }) => {
|
|
289
|
-
cli.header(`Adding DNS Record`)
|
|
290
|
-
|
|
291
|
-
try {
|
|
292
|
-
const provider = getDnsProvider(options?.provider)
|
|
293
|
-
const providerName = resolveDnsProviderConfig(options?.provider)?.provider || 'unknown'
|
|
294
|
-
|
|
295
|
-
const name = options?.name || '@'
|
|
296
|
-
const ttl = Number.parseInt(options?.ttl || '300', 10)
|
|
297
|
-
const recordType = type.toUpperCase() as 'A' | 'AAAA' | 'CNAME' | 'TXT' | 'MX' | 'NS' | 'SRV' | 'CAA'
|
|
298
|
-
|
|
299
|
-
cli.info(`Provider: ${providerName}`)
|
|
300
|
-
cli.info(`Domain: ${domain}`)
|
|
301
|
-
cli.info(`Type: ${recordType}`)
|
|
302
|
-
cli.info(`Name: ${name}`)
|
|
303
|
-
cli.info(`Value: ${value}`)
|
|
304
|
-
cli.info(`TTL: ${ttl}`)
|
|
305
|
-
|
|
306
|
-
const spinner = new cli.Spinner(`Adding record via ${providerName}...`)
|
|
307
|
-
spinner.start()
|
|
308
|
-
|
|
309
|
-
await provider.createRecord(domain, {
|
|
310
|
-
type: recordType,
|
|
311
|
-
name: name === '@' ? '' : name,
|
|
312
|
-
content: value,
|
|
313
|
-
ttl,
|
|
314
|
-
})
|
|
315
|
-
|
|
316
|
-
spinner.succeed('DNS record added successfully')
|
|
317
|
-
|
|
318
|
-
cli.success('\nRecord created!')
|
|
319
|
-
cli.info('\nNote: DNS changes may take a few minutes to propagate')
|
|
320
|
-
}
|
|
321
|
-
catch (error) {
|
|
322
|
-
cli.error(`Failed to add record: ${error instanceof Error ? error.message : String(error)}`)
|
|
323
|
-
}
|
|
324
|
-
})
|
|
325
|
-
|
|
326
|
-
app
|
|
327
|
-
.command('dns:delete <domain> <type>', 'Delete DNS record')
|
|
328
|
-
.option('--provider <provider>', 'DNS provider: porkbun, godaddy, or route53')
|
|
329
|
-
.option('--name <name>', 'Record name (subdomain)', { default: '@' })
|
|
330
|
-
.option('--value <value>', 'Record value (required for multi-value records)')
|
|
331
|
-
.action(async (domain: string, type: string, options?: { provider?: string, name?: string, value?: string }) => {
|
|
332
|
-
cli.header(`Deleting DNS Record`)
|
|
333
|
-
|
|
334
|
-
try {
|
|
335
|
-
const provider = getDnsProvider(options?.provider)
|
|
336
|
-
const providerName = resolveDnsProviderConfig(options?.provider)?.provider || 'unknown'
|
|
337
|
-
|
|
338
|
-
const name = options?.name || '@'
|
|
339
|
-
const recordType = type.toUpperCase()
|
|
340
|
-
|
|
341
|
-
cli.info(`Provider: ${providerName}`)
|
|
342
|
-
cli.info(`Domain: ${domain}`)
|
|
343
|
-
cli.info(`Type: ${recordType}`)
|
|
344
|
-
cli.info(`Name: ${name}`)
|
|
345
|
-
|
|
346
|
-
// Get existing records to find the one to delete
|
|
347
|
-
const spinner = new cli.Spinner('Finding record...')
|
|
348
|
-
spinner.start()
|
|
349
|
-
|
|
350
|
-
const result = await provider.listRecords(domain)
|
|
351
|
-
const allRecords = result.records || []
|
|
352
|
-
const matchingRecords = allRecords.filter(r =>
|
|
353
|
-
r.type.toUpperCase() === recordType
|
|
354
|
-
&& (r.name === name || r.name === '' && name === '@'),
|
|
355
|
-
)
|
|
356
|
-
|
|
357
|
-
if (matchingRecords.length === 0) {
|
|
358
|
-
spinner.fail('No matching record found')
|
|
359
|
-
return
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// If multiple records and no value specified, show them
|
|
363
|
-
if (matchingRecords.length > 1 && !options?.value) {
|
|
364
|
-
spinner.warn('Multiple records found')
|
|
365
|
-
cli.info('\nPlease specify --value to identify which record to delete:')
|
|
366
|
-
for (const r of matchingRecords) {
|
|
367
|
-
cli.info(` - ${r.content}`)
|
|
368
|
-
}
|
|
369
|
-
return
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
const recordToDelete = options?.value
|
|
373
|
-
? matchingRecords.find(r => r.content === options.value) || matchingRecords[0]
|
|
374
|
-
: matchingRecords[0]
|
|
375
|
-
|
|
376
|
-
cli.info(`Value: ${recordToDelete.content}`)
|
|
377
|
-
|
|
378
|
-
// Confirm deletion
|
|
379
|
-
const confirm = await cli.confirm('Delete this record?', false)
|
|
380
|
-
if (!confirm) {
|
|
381
|
-
cli.info('Deletion cancelled')
|
|
382
|
-
return
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
spinner.text = `Deleting record via ${providerName}...`
|
|
386
|
-
spinner.start()
|
|
387
|
-
|
|
388
|
-
await provider.deleteRecord(domain, recordToDelete)
|
|
389
|
-
|
|
390
|
-
spinner.succeed('DNS record deleted successfully')
|
|
391
|
-
cli.success('\nRecord deleted!')
|
|
392
|
-
}
|
|
393
|
-
catch (error) {
|
|
394
|
-
cli.error(`Failed to delete record: ${error instanceof Error ? error.message : String(error)}`)
|
|
395
|
-
}
|
|
396
|
-
})
|
|
397
|
-
}
|