paymongo-cli 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.
Files changed (107) hide show
  1. package/.github/ISSUE_TEMPLATE/bug-report.md +33 -0
  2. package/.github/PULL_REQUEST_TEMPLATE.md +30 -0
  3. package/.github/workflows/ci-cd.yml +88 -0
  4. package/.github/workflows/ci.yml +46 -0
  5. package/.github/workflows/release.yml +54 -0
  6. package/LICENSE +21 -0
  7. package/README.md +113 -0
  8. package/bin/paymongo.js +3 -0
  9. package/dist/.tsbuildinfo +1 -0
  10. package/dist/commands/config.d.ts +4 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +398 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/dev.d.ts +4 -0
  15. package/dist/commands/dev.d.ts.map +1 -0
  16. package/dist/commands/dev.js +353 -0
  17. package/dist/commands/dev.js.map +1 -0
  18. package/dist/commands/gui.d.ts +4 -0
  19. package/dist/commands/gui.d.ts.map +1 -0
  20. package/dist/commands/gui.js +74 -0
  21. package/dist/commands/gui.js.map +1 -0
  22. package/dist/commands/init.d.ts +4 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +268 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/login.d.ts +4 -0
  27. package/dist/commands/login.d.ts.map +1 -0
  28. package/dist/commands/login.js +287 -0
  29. package/dist/commands/login.js.map +1 -0
  30. package/dist/commands/payments.d.ts +4 -0
  31. package/dist/commands/payments.d.ts.map +1 -0
  32. package/dist/commands/payments.js +180 -0
  33. package/dist/commands/payments.js.map +1 -0
  34. package/dist/commands/team/index.d.ts +4 -0
  35. package/dist/commands/team/index.d.ts.map +1 -0
  36. package/dist/commands/team/index.js +155 -0
  37. package/dist/commands/team/index.js.map +1 -0
  38. package/dist/commands/trigger.d.ts +4 -0
  39. package/dist/commands/trigger.d.ts.map +1 -0
  40. package/dist/commands/trigger.js +312 -0
  41. package/dist/commands/trigger.js.map +1 -0
  42. package/dist/commands/webhooks.d.ts +4 -0
  43. package/dist/commands/webhooks.d.ts.map +1 -0
  44. package/dist/commands/webhooks.js +357 -0
  45. package/dist/commands/webhooks.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +61 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/services/analytics/service.d.ts +29 -0
  51. package/dist/services/analytics/service.d.ts.map +1 -0
  52. package/dist/services/analytics/service.js +97 -0
  53. package/dist/services/analytics/service.js.map +1 -0
  54. package/dist/services/api/client.d.ts +27 -0
  55. package/dist/services/api/client.d.ts.map +1 -0
  56. package/dist/services/api/client.js +151 -0
  57. package/dist/services/api/client.js.map +1 -0
  58. package/dist/services/config/manager.d.ts +16 -0
  59. package/dist/services/config/manager.d.ts.map +1 -0
  60. package/dist/services/config/manager.js +211 -0
  61. package/dist/services/config/manager.js.map +1 -0
  62. package/dist/services/github/auth.d.ts +15 -0
  63. package/dist/services/github/auth.d.ts.map +1 -0
  64. package/dist/services/github/auth.js +119 -0
  65. package/dist/services/github/auth.js.map +1 -0
  66. package/dist/services/github/client.d.ts +54 -0
  67. package/dist/services/github/client.d.ts.map +1 -0
  68. package/dist/services/github/client.js +107 -0
  69. package/dist/services/github/client.js.map +1 -0
  70. package/dist/services/github/sync.d.ts +26 -0
  71. package/dist/services/github/sync.d.ts.map +1 -0
  72. package/dist/services/github/sync.js +200 -0
  73. package/dist/services/github/sync.js.map +1 -0
  74. package/dist/services/web/server.d.ts +30 -0
  75. package/dist/services/web/server.d.ts.map +1 -0
  76. package/dist/services/web/server.js +159 -0
  77. package/dist/services/web/server.js.map +1 -0
  78. package/dist/types/paymongo.d.ts +118 -0
  79. package/dist/types/paymongo.d.ts.map +1 -0
  80. package/dist/types/paymongo.js +3 -0
  81. package/dist/types/paymongo.js.map +1 -0
  82. package/dist/utils/cache.d.ts +20 -0
  83. package/dist/utils/cache.d.ts.map +1 -0
  84. package/dist/utils/cache.js +164 -0
  85. package/dist/utils/cache.js.map +1 -0
  86. package/dist/utils/constants.d.ts +32 -0
  87. package/dist/utils/constants.d.ts.map +1 -0
  88. package/dist/utils/constants.js +52 -0
  89. package/dist/utils/constants.js.map +1 -0
  90. package/dist/utils/errors.d.ts +33 -0
  91. package/dist/utils/errors.d.ts.map +1 -0
  92. package/dist/utils/errors.js +79 -0
  93. package/dist/utils/errors.js.map +1 -0
  94. package/dist/utils/logger.d.ts +17 -0
  95. package/dist/utils/logger.d.ts.map +1 -0
  96. package/dist/utils/logger.js +53 -0
  97. package/dist/utils/logger.js.map +1 -0
  98. package/dist/utils/spinner.d.ts +17 -0
  99. package/dist/utils/spinner.d.ts.map +1 -0
  100. package/dist/utils/spinner.js +54 -0
  101. package/dist/utils/spinner.js.map +1 -0
  102. package/dist/utils/validator.d.ts +10 -0
  103. package/dist/utils/validator.d.ts.map +1 -0
  104. package/dist/utils/validator.js +79 -0
  105. package/dist/utils/validator.js.map +1 -0
  106. package/package.json +70 -0
  107. package/web/index.html +688 -0
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const commander_1 = require("commander");
40
+ const http = __importStar(require("http"));
41
+ const crypto = __importStar(require("crypto"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const manager_1 = __importDefault(require("../services/config/manager"));
44
+ const client_1 = __importDefault(require("../services/api/client"));
45
+ const spinner_1 = __importDefault(require("../utils/spinner"));
46
+ const errors_1 = require("../utils/errors");
47
+ class DevServer {
48
+ constructor(port, config) {
49
+ this.port = port;
50
+ this.config = config;
51
+ this.server = http.createServer((req, res) => {
52
+ this.handleWebhookRequest(req, res);
53
+ });
54
+ }
55
+ async start() {
56
+ // Start HTTP server
57
+ return new Promise((resolve, reject) => {
58
+ this.server.listen(this.port, () => {
59
+ console.log(chalk_1.default.green('✓'), `Webhook server listening on http://localhost:${this.port}`);
60
+ resolve();
61
+ });
62
+ this.server.on('error', (error) => {
63
+ reject(new Error(`Failed to start server on port ${this.port}: ${error.message}`));
64
+ });
65
+ });
66
+ }
67
+ async stop() {
68
+ return new Promise((resolve) => {
69
+ this.server.close(() => {
70
+ console.log(chalk_1.default.yellow('✓'), 'Webhook server stopped');
71
+ resolve();
72
+ });
73
+ });
74
+ }
75
+ handleWebhookRequest(req, res) {
76
+ if (req.method !== 'POST' || req.url !== '/webhook') {
77
+ res.writeHead(404);
78
+ res.end('Not Found');
79
+ return;
80
+ }
81
+ let body = '';
82
+ req.on('data', (chunk) => {
83
+ body += chunk.toString();
84
+ });
85
+ req.on('end', () => {
86
+ try {
87
+ const event = JSON.parse(body);
88
+ // Verify webhook signature if enabled
89
+ const signatureValid = this.verifyWebhookSignature(req, body);
90
+ if (!signatureValid) {
91
+ console.log(chalk_1.default.red('⚠️'), 'Webhook signature verification failed');
92
+ res.writeHead(401, { 'Content-Type': 'application/json' });
93
+ res.end(JSON.stringify({ error: 'Invalid signature' }));
94
+ return;
95
+ }
96
+ // Log the webhook event
97
+ this.logWebhookEvent(event);
98
+ res.writeHead(200, { 'Content-Type': 'application/json' });
99
+ res.end(JSON.stringify({ success: true }));
100
+ }
101
+ catch (error) {
102
+ console.error(chalk_1.default.red('✗'), 'Failed to process webhook:', error.message);
103
+ res.writeHead(400, { 'Content-Type': 'application/json' });
104
+ res.end(JSON.stringify({ error: 'Invalid JSON' }));
105
+ }
106
+ });
107
+ }
108
+ logWebhookEvent(event) {
109
+ const timestamp = new Date().toLocaleTimeString();
110
+ const eventType = event.data?.type || 'unknown';
111
+ const eventId = event.data?.id || 'unknown';
112
+ console.log('');
113
+ console.log(chalk_1.default.gray('────────────────────────────────────────────────────────────'));
114
+ console.log(chalk_1.default.blue(`[${timestamp}]`), chalk_1.default.bold(eventType.toUpperCase()));
115
+ if (eventType === 'payment') {
116
+ const amount = event.data.attributes.amount;
117
+ const status = event.data.attributes.status;
118
+ console.log(chalk_1.default.gray('└─'), `Amount: ₱${(amount / 100).toFixed(2)}`);
119
+ console.log(chalk_1.default.gray('└─'), `Status: ${status}`);
120
+ console.log(chalk_1.default.gray('└─'), `Payment ID: ${eventId}`);
121
+ }
122
+ console.log(chalk_1.default.gray('└─'), `View: https://dashboard.paymongo.com/${eventType === 'payment' ? 'payments' : 'webhooks'}/${eventId}`);
123
+ }
124
+ verifyWebhookSignature(req, body) {
125
+ // Check if signature verification is enabled in config
126
+ if (!this.config.dev.verifyWebhookSignatures) {
127
+ console.log(chalk_1.default.yellow('ℹ️'), 'Webhook signature verification disabled in config');
128
+ return true; // Allow all requests when verification is disabled
129
+ }
130
+ const signatureHeader = req.headers['paymongo-signature'];
131
+ if (!signatureHeader) {
132
+ console.log(chalk_1.default.red('⚠️'), 'Signature verification required but no signature header found');
133
+ return false;
134
+ }
135
+ // Parse signature header: t=<timestamp>,te=<signature>,li=
136
+ const signatureParts = signatureHeader.split(',');
137
+ if (signatureParts.length < 2) {
138
+ console.log(chalk_1.default.red('⚠️'), 'Invalid signature format');
139
+ return false;
140
+ }
141
+ const timestamp = signatureParts.find((part) => part.startsWith('t='))?.split('=')[1];
142
+ const signature = signatureParts.find((part) => part.startsWith('te='))?.split('=')[1];
143
+ if (!timestamp || !signature) {
144
+ console.log(chalk_1.default.red('⚠️'), 'Missing timestamp or signature in header');
145
+ return false;
146
+ }
147
+ // For now, look for any webhook secret in config
148
+ // TODO: In production, this should be more sophisticated - match webhook URL or ID
149
+ const webhookSecrets = this.config.webhookSecrets || {};
150
+ const secretKeys = Object.values(webhookSecrets);
151
+ if (secretKeys.length === 0) {
152
+ console.log(chalk_1.default.yellow('⚠️'), 'Signature verification enabled but no webhook secrets configured');
153
+ return true; // Allow requests when no secrets are configured yet
154
+ }
155
+ // Try to verify with each available secret
156
+ let isValid = false;
157
+ for (const secret of secretKeys) {
158
+ try {
159
+ const expectedSignature = crypto
160
+ .createHmac('sha256', secret)
161
+ .update(`${timestamp}.${body}`)
162
+ .digest('hex');
163
+ if (crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expectedSignature, 'hex'))) {
164
+ isValid = true;
165
+ break;
166
+ }
167
+ }
168
+ catch (error) {
169
+ // Continue trying other secrets
170
+ continue;
171
+ }
172
+ }
173
+ if (isValid) {
174
+ console.log(chalk_1.default.green('✓'), 'Signature verified successfully');
175
+ return true;
176
+ }
177
+ else {
178
+ console.log(chalk_1.default.red('✗'), 'Signature verification failed');
179
+ return false;
180
+ }
181
+ }
182
+ }
183
+ const command = new commander_1.Command('dev');
184
+ command
185
+ .description('Start local development server')
186
+ .option('-p, --port <port>', 'Port to run the webhook server on', '3000')
187
+ .option('--no-register', 'Skip automatic webhook registration')
188
+ .option('-e, --events <events>', 'Comma-separated events to listen for', 'payment.paid,payment.failed')
189
+ .option('--ngrok-token <token>', 'ngrok authtoken (if not set in environment)')
190
+ .action(async (options) => {
191
+ const spinner = new spinner_1.default();
192
+ const configManager = new manager_1.default();
193
+ let tunnel;
194
+ try {
195
+ // Load configuration
196
+ spinner.start('Loading configuration...');
197
+ const config = await configManager.load();
198
+ if (!config) {
199
+ spinner.fail('No configuration found');
200
+ console.log(chalk_1.default.yellow('No PayMongo configuration found.'));
201
+ console.log(chalk_1.default.gray("Run 'paymongo init' to set up your project first."));
202
+ return;
203
+ }
204
+ spinner.succeed('Configuration loaded');
205
+ // Start ngrok tunnel
206
+ spinner.start('Creating tunnel...');
207
+ const port = parseInt(options.port || '3000');
208
+ // Lazy load ngrok to reduce startup time
209
+ const { default: ngrok } = await Promise.resolve().then(() => __importStar(require('@ngrok/ngrok')));
210
+ const tunnelUrl = await (0, errors_1.withRetry)(async () => {
211
+ try {
212
+ // Try to get authtoken from command line option or environment
213
+ const authtoken = options.ngrokToken || process.env.NGROK_AUTHTOKEN;
214
+ if (!authtoken) {
215
+ throw new Error('ngrok authtoken not found. Please either:\n' +
216
+ ' 1. Set NGROK_AUTHTOKEN environment variable, or\n' +
217
+ ' 2. Use --ngrok-token option: paymongo dev --ngrok-token YOUR_TOKEN\n' +
218
+ ' Get your token from: https://dashboard.ngrok.com/get-started/your-authtoken');
219
+ }
220
+ tunnel = await ngrok.forward({
221
+ addr: port,
222
+ authtoken: authtoken,
223
+ });
224
+ return tunnel.url();
225
+ }
226
+ catch (error) {
227
+ console.log(chalk_1.default.yellow('Debug: ngrok error details:'), error.message);
228
+ throw error;
229
+ }
230
+ }, {
231
+ maxRetries: 3,
232
+ delayMs: 2000,
233
+ retryCondition: (error) => {
234
+ // Retry on network errors and common ngrok issues
235
+ return (error.message.includes('connection') ||
236
+ error.message.includes('timeout') ||
237
+ error.message.includes('tunnel') ||
238
+ error.message.includes('ngrok') ||
239
+ error.message.includes('authtoken'));
240
+ },
241
+ });
242
+ spinner.succeed('Tunnel created');
243
+ // Start webhook server
244
+ const devServer = new DevServer(port, config);
245
+ await devServer.start();
246
+ // Register webhook (unless disabled)
247
+ let webhookId;
248
+ if (!options.noRegister) {
249
+ spinner.start('Registering webhook...');
250
+ const events = (options.events || 'payment.paid,payment.failed').split(',');
251
+ const webhookUrl = `${tunnelUrl}/webhook`;
252
+ try {
253
+ const webhook = await new client_1.default({ config }).createWebhook(webhookUrl, events);
254
+ webhookId = webhook.id;
255
+ // Store webhook secret if available
256
+ if (webhook.attributes?.secret) {
257
+ config.webhookSecrets = config.webhookSecrets || {};
258
+ config.webhookSecrets[webhook.id] = webhook.attributes.secret;
259
+ await configManager.save(config);
260
+ spinner.succeed(`Webhook registered: ${webhookId} (with signature verification)`);
261
+ }
262
+ else {
263
+ spinner.succeed(`Webhook registered: ${webhookId}`);
264
+ }
265
+ }
266
+ catch (error) {
267
+ const err = error;
268
+ spinner.warn('Webhook registration failed - server will start without webhook');
269
+ console.log(chalk_1.default.yellow('⚠️'), 'Webhook registration failed:', err.message);
270
+ console.log('');
271
+ console.log(chalk_1.default.blue('ℹ️'), 'You can still test webhooks manually:');
272
+ console.log(chalk_1.default.gray(` Webhook URL: ${webhookUrl}`));
273
+ console.log(chalk_1.default.gray(' Copy this URL to your PayMongo dashboard'));
274
+ console.log('');
275
+ if (err.message.includes('API key') || err.message.includes('unauthorized')) {
276
+ console.log(chalk_1.default.yellow('💡 To fix webhook registration:'));
277
+ console.log(chalk_1.default.gray(' 1. Run "paymongo login" to update your API keys'));
278
+ console.log(chalk_1.default.gray(' 2. Restart the development server'));
279
+ }
280
+ }
281
+ }
282
+ // Display status
283
+ console.log('\n' + chalk_1.default.green('🚀 PayMongo Development Server'));
284
+ console.log('');
285
+ console.log(chalk_1.default.green('✓'), `Tunnel: ${tunnelUrl}`);
286
+ if (webhookId) {
287
+ console.log(chalk_1.default.green('✓'), `Webhook: ${webhookId}`);
288
+ }
289
+ console.log(chalk_1.default.green('✓'), `Server: http://localhost:${port}/webhook`);
290
+ console.log('');
291
+ console.log(chalk_1.default.bold('Forwarding:'), `${tunnelUrl} → http://localhost:${port}`);
292
+ console.log('');
293
+ console.log(chalk_1.default.bold('Events:'), (options.events || 'payment.paid,payment.failed').split(',').join(', '));
294
+ console.log('');
295
+ console.log(chalk_1.default.gray('Press Ctrl+C to stop'));
296
+ // Handle cleanup on exit
297
+ const cleanup = async () => {
298
+ console.log('\n' + chalk_1.default.yellow('Shutting down...'));
299
+ try {
300
+ // Disconnect ngrok
301
+ if (tunnel) {
302
+ await tunnel.close();
303
+ console.log(chalk_1.default.yellow('✓'), 'Tunnel closed');
304
+ }
305
+ // Stop server
306
+ await devServer.stop();
307
+ // Delete webhook
308
+ if (webhookId) {
309
+ spinner.start('Cleaning up webhook...');
310
+ await new client_1.default({ config }).deleteWebhook(webhookId);
311
+ spinner.succeed('Webhook deleted');
312
+ }
313
+ }
314
+ catch (error) {
315
+ console.error(chalk_1.default.red('Error during cleanup:'), error.message);
316
+ console.log(chalk_1.default.yellow('⚠️'), 'Some cleanup tasks may not have completed');
317
+ }
318
+ process.exit(0);
319
+ };
320
+ process.on('SIGINT', cleanup);
321
+ process.on('SIGTERM', cleanup);
322
+ // Keep the process running
323
+ await new Promise(() => { }); // Never resolves
324
+ }
325
+ catch (error) {
326
+ spinner.stop();
327
+ const err = error;
328
+ // Provide actionable error messages based on error type
329
+ if (err.message.includes('ngrok') || err.message.includes('tunnel')) {
330
+ console.error(chalk_1.default.red('❌ Failed to create tunnel:'), err.message);
331
+ console.log('');
332
+ console.log(chalk_1.default.yellow('💡 Troubleshooting suggestions:'));
333
+ console.log(chalk_1.default.gray('• Check your internet connection'));
334
+ console.log(chalk_1.default.gray('• Make sure ngrok is not blocked by firewall/antivirus'));
335
+ console.log(chalk_1.default.gray('• Set up ngrok authentication: export NGROK_AUTHTOKEN=your_token'));
336
+ console.log(chalk_1.default.gray('• Get your authtoken from: https://dashboard.ngrok.com/get-started/your-authtoken'));
337
+ console.log(chalk_1.default.gray('• Try a different port: paymongo dev --port 3001'));
338
+ console.log(chalk_1.default.gray('• Visit https://ngrok.com for status updates'));
339
+ }
340
+ // Cleanup on error
341
+ try {
342
+ if (tunnel) {
343
+ await tunnel.close();
344
+ }
345
+ }
346
+ catch {
347
+ // Ignore cleanup errors during shutdown
348
+ }
349
+ process.exit(1);
350
+ }
351
+ });
352
+ exports.default = command;
353
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const command: Command;
3
+ export default command;
4
+ //# sourceMappingURL=gui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui.d.ts","sourceRoot":"","sources":["../../src/commands/gui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,QAAA,MAAM,OAAO,SAoET,CAAC;AAEL,eAAe,OAAO,CAAC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const commander_1 = require("commander");
7
+ const manager_1 = require("../services/config/manager");
8
+ const client_1 = require("../services/api/client");
9
+ const server_1 = require("../services/web/server");
10
+ const service_1 = require("../services/analytics/service");
11
+ const spinner_1 = __importDefault(require("../utils/spinner"));
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const command = new commander_1.Command('gui')
14
+ .description('Start the PayMongo GUI dashboard')
15
+ .option('-p, --port <port>', 'Port to run the GUI server on', '8080')
16
+ .option('-h, --host <host>', 'Host to bind the GUI server to', 'localhost')
17
+ .action(async (options) => {
18
+ const spinner = new spinner_1.default();
19
+ const configManager = new manager_1.ConfigManager();
20
+ try {
21
+ spinner.start('Loading configuration...');
22
+ const config = await configManager.load();
23
+ if (!config) {
24
+ spinner.fail('No configuration found');
25
+ console.log(chalk_1.default.yellow('No PayMongo configuration found.'));
26
+ console.log(chalk_1.default.gray("Run 'paymongo init' to set up your project first."));
27
+ return;
28
+ }
29
+ spinner.succeed('Configuration loaded');
30
+ spinner.start('Starting GUI dashboard...');
31
+ const apiClient = new client_1.ApiClient({ config });
32
+ const analyticsService = new service_1.AnalyticsService();
33
+ const webServer = new server_1.WebServer({
34
+ port: parseInt(options.port),
35
+ host: options.host,
36
+ configManager,
37
+ apiClient,
38
+ analyticsService,
39
+ });
40
+ await webServer.start();
41
+ spinner.succeed('GUI dashboard started');
42
+ console.log('');
43
+ console.log(chalk_1.default.green('✓ PayMongo GUI Dashboard is running!'));
44
+ console.log(chalk_1.default.blue(`🌐 Open your browser to: http://${options.host}:${options.port}`));
45
+ console.log('');
46
+ console.log(chalk_1.default.gray('Features:'));
47
+ console.log(chalk_1.default.gray('• Real-time webhook monitoring'));
48
+ console.log(chalk_1.default.gray('• Configuration management'));
49
+ console.log(chalk_1.default.gray('• Webhook event history'));
50
+ console.log('');
51
+ console.log(chalk_1.default.gray('Press Ctrl+C to stop the server'));
52
+ // Handle graceful shutdown
53
+ process.on('SIGINT', async () => {
54
+ console.log('');
55
+ console.log(chalk_1.default.yellow('Shutting down GUI dashboard...'));
56
+ await webServer.stop();
57
+ process.exit(0);
58
+ });
59
+ process.on('SIGTERM', async () => {
60
+ console.log('');
61
+ console.log(chalk_1.default.yellow('Shutting down GUI dashboard...'));
62
+ await webServer.stop();
63
+ process.exit(0);
64
+ });
65
+ }
66
+ catch (error) {
67
+ spinner.stop();
68
+ const err = error;
69
+ console.error(chalk_1.default.red('❌ Failed to start GUI dashboard:'), err.message);
70
+ process.exit(1);
71
+ }
72
+ });
73
+ exports.default = command;
74
+ //# sourceMappingURL=gui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui.js","sourceRoot":"","sources":["../../src/commands/gui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const command: Command;
3
+ export default command;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,QAAA,MAAM,OAAO,SAAsB,CAAC;AA+OpC,eAAe,OAAO,CAAC"}