paymongo-cli 1.1.0 → 1.4.1
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/.github/copilot-instructions.md +95 -0
- package/.github/workflows/release.yml +15 -0
- package/AGENTS.md +418 -0
- package/CHANGELOG.md +331 -141
- package/README.md +93 -12
- package/TESTING.md +235 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +281 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +281 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +5053 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +272 -56
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dev.d.ts +13 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +269 -42
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/env.d.ts +4 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +106 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/generate.js +1184 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +33 -33
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +17 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +5 -20
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/payments.d.ts +37 -0
- package/dist/commands/payments.d.ts.map +1 -1
- package/dist/commands/payments.js +367 -32
- package/dist/commands/payments.js.map +1 -1
- package/dist/commands/team/index.d.ts.map +1 -1
- package/dist/commands/team/index.js +192 -95
- package/dist/commands/team/index.js.map +1 -1
- package/dist/commands/trigger.d.ts.map +1 -1
- package/dist/commands/trigger.js +323 -66
- package/dist/commands/trigger.js.map +1 -1
- package/dist/commands/webhooks.d.ts +19 -0
- package/dist/commands/webhooks.d.ts.map +1 -1
- package/dist/commands/webhooks.js +251 -69
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/index.js +56 -32
- package/dist/index.js.map +1 -1
- package/dist/services/analytics/service.js +6 -8
- package/dist/services/api/client.d.ts +6 -8
- package/dist/services/api/client.d.ts.map +1 -1
- package/dist/services/api/client.js +20 -131
- package/dist/services/api/client.js.map +1 -1
- package/dist/services/api/rate-limiter.d.ts +64 -0
- package/dist/services/api/rate-limiter.d.ts.map +1 -0
- package/dist/services/api/rate-limiter.js +83 -0
- package/dist/services/api/rate-limiter.js.map +1 -0
- package/dist/services/api/undici-client.d.ts +39 -0
- package/dist/services/api/undici-client.d.ts.map +1 -0
- package/dist/services/api/undici-client.js +294 -0
- package/dist/services/api/undici-client.js.map +1 -0
- package/dist/services/config/manager.js +1 -16
- package/dist/services/dev/process-manager.d.ts +50 -0
- package/dist/services/dev/process-manager.d.ts.map +1 -0
- package/dist/services/dev/process-manager.js +103 -0
- package/dist/services/dev/process-manager.js.map +1 -0
- package/dist/services/github/client.d.ts +41 -0
- package/dist/services/github/client.d.ts.map +1 -1
- package/dist/services/github/client.js +28 -0
- package/dist/services/github/client.js.map +1 -1
- package/dist/services/github/sync.js +1 -1
- package/dist/services/github/sync.js.map +1 -1
- package/dist/services/payments/simulator.d.ts +28 -0
- package/dist/services/payments/simulator.d.ts.map +1 -0
- package/dist/services/payments/simulator.js +115 -0
- package/dist/services/payments/simulator.js.map +1 -0
- package/dist/services/team/service.d.ts +44 -0
- package/dist/services/team/service.d.ts.map +1 -0
- package/dist/services/team/service.js +153 -0
- package/dist/services/team/service.js.map +1 -0
- package/dist/services/web/server.d.ts.map +1 -1
- package/dist/services/web/server.js +4 -0
- package/dist/services/web/server.js.map +1 -1
- package/dist/types/paymongo.d.ts +41 -3
- package/dist/types/paymongo.d.ts.map +1 -1
- package/dist/types/paymongo.js +0 -1
- package/dist/types/schemas.js +0 -8
- package/dist/utils/bulk.d.ts +62 -0
- package/dist/utils/bulk.d.ts.map +1 -0
- package/dist/utils/bulk.js +123 -0
- package/dist/utils/bulk.js.map +1 -0
- package/dist/utils/cache.js +4 -16
- package/dist/utils/constants.js +2 -13
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +23 -8
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +38 -25
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/spinner.js +0 -1
- package/dist/utils/validator.js +1 -4
- package/dist/utils/validator.js.map +1 -1
- package/dist/utils/webhook-store.d.ts +22 -0
- package/dist/utils/webhook-store.d.ts.map +1 -0
- package/dist/utils/webhook-store.js +57 -0
- package/dist/utils/webhook-store.js.map +1 -0
- package/eslint.config.ts +29 -2
- package/package.json +74 -76
- package/web/index.html +0 -688
package/dist/types/schemas.js
CHANGED
|
@@ -1,27 +1,22 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
// API Keys schema
|
|
3
2
|
const ApiKeysSchema = z.object({
|
|
4
3
|
public: z.string().min(1, 'Public key is required'),
|
|
5
4
|
secret: z.string().min(1, 'Secret key is required'),
|
|
6
5
|
});
|
|
7
|
-
// Webhooks config schema
|
|
8
6
|
const WebhooksConfigSchema = z.object({
|
|
9
7
|
url: z.string().url('Invalid webhook URL'),
|
|
10
8
|
events: z.array(z.string()).min(1, 'At least one event is required'),
|
|
11
9
|
});
|
|
12
|
-
// Dev config schema
|
|
13
10
|
const DevConfigSchema = z.object({
|
|
14
11
|
port: z.number().int().min(1).max(65535),
|
|
15
12
|
autoRegisterWebhook: z.boolean(),
|
|
16
13
|
verifyWebhookSignatures: z.boolean(),
|
|
17
14
|
});
|
|
18
|
-
// Team config schema (optional)
|
|
19
15
|
const TeamConfigSchema = z.object({
|
|
20
16
|
githubToken: z.string().optional(),
|
|
21
17
|
repo: z.string().optional(),
|
|
22
18
|
branch: z.string().optional(),
|
|
23
19
|
}).optional();
|
|
24
|
-
// Main PayMongo config schema
|
|
25
20
|
export const PayMongoConfigSchema = z.object({
|
|
26
21
|
version: z.string().min(1, 'Version is required'),
|
|
27
22
|
projectName: z.string().min(1, 'Project name is required'),
|
|
@@ -35,7 +30,6 @@ export const PayMongoConfigSchema = z.object({
|
|
|
35
30
|
dev: DevConfigSchema,
|
|
36
31
|
team: TeamConfigSchema,
|
|
37
32
|
});
|
|
38
|
-
// Validation helper
|
|
39
33
|
export function validateConfig(config) {
|
|
40
34
|
const result = PayMongoConfigSchema.safeParse(config);
|
|
41
35
|
if (result.success) {
|
|
@@ -47,7 +41,6 @@ export function validateConfig(config) {
|
|
|
47
41
|
});
|
|
48
42
|
return { success: false, errors };
|
|
49
43
|
}
|
|
50
|
-
// Partial config validation for updates
|
|
51
44
|
export const PartialPayMongoConfigSchema = PayMongoConfigSchema.partial();
|
|
52
45
|
export function validatePartialConfig(config) {
|
|
53
46
|
const result = PartialPayMongoConfigSchema.safeParse(config);
|
|
@@ -60,4 +53,3 @@ export function validatePartialConfig(config) {
|
|
|
60
53
|
});
|
|
61
54
|
return { success: false, errors };
|
|
62
55
|
}
|
|
63
|
-
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { WebhookData, PaymentDataFull } from '../types/paymongo.js';
|
|
2
|
+
export interface BulkExportData<T = unknown> {
|
|
3
|
+
metadata: {
|
|
4
|
+
exported_at: string;
|
|
5
|
+
exported_by: string;
|
|
6
|
+
version: string;
|
|
7
|
+
environment: string;
|
|
8
|
+
};
|
|
9
|
+
data: T[];
|
|
10
|
+
}
|
|
11
|
+
export interface BulkWebhookExport extends BulkExportData {
|
|
12
|
+
data: WebhookData[];
|
|
13
|
+
}
|
|
14
|
+
export interface BulkPaymentsExport extends BulkExportData {
|
|
15
|
+
data: PaymentDataFull[];
|
|
16
|
+
}
|
|
17
|
+
export declare class BulkOperations {
|
|
18
|
+
private static readonly EXPORT_VERSION;
|
|
19
|
+
/**
|
|
20
|
+
* Export webhooks to JSON file
|
|
21
|
+
*/
|
|
22
|
+
static exportWebhooks(webhooks: WebhookData[], filename: string, environment: string): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Export payments to JSON file
|
|
25
|
+
*/
|
|
26
|
+
static exportPayments(payments: PaymentDataFull[], filename: string, environment: string): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Import webhooks from JSON file
|
|
29
|
+
*/
|
|
30
|
+
static importWebhooks(filename: string): Promise<{
|
|
31
|
+
webhooks: WebhookData[];
|
|
32
|
+
metadata: BulkExportData['metadata'];
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Import payments from JSON file
|
|
36
|
+
*/
|
|
37
|
+
static importPayments(filename: string): Promise<{
|
|
38
|
+
payments: PaymentDataFull[];
|
|
39
|
+
metadata: BulkExportData['metadata'];
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Validate imported data structure
|
|
43
|
+
*/
|
|
44
|
+
private static validateImportData;
|
|
45
|
+
/**
|
|
46
|
+
* Validate webhook data structure
|
|
47
|
+
*/
|
|
48
|
+
private static validateWebhookData;
|
|
49
|
+
/**
|
|
50
|
+
* Validate payment data structure
|
|
51
|
+
*/
|
|
52
|
+
private static validatePaymentData;
|
|
53
|
+
/**
|
|
54
|
+
* Generate default filename with timestamp
|
|
55
|
+
*/
|
|
56
|
+
static generateFilename(type: 'webhooks' | 'payments', environment: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Ensure file has .json extension
|
|
59
|
+
*/
|
|
60
|
+
static ensureJsonExtension(filename: string): string;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=bulk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../src/utils/bulk.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGpE,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,CAAC,EAAE,CAAC;CACX;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAS;IAE/C;;OAEG;WACU,cAAc,CACzB,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;IAgBlB;;OAEG;WACU,cAAc,CACzB,QAAQ,EAAE,eAAe,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;IAgBlB;;OAEG;WACU,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACrD,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;KACtC,CAAC;IAYF;;OAEG;WACU,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACrD,QAAQ,EAAE,eAAe,EAAE,CAAC;QAC5B,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;KACtC,CAAC;IAYF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAiDjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAmClC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAmClC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAKnF;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAMrD"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { PayMongoError } from './errors.js';
|
|
4
|
+
export class BulkOperations {
|
|
5
|
+
static EXPORT_VERSION = '1.0';
|
|
6
|
+
static async exportWebhooks(webhooks, filename, environment) {
|
|
7
|
+
const exportData = {
|
|
8
|
+
metadata: {
|
|
9
|
+
exported_at: new Date().toISOString(),
|
|
10
|
+
exported_by: 'paymongo-cli',
|
|
11
|
+
version: this.EXPORT_VERSION,
|
|
12
|
+
environment,
|
|
13
|
+
},
|
|
14
|
+
data: webhooks,
|
|
15
|
+
};
|
|
16
|
+
const jsonContent = JSON.stringify(exportData, null, 2);
|
|
17
|
+
await fs.writeFile(filename, jsonContent, 'utf-8');
|
|
18
|
+
return filename;
|
|
19
|
+
}
|
|
20
|
+
static async exportPayments(payments, filename, environment) {
|
|
21
|
+
const exportData = {
|
|
22
|
+
metadata: {
|
|
23
|
+
exported_at: new Date().toISOString(),
|
|
24
|
+
exported_by: 'paymongo-cli',
|
|
25
|
+
version: this.EXPORT_VERSION,
|
|
26
|
+
environment,
|
|
27
|
+
},
|
|
28
|
+
data: payments,
|
|
29
|
+
};
|
|
30
|
+
const jsonContent = JSON.stringify(exportData, null, 2);
|
|
31
|
+
await fs.writeFile(filename, jsonContent, 'utf-8');
|
|
32
|
+
return filename;
|
|
33
|
+
}
|
|
34
|
+
static async importWebhooks(filename) {
|
|
35
|
+
const content = await fs.readFile(filename, 'utf-8');
|
|
36
|
+
const data = JSON.parse(content);
|
|
37
|
+
this.validateImportData(data, 'webhooks');
|
|
38
|
+
return {
|
|
39
|
+
webhooks: data.data,
|
|
40
|
+
metadata: data.metadata,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
static async importPayments(filename) {
|
|
44
|
+
const content = await fs.readFile(filename, 'utf-8');
|
|
45
|
+
const data = JSON.parse(content);
|
|
46
|
+
this.validateImportData(data, 'payments');
|
|
47
|
+
return {
|
|
48
|
+
payments: data.data,
|
|
49
|
+
metadata: data.metadata,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
static validateImportData(data, type) {
|
|
53
|
+
if (!data || typeof data !== 'object') {
|
|
54
|
+
throw new PayMongoError('Invalid file format - not a valid JSON object', 'INVALID_FILE_FORMAT', 400);
|
|
55
|
+
}
|
|
56
|
+
const obj = data;
|
|
57
|
+
if (!obj.metadata || !obj.data || !Array.isArray(obj.data)) {
|
|
58
|
+
throw new PayMongoError('Invalid file format - missing required metadata or data fields', 'INVALID_FILE_FORMAT', 400);
|
|
59
|
+
}
|
|
60
|
+
const metadata = obj.metadata;
|
|
61
|
+
if (typeof metadata.version !== 'string') {
|
|
62
|
+
throw new PayMongoError('Invalid metadata - version must be a string', 'INVALID_FILE_FORMAT', 400);
|
|
63
|
+
}
|
|
64
|
+
if (metadata.version !== this.EXPORT_VERSION) {
|
|
65
|
+
throw new PayMongoError(`Unsupported export version: ${metadata.version}. Current version: ${this.EXPORT_VERSION}`, 'UNSUPPORTED_VERSION', 400);
|
|
66
|
+
}
|
|
67
|
+
if (obj.data.length === 0) {
|
|
68
|
+
throw new PayMongoError('No data found in export file', 'EMPTY_FILE', 400);
|
|
69
|
+
}
|
|
70
|
+
if (type === 'webhooks') {
|
|
71
|
+
this.validateWebhookData(obj.data);
|
|
72
|
+
}
|
|
73
|
+
else if (type === 'payments') {
|
|
74
|
+
this.validatePaymentData(obj.data);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
static validateWebhookData(webhooks) {
|
|
78
|
+
for (const webhook of webhooks) {
|
|
79
|
+
if (!webhook || typeof webhook !== 'object') {
|
|
80
|
+
throw new PayMongoError('Invalid webhook data - not an object', 'INVALID_WEBHOOK_DATA', 400);
|
|
81
|
+
}
|
|
82
|
+
const obj = webhook;
|
|
83
|
+
if (!obj.id || !obj.type || !obj.attributes) {
|
|
84
|
+
throw new PayMongoError('Invalid webhook data structure - missing required fields', 'INVALID_WEBHOOK_DATA', 400);
|
|
85
|
+
}
|
|
86
|
+
if (obj.type !== 'webhook') {
|
|
87
|
+
throw new PayMongoError(`Invalid webhook type: ${obj.type}`, 'INVALID_WEBHOOK_TYPE', 400);
|
|
88
|
+
}
|
|
89
|
+
const attrs = obj.attributes;
|
|
90
|
+
if (!attrs.url || !attrs.events || !Array.isArray(attrs.events)) {
|
|
91
|
+
throw new PayMongoError('Invalid webhook attributes - missing url or events', 'INVALID_WEBHOOK_ATTRIBUTES', 400);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
static validatePaymentData(payments) {
|
|
96
|
+
for (const payment of payments) {
|
|
97
|
+
if (!payment || typeof payment !== 'object') {
|
|
98
|
+
throw new PayMongoError('Invalid payment data - not an object', 'INVALID_PAYMENT_DATA', 400);
|
|
99
|
+
}
|
|
100
|
+
const obj = payment;
|
|
101
|
+
if (!obj.id || !obj.type || !obj.attributes) {
|
|
102
|
+
throw new PayMongoError('Invalid payment data structure - missing required fields', 'INVALID_PAYMENT_DATA', 400);
|
|
103
|
+
}
|
|
104
|
+
if (obj.type !== 'payment') {
|
|
105
|
+
throw new PayMongoError(`Invalid payment type: ${obj.type}`, 'INVALID_PAYMENT_TYPE', 400);
|
|
106
|
+
}
|
|
107
|
+
const attrs = obj.attributes;
|
|
108
|
+
if (typeof attrs.amount !== 'number' || !attrs.currency) {
|
|
109
|
+
throw new PayMongoError('Invalid payment attributes - missing amount or currency', 'INVALID_PAYMENT_ATTRIBUTES', 400);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
static generateFilename(type, environment) {
|
|
114
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T')[0];
|
|
115
|
+
return `${type}_${environment}_${timestamp}.json`;
|
|
116
|
+
}
|
|
117
|
+
static ensureJsonExtension(filename) {
|
|
118
|
+
if (path.extname(filename).toLowerCase() === '.json') {
|
|
119
|
+
return filename;
|
|
120
|
+
}
|
|
121
|
+
return filename + '.json';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../src/utils/bulk.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/cache.js
CHANGED
|
@@ -8,13 +8,11 @@ export class Cache {
|
|
|
8
8
|
initialized;
|
|
9
9
|
constructor(options = {}) {
|
|
10
10
|
this.options = {
|
|
11
|
-
ttl: options.ttl || 5 * 60 * 1000,
|
|
12
|
-
maxSize: options.maxSize || 10,
|
|
11
|
+
ttl: options.ttl || 5 * 60 * 1000,
|
|
12
|
+
maxSize: options.maxSize || 10,
|
|
13
13
|
};
|
|
14
|
-
// Create cache directory in user's home - use os.homedir() as primary
|
|
15
14
|
const homeDirectory = process.env.HOME || process.env.USERPROFILE || homedir();
|
|
16
15
|
this.cacheDir = path.join(homeDirectory, '.paymongo-cli', 'cache');
|
|
17
|
-
// Initialize cache directory asynchronously
|
|
18
16
|
this.initialized = this.initCacheDir();
|
|
19
17
|
}
|
|
20
18
|
async initCacheDir() {
|
|
@@ -22,7 +20,6 @@ export class Cache {
|
|
|
22
20
|
await fs.mkdir(this.cacheDir, { recursive: true });
|
|
23
21
|
}
|
|
24
22
|
catch {
|
|
25
|
-
// Directory might already exist or creation failed
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
25
|
getCacheKey(key) {
|
|
@@ -50,7 +47,7 @@ export class Cache {
|
|
|
50
47
|
const stats = await fs.stat(filePath);
|
|
51
48
|
totalSize += stats.size;
|
|
52
49
|
}
|
|
53
|
-
return totalSize / (1024 * 1024);
|
|
50
|
+
return totalSize / (1024 * 1024);
|
|
54
51
|
}
|
|
55
52
|
catch {
|
|
56
53
|
return 0;
|
|
@@ -70,27 +67,23 @@ export class Cache {
|
|
|
70
67
|
size: stats.size,
|
|
71
68
|
});
|
|
72
69
|
}
|
|
73
|
-
// Sort by modification time (oldest first)
|
|
74
70
|
files.sort((a, b) => a.mtime - b.mtime);
|
|
75
|
-
// Remove oldest files if cache is too large
|
|
76
71
|
let currentSize = await this.getCacheSize();
|
|
77
72
|
for (const file of files) {
|
|
78
73
|
if (currentSize <= this.options.maxSize * 0.8) {
|
|
79
74
|
break;
|
|
80
|
-
}
|
|
75
|
+
}
|
|
81
76
|
await fs.unlink(file.path);
|
|
82
77
|
currentSize -= file.size / (1024 * 1024);
|
|
83
78
|
}
|
|
84
79
|
}
|
|
85
80
|
catch {
|
|
86
|
-
// Ignore cleanup errors
|
|
87
81
|
}
|
|
88
82
|
}
|
|
89
83
|
async get(key) {
|
|
90
84
|
await this.initialized;
|
|
91
85
|
const cachePath = this.getCachePath(key);
|
|
92
86
|
try {
|
|
93
|
-
// Check if file exists
|
|
94
87
|
try {
|
|
95
88
|
await fs.access(cachePath);
|
|
96
89
|
}
|
|
@@ -117,14 +110,12 @@ export class Cache {
|
|
|
117
110
|
timestamp: Date.now(),
|
|
118
111
|
};
|
|
119
112
|
await fs.writeFile(cachePath, JSON.stringify(cacheData));
|
|
120
|
-
// Cleanup if cache is getting too large
|
|
121
113
|
const currentSize = await this.getCacheSize();
|
|
122
114
|
if (currentSize > this.options.maxSize) {
|
|
123
115
|
await this.cleanup();
|
|
124
116
|
}
|
|
125
117
|
}
|
|
126
118
|
catch {
|
|
127
|
-
// Ignore cache write errors
|
|
128
119
|
}
|
|
129
120
|
}
|
|
130
121
|
async clear() {
|
|
@@ -134,7 +125,6 @@ export class Cache {
|
|
|
134
125
|
await Promise.all(files.map((file) => fs.unlink(path.join(this.cacheDir, file))));
|
|
135
126
|
}
|
|
136
127
|
catch {
|
|
137
|
-
// Ignore clear errors
|
|
138
128
|
}
|
|
139
129
|
}
|
|
140
130
|
async invalidate(key) {
|
|
@@ -144,9 +134,7 @@ export class Cache {
|
|
|
144
134
|
await fs.unlink(cachePath);
|
|
145
135
|
}
|
|
146
136
|
catch {
|
|
147
|
-
// Ignore delete errors (file might not exist)
|
|
148
137
|
}
|
|
149
138
|
}
|
|
150
139
|
}
|
|
151
140
|
export default Cache;
|
|
152
|
-
//# sourceMappingURL=cache.js.map
|
package/dist/utils/constants.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
// API Constants
|
|
2
1
|
export const PAYMONGO_API_BASE = 'https://api.paymongo.com';
|
|
3
2
|
export const PAYMONGO_API_VERSION = 'v1';
|
|
4
|
-
// Webhook Events
|
|
5
3
|
export const WEBHOOK_EVENTS = [
|
|
6
4
|
'payment.paid',
|
|
7
5
|
'payment.failed',
|
|
@@ -10,24 +8,17 @@ export const WEBHOOK_EVENTS = [
|
|
|
10
8
|
'checkout_session.payment.paid',
|
|
11
9
|
'qrph.expired',
|
|
12
10
|
];
|
|
13
|
-
// Environment Constants
|
|
14
11
|
export const ENVIRONMENTS = ['test', 'live'];
|
|
15
|
-
// File Paths
|
|
16
12
|
export const CONFIG_FILE_NAME = '.paymongo';
|
|
17
13
|
export const ENV_FILE_NAME = '.env';
|
|
18
|
-
// CLI Constants
|
|
19
14
|
export const CLI_NAME = 'paymongo';
|
|
20
15
|
export const CLI_VERSION = '1.0.0';
|
|
21
|
-
|
|
22
|
-
export const REQUEST_TIMEOUT = 30000; // 30 seconds
|
|
16
|
+
export const REQUEST_TIMEOUT = 30000;
|
|
23
17
|
export const MAX_RETRIES = 3;
|
|
24
|
-
export const RETRY_DELAY = 1000;
|
|
25
|
-
// Development Constants
|
|
18
|
+
export const RETRY_DELAY = 1000;
|
|
26
19
|
export const DEFAULT_DEV_PORT = 3000;
|
|
27
20
|
export const DEFAULT_WEBHOOK_PATH = '/webhook';
|
|
28
|
-
// Logging Constants
|
|
29
21
|
export const LOG_LEVELS = ['error', 'warn', 'info', 'debug'];
|
|
30
|
-
// Error Messages
|
|
31
22
|
export const ERROR_MESSAGES = {
|
|
32
23
|
INVALID_API_KEY: 'Invalid API key format',
|
|
33
24
|
INVALID_WEBHOOK_URL: 'Invalid webhook URL. Must be HTTPS or localhost',
|
|
@@ -38,7 +29,6 @@ export const ERROR_MESSAGES = {
|
|
|
38
29
|
RATE_LIMITED: 'Rate limited. Please try again later',
|
|
39
30
|
SERVER_ERROR: 'Server error. Please try again later',
|
|
40
31
|
};
|
|
41
|
-
// Success Messages
|
|
42
32
|
export const SUCCESS_MESSAGES = {
|
|
43
33
|
CONFIG_SAVED: 'Configuration saved successfully',
|
|
44
34
|
WEBHOOK_CREATED: 'Webhook created successfully',
|
|
@@ -46,4 +36,3 @@ export const SUCCESS_MESSAGES = {
|
|
|
46
36
|
LOGIN_SUCCESSFUL: 'Login successful',
|
|
47
37
|
DEV_SERVER_STARTED: 'Development server started',
|
|
48
38
|
};
|
|
49
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAYA,qBAAa,aAAc,SAAQ,KAAK;IAG7B,IAAI,CAAC,EAAE,MAAM;IACb,UAAU,CAAC,EAAE,MAAM;gBAF1B,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,UAAU,CAAC,EAAE,MAAM,YAAA;CAK7B;AAED,qBAAa,WAAY,SAAQ,KAAK;IAG3B,UAAU,CAAC,EAAE,MAAM;gBAD1B,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA;CAK7B;AAED,qBAAa,WAAY,SAAQ,KAAK;IAG3B,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ;gBADpC,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,YAAA;CAKvC;AAED,qBAAa,YAAa,SAAQ,KAAK;IAG5B,aAAa,CAAC,EAAE,KAAK;gBAD5B,OAAO,EAAE,MAAM,EACR,aAAa,CAAC,EAAE,KAAK,YAAA;CAK/B;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAG/B,KAAK,CAAC,EAAE,MAAM;gBADrB,OAAO,EAAE,MAAM,EACR,KAAK,CAAC,EAAE,MAAM,YAAA;CAKxB;AAED,qBAAa,YAAa,SAAQ,KAAK;IAG5B,SAAS,CAAC,EAAE,MAAM;gBADzB,OAAO,EAAE,MAAM,EACR,SAAS,CAAC,EAAE,MAAM,YAAA;CAK5B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CA8CZ"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
let retryLogger;
|
|
2
|
+
async function getRetryLogger() {
|
|
3
|
+
if (!retryLogger) {
|
|
4
|
+
const module = await import('./logger.js');
|
|
5
|
+
retryLogger = new module.default({ level: 'info' });
|
|
6
|
+
}
|
|
7
|
+
return retryLogger;
|
|
8
|
+
}
|
|
1
9
|
export class PayMongoError extends Error {
|
|
2
10
|
code;
|
|
3
11
|
statusCode;
|
|
@@ -50,12 +58,14 @@ export class WebhookError extends Error {
|
|
|
50
58
|
}
|
|
51
59
|
export async function withRetry(operation, options = {}) {
|
|
52
60
|
const { maxRetries = 3, delayMs = 1000, backoffMultiplier = 2, silent = false, retryCondition = (error) => {
|
|
53
|
-
|
|
54
|
-
return error.name === 'NetworkError' ||
|
|
61
|
+
return (error.name === 'NetworkError' ||
|
|
55
62
|
(error.message.includes('Network error') && !error.message.includes('401')) ||
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
error.message.includes('timeout') ||
|
|
64
|
+
error.message.includes('ECONNRESET') ||
|
|
65
|
+
(error instanceof PayMongoError &&
|
|
66
|
+
(error.code === 'RATE_LIMIT_EXCEEDED' || error.statusCode === 429)));
|
|
67
|
+
}, } = options;
|
|
68
|
+
let lastError = new Error('Operation failed');
|
|
59
69
|
let currentDelay = delayMs;
|
|
60
70
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
61
71
|
try {
|
|
@@ -67,12 +77,17 @@ export async function withRetry(operation, options = {}) {
|
|
|
67
77
|
throw lastError;
|
|
68
78
|
}
|
|
69
79
|
if (!silent) {
|
|
70
|
-
|
|
80
|
+
const logger = await getRetryLogger();
|
|
81
|
+
if (error instanceof PayMongoError && error.code === 'RATE_LIMIT_EXCEEDED') {
|
|
82
|
+
logger.info(`Rate limit reached, waiting ${currentDelay}ms before retry...`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
logger.info(`Attempt ${attempt + 1} failed, retrying in ${currentDelay}ms...`);
|
|
86
|
+
}
|
|
71
87
|
}
|
|
72
|
-
await new Promise(resolve => setTimeout(resolve, currentDelay));
|
|
88
|
+
await new Promise((resolve) => setTimeout(resolve, currentDelay));
|
|
73
89
|
currentDelay *= backoffMultiplier;
|
|
74
90
|
}
|
|
75
91
|
}
|
|
76
92
|
throw lastError;
|
|
77
93
|
}
|
|
78
|
-
//# sourceMappingURL=errors.js.map
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -4,8 +4,10 @@ export interface LoggerOptions {
|
|
|
4
4
|
}
|
|
5
5
|
type LogMeta = Error | Record<string, unknown> | string | number | boolean | undefined;
|
|
6
6
|
declare class Logger {
|
|
7
|
-
private
|
|
7
|
+
private level;
|
|
8
8
|
constructor(options?: LoggerOptions);
|
|
9
|
+
private shouldLog;
|
|
10
|
+
private formatMessage;
|
|
9
11
|
error(message: string, ...meta: LogMeta[]): void;
|
|
10
12
|
warn(message: string, ...meta: LogMeta[]): void;
|
|
11
13
|
info(message: string, ...meta: LogMeta[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvF,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAA+C;gBAEhD,OAAO,GAAE,aAAkB;IAIvC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,aAAa;IAkBrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAOhD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAO/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAO/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAQhD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG/B;AAED,eAAe,MAAM,CAAC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,40 +1,54 @@
|
|
|
1
|
-
import winston from 'winston';
|
|
2
1
|
import chalk from 'chalk';
|
|
3
2
|
class Logger {
|
|
4
|
-
|
|
3
|
+
level = 'info';
|
|
5
4
|
constructor(options = {}) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
this.level = options.level ?? 'info';
|
|
6
|
+
}
|
|
7
|
+
shouldLog(requestedLevel) {
|
|
8
|
+
const levels = { error: 0, warn: 1, info: 2, debug: 3 };
|
|
9
|
+
return levels[requestedLevel] <= levels[this.level];
|
|
10
|
+
}
|
|
11
|
+
formatMessage(message, meta) {
|
|
12
|
+
let output = message;
|
|
13
|
+
if (meta && meta.length > 0) {
|
|
14
|
+
meta.forEach((item) => {
|
|
15
|
+
if (item instanceof Error) {
|
|
16
|
+
output += ` ${item.message}`;
|
|
17
|
+
}
|
|
18
|
+
else if (typeof item === 'object') {
|
|
19
|
+
output += ` ${JSON.stringify(item)}`;
|
|
20
|
+
}
|
|
21
|
+
else if (item !== undefined) {
|
|
22
|
+
output += ` ${String(item)}`;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
19
25
|
}
|
|
20
|
-
|
|
21
|
-
level,
|
|
22
|
-
transports,
|
|
23
|
-
});
|
|
26
|
+
return output;
|
|
24
27
|
}
|
|
25
28
|
error(message, ...meta) {
|
|
26
|
-
this.
|
|
29
|
+
if (this.shouldLog('error')) {
|
|
30
|
+
const formatted = this.formatMessage(message, meta);
|
|
31
|
+
console.error(chalk.red('ERROR:'), formatted);
|
|
32
|
+
}
|
|
27
33
|
}
|
|
28
34
|
warn(message, ...meta) {
|
|
29
|
-
this.
|
|
35
|
+
if (this.shouldLog('warn')) {
|
|
36
|
+
const formatted = this.formatMessage(message, meta);
|
|
37
|
+
console.warn(chalk.yellow('WARN:'), formatted);
|
|
38
|
+
}
|
|
30
39
|
}
|
|
31
40
|
info(message, ...meta) {
|
|
32
|
-
this.
|
|
41
|
+
if (this.shouldLog('info')) {
|
|
42
|
+
const formatted = this.formatMessage(message, meta);
|
|
43
|
+
console.info(chalk.blue('INFO:'), formatted);
|
|
44
|
+
}
|
|
33
45
|
}
|
|
34
46
|
debug(message, ...meta) {
|
|
35
|
-
this.
|
|
47
|
+
if (this.shouldLog('debug')) {
|
|
48
|
+
const formatted = this.formatMessage(message, meta);
|
|
49
|
+
console.debug(chalk.gray('DEBUG:'), formatted);
|
|
50
|
+
}
|
|
36
51
|
}
|
|
37
|
-
// Convenience methods with chalk colors
|
|
38
52
|
success(message) {
|
|
39
53
|
console.log(chalk.green('✓'), message);
|
|
40
54
|
}
|
|
@@ -46,4 +60,3 @@ class Logger {
|
|
|
46
60
|
}
|
|
47
61
|
}
|
|
48
62
|
export default Logger;
|
|
49
|
-
//# sourceMappingURL=logger.js.map
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,MAAM;IACF,KAAK,GAAwC,MAAM,CAAC;IAE5D,YAAY,UAAyB,EAAE;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IACvC,CAAC;IAEO,SAAS,CAAC,cAAmD;QACnE,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACxD,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAEO,aAAa,CAAC,OAAe,EAAE,IAAgB;QACrD,IAAI,MAAM,GAAG,OAAO,CAAC;QAErB,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACpB,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;oBAC1B,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/B,CAAC;qBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpC,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,CAAC;qBAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,eAAe,MAAM,CAAC"}
|
package/dist/utils/spinner.js
CHANGED
package/dist/utils/validator.js
CHANGED
|
@@ -10,8 +10,6 @@ export function validateApiKey(key, type) {
|
|
|
10
10
|
if (!key || typeof key !== 'string') {
|
|
11
11
|
return false;
|
|
12
12
|
}
|
|
13
|
-
// PayMongo API keys follow the format: pk_{env}_XXXXXXXXXXXXXXXXXX
|
|
14
|
-
// where env is 'test' or 'live', and X is alphanumeric characters
|
|
15
13
|
const prefix = type === 'public' ? 'pk_' : 'sk_';
|
|
16
14
|
const pattern = new RegExp(`^${prefix}(test|live)_[a-zA-Z0-9]{20,}$`);
|
|
17
15
|
return pattern.test(key);
|
|
@@ -34,7 +32,7 @@ export function validateConfig(config) {
|
|
|
34
32
|
if (!config.version) {
|
|
35
33
|
throw new ValidationError('Config version is required', 'version');
|
|
36
34
|
}
|
|
37
|
-
if (!['test', 'live'].includes(config.environment)) {
|
|
35
|
+
if (!config.environment || !['test', 'live'].includes(config.environment)) {
|
|
38
36
|
throw new ValidationError('Environment must be either "test" or "live"', 'environment');
|
|
39
37
|
}
|
|
40
38
|
const env = config.environment;
|
|
@@ -69,4 +67,3 @@ export function validateEventTypes(events) {
|
|
|
69
67
|
throw new ValidationError(`Invalid event types: ${invalidEvents.join(', ')}`);
|
|
70
68
|
}
|
|
71
69
|
}
|
|
72
|
-
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAG/B;IAFT,YACE,OAAe,EACR,KAAc;QAErB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,UAAK,GAAL,KAAK,CAAS;QAGrB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,IAAyB;IACnE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mEAAmE;IACnE,kEAAkE;IAClE,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,+BAA+B,CAAC,CAAC;IAEtE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CACL,SAAS,CAAC,QAAQ,KAAK,QAAQ;YAC/B,SAAS,CAAC,QAAQ,KAAK,WAAW;YAClC,SAAS,CAAC,QAAQ,KAAK,WAAW,CACnC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC5D,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
|