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,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * dominion cart list — display cart contents.
4
+ *
5
+ * Shows a formatted table of cart items with domain, price, and grand total.
6
+ * Items older than 24 hours show a stale-price warning.
7
+ * Empty cart shows helpful hint to run dominion search.
8
+ */
9
+ import { Box, Text, useApp } from "ink";
10
+ import { useEffect } from "react";
11
+ import { CartManager } from "../../lib/cart.js";
12
+ import { formatPrice } from "../../components/search-results.js";
13
+ export function CartList({ cartManager }) {
14
+ const { exit } = useApp();
15
+ const manager = cartManager ?? new CartManager();
16
+ const items = manager.list();
17
+ const total = manager.total();
18
+ useEffect(() => {
19
+ // Auto-exit after render for non-interactive display
20
+ const timer = setTimeout(() => exit(), 200);
21
+ return () => clearTimeout(timer);
22
+ }, [exit]);
23
+ if (items.length === 0) {
24
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Shopping Cart" }), _jsx(Text, { color: "yellow", children: "Your cart is empty." }), _jsxs(Text, { color: "gray", children: ["Search for domains with", " ", _jsxs(Text, { bold: true, color: "white", children: ["dominion search ", "<name>"] }), " ", "to get started."] })] }));
25
+ }
26
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Shopping Cart (", items.length, " item", items.length !== 1 ? "s" : "", ")"] }), _jsxs(Box, { children: [_jsx(Box, { width: 35, children: _jsx(Text, { bold: true, color: "gray", children: "Domain" }) }), _jsx(Box, { width: 12, children: _jsx(Text, { bold: true, color: "gray", children: "Price" }) }), _jsx(Box, { width: 10, children: _jsx(Text, { bold: true, color: "gray", children: "Type" }) }), _jsx(Box, { width: 20, children: _jsx(Text, { bold: true, color: "gray", children: "Added" }) })] }), _jsx(Text, { color: "gray", children: "─".repeat(77) }), items.map((item) => {
27
+ const stale = manager.isStale(item);
28
+ const addedDate = new Date(item.addedAt);
29
+ const timeStr = formatRelativeTime(addedDate);
30
+ return (_jsxs(Box, { children: [_jsx(Box, { width: 35, children: _jsx(Text, { bold: true, color: "green", children: item.domain }) }), _jsx(Box, { width: 12, children: _jsx(Text, { color: "white", children: formatPrice(item.price) }) }), _jsx(Box, { width: 10, children: item.premium ? (_jsx(Text, { color: "yellow", bold: true, children: "PREMIUM" })) : (_jsx(Text, { color: "gray", children: "Standard" })) }), _jsx(Box, { width: 20, children: _jsx(Text, { color: "gray", children: timeStr }) }), stale && (_jsx(Box, { children: _jsxs(Text, { color: "yellow", children: [" ", "\u26A0 Price may have changed"] }) }))] }, item.domain));
31
+ }), _jsx(Text, { color: "gray", children: "─".repeat(77) }), _jsxs(Box, { children: [_jsx(Box, { width: 35, children: _jsx(Text, { bold: true, color: "white", children: "Total" }) }), _jsx(Box, { width: 12, children: _jsx(Text, { bold: true, color: "cyan", children: formatPrice(total) }) })] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["Run", " ", _jsx(Text, { bold: true, color: "white", children: "dominion buy" }), " ", "to purchase or", " ", _jsxs(Text, { bold: true, color: "white", children: ["dominion cart remove ", "<domain>"] }), " ", "to remove items."] }) })] }));
32
+ }
33
+ /**
34
+ * Format a date relative to now (e.g. "2 hours ago", "just now").
35
+ */
36
+ function formatRelativeTime(date) {
37
+ const now = Date.now();
38
+ const diffMs = now - date.getTime();
39
+ const diffMin = Math.floor(diffMs / 60000);
40
+ const diffHr = Math.floor(diffMs / 3600000);
41
+ const diffDay = Math.floor(diffMs / 86400000);
42
+ if (diffMin < 1)
43
+ return "just now";
44
+ if (diffMin < 60)
45
+ return `${diffMin}m ago`;
46
+ if (diffHr < 24)
47
+ return `${diffHr}h ago`;
48
+ return `${diffDay}d ago`;
49
+ }
50
+ export default CartList;
51
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/cart/list.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * dominion cart remove <domain> — remove a domain from the cart.
3
+ *
4
+ * Removes the domain by name with removal confirmation.
5
+ */
6
+ import { CartManager } from "../../lib/cart.js";
7
+ export interface CartRemoveProps {
8
+ domain: string;
9
+ cartManager?: CartManager;
10
+ }
11
+ export declare function CartRemove({ domain, cartManager }: CartRemoveProps): import("react/jsx-runtime").JSX.Element;
12
+ export default CartRemove;
13
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/cart/remove.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,eAAe,2CAsClE;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * dominion cart remove <domain> — remove a domain from the cart.
4
+ *
5
+ * Removes the domain by name with removal confirmation.
6
+ */
7
+ import { Box, Text, useApp } from "ink";
8
+ import { useEffect } from "react";
9
+ import { CartManager } from "../../lib/cart.js";
10
+ export function CartRemove({ domain, cartManager }) {
11
+ const { exit } = useApp();
12
+ const manager = cartManager ?? new CartManager();
13
+ const removed = manager.remove(domain);
14
+ useEffect(() => {
15
+ const timer = setTimeout(() => exit(), 200);
16
+ return () => clearTimeout(timer);
17
+ }, [exit]);
18
+ if (!removed) {
19
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Text, { bold: true, color: "yellow", children: [domain, " was not found in your cart."] }), _jsxs(Text, { color: "gray", children: ["Run", " ", _jsx(Text, { bold: true, color: "white", children: "dominion cart" }), " ", "to see what's in your cart."] })] }));
20
+ }
21
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Text, { bold: true, color: "green", children: ["\u2713 ", domain, " removed from cart."] }), _jsxs(Text, { color: "gray", children: [manager.count(), " item", manager.count() !== 1 ? "s" : "", " remaining in cart."] })] }));
22
+ }
23
+ export default CartRemove;
24
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/cart/remove.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAmB;IACjE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,WAAW,IAAI,IAAI,WAAW,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,aAChC,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,aACtB,MAAM,oCACF,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBACZ,GAAG,EACP,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,8BAEjB,EAAC,GAAG,mCAEN,IACH,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,aAChC,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,wBACnB,MAAM,2BACJ,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aACf,OAAO,CAAC,KAAK,EAAE,WAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,2BAElD,IACH,CACP,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * dominion credits — cinema-style credits scroll.
3
+ *
4
+ * Shows a scrolling credits sequence with ASCII art dividers,
5
+ * team name, tech stack credits, and a thank-you message.
6
+ * Listed in --help (unlike hack, this is a public easter egg).
7
+ */
8
+ export declare function Credits(): import("react/jsx-runtime").JSX.Element;
9
+ export default Credits;
10
+ //# sourceMappingURL=credits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credits.d.ts","sourceRoot":"","sources":["../../src/commands/credits.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+HH,wBAAgB,OAAO,4CAmDtB;AAED,eAAe,OAAO,CAAC"}
@@ -0,0 +1,139 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * dominion credits — cinema-style credits scroll.
4
+ *
5
+ * Shows a scrolling credits sequence with ASCII art dividers,
6
+ * team name, tech stack credits, and a thank-you message.
7
+ * Listed in --help (unlike hack, this is a public easter egg).
8
+ */
9
+ import { Box, Text, useApp } from "ink";
10
+ import { useState, useEffect } from "react";
11
+ const STAR_DIVIDER = `
12
+ · ★ · ★ · ★ · ★ · ★ ·
13
+ `;
14
+ const FILM_REEL = `
15
+ ╔═══════════════════════════════════╗
16
+ ║ ◉ ◉ ◉ ◉ ◉ ◉ ◉ ◉ ◉ ◉ ║
17
+ ╚═══════════════════════════════════╝
18
+ `;
19
+ const CREDITS = [
20
+ {
21
+ lines: [],
22
+ color: "yellow",
23
+ art: FILM_REEL,
24
+ delay: 0,
25
+ },
26
+ {
27
+ title: "A DOMINION PRODUCTION",
28
+ lines: [],
29
+ color: "cyan",
30
+ delay: 1200,
31
+ },
32
+ {
33
+ lines: [],
34
+ color: "yellow",
35
+ art: STAR_DIVIDER,
36
+ delay: 2400,
37
+ },
38
+ {
39
+ title: "CREATED BY",
40
+ lines: ["The Dominion Team"],
41
+ color: "white",
42
+ delay: 3200,
43
+ },
44
+ {
45
+ title: "BUILT WITH",
46
+ lines: [
47
+ "Node.js + TypeScript",
48
+ "Ink (React for CLI)",
49
+ "Commander.js",
50
+ "Chalk + gradient-string",
51
+ "Figlet ASCII Art",
52
+ "Zod Schema Validation",
53
+ ],
54
+ color: "green",
55
+ delay: 4800,
56
+ },
57
+ {
58
+ title: "POWERED BY",
59
+ lines: [
60
+ "Name.com API",
61
+ "Vercel Platform",
62
+ "The magic of DNS",
63
+ ],
64
+ color: "magenta",
65
+ delay: 7000,
66
+ },
67
+ {
68
+ lines: [],
69
+ color: "yellow",
70
+ art: STAR_DIVIDER,
71
+ delay: 8500,
72
+ },
73
+ {
74
+ title: "SPECIAL THANKS",
75
+ lines: [
76
+ "The open-source community",
77
+ "Coffee, always coffee",
78
+ "You, for using this CLI",
79
+ ],
80
+ color: "yellow",
81
+ delay: 9500,
82
+ },
83
+ {
84
+ title: "MUSIC BY",
85
+ lines: ["The sound of mechanical keyboards"],
86
+ color: "cyan",
87
+ delay: 11200,
88
+ },
89
+ {
90
+ lines: [],
91
+ color: "yellow",
92
+ art: STAR_DIVIDER,
93
+ delay: 12500,
94
+ },
95
+ {
96
+ title: "DOMINION",
97
+ lines: [
98
+ "Premium domain management",
99
+ "from the terminal.",
100
+ "",
101
+ "dominion.sh",
102
+ ],
103
+ color: "cyan",
104
+ delay: 13500,
105
+ },
106
+ {
107
+ lines: [],
108
+ color: "yellow",
109
+ art: FILM_REEL,
110
+ delay: 15500,
111
+ },
112
+ {
113
+ lines: ["No domains were harmed in the making of this CLI."],
114
+ color: "gray",
115
+ delay: 17000,
116
+ },
117
+ ];
118
+ // ─── Component ──────────────────────────────────────────────────────────────
119
+ export function Credits() {
120
+ const { exit } = useApp();
121
+ const [visibleSections, setVisibleSections] = useState(0);
122
+ useEffect(() => {
123
+ const timers = [];
124
+ CREDITS.forEach((section, index) => {
125
+ const timer = setTimeout(() => {
126
+ setVisibleSections(index + 1);
127
+ }, section.delay);
128
+ timers.push(timer);
129
+ });
130
+ // Exit after all sections shown + a pause
131
+ const lastDelay = CREDITS[CREDITS.length - 1].delay;
132
+ const exitTimer = setTimeout(() => exit(), lastDelay + 3000);
133
+ timers.push(exitTimer);
134
+ return () => timers.forEach(clearTimeout);
135
+ }, [exit]);
136
+ return (_jsx(Box, { flexDirection: "column", gap: 1, paddingX: 4, children: CREDITS.slice(0, visibleSections).map((section, index) => (_jsxs(Box, { flexDirection: "column", justifyContent: "center", children: [section.art && (_jsx(Text, { color: section.color, children: section.art })), section.title && (_jsxs(Text, { bold: true, color: section.color, children: [" ", section.title] })), section.lines.map((line, lineIdx) => (_jsxs(Text, { color: section.color, dimColor: section.color === "gray", children: [" ", line] }, lineIdx)))] }, index))) }));
137
+ }
138
+ export default Credits;
139
+ //# sourceMappingURL=credits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/commands/credits.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * dominion dns <domain> add <type> <name> <value> — create a DNS record.
3
+ *
4
+ * Validates input, creates the record via NamecomClient.createDnsRecord(),
5
+ * then re-displays the updated record list.
6
+ *
7
+ * Features:
8
+ * - Input validation per record type (IP for A/AAAA, hostname for CNAME/MX)
9
+ * - --ttl flag (default 300, matching DEFAULT_TTL)
10
+ * - --priority flag for MX/SRV records
11
+ * - Warnings for validation issues (non-blocking)
12
+ * - Re-displays full record list after successful add
13
+ * - --json flag outputs the new record as JSON
14
+ */
15
+ import { NamecomClient } from "../../lib/namecom-client.js";
16
+ import { ConfigManager } from "../../lib/config.js";
17
+ export interface DnsAddProps {
18
+ domain: string;
19
+ type: string;
20
+ name: string;
21
+ value: string;
22
+ ttl?: number;
23
+ priority?: number;
24
+ json?: boolean;
25
+ configManager?: ConfigManager;
26
+ client?: NamecomClient;
27
+ }
28
+ export declare function DnsAdd({ domain, type, name, value, ttl, priority, json, configManager, client, }: DnsAddProps): import("react/jsx-runtime").JSX.Element | null;
29
+ export default DnsAdd;
30
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/dns/add.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWpD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAID,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,MAAM,GACP,EAAE,WAAW,kDAwLb;AAED,eAAe,MAAM,CAAC"}
@@ -0,0 +1,144 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * dominion dns <domain> add <type> <name> <value> — create a DNS record.
4
+ *
5
+ * Validates input, creates the record via NamecomClient.createDnsRecord(),
6
+ * then re-displays the updated record list.
7
+ *
8
+ * Features:
9
+ * - Input validation per record type (IP for A/AAAA, hostname for CNAME/MX)
10
+ * - --ttl flag (default 300, matching DEFAULT_TTL)
11
+ * - --priority flag for MX/SRV records
12
+ * - Warnings for validation issues (non-blocking)
13
+ * - Re-displays full record list after successful add
14
+ * - --json flag outputs the new record as JSON
15
+ */
16
+ import { Box, Text, useApp } from "ink";
17
+ import { useState, useEffect, useRef } from "react";
18
+ import { NamecomClient } from "../../lib/namecom-client.js";
19
+ import { ConfigManager } from "../../lib/config.js";
20
+ import { getAuthStatus } from "../../lib/auth.js";
21
+ import { getRandomMessage } from "../../components/spinner-messages.js";
22
+ import { DnsTable } from "../../components/dns-table.js";
23
+ import { validateDnsRecordInput, DEFAULT_TTL, } from "../../lib/dns-validation.js";
24
+ import { DomainError } from "../../lib/types.js";
25
+ export function DnsAdd({ domain, type, name, value, ttl, priority, json, configManager, client, }) {
26
+ const { exit } = useApp();
27
+ const [state, setState] = useState("validating");
28
+ const [createdRecord, setCreatedRecord] = useState(null);
29
+ const [allRecords, setAllRecords] = useState([]);
30
+ const [loadingMessage, setLoadingMessage] = useState(getRandomMessage());
31
+ const [errorMessage, setErrorMessage] = useState("");
32
+ const [warnings, setWarnings] = useState([]);
33
+ const intervalRef = useRef(null);
34
+ // Rotate loading messages
35
+ useEffect(() => {
36
+ if (state === "creating" || state === "refreshing") {
37
+ intervalRef.current = setInterval(() => {
38
+ setLoadingMessage(getRandomMessage());
39
+ }, 2000);
40
+ return () => {
41
+ if (intervalRef.current) {
42
+ clearInterval(intervalRef.current);
43
+ }
44
+ };
45
+ }
46
+ }, [state]);
47
+ // Validate, create record, and refresh list
48
+ useEffect(() => {
49
+ let cancelled = false;
50
+ const manager = configManager ?? new ConfigManager();
51
+ async function addRecord() {
52
+ // Check auth
53
+ const authStatus = getAuthStatus(manager);
54
+ if (!authStatus.authenticated) {
55
+ setErrorMessage("Please run `dominion login` first to manage DNS records.");
56
+ setState("error");
57
+ setTimeout(() => exit(), 200);
58
+ return;
59
+ }
60
+ // Validate input
61
+ const effectiveTtl = ttl ?? DEFAULT_TTL;
62
+ const validation = validateDnsRecordInput(type, name, value, effectiveTtl, priority);
63
+ if (validation.warnings.length > 0) {
64
+ setWarnings(validation.warnings);
65
+ }
66
+ if (!validation.valid) {
67
+ setErrorMessage(validation.errors.join("\n"));
68
+ setState("error");
69
+ setTimeout(() => exit(), 200);
70
+ return;
71
+ }
72
+ // Create the record
73
+ setState("creating");
74
+ try {
75
+ const apiClient = client ?? new NamecomClient();
76
+ const recordInput = {
77
+ host: name,
78
+ type: type.toUpperCase(),
79
+ answer: value,
80
+ ttl: effectiveTtl,
81
+ ...(priority !== undefined ? { priority } : {}),
82
+ };
83
+ const created = await apiClient.createDnsRecord(domain, recordInput);
84
+ if (cancelled)
85
+ return;
86
+ setCreatedRecord(created);
87
+ // For --json output, print new record and exit
88
+ if (json) {
89
+ console.log(JSON.stringify(created, null, 2));
90
+ setState("done");
91
+ setTimeout(() => exit(), 200);
92
+ return;
93
+ }
94
+ // Refresh the full records list
95
+ setState("refreshing");
96
+ const response = await apiClient.listDnsRecords(domain);
97
+ if (cancelled)
98
+ return;
99
+ setAllRecords(response.records ?? []);
100
+ setState("done");
101
+ setTimeout(() => exit(), 200);
102
+ }
103
+ catch (err) {
104
+ if (cancelled)
105
+ return;
106
+ if (err instanceof DomainError) {
107
+ setErrorMessage(err.message);
108
+ }
109
+ else {
110
+ setErrorMessage(err instanceof Error
111
+ ? err.message
112
+ : "An unexpected error occurred while creating the DNS record.");
113
+ }
114
+ setState("error");
115
+ setTimeout(() => exit(), 200);
116
+ }
117
+ }
118
+ addRecord();
119
+ return () => {
120
+ cancelled = true;
121
+ };
122
+ }, [domain, type, name, value, ttl, priority, json, configManager, client, exit]);
123
+ // ─── Loading state ──────────────────────────────────────────────────────────
124
+ if (state === "validating" || state === "creating" || state === "refreshing") {
125
+ const statusMsg = state === "validating"
126
+ ? "Validating record..."
127
+ : state === "creating"
128
+ ? `Creating ${type.toUpperCase()} record for ${domain}...`
129
+ : "Refreshing record list...";
130
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: statusMsg }), _jsxs(Text, { color: "yellow", children: ["\u2837", " ", loadingMessage] })] }));
131
+ }
132
+ // ─── Error state ────────────────────────────────────────────────────────────
133
+ if (state === "error") {
134
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { bold: true, color: "red", children: "Failed to add DNS record" }), _jsx(Text, { color: "red", children: errorMessage }), warnings.length > 0 && (_jsx(Box, { flexDirection: "column", children: warnings.map((w, i) => (_jsxs(Text, { color: "yellow", children: ["\u26A0", " ", w] }, i))) }))] }));
135
+ }
136
+ // ─── JSON output ────────────────────────────────────────────────────────────
137
+ if (json) {
138
+ return null;
139
+ }
140
+ // ─── Success output ─────────────────────────────────────────────────────────
141
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Box, { children: [_jsxs(Text, { color: "green", children: ["\u2713", " "] }), _jsxs(Text, { bold: true, color: "green", children: [type.toUpperCase(), " record created"] }), createdRecord && (_jsxs(Text, { color: "gray", children: [" (ID: ", createdRecord.id, ")"] }))] }), warnings.length > 0 && (_jsx(Box, { flexDirection: "column", children: warnings.map((w, i) => (_jsxs(Text, { color: "yellow", children: ["\u26A0", " ", w] }, i))) })), _jsxs(Text, { bold: true, color: "cyan", children: ["DNS Records for ", domain] }), _jsx(DnsTable, { records: allRecords, domain: domain })] }));
142
+ }
143
+ export default DnsAdd;
144
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/dns/add.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Barrel exports for DNS management commands.
3
+ */
4
+ export { DnsList } from "./list.js";
5
+ export { DnsAdd } from "./add.js";
6
+ export { DnsRemove } from "./remove.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/dns/index.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Barrel exports for DNS management commands.
3
+ */
4
+ export { DnsList } from "./list.js";
5
+ export { DnsAdd } from "./add.js";
6
+ export { DnsRemove } from "./remove.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dns/index.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * dominion dns <domain> list — list all DNS records for a domain.
3
+ *
4
+ * Fetches all DNS records via NamecomClient.listDnsRecords() and
5
+ * displays them in a formatted table with type-colored output.
6
+ *
7
+ * Features:
8
+ * - Color-coded record types (A=green, CNAME=cyan, MX=magenta, etc.)
9
+ * - Human-readable TTL display (5m, 1h, 1d)
10
+ * - Priority column shown only when MX/SRV records exist
11
+ * - --json flag outputs raw JSON for piping/scripting
12
+ * - Empty state with hint to add records
13
+ */
14
+ import { NamecomClient } from "../../lib/namecom-client.js";
15
+ import { ConfigManager } from "../../lib/config.js";
16
+ export interface DnsListProps {
17
+ domain: string;
18
+ json?: boolean;
19
+ configManager?: ConfigManager;
20
+ client?: NamecomClient;
21
+ }
22
+ export declare function DnsList({ domain, json, configManager, client }: DnsListProps): import("react/jsx-runtime").JSX.Element | null;
23
+ export default DnsList;
24
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/dns/list.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAID,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,YAAY,kDAuH5E;AAED,eAAe,OAAO,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * dominion dns <domain> list — list all DNS records for a domain.
4
+ *
5
+ * Fetches all DNS records via NamecomClient.listDnsRecords() and
6
+ * displays them in a formatted table with type-colored output.
7
+ *
8
+ * Features:
9
+ * - Color-coded record types (A=green, CNAME=cyan, MX=magenta, etc.)
10
+ * - Human-readable TTL display (5m, 1h, 1d)
11
+ * - Priority column shown only when MX/SRV records exist
12
+ * - --json flag outputs raw JSON for piping/scripting
13
+ * - Empty state with hint to add records
14
+ */
15
+ import { Box, Text, useApp } from "ink";
16
+ import { useState, useEffect, useRef } from "react";
17
+ import { NamecomClient } from "../../lib/namecom-client.js";
18
+ import { ConfigManager } from "../../lib/config.js";
19
+ import { getAuthStatus } from "../../lib/auth.js";
20
+ import { getRandomMessage } from "../../components/spinner-messages.js";
21
+ import { DnsTable } from "../../components/dns-table.js";
22
+ import { DomainError } from "../../lib/types.js";
23
+ export function DnsList({ domain, json, configManager, client }) {
24
+ const { exit } = useApp();
25
+ const [state, setState] = useState("loading");
26
+ const [records, setRecords] = useState([]);
27
+ const [loadingMessage, setLoadingMessage] = useState(getRandomMessage());
28
+ const [errorMessage, setErrorMessage] = useState("");
29
+ const intervalRef = useRef(null);
30
+ // Rotate loading messages
31
+ useEffect(() => {
32
+ if (state === "loading") {
33
+ intervalRef.current = setInterval(() => {
34
+ setLoadingMessage(getRandomMessage());
35
+ }, 2000);
36
+ return () => {
37
+ if (intervalRef.current) {
38
+ clearInterval(intervalRef.current);
39
+ }
40
+ };
41
+ }
42
+ }, [state]);
43
+ // Fetch DNS records
44
+ useEffect(() => {
45
+ let cancelled = false;
46
+ const manager = configManager ?? new ConfigManager();
47
+ async function fetchRecords() {
48
+ // Check auth
49
+ const authStatus = getAuthStatus(manager);
50
+ if (!authStatus.authenticated) {
51
+ setErrorMessage("Please run `dominion login` first to manage DNS records.");
52
+ setState("error");
53
+ setTimeout(() => exit(), 200);
54
+ return;
55
+ }
56
+ try {
57
+ const apiClient = client ?? new NamecomClient();
58
+ const response = await apiClient.listDnsRecords(domain);
59
+ if (cancelled)
60
+ return;
61
+ setRecords(response.records ?? []);
62
+ setState("done");
63
+ // For --json output, print and exit immediately
64
+ if (json) {
65
+ console.log(JSON.stringify(response.records ?? [], null, 2));
66
+ }
67
+ setTimeout(() => exit(), 200);
68
+ }
69
+ catch (err) {
70
+ if (cancelled)
71
+ return;
72
+ if (err instanceof DomainError) {
73
+ if (err.code === "DOMAIN_NOT_FOUND") {
74
+ setErrorMessage(`Domain "${domain}" not found in your account. Run \`dominion domains\` to see your domains.`);
75
+ }
76
+ else {
77
+ setErrorMessage(err.message);
78
+ }
79
+ }
80
+ else {
81
+ setErrorMessage(err instanceof Error
82
+ ? err.message
83
+ : "An unexpected error occurred while fetching DNS records.");
84
+ }
85
+ setState("error");
86
+ setTimeout(() => exit(), 200);
87
+ }
88
+ }
89
+ fetchRecords();
90
+ return () => {
91
+ cancelled = true;
92
+ };
93
+ }, [domain, json, configManager, client, exit]);
94
+ // ─── Loading state ──────────────────────────────────────────────────────────
95
+ if (state === "loading") {
96
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Loading DNS records for ", domain, "..."] }), _jsxs(Text, { color: "yellow", children: ["\u2837", " ", loadingMessage] })] }));
97
+ }
98
+ // ─── Error state ────────────────────────────────────────────────────────────
99
+ if (state === "error") {
100
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { bold: true, color: "red", children: "Failed to load DNS records" }), _jsx(Text, { color: "red", children: errorMessage })] }));
101
+ }
102
+ // ─── JSON output ────────────────────────────────────────────────────────────
103
+ if (json) {
104
+ // JSON was already printed to stdout; show nothing in Ink
105
+ return null;
106
+ }
107
+ // ─── Table output ───────────────────────────────────────────────────────────
108
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["DNS Records for ", domain] }), _jsx(DnsTable, { records: records, domain: domain })] }));
109
+ }
110
+ export default DnsList;
111
+ //# sourceMappingURL=list.js.map