dominion-cli 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/cli.js +13 -9
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/account.d.ts +1 -1
  4. package/dist/commands/account.d.ts.map +1 -1
  5. package/dist/commands/account.js +6 -9
  6. package/dist/commands/account.js.map +1 -1
  7. package/dist/commands/billing.d.ts +1 -1
  8. package/dist/commands/billing.d.ts.map +1 -1
  9. package/dist/commands/billing.js +3 -7
  10. package/dist/commands/billing.js.map +1 -1
  11. package/dist/commands/buy.d.ts +7 -7
  12. package/dist/commands/buy.d.ts.map +1 -1
  13. package/dist/commands/buy.js +45 -141
  14. package/dist/commands/buy.js.map +1 -1
  15. package/dist/commands/cart/add.d.ts +1 -1
  16. package/dist/commands/cart/add.d.ts.map +1 -1
  17. package/dist/commands/cart/add.js +9 -8
  18. package/dist/commands/cart/add.js.map +1 -1
  19. package/dist/commands/credits.js +1 -1
  20. package/dist/commands/dns/add.d.ts +3 -3
  21. package/dist/commands/dns/add.d.ts.map +1 -1
  22. package/dist/commands/dns/add.js +3 -3
  23. package/dist/commands/dns/add.js.map +1 -1
  24. package/dist/commands/dns/list.d.ts +3 -3
  25. package/dist/commands/dns/list.d.ts.map +1 -1
  26. package/dist/commands/dns/list.js +3 -3
  27. package/dist/commands/dns/list.js.map +1 -1
  28. package/dist/commands/dns/remove.d.ts +3 -3
  29. package/dist/commands/dns/remove.d.ts.map +1 -1
  30. package/dist/commands/dns/remove.js +3 -3
  31. package/dist/commands/dns/remove.js.map +1 -1
  32. package/dist/commands/domains/detail.d.ts +1 -1
  33. package/dist/commands/domains/detail.js +3 -3
  34. package/dist/commands/domains/detail.js.map +1 -1
  35. package/dist/commands/domains/list.d.ts +1 -1
  36. package/dist/commands/domains/list.js +3 -3
  37. package/dist/commands/domains/list.js.map +1 -1
  38. package/dist/commands/login.d.ts +6 -6
  39. package/dist/commands/login.d.ts.map +1 -1
  40. package/dist/commands/login.js +58 -42
  41. package/dist/commands/login.js.map +1 -1
  42. package/dist/commands/logout.d.ts +1 -1
  43. package/dist/commands/logout.js +1 -1
  44. package/dist/commands/search.d.ts +2 -2
  45. package/dist/commands/search.js +4 -4
  46. package/dist/commands/search.js.map +1 -1
  47. package/dist/commands/settings/set.d.ts +4 -4
  48. package/dist/commands/settings/set.d.ts.map +1 -1
  49. package/dist/commands/settings/set.js +10 -11
  50. package/dist/commands/settings/set.js.map +1 -1
  51. package/dist/commands/settings/view.d.ts +3 -3
  52. package/dist/commands/settings/view.d.ts.map +1 -1
  53. package/dist/commands/settings/view.js +4 -4
  54. package/dist/commands/settings/view.js.map +1 -1
  55. package/dist/commands/vercel/link.d.ts +4 -4
  56. package/dist/commands/vercel/link.d.ts.map +1 -1
  57. package/dist/commands/vercel/link.js +8 -8
  58. package/dist/commands/vercel/link.js.map +1 -1
  59. package/dist/commands/whoami.d.ts +1 -1
  60. package/dist/commands/whoami.js +3 -3
  61. package/dist/commands/whoami.js.map +1 -1
  62. package/dist/components/account-card.d.ts +3 -3
  63. package/dist/components/account-card.d.ts.map +1 -1
  64. package/dist/components/account-card.js +3 -3
  65. package/dist/components/account-card.js.map +1 -1
  66. package/dist/components/command-runner.d.ts +25 -0
  67. package/dist/components/command-runner.d.ts.map +1 -0
  68. package/dist/components/command-runner.js +67 -0
  69. package/dist/components/command-runner.js.map +1 -0
  70. package/dist/components/prompt.d.ts +24 -0
  71. package/dist/components/prompt.d.ts.map +1 -0
  72. package/dist/components/prompt.js +113 -0
  73. package/dist/components/prompt.js.map +1 -0
  74. package/dist/components/search-results.d.ts +1 -1
  75. package/dist/components/search-results.js +1 -1
  76. package/dist/lib/auth.d.ts +17 -9
  77. package/dist/lib/auth.d.ts.map +1 -1
  78. package/dist/lib/auth.js +125 -46
  79. package/dist/lib/auth.js.map +1 -1
  80. package/dist/lib/command-registry.d.ts +47 -0
  81. package/dist/lib/command-registry.d.ts.map +1 -0
  82. package/dist/lib/command-registry.js +384 -0
  83. package/dist/lib/command-registry.js.map +1 -0
  84. package/dist/lib/config.d.ts.map +1 -1
  85. package/dist/lib/config.js +0 -8
  86. package/dist/lib/config.js.map +1 -1
  87. package/dist/lib/dns-validation.d.ts +1 -1
  88. package/dist/lib/dns-validation.d.ts.map +1 -1
  89. package/dist/lib/dns-validation.js +2 -2
  90. package/dist/lib/dns-validation.js.map +1 -1
  91. package/dist/lib/dominion-client.d.ts +43 -0
  92. package/dist/lib/dominion-client.d.ts.map +1 -0
  93. package/dist/lib/dominion-client.js +183 -0
  94. package/dist/lib/dominion-client.js.map +1 -0
  95. package/dist/lib/error-personality.js +7 -7
  96. package/dist/lib/error-personality.js.map +1 -1
  97. package/dist/lib/history.d.ts +40 -0
  98. package/dist/lib/history.d.ts.map +1 -0
  99. package/dist/lib/history.js +113 -0
  100. package/dist/lib/history.js.map +1 -0
  101. package/dist/lib/nameserver-presets.js +4 -4
  102. package/dist/lib/nameserver-presets.js.map +1 -1
  103. package/dist/lib/purchase.d.ts +20 -23
  104. package/dist/lib/purchase.d.ts.map +1 -1
  105. package/dist/lib/purchase.js +42 -70
  106. package/dist/lib/purchase.js.map +1 -1
  107. package/dist/lib/schemas.d.ts +351 -352
  108. package/dist/lib/schemas.d.ts.map +1 -1
  109. package/dist/lib/schemas.js +1 -2
  110. package/dist/lib/schemas.js.map +1 -1
  111. package/dist/lib/types.d.ts +8 -11
  112. package/dist/lib/types.d.ts.map +1 -1
  113. package/dist/lib/types.js +1 -4
  114. package/dist/lib/types.js.map +1 -1
  115. package/dist/repl.d.ts +17 -0
  116. package/dist/repl.d.ts.map +1 -0
  117. package/dist/repl.js +189 -0
  118. package/dist/repl.js.map +1 -0
  119. package/package.json +4 -2
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Dominion API client.
3
+ *
4
+ * Calls the dominion.sh API.
5
+ * All prices returned include markup — the CLI never sees wholesale.
6
+ * Auth via Bearer token stored in ~/.dominion/config.json.
7
+ */
8
+ import { DomainError } from "./types.js";
9
+ import { ConfigManager } from "./config.js";
10
+ // ─── Client ──────────────────────────────────────────────────────────────────
11
+ const DEFAULT_BASE_URL = "https://dominion.sh/api";
12
+ export class DominionClient {
13
+ baseUrl;
14
+ token;
15
+ /**
16
+ * Credentials resolved in order:
17
+ * 1. Explicit config parameter
18
+ * 2. ConfigManager (~/.dominion/config.json)
19
+ * 3. DOMINION_API_KEY env var
20
+ */
21
+ constructor(config) {
22
+ let token = config?.token;
23
+ if (!token) {
24
+ const configManager = new ConfigManager();
25
+ const stored = configManager.load();
26
+ if (stored.auth?.token) {
27
+ token = stored.auth.token;
28
+ }
29
+ }
30
+ token = token ?? process.env.DOMINION_API_KEY;
31
+ if (!token) {
32
+ throw new DomainError("AUTH_ERROR", "Not authenticated. Run `dominion login` or `dominion register` first.");
33
+ }
34
+ this.token = token;
35
+ this.baseUrl = config?.baseUrl ?? process.env.DOMINION_API_URL ?? DEFAULT_BASE_URL;
36
+ }
37
+ // ─── Domain Search ───────────────────────────────────────────────────────
38
+ async searchDomains(query, _tlds) {
39
+ const data = await this.request("GET", `/domains/search?query=${encodeURIComponent(query)}`);
40
+ const results = data.results ?? [];
41
+ return results.map((r) => ({
42
+ domainName: r.domain,
43
+ sld: r.domain.split(".")[0],
44
+ tld: r.domain.split(".").slice(1).join("."),
45
+ purchasable: r.available,
46
+ premium: r.premium ?? false,
47
+ purchasePrice: Math.round(r.price * 100), // API returns dollars, convert to cents for CLI
48
+ purchaseType: "registration",
49
+ renewalPrice: Math.round(r.price * 100),
50
+ }));
51
+ }
52
+ // ─── Domain Management ───────────────────────────────────────────────────
53
+ async getDomain(domain) {
54
+ const data = await this.request("GET", `/domains/${domain}/settings`);
55
+ const d = data;
56
+ return {
57
+ domainName: d.domain,
58
+ nameservers: d.nameservers ?? [],
59
+ contacts: { registrant: {}, admin: {}, tech: {}, billing: {} },
60
+ privacyEnabled: true,
61
+ locked: d.locked ?? false,
62
+ autoRenewEnabled: d.autoRenew ?? false,
63
+ expireDate: d.expireDate ?? "",
64
+ createDate: "",
65
+ renewalPrice: 0,
66
+ };
67
+ }
68
+ async listDomains() {
69
+ const data = await this.request("GET", "/domains/list");
70
+ const d = data;
71
+ const domains = (d.domains ?? []).map((item) => ({
72
+ domainName: item.domain ?? "",
73
+ nameservers: [],
74
+ contacts: { registrant: {}, admin: {}, tech: {}, billing: {} },
75
+ privacyEnabled: true,
76
+ locked: false,
77
+ autoRenewEnabled: item.autoRenew ?? false,
78
+ expireDate: item.expiresAt ?? "",
79
+ createDate: item.createdAt ?? "",
80
+ renewalPrice: 0,
81
+ }));
82
+ return { domains };
83
+ }
84
+ async listDomainsAllPages() {
85
+ const response = await this.listDomains();
86
+ return response.domains ?? [];
87
+ }
88
+ async setNameservers(domain, nameservers) {
89
+ const data = await this.request("POST", `/domains/${domain}/nameservers`, { nameservers });
90
+ const d = data;
91
+ return {
92
+ domainName: d.domain ?? domain,
93
+ nameservers: d.nameservers ?? nameservers,
94
+ contacts: { registrant: {}, admin: {}, tech: {}, billing: {} },
95
+ privacyEnabled: true,
96
+ locked: false,
97
+ autoRenewEnabled: false,
98
+ expireDate: "",
99
+ createDate: "",
100
+ renewalPrice: 0,
101
+ };
102
+ }
103
+ // ─── DNS Records ─────────────────────────────────────────────────────────
104
+ async createDnsRecord(domain, record) {
105
+ const data = await this.request("POST", `/domains/${domain}/dns`, record);
106
+ const r = data.record;
107
+ return r;
108
+ }
109
+ async listDnsRecords(domain) {
110
+ const data = await this.request("GET", `/domains/${domain}/dns`);
111
+ return {
112
+ records: data.records ?? [],
113
+ };
114
+ }
115
+ async deleteDnsRecord(domain, id) {
116
+ await this.request("DELETE", `/domains/${domain}/dns/${id}`);
117
+ }
118
+ // ─── Renewal ─────────────────────────────────────────────────────────────
119
+ async renewDomain(domain, _purchasePrice) {
120
+ const data = await this.request("POST", `/domains/${domain}/renew`);
121
+ const d = data;
122
+ return {
123
+ domain: { domainName: domain },
124
+ order: 0,
125
+ totalPaid: 0,
126
+ checkoutUrl: d.url,
127
+ };
128
+ }
129
+ // ─── Checkout ─────────────────────────────────────────────────────────
130
+ async createCheckout(domains) {
131
+ const data = await this.request("POST", "/domains/checkout", { domains });
132
+ return { url: data.url };
133
+ }
134
+ // ─── HTTP Layer ──────────────────────────────────────────────────────────
135
+ async request(method, path, body) {
136
+ const url = `${this.baseUrl}${path}`;
137
+ const headers = {
138
+ Authorization: `Bearer ${this.token}`,
139
+ "Content-Type": "application/json",
140
+ Accept: "application/json",
141
+ };
142
+ const init = { method, headers };
143
+ if (body !== undefined && method !== "GET" && method !== "DELETE") {
144
+ init.body = JSON.stringify(body);
145
+ }
146
+ let response;
147
+ try {
148
+ response = await fetch(url, init);
149
+ }
150
+ catch (err) {
151
+ throw new DomainError("NETWORK_ERROR", `Failed to connect to Dominion API: ${err.message}`, { url, method });
152
+ }
153
+ if (response.status === 204) {
154
+ return {};
155
+ }
156
+ let data;
157
+ try {
158
+ data = await response.json();
159
+ }
160
+ catch {
161
+ throw new DomainError("API_ERROR", `Invalid response from Dominion API (${response.status})`, { url, method, status: response.status }, response.status);
162
+ }
163
+ if (!response.ok) {
164
+ this.handleApiError(response.status, data);
165
+ }
166
+ return data;
167
+ }
168
+ handleApiError(status, data) {
169
+ const errorData = data;
170
+ const message = errorData?.error ?? `API error (${status})`;
171
+ if (status === 401 || status === 403) {
172
+ throw new DomainError("AUTH_ERROR", `Authentication failed. Run \`dominion login\` to re-authenticate.`, {}, status);
173
+ }
174
+ if (status === 404) {
175
+ throw new DomainError("DOMAIN_NOT_FOUND", message, {}, status);
176
+ }
177
+ if (status === 429) {
178
+ throw new DomainError("RATE_LIMITED", "Rate limit exceeded. Please try again later.", {}, status);
179
+ }
180
+ throw new DomainError("API_ERROR", message, { statusCode: status }, status);
181
+ }
182
+ }
183
+ //# sourceMappingURL=dominion-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dominion-client.js","sourceRoot":"","sources":["../../src/lib/dominion-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAOnD,MAAM,OAAO,cAAc;IACR,OAAO,CAAS;IAChB,KAAK,CAAS;IAE/B;;;;;OAKG;IACH,YAAY,MAA6B;QACvC,IAAI,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;QAE1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;gBACvB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,KAAK,GAAG,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,WAAW,CACnB,YAAY,EACZ,uEAAuE,CACxE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;IACrF,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,aAAa,CACjB,KAAa,EACb,KAAgB;QAEhB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,yBAAyB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAI,IAAqD,CAAC,OAAO,IAAI,EAAE,CAAC;QAErF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,UAAU,EAAE,CAAC,CAAC,MAAgB;YAC9B,GAAG,EAAG,CAAC,CAAC,MAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvC,GAAG,EAAG,CAAC,CAAC,MAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACvD,WAAW,EAAE,CAAC,CAAC,SAAoB;YACnC,OAAO,EAAG,CAAC,CAAC,OAAmB,IAAI,KAAK;YACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC,KAAgB,GAAG,GAAG,CAAC,EAAE,gDAAgD;YACtG,YAAY,EAAE,cAAc;YAC5B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC,KAAgB,GAAG,GAAG,CAAC;SACpD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,MAAM,WAAW,CAAC,CAAC;QACtE,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,OAAO;YACL,UAAU,EAAE,CAAC,CAAC,MAAgB;YAC9B,WAAW,EAAG,CAAC,CAAC,WAAwB,IAAI,EAAE;YAC9C,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAW,EAAE,KAAK,EAAE,EAAW,EAAE,IAAI,EAAE,EAAW,EAAE,OAAO,EAAE,EAAW,EAAE;YAClG,cAAc,EAAE,IAAI;YACpB,MAAM,EAAG,CAAC,CAAC,MAAkB,IAAI,KAAK;YACtC,gBAAgB,EAAG,CAAC,CAAC,SAAqB,IAAI,KAAK;YACnD,UAAU,EAAG,CAAC,CAAC,UAAqB,IAAI,EAAE;YAC1C,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,CAAC;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,IAAoE,CAAC;QAC/E,MAAM,OAAO,GAAa,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzD,UAAU,EAAG,IAAI,CAAC,MAAiB,IAAI,EAAE;YACzC,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAW,EAAE,KAAK,EAAE,EAAW,EAAE,IAAI,EAAE,EAAW,EAAE,OAAO,EAAE,EAAW,EAAE;YAClG,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAG,IAAI,CAAC,SAAqB,IAAI,KAAK;YACtD,UAAU,EAAG,IAAI,CAAC,SAAoB,IAAI,EAAE;YAC5C,UAAU,EAAG,IAAI,CAAC,SAAoB,IAAI,EAAE;YAC5C,YAAY,EAAE,CAAC;SAChB,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,WAAqB;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,OAAO;YACL,UAAU,EAAG,CAAC,CAAC,MAAiB,IAAI,MAAM;YAC1C,WAAW,EAAG,CAAC,CAAC,WAAwB,IAAI,WAAW;YACvD,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAW,EAAE,KAAK,EAAE,EAAW,EAAE,IAAI,EAAE,EAAW,EAAE,OAAO,EAAE,EAAW,EAAE;YAClG,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,KAAK;YACvB,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,CAAC;SAChB,CAAC;IACJ,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,eAAe,CACnB,MAAc,EACd,MAAsB;QAEtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1E,MAAM,CAAC,GAAI,IAA8B,CAAC,MAAM,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,MAAM,MAAM,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAG,IAAkC,CAAC,OAAO,IAAI,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,EAAU;QAC9C,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,MAAM,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,WAAW,CACf,MAAc,EACd,cAAuB;QAEvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,QAAQ,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,OAAO;YACL,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAY;YACxC,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC,CAAC,GAAyB;SACzC,CAAC;IACJ,CAAC;IAED,yEAAyE;IAEzE,KAAK,CAAC,cAAc,CAClB,OAAiD;QAEjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,OAAO,EAAE,GAAG,EAAG,IAAwB,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACrC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CACnB,eAAe,EACf,sCAAuC,GAAa,CAAC,OAAO,EAAE,EAC9D,EAAE,GAAG,EAAE,MAAM,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,WAAW,CACnB,WAAW,EACX,uCAAuC,QAAQ,CAAC,MAAM,GAAG,EACzD,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EACxC,QAAQ,CAAC,MAAM,CAChB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,IAA+B,CAAC;IACzC,CAAC;IAEO,cAAc,CAAC,MAAc,EAAE,IAAa;QAClD,MAAM,SAAS,GAAG,IAAgD,CAAC;QACnE,MAAM,OAAO,GAAG,SAAS,EAAE,KAAK,IAAI,cAAc,MAAM,GAAG,CAAC;QAE5D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,WAAW,CACnB,YAAY,EACZ,mEAAmE,EACnE,EAAE,EACF,MAAM,CACP,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CACnB,kBAAkB,EAClB,OAAO,EACP,EAAE,EACF,MAAM,CACP,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CACnB,cAAc,EACd,8CAA8C,EAC9C,EAAE,EACF,MAAM,CACP,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,WAAW,CACnB,WAAW,EACX,OAAO,EACP,EAAE,UAAU,EAAE,MAAM,EAAE,EACtB,MAAM,CACP,CAAC;IACJ,CAAC;CACF"}
@@ -76,7 +76,7 @@ const PERSONALITIES = {
76
76
  code: "AUTH_ERROR",
77
77
  icon: "🔒",
78
78
  characterMessage: "The gates are sealed.",
79
- suggestion: "Check your Name.com API username and token at https://www.name.com/account/api",
79
+ suggestion: "Run `dominion login` to re-authenticate, or `dominion register` to create an account.",
80
80
  art: LOCK_ART,
81
81
  color: "red",
82
82
  },
@@ -84,7 +84,7 @@ const PERSONALITIES = {
84
84
  code: "RATE_LIMITED",
85
85
  icon: "⌛",
86
86
  characterMessage: "The domain gods need a moment.",
87
- suggestion: "You've hit the Name.com rate limit. Wait a few seconds and try again.",
87
+ suggestion: "You've hit the rate limit. Wait a few seconds and try again.",
88
88
  art: HOURGLASS_ART,
89
89
  color: "yellow",
90
90
  },
@@ -108,7 +108,7 @@ const PERSONALITIES = {
108
108
  code: "REGISTRATION_FAILED",
109
109
  icon: "💥",
110
110
  characterMessage: "The registration ritual has failed.",
111
- suggestion: "Check your Name.com account balance and contact info. The domain may have been taken between search and purchase.",
111
+ suggestion: "The domain may have been taken between search and purchase. Try again or choose a different domain.",
112
112
  art: EXPLOSION_ART,
113
113
  color: "red",
114
114
  },
@@ -124,7 +124,7 @@ const PERSONALITIES = {
124
124
  code: "RENEWAL_FAILED",
125
125
  icon: "📅",
126
126
  characterMessage: "Time waits for no domain.",
127
- suggestion: "Check your Name.com account balance. Ensure the domain is eligible for renewal.",
127
+ suggestion: "Ensure the domain is eligible for renewal and try again.",
128
128
  art: WARNING_ART,
129
129
  color: "yellow",
130
130
  },
@@ -145,8 +145,8 @@ const PERSONALITIES = {
145
145
  API_ERROR: {
146
146
  code: "API_ERROR",
147
147
  icon: "🔌",
148
- characterMessage: "The 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/",
148
+ characterMessage: "The servers aren't cooperating.",
149
+ suggestion: "This may be a temporary issue. Wait a moment and retry. If it persists, contact support at dominion.sh/support.",
150
150
  art: BROKEN_PIPE_ART,
151
151
  color: "red",
152
152
  },
@@ -154,7 +154,7 @@ const PERSONALITIES = {
154
154
  code: "NETWORK_ERROR",
155
155
  icon: "📡",
156
156
  characterMessage: "Lost connection to the domain dimension.",
157
- suggestion: "Check your internet connection. If you're behind a proxy or firewall, ensure api.name.com is reachable.",
157
+ suggestion: "Check your internet connection and try again.",
158
158
  art: BROKEN_PIPE_ART,
159
159
  color: "red",
160
160
  },
@@ -1 +1 @@
1
- {"version":3,"file":"error-personality.js","sourceRoot":"","sources":["../../src/lib/error-personality.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error-personality.js","sourceRoot":"","sources":["../../src/lib/error-personality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * HistoryManager — persistent command history for REPL mode.
3
+ *
4
+ * Stores history at ~/.dominion/history.json with up/down navigation.
5
+ * Max 500 entries, consecutive duplicates deduplicated.
6
+ */
7
+ export declare class HistoryManager {
8
+ private readonly historyPath;
9
+ private entries;
10
+ private cursor;
11
+ constructor(configDir?: string);
12
+ /**
13
+ * Add an entry to history (persisted immediately).
14
+ * Skips exit/quit/clear commands and consecutive duplicates.
15
+ */
16
+ add(command: string): void;
17
+ /**
18
+ * Navigate up in history (older entries). Returns entry or null if at start.
19
+ */
20
+ navigateUp(): string | null;
21
+ /**
22
+ * Navigate down in history (newer entries). Returns entry or null if past end.
23
+ */
24
+ navigateDown(): string | null;
25
+ /**
26
+ * Reset cursor to end of history (called after adding or submitting).
27
+ */
28
+ resetCursor(): void;
29
+ /**
30
+ * Get all history entries.
31
+ */
32
+ getEntries(): string[];
33
+ /**
34
+ * Get the number of entries.
35
+ */
36
+ get length(): number;
37
+ private load;
38
+ private save;
39
+ }
40
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAEX,SAAS,CAAC,EAAE,MAAM;IAO9B;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAyB1B;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAM3B;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAS7B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,IAAI;CAUb"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * HistoryManager — persistent command history for REPL mode.
3
+ *
4
+ * Stores history at ~/.dominion/history.json with up/down navigation.
5
+ * Max 500 entries, consecutive duplicates deduplicated.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { homedir } from "node:os";
10
+ const DOMINION_DIR = join(homedir(), ".dominion");
11
+ const MAX_ENTRIES = 500;
12
+ /** Commands that should not be saved to history. */
13
+ const SKIP_COMMANDS = new Set(["exit", "quit", "q", "clear"]);
14
+ export class HistoryManager {
15
+ historyPath;
16
+ entries;
17
+ cursor;
18
+ constructor(configDir) {
19
+ const dir = configDir ?? DOMINION_DIR;
20
+ this.historyPath = join(dir, "history.json");
21
+ this.entries = this.load();
22
+ this.cursor = this.entries.length;
23
+ }
24
+ /**
25
+ * Add an entry to history (persisted immediately).
26
+ * Skips exit/quit/clear commands and consecutive duplicates.
27
+ */
28
+ add(command) {
29
+ const trimmed = command.trim();
30
+ if (!trimmed)
31
+ return;
32
+ // Skip meta commands
33
+ const firstWord = trimmed.split(/\s+/)[0].toLowerCase();
34
+ if (SKIP_COMMANDS.has(firstWord))
35
+ return;
36
+ // Skip consecutive duplicates
37
+ if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {
38
+ this.resetCursor();
39
+ return;
40
+ }
41
+ this.entries.push(trimmed);
42
+ // Trim to max
43
+ if (this.entries.length > MAX_ENTRIES) {
44
+ this.entries = this.entries.slice(-MAX_ENTRIES);
45
+ }
46
+ this.save();
47
+ this.resetCursor();
48
+ }
49
+ /**
50
+ * Navigate up in history (older entries). Returns entry or null if at start.
51
+ */
52
+ navigateUp() {
53
+ if (this.cursor <= 0)
54
+ return null;
55
+ this.cursor--;
56
+ return this.entries[this.cursor] ?? null;
57
+ }
58
+ /**
59
+ * Navigate down in history (newer entries). Returns entry or null if past end.
60
+ */
61
+ navigateDown() {
62
+ if (this.cursor >= this.entries.length - 1) {
63
+ this.cursor = this.entries.length;
64
+ return null;
65
+ }
66
+ this.cursor++;
67
+ return this.entries[this.cursor] ?? null;
68
+ }
69
+ /**
70
+ * Reset cursor to end of history (called after adding or submitting).
71
+ */
72
+ resetCursor() {
73
+ this.cursor = this.entries.length;
74
+ }
75
+ /**
76
+ * Get all history entries.
77
+ */
78
+ getEntries() {
79
+ return [...this.entries];
80
+ }
81
+ /**
82
+ * Get the number of entries.
83
+ */
84
+ get length() {
85
+ return this.entries.length;
86
+ }
87
+ load() {
88
+ try {
89
+ if (!existsSync(this.historyPath))
90
+ return [];
91
+ const raw = readFileSync(this.historyPath, "utf-8");
92
+ const parsed = JSON.parse(raw);
93
+ if (Array.isArray(parsed))
94
+ return parsed.filter((e) => typeof e === "string");
95
+ return [];
96
+ }
97
+ catch {
98
+ return [];
99
+ }
100
+ }
101
+ save() {
102
+ try {
103
+ if (!existsSync(DOMINION_DIR)) {
104
+ mkdirSync(DOMINION_DIR, { recursive: true });
105
+ }
106
+ writeFileSync(this.historyPath, JSON.stringify(this.entries), "utf-8");
107
+ }
108
+ catch {
109
+ // Best-effort persistence — never block the REPL
110
+ }
111
+ }
112
+ }
113
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"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"}
@@ -11,16 +11,16 @@ export const NAMESERVER_PRESETS = {
11
11
  nameservers: ["ns1.vercel-dns.com", "ns2.vercel-dns.com"],
12
12
  description: "Vercel DNS — auto-provisions SSL, optimized for Vercel deployments",
13
13
  },
14
- namecom: {
15
- name: "namecom",
16
- label: "Name.com",
14
+ default: {
15
+ name: "default",
16
+ label: "Default",
17
17
  nameservers: [
18
18
  "ns1.name.com",
19
19
  "ns2.name.com",
20
20
  "ns3.name.com",
21
21
  "ns4.name.com",
22
22
  ],
23
- description: "Name.com default nameservers",
23
+ description: "Default nameservers",
24
24
  },
25
25
  };
26
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"nameserver-presets.js","sourceRoot":"","sources":["../../src/lib/nameserver-presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QACzD,WAAW,EAAE,oEAAoE;KAClF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE;YACX,cAAc;YACd,cAAc;YACd,cAAc;YACd,cAAc;SACf;QACD,WAAW,EAAE,8BAA8B;KAC5C;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,kBAAkB,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"nameserver-presets.js","sourceRoot":"","sources":["../../src/lib/nameserver-presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QACzD,WAAW,EAAE,oEAAoE;KAClF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE;YACX,cAAc;YACd,cAAc;YACd,cAAc;YACd,cAAc;SACf;QACD,WAAW,EAAE,qBAAqB;KACnC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,kBAAkB,CAAC;AAClD,CAAC"}
@@ -1,29 +1,27 @@
1
1
  /**
2
- * Purchase flow logic for domain registration.
2
+ * Purchase flow logic for domain checkout.
3
3
  *
4
4
  * Handles the end-to-end purchase process:
5
- * 1. Validate contact info exists (or collect it)
6
- * 2. Re-verify availability and price (anti-fraud)
7
- * 3. Register domain via Name.com API
8
- * 4. Clear purchased domains from cart
5
+ * 1. Build cart summary with prices
6
+ * 2. Create Stripe Checkout session via Dominion API
7
+ * 3. Open checkout URL in browser
8
+ * 4. Clear purchased domains from cart after user confirms
9
9
  *
10
- * Prices from Name.com are in cents. purchasePrice must match
11
- * exactly what checkAvailability returns (Name.com anti-fraud measure).
10
+ * All prices include markup (applied server-side by Dominion API).
12
11
  */
13
- import { NamecomClient } from "./namecom-client.js";
12
+ import { DominionClient } from "./dominion-client.js";
14
13
  import { ConfigManager } from "./config.js";
15
14
  import { CartManager, type CartItem } from "./cart.js";
16
- import type { ContactInfo, Domain, DomainAvailability } from "./types.js";
15
+ import type { ContactInfo } from "./types.js";
17
16
  export interface PurchaseItem {
18
17
  domain: string;
19
18
  price: number;
20
19
  premium: boolean;
21
- verifiedPrice?: number;
22
20
  }
23
21
  export interface PurchaseResult {
24
22
  domain: string;
25
23
  success: boolean;
26
- registeredDomain?: Domain;
24
+ checkoutUrl?: string;
27
25
  error?: string;
28
26
  errorCode?: string;
29
27
  }
@@ -45,21 +43,20 @@ export declare function saveContactInfo(contactInfo: ContactInfo, configManager?
45
43
  */
46
44
  export declare function loadContactInfo(configManager?: ConfigManager): ContactInfo | undefined;
47
45
  /**
48
- * Re-verify domain availability and price before purchase.
49
- * Returns the verified availability data including current price.
46
+ * Create a Stripe Checkout session for the given domains.
47
+ * Returns the checkout URL to open in the browser.
50
48
  */
51
- export declare function verifyDomainPrice(domain: string, client?: NamecomClient): Promise<DomainAvailability>;
52
- /**
53
- * Purchase a single domain.
54
- * Re-verifies price, registers with contact info, returns result.
55
- */
56
- export declare function purchaseDomain(domain: string, contactInfo: ContactInfo, client?: NamecomClient): Promise<PurchaseResult>;
49
+ export declare function createCheckout(domains: Array<{
50
+ domain: string;
51
+ price: number;
52
+ }>, client?: DominionClient): Promise<{
53
+ url: string;
54
+ }>;
57
55
  /**
58
- * Purchase all domains in the cart.
59
- * Purchases sequentially (not parallel) to avoid rate limiting.
60
- * Clears successful purchases from cart.
56
+ * Create checkout for all domains in the cart.
57
+ * Returns the Stripe Checkout URL.
61
58
  */
62
- export declare function purchaseCartDomains(contactInfo: ContactInfo, cartManager?: CartManager, client?: NamecomClient): Promise<PurchaseResult[]>;
59
+ export declare function checkoutCart(cartManager?: CartManager, client?: DominionClient): Promise<PurchaseResult>;
63
60
  /**
64
61
  * Build a purchase summary from cart items.
65
62
  */
@@ -1 +1 @@
1
- {"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/lib/purchase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAK1E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAerE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,aAAa,CAAC,EAAE,aAAa,GAC5B,IAAI,CAGN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,aAAa,CAAC,EAAE,aAAa,GAC5B,WAAW,GAAG,SAAS,CAIzB;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC,CA6CzB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,WAAW,EACxB,WAAW,CAAC,EAAE,WAAW,EACzB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,EAAE,CAAC,CAqB3B;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAWnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB7D"}
1
+ {"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/lib/purchase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAerE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,aAAa,CAAC,EAAE,aAAa,GAC5B,IAAI,CAGN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,aAAa,CAAC,EAAE,aAAa,GAC5B,WAAW,GAAG,SAAS,CAIzB;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ1B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,CAAC,EAAE,WAAW,EACzB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAWnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAc7D"}