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.
- package/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/.cursor/skills/wizard/utils/validation.d.ts +3 -0
- package/dist/.cursor/skills/wizard/utils/validation.d.ts.map +1 -0
- package/dist/.cursor/skills/wizard/utils/validation.js +113 -0
- package/dist/.cursor/skills/wizard/utils/validation.js.map +1 -0
- package/dist/billing-config.d.ts +3 -0
- package/dist/billing-config.d.ts.map +1 -0
- package/dist/billing-config.js +37 -0
- package/dist/billing-config.js.map +1 -0
- package/dist/bootstrap.d.ts +8 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +42 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cache.d.ts +5 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +27 -0
- package/dist/cache.js.map +1 -0
- package/dist/checkout.d.ts +3 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +42 -0
- package/dist/checkout.js.map +1 -0
- package/dist/cli-validate.d.ts +2 -0
- package/dist/cli-validate.d.ts.map +1 -0
- package/dist/cli-validate.js +206 -0
- package/dist/cli-validate.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -0
- package/dist/createBilling.d.ts +3 -0
- package/dist/createBilling.d.ts.map +1 -0
- package/dist/createBilling.js +82 -0
- package/dist/createBilling.js.map +1 -0
- package/dist/customers.d.ts +3 -0
- package/dist/customers.d.ts.map +1 -0
- package/dist/customers.js +57 -0
- package/dist/customers.js.map +1 -0
- package/dist/dedup.d.ts +60 -0
- package/dist/dedup.d.ts.map +1 -0
- package/dist/dedup.js +74 -0
- package/dist/dedup.js.map +1 -0
- package/dist/express.d.ts +13 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +70 -0
- package/dist/express.js.map +1 -0
- package/dist/health.d.ts +3 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +38 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/licenses.d.ts +3 -0
- package/dist/licenses.d.ts.map +1 -0
- package/dist/licenses.js +70 -0
- package/dist/licenses.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +75 -0
- package/dist/logger.js.map +1 -0
- package/dist/plans.d.ts +5 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +72 -0
- package/dist/plans.js.map +1 -0
- package/dist/portal.d.ts +2 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +15 -0
- package/dist/portal.js.map +1 -0
- package/dist/retry.d.ts +2 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +35 -0
- package/dist/retry.js.map +1 -0
- package/dist/src/billing-config.d.ts +3 -0
- package/dist/src/billing-config.d.ts.map +1 -0
- package/dist/src/billing-config.js +34 -0
- package/dist/src/billing-config.js.map +1 -0
- package/dist/src/cli/cli-validate.d.ts +2 -0
- package/dist/src/cli/cli-validate.d.ts.map +1 -0
- package/dist/src/cli/cli-validate.js +206 -0
- package/dist/src/cli/cli-validate.js.map +1 -0
- package/dist/src/cli/cli.d.ts +3 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +40 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/core/bootstrap.d.ts +8 -0
- package/dist/src/core/bootstrap.d.ts.map +1 -0
- package/dist/src/core/bootstrap.js +42 -0
- package/dist/src/core/bootstrap.js.map +1 -0
- package/dist/src/core/cache.d.ts +5 -0
- package/dist/src/core/cache.d.ts.map +1 -0
- package/dist/src/core/cache.js +27 -0
- package/dist/src/core/cache.js.map +1 -0
- package/dist/src/core/checkout.d.ts +3 -0
- package/dist/src/core/checkout.d.ts.map +1 -0
- package/dist/src/core/checkout.js +42 -0
- package/dist/src/core/checkout.js.map +1 -0
- package/dist/src/core/createBilling.d.ts +3 -0
- package/dist/src/core/createBilling.d.ts.map +1 -0
- package/dist/src/core/createBilling.js +82 -0
- package/dist/src/core/createBilling.js.map +1 -0
- package/dist/src/core/customers.d.ts +3 -0
- package/dist/src/core/customers.d.ts.map +1 -0
- package/dist/src/core/customers.js +57 -0
- package/dist/src/core/customers.js.map +1 -0
- package/dist/src/core/dedup.d.ts +60 -0
- package/dist/src/core/dedup.d.ts.map +1 -0
- package/dist/src/core/dedup.js +74 -0
- package/dist/src/core/dedup.js.map +1 -0
- package/dist/src/core/express.d.ts +13 -0
- package/dist/src/core/express.d.ts.map +1 -0
- package/dist/src/core/express.js +70 -0
- package/dist/src/core/express.js.map +1 -0
- package/dist/src/core/health.d.ts +3 -0
- package/dist/src/core/health.d.ts.map +1 -0
- package/dist/src/core/health.js +38 -0
- package/dist/src/core/health.js.map +1 -0
- package/dist/src/core/index.d.ts +9 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +9 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/licenses.d.ts +3 -0
- package/dist/src/core/licenses.d.ts.map +1 -0
- package/dist/src/core/licenses.js +70 -0
- package/dist/src/core/licenses.js.map +1 -0
- package/dist/src/core/logger.d.ts +4 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +150 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/plans.d.ts +5 -0
- package/dist/src/core/plans.d.ts.map +1 -0
- package/dist/src/core/plans.js +72 -0
- package/dist/src/core/plans.js.map +1 -0
- package/dist/src/core/portal.d.ts +2 -0
- package/dist/src/core/portal.d.ts.map +1 -0
- package/dist/src/core/portal.js +15 -0
- package/dist/src/core/portal.js.map +1 -0
- package/dist/src/core/retry.d.ts +2 -0
- package/dist/src/core/retry.d.ts.map +1 -0
- package/dist/src/core/retry.js +35 -0
- package/dist/src/core/retry.js.map +1 -0
- package/dist/src/core/subscriptions.d.ts +3 -0
- package/dist/src/core/subscriptions.d.ts.map +1 -0
- package/dist/src/core/subscriptions.js +46 -0
- package/dist/src/core/subscriptions.js.map +1 -0
- package/dist/src/core/webhook.d.ts +7 -0
- package/dist/src/core/webhook.d.ts.map +1 -0
- package/dist/src/core/webhook.js +233 -0
- package/dist/src/core/webhook.js.map +1 -0
- package/dist/src/core/webhooks.d.ts +3 -0
- package/dist/src/core/webhooks.d.ts.map +1 -0
- package/dist/src/core/webhooks.js +28 -0
- package/dist/src/core/webhooks.js.map +1 -0
- package/dist/src/types/billing/billing.d.ts +36 -0
- package/dist/src/types/billing/billing.d.ts.map +1 -0
- package/dist/src/types/billing/billing.js +2 -0
- package/dist/src/types/billing/billing.js.map +1 -0
- package/dist/src/types/billing/index.d.ts +2 -0
- package/dist/src/types/billing/index.d.ts.map +1 -0
- package/dist/src/types/billing/index.js +2 -0
- package/dist/src/types/billing/index.js.map +1 -0
- package/dist/src/types/billing/types.d.ts +50 -0
- package/dist/src/types/billing/types.d.ts.map +1 -0
- package/dist/src/types/billing/types.js +2 -0
- package/dist/src/types/billing/types.js.map +1 -0
- package/dist/src/types/cache/index.d.ts +2 -0
- package/dist/src/types/cache/index.d.ts.map +1 -0
- package/dist/src/types/cache/index.js +2 -0
- package/dist/src/types/cache/index.js.map +1 -0
- package/dist/src/types/cache/types.d.ts +62 -0
- package/dist/src/types/cache/types.d.ts.map +1 -0
- package/dist/src/types/cache/types.js +2 -0
- package/dist/src/types/cache/types.js.map +1 -0
- package/dist/src/types/config/index.d.ts +2 -0
- package/dist/src/types/config/index.d.ts.map +1 -0
- package/dist/src/types/config/index.js +2 -0
- package/dist/src/types/config/index.js.map +1 -0
- package/dist/src/types/config/types.d.ts +138 -0
- package/dist/src/types/config/types.d.ts.map +1 -0
- package/dist/src/types/config/types.js +2 -0
- package/dist/src/types/config/types.js.map +1 -0
- package/dist/src/types/index.d.ts +9 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +9 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/license/index.d.ts +2 -0
- package/dist/src/types/license/index.d.ts.map +1 -0
- package/dist/src/types/license/index.js +2 -0
- package/dist/src/types/license/index.js.map +1 -0
- package/dist/src/types/license/types.d.ts +32 -0
- package/dist/src/types/license/types.d.ts.map +1 -0
- package/dist/src/types/license/types.js +2 -0
- package/dist/src/types/license/types.js.map +1 -0
- package/dist/src/types/management/index.d.ts +2 -0
- package/dist/src/types/management/index.d.ts.map +1 -0
- package/dist/src/types/management/index.js +2 -0
- package/dist/src/types/management/index.js.map +1 -0
- package/dist/src/types/management/types.d.ts +37 -0
- package/dist/src/types/management/types.d.ts.map +1 -0
- package/dist/src/types/management/types.js +2 -0
- package/dist/src/types/management/types.js.map +1 -0
- package/dist/src/types/subscription/index.d.ts +2 -0
- package/dist/src/types/subscription/index.d.ts.map +1 -0
- package/dist/src/types/subscription/index.js +2 -0
- package/dist/src/types/subscription/index.js.map +1 -0
- package/dist/src/types/subscription/types.d.ts +46 -0
- package/dist/src/types/subscription/types.d.ts.map +1 -0
- package/dist/src/types/subscription/types.js +2 -0
- package/dist/src/types/subscription/types.js.map +1 -0
- package/dist/src/types/types.d.ts +2 -0
- package/dist/src/types/types.d.ts.map +1 -0
- package/dist/src/types/types.js +2 -0
- package/dist/src/types/types.js.map +1 -0
- package/dist/src/types/webhook/index.d.ts +2 -0
- package/dist/src/types/webhook/index.d.ts.map +1 -0
- package/dist/src/types/webhook/index.js +2 -0
- package/dist/src/types/webhook/index.js.map +1 -0
- package/dist/src/types/webhook/types.d.ts +14 -0
- package/dist/src/types/webhook/types.d.ts.map +1 -0
- package/dist/src/types/webhook/types.js +2 -0
- package/dist/src/types/webhook/types.js.map +1 -0
- package/dist/src/wizard.d.ts +22 -0
- package/dist/src/wizard.d.ts.map +1 -0
- package/dist/src/wizard.js +628 -0
- package/dist/src/wizard.js.map +1 -0
- package/dist/subscriptions.d.ts +3 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +46 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/types.d.ts +286 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webhook.d.ts +7 -0
- package/dist/webhook.d.ts.map +1 -0
- package/dist/webhook.js +227 -0
- package/dist/webhook.js.map +1 -0
- package/dist/webhooks.d.ts +3 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +28 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/wizard.d.ts +22 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +615 -0
- package/dist/wizard.js.map +1 -0
- 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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"}
|