gg-deploy 1.1.0 → 2.0.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.
- package/README.md +80 -5
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +16 -8
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +16 -8
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +15 -7
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +16 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -1
- package/dist/lib/update-checker.d.ts +1 -1
- package/dist/lib/update-checker.d.ts.map +1 -1
- package/dist/lib/update-checker.js +17 -16
- package/dist/lib/update-checker.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +5 -4
- package/dist/mcp-server.js.map +1 -1
- package/dist/services/cloudflare.d.ts +16 -0
- package/dist/services/cloudflare.d.ts.map +1 -0
- package/dist/services/cloudflare.js +189 -0
- package/dist/services/cloudflare.js.map +1 -0
- package/dist/services/dns-factory.d.ts +8 -0
- package/dist/services/dns-factory.d.ts.map +1 -0
- package/dist/services/dns-factory.js +46 -0
- package/dist/services/dns-factory.js.map +1 -0
- package/dist/services/godaddy.d.ts +6 -6
- package/dist/services/godaddy.d.ts.map +1 -1
- package/dist/services/godaddy.js +70 -29
- package/dist/services/godaddy.js.map +1 -1
- package/dist/services/namecheap.d.ts +22 -0
- package/dist/services/namecheap.d.ts.map +1 -0
- package/dist/services/namecheap.js +215 -0
- package/dist/services/namecheap.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +16 -1
- package/dist/types.js.map +1 -1
- package/dist/ui-server.d.ts.map +1 -1
- package/dist/ui-server.js +59 -1
- package/dist/ui-server.js.map +1 -1
- package/package.json +3 -1
- package/ui/dist/assets/index-BrlsVS_6.js +41 -0
- package/ui/dist/index.html +1 -1
- package/ui/dist/assets/index-DToZwAqb.js +0 -41
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { homedir } from 'os';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
4
5
|
import chalk from 'chalk';
|
|
5
|
-
const CURRENT_VERSION = '
|
|
6
|
+
const CURRENT_VERSION = '2.0.0';
|
|
6
7
|
const GITHUB_REPO = 'abe238/gg-deploy';
|
|
7
8
|
const CACHE_DIR = join(homedir(), '.gg-deploy');
|
|
8
9
|
const CACHE_FILE = join(CACHE_DIR, 'update-cache.json');
|
|
@@ -98,25 +99,25 @@ function writeCache(cache) {
|
|
|
98
99
|
// Can't write cache, ignore
|
|
99
100
|
}
|
|
100
101
|
}
|
|
102
|
+
function fetchWithCurl(url) {
|
|
103
|
+
try {
|
|
104
|
+
const result = execSync(`curl -sL -H "Accept: application/vnd.github.v3+json" -H "User-Agent: gg-deploy/${CURRENT_VERSION}" "${url}"`, { timeout: 5000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
101
111
|
async function fetchLatestRelease() {
|
|
102
112
|
try {
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
const res = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`, {
|
|
106
|
-
signal: controller.signal,
|
|
107
|
-
headers: {
|
|
108
|
-
'Accept': 'application/vnd.github.v3+json',
|
|
109
|
-
'User-Agent': `gg-deploy/${CURRENT_VERSION}`
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
clearTimeout(timeout);
|
|
113
|
-
if (!res.ok)
|
|
113
|
+
const data = fetchWithCurl(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`);
|
|
114
|
+
if (!data)
|
|
114
115
|
return null;
|
|
115
|
-
const
|
|
116
|
+
const json = JSON.parse(data);
|
|
116
117
|
return {
|
|
117
|
-
version:
|
|
118
|
-
url:
|
|
119
|
-
notes:
|
|
118
|
+
version: json.tag_name.replace(/^v/, ''),
|
|
119
|
+
url: json.html_url,
|
|
120
|
+
notes: json.body?.split('\n').slice(0, 3).join('\n') || null
|
|
120
121
|
};
|
|
121
122
|
}
|
|
122
123
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAmGvB,wBAAsB,cAAc,kBAGnC"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -6,12 +6,13 @@ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextpro
|
|
|
6
6
|
import { planCommand } from './commands/plan.js';
|
|
7
7
|
import { applyCommand } from './commands/apply.js';
|
|
8
8
|
import { statusCommand } from './commands/status.js';
|
|
9
|
-
|
|
9
|
+
import { CURRENT_VERSION } from './lib/update-checker.js';
|
|
10
|
+
const server = new Server({ name: 'gg-deploy', version: CURRENT_VERSION }, { capabilities: { tools: {} } });
|
|
10
11
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
11
12
|
tools: [
|
|
12
13
|
{
|
|
13
14
|
name: 'deploy_site_plan',
|
|
14
|
-
description: 'Preview
|
|
15
|
+
description: 'Preview DNS + GitHub Pages deployment without making changes. Supports GoDaddy, Cloudflare, and Namecheap. Safe to call anytime.',
|
|
15
16
|
inputSchema: {
|
|
16
17
|
type: 'object',
|
|
17
18
|
properties: {
|
|
@@ -23,7 +24,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
23
24
|
},
|
|
24
25
|
{
|
|
25
26
|
name: 'deploy_site_apply',
|
|
26
|
-
description: 'Execute
|
|
27
|
+
description: 'Execute DNS + GitHub Pages deployment. Configures DNS A records, CNAME, and enables GitHub Pages with custom domain. Supports GoDaddy, Cloudflare, and Namecheap.',
|
|
27
28
|
inputSchema: {
|
|
28
29
|
type: 'object',
|
|
29
30
|
properties: {
|
|
@@ -35,7 +36,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
35
36
|
},
|
|
36
37
|
{
|
|
37
38
|
name: 'deploy_site_status',
|
|
38
|
-
description: 'Check deployment health: DNS configuration, GitHub Pages status, SSL certificate state. Safe to call anytime.',
|
|
39
|
+
description: 'Check deployment health: DNS configuration, GitHub Pages status, SSL certificate state. Supports GoDaddy, Cloudflare, and Namecheap. Safe to call anytime.',
|
|
39
40
|
inputSchema: {
|
|
40
41
|
type: 'object',
|
|
41
42
|
properties: {
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DNSRecord, DNSProvider, DomainInfo, ProviderName } from '../types.js';
|
|
2
|
+
export declare class CloudflareService implements DNSProvider {
|
|
3
|
+
readonly name: ProviderName;
|
|
4
|
+
private apiToken;
|
|
5
|
+
private zoneCache;
|
|
6
|
+
constructor();
|
|
7
|
+
private get headers();
|
|
8
|
+
private withRetry;
|
|
9
|
+
private handleApiError;
|
|
10
|
+
getZoneId(domain: string): Promise<string>;
|
|
11
|
+
listDomains(): Promise<DomainInfo[]>;
|
|
12
|
+
getDNSRecords(domain: string): Promise<DNSRecord[]>;
|
|
13
|
+
setGitHubPagesRecords(domain: string, githubUser: string): Promise<void>;
|
|
14
|
+
verifyDomain(domain: string): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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;
|
|
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"}
|
package/dist/services/godaddy.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,aAAa,GAAG,4BAA4B,CAAC;AACnD,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAEtD,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"godaddy.js","sourceRoot":"","sources":["../../src/services/godaddy.ts"],"names":[],"mappings":"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"}
|