fresh-squeezy 1.0.20

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.

Potentially problematic release.


This version of fresh-squeezy might be problematic. Click here for more details.

Files changed (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/dist/.cursor/skills/wizard/utils/validation.d.ts +3 -0
  4. package/dist/.cursor/skills/wizard/utils/validation.d.ts.map +1 -0
  5. package/dist/.cursor/skills/wizard/utils/validation.js +113 -0
  6. package/dist/.cursor/skills/wizard/utils/validation.js.map +1 -0
  7. package/dist/billing-config.d.ts +3 -0
  8. package/dist/billing-config.d.ts.map +1 -0
  9. package/dist/billing-config.js +37 -0
  10. package/dist/billing-config.js.map +1 -0
  11. package/dist/bootstrap.d.ts +8 -0
  12. package/dist/bootstrap.d.ts.map +1 -0
  13. package/dist/bootstrap.js +42 -0
  14. package/dist/bootstrap.js.map +1 -0
  15. package/dist/cache.d.ts +5 -0
  16. package/dist/cache.d.ts.map +1 -0
  17. package/dist/cache.js +27 -0
  18. package/dist/cache.js.map +1 -0
  19. package/dist/checkout.d.ts +3 -0
  20. package/dist/checkout.d.ts.map +1 -0
  21. package/dist/checkout.js +42 -0
  22. package/dist/checkout.js.map +1 -0
  23. package/dist/cli-validate.d.ts +2 -0
  24. package/dist/cli-validate.d.ts.map +1 -0
  25. package/dist/cli-validate.js +206 -0
  26. package/dist/cli-validate.js.map +1 -0
  27. package/dist/cli.d.ts +3 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +40 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/createBilling.d.ts +3 -0
  32. package/dist/createBilling.d.ts.map +1 -0
  33. package/dist/createBilling.js +82 -0
  34. package/dist/createBilling.js.map +1 -0
  35. package/dist/customers.d.ts +3 -0
  36. package/dist/customers.d.ts.map +1 -0
  37. package/dist/customers.js +57 -0
  38. package/dist/customers.js.map +1 -0
  39. package/dist/dedup.d.ts +60 -0
  40. package/dist/dedup.d.ts.map +1 -0
  41. package/dist/dedup.js +74 -0
  42. package/dist/dedup.js.map +1 -0
  43. package/dist/express.d.ts +13 -0
  44. package/dist/express.d.ts.map +1 -0
  45. package/dist/express.js +70 -0
  46. package/dist/express.js.map +1 -0
  47. package/dist/health.d.ts +3 -0
  48. package/dist/health.d.ts.map +1 -0
  49. package/dist/health.js +38 -0
  50. package/dist/health.js.map +1 -0
  51. package/dist/index.d.ts +9 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +9 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/licenses.d.ts +3 -0
  56. package/dist/licenses.d.ts.map +1 -0
  57. package/dist/licenses.js +70 -0
  58. package/dist/licenses.js.map +1 -0
  59. package/dist/logger.d.ts +4 -0
  60. package/dist/logger.d.ts.map +1 -0
  61. package/dist/logger.js +75 -0
  62. package/dist/logger.js.map +1 -0
  63. package/dist/plans.d.ts +5 -0
  64. package/dist/plans.d.ts.map +1 -0
  65. package/dist/plans.js +72 -0
  66. package/dist/plans.js.map +1 -0
  67. package/dist/portal.d.ts +2 -0
  68. package/dist/portal.d.ts.map +1 -0
  69. package/dist/portal.js +15 -0
  70. package/dist/portal.js.map +1 -0
  71. package/dist/retry.d.ts +2 -0
  72. package/dist/retry.d.ts.map +1 -0
  73. package/dist/retry.js +35 -0
  74. package/dist/retry.js.map +1 -0
  75. package/dist/src/billing-config.d.ts +3 -0
  76. package/dist/src/billing-config.d.ts.map +1 -0
  77. package/dist/src/billing-config.js +34 -0
  78. package/dist/src/billing-config.js.map +1 -0
  79. package/dist/src/cli/cli-validate.d.ts +2 -0
  80. package/dist/src/cli/cli-validate.d.ts.map +1 -0
  81. package/dist/src/cli/cli-validate.js +206 -0
  82. package/dist/src/cli/cli-validate.js.map +1 -0
  83. package/dist/src/cli/cli.d.ts +3 -0
  84. package/dist/src/cli/cli.d.ts.map +1 -0
  85. package/dist/src/cli/cli.js +40 -0
  86. package/dist/src/cli/cli.js.map +1 -0
  87. package/dist/src/core/bootstrap.d.ts +8 -0
  88. package/dist/src/core/bootstrap.d.ts.map +1 -0
  89. package/dist/src/core/bootstrap.js +42 -0
  90. package/dist/src/core/bootstrap.js.map +1 -0
  91. package/dist/src/core/cache.d.ts +5 -0
  92. package/dist/src/core/cache.d.ts.map +1 -0
  93. package/dist/src/core/cache.js +27 -0
  94. package/dist/src/core/cache.js.map +1 -0
  95. package/dist/src/core/checkout.d.ts +3 -0
  96. package/dist/src/core/checkout.d.ts.map +1 -0
  97. package/dist/src/core/checkout.js +42 -0
  98. package/dist/src/core/checkout.js.map +1 -0
  99. package/dist/src/core/createBilling.d.ts +3 -0
  100. package/dist/src/core/createBilling.d.ts.map +1 -0
  101. package/dist/src/core/createBilling.js +82 -0
  102. package/dist/src/core/createBilling.js.map +1 -0
  103. package/dist/src/core/customers.d.ts +3 -0
  104. package/dist/src/core/customers.d.ts.map +1 -0
  105. package/dist/src/core/customers.js +57 -0
  106. package/dist/src/core/customers.js.map +1 -0
  107. package/dist/src/core/dedup.d.ts +60 -0
  108. package/dist/src/core/dedup.d.ts.map +1 -0
  109. package/dist/src/core/dedup.js +74 -0
  110. package/dist/src/core/dedup.js.map +1 -0
  111. package/dist/src/core/express.d.ts +13 -0
  112. package/dist/src/core/express.d.ts.map +1 -0
  113. package/dist/src/core/express.js +70 -0
  114. package/dist/src/core/express.js.map +1 -0
  115. package/dist/src/core/health.d.ts +3 -0
  116. package/dist/src/core/health.d.ts.map +1 -0
  117. package/dist/src/core/health.js +38 -0
  118. package/dist/src/core/health.js.map +1 -0
  119. package/dist/src/core/index.d.ts +9 -0
  120. package/dist/src/core/index.d.ts.map +1 -0
  121. package/dist/src/core/index.js +9 -0
  122. package/dist/src/core/index.js.map +1 -0
  123. package/dist/src/core/licenses.d.ts +3 -0
  124. package/dist/src/core/licenses.d.ts.map +1 -0
  125. package/dist/src/core/licenses.js +70 -0
  126. package/dist/src/core/licenses.js.map +1 -0
  127. package/dist/src/core/logger.d.ts +4 -0
  128. package/dist/src/core/logger.d.ts.map +1 -0
  129. package/dist/src/core/logger.js +150 -0
  130. package/dist/src/core/logger.js.map +1 -0
  131. package/dist/src/core/plans.d.ts +5 -0
  132. package/dist/src/core/plans.d.ts.map +1 -0
  133. package/dist/src/core/plans.js +72 -0
  134. package/dist/src/core/plans.js.map +1 -0
  135. package/dist/src/core/portal.d.ts +2 -0
  136. package/dist/src/core/portal.d.ts.map +1 -0
  137. package/dist/src/core/portal.js +15 -0
  138. package/dist/src/core/portal.js.map +1 -0
  139. package/dist/src/core/retry.d.ts +2 -0
  140. package/dist/src/core/retry.d.ts.map +1 -0
  141. package/dist/src/core/retry.js +35 -0
  142. package/dist/src/core/retry.js.map +1 -0
  143. package/dist/src/core/subscriptions.d.ts +3 -0
  144. package/dist/src/core/subscriptions.d.ts.map +1 -0
  145. package/dist/src/core/subscriptions.js +46 -0
  146. package/dist/src/core/subscriptions.js.map +1 -0
  147. package/dist/src/core/webhook.d.ts +7 -0
  148. package/dist/src/core/webhook.d.ts.map +1 -0
  149. package/dist/src/core/webhook.js +233 -0
  150. package/dist/src/core/webhook.js.map +1 -0
  151. package/dist/src/core/webhooks.d.ts +3 -0
  152. package/dist/src/core/webhooks.d.ts.map +1 -0
  153. package/dist/src/core/webhooks.js +28 -0
  154. package/dist/src/core/webhooks.js.map +1 -0
  155. package/dist/src/types/billing/billing.d.ts +36 -0
  156. package/dist/src/types/billing/billing.d.ts.map +1 -0
  157. package/dist/src/types/billing/billing.js +2 -0
  158. package/dist/src/types/billing/billing.js.map +1 -0
  159. package/dist/src/types/billing/index.d.ts +2 -0
  160. package/dist/src/types/billing/index.d.ts.map +1 -0
  161. package/dist/src/types/billing/index.js +2 -0
  162. package/dist/src/types/billing/index.js.map +1 -0
  163. package/dist/src/types/billing/types.d.ts +50 -0
  164. package/dist/src/types/billing/types.d.ts.map +1 -0
  165. package/dist/src/types/billing/types.js +2 -0
  166. package/dist/src/types/billing/types.js.map +1 -0
  167. package/dist/src/types/cache/index.d.ts +2 -0
  168. package/dist/src/types/cache/index.d.ts.map +1 -0
  169. package/dist/src/types/cache/index.js +2 -0
  170. package/dist/src/types/cache/index.js.map +1 -0
  171. package/dist/src/types/cache/types.d.ts +62 -0
  172. package/dist/src/types/cache/types.d.ts.map +1 -0
  173. package/dist/src/types/cache/types.js +2 -0
  174. package/dist/src/types/cache/types.js.map +1 -0
  175. package/dist/src/types/config/index.d.ts +2 -0
  176. package/dist/src/types/config/index.d.ts.map +1 -0
  177. package/dist/src/types/config/index.js +2 -0
  178. package/dist/src/types/config/index.js.map +1 -0
  179. package/dist/src/types/config/types.d.ts +138 -0
  180. package/dist/src/types/config/types.d.ts.map +1 -0
  181. package/dist/src/types/config/types.js +2 -0
  182. package/dist/src/types/config/types.js.map +1 -0
  183. package/dist/src/types/index.d.ts +9 -0
  184. package/dist/src/types/index.d.ts.map +1 -0
  185. package/dist/src/types/index.js +9 -0
  186. package/dist/src/types/index.js.map +1 -0
  187. package/dist/src/types/license/index.d.ts +2 -0
  188. package/dist/src/types/license/index.d.ts.map +1 -0
  189. package/dist/src/types/license/index.js +2 -0
  190. package/dist/src/types/license/index.js.map +1 -0
  191. package/dist/src/types/license/types.d.ts +32 -0
  192. package/dist/src/types/license/types.d.ts.map +1 -0
  193. package/dist/src/types/license/types.js +2 -0
  194. package/dist/src/types/license/types.js.map +1 -0
  195. package/dist/src/types/management/index.d.ts +2 -0
  196. package/dist/src/types/management/index.d.ts.map +1 -0
  197. package/dist/src/types/management/index.js +2 -0
  198. package/dist/src/types/management/index.js.map +1 -0
  199. package/dist/src/types/management/types.d.ts +37 -0
  200. package/dist/src/types/management/types.d.ts.map +1 -0
  201. package/dist/src/types/management/types.js +2 -0
  202. package/dist/src/types/management/types.js.map +1 -0
  203. package/dist/src/types/subscription/index.d.ts +2 -0
  204. package/dist/src/types/subscription/index.d.ts.map +1 -0
  205. package/dist/src/types/subscription/index.js +2 -0
  206. package/dist/src/types/subscription/index.js.map +1 -0
  207. package/dist/src/types/subscription/types.d.ts +46 -0
  208. package/dist/src/types/subscription/types.d.ts.map +1 -0
  209. package/dist/src/types/subscription/types.js +2 -0
  210. package/dist/src/types/subscription/types.js.map +1 -0
  211. package/dist/src/types/types.d.ts +2 -0
  212. package/dist/src/types/types.d.ts.map +1 -0
  213. package/dist/src/types/types.js +2 -0
  214. package/dist/src/types/types.js.map +1 -0
  215. package/dist/src/types/webhook/index.d.ts +2 -0
  216. package/dist/src/types/webhook/index.d.ts.map +1 -0
  217. package/dist/src/types/webhook/index.js +2 -0
  218. package/dist/src/types/webhook/index.js.map +1 -0
  219. package/dist/src/types/webhook/types.d.ts +14 -0
  220. package/dist/src/types/webhook/types.d.ts.map +1 -0
  221. package/dist/src/types/webhook/types.js +2 -0
  222. package/dist/src/types/webhook/types.js.map +1 -0
  223. package/dist/src/wizard.d.ts +22 -0
  224. package/dist/src/wizard.d.ts.map +1 -0
  225. package/dist/src/wizard.js +628 -0
  226. package/dist/src/wizard.js.map +1 -0
  227. package/dist/subscriptions.d.ts +3 -0
  228. package/dist/subscriptions.d.ts.map +1 -0
  229. package/dist/subscriptions.js +46 -0
  230. package/dist/subscriptions.js.map +1 -0
  231. package/dist/types.d.ts +286 -0
  232. package/dist/types.d.ts.map +1 -0
  233. package/dist/types.js +2 -0
  234. package/dist/types.js.map +1 -0
  235. package/dist/webhook.d.ts +7 -0
  236. package/dist/webhook.d.ts.map +1 -0
  237. package/dist/webhook.js +227 -0
  238. package/dist/webhook.js.map +1 -0
  239. package/dist/webhooks.d.ts +3 -0
  240. package/dist/webhooks.d.ts.map +1 -0
  241. package/dist/webhooks.js +28 -0
  242. package/dist/webhooks.js.map +1 -0
  243. package/dist/wizard.d.ts +22 -0
  244. package/dist/wizard.d.ts.map +1 -0
  245. package/dist/wizard.js +615 -0
  246. package/dist/wizard.js.map +1 -0
  247. package/package.json +88 -0
package/dist/wizard.js ADDED
@@ -0,0 +1,615 @@
1
+ import prompts from "prompts";
2
+ import chalk from "chalk";
3
+ import { createWriteStream } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { createBilling } from "./index.js";
6
+ import { fetchProducts, flattenPlans } from "./plans.js";
7
+ import "dotenv/config";
8
+ // ASCII Art Banner (no emojis)
9
+ const banner = `
10
+ ${chalk.bold("Lemon Squeezy Billing Setup")}
11
+ ${"─".repeat(35)}
12
+ Quick setup for your billing integration
13
+ `;
14
+ // Animation helpers - 9 dots snake animation
15
+ class LoadingAnimation {
16
+ interval = null;
17
+ frame = 0;
18
+ dots = 9;
19
+ chars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇'];
20
+ start(message = "Loading") {
21
+ this.stop();
22
+ process.stdout.write(`\n${message} `);
23
+ this.interval = setInterval(() => {
24
+ const char = this.chars[this.frame % this.dots];
25
+ const dots = '.'.repeat(this.frame % this.dots);
26
+ const spaces = ' '.repeat(this.dots - (this.frame % this.dots) - 1);
27
+ process.stdout.write(`\r${message} ${char}${dots}${spaces} `);
28
+ this.frame++;
29
+ }, 80);
30
+ }
31
+ stop(message) {
32
+ if (this.interval) {
33
+ clearInterval(this.interval);
34
+ this.interval = null;
35
+ }
36
+ if (message) {
37
+ process.stdout.write(`\r${message}\n`);
38
+ }
39
+ else {
40
+ process.stdout.write('\n');
41
+ }
42
+ }
43
+ }
44
+ const loading = new LoadingAnimation();
45
+ class BillingWizard {
46
+ state = {
47
+ apiKey: "",
48
+ stores: [],
49
+ selectedStoreIds: [],
50
+ products: [],
51
+ selectedProductIds: [],
52
+ webhookEvents: [],
53
+ cachePath: "./billing-cache.json",
54
+ webhookSecret: this.generateSecret(),
55
+ loggerPath: "./billing.log",
56
+ };
57
+ generateSecret() {
58
+ return "ls_".concat(Math.random().toString(36).slice(2, 15));
59
+ }
60
+ async run() {
61
+ console.log(banner);
62
+ try {
63
+ await this.stepApiKey();
64
+ await this.stepStoreSelection();
65
+ await this.stepProductSelection();
66
+ await this.stepWebhookSetup();
67
+ await this.stepConfiguration();
68
+ await this.stepGenerateFiles();
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error && error.message === 'Aborted') {
72
+ console.log("\n[x] Wizard cancelled");
73
+ process.exit(0);
74
+ }
75
+ console.error("\n[x] Error:", error);
76
+ process.exit(1);
77
+ }
78
+ }
79
+ getAvailableApiKeys() {
80
+ const keys = [];
81
+ if (process.env.LS_TEST_API_KEY) {
82
+ keys.push({
83
+ name: "LS_TEST_API_KEY",
84
+ value: process.env.LS_TEST_API_KEY,
85
+ description: "Test mode API key (sandbox)"
86
+ });
87
+ }
88
+ if (process.env.LS_LIVE_API_KEY) {
89
+ keys.push({
90
+ name: "LS_LIVE_API_KEY",
91
+ value: process.env.LS_LIVE_API_KEY,
92
+ description: "Live mode API key (production)"
93
+ });
94
+ }
95
+ return keys;
96
+ }
97
+ async stepApiKey() {
98
+ console.log("\n" + chalk.dim("Navigation: ENTER to proceed, ESC to go back/exit"));
99
+ console.log(chalk.dim("Tip: Set LS_TEST_API_KEY, LS_LIVE_API_KEY, or LS_WEBHOOK_SECRET in .env"));
100
+ const availableKeys = this.getAvailableApiKeys();
101
+ let apiKey = null;
102
+ if (availableKeys.length > 0) {
103
+ if (availableKeys.length === 1) {
104
+ console.log(`\n[+] Found ${availableKeys[0].name} in environment`);
105
+ apiKey = availableKeys[0].value;
106
+ }
107
+ else {
108
+ console.log("\n" + chalk.dim("Select API keys (use SPACE to select, ENTER to submit):"));
109
+ const selected = await prompts({
110
+ type: "multiselect",
111
+ name: "apiKeys",
112
+ message: "Choose API keys:",
113
+ choices: availableKeys.map(k => ({
114
+ title: `${k.name} (${k.description})`,
115
+ value: k.value
116
+ })),
117
+ instructions: false,
118
+ hint: "Space to select, Enter to submit",
119
+ onState: (state) => {
120
+ if (state.aborted)
121
+ throw new Error('Aborted');
122
+ }
123
+ });
124
+ // Use the first selected key, or fallback to the first available if none selected
125
+ apiKey = selected.apiKeys.length > 0 ? selected.apiKeys[0] : availableKeys[0].value;
126
+ }
127
+ }
128
+ if (!apiKey) {
129
+ const response = await prompts({
130
+ type: "text",
131
+ name: "apiKey",
132
+ message: "Enter your Lemon Squeezy API key:",
133
+ validate: (value) => value.length > 0 || "API key is required",
134
+ onState: (state) => {
135
+ if (state.aborted)
136
+ throw new Error('Aborted');
137
+ }
138
+ });
139
+ apiKey = response.apiKey;
140
+ }
141
+ if (!apiKey) {
142
+ console.log("[x] API key is required");
143
+ return this.stepApiKey();
144
+ }
145
+ loading.start("Validating API key");
146
+ try {
147
+ // Test the API key by creating a billing instance
148
+ const billing = await createBilling({
149
+ apiKey: apiKey,
150
+ callbacks: { onPurchase: async () => { } }
151
+ });
152
+ loading.stop(`[+] Found ${billing.stores.length} store(s)`);
153
+ this.state.apiKey = apiKey;
154
+ this.state.stores = billing.stores;
155
+ }
156
+ catch (error) {
157
+ loading.stop("[x] Invalid API key. Please try again.");
158
+ return this.stepApiKey();
159
+ }
160
+ }
161
+ async stepStoreSelection() {
162
+ console.log("\n" + chalk.dim("Navigation: ENTER to proceed, ESC to go back"));
163
+ if (this.state.stores.length === 0) {
164
+ console.log("[x] No stores found. Please check your API key.");
165
+ return this.stepApiKey();
166
+ }
167
+ console.log("\n" + chalk.dim("Select stores (use SPACE to select, ENTER to submit):"));
168
+ const response = await prompts({
169
+ type: "multiselect",
170
+ name: "stores",
171
+ message: "Select stores to use:",
172
+ choices: this.state.stores.map(store => ({
173
+ title: `${store.name} (${store.id})`,
174
+ value: store.id
175
+ })),
176
+ instructions: false,
177
+ hint: "Space to select, Enter to submit",
178
+ onState: (state) => {
179
+ if (state.aborted)
180
+ throw new Error('Aborted');
181
+ }
182
+ });
183
+ this.state.selectedStoreIds = response.stores;
184
+ if (this.state.selectedStoreIds.length === 0) {
185
+ console.log("[x] Please select at least one store");
186
+ return this.stepStoreSelection();
187
+ }
188
+ console.log(`[+] Selected ${this.state.selectedStoreIds.length} store(s)`);
189
+ }
190
+ async stepProductSelection() {
191
+ console.log("\n" + chalk.dim("Navigation: ENTER to proceed, ESC to go back"));
192
+ console.log("[*] Fetching products...");
193
+ const allProducts = [];
194
+ for (const storeId of this.state.selectedStoreIds) {
195
+ try {
196
+ const products = await fetchProducts(storeId);
197
+ allProducts.push(...products);
198
+ }
199
+ catch (error) {
200
+ console.log(`[x] Failed to fetch products for store ${storeId}`);
201
+ return this.stepStoreSelection();
202
+ }
203
+ }
204
+ if (allProducts.length === 0) {
205
+ console.log("[x] No products found. Please create products in your Lemon Squeezy dashboard.");
206
+ return this.stepStoreSelection();
207
+ }
208
+ this.state.products = allProducts;
209
+ const plans = flattenPlans(allProducts);
210
+ console.log("\n" + chalk.dim("Select products (use SPACE to select, ENTER to submit):"));
211
+ const response = await prompts({
212
+ type: "multiselect",
213
+ name: "products",
214
+ message: "Select products to include:",
215
+ choices: plans.map(plan => ({
216
+ title: `${plan.name} - ${plan.variantName} (${plan.priceFormatted})`,
217
+ value: plan.variantId
218
+ })),
219
+ instructions: false,
220
+ hint: "Space to select, Enter to submit",
221
+ onState: (state) => {
222
+ if (state.aborted)
223
+ throw new Error('Aborted');
224
+ }
225
+ });
226
+ this.state.selectedProductIds = response.products;
227
+ if (this.state.selectedProductIds.length === 0) {
228
+ console.log("[x] Please select at least one product");
229
+ return this.stepProductSelection();
230
+ }
231
+ console.log(`[+] Selected ${this.state.selectedProductIds.length} product(s)`);
232
+ }
233
+ async stepWebhookSetup() {
234
+ console.log("\n" + chalk.dim("Navigation: ENTER to proceed, ESC to skip"));
235
+ console.log("\n" + chalk.dim("Create webhook endpoint? (use SPACE to select, ENTER to submit):"));
236
+ const response = await prompts({
237
+ type: "multiselect",
238
+ name: "webhook",
239
+ message: "Create webhook endpoint:",
240
+ choices: [
241
+ { title: "Yes, create webhook", value: "yes" },
242
+ { title: "No, skip webhook setup", value: "no" }
243
+ ],
244
+ instructions: false,
245
+ hint: "Space to select, Enter to submit",
246
+ onState: (state) => {
247
+ if (state.aborted)
248
+ throw new Error('Aborted');
249
+ }
250
+ });
251
+ if (!response.webhook.includes("yes")) {
252
+ console.log("[-] Skipping webhook setup");
253
+ return;
254
+ }
255
+ console.log("\n" + chalk.dim("Enter webhook URL:"));
256
+ const urlResponse = await prompts({
257
+ type: "text",
258
+ name: "url",
259
+ message: "Webhook URL:",
260
+ initial: "https://your-domain.com/webhook",
261
+ validate: (value) => value.length > 0 || "URL is required",
262
+ onState: (state) => {
263
+ if (state.aborted)
264
+ throw new Error('Aborted');
265
+ }
266
+ });
267
+ this.state.webhookUrl = urlResponse.url;
268
+ console.log("\n" + chalk.dim("Select webhook events (use SPACE to select, ENTER to submit):"));
269
+ const eventsResponse = await prompts({
270
+ type: "multiselect",
271
+ name: "events",
272
+ message: "Select webhook events:",
273
+ choices: [
274
+ { title: "Order Created", value: "order_created" },
275
+ { title: "Order Refunded", value: "order_refunded" },
276
+ { title: "Subscription Created", value: "subscription_created" },
277
+ { title: "Subscription Updated", value: "subscription_updated" },
278
+ { title: "Subscription Cancelled", value: "subscription_cancelled" },
279
+ { title: "Payment Failed", value: "subscription_payment_failed" },
280
+ { title: "License Key Created", value: "license_key_created" },
281
+ { title: "License Key Updated", value: "license_key_updated" }
282
+ ],
283
+ instructions: false,
284
+ hint: "Space to select, Enter to submit",
285
+ onState: (state) => {
286
+ if (state.aborted)
287
+ throw new Error('Aborted');
288
+ }
289
+ });
290
+ this.state.webhookEvents = eventsResponse.events;
291
+ console.log("[+] Webhook configuration saved");
292
+ }
293
+ async stepConfiguration() {
294
+ console.log("\n" + chalk.dim("Navigation: ENTER to proceed, ESC to go back"));
295
+ console.log("\n" + chalk.dim("Enter cache file path:"));
296
+ const cacheResponse = await prompts({
297
+ type: "text",
298
+ name: "cachePath",
299
+ message: "Cache file path:",
300
+ initial: this.state.cachePath,
301
+ onState: (state) => {
302
+ if (state.aborted)
303
+ throw new Error('Aborted');
304
+ }
305
+ });
306
+ this.state.cachePath = cacheResponse.cachePath || this.state.cachePath;
307
+ console.log("\n" + chalk.dim("Enter the webhook secret you want:"));
308
+ const secretResponse = await prompts({
309
+ type: "text",
310
+ name: "webhookSecret",
311
+ message: "Webhook secret:",
312
+ initial: this.state.webhookSecret,
313
+ onState: (state) => {
314
+ if (state.aborted)
315
+ throw new Error('Aborted');
316
+ }
317
+ });
318
+ this.state.webhookSecret = secretResponse.webhookSecret || this.state.webhookSecret;
319
+ console.log("\n" + chalk.dim("Enter logger file path:"));
320
+ const loggerResponse = await prompts({
321
+ type: "text",
322
+ name: "loggerPath",
323
+ message: "Logger file path:",
324
+ initial: this.state.loggerPath,
325
+ onState: (state) => {
326
+ if (state.aborted)
327
+ throw new Error('Aborted');
328
+ }
329
+ });
330
+ this.state.loggerPath = loggerResponse.loggerPath || this.state.loggerPath;
331
+ console.log("[+] Configuration saved");
332
+ }
333
+ async stepGenerateFiles() {
334
+ console.log("\n" + chalk.dim("Navigation: ENTER to generate, ESC to exit"));
335
+ console.log("\n" + chalk.dim("Generate configuration files? (use SPACE to select, ENTER to submit):"));
336
+ const response = await prompts({
337
+ type: "multiselect",
338
+ name: "generate",
339
+ message: "Generate configuration files:",
340
+ choices: [
341
+ { title: "Yes, generate files", value: "yes" },
342
+ { title: "No, exit without generating", value: "no" }
343
+ ],
344
+ instructions: false,
345
+ hint: "Space to select, Enter to submit",
346
+ onState: (state) => {
347
+ if (state.aborted)
348
+ throw new Error('Aborted');
349
+ }
350
+ });
351
+ if (!response.generate.includes("yes")) {
352
+ console.log("[-] Exiting without generating files");
353
+ process.exit(0);
354
+ }
355
+ await this.generateFiles();
356
+ // Run validation tests after file generation
357
+ await this.runValidationTests();
358
+ }
359
+ async generateFiles() {
360
+ const configContent = this.generateConfigContent();
361
+ const exampleContent = this.generateExampleContent();
362
+ const configPath = resolve(process.cwd(), "billing-config.ts");
363
+ const examplePath = resolve(process.cwd(), "example.ts");
364
+ // Write config file
365
+ const configStream = createWriteStream(configPath);
366
+ configStream.write(configContent);
367
+ configStream.end();
368
+ // Write example file
369
+ const exampleStream = createWriteStream(examplePath);
370
+ exampleStream.write(exampleContent);
371
+ exampleStream.end();
372
+ console.log("\n[+] Files generated successfully!");
373
+ console.log(`📁 ${configPath}`);
374
+ console.log(`📁 ${examplePath}`);
375
+ console.log("\n🚀 Next steps:");
376
+ console.log("1. Review the generated files");
377
+ console.log("2. Run: node example.ts");
378
+ console.log("3. Start building your billing integration!");
379
+ }
380
+ async runValidationTests() {
381
+ console.log("\n" + chalk.dim("Running validation tests..."));
382
+ try {
383
+ // Test TypeScript compilation
384
+ console.log("[*] Testing TypeScript compilation...");
385
+ const { execSync } = await import('child_process');
386
+ execSync('pnpm typecheck', { stdio: 'pipe' });
387
+ console.log("[+] TypeScript compilation passed");
388
+ // Test build process
389
+ console.log("[*] Testing build process...");
390
+ execSync('pnpm build', { stdio: 'pipe' });
391
+ console.log("[+] Build process passed");
392
+ // Test example file execution (syntax check)
393
+ console.log("[*] Testing example file syntax...");
394
+ execSync('node --check example.ts', { stdio: 'pipe' });
395
+ console.log("[+] Example file syntax valid");
396
+ // Test billing configuration
397
+ console.log("[*] Testing billing configuration...");
398
+ // Check if billing-config.ts exists and has proper exports
399
+ const fs = await import('node:fs');
400
+ const path = await import('node:path');
401
+ const configPath = path.resolve(process.cwd(), 'billing-config.ts');
402
+ if (!fs.existsSync(configPath)) {
403
+ throw new Error("billing-config.ts file not found");
404
+ }
405
+ const configContent = fs.readFileSync(configPath, 'utf8');
406
+ if (!configContent.includes('export const billingConfig')) {
407
+ throw new Error("billing-config.ts does not export billingConfig");
408
+ }
409
+ console.log("[+] Billing configuration valid");
410
+ console.log("\n[+] All validation tests passed! ✅");
411
+ console.log("Your billing integration is ready to use.");
412
+ // Check if sandbox API key and offer real cycle flow
413
+ await this.offerRealCycleFlow();
414
+ }
415
+ catch (error) {
416
+ console.log("\n[x] Validation tests failed:");
417
+ console.error("Error:", error instanceof Error ? error.message : error);
418
+ console.log("\nPlease review the generated files and fix any issues.");
419
+ console.log("You can run the following commands to debug:");
420
+ console.log(" pnpm typecheck");
421
+ console.log(" pnpm build");
422
+ console.log(" node --check example.ts");
423
+ process.exit(1);
424
+ }
425
+ }
426
+ generateConfigContent() {
427
+ return `import type { BillingConfig } from "@yosefhayim/lemonsqueezy-billing";
428
+
429
+ export const billingConfig: BillingConfig = {
430
+ apiKey: process.env.LEMON_SQUEEZY_API_KEY || "${this.state.apiKey}",
431
+ storeId: "${this.state.selectedStoreIds[0]}",
432
+ webhookSecret: "${this.state.webhookSecret}",
433
+ cachePath: "${this.state.cachePath}",
434
+ logger: { filePath: "${this.state.loggerPath}" },
435
+ callbacks: {
436
+ onPurchase: async (event) => {
437
+ // Handle purchase event
438
+ console.log("Purchase:", event);
439
+ // TODO: Add your purchase logic here
440
+ },
441
+ onRefund: async (event) => {
442
+ // Handle refund event
443
+ console.log("Refund:", event);
444
+ // TODO: Add your refund logic here
445
+ },
446
+ onSubscriptionCreated: async (event) => {
447
+ // Handle subscription created
448
+ console.log("Subscription created:", event);
449
+ // TODO: Add your subscription created logic here
450
+ },
451
+ onSubscriptionUpdated: async (event) => {
452
+ // Handle subscription updated
453
+ console.log("Subscription updated:", event);
454
+ // TODO: Add your subscription updated logic here
455
+ },
456
+ onSubscriptionCancelled: async (event) => {
457
+ // Handle subscription cancelled
458
+ console.log("Subscription cancelled:", event);
459
+ // TODO: Add your subscription cancelled logic here
460
+ },
461
+ onPaymentFailed: async (event) => {
462
+ // Handle payment failed
463
+ console.log("Payment failed:", event);
464
+ // TODO: Add your payment failed logic here
465
+ },
466
+ onLicenseKeyCreated: async (event) => {
467
+ // Handle license key created
468
+ console.log("License key created:", event);
469
+ // TODO: Add your license key created logic here
470
+ },
471
+ onLicenseKeyUpdated: async (event) => {
472
+ // Handle license key updated
473
+ console.log("License key updated:", event);
474
+ // TODO: Add your license key updated logic here
475
+ }
476
+ }
477
+ };
478
+
479
+ ${this.state.webhookUrl ? `
480
+ // Webhook configuration
481
+ export const webhookConfig = {
482
+ url: "${this.state.webhookUrl}",
483
+ events: [${this.state.webhookEvents.map(e => `"${e}"`).join(", ")}],
484
+ secret: "${this.state.webhookSecret}"
485
+ };
486
+ ` : ""}
487
+ `;
488
+ }
489
+ async offerRealCycleFlow() {
490
+ console.log("\n" + chalk.dim("Checking API key type..."));
491
+ // Check if this is a sandbox/test API key
492
+ const isSandboxKey = this.state.apiKey.includes('test_') ||
493
+ this.state.apiKey.includes('sandbox_') ||
494
+ process.env.LS_TEST_API_KEY === this.state.apiKey;
495
+ if (!isSandboxKey) {
496
+ console.log("[-] Live API key detected. Skipping real cycle flow test.");
497
+ return;
498
+ }
499
+ console.log("[+] Sandbox API key detected!");
500
+ console.log("\n" + chalk.dim("Would you like to run a real cycle flow test? (use SPACE to select, ENTER to submit):"));
501
+ const response = await prompts({
502
+ type: "multiselect",
503
+ name: "runTest",
504
+ message: "Run real cycle flow test:",
505
+ choices: [
506
+ { title: "Yes, run test cycle", value: "yes" },
507
+ { title: "No, skip test", value: "no" }
508
+ ],
509
+ instructions: false,
510
+ hint: "Space to select, Enter to submit",
511
+ onState: (state) => {
512
+ if (state.aborted)
513
+ throw new Error('Aborted');
514
+ }
515
+ });
516
+ if (!response.runTest.includes("yes")) {
517
+ console.log("[-] Skipping real cycle flow test");
518
+ return;
519
+ }
520
+ await this.runRealCycleFlow();
521
+ }
522
+ async runRealCycleFlow() {
523
+ console.log("\n" + chalk.dim("Running real cycle flow test..."));
524
+ try {
525
+ // Import the generated billing config
526
+ const billingConfig = await import('./billing-config.js');
527
+ const billing = await createBilling(billingConfig.billingConfig);
528
+ console.log("[*] Testing checkout URL creation...");
529
+ const checkoutUrl = await billing.createCheckout({
530
+ variantId: this.state.selectedProductIds[0] || "test-variant",
531
+ email: "test@example.com",
532
+ userId: "test-user-123"
533
+ });
534
+ console.log(`[+] Checkout URL created: ${checkoutUrl}`);
535
+ console.log("[*] Testing product listing...");
536
+ console.log(`[+] Found ${billing.plans.length} products`);
537
+ console.log("[*] Testing store listing...");
538
+ console.log(`[+] Found ${billing.stores.length} stores`);
539
+ console.log("[*] Testing customer portal URL...");
540
+ // Note: Customer portal requires a real customer ID, so we'll skip this test
541
+ console.log("[+] Customer portal functionality available");
542
+ console.log("\n[+] Real cycle flow test completed successfully! ✅");
543
+ console.log("All API operations are working correctly with your sandbox environment.");
544
+ }
545
+ catch (error) {
546
+ console.log("\n[x] Real cycle flow test failed:");
547
+ console.error("Error:", error instanceof Error ? error.message : error);
548
+ console.log("\nThis is normal if your sandbox environment doesn't have test products configured.");
549
+ console.log("Your billing integration is still ready to use.");
550
+ }
551
+ }
552
+ generateExampleContent() {
553
+ return `import express from "express";
554
+ import { createBilling } from "@yosefhayim/lemonsqueezy-billing";
555
+ import { billingConfig } from "./billing-config";
556
+
557
+ const app = express();
558
+ const port = process.env.PORT || 3000;
559
+
560
+ async function setupBilling() {
561
+ try {
562
+ const billing = await createBilling(billingConfig);
563
+
564
+ console.log("[+] Billing setup complete!");
565
+ console.log("Available stores:", billing.stores.map(s => s.name));
566
+ console.log("Available plans:", billing.plans.length);
567
+
568
+ // Example: Create a checkout
569
+ const checkoutUrl = await billing.createCheckout({
570
+ variantId: "${this.state.selectedProductIds[0] || "your-variant-id"}",
571
+ email: "user@example.com",
572
+ userId: "user-123"
573
+ });
574
+
575
+ console.log("Checkout URL:", checkoutUrl);
576
+
577
+ // Webhook endpoint
578
+ app.post("/webhook", express.raw({ type: "application/json" }), async (req, res) => {
579
+ const signature = req.headers["x-signature"] as string;
580
+ const rawBody = req.body.toString();
581
+
582
+ if (!billing.verifyWebhook(rawBody, signature)) {
583
+ return res.status(401).send("Invalid signature");
584
+ }
585
+
586
+ await billing.handleWebhook(JSON.parse(rawBody));
587
+ res.json({ received: true });
588
+ });
589
+
590
+ app.listen(port, () => {
591
+ console.log(\`🚀 Server running on port \${port}\`);
592
+ console.log("💡 Test your webhook with: curl -X POST http://localhost:\${port}/webhook");
593
+ });
594
+
595
+ } catch (error) {
596
+ console.error("[x] Setup failed:", error);
597
+ process.exit(1);
598
+ }
599
+ }
600
+
601
+ setupBilling();
602
+ `;
603
+ }
604
+ }
605
+ // Run the wizard
606
+ const isMain = globalThis.process?.argv[1]?.endsWith('wizard.ts');
607
+ if (isMain) {
608
+ runWizard().catch(console.error);
609
+ }
610
+ export async function runWizard() {
611
+ const wizard = new BillingWizard();
612
+ await wizard.run();
613
+ }
614
+ export { BillingWizard };
615
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"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"}