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,185 @@
1
+ /**
2
+ * Dominion CLI — consistent color palette and theme utilities.
3
+ *
4
+ * All output uses these named colors for visual consistency.
5
+ * Supports --no-color (via NO_COLOR env or chalk detection)
6
+ * and --quiet mode for scripting.
7
+ *
8
+ * Color palette:
9
+ * - primary: cyan/blue gradient
10
+ * - success: green
11
+ * - warning: yellow
12
+ * - error: red
13
+ * - muted: gray
14
+ * - premium: gold/yellow
15
+ * - accent: magenta
16
+ */
17
+ import chalk from "chalk";
18
+ // ─── Global flags ────────────────────────────────────────────────────────────
19
+ let _noColor = false;
20
+ let _quiet = false;
21
+ /**
22
+ * Enable or disable color output globally.
23
+ * Respects NO_COLOR env var: https://no-color.org/
24
+ */
25
+ export function setNoColor(value) {
26
+ _noColor = value;
27
+ if (value) {
28
+ chalk.level = 0;
29
+ }
30
+ }
31
+ /**
32
+ * Enable or disable quiet mode (suppresses decorative output).
33
+ * When quiet, logos, animations, and decorative ASCII are hidden.
34
+ */
35
+ export function setQuiet(value) {
36
+ _quiet = value;
37
+ }
38
+ export function isNoColor() {
39
+ return _noColor || process.env.NO_COLOR !== undefined;
40
+ }
41
+ export function isQuiet() {
42
+ return _quiet;
43
+ }
44
+ // ─── Named Colors ────────────────────────────────────────────────────────────
45
+ export const colors = {
46
+ /** Primary brand color — cyan */
47
+ primary: chalk.cyan,
48
+ /** Primary bold — cyan + bold */
49
+ primaryBold: chalk.cyan.bold,
50
+ /** Success — green */
51
+ success: chalk.green,
52
+ /** Success bold — green + bold */
53
+ successBold: chalk.green.bold,
54
+ /** Warning — yellow */
55
+ warning: chalk.yellow,
56
+ /** Warning bold — yellow + bold */
57
+ warningBold: chalk.yellow.bold,
58
+ /** Error — red */
59
+ error: chalk.red,
60
+ /** Error bold — red + bold */
61
+ errorBold: chalk.red.bold,
62
+ /** Muted/secondary — gray */
63
+ muted: chalk.gray,
64
+ /** Premium/gold — yellow */
65
+ premium: chalk.yellow,
66
+ /** Accent — magenta */
67
+ accent: chalk.magenta,
68
+ /** Accent bold — magenta + bold */
69
+ accentBold: chalk.magenta.bold,
70
+ /** White bold — for emphasis */
71
+ bold: chalk.white.bold,
72
+ /** Dim — for de-emphasized text */
73
+ dim: chalk.dim,
74
+ };
75
+ // ─── Ink Color Names ─────────────────────────────────────────────────────────
76
+ /**
77
+ * Named color strings for Ink's `color` prop.
78
+ * Use these instead of raw strings to keep the palette consistent.
79
+ */
80
+ export const inkColors = {
81
+ primary: "cyan",
82
+ success: "green",
83
+ warning: "yellow",
84
+ error: "red",
85
+ muted: "gray",
86
+ premium: "yellow",
87
+ accent: "magenta",
88
+ white: "white",
89
+ };
90
+ // ─── Gradient Presets ────────────────────────────────────────────────────────
91
+ /**
92
+ * Gradient color stops for gradient-string.
93
+ * Used for the logo and decorative headers.
94
+ */
95
+ export const gradients = {
96
+ /** Primary brand gradient: cyan → blue */
97
+ brand: ["#00d4ff", "#0066ff", "#3333ff"],
98
+ /** Premium gradient: gold → orange */
99
+ premium: ["#ffd700", "#ff8c00", "#ff6600"],
100
+ /** Success gradient: green → teal */
101
+ success: ["#00ff88", "#00cc66", "#009944"],
102
+ /** Spooky gradient (Friday the 13th): orange → purple */
103
+ spooky: ["#ff6600", "#cc33ff", "#6600cc"],
104
+ };
105
+ // ─── Friday the 13th Mode ─────────────────────────────────────────────────
106
+ /**
107
+ * Check if today is Friday the 13th.
108
+ * When true, the CLI uses the spooky palette.
109
+ */
110
+ export function isFriday13th(date) {
111
+ const d = date ?? new Date();
112
+ return d.getDay() === 5 && d.getDate() === 13;
113
+ }
114
+ /**
115
+ * Get the active gradient based on date.
116
+ * Returns spooky gradient on Friday the 13th, brand gradient otherwise.
117
+ */
118
+ export function getActiveGradient(date) {
119
+ return isFriday13th(date) ? gradients.spooky : gradients.brand;
120
+ }
121
+ /**
122
+ * Spooky skull ASCII for Friday the 13th logo variant.
123
+ */
124
+ export const SPOOKY_SKULL = `
125
+ .------.
126
+ / .--. \\
127
+ | / \\ |
128
+ || 💀 ||
129
+ | \\ / |
130
+ \\ '--' /
131
+ '------'
132
+ `;
133
+ // ─── Box Styles ──────────────────────────────────────────────────────────────
134
+ /**
135
+ * Consistent box styling for Ink Box components.
136
+ */
137
+ export const boxStyles = {
138
+ /** Standard rounded card */
139
+ card: {
140
+ borderStyle: "round",
141
+ borderColor: "cyan",
142
+ paddingX: 2,
143
+ paddingY: 1,
144
+ },
145
+ /** Success card */
146
+ success: {
147
+ borderStyle: "round",
148
+ borderColor: "green",
149
+ paddingX: 2,
150
+ paddingY: 1,
151
+ },
152
+ /** Warning card */
153
+ warning: {
154
+ borderStyle: "round",
155
+ borderColor: "yellow",
156
+ paddingX: 2,
157
+ paddingY: 1,
158
+ },
159
+ /** Error card */
160
+ error: {
161
+ borderStyle: "round",
162
+ borderColor: "red",
163
+ paddingX: 2,
164
+ paddingY: 1,
165
+ },
166
+ };
167
+ // ─── Symbols ─────────────────────────────────────────────────────────────────
168
+ /**
169
+ * Unicode symbols used across the CLI.
170
+ */
171
+ export const symbols = {
172
+ check: "\u2713", // ✓
173
+ cross: "\u2717", // ✗
174
+ bullet: "\u2022", // •
175
+ arrow: "\u2192", // →
176
+ star: "\u2605", // ★
177
+ diamond: "\u25C6", // ◆
178
+ info: "\u2139", // ℹ
179
+ warning: "\u26A0", // ⚠
180
+ lock: "\uD83D\uDD12", // 🔒
181
+ hourglass: "\u231B", // ⌛
182
+ magnify: "\uD83D\uDD0D", // 🔍
183
+ sparkle: "\u2728", // ✨
184
+ };
185
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/lib/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Types for the Name.com API client and domain operations.
3
+ * Vendored from dominion-site — kept identical for consistency.
4
+ *
5
+ * Name.com REST v4 API: https://www.name.com/api-docs
6
+ */
7
+ export interface ContactInfo {
8
+ firstName: string;
9
+ lastName: string;
10
+ email: string;
11
+ phone: string;
12
+ address1: string;
13
+ address2?: string;
14
+ city: string;
15
+ state: string;
16
+ zip: string;
17
+ country: string;
18
+ organization?: string;
19
+ }
20
+ export interface Contacts {
21
+ registrant: ContactInfo;
22
+ admin: ContactInfo;
23
+ tech: ContactInfo;
24
+ billing: ContactInfo;
25
+ }
26
+ export interface DomainSearchResult {
27
+ domainName: string;
28
+ sld: string;
29
+ tld: string;
30
+ purchasable: boolean;
31
+ premium: boolean;
32
+ purchasePrice: number;
33
+ purchaseType: string;
34
+ renewalPrice: number;
35
+ }
36
+ export interface DomainSearchResponse {
37
+ results: DomainSearchResult[];
38
+ }
39
+ export interface DomainAvailability {
40
+ domainName: string;
41
+ purchasable: boolean;
42
+ premium: boolean;
43
+ purchasePrice: number;
44
+ renewalPrice: number;
45
+ }
46
+ export interface RegisterDomainRequest {
47
+ domain: {
48
+ domainName: string;
49
+ purchasePrice: number;
50
+ privacy: {
51
+ enabled: boolean;
52
+ };
53
+ contacts: Contacts;
54
+ nameservers?: string[];
55
+ autoRenew?: boolean;
56
+ };
57
+ }
58
+ export interface Domain {
59
+ domainName: string;
60
+ nameservers: string[];
61
+ contacts: Contacts;
62
+ privacyEnabled: boolean;
63
+ locked: boolean;
64
+ autoRenewEnabled: boolean;
65
+ expireDate: string;
66
+ createDate: string;
67
+ renewalPrice: number;
68
+ }
69
+ export interface ListDomainsResponse {
70
+ domains: Domain[];
71
+ nextPage?: number;
72
+ lastPage?: number;
73
+ }
74
+ export type DnsRecordType = "A" | "AAAA" | "ANAME" | "CNAME" | "MX" | "NS" | "SRV" | "TXT" | "URL";
75
+ export interface DnsRecord {
76
+ id: number;
77
+ domainName: string;
78
+ host: string;
79
+ fqdn: string;
80
+ type: DnsRecordType;
81
+ answer: string;
82
+ ttl: number;
83
+ priority?: number;
84
+ }
85
+ export interface DnsRecordInput {
86
+ host: string;
87
+ type: DnsRecordType;
88
+ answer: string;
89
+ ttl?: number;
90
+ priority?: number;
91
+ }
92
+ export interface ListDnsRecordsResponse {
93
+ records: DnsRecord[];
94
+ nextPage?: number;
95
+ lastPage?: number;
96
+ }
97
+ export interface RenewDomainRequest {
98
+ purchasePrice: number;
99
+ years?: number;
100
+ }
101
+ export interface RenewDomainResponse {
102
+ domain: Domain;
103
+ order: number;
104
+ totalPaid: number;
105
+ }
106
+ export type DomainErrorCode = "INVALID_DOMAIN" | "DOMAIN_NOT_AVAILABLE" | "DOMAIN_NOT_FOUND" | "REGISTRATION_FAILED" | "DNS_ERROR" | "RENEWAL_FAILED" | "RATE_LIMITED" | "AUTH_ERROR" | "API_ERROR" | "VALIDATION_ERROR" | "NETWORK_ERROR";
107
+ export declare class DomainError extends Error {
108
+ readonly code: DomainErrorCode;
109
+ readonly details?: Record<string, unknown>;
110
+ readonly statusCode?: number;
111
+ constructor(code: DomainErrorCode, message: string, details?: Record<string, unknown>, statusCode?: number);
112
+ }
113
+ export interface NamecomClientConfig {
114
+ username: string;
115
+ token: string;
116
+ baseUrl?: string;
117
+ maxRequestsPerSecond?: number;
118
+ }
119
+ /** Shape of ~/.dominion/config.json */
120
+ export interface DominionConfig {
121
+ namecom: {
122
+ username: string;
123
+ token: string;
124
+ };
125
+ vercel?: {
126
+ token: string;
127
+ projectId: string;
128
+ teamId?: string;
129
+ };
130
+ contactInfo?: ContactInfo;
131
+ preferences: {
132
+ defaultTlds: string[];
133
+ outputFormat: "table" | "json";
134
+ };
135
+ }
136
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Types for the Name.com API client and domain operations.
3
+ * Vendored from dominion-site — kept identical for consistency.
4
+ *
5
+ * Name.com REST v4 API: https://www.name.com/api-docs
6
+ */
7
+ export class DomainError extends Error {
8
+ code;
9
+ details;
10
+ statusCode;
11
+ constructor(code, message, details, statusCode) {
12
+ super(message);
13
+ this.name = "DomainError";
14
+ this.code = code;
15
+ this.details = details;
16
+ this.statusCode = statusCode;
17
+ }
18
+ }
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyJH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpB,IAAI,CAAkB;IACtB,OAAO,CAA2B;IAClC,UAAU,CAAU;IAEpC,YACE,IAAqB,EACrB,OAAe,EACf,OAAiC,EACjC,UAAmB;QAEnB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Vercel REST API client for custom domain management.
3
+ * Vendored from dominion-site — adapted to read credentials from ConfigManager.
4
+ *
5
+ * Handles domain registration, removal, verification, and polling
6
+ * for the Vercel project integration.
7
+ *
8
+ * @see https://vercel.com/docs/rest-api/endpoints/projects/domains
9
+ */
10
+ /** Vercel domain object returned from the API. */
11
+ export interface VercelDomain {
12
+ name: string;
13
+ apexName: string;
14
+ projectId: string;
15
+ verified: boolean;
16
+ /** Verification record details (if DNS verification is required). */
17
+ verification?: VercelDomainVerification[];
18
+ /** Git branch to link the domain to (null = production). */
19
+ gitBranch: string | null;
20
+ /** Redirect target domain (null = no redirect). */
21
+ redirect: string | null;
22
+ redirectStatusCode: number | null;
23
+ createdAt: number;
24
+ updatedAt: number;
25
+ }
26
+ export interface VercelDomainVerification {
27
+ type: string;
28
+ domain: string;
29
+ value: string;
30
+ reason: string;
31
+ }
32
+ /** Response from POST /projects/{id}/domains/{domain}/verify. */
33
+ export interface VercelVerifyResponse {
34
+ name: string;
35
+ verified: boolean;
36
+ verification?: VercelDomainVerification[];
37
+ }
38
+ /** Response from GET /projects/{id}/domains (list). */
39
+ export interface VercelListDomainsResponse {
40
+ domains: VercelDomain[];
41
+ pagination: {
42
+ count: number;
43
+ next: number | null;
44
+ prev: number | null;
45
+ };
46
+ }
47
+ /** Configuration for the Vercel API client. */
48
+ export interface VercelClientConfig {
49
+ apiToken: string;
50
+ projectId: string;
51
+ teamId?: string;
52
+ baseUrl?: string;
53
+ }
54
+ export declare class VercelClient {
55
+ private readonly baseUrl;
56
+ private readonly apiToken;
57
+ private readonly projectId;
58
+ private readonly teamId;
59
+ /**
60
+ * Create a new VercelClient.
61
+ *
62
+ * Credentials are resolved in order:
63
+ * 1. Explicit config parameter (apiToken + projectId)
64
+ * 2. ConfigManager (~/.dominion/config.json vercel section)
65
+ * 3. Environment variables (VERCEL_API_TOKEN + VERCEL_PROJECT_ID)
66
+ */
67
+ constructor(config?: Partial<VercelClientConfig>);
68
+ /**
69
+ * Add a custom domain to the Vercel project.
70
+ * If the domain already exists, Vercel returns it (idempotent).
71
+ */
72
+ addDomain(domain: string): Promise<VercelDomain>;
73
+ /**
74
+ * Remove a custom domain from the Vercel project.
75
+ */
76
+ removeDomain(domain: string): Promise<void>;
77
+ /**
78
+ * Get details for a specific domain on the Vercel project.
79
+ */
80
+ getDomain(domain: string): Promise<VercelDomain>;
81
+ /**
82
+ * List all custom domains on the Vercel project.
83
+ */
84
+ listDomains(): Promise<VercelListDomainsResponse>;
85
+ /**
86
+ * Trigger a verification check for a domain on the Vercel project.
87
+ */
88
+ verifyDomain(domain: string): Promise<VercelVerifyResponse>;
89
+ /**
90
+ * Poll domain verification status until verified or timeout.
91
+ *
92
+ * @param domain - The domain name to verify
93
+ * @param timeoutMs - Maximum time to wait (default: 5 minutes)
94
+ * @param intervalMs - Time between polls (default: 30 seconds)
95
+ * @param onPoll - Optional callback on each poll attempt
96
+ * @returns true if verified, false if timed out
97
+ */
98
+ pollVerification(domain: string, timeoutMs?: number, intervalMs?: number, onPoll?: (attempt: number, elapsed: number) => void): Promise<boolean>;
99
+ /**
100
+ * Get the project ID this client is configured for.
101
+ */
102
+ getProjectId(): string;
103
+ /**
104
+ * Get the team ID (if configured).
105
+ */
106
+ getTeamId(): string | undefined;
107
+ private request;
108
+ private handleApiError;
109
+ }
110
+ //# sourceMappingURL=vercel-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-client.d.ts","sourceRoot":"","sources":["../../src/lib/vercel-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,YAAY,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC1C,4DAA4D;IAC5D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,wBAAwB,EAAE,CAAC;CAC3C;AAED,uDAAuD;AACvD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;KACrB,CAAC;CACH;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C;;;;;;;OAOG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IA2ChD;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAStD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQtD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAQvD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAUjE;;;;;;;;OAQG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,SAAS,SAAgB,EACzB,UAAU,SAAY,EACtB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAC,OAAO,CAAC;IA6BnB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;YAMjB,OAAO;IAuDrB,OAAO,CAAC,cAAc;CAmDvB"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Vercel REST API client for custom domain management.
3
+ * Vendored from dominion-site — adapted to read credentials from ConfigManager.
4
+ *
5
+ * Handles domain registration, removal, verification, and polling
6
+ * for the Vercel project integration.
7
+ *
8
+ * @see https://vercel.com/docs/rest-api/endpoints/projects/domains
9
+ */
10
+ import { DomainError } from "./types.js";
11
+ import { ConfigManager } from "./config.js";
12
+ // ─── Client ──────────────────────────────────────────────────────────────────
13
+ const DEFAULT_BASE_URL = "https://api.vercel.com";
14
+ export class VercelClient {
15
+ baseUrl;
16
+ apiToken;
17
+ projectId;
18
+ teamId;
19
+ /**
20
+ * Create a new VercelClient.
21
+ *
22
+ * Credentials are resolved in order:
23
+ * 1. Explicit config parameter (apiToken + projectId)
24
+ * 2. ConfigManager (~/.dominion/config.json vercel section)
25
+ * 3. Environment variables (VERCEL_API_TOKEN + VERCEL_PROJECT_ID)
26
+ */
27
+ constructor(config) {
28
+ let apiToken = config?.apiToken;
29
+ let projectId = config?.projectId;
30
+ let teamId = config?.teamId;
31
+ // Fall back to ConfigManager if no explicit credentials
32
+ if (!apiToken || !projectId) {
33
+ const configManager = new ConfigManager();
34
+ const storedConfig = configManager.load();
35
+ if (storedConfig.vercel) {
36
+ apiToken = apiToken ?? storedConfig.vercel.token;
37
+ projectId = projectId ?? storedConfig.vercel.projectId;
38
+ teamId = teamId ?? storedConfig.vercel.teamId;
39
+ }
40
+ }
41
+ // Fall back to environment variables
42
+ apiToken = apiToken ?? process.env.VERCEL_API_TOKEN;
43
+ projectId = projectId ?? process.env.VERCEL_PROJECT_ID;
44
+ teamId = teamId ?? process.env.VERCEL_TEAM_ID;
45
+ if (!apiToken) {
46
+ throw new DomainError("AUTH_ERROR", "Vercel API token is required. Run `dominion vercel setup` to configure.");
47
+ }
48
+ if (!projectId) {
49
+ throw new DomainError("VALIDATION_ERROR", "Vercel project ID is required. Run `dominion vercel setup` to configure.");
50
+ }
51
+ this.apiToken = apiToken;
52
+ this.projectId = projectId;
53
+ this.teamId = teamId;
54
+ this.baseUrl = config?.baseUrl ?? DEFAULT_BASE_URL;
55
+ }
56
+ // ─── Domain Operations ──────────────────────────────────────────────────
57
+ /**
58
+ * Add a custom domain to the Vercel project.
59
+ * If the domain already exists, Vercel returns it (idempotent).
60
+ */
61
+ async addDomain(domain) {
62
+ const data = await this.request("POST", `/v10/projects/${this.projectId}/domains`, { name: domain });
63
+ return data;
64
+ }
65
+ /**
66
+ * Remove a custom domain from the Vercel project.
67
+ */
68
+ async removeDomain(domain) {
69
+ await this.request("DELETE", `/v10/projects/${this.projectId}/domains/${domain}`);
70
+ }
71
+ /**
72
+ * Get details for a specific domain on the Vercel project.
73
+ */
74
+ async getDomain(domain) {
75
+ const data = await this.request("GET", `/v10/projects/${this.projectId}/domains/${domain}`);
76
+ return data;
77
+ }
78
+ /**
79
+ * List all custom domains on the Vercel project.
80
+ */
81
+ async listDomains() {
82
+ const data = await this.request("GET", `/v10/projects/${this.projectId}/domains`);
83
+ return data;
84
+ }
85
+ /**
86
+ * Trigger a verification check for a domain on the Vercel project.
87
+ */
88
+ async verifyDomain(domain) {
89
+ const data = await this.request("POST", `/v10/projects/${this.projectId}/domains/${domain}/verify`);
90
+ return data;
91
+ }
92
+ // ─── Polling ────────────────────────────────────────────────────────────
93
+ /**
94
+ * Poll domain verification status until verified or timeout.
95
+ *
96
+ * @param domain - The domain name to verify
97
+ * @param timeoutMs - Maximum time to wait (default: 5 minutes)
98
+ * @param intervalMs - Time between polls (default: 30 seconds)
99
+ * @param onPoll - Optional callback on each poll attempt
100
+ * @returns true if verified, false if timed out
101
+ */
102
+ async pollVerification(domain, timeoutMs = 5 * 60 * 1000, intervalMs = 30 * 1000, onPoll) {
103
+ const deadline = Date.now() + timeoutMs;
104
+ const startTime = Date.now();
105
+ let attempt = 0;
106
+ while (Date.now() < deadline) {
107
+ attempt++;
108
+ onPoll?.(attempt, Date.now() - startTime);
109
+ try {
110
+ const result = await this.verifyDomain(domain);
111
+ if (result.verified) {
112
+ return true;
113
+ }
114
+ }
115
+ catch {
116
+ // Continue polling — transient failures are expected
117
+ }
118
+ // Wait before next poll (but don't wait past deadline)
119
+ const remaining = deadline - Date.now();
120
+ if (remaining <= 0)
121
+ break;
122
+ await new Promise((resolve) => setTimeout(resolve, Math.min(intervalMs, remaining)));
123
+ }
124
+ return false;
125
+ }
126
+ /**
127
+ * Get the project ID this client is configured for.
128
+ */
129
+ getProjectId() {
130
+ return this.projectId;
131
+ }
132
+ /**
133
+ * Get the team ID (if configured).
134
+ */
135
+ getTeamId() {
136
+ return this.teamId;
137
+ }
138
+ // ─── HTTP Layer ─────────────────────────────────────────────────────────
139
+ async request(method, path, body) {
140
+ const url = new URL(path, this.baseUrl);
141
+ if (this.teamId) {
142
+ url.searchParams.set("teamId", this.teamId);
143
+ }
144
+ const headers = {
145
+ Authorization: `Bearer ${this.apiToken}`,
146
+ "Content-Type": "application/json",
147
+ };
148
+ const init = { method, headers };
149
+ if (body !== undefined && method !== "GET" && method !== "DELETE") {
150
+ init.body = JSON.stringify(body);
151
+ }
152
+ let response;
153
+ try {
154
+ response = await fetch(url.toString(), init);
155
+ }
156
+ catch (err) {
157
+ throw new DomainError("NETWORK_ERROR", `Failed to connect to Vercel API: ${err.message}`, { url: url.toString(), method });
158
+ }
159
+ // 204 No Content (successful DELETE)
160
+ if (response.status === 204) {
161
+ return {};
162
+ }
163
+ let data;
164
+ try {
165
+ data = await response.json();
166
+ }
167
+ catch {
168
+ throw new DomainError("API_ERROR", `Invalid JSON response from Vercel API (${response.status})`, { url: url.toString(), method, status: response.status }, response.status);
169
+ }
170
+ if (!response.ok) {
171
+ this.handleApiError(response.status, data);
172
+ }
173
+ return data;
174
+ }
175
+ handleApiError(status, data) {
176
+ const errorData = data;
177
+ const errorObj = errorData?.error;
178
+ const message = errorObj?.message ??
179
+ errorData?.message ??
180
+ `Vercel API error (${status})`;
181
+ if (status === 401 || status === 403) {
182
+ throw new DomainError("AUTH_ERROR", `Vercel authentication failed: ${message}`, { status }, status);
183
+ }
184
+ if (status === 404) {
185
+ throw new DomainError("DOMAIN_NOT_FOUND", message, { status }, status);
186
+ }
187
+ if (status === 409) {
188
+ throw new DomainError("API_ERROR", `Domain conflict: ${message}`, { status }, status);
189
+ }
190
+ if (status === 429) {
191
+ throw new DomainError("RATE_LIMITED", "Rate limited by Vercel API. Please try again later.", { status }, status);
192
+ }
193
+ throw new DomainError("API_ERROR", message, { status }, status);
194
+ }
195
+ }
196
+ //# sourceMappingURL=vercel-client.js.map