@profullstack/stripe-config 1.0.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.
- package/LICENSE +15 -0
- package/README.md +338 -0
- package/dist/cli/commands/prices.d.ts +5 -0
- package/dist/cli/commands/prices.d.ts.map +1 -0
- package/dist/cli/commands/prices.js +399 -0
- package/dist/cli/commands/prices.js.map +1 -0
- package/dist/cli/commands/products.d.ts +5 -0
- package/dist/cli/commands/products.d.ts.map +1 -0
- package/dist/cli/commands/products.js +307 -0
- package/dist/cli/commands/products.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +5 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +120 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +52 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config-manager.d.ts +60 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +185 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/stripe-client.d.ts +64 -0
- package/dist/core/stripe-client.d.ts.map +1 -0
- package/dist/core/stripe-client.js +172 -0
- package/dist/core/stripe-client.js.map +1 -0
- package/dist/core/types.d.ts +203 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +37 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { ConfigManager } from '../../core/config-manager.js';
|
|
5
|
+
import { StripeClient } from '../../core/stripe-client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Products command - Manage Stripe products
|
|
8
|
+
*/
|
|
9
|
+
export async function productsCommand() {
|
|
10
|
+
console.log(chalk.bold.blue('\n📦 Stripe Products Management\n'));
|
|
11
|
+
const configManager = new ConfigManager();
|
|
12
|
+
const config = await configManager.loadConfig();
|
|
13
|
+
if (config.projects.length === 0) {
|
|
14
|
+
console.log(chalk.yellow('No projects configured. Run "stripeconf setup" first.'));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
// Select project
|
|
18
|
+
let project;
|
|
19
|
+
if (config.projects.length === 1) {
|
|
20
|
+
project = config.projects[0];
|
|
21
|
+
console.log(chalk.gray(`Using project: ${project.name}\n`));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const { selectedProject } = await inquirer.prompt([
|
|
25
|
+
{
|
|
26
|
+
type: 'list',
|
|
27
|
+
name: 'selectedProject',
|
|
28
|
+
message: 'Select a project:',
|
|
29
|
+
choices: config.projects.map((p) => ({
|
|
30
|
+
name: `${p.name} (${p.environment})`,
|
|
31
|
+
value: p.name,
|
|
32
|
+
})),
|
|
33
|
+
},
|
|
34
|
+
]);
|
|
35
|
+
project = await configManager.getProject(selectedProject);
|
|
36
|
+
}
|
|
37
|
+
const stripeClient = new StripeClient(project);
|
|
38
|
+
// Select operation
|
|
39
|
+
const { operation } = await inquirer.prompt([
|
|
40
|
+
{
|
|
41
|
+
type: 'list',
|
|
42
|
+
name: 'operation',
|
|
43
|
+
message: 'What would you like to do?',
|
|
44
|
+
choices: [
|
|
45
|
+
{ name: 'List all products', value: 'list' },
|
|
46
|
+
{ name: 'View product details', value: 'get' },
|
|
47
|
+
{ name: 'Create new product', value: 'create' },
|
|
48
|
+
{ name: 'Update product', value: 'update' },
|
|
49
|
+
{ name: 'Delete product', value: 'delete' },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
]);
|
|
53
|
+
switch (operation) {
|
|
54
|
+
case 'list':
|
|
55
|
+
await listProducts(stripeClient);
|
|
56
|
+
break;
|
|
57
|
+
case 'get':
|
|
58
|
+
await getProduct(stripeClient);
|
|
59
|
+
break;
|
|
60
|
+
case 'create':
|
|
61
|
+
await createProduct(stripeClient);
|
|
62
|
+
break;
|
|
63
|
+
case 'update':
|
|
64
|
+
await updateProduct(stripeClient);
|
|
65
|
+
break;
|
|
66
|
+
case 'delete':
|
|
67
|
+
await deleteProduct(stripeClient);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function listProducts(stripeClient) {
|
|
72
|
+
const spinner = ora('Fetching products...').start();
|
|
73
|
+
try {
|
|
74
|
+
const products = await stripeClient.listProducts({ limit: 100 });
|
|
75
|
+
spinner.stop();
|
|
76
|
+
if (products.length === 0) {
|
|
77
|
+
console.log(chalk.yellow('\nNo products found.'));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log(chalk.bold(`\nFound ${products.length} product(s):\n`));
|
|
81
|
+
products.forEach((product) => {
|
|
82
|
+
console.log(chalk.bold(` ${product.name}`) + chalk.gray(` (${product.id})`));
|
|
83
|
+
if (product.description) {
|
|
84
|
+
console.log(chalk.gray(` ${product.description}`));
|
|
85
|
+
}
|
|
86
|
+
console.log(chalk.gray(` Active: ${product.active ? 'Yes' : 'No'}`));
|
|
87
|
+
console.log();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
spinner.fail('Failed to fetch products');
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function getProduct(stripeClient) {
|
|
96
|
+
const { productId } = await inquirer.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: 'input',
|
|
99
|
+
name: 'productId',
|
|
100
|
+
message: 'Product ID:',
|
|
101
|
+
validate: (input) => input.trim() ? true : 'Product ID is required',
|
|
102
|
+
},
|
|
103
|
+
]);
|
|
104
|
+
const spinner = ora('Fetching product...').start();
|
|
105
|
+
try {
|
|
106
|
+
const product = await stripeClient.getProduct(productId);
|
|
107
|
+
spinner.stop();
|
|
108
|
+
console.log(chalk.bold('\nProduct Details:\n'));
|
|
109
|
+
console.log(chalk.bold(' Name:'), product.name);
|
|
110
|
+
console.log(chalk.bold(' ID:'), product.id);
|
|
111
|
+
console.log(chalk.bold(' Active:'), product.active ? 'Yes' : 'No');
|
|
112
|
+
if (product.description) {
|
|
113
|
+
console.log(chalk.bold(' Description:'), product.description);
|
|
114
|
+
}
|
|
115
|
+
if (product.images && product.images.length > 0) {
|
|
116
|
+
console.log(chalk.bold(' Images:'), product.images.length);
|
|
117
|
+
}
|
|
118
|
+
if (product.metadata && Object.keys(product.metadata).length > 0) {
|
|
119
|
+
console.log(chalk.bold(' Metadata:'), JSON.stringify(product.metadata, null, 2));
|
|
120
|
+
}
|
|
121
|
+
console.log();
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
spinner.fail('Failed to fetch product');
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function createProduct(stripeClient) {
|
|
129
|
+
console.log(chalk.bold('\nCreate New Product\n'));
|
|
130
|
+
const answers = await inquirer.prompt([
|
|
131
|
+
{
|
|
132
|
+
type: 'input',
|
|
133
|
+
name: 'name',
|
|
134
|
+
message: 'Product name:',
|
|
135
|
+
validate: (input) => input.trim() ? true : 'Name is required',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'input',
|
|
139
|
+
name: 'description',
|
|
140
|
+
message: 'Description (optional):',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'confirm',
|
|
144
|
+
name: 'active',
|
|
145
|
+
message: 'Active?',
|
|
146
|
+
default: true,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'input',
|
|
150
|
+
name: 'images',
|
|
151
|
+
message: 'Image URLs (comma-separated, optional):',
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'input',
|
|
155
|
+
name: 'metadata',
|
|
156
|
+
message: 'Metadata (JSON format, optional):',
|
|
157
|
+
},
|
|
158
|
+
]);
|
|
159
|
+
const spinner = ora('Creating product...').start();
|
|
160
|
+
try {
|
|
161
|
+
const productData = {
|
|
162
|
+
name: answers.name,
|
|
163
|
+
active: answers.active,
|
|
164
|
+
};
|
|
165
|
+
if (answers.description) {
|
|
166
|
+
productData.description = answers.description;
|
|
167
|
+
}
|
|
168
|
+
if (answers.images) {
|
|
169
|
+
productData.images = answers.images.split(',').map((url) => url.trim());
|
|
170
|
+
}
|
|
171
|
+
if (answers.metadata) {
|
|
172
|
+
try {
|
|
173
|
+
productData.metadata = JSON.parse(answers.metadata);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
spinner.fail('Invalid metadata JSON format');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const product = await stripeClient.createProduct(productData);
|
|
181
|
+
spinner.succeed('Product created successfully');
|
|
182
|
+
console.log(chalk.green('\n✓ Product created!'));
|
|
183
|
+
console.log(chalk.gray(` ID: ${product.id}`));
|
|
184
|
+
console.log(chalk.gray(` Name: ${product.name}\n`));
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
spinner.fail('Failed to create product');
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async function updateProduct(stripeClient) {
|
|
192
|
+
const { productId } = await inquirer.prompt([
|
|
193
|
+
{
|
|
194
|
+
type: 'input',
|
|
195
|
+
name: 'productId',
|
|
196
|
+
message: 'Product ID to update:',
|
|
197
|
+
validate: (input) => input.trim() ? true : 'Product ID is required',
|
|
198
|
+
},
|
|
199
|
+
]);
|
|
200
|
+
// Fetch current product
|
|
201
|
+
const spinner = ora('Fetching product...').start();
|
|
202
|
+
let currentProduct;
|
|
203
|
+
try {
|
|
204
|
+
currentProduct = await stripeClient.getProduct(productId);
|
|
205
|
+
spinner.stop();
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
spinner.fail('Failed to fetch product');
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
console.log(chalk.bold('\nCurrent values:\n'));
|
|
212
|
+
console.log(chalk.gray(` Name: ${currentProduct.name}`));
|
|
213
|
+
console.log(chalk.gray(` Description: ${currentProduct.description || 'None'}`));
|
|
214
|
+
console.log(chalk.gray(` Active: ${currentProduct.active}\n`));
|
|
215
|
+
const answers = await inquirer.prompt([
|
|
216
|
+
{
|
|
217
|
+
type: 'input',
|
|
218
|
+
name: 'name',
|
|
219
|
+
message: 'New name (leave empty to keep current):',
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
type: 'input',
|
|
223
|
+
name: 'description',
|
|
224
|
+
message: 'New description (leave empty to keep current):',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
type: 'list',
|
|
228
|
+
name: 'active',
|
|
229
|
+
message: 'Active status:',
|
|
230
|
+
choices: [
|
|
231
|
+
{ name: 'Keep current', value: null },
|
|
232
|
+
{ name: 'Active', value: true },
|
|
233
|
+
{ name: 'Inactive', value: false },
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
]);
|
|
237
|
+
const updates = {};
|
|
238
|
+
if (answers.name)
|
|
239
|
+
updates.name = answers.name;
|
|
240
|
+
if (answers.description)
|
|
241
|
+
updates.description = answers.description;
|
|
242
|
+
if (answers.active !== null)
|
|
243
|
+
updates.active = answers.active;
|
|
244
|
+
if (Object.keys(updates).length === 0) {
|
|
245
|
+
console.log(chalk.yellow('\nNo changes made.'));
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const updateSpinner = ora('Updating product...').start();
|
|
249
|
+
try {
|
|
250
|
+
const product = await stripeClient.updateProduct(productId, updates);
|
|
251
|
+
updateSpinner.succeed('Product updated successfully');
|
|
252
|
+
console.log(chalk.green('\n✓ Product updated!'));
|
|
253
|
+
console.log(chalk.gray(` ID: ${product.id}`));
|
|
254
|
+
console.log(chalk.gray(` Name: ${product.name}\n`));
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
updateSpinner.fail('Failed to update product');
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async function deleteProduct(stripeClient) {
|
|
262
|
+
const { productId } = await inquirer.prompt([
|
|
263
|
+
{
|
|
264
|
+
type: 'input',
|
|
265
|
+
name: 'productId',
|
|
266
|
+
message: 'Product ID to delete:',
|
|
267
|
+
validate: (input) => input.trim() ? true : 'Product ID is required',
|
|
268
|
+
},
|
|
269
|
+
]);
|
|
270
|
+
// Fetch product to show details
|
|
271
|
+
const spinner = ora('Fetching product...').start();
|
|
272
|
+
let product;
|
|
273
|
+
try {
|
|
274
|
+
product = await stripeClient.getProduct(productId);
|
|
275
|
+
spinner.stop();
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
spinner.fail('Failed to fetch product');
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
console.log(chalk.bold('\nProduct to delete:\n'));
|
|
282
|
+
console.log(chalk.gray(` Name: ${product.name}`));
|
|
283
|
+
console.log(chalk.gray(` ID: ${product.id}\n`));
|
|
284
|
+
const { confirm } = await inquirer.prompt([
|
|
285
|
+
{
|
|
286
|
+
type: 'confirm',
|
|
287
|
+
name: 'confirm',
|
|
288
|
+
message: chalk.red('Are you sure you want to delete this product?'),
|
|
289
|
+
default: false,
|
|
290
|
+
},
|
|
291
|
+
]);
|
|
292
|
+
if (!confirm) {
|
|
293
|
+
console.log(chalk.yellow('\nDeletion cancelled.'));
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const deleteSpinner = ora('Deleting product...').start();
|
|
297
|
+
try {
|
|
298
|
+
await stripeClient.deleteProduct(productId);
|
|
299
|
+
deleteSpinner.succeed('Product deleted successfully');
|
|
300
|
+
console.log(chalk.green('\n✓ Product deleted!\n'));
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
deleteSpinner.fail('Failed to delete product');
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=products.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/cli/commands/products.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAyHlD"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { ConfigManager } from '../../core/config-manager.js';
|
|
5
|
+
import { StripeClient } from '../../core/stripe-client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Setup command - Configure a new Stripe project
|
|
8
|
+
*/
|
|
9
|
+
export async function setupCommand() {
|
|
10
|
+
console.log(chalk.bold.blue('\n🔧 Stripe Project Setup\n'));
|
|
11
|
+
const configManager = new ConfigManager();
|
|
12
|
+
// Prompt for project details
|
|
13
|
+
const answers = await inquirer.prompt([
|
|
14
|
+
{
|
|
15
|
+
type: 'input',
|
|
16
|
+
name: 'name',
|
|
17
|
+
message: 'Project name:',
|
|
18
|
+
validate: (input) => {
|
|
19
|
+
if (!input.trim()) {
|
|
20
|
+
return 'Project name is required';
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: 'list',
|
|
27
|
+
name: 'environment',
|
|
28
|
+
message: 'Environment:',
|
|
29
|
+
choices: [
|
|
30
|
+
{ name: 'Test', value: 'test' },
|
|
31
|
+
{ name: 'Live', value: 'live' },
|
|
32
|
+
],
|
|
33
|
+
default: 'test',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
type: 'password',
|
|
37
|
+
name: 'publishableKey',
|
|
38
|
+
message: 'Publishable key:',
|
|
39
|
+
validate: (input) => {
|
|
40
|
+
if (!input.trim()) {
|
|
41
|
+
return 'Publishable key is required';
|
|
42
|
+
}
|
|
43
|
+
if (!input.startsWith('pk_')) {
|
|
44
|
+
return 'Invalid publishable key format (should start with pk_)';
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: 'password',
|
|
51
|
+
name: 'secretKey',
|
|
52
|
+
message: 'Secret key:',
|
|
53
|
+
validate: (input) => {
|
|
54
|
+
if (!input.trim()) {
|
|
55
|
+
return 'Secret key is required';
|
|
56
|
+
}
|
|
57
|
+
if (!input.startsWith('sk_')) {
|
|
58
|
+
return 'Invalid secret key format (should start with sk_)';
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
type: 'password',
|
|
65
|
+
name: 'webhookSecret',
|
|
66
|
+
message: 'Webhook secret (optional):',
|
|
67
|
+
validate: (input) => {
|
|
68
|
+
if (input && !input.startsWith('whsec_')) {
|
|
69
|
+
return 'Invalid webhook secret format (should start with whsec_)';
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
type: 'input',
|
|
76
|
+
name: 'defaultCurrency',
|
|
77
|
+
message: 'Default currency:',
|
|
78
|
+
default: 'usd',
|
|
79
|
+
validate: (input) => {
|
|
80
|
+
if (!input.trim()) {
|
|
81
|
+
return 'Currency is required';
|
|
82
|
+
}
|
|
83
|
+
if (input.length !== 3) {
|
|
84
|
+
return 'Currency must be a 3-letter ISO code (e.g., usd, eur)';
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
]);
|
|
90
|
+
// Validate API keys by making a test request
|
|
91
|
+
const spinner = ora('Validating API keys...').start();
|
|
92
|
+
try {
|
|
93
|
+
const testProject = {
|
|
94
|
+
name: answers.name,
|
|
95
|
+
environment: answers.environment,
|
|
96
|
+
publishableKey: answers.publishableKey,
|
|
97
|
+
secretKey: answers.secretKey,
|
|
98
|
+
webhookSecret: answers.webhookSecret || undefined,
|
|
99
|
+
defaultCurrency: answers.defaultCurrency.toLowerCase(),
|
|
100
|
+
};
|
|
101
|
+
// Test the API key by listing products (limit 1)
|
|
102
|
+
const stripeClient = new StripeClient(testProject);
|
|
103
|
+
await stripeClient.listProducts({ limit: 1 });
|
|
104
|
+
spinner.succeed('API keys validated successfully');
|
|
105
|
+
// Save the project configuration
|
|
106
|
+
const saveSpinner = ora('Saving configuration...').start();
|
|
107
|
+
const project = await configManager.addProject(testProject);
|
|
108
|
+
saveSpinner.succeed('Configuration saved');
|
|
109
|
+
console.log(chalk.green('\n✓ Project configured successfully!'));
|
|
110
|
+
console.log(chalk.gray(` Project: ${project.name}`));
|
|
111
|
+
console.log(chalk.gray(` Environment: ${project.environment}`));
|
|
112
|
+
console.log(chalk.gray(` Currency: ${project.defaultCurrency}`));
|
|
113
|
+
console.log(chalk.gray(` Config: ${configManager.getConfigPath()}\n`));
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
spinner.fail('Failed to validate API keys');
|
|
117
|
+
throw new Error(`Invalid API keys or network error: ${error.message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { setupCommand } from './commands/setup.js';
|
|
5
|
+
import { productsCommand } from './commands/products.js';
|
|
6
|
+
import { pricesCommand } from './commands/prices.js';
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name('stripeconf')
|
|
10
|
+
.description('CLI tool for managing Stripe products and prices')
|
|
11
|
+
.version('1.0.0');
|
|
12
|
+
// Setup command
|
|
13
|
+
program
|
|
14
|
+
.command('setup')
|
|
15
|
+
.description('Configure a new Stripe project')
|
|
16
|
+
.action(async () => {
|
|
17
|
+
try {
|
|
18
|
+
await setupCommand();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error(chalk.red('Error:'), error.message);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// Products command
|
|
26
|
+
program
|
|
27
|
+
.command('products')
|
|
28
|
+
.description('Manage Stripe products')
|
|
29
|
+
.action(async () => {
|
|
30
|
+
try {
|
|
31
|
+
await productsCommand();
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error(chalk.red('Error:'), error.message);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// Prices command
|
|
39
|
+
program
|
|
40
|
+
.command('prices')
|
|
41
|
+
.description('Manage Stripe prices')
|
|
42
|
+
.action(async () => {
|
|
43
|
+
try {
|
|
44
|
+
await pricesCommand();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(chalk.red('Error:'), error.message);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
program.parse();
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,gBAAgB;AAChB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Config, ProjectConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manages configuration file operations for Stripe projects
|
|
4
|
+
* Stores configuration in ~/.config/stripeconf/config.json
|
|
5
|
+
*/
|
|
6
|
+
export declare class ConfigManager {
|
|
7
|
+
private configPath;
|
|
8
|
+
private readonly CONFIG_VERSION;
|
|
9
|
+
/**
|
|
10
|
+
* Create a new ConfigManager instance
|
|
11
|
+
* @param configPath Optional custom path for config file
|
|
12
|
+
*/
|
|
13
|
+
constructor(configPath?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Get the current config file path
|
|
16
|
+
*/
|
|
17
|
+
getConfigPath(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Ensure the config directory exists with proper permissions
|
|
20
|
+
*/
|
|
21
|
+
ensureConfigDirectory(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Load configuration from file
|
|
24
|
+
* Returns empty config if file doesn't exist
|
|
25
|
+
*/
|
|
26
|
+
loadConfig(): Promise<Config>;
|
|
27
|
+
/**
|
|
28
|
+
* Save configuration to file with proper permissions
|
|
29
|
+
*/
|
|
30
|
+
saveConfig(config: Config): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Add a new project to the configuration
|
|
33
|
+
*/
|
|
34
|
+
addProject(projectInput: Omit<ProjectConfig, 'id' | 'createdAt' | 'updatedAt'>): Promise<ProjectConfig>;
|
|
35
|
+
/**
|
|
36
|
+
* Get a project by name
|
|
37
|
+
*/
|
|
38
|
+
getProject(name: string): Promise<ProjectConfig>;
|
|
39
|
+
/**
|
|
40
|
+
* List all projects
|
|
41
|
+
*/
|
|
42
|
+
listProjects(): Promise<ProjectConfig[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Update an existing project
|
|
45
|
+
*/
|
|
46
|
+
updateProject(name: string, updates: Partial<Omit<ProjectConfig, 'id' | 'name' | 'createdAt'>>): Promise<ProjectConfig>;
|
|
47
|
+
/**
|
|
48
|
+
* Delete a project by name
|
|
49
|
+
*/
|
|
50
|
+
deleteProject(name: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Set the default project
|
|
53
|
+
*/
|
|
54
|
+
setDefaultProject(name: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Get the default project
|
|
57
|
+
*/
|
|
58
|
+
getDefaultProject(): Promise<ProjectConfig>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/core/config-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGxD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAE1C;;;OAGG;gBACS,UAAU,CAAC,EAAE,MAAM;IAK/B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5C;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IA0BnC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/C;;OAEG;IACG,UAAU,CACd,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAClE,OAAO,CAAC,aAAa,CAAC;IA+BzB;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAWtD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAK9C;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,GACjE,OAAO,CAAC,aAAa,CAAC;IAqBzB;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhD;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;CAWlD"}
|