dominion-cli 0.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 (298) hide show
  1. package/README.md +304 -0
  2. package/dist/app.d.ts +15 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +36 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +369 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/account.d.ts +28 -0
  11. package/dist/commands/account.d.ts.map +1 -0
  12. package/dist/commands/account.js +133 -0
  13. package/dist/commands/account.js.map +1 -0
  14. package/dist/commands/billing.d.ts +16 -0
  15. package/dist/commands/billing.d.ts.map +1 -0
  16. package/dist/commands/billing.js +61 -0
  17. package/dist/commands/billing.js.map +1 -0
  18. package/dist/commands/buy.d.ts +27 -0
  19. package/dist/commands/buy.d.ts.map +1 -0
  20. package/dist/commands/buy.js +293 -0
  21. package/dist/commands/buy.js.map +1 -0
  22. package/dist/commands/cart/add.d.ts +17 -0
  23. package/dist/commands/cart/add.d.ts.map +1 -0
  24. package/dist/commands/cart/add.js +119 -0
  25. package/dist/commands/cart/add.js.map +1 -0
  26. package/dist/commands/cart/clear.d.ts +12 -0
  27. package/dist/commands/cart/clear.d.ts.map +1 -0
  28. package/dist/commands/cart/clear.js +49 -0
  29. package/dist/commands/cart/clear.js.map +1 -0
  30. package/dist/commands/cart/index.d.ts +8 -0
  31. package/dist/commands/cart/index.d.ts.map +1 -0
  32. package/dist/commands/cart/index.js +8 -0
  33. package/dist/commands/cart/index.js.map +1 -0
  34. package/dist/commands/cart/list.d.ts +14 -0
  35. package/dist/commands/cart/list.d.ts.map +1 -0
  36. package/dist/commands/cart/list.js +51 -0
  37. package/dist/commands/cart/list.js.map +1 -0
  38. package/dist/commands/cart/remove.d.ts +13 -0
  39. package/dist/commands/cart/remove.d.ts.map +1 -0
  40. package/dist/commands/cart/remove.js +24 -0
  41. package/dist/commands/cart/remove.js.map +1 -0
  42. package/dist/commands/credits.d.ts +10 -0
  43. package/dist/commands/credits.d.ts.map +1 -0
  44. package/dist/commands/credits.js +139 -0
  45. package/dist/commands/credits.js.map +1 -0
  46. package/dist/commands/dns/add.d.ts +30 -0
  47. package/dist/commands/dns/add.d.ts.map +1 -0
  48. package/dist/commands/dns/add.js +144 -0
  49. package/dist/commands/dns/add.js.map +1 -0
  50. package/dist/commands/dns/index.d.ts +7 -0
  51. package/dist/commands/dns/index.d.ts.map +1 -0
  52. package/dist/commands/dns/index.js +7 -0
  53. package/dist/commands/dns/index.js.map +1 -0
  54. package/dist/commands/dns/list.d.ts +24 -0
  55. package/dist/commands/dns/list.d.ts.map +1 -0
  56. package/dist/commands/dns/list.js +111 -0
  57. package/dist/commands/dns/list.js.map +1 -0
  58. package/dist/commands/dns/remove.d.ts +24 -0
  59. package/dist/commands/dns/remove.d.ts.map +1 -0
  60. package/dist/commands/dns/remove.js +137 -0
  61. package/dist/commands/dns/remove.js.map +1 -0
  62. package/dist/commands/domains/detail.d.ts +20 -0
  63. package/dist/commands/domains/detail.d.ts.map +1 -0
  64. package/dist/commands/domains/detail.js +112 -0
  65. package/dist/commands/domains/detail.js.map +1 -0
  66. package/dist/commands/domains/index.d.ts +6 -0
  67. package/dist/commands/domains/index.d.ts.map +1 -0
  68. package/dist/commands/domains/index.js +6 -0
  69. package/dist/commands/domains/index.js.map +1 -0
  70. package/dist/commands/domains/list.d.ts +21 -0
  71. package/dist/commands/domains/list.d.ts.map +1 -0
  72. package/dist/commands/domains/list.js +106 -0
  73. package/dist/commands/domains/list.js.map +1 -0
  74. package/dist/commands/hack.d.ts +9 -0
  75. package/dist/commands/hack.d.ts.map +1 -0
  76. package/dist/commands/hack.js +104 -0
  77. package/dist/commands/hack.js.map +1 -0
  78. package/dist/commands/integrations.d.ts +20 -0
  79. package/dist/commands/integrations.d.ts.map +1 -0
  80. package/dist/commands/integrations.js +92 -0
  81. package/dist/commands/integrations.js.map +1 -0
  82. package/dist/commands/login.d.ts +15 -0
  83. package/dist/commands/login.d.ts.map +1 -0
  84. package/dist/commands/login.js +95 -0
  85. package/dist/commands/login.js.map +1 -0
  86. package/dist/commands/logout.d.ts +13 -0
  87. package/dist/commands/logout.d.ts.map +1 -0
  88. package/dist/commands/logout.js +32 -0
  89. package/dist/commands/logout.js.map +1 -0
  90. package/dist/commands/search.d.ts +24 -0
  91. package/dist/commands/search.d.ts.map +1 -0
  92. package/dist/commands/search.js +162 -0
  93. package/dist/commands/search.js.map +1 -0
  94. package/dist/commands/settings/index.d.ts +6 -0
  95. package/dist/commands/settings/index.d.ts.map +1 -0
  96. package/dist/commands/settings/index.js +6 -0
  97. package/dist/commands/settings/index.js.map +1 -0
  98. package/dist/commands/settings/set.d.ts +25 -0
  99. package/dist/commands/settings/set.d.ts.map +1 -0
  100. package/dist/commands/settings/set.js +215 -0
  101. package/dist/commands/settings/set.js.map +1 -0
  102. package/dist/commands/settings/view.d.ts +17 -0
  103. package/dist/commands/settings/view.d.ts.map +1 -0
  104. package/dist/commands/settings/view.js +99 -0
  105. package/dist/commands/settings/view.js.map +1 -0
  106. package/dist/commands/team/add.d.ts +17 -0
  107. package/dist/commands/team/add.d.ts.map +1 -0
  108. package/dist/commands/team/add.js +64 -0
  109. package/dist/commands/team/add.js.map +1 -0
  110. package/dist/commands/team/index.d.ts +7 -0
  111. package/dist/commands/team/index.d.ts.map +1 -0
  112. package/dist/commands/team/index.js +7 -0
  113. package/dist/commands/team/index.js.map +1 -0
  114. package/dist/commands/team/list.d.ts +13 -0
  115. package/dist/commands/team/list.d.ts.map +1 -0
  116. package/dist/commands/team/list.js +51 -0
  117. package/dist/commands/team/list.js.map +1 -0
  118. package/dist/commands/team/remove.d.ts +14 -0
  119. package/dist/commands/team/remove.d.ts.map +1 -0
  120. package/dist/commands/team/remove.js +57 -0
  121. package/dist/commands/team/remove.js.map +1 -0
  122. package/dist/commands/vercel/index.d.ts +8 -0
  123. package/dist/commands/vercel/index.d.ts.map +1 -0
  124. package/dist/commands/vercel/index.js +8 -0
  125. package/dist/commands/vercel/index.js.map +1 -0
  126. package/dist/commands/vercel/link.d.ts +25 -0
  127. package/dist/commands/vercel/link.d.ts.map +1 -0
  128. package/dist/commands/vercel/link.js +176 -0
  129. package/dist/commands/vercel/link.js.map +1 -0
  130. package/dist/commands/vercel/setup.d.ts +13 -0
  131. package/dist/commands/vercel/setup.d.ts.map +1 -0
  132. package/dist/commands/vercel/setup.js +113 -0
  133. package/dist/commands/vercel/setup.js.map +1 -0
  134. package/dist/commands/vercel/status.d.ts +15 -0
  135. package/dist/commands/vercel/status.d.ts.map +1 -0
  136. package/dist/commands/vercel/status.js +103 -0
  137. package/dist/commands/vercel/status.js.map +1 -0
  138. package/dist/commands/vercel/unlink.d.ts +16 -0
  139. package/dist/commands/vercel/unlink.d.ts.map +1 -0
  140. package/dist/commands/vercel/unlink.js +118 -0
  141. package/dist/commands/vercel/unlink.js.map +1 -0
  142. package/dist/commands/webhooks/add.d.ts +16 -0
  143. package/dist/commands/webhooks/add.d.ts.map +1 -0
  144. package/dist/commands/webhooks/add.js +61 -0
  145. package/dist/commands/webhooks/add.js.map +1 -0
  146. package/dist/commands/webhooks/index.d.ts +7 -0
  147. package/dist/commands/webhooks/index.d.ts.map +1 -0
  148. package/dist/commands/webhooks/index.js +7 -0
  149. package/dist/commands/webhooks/index.js.map +1 -0
  150. package/dist/commands/webhooks/list.d.ts +14 -0
  151. package/dist/commands/webhooks/list.d.ts.map +1 -0
  152. package/dist/commands/webhooks/list.js +47 -0
  153. package/dist/commands/webhooks/list.js.map +1 -0
  154. package/dist/commands/webhooks/remove.d.ts +14 -0
  155. package/dist/commands/webhooks/remove.d.ts.map +1 -0
  156. package/dist/commands/webhooks/remove.js +57 -0
  157. package/dist/commands/webhooks/remove.js.map +1 -0
  158. package/dist/commands/whoami.d.ts +13 -0
  159. package/dist/commands/whoami.d.ts.map +1 -0
  160. package/dist/commands/whoami.js +33 -0
  161. package/dist/commands/whoami.js.map +1 -0
  162. package/dist/components/account-card.d.ts +17 -0
  163. package/dist/components/account-card.d.ts.map +1 -0
  164. package/dist/components/account-card.js +19 -0
  165. package/dist/components/account-card.js.map +1 -0
  166. package/dist/components/billing-table.d.ts +22 -0
  167. package/dist/components/billing-table.d.ts.map +1 -0
  168. package/dist/components/billing-table.js +53 -0
  169. package/dist/components/billing-table.js.map +1 -0
  170. package/dist/components/celebration.d.ts +21 -0
  171. package/dist/components/celebration.d.ts.map +1 -0
  172. package/dist/components/celebration.js +55 -0
  173. package/dist/components/celebration.js.map +1 -0
  174. package/dist/components/contact-form.d.ts +23 -0
  175. package/dist/components/contact-form.d.ts.map +1 -0
  176. package/dist/components/contact-form.js +109 -0
  177. package/dist/components/contact-form.js.map +1 -0
  178. package/dist/components/dns-table.d.ts +14 -0
  179. package/dist/components/dns-table.d.ts.map +1 -0
  180. package/dist/components/dns-table.js +71 -0
  181. package/dist/components/dns-table.js.map +1 -0
  182. package/dist/components/domain-card.d.ts +14 -0
  183. package/dist/components/domain-card.d.ts.map +1 -0
  184. package/dist/components/domain-card.js +41 -0
  185. package/dist/components/domain-card.js.map +1 -0
  186. package/dist/components/domain-table.d.ts +30 -0
  187. package/dist/components/domain-table.d.ts.map +1 -0
  188. package/dist/components/domain-table.js +87 -0
  189. package/dist/components/domain-table.js.map +1 -0
  190. package/dist/components/error-display.d.ts +25 -0
  191. package/dist/components/error-display.d.ts.map +1 -0
  192. package/dist/components/error-display.js +51 -0
  193. package/dist/components/error-display.js.map +1 -0
  194. package/dist/components/layout.d.ts +14 -0
  195. package/dist/components/layout.d.ts.map +1 -0
  196. package/dist/components/layout.js +21 -0
  197. package/dist/components/layout.js.map +1 -0
  198. package/dist/components/logo.d.ts +37 -0
  199. package/dist/components/logo.d.ts.map +1 -0
  200. package/dist/components/logo.js +70 -0
  201. package/dist/components/logo.js.map +1 -0
  202. package/dist/components/matrix-rain.d.ts +17 -0
  203. package/dist/components/matrix-rain.d.ts.map +1 -0
  204. package/dist/components/matrix-rain.js +105 -0
  205. package/dist/components/matrix-rain.js.map +1 -0
  206. package/dist/components/purchase-confirmation.d.ts +17 -0
  207. package/dist/components/purchase-confirmation.d.ts.map +1 -0
  208. package/dist/components/purchase-confirmation.js +17 -0
  209. package/dist/components/purchase-confirmation.js.map +1 -0
  210. package/dist/components/search-results.d.ts +30 -0
  211. package/dist/components/search-results.d.ts.map +1 -0
  212. package/dist/components/search-results.js +53 -0
  213. package/dist/components/search-results.js.map +1 -0
  214. package/dist/components/settings-card.d.ts +14 -0
  215. package/dist/components/settings-card.d.ts.map +1 -0
  216. package/dist/components/settings-card.js +40 -0
  217. package/dist/components/settings-card.js.map +1 -0
  218. package/dist/components/spinner-messages.d.ts +19 -0
  219. package/dist/components/spinner-messages.d.ts.map +1 -0
  220. package/dist/components/spinner-messages.js +55 -0
  221. package/dist/components/spinner-messages.js.map +1 -0
  222. package/dist/lib/achievements.d.ts +107 -0
  223. package/dist/lib/achievements.d.ts.map +1 -0
  224. package/dist/lib/achievements.js +341 -0
  225. package/dist/lib/achievements.js.map +1 -0
  226. package/dist/lib/auth.d.ts +45 -0
  227. package/dist/lib/auth.d.ts.map +1 -0
  228. package/dist/lib/auth.js +125 -0
  229. package/dist/lib/auth.js.map +1 -0
  230. package/dist/lib/cart.d.ts +69 -0
  231. package/dist/lib/cart.d.ts.map +1 -0
  232. package/dist/lib/cart.js +131 -0
  233. package/dist/lib/cart.js.map +1 -0
  234. package/dist/lib/config.d.ts +51 -0
  235. package/dist/lib/config.d.ts.map +1 -0
  236. package/dist/lib/config.js +116 -0
  237. package/dist/lib/config.js.map +1 -0
  238. package/dist/lib/dns-validation.d.ts +51 -0
  239. package/dist/lib/dns-validation.d.ts.map +1 -0
  240. package/dist/lib/dns-validation.js +185 -0
  241. package/dist/lib/dns-validation.js.map +1 -0
  242. package/dist/lib/easter-eggs.d.ts +21 -0
  243. package/dist/lib/easter-eggs.d.ts.map +1 -0
  244. package/dist/lib/easter-eggs.js +64 -0
  245. package/dist/lib/easter-eggs.js.map +1 -0
  246. package/dist/lib/error-personality.d.ts +35 -0
  247. package/dist/lib/error-personality.d.ts.map +1 -0
  248. package/dist/lib/error-personality.js +191 -0
  249. package/dist/lib/error-personality.js.map +1 -0
  250. package/dist/lib/errors.d.ts +8 -0
  251. package/dist/lib/errors.d.ts.map +1 -0
  252. package/dist/lib/errors.js +7 -0
  253. package/dist/lib/errors.js.map +1 -0
  254. package/dist/lib/konami.d.ts +51 -0
  255. package/dist/lib/konami.d.ts.map +1 -0
  256. package/dist/lib/konami.js +107 -0
  257. package/dist/lib/konami.js.map +1 -0
  258. package/dist/lib/loading-messages.d.ts +13 -0
  259. package/dist/lib/loading-messages.d.ts.map +1 -0
  260. package/dist/lib/loading-messages.js +13 -0
  261. package/dist/lib/loading-messages.js.map +1 -0
  262. package/dist/lib/namecom-client.d.ts +73 -0
  263. package/dist/lib/namecom-client.d.ts.map +1 -0
  264. package/dist/lib/namecom-client.js +260 -0
  265. package/dist/lib/namecom-client.js.map +1 -0
  266. package/dist/lib/nameserver-presets.d.ts +27 -0
  267. package/dist/lib/nameserver-presets.d.ts.map +1 -0
  268. package/dist/lib/nameserver-presets.js +45 -0
  269. package/dist/lib/nameserver-presets.js.map +1 -0
  270. package/dist/lib/purchase.d.ts +71 -0
  271. package/dist/lib/purchase.d.ts.map +1 -0
  272. package/dist/lib/purchase.js +160 -0
  273. package/dist/lib/purchase.js.map +1 -0
  274. package/dist/lib/schemas.d.ts +1968 -0
  275. package/dist/lib/schemas.d.ts.map +1 -0
  276. package/dist/lib/schemas.js +112 -0
  277. package/dist/lib/schemas.js.map +1 -0
  278. package/dist/lib/team.d.ts +71 -0
  279. package/dist/lib/team.d.ts.map +1 -0
  280. package/dist/lib/team.js +135 -0
  281. package/dist/lib/team.js.map +1 -0
  282. package/dist/lib/theme.d.ts +152 -0
  283. package/dist/lib/theme.d.ts.map +1 -0
  284. package/dist/lib/theme.js +185 -0
  285. package/dist/lib/theme.js.map +1 -0
  286. package/dist/lib/types.d.ts +136 -0
  287. package/dist/lib/types.d.ts.map +1 -0
  288. package/dist/lib/types.js +19 -0
  289. package/dist/lib/types.js.map +1 -0
  290. package/dist/lib/vercel-client.d.ts +110 -0
  291. package/dist/lib/vercel-client.d.ts.map +1 -0
  292. package/dist/lib/vercel-client.js +196 -0
  293. package/dist/lib/vercel-client.js.map +1 -0
  294. package/dist/lib/webhooks.d.ts +83 -0
  295. package/dist/lib/webhooks.d.ts.map +1 -0
  296. package/dist/lib/webhooks.js +195 -0
  297. package/dist/lib/webhooks.js.map +1 -0
  298. package/package.json +66 -0
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Auth utilities for login, logout, and whoami flows.
3
+ *
4
+ * Handles credential validation, storage, and retrieval.
5
+ * All credentials stored in ~/.dominion/config.json with 0600 permissions.
6
+ */
7
+ import { ConfigManager } from "./config.js";
8
+ import { NamecomClient } from "./namecom-client.js";
9
+ import { DomainError } from "./types.js";
10
+ /**
11
+ * Validate Name.com credentials by calling listDomains().
12
+ * Returns domain count on success for display in whoami.
13
+ */
14
+ export async function validateCredentials(username, token) {
15
+ try {
16
+ const client = new NamecomClient({ username, token });
17
+ const response = await client.listDomains();
18
+ return {
19
+ success: true,
20
+ username,
21
+ domainCount: response.domains?.length ?? 0,
22
+ };
23
+ }
24
+ catch (err) {
25
+ if (err instanceof DomainError && err.code === "AUTH_ERROR") {
26
+ return {
27
+ success: false,
28
+ username,
29
+ domainCount: 0,
30
+ error: "Authentication failed. Check your Name.com API username and token at https://www.name.com/account/api",
31
+ };
32
+ }
33
+ return {
34
+ success: false,
35
+ username,
36
+ domainCount: 0,
37
+ error: err instanceof Error ? err.message : "Unknown error during credential validation",
38
+ };
39
+ }
40
+ }
41
+ /**
42
+ * Save validated credentials to config.
43
+ */
44
+ export function saveCredentials(username, token, configManager) {
45
+ const manager = configManager ?? new ConfigManager();
46
+ manager.set("namecom", { username, token });
47
+ }
48
+ /**
49
+ * Clear credentials from config (logout).
50
+ */
51
+ export function clearCredentials(configManager) {
52
+ const manager = configManager ?? new ConfigManager();
53
+ manager.set("namecom", { username: "", token: "" });
54
+ }
55
+ /**
56
+ * Check current auth status without making API calls.
57
+ */
58
+ export function getAuthStatus(configManager) {
59
+ const manager = configManager ?? new ConfigManager();
60
+ const config = manager.load();
61
+ const hasCredentials = !!(config.namecom.username && config.namecom.token);
62
+ return {
63
+ authenticated: hasCredentials,
64
+ username: hasCredentials ? config.namecom.username : undefined,
65
+ configPath: manager.getConfigPath(),
66
+ };
67
+ }
68
+ /**
69
+ * Check auth status with an API call to get live domain count.
70
+ */
71
+ export async function getAuthStatusWithDomainCount(configManager) {
72
+ const manager = configManager ?? new ConfigManager();
73
+ const config = manager.load();
74
+ const hasCredentials = !!(config.namecom.username && config.namecom.token);
75
+ if (!hasCredentials) {
76
+ return {
77
+ authenticated: false,
78
+ configPath: manager.getConfigPath(),
79
+ };
80
+ }
81
+ try {
82
+ const client = new NamecomClient({
83
+ username: config.namecom.username,
84
+ token: config.namecom.token,
85
+ });
86
+ const response = await client.listDomains();
87
+ return {
88
+ authenticated: true,
89
+ username: config.namecom.username,
90
+ domainCount: response.domains?.length ?? 0,
91
+ configPath: manager.getConfigPath(),
92
+ };
93
+ }
94
+ catch {
95
+ // Credentials exist but may be invalid
96
+ return {
97
+ authenticated: true,
98
+ username: config.namecom.username,
99
+ configPath: manager.getConfigPath(),
100
+ };
101
+ }
102
+ }
103
+ /**
104
+ * Open a URL in the default browser.
105
+ */
106
+ export async function openInBrowser(url) {
107
+ const { exec } = await import("node:child_process");
108
+ const { platform } = await import("node:os");
109
+ const command = platform() === "darwin"
110
+ ? `open "${url}"`
111
+ : platform() === "win32"
112
+ ? `start "${url}"`
113
+ : `xdg-open "${url}"`;
114
+ return new Promise((resolve, reject) => {
115
+ exec(command, (error) => {
116
+ if (error) {
117
+ reject(error);
118
+ }
119
+ else {
120
+ resolve();
121
+ }
122
+ });
123
+ });
124
+ }
125
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * CartManager — manages ~/.dominion/cart.json.
3
+ *
4
+ * Persistent shopping cart for domain purchases.
5
+ * Cart items include domain name, price, premium status, and timestamp.
6
+ * Items older than 24 hours display a stale-price warning.
7
+ */
8
+ export interface CartItem {
9
+ domain: string;
10
+ price: number;
11
+ premium: boolean;
12
+ addedAt: string;
13
+ }
14
+ export interface CartData {
15
+ items: CartItem[];
16
+ updatedAt: string;
17
+ }
18
+ export declare class CartManager {
19
+ private readonly cartPath;
20
+ private readonly configDir;
21
+ constructor(configDir?: string);
22
+ /**
23
+ * Load cart data from disk. Returns empty cart if file doesn't exist.
24
+ */
25
+ private loadRaw;
26
+ /**
27
+ * Save cart data to disk. Creates directory if needed.
28
+ */
29
+ private saveRaw;
30
+ /**
31
+ * List all items in the cart.
32
+ */
33
+ list(): CartItem[];
34
+ /**
35
+ * Add a domain to the cart.
36
+ * If the domain is already in the cart, it updates the price and timestamp.
37
+ */
38
+ add(domain: string, price: number, premium: boolean): CartItem;
39
+ /**
40
+ * Remove a domain from the cart by name.
41
+ * Returns true if the domain was found and removed.
42
+ */
43
+ remove(domain: string): boolean;
44
+ /**
45
+ * Clear all items from the cart.
46
+ */
47
+ clear(): void;
48
+ /**
49
+ * Get the total price of all items in cents.
50
+ */
51
+ total(): number;
52
+ /**
53
+ * Get the number of items in the cart.
54
+ */
55
+ count(): number;
56
+ /**
57
+ * Check if a domain is already in the cart.
58
+ */
59
+ has(domain: string): boolean;
60
+ /**
61
+ * Check if a cart item's price might be stale (older than 24 hours).
62
+ */
63
+ isStale(item: CartItem): boolean;
64
+ /**
65
+ * Get the path to the cart file.
66
+ */
67
+ getCartPath(): string;
68
+ }
69
+ //# sourceMappingURL=cart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cart.d.ts","sourceRoot":"","sources":["../../src/lib/cart.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,CAAC,EAAE,MAAM;IAK9B;;OAEG;IACH,OAAO,CAAC,OAAO;IAiBf;;OAEG;IACH,OAAO,CAAC,OAAO;IAOf;;OAEG;IACH,IAAI,IAAI,QAAQ,EAAE;IAIlB;;;OAGG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ;IAsB9D;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAkB/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAO5B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAKhC;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * CartManager — manages ~/.dominion/cart.json.
3
+ *
4
+ * Persistent shopping cart for domain purchases.
5
+ * Cart items include domain name, price, premium status, and timestamp.
6
+ * Items older than 24 hours display a stale-price warning.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { homedir } from "node:os";
11
+ // ─── Constants ──────────────────────────────────────────────────────────────
12
+ const DOMINION_DIR = join(homedir(), ".dominion");
13
+ const STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000; // 24 hours
14
+ // ─── CartManager ────────────────────────────────────────────────────────────
15
+ export class CartManager {
16
+ cartPath;
17
+ configDir;
18
+ constructor(configDir) {
19
+ this.configDir = configDir ?? DOMINION_DIR;
20
+ this.cartPath = join(this.configDir, "cart.json");
21
+ }
22
+ /**
23
+ * Load cart data from disk. Returns empty cart if file doesn't exist.
24
+ */
25
+ loadRaw() {
26
+ if (!existsSync(this.cartPath)) {
27
+ return { items: [], updatedAt: new Date().toISOString() };
28
+ }
29
+ try {
30
+ const raw = readFileSync(this.cartPath, "utf-8");
31
+ const parsed = JSON.parse(raw);
32
+ return {
33
+ items: Array.isArray(parsed.items) ? parsed.items : [],
34
+ updatedAt: parsed.updatedAt ?? new Date().toISOString(),
35
+ };
36
+ }
37
+ catch {
38
+ return { items: [], updatedAt: new Date().toISOString() };
39
+ }
40
+ }
41
+ /**
42
+ * Save cart data to disk. Creates directory if needed.
43
+ */
44
+ saveRaw(data) {
45
+ if (!existsSync(this.configDir)) {
46
+ mkdirSync(this.configDir, { recursive: true });
47
+ }
48
+ writeFileSync(this.cartPath, JSON.stringify(data, null, 2), "utf-8");
49
+ }
50
+ /**
51
+ * List all items in the cart.
52
+ */
53
+ list() {
54
+ return this.loadRaw().items;
55
+ }
56
+ /**
57
+ * Add a domain to the cart.
58
+ * If the domain is already in the cart, it updates the price and timestamp.
59
+ */
60
+ add(domain, price, premium) {
61
+ const data = this.loadRaw();
62
+ const normalized = domain.toLowerCase();
63
+ // Remove existing entry if present (update scenario)
64
+ data.items = data.items.filter((item) => item.domain.toLowerCase() !== normalized);
65
+ const newItem = {
66
+ domain: normalized,
67
+ price,
68
+ premium,
69
+ addedAt: new Date().toISOString(),
70
+ };
71
+ data.items.push(newItem);
72
+ data.updatedAt = new Date().toISOString();
73
+ this.saveRaw(data);
74
+ return newItem;
75
+ }
76
+ /**
77
+ * Remove a domain from the cart by name.
78
+ * Returns true if the domain was found and removed.
79
+ */
80
+ remove(domain) {
81
+ const data = this.loadRaw();
82
+ const normalized = domain.toLowerCase();
83
+ const originalLength = data.items.length;
84
+ data.items = data.items.filter((item) => item.domain.toLowerCase() !== normalized);
85
+ if (data.items.length === originalLength) {
86
+ return false; // Domain was not in cart
87
+ }
88
+ data.updatedAt = new Date().toISOString();
89
+ this.saveRaw(data);
90
+ return true;
91
+ }
92
+ /**
93
+ * Clear all items from the cart.
94
+ */
95
+ clear() {
96
+ this.saveRaw({ items: [], updatedAt: new Date().toISOString() });
97
+ }
98
+ /**
99
+ * Get the total price of all items in cents.
100
+ */
101
+ total() {
102
+ return this.loadRaw().items.reduce((sum, item) => sum + item.price, 0);
103
+ }
104
+ /**
105
+ * Get the number of items in the cart.
106
+ */
107
+ count() {
108
+ return this.loadRaw().items.length;
109
+ }
110
+ /**
111
+ * Check if a domain is already in the cart.
112
+ */
113
+ has(domain) {
114
+ const normalized = domain.toLowerCase();
115
+ return this.loadRaw().items.some((item) => item.domain.toLowerCase() === normalized);
116
+ }
117
+ /**
118
+ * Check if a cart item's price might be stale (older than 24 hours).
119
+ */
120
+ isStale(item) {
121
+ const addedTime = new Date(item.addedAt).getTime();
122
+ return Date.now() - addedTime > STALE_THRESHOLD_MS;
123
+ }
124
+ /**
125
+ * Get the path to the cart file.
126
+ */
127
+ getCartPath() {
128
+ return this.cartPath;
129
+ }
130
+ }
131
+ //# sourceMappingURL=cart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cart.js","sourceRoot":"","sources":["../../src/lib/cart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ConfigManager — manages ~/.dominion/config.json.
3
+ *
4
+ * Handles reading, writing, and updating the CLI configuration file.
5
+ * Creates the ~/.dominion/ directory on first use.
6
+ * Sets file permissions to 0600 (owner-only read/write) for security.
7
+ */
8
+ import type { DominionConfig } from "./types.js";
9
+ export declare class ConfigManager {
10
+ private readonly configDir;
11
+ private readonly configPath;
12
+ constructor(configDir?: string);
13
+ /**
14
+ * Check if the config file exists.
15
+ */
16
+ exists(): boolean;
17
+ /**
18
+ * Load the config from disk. Returns default config if file doesn't exist.
19
+ */
20
+ load(): DominionConfig;
21
+ /**
22
+ * Save the config to disk. Creates directory if needed.
23
+ * Sets file permissions to 0600 for security.
24
+ */
25
+ save(config: DominionConfig): void;
26
+ /**
27
+ * Get a top-level key from the config.
28
+ */
29
+ get<K extends keyof DominionConfig>(key: K): DominionConfig[K];
30
+ /**
31
+ * Set a top-level key in the config and persist.
32
+ */
33
+ set<K extends keyof DominionConfig>(key: K, value: DominionConfig[K]): void;
34
+ /**
35
+ * Clear the config file — resets to defaults.
36
+ */
37
+ clear(): void;
38
+ /**
39
+ * Get the path to the config file.
40
+ */
41
+ getConfigPath(): string;
42
+ /**
43
+ * Get the path to the config directory.
44
+ */
45
+ getConfigDir(): string;
46
+ /**
47
+ * Ensure the config directory exists.
48
+ */
49
+ private ensureDir;
50
+ }
51
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgBjD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,SAAS,CAAC,EAAE,MAAM;IAK9B;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,IAAI,IAAI,cAAc;IA2BtB;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAMlC;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,GAAG,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAK9D;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAM3E;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,OAAO,CAAC,SAAS;CAKlB"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * ConfigManager — manages ~/.dominion/config.json.
3
+ *
4
+ * Handles reading, writing, and updating the CLI configuration file.
5
+ * Creates the ~/.dominion/ directory on first use.
6
+ * Sets file permissions to 0600 (owner-only read/write) for security.
7
+ */
8
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { homedir } from "node:os";
11
+ const DOMINION_DIR = join(homedir(), ".dominion");
12
+ /** Default config used when creating a fresh config file. */
13
+ const DEFAULT_CONFIG = {
14
+ namecom: {
15
+ username: "",
16
+ token: "",
17
+ },
18
+ preferences: {
19
+ defaultTlds: ["com", "net", "org", "co", "io"],
20
+ outputFormat: "table",
21
+ },
22
+ };
23
+ export class ConfigManager {
24
+ configDir;
25
+ configPath;
26
+ constructor(configDir) {
27
+ this.configDir = configDir ?? DOMINION_DIR;
28
+ this.configPath = join(this.configDir, "config.json");
29
+ }
30
+ /**
31
+ * Check if the config file exists.
32
+ */
33
+ exists() {
34
+ return existsSync(this.configPath);
35
+ }
36
+ /**
37
+ * Load the config from disk. Returns default config if file doesn't exist.
38
+ */
39
+ load() {
40
+ if (!this.exists()) {
41
+ return { ...DEFAULT_CONFIG };
42
+ }
43
+ try {
44
+ const raw = readFileSync(this.configPath, "utf-8");
45
+ const parsed = JSON.parse(raw);
46
+ // Merge with defaults to fill in any missing fields
47
+ return {
48
+ ...DEFAULT_CONFIG,
49
+ ...parsed,
50
+ namecom: {
51
+ ...DEFAULT_CONFIG.namecom,
52
+ ...parsed.namecom,
53
+ },
54
+ preferences: {
55
+ ...DEFAULT_CONFIG.preferences,
56
+ ...parsed.preferences,
57
+ },
58
+ };
59
+ }
60
+ catch {
61
+ // If the file is corrupt, return defaults
62
+ return { ...DEFAULT_CONFIG };
63
+ }
64
+ }
65
+ /**
66
+ * Save the config to disk. Creates directory if needed.
67
+ * Sets file permissions to 0600 for security.
68
+ */
69
+ save(config) {
70
+ this.ensureDir();
71
+ writeFileSync(this.configPath, JSON.stringify(config, null, 2), "utf-8");
72
+ chmodSync(this.configPath, 0o600);
73
+ }
74
+ /**
75
+ * Get a top-level key from the config.
76
+ */
77
+ get(key) {
78
+ const config = this.load();
79
+ return config[key];
80
+ }
81
+ /**
82
+ * Set a top-level key in the config and persist.
83
+ */
84
+ set(key, value) {
85
+ const config = this.load();
86
+ config[key] = value;
87
+ this.save(config);
88
+ }
89
+ /**
90
+ * Clear the config file — resets to defaults.
91
+ */
92
+ clear() {
93
+ this.save({ ...DEFAULT_CONFIG });
94
+ }
95
+ /**
96
+ * Get the path to the config file.
97
+ */
98
+ getConfigPath() {
99
+ return this.configPath;
100
+ }
101
+ /**
102
+ * Get the path to the config directory.
103
+ */
104
+ getConfigDir() {
105
+ return this.configDir;
106
+ }
107
+ /**
108
+ * Ensure the config directory exists.
109
+ */
110
+ ensureDir() {
111
+ if (!existsSync(this.configDir)) {
112
+ mkdirSync(this.configDir, { recursive: true });
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * DNS record input validation.
3
+ *
4
+ * Validates record type, host format, and answer format per record type.
5
+ * Warns (but does not block) on common conflict patterns.
6
+ *
7
+ * Type validation uses the DnsRecordTypeSchema from schemas.ts.
8
+ * Answer validation is type-specific:
9
+ * - A: IPv4 address
10
+ * - AAAA: IPv6 address
11
+ * - CNAME/MX/NS/SRV/ANAME: hostname
12
+ * - TXT: any string
13
+ * - URL: valid URL
14
+ */
15
+ import type { DnsRecordType } from "./types.js";
16
+ export interface ValidationResult {
17
+ valid: boolean;
18
+ errors: string[];
19
+ warnings: string[];
20
+ }
21
+ /** Default TTL in seconds (matches web app's DEFAULT_TTL). */
22
+ export declare const DEFAULT_TTL = 300;
23
+ /** Min / max TTL allowed by Name.com. */
24
+ export declare const MIN_TTL = 300;
25
+ export declare const MAX_TTL = 604800;
26
+ /**
27
+ * Validate that a string is a valid DNS record type.
28
+ */
29
+ export declare function validateType(type: string): ValidationResult;
30
+ /**
31
+ * Validate the host/name field for a DNS record.
32
+ */
33
+ export declare function validateHost(host: string): ValidationResult;
34
+ /**
35
+ * Validate the answer/value field based on the record type.
36
+ */
37
+ export declare function validateAnswer(type: DnsRecordType, answer: string): ValidationResult;
38
+ /**
39
+ * Validate TTL value.
40
+ */
41
+ export declare function validateTtl(ttl: number): ValidationResult;
42
+ /**
43
+ * Validate priority (for MX and SRV records).
44
+ */
45
+ export declare function validatePriority(type: DnsRecordType, priority?: number): ValidationResult;
46
+ /**
47
+ * Full validation of a DNS record input.
48
+ * Returns combined results from all individual validators.
49
+ */
50
+ export declare function validateDnsRecordInput(type: string, host: string, answer: string, ttl?: number, priority?: number): ValidationResult;
51
+ //# sourceMappingURL=dns-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-validation.d.ts","sourceRoot":"","sources":["../../src/lib/dns-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAeD,8DAA8D;AAC9D,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,yCAAyC;AACzC,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,eAAO,MAAM,OAAO,SAAS,CAAC;AAe9B;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAY3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAe3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CA6DpF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAazD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,CAmBlB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,CA4ClB"}