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
+ * 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
+ /** Valid DNS record types for the CLI. */
16
+ const VALID_TYPES = [
17
+ "A",
18
+ "AAAA",
19
+ "ANAME",
20
+ "CNAME",
21
+ "MX",
22
+ "NS",
23
+ "SRV",
24
+ "TXT",
25
+ "URL",
26
+ ];
27
+ /** Default TTL in seconds (matches web app's DEFAULT_TTL). */
28
+ export const DEFAULT_TTL = 300;
29
+ /** Min / max TTL allowed by Name.com. */
30
+ export const MIN_TTL = 300;
31
+ export const MAX_TTL = 604800; // 7 days
32
+ // ─── Regex patterns ──────────────────────────────────────────────────────────
33
+ const IPV4_REGEX = /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/;
34
+ const IPV6_REGEX = /^(?:[a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}$|^::(?:[a-fA-F0-9]{1,4}:){0,5}[a-fA-F0-9]{1,4}$|^[a-fA-F0-9]{1,4}::(?:[a-fA-F0-9]{1,4}:){0,4}[a-fA-F0-9]{1,4}$|^(?:[a-fA-F0-9]{1,4}:){1,2}:(?:[a-fA-F0-9]{1,4}:){0,3}[a-fA-F0-9]{1,4}$|^(?:[a-fA-F0-9]{1,4}:){1,3}:(?:[a-fA-F0-9]{1,4}:){0,2}[a-fA-F0-9]{1,4}$|^(?:[a-fA-F0-9]{1,4}:){1,4}:(?:[a-fA-F0-9]{1,4}:)?[a-fA-F0-9]{1,4}$|^(?:[a-fA-F0-9]{1,4}:){1,5}:[a-fA-F0-9]{1,4}$|^(?:[a-fA-F0-9]{1,4}:){1,6}:$/;
35
+ const HOSTNAME_REGEX = /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)*[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.?$/;
36
+ // ─── Validators ──────────────────────────────────────────────────────────────
37
+ /**
38
+ * Validate that a string is a valid DNS record type.
39
+ */
40
+ export function validateType(type) {
41
+ const upper = type.toUpperCase();
42
+ const errors = [];
43
+ const warnings = [];
44
+ if (!VALID_TYPES.includes(upper)) {
45
+ errors.push(`Invalid DNS record type "${type}". Valid types: ${VALID_TYPES.join(", ")}`);
46
+ }
47
+ return { valid: errors.length === 0, errors, warnings };
48
+ }
49
+ /**
50
+ * Validate the host/name field for a DNS record.
51
+ */
52
+ export function validateHost(host) {
53
+ const errors = [];
54
+ const warnings = [];
55
+ if (host.startsWith(".")) {
56
+ errors.push("Host must not start with a leading dot. Use '@' for the root domain or a bare subdomain name.");
57
+ }
58
+ if (host.length > 253) {
59
+ errors.push("Host name exceeds maximum length of 253 characters.");
60
+ }
61
+ return { valid: errors.length === 0, errors, warnings };
62
+ }
63
+ /**
64
+ * Validate the answer/value field based on the record type.
65
+ */
66
+ export function validateAnswer(type, answer) {
67
+ const errors = [];
68
+ const warnings = [];
69
+ switch (type) {
70
+ case "A":
71
+ if (!IPV4_REGEX.test(answer)) {
72
+ errors.push(`Invalid IPv4 address "${answer}". Expected format: 192.168.1.1`);
73
+ }
74
+ break;
75
+ case "AAAA":
76
+ if (!IPV6_REGEX.test(answer)) {
77
+ errors.push(`Invalid IPv6 address "${answer}". Expected format: 2001:db8::1`);
78
+ }
79
+ break;
80
+ case "CNAME":
81
+ case "MX":
82
+ case "NS":
83
+ case "ANAME":
84
+ if (!HOSTNAME_REGEX.test(answer)) {
85
+ errors.push(`Invalid hostname "${answer}". Expected a valid domain name.`);
86
+ }
87
+ break;
88
+ case "SRV":
89
+ // SRV answer format: priority weight port target
90
+ // But Name.com may accept just the target — be lenient
91
+ if (!HOSTNAME_REGEX.test(answer) && !/^\d+\s+\d+\s+\d+\s+\S+$/.test(answer)) {
92
+ warnings.push(`SRV answer "${answer}" may not be in expected format. Typical: <weight> <port> <target>`);
93
+ }
94
+ break;
95
+ case "TXT":
96
+ // TXT can be any string
97
+ if (answer.length === 0) {
98
+ errors.push("TXT record value cannot be empty.");
99
+ }
100
+ break;
101
+ case "URL":
102
+ try {
103
+ new URL(answer);
104
+ }
105
+ catch {
106
+ errors.push(`Invalid URL "${answer}". Expected a valid URL (e.g. https://example.com).`);
107
+ }
108
+ break;
109
+ }
110
+ return { valid: errors.length === 0, errors, warnings };
111
+ }
112
+ /**
113
+ * Validate TTL value.
114
+ */
115
+ export function validateTtl(ttl) {
116
+ const errors = [];
117
+ const warnings = [];
118
+ if (!Number.isInteger(ttl)) {
119
+ errors.push("TTL must be an integer.");
120
+ }
121
+ else if (ttl < MIN_TTL) {
122
+ errors.push(`TTL must be at least ${MIN_TTL} seconds (5 minutes).`);
123
+ }
124
+ else if (ttl > MAX_TTL) {
125
+ errors.push(`TTL must be at most ${MAX_TTL} seconds (7 days).`);
126
+ }
127
+ return { valid: errors.length === 0, errors, warnings };
128
+ }
129
+ /**
130
+ * Validate priority (for MX and SRV records).
131
+ */
132
+ export function validatePriority(type, priority) {
133
+ const errors = [];
134
+ const warnings = [];
135
+ if (type === "MX" || type === "SRV") {
136
+ if (priority === undefined || priority === null) {
137
+ warnings.push(`${type} records typically require a priority value. Defaulting to 10.`);
138
+ }
139
+ else if (!Number.isInteger(priority) || priority < 0 || priority > 65535) {
140
+ errors.push("Priority must be an integer between 0 and 65535.");
141
+ }
142
+ }
143
+ else if (priority !== undefined) {
144
+ warnings.push(`Priority is only used for MX and SRV records. It will be ignored for ${type} records.`);
145
+ }
146
+ return { valid: errors.length === 0, errors, warnings };
147
+ }
148
+ /**
149
+ * Full validation of a DNS record input.
150
+ * Returns combined results from all individual validators.
151
+ */
152
+ export function validateDnsRecordInput(type, host, answer, ttl, priority) {
153
+ const allErrors = [];
154
+ const allWarnings = [];
155
+ // Type validation
156
+ const typeResult = validateType(type);
157
+ allErrors.push(...typeResult.errors);
158
+ allWarnings.push(...typeResult.warnings);
159
+ // Host validation
160
+ const hostResult = validateHost(host);
161
+ allErrors.push(...hostResult.errors);
162
+ allWarnings.push(...hostResult.warnings);
163
+ // Answer validation (only if type is valid)
164
+ if (typeResult.valid) {
165
+ const answerResult = validateAnswer(type.toUpperCase(), answer);
166
+ allErrors.push(...answerResult.errors);
167
+ allWarnings.push(...answerResult.warnings);
168
+ // Priority validation
169
+ const priorityResult = validatePriority(type.toUpperCase(), priority);
170
+ allErrors.push(...priorityResult.errors);
171
+ allWarnings.push(...priorityResult.warnings);
172
+ }
173
+ // TTL validation
174
+ if (ttl !== undefined) {
175
+ const ttlResult = validateTtl(ttl);
176
+ allErrors.push(...ttlResult.errors);
177
+ allWarnings.push(...ttlResult.warnings);
178
+ }
179
+ return {
180
+ valid: allErrors.length === 0,
181
+ errors: allErrors,
182
+ warnings: allWarnings,
183
+ };
184
+ }
185
+ //# sourceMappingURL=dns-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-validation.js","sourceRoot":"","sources":["../../src/lib/dns-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Easter egg detection for special domain searches.
3
+ *
4
+ * Certain domain names trigger fun pop-culture references
5
+ * in the search results display.
6
+ */
7
+ export interface EasterEgg {
8
+ domain: string;
9
+ message: string;
10
+ color: string;
11
+ }
12
+ /**
13
+ * Check if a search query matches any easter egg domains.
14
+ * Checks both exact domain matches and keyword-based matches.
15
+ */
16
+ export declare function findEasterEgg(query: string): EasterEgg | null;
17
+ /**
18
+ * Get all registered easter egg domains for testing.
19
+ */
20
+ export declare function getAllEasterEggs(): EasterEgg[];
21
+ //# sourceMappingURL=easter-eggs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"easter-eggs.d.ts","sourceRoot":"","sources":["../../src/lib/easter-eggs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAmCD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAgB7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,SAAS,EAAE,CAE9C"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Easter egg detection for special domain searches.
3
+ *
4
+ * Certain domain names trigger fun pop-culture references
5
+ * in the search results display.
6
+ */
7
+ const EASTER_EGGS = {
8
+ "skynet.ai": {
9
+ domain: "skynet.ai",
10
+ message: "I'll be back... and so will this domain. Judgment Day approaches.",
11
+ color: "red",
12
+ },
13
+ "delorean.io": {
14
+ domain: "delorean.io",
15
+ message: "Great Scott! Where we're going, we don't need roads... but we do need DNS.",
16
+ color: "yellow",
17
+ },
18
+ "hal9000.com": {
19
+ domain: "hal9000.com",
20
+ message: "I'm sorry, Dave. I'm afraid I can't let you register that domain.",
21
+ color: "red",
22
+ },
23
+ "winterfell.io": {
24
+ domain: "winterfell.io",
25
+ message: "Winter is coming... and so is your domain renewal.",
26
+ color: "cyan",
27
+ },
28
+ "hogwarts.edu": {
29
+ domain: "hogwarts.edu",
30
+ message: "You're a webmaster, Harry.",
31
+ color: "magenta",
32
+ },
33
+ "matrix.io": {
34
+ domain: "matrix.io",
35
+ message: "There is no domain. Only the one who frees their mind can see the DNS.",
36
+ color: "green",
37
+ },
38
+ };
39
+ /**
40
+ * Check if a search query matches any easter egg domains.
41
+ * Checks both exact domain matches and keyword-based matches.
42
+ */
43
+ export function findEasterEgg(query) {
44
+ // Check exact domain match
45
+ const normalized = query.toLowerCase().trim();
46
+ if (EASTER_EGGS[normalized]) {
47
+ return EASTER_EGGS[normalized];
48
+ }
49
+ // Check if the query (without TLD) matches the SLD of any easter egg
50
+ for (const [domain, egg] of Object.entries(EASTER_EGGS)) {
51
+ const sld = domain.split(".")[0];
52
+ if (normalized === sld || normalized.startsWith(`${sld}.`)) {
53
+ return egg;
54
+ }
55
+ }
56
+ return null;
57
+ }
58
+ /**
59
+ * Get all registered easter egg domains for testing.
60
+ */
61
+ export function getAllEasterEggs() {
62
+ return Object.values(EASTER_EGGS);
63
+ }
64
+ //# sourceMappingURL=easter-eggs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"easter-eggs.js","sourceRoot":"","sources":["../../src/lib/easter-eggs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,GAA8B;IAC7C,WAAW,EAAE;QACX,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,mEAAmE;QAC5E,KAAK,EAAE,KAAK;KACb;IACD,aAAa,EAAE;QACb,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,4EAA4E;QACrF,KAAK,EAAE,QAAQ;KAChB;IACD,aAAa,EAAE;QACb,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,mEAAmE;QAC5E,KAAK,EAAE,KAAK;KACb;IACD,eAAe,EAAE;QACf,MAAM,EAAE,eAAe;QACvB,OAAO,EAAE,oDAAoD;QAC7D,KAAK,EAAE,MAAM;KACd;IACD,cAAc,EAAE;QACd,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,4BAA4B;QACrC,KAAK,EAAE,SAAS;KACjB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,wEAAwE;QACjF,KAAK,EAAE,OAAO;KACf;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,2BAA2B;IAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAED,qEAAqE;IACrE,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;YAC3D,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Error personality — character messages + ASCII art for each DomainErrorCode.
3
+ *
4
+ * Every error code gets a personality: an icon, a witty "character" message,
5
+ * and a practical suggestion for what to do next. Displayed by ErrorDisplay.
6
+ */
7
+ import type { DomainErrorCode } from "./types.js";
8
+ export interface ErrorPersonality {
9
+ /** The DomainErrorCode this personality applies to */
10
+ code: DomainErrorCode;
11
+ /** Short icon/emoji for inline display */
12
+ icon: string;
13
+ /** Witty character message */
14
+ characterMessage: string;
15
+ /** Practical next-step suggestion */
16
+ suggestion: string;
17
+ /** ASCII art (optional, shown in full error display) */
18
+ art?: string;
19
+ /** Ink color name for the error display border */
20
+ color: string;
21
+ }
22
+ /**
23
+ * Get the personality for a given DomainErrorCode.
24
+ */
25
+ export declare function getErrorPersonality(code: DomainErrorCode): ErrorPersonality;
26
+ /**
27
+ * Get all error personalities (for testing / enumeration).
28
+ */
29
+ export declare function getAllPersonalities(): ErrorPersonality[];
30
+ /**
31
+ * Try to match a generic Error to a DomainErrorCode personality.
32
+ * Falls back to API_ERROR if the error doesn't have a recognized code.
33
+ */
34
+ export declare function inferPersonality(error: unknown): ErrorPersonality;
35
+ //# sourceMappingURL=error-personality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-personality.d.ts","sourceRoot":"","sources":["../../src/lib/error-personality.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+ElD,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,IAAI,EAAE,eAAe,CAAC;IACtB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAuGD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,gBAAgB,CAE3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,EAAE,CAExD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAajE"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Error personality — character messages + ASCII art for each DomainErrorCode.
3
+ *
4
+ * Every error code gets a personality: an icon, a witty "character" message,
5
+ * and a practical suggestion for what to do next. Displayed by ErrorDisplay.
6
+ */
7
+ // ─── ASCII Art Fragments ─────────────────────────────────────────────────────
8
+ const LOCK_ART = `
9
+ .--------.
10
+ / .------. \\
11
+ / / \\ \\
12
+ | | | |
13
+ | | 🔒 | |
14
+ \\ \\ / /
15
+ \\ '------' /
16
+ '--------'
17
+ `;
18
+ const HOURGLASS_ART = `
19
+ _____
20
+ | |
21
+ | |
22
+ \\ /
23
+ \\ /
24
+ / \\
25
+ / \\
26
+ | |
27
+ |_____|
28
+ `;
29
+ const MAGNIFY_ART = `
30
+ _____
31
+ / \\
32
+ | |
33
+ | ? |
34
+ \\_____/
35
+ \\
36
+ \\
37
+ `;
38
+ const BROKEN_PIPE_ART = `
39
+ ___ ___
40
+ | | | |
41
+ | | | |
42
+ | |~~~| |
43
+ | | | |
44
+ |___| |___|
45
+ `;
46
+ const SHIELD_ART = `
47
+ /|\\
48
+ / | \\
49
+ / | \\
50
+ / | \\
51
+ / | \\
52
+ /_____|_____\\
53
+ \\ | /
54
+ \\ | /
55
+ \\ | /
56
+ \\ | /
57
+ \\ | /
58
+ \\|/
59
+ `;
60
+ const EXPLOSION_ART = `
61
+ . * .
62
+ * .*. *
63
+ . * . * .
64
+ * .*. *
65
+ . * .
66
+ `;
67
+ const WARNING_ART = `
68
+ /\\
69
+ / \\
70
+ / ⚠ \\
71
+ / \\
72
+ /________\\
73
+ `;
74
+ const PERSONALITIES = {
75
+ AUTH_ERROR: {
76
+ code: "AUTH_ERROR",
77
+ icon: "🔒",
78
+ characterMessage: "The gates are sealed.",
79
+ suggestion: "Check your Name.com API username and token at https://www.name.com/account/api",
80
+ art: LOCK_ART,
81
+ color: "red",
82
+ },
83
+ RATE_LIMITED: {
84
+ code: "RATE_LIMITED",
85
+ icon: "⌛",
86
+ characterMessage: "The domain gods need a moment.",
87
+ suggestion: "You've hit the Name.com rate limit. Wait a few seconds and try again.",
88
+ art: HOURGLASS_ART,
89
+ color: "yellow",
90
+ },
91
+ DOMAIN_NOT_FOUND: {
92
+ code: "DOMAIN_NOT_FOUND",
93
+ icon: "🔍",
94
+ characterMessage: "Lost in the DNS wilderness.",
95
+ suggestion: "Double-check the domain name. It may not exist in your account, or it could be a typo.",
96
+ art: MAGNIFY_ART,
97
+ color: "yellow",
98
+ },
99
+ DOMAIN_NOT_AVAILABLE: {
100
+ code: "DOMAIN_NOT_AVAILABLE",
101
+ icon: "🚫",
102
+ characterMessage: "Someone beat you to it.",
103
+ suggestion: "This domain is already registered. Try a different name or TLD, or check back later.",
104
+ art: SHIELD_ART,
105
+ color: "red",
106
+ },
107
+ REGISTRATION_FAILED: {
108
+ code: "REGISTRATION_FAILED",
109
+ icon: "💥",
110
+ characterMessage: "The registration ritual has failed.",
111
+ suggestion: "Check your Name.com account balance and contact info. The domain may have been taken between search and purchase.",
112
+ art: EXPLOSION_ART,
113
+ color: "red",
114
+ },
115
+ DNS_ERROR: {
116
+ code: "DNS_ERROR",
117
+ icon: "🌐",
118
+ characterMessage: "The zone file rejects your offering.",
119
+ suggestion: "Verify the record type, host, and value are correct. Check for conflicting records.",
120
+ art: BROKEN_PIPE_ART,
121
+ color: "red",
122
+ },
123
+ RENEWAL_FAILED: {
124
+ code: "RENEWAL_FAILED",
125
+ icon: "📅",
126
+ characterMessage: "Time waits for no domain.",
127
+ suggestion: "Check your Name.com account balance. Ensure the domain is eligible for renewal.",
128
+ art: WARNING_ART,
129
+ color: "yellow",
130
+ },
131
+ INVALID_DOMAIN: {
132
+ code: "INVALID_DOMAIN",
133
+ icon: "❌",
134
+ characterMessage: "That's not a valid domain in any universe.",
135
+ suggestion: "Domain names must be alphanumeric with hyphens, followed by a valid TLD (e.g., example.com).",
136
+ color: "red",
137
+ },
138
+ VALIDATION_ERROR: {
139
+ code: "VALIDATION_ERROR",
140
+ icon: "⚙️",
141
+ characterMessage: "The inputs don't add up.",
142
+ suggestion: "Check the command arguments and try again. Run with --help for usage info.",
143
+ color: "yellow",
144
+ },
145
+ API_ERROR: {
146
+ code: "API_ERROR",
147
+ icon: "🔌",
148
+ characterMessage: "The Name.com servers aren't cooperating.",
149
+ suggestion: "This may be a temporary issue. Wait a moment and retry. If it persists, check https://www.namestatus.com/",
150
+ art: BROKEN_PIPE_ART,
151
+ color: "red",
152
+ },
153
+ NETWORK_ERROR: {
154
+ code: "NETWORK_ERROR",
155
+ icon: "📡",
156
+ characterMessage: "Lost connection to the domain dimension.",
157
+ suggestion: "Check your internet connection. If you're behind a proxy or firewall, ensure api.name.com is reachable.",
158
+ art: BROKEN_PIPE_ART,
159
+ color: "red",
160
+ },
161
+ };
162
+ // ─── Public API ──────────────────────────────────────────────────────────────
163
+ /**
164
+ * Get the personality for a given DomainErrorCode.
165
+ */
166
+ export function getErrorPersonality(code) {
167
+ return PERSONALITIES[code];
168
+ }
169
+ /**
170
+ * Get all error personalities (for testing / enumeration).
171
+ */
172
+ export function getAllPersonalities() {
173
+ return Object.values(PERSONALITIES);
174
+ }
175
+ /**
176
+ * Try to match a generic Error to a DomainErrorCode personality.
177
+ * Falls back to API_ERROR if the error doesn't have a recognized code.
178
+ */
179
+ export function inferPersonality(error) {
180
+ if (error &&
181
+ typeof error === "object" &&
182
+ "code" in error &&
183
+ typeof error.code === "string") {
184
+ const code = error.code;
185
+ if (PERSONALITIES[code]) {
186
+ return PERSONALITIES[code];
187
+ }
188
+ }
189
+ return PERSONALITIES.API_ERROR;
190
+ }
191
+ //# sourceMappingURL=error-personality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-personality.js","sourceRoot":"","sources":["../../src/lib/error-personality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Error re-exports for convenience.
3
+ * DomainError is defined in types.ts — re-exported here for
4
+ * consumers that want to import errors from a dedicated module.
5
+ */
6
+ export { DomainError } from "./types.js";
7
+ export type { DomainErrorCode } from "./types.js";
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Error re-exports for convenience.
3
+ * DomainError is defined in types.ts — re-exported here for
4
+ * consumers that want to import errors from a dedicated module.
5
+ */
6
+ export { DomainError } from "./types.js";
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Konami code detection for Ink terminal input.
3
+ *
4
+ * Listens for the classic sequence: up-up-down-down-left-right-left-right-b-a
5
+ * via Ink's useInput hook. When detected, triggers the callback (Matrix rain).
6
+ *
7
+ * Arrow keys arrive as special keys in Ink's input handler.
8
+ * Letter keys arrive as regular input characters.
9
+ */
10
+ export interface KonamiStep {
11
+ type: "arrow" | "letter";
12
+ value: string;
13
+ }
14
+ export declare const KONAMI_SEQUENCE: KonamiStep[];
15
+ /**
16
+ * Tracks progress through the Konami code sequence.
17
+ * Thread-safe for a single-threaded Node.js event loop.
18
+ */
19
+ export declare class KonamiTracker {
20
+ private position;
21
+ private readonly onComplete;
22
+ private readonly timeout;
23
+ private lastInputTime;
24
+ /**
25
+ * @param onComplete - Callback fired when the full sequence is entered
26
+ * @param timeout - Max ms between inputs before resetting (default 5000)
27
+ */
28
+ constructor(onComplete: () => void, timeout?: number);
29
+ /**
30
+ * Process a key input from Ink's useInput hook.
31
+ *
32
+ * @param input - The character input (for letter keys)
33
+ * @param key - The key object from Ink (for arrow keys)
34
+ * @returns true if the sequence was just completed
35
+ */
36
+ handleInput(input: string, key: {
37
+ upArrow?: boolean;
38
+ downArrow?: boolean;
39
+ leftArrow?: boolean;
40
+ rightArrow?: boolean;
41
+ }): boolean;
42
+ /**
43
+ * Get current progress through the sequence (0 to 10).
44
+ */
45
+ getProgress(): number;
46
+ /**
47
+ * Reset the tracker state.
48
+ */
49
+ reset(): void;
50
+ }
51
+ //# sourceMappingURL=konami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"konami.d.ts","sourceRoot":"","sources":["../../src/lib/konami.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,eAAe,EAAE,UAAU,EAWvC,CAAC;AAIF;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,aAAa,CAAK;IAE1B;;;OAGG;gBACS,UAAU,EAAE,MAAM,IAAI,EAAE,OAAO,SAAO;IAKlD;;;;;;OAMG;IACH,WAAW,CACT,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;QACH,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GACA,OAAO;IAsDV;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}