paymongo-cli 1.2.0 → 1.4.2

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 (116) hide show
  1. package/.github/copilot-instructions.md +95 -0
  2. package/.github/workflows/ci-cd.yml +2 -46
  3. package/.github/workflows/ci.yml +1 -1
  4. package/.github/workflows/release.yml +16 -1
  5. package/AGENTS.md +418 -0
  6. package/CHANGELOG.md +331 -185
  7. package/README.md +94 -13
  8. package/TESTING.md +222 -0
  9. package/coverage/base.css +224 -0
  10. package/coverage/block-navigation.js +87 -0
  11. package/coverage/favicon.png +0 -0
  12. package/coverage/index.html +281 -0
  13. package/coverage/lcov-report/base.css +224 -0
  14. package/coverage/lcov-report/block-navigation.js +87 -0
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +281 -0
  17. package/coverage/lcov-report/prettify.css +1 -0
  18. package/coverage/lcov-report/prettify.js +2 -0
  19. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  20. package/coverage/lcov-report/sorter.js +210 -0
  21. package/coverage/lcov.info +5053 -0
  22. package/coverage/prettify.css +1 -0
  23. package/coverage/prettify.js +2 -0
  24. package/coverage/sort-arrow-sprite.png +0 -0
  25. package/coverage/sorter.js +210 -0
  26. package/dist/.tsbuildinfo +1 -1
  27. package/dist/commands/config.d.ts +17 -0
  28. package/dist/commands/config.d.ts.map +1 -1
  29. package/dist/commands/config.js +268 -55
  30. package/dist/commands/config.js.map +1 -1
  31. package/dist/commands/dev.d.ts +13 -1
  32. package/dist/commands/dev.d.ts.map +1 -1
  33. package/dist/commands/dev.js +40 -56
  34. package/dist/commands/dev.js.map +1 -1
  35. package/dist/commands/env.d.ts +4 -0
  36. package/dist/commands/env.d.ts.map +1 -0
  37. package/dist/commands/env.js +106 -0
  38. package/dist/commands/env.js.map +1 -0
  39. package/dist/commands/generate.js +1184 -0
  40. package/dist/commands/init.d.ts +11 -0
  41. package/dist/commands/init.d.ts.map +1 -1
  42. package/dist/commands/init.js +33 -33
  43. package/dist/commands/init.js.map +1 -1
  44. package/dist/commands/login.d.ts +17 -1
  45. package/dist/commands/login.d.ts.map +1 -1
  46. package/dist/commands/login.js +2 -17
  47. package/dist/commands/login.js.map +1 -1
  48. package/dist/commands/payments.d.ts +37 -0
  49. package/dist/commands/payments.d.ts.map +1 -1
  50. package/dist/commands/payments.js +367 -32
  51. package/dist/commands/payments.js.map +1 -1
  52. package/dist/commands/team/index.d.ts.map +1 -1
  53. package/dist/commands/team/index.js +192 -95
  54. package/dist/commands/team/index.js.map +1 -1
  55. package/dist/commands/trigger.d.ts.map +1 -1
  56. package/dist/commands/trigger.js +239 -75
  57. package/dist/commands/trigger.js.map +1 -1
  58. package/dist/commands/webhooks.d.ts +19 -0
  59. package/dist/commands/webhooks.d.ts.map +1 -1
  60. package/dist/commands/webhooks.js +246 -70
  61. package/dist/commands/webhooks.js.map +1 -1
  62. package/dist/index.js +56 -32
  63. package/dist/index.js.map +1 -1
  64. package/dist/services/analytics/service.js +6 -8
  65. package/dist/services/api/client.d.ts +6 -8
  66. package/dist/services/api/client.d.ts.map +1 -1
  67. package/dist/services/api/client.js +20 -131
  68. package/dist/services/api/client.js.map +1 -1
  69. package/dist/services/api/rate-limiter.d.ts +64 -0
  70. package/dist/services/api/rate-limiter.d.ts.map +1 -0
  71. package/dist/services/api/rate-limiter.js +83 -0
  72. package/dist/services/api/rate-limiter.js.map +1 -0
  73. package/dist/services/api/undici-client.d.ts +39 -0
  74. package/dist/services/api/undici-client.d.ts.map +1 -0
  75. package/dist/services/api/undici-client.js +294 -0
  76. package/dist/services/api/undici-client.js.map +1 -0
  77. package/dist/services/config/manager.js +1 -16
  78. package/dist/services/dev/process-manager.js +0 -32
  79. package/dist/services/github/client.d.ts +41 -0
  80. package/dist/services/github/client.d.ts.map +1 -1
  81. package/dist/services/github/client.js +28 -0
  82. package/dist/services/github/client.js.map +1 -1
  83. package/dist/services/payments/simulator.d.ts +28 -0
  84. package/dist/services/payments/simulator.d.ts.map +1 -0
  85. package/dist/services/payments/simulator.js +115 -0
  86. package/dist/services/payments/simulator.js.map +1 -0
  87. package/dist/services/team/service.d.ts +44 -0
  88. package/dist/services/team/service.d.ts.map +1 -0
  89. package/dist/services/team/service.js +153 -0
  90. package/dist/services/team/service.js.map +1 -0
  91. package/dist/types/paymongo.d.ts +36 -3
  92. package/dist/types/paymongo.d.ts.map +1 -1
  93. package/dist/types/paymongo.js +0 -1
  94. package/dist/types/schemas.js +0 -8
  95. package/dist/utils/bulk.d.ts +62 -0
  96. package/dist/utils/bulk.d.ts.map +1 -0
  97. package/dist/utils/bulk.js +123 -0
  98. package/dist/utils/bulk.js.map +1 -0
  99. package/dist/utils/cache.js +4 -16
  100. package/dist/utils/constants.js +2 -13
  101. package/dist/utils/errors.d.ts.map +1 -1
  102. package/dist/utils/errors.js +22 -7
  103. package/dist/utils/errors.js.map +1 -1
  104. package/dist/utils/logger.d.ts +3 -1
  105. package/dist/utils/logger.d.ts.map +1 -1
  106. package/dist/utils/logger.js +38 -25
  107. package/dist/utils/logger.js.map +1 -1
  108. package/dist/utils/spinner.js +0 -1
  109. package/dist/utils/validator.js +0 -3
  110. package/dist/utils/webhook-store.d.ts +22 -0
  111. package/dist/utils/webhook-store.d.ts.map +1 -0
  112. package/dist/utils/webhook-store.js +57 -0
  113. package/dist/utils/webhook-store.js.map +1 -0
  114. package/package.json +75 -76
  115. package/jest.config.ts +0 -30
  116. package/web/index.html +0 -688
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator.d.ts","sourceRoot":"","sources":["../../../src/services/payments/simulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,iBAAiB,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAI5B;IAEI,2BAA2B,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IA0B5B,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,KAAK;IAIb,mBAAmB,IAAI,MAAM,EAAE;IAI/B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAK7F,qBAAqB,CACnB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;QACP,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CAsDH"}
@@ -0,0 +1,115 @@
1
+ import { PayMongoError } from '../../utils/errors.js';
2
+ export class PaymentSimulator {
3
+ defaultDelays = {
4
+ gcash: { success: 3000, failure: 1500, timeout: 45000 },
5
+ maya: { success: 2000, failure: 1000, timeout: 30000 },
6
+ grabpay: { success: 5000, failure: 2000, timeout: 60000 },
7
+ };
8
+ async simulatePaymentConfirmation(intentId, options) {
9
+ const { paymentMethod, outcome = 'success' } = options;
10
+ const delayMs = options.delayMs || this.defaultDelays[paymentMethod][outcome];
11
+ if (!this.defaultDelays[paymentMethod]) {
12
+ throw new PayMongoError(`Unsupported payment method: ${paymentMethod}`, 'INVALID_PAYMENT_METHOD', 400);
13
+ }
14
+ await this.delay(delayMs);
15
+ const paymentIntent = this.generateMockResult(intentId, paymentMethod, outcome);
16
+ return {
17
+ paymentIntent,
18
+ delayApplied: delayMs,
19
+ simulationType: `${paymentMethod}_${outcome}`,
20
+ };
21
+ }
22
+ generateMockResult(intentId, paymentMethod, outcome) {
23
+ const baseTime = Math.floor(Date.now() / 1000);
24
+ let status;
25
+ let description;
26
+ switch (outcome) {
27
+ case 'success':
28
+ status = 'succeeded';
29
+ description = `${paymentMethod.toUpperCase()} payment successful`;
30
+ break;
31
+ case 'failure':
32
+ status = 'awaiting_payment_method';
33
+ description = `${paymentMethod.toUpperCase()} payment failed`;
34
+ break;
35
+ case 'timeout':
36
+ status = 'awaiting_payment_method';
37
+ description = `${paymentMethod.toUpperCase()} payment timed out`;
38
+ break;
39
+ default:
40
+ status = 'awaiting_payment_method';
41
+ description = `${paymentMethod.toUpperCase()} payment simulation`;
42
+ }
43
+ return {
44
+ id: intentId,
45
+ type: 'payment_intent',
46
+ attributes: {
47
+ amount: 100000,
48
+ currency: 'PHP',
49
+ status,
50
+ description,
51
+ payment_method_allowed: [paymentMethod],
52
+ created_at: baseTime - 60,
53
+ updated_at: baseTime,
54
+ },
55
+ };
56
+ }
57
+ delay(ms) {
58
+ return new Promise((resolve) => setTimeout(resolve, ms));
59
+ }
60
+ getSupportedMethods() {
61
+ return Object.keys(this.defaultDelays);
62
+ }
63
+ getMethodDelays(method) {
64
+ return this.defaultDelays[method] || null;
65
+ }
66
+ generateWebhookEvents(intentId, paymentMethod, outcome) {
67
+ const events = [];
68
+ const baseTime = Math.floor(Date.now() / 1000);
69
+ if (outcome === 'success') {
70
+ events.push({
71
+ type: 'payment_intent.payment_method.attached',
72
+ attributes: {
73
+ payment_intent_id: intentId,
74
+ payment_method_type: paymentMethod,
75
+ created_at: baseTime - 30,
76
+ },
77
+ });
78
+ events.push({
79
+ type: 'payment_intent.succeeded',
80
+ attributes: {
81
+ payment_intent_id: intentId,
82
+ amount: 100000,
83
+ currency: 'PHP',
84
+ created_at: baseTime,
85
+ },
86
+ });
87
+ events.push({
88
+ type: 'payment.paid',
89
+ attributes: {
90
+ amount: 100000,
91
+ currency: 'PHP',
92
+ status: 'paid',
93
+ external_reference_number: `sim_${paymentMethod}_${Date.now()}`,
94
+ fees: 2000,
95
+ net_amount: 98000,
96
+ paid_at: baseTime,
97
+ created_at: baseTime,
98
+ updated_at: baseTime,
99
+ },
100
+ });
101
+ }
102
+ else if (outcome === 'failure') {
103
+ events.push({
104
+ type: 'payment_intent.payment_failed',
105
+ attributes: {
106
+ payment_intent_id: intentId,
107
+ failure_code: 'payment_method_declined',
108
+ failure_message: `${paymentMethod.toUpperCase()} payment was declined`,
109
+ created_at: baseTime,
110
+ },
111
+ });
112
+ }
113
+ return events;
114
+ }
115
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator.js","sourceRoot":"","sources":["../../../src/services/payments/simulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { ConfigManager } from '../config/manager.js';
2
+ export interface TeamMember {
3
+ name: string;
4
+ email?: string;
5
+ addedAt: number;
6
+ sharedKeys?: string[];
7
+ }
8
+ export interface KeyBundle {
9
+ id: string;
10
+ createdAt: number;
11
+ environments: ('test' | 'live')[];
12
+ keys: {
13
+ test?: {
14
+ public: string;
15
+ secret: string;
16
+ };
17
+ live?: {
18
+ public: string;
19
+ secret: string;
20
+ };
21
+ };
22
+ sharedWith: string[];
23
+ }
24
+ export interface TeamServiceOptions {
25
+ config: ConfigManager;
26
+ }
27
+ export declare class TeamService {
28
+ private config;
29
+ constructor(options: TeamServiceOptions);
30
+ createKeyBundle(environments?: ('test' | 'live')[]): Promise<KeyBundle>;
31
+ importKeyBundle(bundle: KeyBundle, memberName: string): Promise<void>;
32
+ listMembers(): Promise<TeamMember[]>;
33
+ getTeamInfo(): Promise<{
34
+ name: string | undefined;
35
+ memberCount: number;
36
+ sharedBundlesCount: number;
37
+ environments: string[];
38
+ }>;
39
+ serializeBundle(bundle: KeyBundle): string;
40
+ deserializeBundle(bundleJson: string): KeyBundle;
41
+ removeMember(memberName: string): Promise<void>;
42
+ renameTeam(newName: string): Promise<void>;
43
+ }
44
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/team/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAClC,IAAI,EAAE;QACJ,IAAI,CAAC,EAAE;YACL,MAAM,EAAE,MAAM,CAAC;YACf,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,IAAI,CAAC,EAAE;YACL,MAAM,EAAE,MAAM,CAAC;YACf,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,kBAAkB;IAIjC,eAAe,CAAC,YAAY,GAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAwDjF,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DrE,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAKpC,WAAW,IAAI,OAAO,CAAC;QAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IAoBF,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAY1C,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;IAe1C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAajD"}
@@ -0,0 +1,153 @@
1
+ import { PayMongoError } from '../../utils/errors.js';
2
+ import crypto from 'crypto';
3
+ export class TeamService {
4
+ config;
5
+ constructor(options) {
6
+ this.config = options.config;
7
+ }
8
+ async createKeyBundle(environments = ['test']) {
9
+ const config = await this.config.load();
10
+ if (!config) {
11
+ throw new PayMongoError('No configuration found. Run "paymongo init" first.', 'CONFIG_NOT_FOUND', 400);
12
+ }
13
+ const bundleId = crypto.randomBytes(8).toString('hex');
14
+ const bundle = {
15
+ id: bundleId,
16
+ createdAt: Date.now(),
17
+ environments: environments,
18
+ keys: {},
19
+ sharedWith: [],
20
+ };
21
+ environments.forEach((env) => {
22
+ if (config.apiKeys?.[env]) {
23
+ bundle.keys[env] = { ...config.apiKeys[env] };
24
+ }
25
+ });
26
+ if (Object.keys(bundle.keys).length === 0) {
27
+ throw new PayMongoError(`No API keys found for requested environments: ${environments.join(', ')}`, 'NO_KEYS_FOUND', 400);
28
+ }
29
+ if (!config.team) {
30
+ config.team = {};
31
+ }
32
+ if (!config.team.sharedKeyBundles) {
33
+ config.team.sharedKeyBundles = [];
34
+ }
35
+ config.team.sharedKeyBundles.push({
36
+ id: bundle.id,
37
+ createdAt: bundle.createdAt,
38
+ environments: bundle.environments,
39
+ sharedWith: bundle.sharedWith,
40
+ });
41
+ await this.config.save(config);
42
+ return bundle;
43
+ }
44
+ async importKeyBundle(bundle, memberName) {
45
+ const config = await this.config.load();
46
+ if (!config) {
47
+ throw new PayMongoError('No configuration found. Run "paymongo init" first.', 'CONFIG_NOT_FOUND', 400);
48
+ }
49
+ if (!bundle.id || !bundle.keys || !bundle.environments) {
50
+ throw new PayMongoError('Invalid key bundle format.', 'INVALID_BUNDLE', 400);
51
+ }
52
+ if (!config.team) {
53
+ config.team = {};
54
+ }
55
+ if (!config.team.members) {
56
+ config.team.members = [];
57
+ }
58
+ let member = config.team.members.find((m) => m.name === memberName);
59
+ if (!member) {
60
+ member = {
61
+ name: memberName,
62
+ addedAt: Date.now(),
63
+ sharedKeys: [],
64
+ };
65
+ config.team.members.push(member);
66
+ }
67
+ bundle.environments.forEach((env) => {
68
+ if (bundle.keys[env]) {
69
+ if (!config.apiKeys) {
70
+ config.apiKeys = {};
71
+ }
72
+ if (!config.apiKeys[env]) {
73
+ config.apiKeys[env] = bundle.keys[env];
74
+ }
75
+ else {
76
+ console.log(`⚠️ ${env.toUpperCase()} keys already exist. Use --force to overwrite.`);
77
+ }
78
+ if (member && !member.sharedKeys?.includes(env)) {
79
+ if (!member.sharedKeys) {
80
+ member.sharedKeys = [];
81
+ }
82
+ member.sharedKeys.push(env);
83
+ }
84
+ }
85
+ });
86
+ await this.config.save(config);
87
+ }
88
+ async listMembers() {
89
+ const config = await this.config.load();
90
+ return config?.team?.members || [];
91
+ }
92
+ async getTeamInfo() {
93
+ const config = await this.config.load();
94
+ const team = config?.team;
95
+ const environments = new Set();
96
+ if (config?.apiKeys?.test) {
97
+ environments.add('test');
98
+ }
99
+ if (config?.apiKeys?.live) {
100
+ environments.add('live');
101
+ }
102
+ return {
103
+ name: team?.name || undefined,
104
+ memberCount: team?.members?.length || 0,
105
+ sharedBundlesCount: team?.sharedKeyBundles?.length || 0,
106
+ environments: Array.from(environments),
107
+ };
108
+ }
109
+ serializeBundle(bundle) {
110
+ const shareableBundle = {
111
+ id: bundle.id,
112
+ createdAt: bundle.createdAt,
113
+ environments: bundle.environments,
114
+ keys: bundle.keys,
115
+ };
116
+ return JSON.stringify(shareableBundle, null, 2);
117
+ }
118
+ deserializeBundle(bundleJson) {
119
+ try {
120
+ const parsed = JSON.parse(bundleJson);
121
+ if (!parsed.id || !parsed.environments || !parsed.keys) {
122
+ throw new Error('Invalid bundle format');
123
+ }
124
+ return parsed;
125
+ }
126
+ catch (_error) {
127
+ throw new PayMongoError('Invalid key bundle JSON.', 'INVALID_JSON', 400);
128
+ }
129
+ }
130
+ async removeMember(memberName) {
131
+ const config = await this.config.load();
132
+ if (!config?.team?.members) {
133
+ throw new PayMongoError('No team members found.', 'NO_MEMBERS', 404);
134
+ }
135
+ const memberIndex = config.team.members.findIndex((m) => m.name === memberName);
136
+ if (memberIndex === -1) {
137
+ throw new PayMongoError(`Team member "${memberName}" not found.`, 'MEMBER_NOT_FOUND', 404);
138
+ }
139
+ config.team.members.splice(memberIndex, 1);
140
+ await this.config.save(config);
141
+ }
142
+ async renameTeam(newName) {
143
+ const config = await this.config.load();
144
+ if (!config) {
145
+ throw new PayMongoError('No configuration found.', 'CONFIG_NOT_FOUND', 404);
146
+ }
147
+ if (!config.team) {
148
+ config.team = {};
149
+ }
150
+ config.team.name = newName;
151
+ await this.config.save(config);
152
+ }
153
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/services/team/service.ts"],"names":[],"mappings":"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"}
@@ -27,10 +27,30 @@ export interface PayMongoConfig {
27
27
  autoRegisterWebhook: boolean;
28
28
  verifyWebhookSignatures: boolean;
29
29
  };
30
+ rateLimiting?: {
31
+ enabled: boolean;
32
+ maxRequests: number;
33
+ windowMs: number;
34
+ environmentMultiplier?: number;
35
+ endpoints?: Record<string, {
36
+ maxRequests: number;
37
+ windowMs: number;
38
+ }>;
39
+ };
30
40
  team?: {
31
- githubToken?: string;
32
- repo?: string;
33
- branch?: string;
41
+ name?: string;
42
+ members?: {
43
+ name: string;
44
+ email?: string;
45
+ addedAt: number;
46
+ sharedKeys?: string[];
47
+ }[];
48
+ sharedKeyBundles?: {
49
+ id: string;
50
+ createdAt: number;
51
+ environments: ('test' | 'live')[];
52
+ sharedWith: string[];
53
+ }[];
34
54
  };
35
55
  }
36
56
  export interface WebhookData {
@@ -155,6 +175,19 @@ export interface PaymentIntentData {
155
175
  updated_at: number;
156
176
  };
157
177
  }
178
+ export interface RefundData {
179
+ id: string;
180
+ type: 'refund';
181
+ attributes: {
182
+ amount: number;
183
+ currency: string;
184
+ reason?: 'duplicate' | 'fraudulent' | 'requested_by_customer';
185
+ status: 'pending' | 'processed' | 'failed';
186
+ payment_id: string;
187
+ created_at: number;
188
+ updated_at: number;
189
+ };
190
+ }
158
191
  export interface WebhookDataWithSecret extends WebhookData {
159
192
  attributes: WebhookData['attributes'] & {
160
193
  secret?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"paymongo.d.ts","sourceRoot":"","sources":["../../src/types/paymongo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paymongo.d.ts","sourceRoot":"","sources":["../../src/types/paymongo.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=paymongo.js.map
@@ -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
+ }