dominion-cli 0.1.1 → 0.2.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/dist/cli.js +13 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/account.d.ts +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +6 -9
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/billing.d.ts +1 -1
- package/dist/commands/billing.d.ts.map +1 -1
- package/dist/commands/billing.js +3 -7
- package/dist/commands/billing.js.map +1 -1
- package/dist/commands/buy.d.ts +7 -7
- package/dist/commands/buy.d.ts.map +1 -1
- package/dist/commands/buy.js +45 -141
- package/dist/commands/buy.js.map +1 -1
- package/dist/commands/cart/add.d.ts +1 -1
- package/dist/commands/cart/add.d.ts.map +1 -1
- package/dist/commands/cart/add.js +9 -8
- package/dist/commands/cart/add.js.map +1 -1
- package/dist/commands/credits.js +1 -1
- package/dist/commands/dns/add.d.ts +3 -3
- package/dist/commands/dns/add.d.ts.map +1 -1
- package/dist/commands/dns/add.js +3 -3
- package/dist/commands/dns/add.js.map +1 -1
- package/dist/commands/dns/list.d.ts +3 -3
- package/dist/commands/dns/list.d.ts.map +1 -1
- package/dist/commands/dns/list.js +3 -3
- package/dist/commands/dns/list.js.map +1 -1
- package/dist/commands/dns/remove.d.ts +3 -3
- package/dist/commands/dns/remove.d.ts.map +1 -1
- package/dist/commands/dns/remove.js +3 -3
- package/dist/commands/dns/remove.js.map +1 -1
- package/dist/commands/domains/detail.d.ts +1 -1
- package/dist/commands/domains/detail.js +3 -3
- package/dist/commands/domains/detail.js.map +1 -1
- package/dist/commands/domains/list.d.ts +1 -1
- package/dist/commands/domains/list.js +3 -3
- package/dist/commands/domains/list.js.map +1 -1
- package/dist/commands/login.d.ts +6 -6
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +58 -42
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/search.d.ts +2 -2
- package/dist/commands/search.js +4 -4
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/settings/set.d.ts +4 -4
- package/dist/commands/settings/set.d.ts.map +1 -1
- package/dist/commands/settings/set.js +10 -11
- package/dist/commands/settings/set.js.map +1 -1
- package/dist/commands/settings/view.d.ts +3 -3
- package/dist/commands/settings/view.d.ts.map +1 -1
- package/dist/commands/settings/view.js +4 -4
- package/dist/commands/settings/view.js.map +1 -1
- package/dist/commands/vercel/link.d.ts +4 -4
- package/dist/commands/vercel/link.d.ts.map +1 -1
- package/dist/commands/vercel/link.js +8 -8
- package/dist/commands/vercel/link.js.map +1 -1
- package/dist/commands/whoami.d.ts +1 -1
- package/dist/commands/whoami.js +3 -3
- package/dist/commands/whoami.js.map +1 -1
- package/dist/components/account-card.d.ts +3 -3
- package/dist/components/account-card.d.ts.map +1 -1
- package/dist/components/account-card.js +3 -3
- package/dist/components/account-card.js.map +1 -1
- package/dist/components/command-runner.d.ts +25 -0
- package/dist/components/command-runner.d.ts.map +1 -0
- package/dist/components/command-runner.js +67 -0
- package/dist/components/command-runner.js.map +1 -0
- package/dist/components/prompt.d.ts +24 -0
- package/dist/components/prompt.d.ts.map +1 -0
- package/dist/components/prompt.js +113 -0
- package/dist/components/prompt.js.map +1 -0
- package/dist/components/search-results.d.ts +1 -1
- package/dist/components/search-results.js +1 -1
- package/dist/lib/auth.d.ts +17 -9
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +125 -46
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/command-registry.d.ts +47 -0
- package/dist/lib/command-registry.d.ts.map +1 -0
- package/dist/lib/command-registry.js +384 -0
- package/dist/lib/command-registry.js.map +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +0 -8
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/dns-validation.d.ts +1 -1
- package/dist/lib/dns-validation.d.ts.map +1 -1
- package/dist/lib/dns-validation.js +2 -2
- package/dist/lib/dns-validation.js.map +1 -1
- package/dist/lib/dominion-client.d.ts +43 -0
- package/dist/lib/dominion-client.d.ts.map +1 -0
- package/dist/lib/dominion-client.js +183 -0
- package/dist/lib/dominion-client.js.map +1 -0
- package/dist/lib/error-personality.js +7 -7
- package/dist/lib/error-personality.js.map +1 -1
- package/dist/lib/history.d.ts +40 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +113 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/nameserver-presets.js +4 -4
- package/dist/lib/nameserver-presets.js.map +1 -1
- package/dist/lib/purchase.d.ts +20 -23
- package/dist/lib/purchase.d.ts.map +1 -1
- package/dist/lib/purchase.js +42 -70
- package/dist/lib/purchase.js.map +1 -1
- package/dist/lib/schemas.d.ts +351 -352
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +1 -2
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/types.d.ts +8 -11
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +1 -4
- package/dist/lib/types.js.map +1 -1
- package/dist/repl.d.ts +17 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +189 -0
- package/dist/repl.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dominion API client.
|
|
3
|
+
*
|
|
4
|
+
* Calls the dominion.sh API.
|
|
5
|
+
* All prices returned include markup — the CLI never sees wholesale.
|
|
6
|
+
* Auth via Bearer token stored in ~/.dominion/config.json.
|
|
7
|
+
*/
|
|
8
|
+
import { DomainError } from "./types.js";
|
|
9
|
+
import { ConfigManager } from "./config.js";
|
|
10
|
+
// ─── Client ──────────────────────────────────────────────────────────────────
|
|
11
|
+
const DEFAULT_BASE_URL = "https://dominion.sh/api";
|
|
12
|
+
export class DominionClient {
|
|
13
|
+
baseUrl;
|
|
14
|
+
token;
|
|
15
|
+
/**
|
|
16
|
+
* Credentials resolved in order:
|
|
17
|
+
* 1. Explicit config parameter
|
|
18
|
+
* 2. ConfigManager (~/.dominion/config.json)
|
|
19
|
+
* 3. DOMINION_API_KEY env var
|
|
20
|
+
*/
|
|
21
|
+
constructor(config) {
|
|
22
|
+
let token = config?.token;
|
|
23
|
+
if (!token) {
|
|
24
|
+
const configManager = new ConfigManager();
|
|
25
|
+
const stored = configManager.load();
|
|
26
|
+
if (stored.auth?.token) {
|
|
27
|
+
token = stored.auth.token;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
token = token ?? process.env.DOMINION_API_KEY;
|
|
31
|
+
if (!token) {
|
|
32
|
+
throw new DomainError("AUTH_ERROR", "Not authenticated. Run `dominion login` or `dominion register` first.");
|
|
33
|
+
}
|
|
34
|
+
this.token = token;
|
|
35
|
+
this.baseUrl = config?.baseUrl ?? process.env.DOMINION_API_URL ?? DEFAULT_BASE_URL;
|
|
36
|
+
}
|
|
37
|
+
// ─── Domain Search ───────────────────────────────────────────────────────
|
|
38
|
+
async searchDomains(query, _tlds) {
|
|
39
|
+
const data = await this.request("GET", `/domains/search?query=${encodeURIComponent(query)}`);
|
|
40
|
+
const results = data.results ?? [];
|
|
41
|
+
return results.map((r) => ({
|
|
42
|
+
domainName: r.domain,
|
|
43
|
+
sld: r.domain.split(".")[0],
|
|
44
|
+
tld: r.domain.split(".").slice(1).join("."),
|
|
45
|
+
purchasable: r.available,
|
|
46
|
+
premium: r.premium ?? false,
|
|
47
|
+
purchasePrice: Math.round(r.price * 100), // API returns dollars, convert to cents for CLI
|
|
48
|
+
purchaseType: "registration",
|
|
49
|
+
renewalPrice: Math.round(r.price * 100),
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
// ─── Domain Management ───────────────────────────────────────────────────
|
|
53
|
+
async getDomain(domain) {
|
|
54
|
+
const data = await this.request("GET", `/domains/${domain}/settings`);
|
|
55
|
+
const d = data;
|
|
56
|
+
return {
|
|
57
|
+
domainName: d.domain,
|
|
58
|
+
nameservers: d.nameservers ?? [],
|
|
59
|
+
contacts: { registrant: {}, admin: {}, tech: {}, billing: {} },
|
|
60
|
+
privacyEnabled: true,
|
|
61
|
+
locked: d.locked ?? false,
|
|
62
|
+
autoRenewEnabled: d.autoRenew ?? false,
|
|
63
|
+
expireDate: d.expireDate ?? "",
|
|
64
|
+
createDate: "",
|
|
65
|
+
renewalPrice: 0,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async listDomains() {
|
|
69
|
+
const data = await this.request("GET", "/domains/list");
|
|
70
|
+
const d = data;
|
|
71
|
+
const domains = (d.domains ?? []).map((item) => ({
|
|
72
|
+
domainName: item.domain ?? "",
|
|
73
|
+
nameservers: [],
|
|
74
|
+
contacts: { registrant: {}, admin: {}, tech: {}, billing: {} },
|
|
75
|
+
privacyEnabled: true,
|
|
76
|
+
locked: false,
|
|
77
|
+
autoRenewEnabled: item.autoRenew ?? false,
|
|
78
|
+
expireDate: item.expiresAt ?? "",
|
|
79
|
+
createDate: item.createdAt ?? "",
|
|
80
|
+
renewalPrice: 0,
|
|
81
|
+
}));
|
|
82
|
+
return { domains };
|
|
83
|
+
}
|
|
84
|
+
async listDomainsAllPages() {
|
|
85
|
+
const response = await this.listDomains();
|
|
86
|
+
return response.domains ?? [];
|
|
87
|
+
}
|
|
88
|
+
async setNameservers(domain, nameservers) {
|
|
89
|
+
const data = await this.request("POST", `/domains/${domain}/nameservers`, { nameservers });
|
|
90
|
+
const d = data;
|
|
91
|
+
return {
|
|
92
|
+
domainName: d.domain ?? domain,
|
|
93
|
+
nameservers: d.nameservers ?? nameservers,
|
|
94
|
+
contacts: { registrant: {}, admin: {}, tech: {}, billing: {} },
|
|
95
|
+
privacyEnabled: true,
|
|
96
|
+
locked: false,
|
|
97
|
+
autoRenewEnabled: false,
|
|
98
|
+
expireDate: "",
|
|
99
|
+
createDate: "",
|
|
100
|
+
renewalPrice: 0,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ─── DNS Records ─────────────────────────────────────────────────────────
|
|
104
|
+
async createDnsRecord(domain, record) {
|
|
105
|
+
const data = await this.request("POST", `/domains/${domain}/dns`, record);
|
|
106
|
+
const r = data.record;
|
|
107
|
+
return r;
|
|
108
|
+
}
|
|
109
|
+
async listDnsRecords(domain) {
|
|
110
|
+
const data = await this.request("GET", `/domains/${domain}/dns`);
|
|
111
|
+
return {
|
|
112
|
+
records: data.records ?? [],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async deleteDnsRecord(domain, id) {
|
|
116
|
+
await this.request("DELETE", `/domains/${domain}/dns/${id}`);
|
|
117
|
+
}
|
|
118
|
+
// ─── Renewal ─────────────────────────────────────────────────────────────
|
|
119
|
+
async renewDomain(domain, _purchasePrice) {
|
|
120
|
+
const data = await this.request("POST", `/domains/${domain}/renew`);
|
|
121
|
+
const d = data;
|
|
122
|
+
return {
|
|
123
|
+
domain: { domainName: domain },
|
|
124
|
+
order: 0,
|
|
125
|
+
totalPaid: 0,
|
|
126
|
+
checkoutUrl: d.url,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// ─── Checkout ─────────────────────────────────────────────────────────
|
|
130
|
+
async createCheckout(domains) {
|
|
131
|
+
const data = await this.request("POST", "/domains/checkout", { domains });
|
|
132
|
+
return { url: data.url };
|
|
133
|
+
}
|
|
134
|
+
// ─── HTTP Layer ──────────────────────────────────────────────────────────
|
|
135
|
+
async request(method, path, body) {
|
|
136
|
+
const url = `${this.baseUrl}${path}`;
|
|
137
|
+
const headers = {
|
|
138
|
+
Authorization: `Bearer ${this.token}`,
|
|
139
|
+
"Content-Type": "application/json",
|
|
140
|
+
Accept: "application/json",
|
|
141
|
+
};
|
|
142
|
+
const init = { method, headers };
|
|
143
|
+
if (body !== undefined && method !== "GET" && method !== "DELETE") {
|
|
144
|
+
init.body = JSON.stringify(body);
|
|
145
|
+
}
|
|
146
|
+
let response;
|
|
147
|
+
try {
|
|
148
|
+
response = await fetch(url, init);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
throw new DomainError("NETWORK_ERROR", `Failed to connect to Dominion API: ${err.message}`, { url, method });
|
|
152
|
+
}
|
|
153
|
+
if (response.status === 204) {
|
|
154
|
+
return {};
|
|
155
|
+
}
|
|
156
|
+
let data;
|
|
157
|
+
try {
|
|
158
|
+
data = await response.json();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
throw new DomainError("API_ERROR", `Invalid response from Dominion API (${response.status})`, { url, method, status: response.status }, response.status);
|
|
162
|
+
}
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
this.handleApiError(response.status, data);
|
|
165
|
+
}
|
|
166
|
+
return data;
|
|
167
|
+
}
|
|
168
|
+
handleApiError(status, data) {
|
|
169
|
+
const errorData = data;
|
|
170
|
+
const message = errorData?.error ?? `API error (${status})`;
|
|
171
|
+
if (status === 401 || status === 403) {
|
|
172
|
+
throw new DomainError("AUTH_ERROR", `Authentication failed. Run \`dominion login\` to re-authenticate.`, {}, status);
|
|
173
|
+
}
|
|
174
|
+
if (status === 404) {
|
|
175
|
+
throw new DomainError("DOMAIN_NOT_FOUND", message, {}, status);
|
|
176
|
+
}
|
|
177
|
+
if (status === 429) {
|
|
178
|
+
throw new DomainError("RATE_LIMITED", "Rate limit exceeded. Please try again later.", {}, status);
|
|
179
|
+
}
|
|
180
|
+
throw new DomainError("API_ERROR", message, { statusCode: status }, status);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=dominion-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dominion-client.js","sourceRoot":"","sources":["../../src/lib/dominion-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,7 +76,7 @@ const PERSONALITIES = {
|
|
|
76
76
|
code: "AUTH_ERROR",
|
|
77
77
|
icon: "🔒",
|
|
78
78
|
characterMessage: "The gates are sealed.",
|
|
79
|
-
suggestion: "
|
|
79
|
+
suggestion: "Run `dominion login` to re-authenticate, or `dominion register` to create an account.",
|
|
80
80
|
art: LOCK_ART,
|
|
81
81
|
color: "red",
|
|
82
82
|
},
|
|
@@ -84,7 +84,7 @@ const PERSONALITIES = {
|
|
|
84
84
|
code: "RATE_LIMITED",
|
|
85
85
|
icon: "⌛",
|
|
86
86
|
characterMessage: "The domain gods need a moment.",
|
|
87
|
-
suggestion: "You've hit the
|
|
87
|
+
suggestion: "You've hit the rate limit. Wait a few seconds and try again.",
|
|
88
88
|
art: HOURGLASS_ART,
|
|
89
89
|
color: "yellow",
|
|
90
90
|
},
|
|
@@ -108,7 +108,7 @@ const PERSONALITIES = {
|
|
|
108
108
|
code: "REGISTRATION_FAILED",
|
|
109
109
|
icon: "💥",
|
|
110
110
|
characterMessage: "The registration ritual has failed.",
|
|
111
|
-
suggestion: "
|
|
111
|
+
suggestion: "The domain may have been taken between search and purchase. Try again or choose a different domain.",
|
|
112
112
|
art: EXPLOSION_ART,
|
|
113
113
|
color: "red",
|
|
114
114
|
},
|
|
@@ -124,7 +124,7 @@ const PERSONALITIES = {
|
|
|
124
124
|
code: "RENEWAL_FAILED",
|
|
125
125
|
icon: "📅",
|
|
126
126
|
characterMessage: "Time waits for no domain.",
|
|
127
|
-
suggestion: "
|
|
127
|
+
suggestion: "Ensure the domain is eligible for renewal and try again.",
|
|
128
128
|
art: WARNING_ART,
|
|
129
129
|
color: "yellow",
|
|
130
130
|
},
|
|
@@ -145,8 +145,8 @@ const PERSONALITIES = {
|
|
|
145
145
|
API_ERROR: {
|
|
146
146
|
code: "API_ERROR",
|
|
147
147
|
icon: "🔌",
|
|
148
|
-
characterMessage: "The
|
|
149
|
-
suggestion: "This may be a temporary issue. Wait a moment and retry. If it persists,
|
|
148
|
+
characterMessage: "The servers aren't cooperating.",
|
|
149
|
+
suggestion: "This may be a temporary issue. Wait a moment and retry. If it persists, contact support at dominion.sh/support.",
|
|
150
150
|
art: BROKEN_PIPE_ART,
|
|
151
151
|
color: "red",
|
|
152
152
|
},
|
|
@@ -154,7 +154,7 @@ const PERSONALITIES = {
|
|
|
154
154
|
code: "NETWORK_ERROR",
|
|
155
155
|
icon: "📡",
|
|
156
156
|
characterMessage: "Lost connection to the domain dimension.",
|
|
157
|
-
suggestion: "Check your internet connection
|
|
157
|
+
suggestion: "Check your internet connection and try again.",
|
|
158
158
|
art: BROKEN_PIPE_ART,
|
|
159
159
|
color: "red",
|
|
160
160
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-personality.js","sourceRoot":"","sources":["../../src/lib/error-personality.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,gFAAgF;AAEhF,MAAM,QAAQ,GAAG;;;;;;;;;CAShB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;CAUrB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;CAQnB,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;CAOvB,CAAC;AAEF,MAAM,UAAU,GAAG;;;;;;;;;;;;;CAalB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;CAMrB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;CAMnB,CAAC;AAmBF,MAAM,aAAa,GAA8C;IAC/D,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,IAAI;QACV,gBAAgB,EAAE,uBAAuB;QACzC,UAAU,EACR,
|
|
1
|
+
{"version":3,"file":"error-personality.js","sourceRoot":"","sources":["../../src/lib/error-personality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HistoryManager — persistent command history for REPL mode.
|
|
3
|
+
*
|
|
4
|
+
* Stores history at ~/.dominion/history.json with up/down navigation.
|
|
5
|
+
* Max 500 entries, consecutive duplicates deduplicated.
|
|
6
|
+
*/
|
|
7
|
+
export declare class HistoryManager {
|
|
8
|
+
private readonly historyPath;
|
|
9
|
+
private entries;
|
|
10
|
+
private cursor;
|
|
11
|
+
constructor(configDir?: string);
|
|
12
|
+
/**
|
|
13
|
+
* Add an entry to history (persisted immediately).
|
|
14
|
+
* Skips exit/quit/clear commands and consecutive duplicates.
|
|
15
|
+
*/
|
|
16
|
+
add(command: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Navigate up in history (older entries). Returns entry or null if at start.
|
|
19
|
+
*/
|
|
20
|
+
navigateUp(): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Navigate down in history (newer entries). Returns entry or null if past end.
|
|
23
|
+
*/
|
|
24
|
+
navigateDown(): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Reset cursor to end of history (called after adding or submitting).
|
|
27
|
+
*/
|
|
28
|
+
resetCursor(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get all history entries.
|
|
31
|
+
*/
|
|
32
|
+
getEntries(): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Get the number of entries.
|
|
35
|
+
*/
|
|
36
|
+
get length(): number;
|
|
37
|
+
private load;
|
|
38
|
+
private save;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAEX,SAAS,CAAC,EAAE,MAAM;IAO9B;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAyB1B;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAM3B;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAS7B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,IAAI;CAUb"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HistoryManager — persistent command history for REPL mode.
|
|
3
|
+
*
|
|
4
|
+
* Stores history at ~/.dominion/history.json with up/down navigation.
|
|
5
|
+
* Max 500 entries, consecutive duplicates deduplicated.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
const DOMINION_DIR = join(homedir(), ".dominion");
|
|
11
|
+
const MAX_ENTRIES = 500;
|
|
12
|
+
/** Commands that should not be saved to history. */
|
|
13
|
+
const SKIP_COMMANDS = new Set(["exit", "quit", "q", "clear"]);
|
|
14
|
+
export class HistoryManager {
|
|
15
|
+
historyPath;
|
|
16
|
+
entries;
|
|
17
|
+
cursor;
|
|
18
|
+
constructor(configDir) {
|
|
19
|
+
const dir = configDir ?? DOMINION_DIR;
|
|
20
|
+
this.historyPath = join(dir, "history.json");
|
|
21
|
+
this.entries = this.load();
|
|
22
|
+
this.cursor = this.entries.length;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Add an entry to history (persisted immediately).
|
|
26
|
+
* Skips exit/quit/clear commands and consecutive duplicates.
|
|
27
|
+
*/
|
|
28
|
+
add(command) {
|
|
29
|
+
const trimmed = command.trim();
|
|
30
|
+
if (!trimmed)
|
|
31
|
+
return;
|
|
32
|
+
// Skip meta commands
|
|
33
|
+
const firstWord = trimmed.split(/\s+/)[0].toLowerCase();
|
|
34
|
+
if (SKIP_COMMANDS.has(firstWord))
|
|
35
|
+
return;
|
|
36
|
+
// Skip consecutive duplicates
|
|
37
|
+
if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {
|
|
38
|
+
this.resetCursor();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.entries.push(trimmed);
|
|
42
|
+
// Trim to max
|
|
43
|
+
if (this.entries.length > MAX_ENTRIES) {
|
|
44
|
+
this.entries = this.entries.slice(-MAX_ENTRIES);
|
|
45
|
+
}
|
|
46
|
+
this.save();
|
|
47
|
+
this.resetCursor();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Navigate up in history (older entries). Returns entry or null if at start.
|
|
51
|
+
*/
|
|
52
|
+
navigateUp() {
|
|
53
|
+
if (this.cursor <= 0)
|
|
54
|
+
return null;
|
|
55
|
+
this.cursor--;
|
|
56
|
+
return this.entries[this.cursor] ?? null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Navigate down in history (newer entries). Returns entry or null if past end.
|
|
60
|
+
*/
|
|
61
|
+
navigateDown() {
|
|
62
|
+
if (this.cursor >= this.entries.length - 1) {
|
|
63
|
+
this.cursor = this.entries.length;
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
this.cursor++;
|
|
67
|
+
return this.entries[this.cursor] ?? null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Reset cursor to end of history (called after adding or submitting).
|
|
71
|
+
*/
|
|
72
|
+
resetCursor() {
|
|
73
|
+
this.cursor = this.entries.length;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get all history entries.
|
|
77
|
+
*/
|
|
78
|
+
getEntries() {
|
|
79
|
+
return [...this.entries];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the number of entries.
|
|
83
|
+
*/
|
|
84
|
+
get length() {
|
|
85
|
+
return this.entries.length;
|
|
86
|
+
}
|
|
87
|
+
load() {
|
|
88
|
+
try {
|
|
89
|
+
if (!existsSync(this.historyPath))
|
|
90
|
+
return [];
|
|
91
|
+
const raw = readFileSync(this.historyPath, "utf-8");
|
|
92
|
+
const parsed = JSON.parse(raw);
|
|
93
|
+
if (Array.isArray(parsed))
|
|
94
|
+
return parsed.filter((e) => typeof e === "string");
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
save() {
|
|
102
|
+
try {
|
|
103
|
+
if (!existsSync(DOMINION_DIR)) {
|
|
104
|
+
mkdirSync(DOMINION_DIR, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
writeFileSync(this.historyPath, JSON.stringify(this.entries), "utf-8");
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Best-effort persistence — never block the REPL
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,16 +11,16 @@ export const NAMESERVER_PRESETS = {
|
|
|
11
11
|
nameservers: ["ns1.vercel-dns.com", "ns2.vercel-dns.com"],
|
|
12
12
|
description: "Vercel DNS — auto-provisions SSL, optimized for Vercel deployments",
|
|
13
13
|
},
|
|
14
|
-
|
|
15
|
-
name: "
|
|
16
|
-
label: "
|
|
14
|
+
default: {
|
|
15
|
+
name: "default",
|
|
16
|
+
label: "Default",
|
|
17
17
|
nameservers: [
|
|
18
18
|
"ns1.name.com",
|
|
19
19
|
"ns2.name.com",
|
|
20
20
|
"ns3.name.com",
|
|
21
21
|
"ns4.name.com",
|
|
22
22
|
],
|
|
23
|
-
description: "
|
|
23
|
+
description: "Default nameservers",
|
|
24
24
|
},
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nameserver-presets.js","sourceRoot":"","sources":["../../src/lib/nameserver-presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QACzD,WAAW,EAAE,oEAAoE;KAClF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"nameserver-presets.js","sourceRoot":"","sources":["../../src/lib/nameserver-presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QACzD,WAAW,EAAE,oEAAoE;KAClF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE;YACX,cAAc;YACd,cAAc;YACd,cAAc;YACd,cAAc;SACf;QACD,WAAW,EAAE,qBAAqB;KACnC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,kBAAkB,CAAC;AAClD,CAAC"}
|
package/dist/lib/purchase.d.ts
CHANGED
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Purchase flow logic for domain
|
|
2
|
+
* Purchase flow logic for domain checkout.
|
|
3
3
|
*
|
|
4
4
|
* Handles the end-to-end purchase process:
|
|
5
|
-
* 1.
|
|
6
|
-
* 2.
|
|
7
|
-
* 3.
|
|
8
|
-
* 4. Clear purchased domains from cart
|
|
5
|
+
* 1. Build cart summary with prices
|
|
6
|
+
* 2. Create Stripe Checkout session via Dominion API
|
|
7
|
+
* 3. Open checkout URL in browser
|
|
8
|
+
* 4. Clear purchased domains from cart after user confirms
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* exactly what checkAvailability returns (Name.com anti-fraud measure).
|
|
10
|
+
* All prices include markup (applied server-side by Dominion API).
|
|
12
11
|
*/
|
|
13
|
-
import {
|
|
12
|
+
import { DominionClient } from "./dominion-client.js";
|
|
14
13
|
import { ConfigManager } from "./config.js";
|
|
15
14
|
import { CartManager, type CartItem } from "./cart.js";
|
|
16
|
-
import type { ContactInfo
|
|
15
|
+
import type { ContactInfo } from "./types.js";
|
|
17
16
|
export interface PurchaseItem {
|
|
18
17
|
domain: string;
|
|
19
18
|
price: number;
|
|
20
19
|
premium: boolean;
|
|
21
|
-
verifiedPrice?: number;
|
|
22
20
|
}
|
|
23
21
|
export interface PurchaseResult {
|
|
24
22
|
domain: string;
|
|
25
23
|
success: boolean;
|
|
26
|
-
|
|
24
|
+
checkoutUrl?: string;
|
|
27
25
|
error?: string;
|
|
28
26
|
errorCode?: string;
|
|
29
27
|
}
|
|
@@ -45,21 +43,20 @@ export declare function saveContactInfo(contactInfo: ContactInfo, configManager?
|
|
|
45
43
|
*/
|
|
46
44
|
export declare function loadContactInfo(configManager?: ConfigManager): ContactInfo | undefined;
|
|
47
45
|
/**
|
|
48
|
-
*
|
|
49
|
-
* Returns the
|
|
46
|
+
* Create a Stripe Checkout session for the given domains.
|
|
47
|
+
* Returns the checkout URL to open in the browser.
|
|
50
48
|
*/
|
|
51
|
-
export declare function
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
export declare function createCheckout(domains: Array<{
|
|
50
|
+
domain: string;
|
|
51
|
+
price: number;
|
|
52
|
+
}>, client?: DominionClient): Promise<{
|
|
53
|
+
url: string;
|
|
54
|
+
}>;
|
|
57
55
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* Clears successful purchases from cart.
|
|
56
|
+
* Create checkout for all domains in the cart.
|
|
57
|
+
* Returns the Stripe Checkout URL.
|
|
61
58
|
*/
|
|
62
|
-
export declare function
|
|
59
|
+
export declare function checkoutCart(cartManager?: CartManager, client?: DominionClient): Promise<PurchaseResult>;
|
|
63
60
|
/**
|
|
64
61
|
* Build a purchase summary from cart items.
|
|
65
62
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/lib/purchase.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/lib/purchase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAerE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,aAAa,CAAC,EAAE,aAAa,GAC5B,IAAI,CAGN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,aAAa,CAAC,EAAE,aAAa,GAC5B,WAAW,GAAG,SAAS,CAIzB;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ1B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,CAAC,EAAE,WAAW,EACzB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAWnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAc7D"}
|