@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.
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,412 +0,0 @@
1
- /**
2
- * GoDaddy DNS Provider
3
- * API documentation: https://developer.godaddy.com/doc/endpoint/domains
4
- */
5
-
6
- import type {
7
- CreateRecordResult,
8
- DeleteRecordResult,
9
- DnsProvider,
10
- DnsRecord,
11
- DnsRecordResult,
12
- DnsRecordType,
13
- ListRecordsResult,
14
- } from './types'
15
-
16
- const GODADDY_API_URL = 'https://api.godaddy.com'
17
- const GODADDY_OTE_API_URL = 'https://api.ote-godaddy.com' // Test environment
18
-
19
- interface GoDaddyRecord {
20
- type: string
21
- name: string
22
- data: string
23
- ttl: number
24
- priority?: number
25
- }
26
-
27
- export class GoDaddyProvider implements DnsProvider {
28
- readonly name = 'godaddy'
29
- private apiKey: string
30
- private apiSecret: string
31
- private baseUrl: string
32
-
33
- constructor(
34
- apiKey: string,
35
- apiSecret: string,
36
- environment: 'production' | 'ote' = 'production',
37
- ) {
38
- this.apiKey = apiKey
39
- this.apiSecret = apiSecret
40
- this.baseUrl = environment === 'ote' ? GODADDY_OTE_API_URL : GODADDY_API_URL
41
- }
42
-
43
- /**
44
- * Make an authenticated API request to GoDaddy
45
- */
46
- private async request<T>(
47
- method: string,
48
- endpoint: string,
49
- body?: any,
50
- ): Promise<T> {
51
- const url = `${this.baseUrl}${endpoint}`
52
-
53
- const headers: Record<string, string> = {
54
- 'Authorization': `sso-key ${this.apiKey}:${this.apiSecret}`,
55
- 'Content-Type': 'application/json',
56
- 'Accept': 'application/json',
57
- }
58
-
59
- const options: RequestInit = {
60
- method,
61
- headers,
62
- }
63
-
64
- if (body) {
65
- options.body = JSON.stringify(body)
66
- }
67
-
68
- const response = await fetch(url, options)
69
-
70
- // GoDaddy returns 204 for successful DELETE operations
71
- if (response.status === 204) {
72
- return {} as T
73
- }
74
-
75
- // For successful requests with content
76
- if (response.ok) {
77
- const text = await response.text()
78
- if (text) {
79
- return JSON.parse(text) as T
80
- }
81
- return {} as T
82
- }
83
-
84
- // Handle errors
85
- let errorMessage = `GoDaddy API error: ${response.status} ${response.statusText}`
86
- try {
87
- const errorData = await response.json() as Record<string, any>
88
- if (errorData.message) {
89
- errorMessage = `GoDaddy API error: ${errorData.message}`
90
- }
91
- if (errorData.fields) {
92
- errorMessage += ` - Fields: ${JSON.stringify(errorData.fields)}`
93
- }
94
- }
95
- catch {
96
- // Ignore JSON parse errors for error response
97
- }
98
-
99
- throw new Error(errorMessage)
100
- }
101
-
102
- /**
103
- * Extract the subdomain from a full record name
104
- * GoDaddy uses @ for root domain
105
- */
106
- private getSubdomain(recordName: string, domain: string): string {
107
- // Remove trailing dots
108
- const cleanName = recordName.replace(/\.$/, '')
109
- const cleanDomain = domain.replace(/\.$/, '')
110
-
111
- // If the record name equals the domain, return @ (root)
112
- if (cleanName === cleanDomain) {
113
- return '@'
114
- }
115
-
116
- // Remove the domain suffix to get the subdomain
117
- if (cleanName.endsWith(`.${cleanDomain}`)) {
118
- return cleanName.slice(0, -(cleanDomain.length + 1))
119
- }
120
-
121
- // If no match, return the full name as subdomain
122
- return cleanName
123
- }
124
-
125
- /**
126
- * Get the root domain from a full domain name
127
- */
128
- private getRootDomain(domain: string): string {
129
- const parts = domain.replace(/\.$/, '').split('.')
130
- if (parts.length >= 2) {
131
- return parts.slice(-2).join('.')
132
- }
133
- return domain
134
- }
135
-
136
- /**
137
- * Convert DnsRecord to GoDaddy record format
138
- */
139
- private toGoDaddyRecord(record: DnsRecord, domain: string): GoDaddyRecord {
140
- const rootDomain = this.getRootDomain(domain)
141
- const subdomain = this.getSubdomain(record.name, rootDomain)
142
-
143
- const gdRecord: GoDaddyRecord = {
144
- type: record.type,
145
- name: subdomain,
146
- data: record.content,
147
- ttl: record.ttl || 600,
148
- }
149
-
150
- if (record.type === 'MX' && record.priority !== undefined) {
151
- gdRecord.priority = record.priority
152
- }
153
-
154
- return gdRecord
155
- }
156
-
157
- /**
158
- * Convert GoDaddy record to DnsRecordResult format
159
- */
160
- private fromGoDaddyRecord(record: GoDaddyRecord, domain: string): DnsRecordResult {
161
- const rootDomain = this.getRootDomain(domain)
162
- let name = record.name
163
-
164
- // Convert @ to domain name and subdomain to full name
165
- if (name === '@') {
166
- name = rootDomain
167
- }
168
- else if (!name.endsWith(rootDomain)) {
169
- name = `${name}.${rootDomain}`
170
- }
171
-
172
- return {
173
- name,
174
- type: record.type as DnsRecordType,
175
- content: record.data,
176
- ttl: record.ttl,
177
- priority: record.priority,
178
- }
179
- }
180
-
181
- async createRecord(domain: string, record: DnsRecord): Promise<CreateRecordResult> {
182
- try {
183
- const rootDomain = this.getRootDomain(domain)
184
- const gdRecord = this.toGoDaddyRecord(record, domain)
185
-
186
- // GoDaddy's PATCH endpoint adds records
187
- await this.request(
188
- 'PATCH',
189
- `/v1/domains/${rootDomain}/records`,
190
- [gdRecord],
191
- )
192
-
193
- return {
194
- success: true,
195
- message: 'Record created successfully',
196
- }
197
- }
198
- catch (error) {
199
- return {
200
- success: false,
201
- message: error instanceof Error ? error.message : 'Unknown error',
202
- }
203
- }
204
- }
205
-
206
- async upsertRecord(domain: string, record: DnsRecord): Promise<CreateRecordResult> {
207
- try {
208
- const rootDomain = this.getRootDomain(domain)
209
- const gdRecord = this.toGoDaddyRecord(record, domain)
210
-
211
- // GoDaddy's PUT replaces all records of a specific type/name
212
- await this.request(
213
- 'PUT',
214
- `/v1/domains/${rootDomain}/records/${record.type}/${gdRecord.name}`,
215
- [gdRecord],
216
- )
217
-
218
- return {
219
- success: true,
220
- message: 'Record upserted successfully',
221
- }
222
- }
223
- catch (error) {
224
- // If PUT fails (record doesn't exist), try PATCH
225
- return this.createRecord(domain, record)
226
- }
227
- }
228
-
229
- async deleteRecord(domain: string, record: DnsRecord): Promise<DeleteRecordResult> {
230
- try {
231
- const rootDomain = this.getRootDomain(domain)
232
- const subdomain = this.getSubdomain(record.name, rootDomain)
233
-
234
- // GoDaddy doesn't have a direct delete endpoint
235
- // We need to get all records of this type/name and PUT back without the target
236
-
237
- const existingRecords = await this.request<GoDaddyRecord[]>(
238
- 'GET',
239
- `/v1/domains/${rootDomain}/records/${record.type}/${subdomain}`,
240
- )
241
-
242
- // Filter out the record to delete
243
- const remainingRecords = existingRecords.filter(
244
- r => r.data !== record.content,
245
- )
246
-
247
- if (remainingRecords.length === existingRecords.length) {
248
- // Record not found
249
- return {
250
- success: false,
251
- message: 'Record not found',
252
- }
253
- }
254
-
255
- if (remainingRecords.length === 0) {
256
- // GoDaddy doesn't allow empty record sets for some types
257
- // Use DELETE endpoint if available, otherwise PUT an empty array
258
- try {
259
- await this.request(
260
- 'DELETE',
261
- `/v1/domains/${rootDomain}/records/${record.type}/${subdomain}`,
262
- )
263
- }
264
- catch {
265
- // Some record types can't be fully deleted, that's OK
266
- }
267
- }
268
- else {
269
- // Replace with remaining records
270
- await this.request(
271
- 'PUT',
272
- `/v1/domains/${rootDomain}/records/${record.type}/${subdomain}`,
273
- remainingRecords,
274
- )
275
- }
276
-
277
- return {
278
- success: true,
279
- message: 'Record deleted successfully',
280
- }
281
- }
282
- catch (error) {
283
- return {
284
- success: false,
285
- message: error instanceof Error ? error.message : 'Unknown error',
286
- }
287
- }
288
- }
289
-
290
- async listRecords(domain: string, type?: DnsRecordType): Promise<ListRecordsResult> {
291
- try {
292
- const rootDomain = this.getRootDomain(domain)
293
-
294
- let endpoint = `/v1/domains/${rootDomain}/records`
295
- if (type) {
296
- endpoint = `/v1/domains/${rootDomain}/records/${type}`
297
- }
298
-
299
- const records = await this.request<GoDaddyRecord[]>('GET', endpoint)
300
-
301
- return {
302
- success: true,
303
- records: records.map(r => this.fromGoDaddyRecord(r, domain)),
304
- }
305
- }
306
- catch (error) {
307
- return {
308
- success: false,
309
- records: [],
310
- message: error instanceof Error ? error.message : 'Unknown error',
311
- }
312
- }
313
- }
314
-
315
- async canManageDomain(domain: string): Promise<boolean> {
316
- try {
317
- const rootDomain = this.getRootDomain(domain)
318
- // Try to get domain details
319
- await this.request('GET', `/v1/domains/${rootDomain}`)
320
- return true
321
- }
322
- catch {
323
- return false
324
- }
325
- }
326
-
327
- /**
328
- * List all domains managed by this GoDaddy account
329
- */
330
- async listDomains(): Promise<string[]> {
331
- try {
332
- const response = await this.request<Array<{ domain: string }>>('GET', '/v1/domains')
333
- return response.map(d => d.domain)
334
- }
335
- catch {
336
- return []
337
- }
338
- }
339
-
340
- /**
341
- * Get domain details (GoDaddy-specific)
342
- */
343
- async getDomainDetails(domain: string): Promise<{
344
- domain: string
345
- status: string
346
- nameServers?: string[]
347
- expires?: string
348
- } | null> {
349
- try {
350
- const rootDomain = this.getRootDomain(domain)
351
- const details = await this.request<any>('GET', `/v1/domains/${rootDomain}`)
352
-
353
- return {
354
- domain: details.domain,
355
- status: details.status,
356
- nameServers: details.nameServers,
357
- expires: details.expires,
358
- }
359
- }
360
- catch {
361
- return null
362
- }
363
- }
364
-
365
- /**
366
- * Update nameservers for a domain (GoDaddy-specific)
367
- */
368
- async updateNameServers(domain: string, nameservers: string[]): Promise<boolean> {
369
- try {
370
- const rootDomain = this.getRootDomain(domain)
371
- await this.request(
372
- 'PUT',
373
- `/v1/domains/${rootDomain}/records/NS`,
374
- nameservers.map(ns => ({
375
- type: 'NS',
376
- name: '@',
377
- data: ns,
378
- ttl: 3600,
379
- })),
380
- )
381
- return true
382
- }
383
- catch {
384
- return false
385
- }
386
- }
387
-
388
- /**
389
- * Check domain availability (GoDaddy-specific)
390
- */
391
- async checkDomainAvailability(domain: string): Promise<{
392
- available: boolean
393
- price?: number
394
- currency?: string
395
- }> {
396
- try {
397
- const result = await this.request<any>(
398
- 'GET',
399
- `/v1/domains/available?domain=${encodeURIComponent(domain)}`,
400
- )
401
-
402
- return {
403
- available: result.available,
404
- price: result.price,
405
- currency: result.currency,
406
- }
407
- }
408
- catch {
409
- return { available: false }
410
- }
411
- }
412
- }
package/src/dns/index.ts DELETED
@@ -1,183 +0,0 @@
1
- /**
2
- * DNS Provider Module
3
- * Unified DNS management for Route53, Porkbun, and GoDaddy
4
- */
5
-
6
- export * from './types'
7
- export { PorkbunProvider } from './porkbun'
8
- export { GoDaddyProvider } from './godaddy'
9
- export { Route53Provider } from './route53-adapter'
10
- export {
11
- UnifiedDnsValidator,
12
- createPorkbunValidator,
13
- createGoDaddyValidator,
14
- createRoute53Validator,
15
- } from './validator'
16
-
17
- import type { DnsProvider, DnsProviderConfig } from './types'
18
- import { GoDaddyProvider } from './godaddy'
19
- import { PorkbunProvider } from './porkbun'
20
- import { Route53Provider } from './route53-adapter'
21
-
22
- /**
23
- * Create a DNS provider from configuration
24
- */
25
- export function createDnsProvider(config: DnsProviderConfig): DnsProvider {
26
- switch (config.provider) {
27
- case 'route53':
28
- return new Route53Provider(config.region, config.hostedZoneId)
29
-
30
- case 'porkbun':
31
- return new PorkbunProvider(config.apiKey, config.secretKey)
32
-
33
- case 'godaddy':
34
- return new GoDaddyProvider(config.apiKey, config.apiSecret, config.environment)
35
-
36
- default:
37
- throw new Error(`Unknown DNS provider: ${(config as any).provider}`)
38
- }
39
- }
40
-
41
- /**
42
- * Auto-detect DNS provider for a domain
43
- * Tries each provider to see which one can manage the domain
44
- */
45
- export async function detectDnsProvider(
46
- domain: string,
47
- configs: DnsProviderConfig[],
48
- ): Promise<DnsProvider | null> {
49
- for (const config of configs) {
50
- const provider = createDnsProvider(config)
51
- if (await provider.canManageDomain(domain)) {
52
- return provider
53
- }
54
- }
55
- return null
56
- }
57
-
58
- /**
59
- * DNS Provider factory with environment variable support
60
- */
61
- export class DnsProviderFactory {
62
- private providers: Map<string, DnsProvider> = new Map()
63
- private configs: DnsProviderConfig[] = []
64
-
65
- /**
66
- * Add provider configuration
67
- */
68
- addConfig(config: DnsProviderConfig): this {
69
- this.configs.push(config)
70
- return this
71
- }
72
-
73
- /**
74
- * Add Route53 provider
75
- */
76
- addRoute53(region?: string, hostedZoneId?: string): this {
77
- this.configs.push({
78
- provider: 'route53',
79
- region,
80
- hostedZoneId,
81
- })
82
- return this
83
- }
84
-
85
- /**
86
- * Add Porkbun provider
87
- */
88
- addPorkbun(apiKey: string, secretKey: string): this {
89
- this.configs.push({
90
- provider: 'porkbun',
91
- apiKey,
92
- secretKey,
93
- })
94
- return this
95
- }
96
-
97
- /**
98
- * Add GoDaddy provider
99
- */
100
- addGoDaddy(apiKey: string, apiSecret: string, environment?: 'production' | 'ote'): this {
101
- this.configs.push({
102
- provider: 'godaddy',
103
- apiKey,
104
- apiSecret,
105
- environment,
106
- })
107
- return this
108
- }
109
-
110
- /**
111
- * Load providers from environment variables
112
- */
113
- loadFromEnv(): this {
114
- // Route53 (uses AWS credentials from environment)
115
- if (process.env.AWS_ACCESS_KEY_ID || process.env.AWS_REGION) {
116
- this.addRoute53(process.env.AWS_REGION)
117
- }
118
-
119
- // Porkbun
120
- const porkbunApiKey = process.env.PORKBUN_API_KEY
121
- const porkbunSecretKey = process.env.PORKBUN_SECRET_KEY
122
- if (porkbunApiKey && porkbunSecretKey) {
123
- this.addPorkbun(porkbunApiKey, porkbunSecretKey)
124
- }
125
-
126
- // GoDaddy
127
- const godaddyApiKey = process.env.GODADDY_API_KEY
128
- const godaddyApiSecret = process.env.GODADDY_API_SECRET
129
- if (godaddyApiKey && godaddyApiSecret) {
130
- const env = process.env.GODADDY_ENVIRONMENT as 'production' | 'ote' | undefined
131
- this.addGoDaddy(godaddyApiKey, godaddyApiSecret, env)
132
- }
133
-
134
- return this
135
- }
136
-
137
- /**
138
- * Get a provider by name
139
- */
140
- getProvider(name: 'route53' | 'porkbun' | 'godaddy'): DnsProvider | null {
141
- // Check cache
142
- const cached = this.providers.get(name)
143
- if (cached) {
144
- return cached
145
- }
146
-
147
- // Find config
148
- const config = this.configs.find(c => c.provider === name)
149
- if (!config) {
150
- return null
151
- }
152
-
153
- // Create and cache provider
154
- const provider = createDnsProvider(config)
155
- this.providers.set(name, provider)
156
- return provider
157
- }
158
-
159
- /**
160
- * Auto-detect provider for a domain
161
- */
162
- async getProviderForDomain(domain: string): Promise<DnsProvider | null> {
163
- for (const config of this.configs) {
164
- const provider = createDnsProvider(config)
165
- if (await provider.canManageDomain(domain)) {
166
- return provider
167
- }
168
- }
169
- return null
170
- }
171
-
172
- /**
173
- * Get all configured providers
174
- */
175
- getAllProviders(): DnsProvider[] {
176
- return this.configs.map(config => createDnsProvider(config))
177
- }
178
- }
179
-
180
- /**
181
- * Default factory instance (can be configured globally)
182
- */
183
- export const dnsProviders: DnsProviderFactory = new DnsProviderFactory()