@stacksjs/ts-cloud 0.1.3 → 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.
Files changed (187) hide show
  1. package/README.md +98 -13
  2. package/dist/aws/acm.d.ts +129 -0
  3. package/dist/aws/application-autoscaling.d.ts +282 -0
  4. package/dist/aws/bedrock.d.ts +2292 -0
  5. package/dist/aws/client.d.ts +79 -0
  6. package/dist/aws/cloudformation.d.ts +105 -0
  7. package/dist/aws/cloudfront.d.ts +265 -0
  8. package/dist/aws/cloudwatch-logs.d.ts +48 -0
  9. package/dist/aws/comprehend.d.ts +505 -0
  10. package/dist/aws/connect.d.ts +377 -0
  11. package/dist/aws/deploy-imap.d.ts +14 -0
  12. package/dist/aws/dynamodb.d.ts +176 -0
  13. package/dist/aws/ec2.d.ts +272 -0
  14. package/dist/aws/ecr.d.ts +149 -0
  15. package/dist/aws/ecs.d.ts +162 -0
  16. package/dist/aws/elasticache.d.ts +71 -0
  17. package/dist/aws/elbv2.d.ts +248 -0
  18. package/dist/aws/email.d.ts +175 -0
  19. package/dist/aws/eventbridge.d.ts +142 -0
  20. package/dist/aws/iam.d.ts +638 -0
  21. package/dist/aws/imap-server.d.ts +119 -0
  22. package/{src/aws/index.ts → dist/aws/index.d.ts} +62 -83
  23. package/{src/aws/kendra.ts → dist/aws/kendra.d.ts} +71 -386
  24. package/dist/aws/lambda.d.ts +232 -0
  25. package/dist/aws/opensearch.d.ts +87 -0
  26. package/dist/aws/personalize.d.ts +516 -0
  27. package/dist/aws/polly.d.ts +214 -0
  28. package/dist/aws/rds.d.ts +240 -0
  29. package/dist/aws/rekognition.d.ts +543 -0
  30. package/dist/aws/route53-domains.d.ts +113 -0
  31. package/dist/aws/route53.d.ts +215 -0
  32. package/dist/aws/s3.d.ts +212 -0
  33. package/dist/aws/scheduler.d.ts +140 -0
  34. package/dist/aws/secrets-manager.d.ts +170 -0
  35. package/dist/aws/ses.d.ts +288 -0
  36. package/dist/aws/setup-phone.d.ts +0 -0
  37. package/dist/aws/setup-sms.d.ts +115 -0
  38. package/dist/aws/sms.d.ts +304 -0
  39. package/dist/aws/smtp-server.d.ts +61 -0
  40. package/dist/aws/sns.d.ts +117 -0
  41. package/dist/aws/sqs.d.ts +65 -0
  42. package/dist/aws/ssm.d.ts +179 -0
  43. package/dist/aws/sts.d.ts +15 -0
  44. package/dist/aws/support.d.ts +104 -0
  45. package/dist/aws/test-imap.d.ts +0 -0
  46. package/dist/aws/textract.d.ts +403 -0
  47. package/dist/aws/transcribe.d.ts +60 -0
  48. package/dist/aws/translate.d.ts +358 -0
  49. package/dist/aws/voice.d.ts +219 -0
  50. package/dist/bin/cli.js +1724 -0
  51. package/dist/config.d.ts +7 -0
  52. package/dist/deploy/index.d.ts +2 -0
  53. package/dist/deploy/static-site-external-dns.d.ts +51 -0
  54. package/dist/deploy/static-site.d.ts +71 -0
  55. package/dist/dns/cloudflare.d.ts +52 -0
  56. package/dist/dns/godaddy.d.ts +38 -0
  57. package/dist/dns/index.d.ts +45 -0
  58. package/dist/dns/porkbun.d.ts +18 -0
  59. package/dist/dns/route53-adapter.d.ts +38 -0
  60. package/{src/dns/types.ts → dist/dns/types.d.ts} +26 -63
  61. package/dist/dns/validator.d.ts +78 -0
  62. package/dist/generators/index.d.ts +1 -0
  63. package/dist/generators/infrastructure.d.ts +30 -0
  64. package/{src/index.ts → dist/index.d.ts} +70 -93
  65. package/dist/index.js +7881 -0
  66. package/dist/push/apns.d.ts +60 -0
  67. package/dist/push/fcm.d.ts +117 -0
  68. package/dist/push/index.d.ts +14 -0
  69. package/dist/security/pre-deploy-scanner.d.ts +69 -0
  70. package/dist/ssl/acme-client.d.ts +67 -0
  71. package/dist/ssl/index.d.ts +2 -0
  72. package/dist/ssl/letsencrypt.d.ts +48 -0
  73. package/dist/types.d.ts +1 -0
  74. package/dist/utils/cli.d.ts +123 -0
  75. package/dist/validation/index.d.ts +1 -0
  76. package/dist/validation/template.d.ts +23 -0
  77. package/package.json +8 -8
  78. package/bin/cli.ts +0 -133
  79. package/bin/commands/analytics.ts +0 -328
  80. package/bin/commands/api.ts +0 -379
  81. package/bin/commands/assets.ts +0 -221
  82. package/bin/commands/audit.ts +0 -501
  83. package/bin/commands/backup.ts +0 -682
  84. package/bin/commands/cache.ts +0 -294
  85. package/bin/commands/cdn.ts +0 -281
  86. package/bin/commands/config.ts +0 -202
  87. package/bin/commands/container.ts +0 -105
  88. package/bin/commands/cost.ts +0 -208
  89. package/bin/commands/database.ts +0 -401
  90. package/bin/commands/deploy.ts +0 -674
  91. package/bin/commands/domain.ts +0 -397
  92. package/bin/commands/email.ts +0 -423
  93. package/bin/commands/environment.ts +0 -285
  94. package/bin/commands/events.ts +0 -424
  95. package/bin/commands/firewall.ts +0 -145
  96. package/bin/commands/function.ts +0 -116
  97. package/bin/commands/generate.ts +0 -280
  98. package/bin/commands/git.ts +0 -139
  99. package/bin/commands/iam.ts +0 -464
  100. package/bin/commands/index.ts +0 -48
  101. package/bin/commands/init.ts +0 -120
  102. package/bin/commands/logs.ts +0 -148
  103. package/bin/commands/network.ts +0 -579
  104. package/bin/commands/notify.ts +0 -489
  105. package/bin/commands/queue.ts +0 -407
  106. package/bin/commands/scheduler.ts +0 -370
  107. package/bin/commands/secrets.ts +0 -54
  108. package/bin/commands/server.ts +0 -629
  109. package/bin/commands/shared.ts +0 -97
  110. package/bin/commands/ssl.ts +0 -138
  111. package/bin/commands/stack.ts +0 -325
  112. package/bin/commands/status.ts +0 -385
  113. package/bin/commands/storage.ts +0 -450
  114. package/bin/commands/team.ts +0 -96
  115. package/bin/commands/tunnel.ts +0 -489
  116. package/bin/commands/utils.ts +0 -202
  117. package/build.ts +0 -15
  118. package/cloud +0 -2
  119. package/src/aws/acm.ts +0 -768
  120. package/src/aws/application-autoscaling.ts +0 -845
  121. package/src/aws/bedrock.ts +0 -4074
  122. package/src/aws/client.ts +0 -878
  123. package/src/aws/cloudformation.ts +0 -896
  124. package/src/aws/cloudfront.ts +0 -1531
  125. package/src/aws/cloudwatch-logs.ts +0 -154
  126. package/src/aws/comprehend.ts +0 -839
  127. package/src/aws/connect.ts +0 -1056
  128. package/src/aws/deploy-imap.ts +0 -384
  129. package/src/aws/dynamodb.ts +0 -340
  130. package/src/aws/ec2.ts +0 -1385
  131. package/src/aws/ecr.ts +0 -621
  132. package/src/aws/ecs.ts +0 -615
  133. package/src/aws/elasticache.ts +0 -301
  134. package/src/aws/elbv2.ts +0 -942
  135. package/src/aws/email.ts +0 -928
  136. package/src/aws/eventbridge.ts +0 -248
  137. package/src/aws/iam.ts +0 -1689
  138. package/src/aws/imap-server.ts +0 -2100
  139. package/src/aws/lambda.ts +0 -786
  140. package/src/aws/opensearch.ts +0 -158
  141. package/src/aws/personalize.ts +0 -977
  142. package/src/aws/polly.ts +0 -559
  143. package/src/aws/rds.ts +0 -888
  144. package/src/aws/rekognition.ts +0 -846
  145. package/src/aws/route53-domains.ts +0 -359
  146. package/src/aws/route53.ts +0 -1046
  147. package/src/aws/s3.ts +0 -2318
  148. package/src/aws/scheduler.ts +0 -571
  149. package/src/aws/secrets-manager.ts +0 -769
  150. package/src/aws/ses.ts +0 -1081
  151. package/src/aws/setup-phone.ts +0 -104
  152. package/src/aws/setup-sms.ts +0 -580
  153. package/src/aws/sms.ts +0 -1735
  154. package/src/aws/smtp-server.ts +0 -531
  155. package/src/aws/sns.ts +0 -758
  156. package/src/aws/sqs.ts +0 -382
  157. package/src/aws/ssm.ts +0 -807
  158. package/src/aws/sts.ts +0 -92
  159. package/src/aws/support.ts +0 -391
  160. package/src/aws/test-imap.ts +0 -86
  161. package/src/aws/textract.ts +0 -780
  162. package/src/aws/transcribe.ts +0 -108
  163. package/src/aws/translate.ts +0 -641
  164. package/src/aws/voice.ts +0 -1379
  165. package/src/config.ts +0 -35
  166. package/src/deploy/index.ts +0 -7
  167. package/src/deploy/static-site-external-dns.ts +0 -906
  168. package/src/deploy/static-site.ts +0 -1125
  169. package/src/dns/godaddy.ts +0 -412
  170. package/src/dns/index.ts +0 -183
  171. package/src/dns/porkbun.ts +0 -362
  172. package/src/dns/route53-adapter.ts +0 -414
  173. package/src/dns/validator.ts +0 -369
  174. package/src/generators/index.ts +0 -5
  175. package/src/generators/infrastructure.ts +0 -1660
  176. package/src/push/apns.ts +0 -452
  177. package/src/push/fcm.ts +0 -506
  178. package/src/push/index.ts +0 -58
  179. package/src/ssl/acme-client.ts +0 -478
  180. package/src/ssl/index.ts +0 -7
  181. package/src/ssl/letsencrypt.ts +0 -747
  182. package/src/types.ts +0 -2
  183. package/src/utils/cli.ts +0 -398
  184. package/src/validation/index.ts +0 -5
  185. package/src/validation/template.ts +0 -405
  186. package/test/index.test.ts +0 -128
  187. package/tsconfig.json +0 -18
@@ -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
- }