gg-deploy 1.1.1 → 2.1.0

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 (46) hide show
  1. package/README.md +80 -5
  2. package/dist/cli.js +2 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/apply.d.ts.map +1 -1
  5. package/dist/commands/apply.js +16 -8
  6. package/dist/commands/apply.js.map +1 -1
  7. package/dist/commands/plan.d.ts.map +1 -1
  8. package/dist/commands/plan.js +16 -8
  9. package/dist/commands/plan.js.map +1 -1
  10. package/dist/commands/status.d.ts.map +1 -1
  11. package/dist/commands/status.js +15 -7
  12. package/dist/commands/status.js.map +1 -1
  13. package/dist/config.d.ts +16 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +34 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/lib/update-checker.d.ts +1 -1
  18. package/dist/lib/update-checker.js +1 -1
  19. package/dist/mcp-server.d.ts.map +1 -1
  20. package/dist/mcp-server.js +5 -4
  21. package/dist/mcp-server.js.map +1 -1
  22. package/dist/services/cloudflare.d.ts +16 -0
  23. package/dist/services/cloudflare.d.ts.map +1 -0
  24. package/dist/services/cloudflare.js +189 -0
  25. package/dist/services/cloudflare.js.map +1 -0
  26. package/dist/services/dns-factory.d.ts +8 -0
  27. package/dist/services/dns-factory.d.ts.map +1 -0
  28. package/dist/services/dns-factory.js +46 -0
  29. package/dist/services/dns-factory.js.map +1 -0
  30. package/dist/services/godaddy.d.ts +6 -6
  31. package/dist/services/godaddy.d.ts.map +1 -1
  32. package/dist/services/godaddy.js +70 -29
  33. package/dist/services/godaddy.js.map +1 -1
  34. package/dist/services/namecheap.d.ts +22 -0
  35. package/dist/services/namecheap.d.ts.map +1 -0
  36. package/dist/services/namecheap.js +215 -0
  37. package/dist/services/namecheap.js.map +1 -0
  38. package/dist/types.d.ts +21 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js +16 -1
  41. package/dist/types.js.map +1 -1
  42. package/dist/ui-server.d.ts.map +1 -1
  43. package/dist/ui-server.js +59 -1
  44. package/dist/ui-server.js.map +1 -1
  45. package/package.json +3 -1
  46. package/ui/dist/index.html +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/services/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA4BpF,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA6B;;IAe9C,OAAO,KAAK,OAAO,GAKlB;YAEa,SAAS;IAiBvB,OAAO,CAAC,cAAc;IA0ChB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+B1C,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA8BpC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAwBnD,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0ExE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQrD"}
@@ -0,0 +1,189 @@
1
+ import { DNSProviderError } from '../types.js';
2
+ import { getCloudflareConfig } from '../config.js';
3
+ const API_BASE = 'https://api.cloudflare.com/client/v4';
4
+ export class CloudflareService {
5
+ name = 'cloudflare';
6
+ apiToken;
7
+ zoneCache = new Map();
8
+ constructor() {
9
+ const config = getCloudflareConfig();
10
+ if (!config) {
11
+ throw new DNSProviderError('cloudflare', 'AUTH_ERROR', 'Cloudflare not configured. Add API token in settings.', 'Get API token from https://dash.cloudflare.com/profile/api-tokens');
12
+ }
13
+ this.apiToken = config.apiToken;
14
+ }
15
+ get headers() {
16
+ return {
17
+ Authorization: `Bearer ${this.apiToken}`,
18
+ 'Content-Type': 'application/json',
19
+ };
20
+ }
21
+ async withRetry(fn, maxRetries = 3) {
22
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
23
+ try {
24
+ return await fn();
25
+ }
26
+ catch (error) {
27
+ const isRetriable = error instanceof DNSProviderError && error.retriable;
28
+ if (isRetriable && attempt < maxRetries - 1) {
29
+ const delay = Math.pow(2, attempt) * 1000;
30
+ await new Promise(resolve => setTimeout(resolve, delay));
31
+ continue;
32
+ }
33
+ throw error;
34
+ }
35
+ }
36
+ throw new Error('Unexpected: retry loop completed without return or throw');
37
+ }
38
+ handleApiError(errors, context) {
39
+ const error = errors[0] || { code: 0, message: 'Unknown error' };
40
+ if (error.code === 6003 || error.code === 9109) {
41
+ throw new DNSProviderError('cloudflare', 'AUTH_ERROR', 'Invalid API token', 'Check your API token at dash.cloudflare.com/profile/api-tokens', false);
42
+ }
43
+ if (error.code === 1001 || error.code === 1049) {
44
+ throw new DNSProviderError('cloudflare', 'DOMAIN_NOT_FOUND', 'Zone not found', 'Verify the domain is added to your Cloudflare account', false);
45
+ }
46
+ if (error.code === 10000) {
47
+ throw new DNSProviderError('cloudflare', 'RATE_LIMITED', 'Rate limited by Cloudflare API', 'Wait a moment and try again', true);
48
+ }
49
+ throw new DNSProviderError('cloudflare', 'NETWORK_ERROR', `Cloudflare API error: ${error.message} (${error.code}) - ${context}`, undefined, false);
50
+ }
51
+ async getZoneId(domain) {
52
+ if (this.zoneCache.has(domain)) {
53
+ return this.zoneCache.get(domain);
54
+ }
55
+ return this.withRetry(async () => {
56
+ const res = await fetch(`${API_BASE}/zones?name=${domain}`, {
57
+ headers: this.headers,
58
+ });
59
+ const data = await res.json();
60
+ if (!data.success) {
61
+ this.handleApiError(data.errors, `getZoneId(${domain})`);
62
+ }
63
+ if (!data.result?.[0]?.id) {
64
+ throw new DNSProviderError('cloudflare', 'DOMAIN_NOT_FOUND', `Domain ${domain} not found in Cloudflare`, 'Add this domain to your Cloudflare account first', false);
65
+ }
66
+ const zoneId = data.result[0].id;
67
+ this.zoneCache.set(domain, zoneId);
68
+ return zoneId;
69
+ });
70
+ }
71
+ async listDomains() {
72
+ return this.withRetry(async () => {
73
+ const allZones = [];
74
+ let page = 1;
75
+ while (true) {
76
+ const res = await fetch(`${API_BASE}/zones?page=${page}&per_page=50`, {
77
+ headers: this.headers,
78
+ });
79
+ const data = await res.json();
80
+ if (!data.success) {
81
+ this.handleApiError(data.errors, 'listDomains');
82
+ }
83
+ allZones.push(...data.result);
84
+ if (!data.result_info || page >= data.result_info.total_pages) {
85
+ break;
86
+ }
87
+ page++;
88
+ }
89
+ return allZones.map(zone => ({
90
+ domain: zone.name,
91
+ status: zone.status.toUpperCase(),
92
+ }));
93
+ });
94
+ }
95
+ async getDNSRecords(domain) {
96
+ const zoneId = await this.getZoneId(domain);
97
+ return this.withRetry(async () => {
98
+ const res = await fetch(`${API_BASE}/zones/${zoneId}/dns_records`, {
99
+ headers: this.headers,
100
+ });
101
+ const data = await res.json();
102
+ if (!data.success) {
103
+ this.handleApiError(data.errors, `getDNSRecords(${domain})`);
104
+ }
105
+ return data.result
106
+ .filter(r => ['A', 'CNAME', 'TXT'].includes(r.type))
107
+ .map(r => ({
108
+ type: r.type,
109
+ name: r.name === domain ? '@' : r.name.replace(`.${domain}`, ''),
110
+ data: r.content,
111
+ ttl: r.ttl,
112
+ }));
113
+ });
114
+ }
115
+ async setGitHubPagesRecords(domain, githubUser) {
116
+ const zoneId = await this.getZoneId(domain);
117
+ await this.withRetry(async () => {
118
+ const existingRes = await fetch(`${API_BASE}/zones/${zoneId}/dns_records?type=A,CNAME`, {
119
+ headers: this.headers,
120
+ });
121
+ const existingData = await existingRes.json();
122
+ if (!existingData.success) {
123
+ this.handleApiError(existingData.errors, 'fetchExistingRecords');
124
+ }
125
+ const toDelete = existingData.result.filter(r => (r.type === 'A' && r.name === domain) ||
126
+ (r.type === 'CNAME' && r.name === `www.${domain}`));
127
+ for (const record of toDelete) {
128
+ const delRes = await fetch(`${API_BASE}/zones/${zoneId}/dns_records/${record.id}`, {
129
+ method: 'DELETE',
130
+ headers: this.headers,
131
+ });
132
+ if (!delRes.ok) {
133
+ const delData = await delRes.json();
134
+ if (!delData.success) {
135
+ this.handleApiError(delData.errors, `deleteRecord(${record.id})`);
136
+ }
137
+ }
138
+ }
139
+ const githubIPs = [
140
+ '185.199.108.153',
141
+ '185.199.109.153',
142
+ '185.199.110.153',
143
+ '185.199.111.153',
144
+ ];
145
+ for (const ip of githubIPs) {
146
+ const createRes = await fetch(`${API_BASE}/zones/${zoneId}/dns_records`, {
147
+ method: 'POST',
148
+ headers: this.headers,
149
+ body: JSON.stringify({
150
+ type: 'A',
151
+ name: '@',
152
+ content: ip,
153
+ ttl: 3600,
154
+ proxied: false,
155
+ }),
156
+ });
157
+ const createData = await createRes.json();
158
+ if (!createData.success) {
159
+ this.handleApiError(createData.errors, `createARecord(${ip})`);
160
+ }
161
+ }
162
+ const cnameRes = await fetch(`${API_BASE}/zones/${zoneId}/dns_records`, {
163
+ method: 'POST',
164
+ headers: this.headers,
165
+ body: JSON.stringify({
166
+ type: 'CNAME',
167
+ name: 'www',
168
+ content: `${githubUser}.github.io`,
169
+ ttl: 3600,
170
+ proxied: false,
171
+ }),
172
+ });
173
+ const cnameData = await cnameRes.json();
174
+ if (!cnameData.success) {
175
+ this.handleApiError(cnameData.errors, 'createCNAME');
176
+ }
177
+ });
178
+ }
179
+ async verifyDomain(domain) {
180
+ try {
181
+ const domains = await this.listDomains();
182
+ return domains.some(d => d.domain === domain && d.status === 'ACTIVE');
183
+ }
184
+ catch {
185
+ return false;
186
+ }
187
+ }
188
+ }
189
+ //# sourceMappingURL=cloudflare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/services/cloudflare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DNSProvider, ProviderName } from '../types.js';
2
+ export declare function detectProvider(): ProviderName | null;
3
+ export declare function createProvider(providerName?: ProviderName): DNSProvider;
4
+ export declare const DNSProviderFactory: {
5
+ detect: typeof detectProvider;
6
+ create: typeof createProvider;
7
+ };
8
+ //# sourceMappingURL=dns-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-factory.d.ts","sourceRoot":"","sources":["../../src/services/dns-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM7D,wBAAgB,cAAc,IAAI,YAAY,GAAG,IAAI,CAwBpD;AAED,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,WAAW,CAmBvE;AAED,eAAO,MAAM,kBAAkB;;;CAG9B,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { readConfig, getGoDaddyConfig, getCloudflareConfig, getNamecheapConfig } from '../config.js';
2
+ import { GoDaddyService } from './godaddy.js';
3
+ import { CloudflareService } from './cloudflare.js';
4
+ import { NamecheapService } from './namecheap.js';
5
+ export function detectProvider() {
6
+ const config = readConfig();
7
+ if (config.dnsProvider) {
8
+ return config.dnsProvider;
9
+ }
10
+ const providers = [];
11
+ if (getGoDaddyConfig())
12
+ providers.push('godaddy');
13
+ if (getCloudflareConfig())
14
+ providers.push('cloudflare');
15
+ if (getNamecheapConfig())
16
+ providers.push('namecheap');
17
+ if (providers.length === 0) {
18
+ return null;
19
+ }
20
+ if (providers.length === 1) {
21
+ return providers[0];
22
+ }
23
+ throw new Error(`Multiple DNS providers configured: ${providers.join(', ')}. ` +
24
+ `Please specify "dnsProvider" in ~/.gg-deploy/config.json`);
25
+ }
26
+ export function createProvider(providerName) {
27
+ const name = providerName ?? detectProvider();
28
+ if (!name) {
29
+ throw new Error('No DNS provider configured. Add credentials for GoDaddy, Cloudflare, or Namecheap in settings.');
30
+ }
31
+ switch (name) {
32
+ case 'godaddy':
33
+ return new GoDaddyService();
34
+ case 'cloudflare':
35
+ return new CloudflareService();
36
+ case 'namecheap':
37
+ return new NamecheapService();
38
+ default:
39
+ throw new Error(`Unknown DNS provider: ${name}`);
40
+ }
41
+ }
42
+ export const DNSProviderFactory = {
43
+ detect: detectProvider,
44
+ create: createProvider,
45
+ };
46
+ //# sourceMappingURL=dns-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-factory.js","sourceRoot":"","sources":["../../src/services/dns-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,IAAI,gBAAgB,EAAE;QAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,mBAAmB,EAAE;QAAE,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,kBAAkB,EAAE;QAAE,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEtD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC9D,0DAA0D,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,YAA2B;IACxD,MAAM,IAAI,GAAG,YAAY,IAAI,cAAc,EAAE,CAAC;IAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;IACJ,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChC;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,cAAc;CACvB,CAAC"}
@@ -1,14 +1,14 @@
1
- import type { DNSRecord } from '../types.js';
2
- export declare class GoDaddyService {
1
+ import type { DNSRecord, DNSProvider, DomainInfo, ProviderName } from '../types.js';
2
+ export declare class GoDaddyService implements DNSProvider {
3
+ readonly name: ProviderName;
3
4
  private apiKey;
4
5
  private apiSecret;
5
6
  private apiBase;
6
7
  constructor();
7
8
  private get headers();
8
- listDomains(): Promise<Array<{
9
- domain: string;
10
- status: string;
11
- }>>;
9
+ private withRetry;
10
+ private handleApiError;
11
+ listDomains(): Promise<DomainInfo[]>;
12
12
  getDNSRecords(domain: string): Promise<DNSRecord[]>;
13
13
  setGitHubPagesRecords(domain: string, githubUser: string): Promise<void>;
14
14
  verifyDomain(domain: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"godaddy.d.ts","sourceRoot":"","sources":["../../src/services/godaddy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;;IAYxB,OAAO,KAAK,OAAO,GAKlB;IAEK,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAMjE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQnD,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBxE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQrD"}
1
+ {"version":3,"file":"godaddy.d.ts","sourceRoot":"","sources":["../../src/services/godaddy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOpF,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAa;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;;IAiBxB,OAAO,KAAK,OAAO,GAKlB;YAEa,SAAS;IAiBvB,OAAO,CAAC,cAAc;IAqDhB,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQpC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAUnD,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBxE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQrD"}
@@ -1,14 +1,16 @@
1
+ import { DNSProviderError } from '../types.js';
1
2
  import { getGoDaddyConfig } from '../config.js';
2
3
  const API_BASE_PROD = 'https://api.godaddy.com/v1';
3
4
  const API_BASE_OTE = 'https://api.ote-godaddy.com/v1';
4
5
  export class GoDaddyService {
6
+ name = 'godaddy';
5
7
  apiKey;
6
8
  apiSecret;
7
9
  apiBase;
8
10
  constructor() {
9
11
  const config = getGoDaddyConfig();
10
12
  if (!config) {
11
- throw new Error('GoDaddy not configured. Add API credentials in settings.');
13
+ throw new DNSProviderError('godaddy', 'AUTH_ERROR', 'GoDaddy not configured. Add API credentials in settings.', 'Get API keys from https://developer.godaddy.com/keys');
12
14
  }
13
15
  this.apiKey = config.apiKey;
14
16
  this.apiSecret = config.apiSecret;
@@ -20,41 +22,80 @@ export class GoDaddyService {
20
22
  'Content-Type': 'application/json',
21
23
  };
22
24
  }
25
+ async withRetry(fn, maxRetries = 3) {
26
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
27
+ try {
28
+ return await fn();
29
+ }
30
+ catch (error) {
31
+ const isRetriable = error instanceof DNSProviderError && error.retriable;
32
+ if (isRetriable && attempt < maxRetries - 1) {
33
+ const delay = Math.pow(2, attempt) * 1000;
34
+ await new Promise(resolve => setTimeout(resolve, delay));
35
+ continue;
36
+ }
37
+ throw error;
38
+ }
39
+ }
40
+ throw new Error('Unexpected: retry loop completed without return or throw');
41
+ }
42
+ handleApiError(status, context) {
43
+ switch (status) {
44
+ case 401:
45
+ throw new DNSProviderError('godaddy', 'AUTH_ERROR', 'Invalid API credentials', 'Check your API key and secret at developer.godaddy.com', false);
46
+ case 403:
47
+ throw new DNSProviderError('godaddy', 'AUTH_ERROR', 'Access denied. Account may need 10+ domains for API access.', 'GoDaddy requires 10+ domains for API access. Consider using Cloudflare instead.', false);
48
+ case 404:
49
+ throw new DNSProviderError('godaddy', 'DOMAIN_NOT_FOUND', `Domain not found in your GoDaddy account`, 'Verify the domain is registered and active in your GoDaddy account', false);
50
+ case 422:
51
+ throw new DNSProviderError('godaddy', 'VALIDATION_ERROR', `Invalid request: ${context}`, 'Check that the domain is not locked or has pending transfers', false);
52
+ case 429:
53
+ throw new DNSProviderError('godaddy', 'RATE_LIMITED', 'Rate limited by GoDaddy API', 'Wait a moment and try again', true);
54
+ default:
55
+ throw new DNSProviderError('godaddy', 'NETWORK_ERROR', `GoDaddy API error: ${status} - ${context}`, undefined, status >= 500);
56
+ }
57
+ }
23
58
  async listDomains() {
24
- const res = await fetch(`${this.apiBase}/domains`, { headers: this.headers });
25
- if (!res.ok)
26
- throw new Error(`GoDaddy API error: ${res.status}`);
27
- return res.json();
59
+ return this.withRetry(async () => {
60
+ const res = await fetch(`${this.apiBase}/domains`, { headers: this.headers });
61
+ if (!res.ok)
62
+ this.handleApiError(res.status, 'listDomains');
63
+ return res.json();
64
+ });
28
65
  }
29
66
  async getDNSRecords(domain) {
30
- const res = await fetch(`${this.apiBase}/domains/${domain}/records`, {
31
- headers: this.headers,
67
+ return this.withRetry(async () => {
68
+ const res = await fetch(`${this.apiBase}/domains/${domain}/records`, {
69
+ headers: this.headers,
70
+ });
71
+ if (!res.ok)
72
+ this.handleApiError(res.status, `getDNSRecords(${domain})`);
73
+ return res.json();
32
74
  });
33
- if (!res.ok)
34
- throw new Error(`GoDaddy API error: ${res.status}`);
35
- return res.json();
36
75
  }
37
76
  async setGitHubPagesRecords(domain, githubUser) {
38
- const aRecords = [
39
- { data: '185.199.108.153', ttl: 600 },
40
- { data: '185.199.109.153', ttl: 600 },
41
- { data: '185.199.110.153', ttl: 600 },
42
- { data: '185.199.111.153', ttl: 600 },
43
- ];
44
- const aRes = await fetch(`${this.apiBase}/domains/${domain}/records/A/@`, {
45
- method: 'PUT',
46
- headers: this.headers,
47
- body: JSON.stringify(aRecords),
48
- });
49
- if (!aRes.ok)
50
- throw new Error(`Failed to set A records: ${aRes.status}`);
51
- const cnameRes = await fetch(`${this.apiBase}/domains/${domain}/records/CNAME/www`, {
52
- method: 'PUT',
53
- headers: this.headers,
54
- body: JSON.stringify([{ data: `${githubUser}.github.io`, ttl: 600 }]),
77
+ await this.withRetry(async () => {
78
+ const aRecords = [
79
+ { data: '185.199.108.153', ttl: 600 },
80
+ { data: '185.199.109.153', ttl: 600 },
81
+ { data: '185.199.110.153', ttl: 600 },
82
+ { data: '185.199.111.153', ttl: 600 },
83
+ ];
84
+ const aRes = await fetch(`${this.apiBase}/domains/${domain}/records/A/@`, {
85
+ method: 'PUT',
86
+ headers: this.headers,
87
+ body: JSON.stringify(aRecords),
88
+ });
89
+ if (!aRes.ok)
90
+ this.handleApiError(aRes.status, 'setARecords');
91
+ const cnameRes = await fetch(`${this.apiBase}/domains/${domain}/records/CNAME/www`, {
92
+ method: 'PUT',
93
+ headers: this.headers,
94
+ body: JSON.stringify([{ data: `${githubUser}.github.io`, ttl: 600 }]),
95
+ });
96
+ if (!cnameRes.ok)
97
+ this.handleApiError(cnameRes.status, 'setCNAME');
55
98
  });
56
- if (!cnameRes.ok)
57
- throw new Error(`Failed to set CNAME: ${cnameRes.status}`);
58
99
  }
59
100
  async verifyDomain(domain) {
60
101
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"godaddy.js","sourceRoot":"","sources":["../../src/services/godaddy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"godaddy.js","sourceRoot":"","sources":["../../src/services/godaddy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { DNSRecord, DNSProvider, DomainInfo, ProviderName } from '../types.js';
2
+ export declare class NamecheapService implements DNSProvider {
3
+ readonly name: ProviderName;
4
+ private apiUser;
5
+ private apiKey;
6
+ private clientIP;
7
+ constructor();
8
+ private splitDomain;
9
+ private buildUrl;
10
+ private withRetry;
11
+ private parseXmlSimple;
12
+ private parseXmlAttribute;
13
+ private parseHosts;
14
+ private checkApiErrors;
15
+ private backupRecords;
16
+ private isGitHubPagesRecord;
17
+ listDomains(): Promise<DomainInfo[]>;
18
+ getDNSRecords(domain: string): Promise<DNSRecord[]>;
19
+ setGitHubPagesRecords(domain: string, githubUser: string): Promise<void>;
20
+ verifyDomain(domain: string): Promise<boolean>;
21
+ }
22
+ //# sourceMappingURL=namecheap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namecheap.d.ts","sourceRoot":"","sources":["../../src/services/namecheap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiBpF,qBAAa,gBAAiB,YAAW,WAAW;IAClD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAe;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;;IAiBzB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,QAAQ;YAeF,SAAS;IAiBvB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,cAAc;YA8CR,aAAa;IAW3B,OAAO,CAAC,mBAAmB;IAmBrB,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAgBpC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsBnD,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCxE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQrD"}