apipay 0.1.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 (133) hide show
  1. package/README.md +141 -0
  2. package/bin/dev.js +5 -0
  3. package/bin/run.js +4 -0
  4. package/dist/commands/banks/add.d.ts +7 -0
  5. package/dist/commands/banks/add.d.ts.map +1 -0
  6. package/dist/commands/banks/add.js +84 -0
  7. package/dist/commands/banks/add.js.map +1 -0
  8. package/dist/commands/banks/list.d.ts +7 -0
  9. package/dist/commands/banks/list.d.ts.map +1 -0
  10. package/dist/commands/banks/list.js +37 -0
  11. package/dist/commands/banks/list.js.map +1 -0
  12. package/dist/commands/banks/remove.d.ts +10 -0
  13. package/dist/commands/banks/remove.d.ts.map +1 -0
  14. package/dist/commands/banks/remove.js +47 -0
  15. package/dist/commands/banks/remove.js.map +1 -0
  16. package/dist/commands/banks/toggle.d.ts +10 -0
  17. package/dist/commands/banks/toggle.d.ts.map +1 -0
  18. package/dist/commands/banks/toggle.js +29 -0
  19. package/dist/commands/banks/toggle.js.map +1 -0
  20. package/dist/commands/config/get.d.ts +10 -0
  21. package/dist/commands/config/get.d.ts.map +1 -0
  22. package/dist/commands/config/get.js +50 -0
  23. package/dist/commands/config/get.js.map +1 -0
  24. package/dist/commands/config/reset.d.ts +7 -0
  25. package/dist/commands/config/reset.d.ts.map +1 -0
  26. package/dist/commands/config/reset.js +21 -0
  27. package/dist/commands/config/reset.js.map +1 -0
  28. package/dist/commands/config/set.d.ts +11 -0
  29. package/dist/commands/config/set.d.ts.map +1 -0
  30. package/dist/commands/config/set.js +25 -0
  31. package/dist/commands/config/set.js.map +1 -0
  32. package/dist/commands/init.d.ts +18 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +109 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/keys/create.d.ts +7 -0
  37. package/dist/commands/keys/create.d.ts.map +1 -0
  38. package/dist/commands/keys/create.js +68 -0
  39. package/dist/commands/keys/create.js.map +1 -0
  40. package/dist/commands/keys/list.d.ts +7 -0
  41. package/dist/commands/keys/list.d.ts.map +1 -0
  42. package/dist/commands/keys/list.js +36 -0
  43. package/dist/commands/keys/list.js.map +1 -0
  44. package/dist/commands/keys/revoke.d.ts +10 -0
  45. package/dist/commands/keys/revoke.d.ts.map +1 -0
  46. package/dist/commands/keys/revoke.js +66 -0
  47. package/dist/commands/keys/revoke.js.map +1 -0
  48. package/dist/commands/login.d.ts +17 -0
  49. package/dist/commands/login.d.ts.map +1 -0
  50. package/dist/commands/login.js +171 -0
  51. package/dist/commands/login.js.map +1 -0
  52. package/dist/commands/logout.d.ts +7 -0
  53. package/dist/commands/logout.d.ts.map +1 -0
  54. package/dist/commands/logout.js +32 -0
  55. package/dist/commands/logout.js.map +1 -0
  56. package/dist/commands/metrics/summary.d.ts +7 -0
  57. package/dist/commands/metrics/summary.d.ts.map +1 -0
  58. package/dist/commands/metrics/summary.js +38 -0
  59. package/dist/commands/metrics/summary.js.map +1 -0
  60. package/dist/commands/metrics/transactions.d.ts +13 -0
  61. package/dist/commands/metrics/transactions.d.ts.map +1 -0
  62. package/dist/commands/metrics/transactions.js +51 -0
  63. package/dist/commands/metrics/transactions.js.map +1 -0
  64. package/dist/commands/status.d.ts +7 -0
  65. package/dist/commands/status.d.ts.map +1 -0
  66. package/dist/commands/status.js +98 -0
  67. package/dist/commands/status.js.map +1 -0
  68. package/dist/commands/webhooks/add.d.ts +7 -0
  69. package/dist/commands/webhooks/add.d.ts.map +1 -0
  70. package/dist/commands/webhooks/add.js +66 -0
  71. package/dist/commands/webhooks/add.js.map +1 -0
  72. package/dist/commands/webhooks/history.d.ts +10 -0
  73. package/dist/commands/webhooks/history.d.ts.map +1 -0
  74. package/dist/commands/webhooks/history.js +42 -0
  75. package/dist/commands/webhooks/history.js.map +1 -0
  76. package/dist/commands/webhooks/list.d.ts +7 -0
  77. package/dist/commands/webhooks/list.d.ts.map +1 -0
  78. package/dist/commands/webhooks/list.js +37 -0
  79. package/dist/commands/webhooks/list.js.map +1 -0
  80. package/dist/commands/webhooks/remove.d.ts +10 -0
  81. package/dist/commands/webhooks/remove.d.ts.map +1 -0
  82. package/dist/commands/webhooks/remove.js +34 -0
  83. package/dist/commands/webhooks/remove.js.map +1 -0
  84. package/dist/commands/webhooks/resend.d.ts +10 -0
  85. package/dist/commands/webhooks/resend.d.ts.map +1 -0
  86. package/dist/commands/webhooks/resend.js +28 -0
  87. package/dist/commands/webhooks/resend.js.map +1 -0
  88. package/dist/commands/webhooks/toggle.d.ts +10 -0
  89. package/dist/commands/webhooks/toggle.d.ts.map +1 -0
  90. package/dist/commands/webhooks/toggle.js +29 -0
  91. package/dist/commands/webhooks/toggle.js.map +1 -0
  92. package/dist/commands/webhooks/update.d.ts +10 -0
  93. package/dist/commands/webhooks/update.d.ts.map +1 -0
  94. package/dist/commands/webhooks/update.js +42 -0
  95. package/dist/commands/webhooks/update.js.map +1 -0
  96. package/dist/commands/whoami.d.ts +7 -0
  97. package/dist/commands/whoami.d.ts.map +1 -0
  98. package/dist/commands/whoami.js +33 -0
  99. package/dist/commands/whoami.js.map +1 -0
  100. package/dist/index.d.ts +2 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +2 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/lib/api-client.d.ts +44 -0
  105. package/dist/lib/api-client.d.ts.map +1 -0
  106. package/dist/lib/api-client.js +177 -0
  107. package/dist/lib/api-client.js.map +1 -0
  108. package/dist/lib/base-command.d.ts +42 -0
  109. package/dist/lib/base-command.d.ts.map +1 -0
  110. package/dist/lib/base-command.js +81 -0
  111. package/dist/lib/base-command.js.map +1 -0
  112. package/dist/lib/config.d.ts +50 -0
  113. package/dist/lib/config.d.ts.map +1 -0
  114. package/dist/lib/config.js +106 -0
  115. package/dist/lib/config.js.map +1 -0
  116. package/dist/lib/constants.d.ts +44 -0
  117. package/dist/lib/constants.d.ts.map +1 -0
  118. package/dist/lib/constants.js +33 -0
  119. package/dist/lib/constants.js.map +1 -0
  120. package/dist/lib/formatters.d.ts +26 -0
  121. package/dist/lib/formatters.d.ts.map +1 -0
  122. package/dist/lib/formatters.js +96 -0
  123. package/dist/lib/formatters.js.map +1 -0
  124. package/dist/lib/prompts.d.ts +21 -0
  125. package/dist/lib/prompts.d.ts.map +1 -0
  126. package/dist/lib/prompts.js +92 -0
  127. package/dist/lib/prompts.js.map +1 -0
  128. package/dist/lib/validators.d.ts +12 -0
  129. package/dist/lib/validators.d.ts.map +1 -0
  130. package/dist/lib/validators.js +91 -0
  131. package/dist/lib/validators.js.map +1 -0
  132. package/oclif.manifest.json +1002 -0
  133. package/package.json +84 -0
@@ -0,0 +1,44 @@
1
+ /**
2
+ * CLI Constants
3
+ * Central place for all magic strings, URLs, and configuration values.
4
+ */
5
+ export declare const API_BASE_URL = "https://app.apipay.vn/v1";
6
+ export declare const DASHBOARD_URL = "https://apipay.vn";
7
+ export declare const CONFIG_DIR = "apipay";
8
+ export declare const CONFIG_FILE = "config";
9
+ export declare const SUPPORTED_BANKS: readonly [{
10
+ readonly value: "BIDV";
11
+ readonly name: "BIDV — Ngân hàng TMCP Đầu tư và Phát triển Việt Nam";
12
+ }, {
13
+ readonly value: "ACB";
14
+ readonly name: "ACB — Ngân hàng TMCP Á Châu";
15
+ }, {
16
+ readonly value: "MBB";
17
+ readonly name: "MB Bank — Ngân hàng TMCP Quân đội";
18
+ }];
19
+ export declare const WEBHOOK_TYPES: readonly [{
20
+ readonly value: "IN";
21
+ readonly name: "IN — Incoming transactions only";
22
+ }, {
23
+ readonly value: "OUT";
24
+ readonly name: "OUT — Outgoing transactions only";
25
+ }, {
26
+ readonly value: "ALL";
27
+ readonly name: "ALL — Both incoming and outgoing";
28
+ }];
29
+ export declare const SETUP_STEPS: readonly ["login", "api-key", "bank", "webhook"];
30
+ export type SetupStep = (typeof SETUP_STEPS)[number];
31
+ /** Magic link polling config */
32
+ export declare const MAGIC_LINK_POLL_INTERVAL_MS = 2000;
33
+ export declare const MAGIC_LINK_TIMEOUT_MS: number;
34
+ /** HTTP retry config */
35
+ export declare const MAX_RETRIES = 3;
36
+ export declare const RETRY_DELAY_MS = 1000;
37
+ /** Exit codes following standard conventions */
38
+ export declare const EXIT_CODES: {
39
+ readonly SUCCESS: 0;
40
+ readonly USER_ERROR: 1;
41
+ readonly API_ERROR: 2;
42
+ readonly SIGINT: 130;
43
+ };
44
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,YAAY,6BAA6B,CAAC;AACvD,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,eAAO,MAAM,eAAe;;;;;;;;;EAIlB,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;;EAIhB,CAAC;AAEX,eAAO,MAAM,WAAW,kDAAmD,CAAC;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,gCAAgC;AAChC,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,qBAAqB,QAAgB,CAAC;AAEnD,wBAAwB;AACxB,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,gDAAgD;AAChD,eAAO,MAAM,UAAU;;;;;CAKb,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CLI Constants
3
+ * Central place for all magic strings, URLs, and configuration values.
4
+ */
5
+ export const API_BASE_URL = 'https://app.apipay.vn/v1';
6
+ export const DASHBOARD_URL = 'https://apipay.vn';
7
+ export const CONFIG_DIR = 'apipay';
8
+ export const CONFIG_FILE = 'config';
9
+ export const SUPPORTED_BANKS = [
10
+ { value: 'BIDV', name: 'BIDV — Ngân hàng TMCP Đầu tư và Phát triển Việt Nam' },
11
+ { value: 'ACB', name: 'ACB — Ngân hàng TMCP Á Châu' },
12
+ { value: 'MBB', name: 'MB Bank — Ngân hàng TMCP Quân đội' },
13
+ ];
14
+ export const WEBHOOK_TYPES = [
15
+ { value: 'IN', name: 'IN — Incoming transactions only' },
16
+ { value: 'OUT', name: 'OUT — Outgoing transactions only' },
17
+ { value: 'ALL', name: 'ALL — Both incoming and outgoing' },
18
+ ];
19
+ export const SETUP_STEPS = ['login', 'api-key', 'bank', 'webhook'];
20
+ /** Magic link polling config */
21
+ export const MAGIC_LINK_POLL_INTERVAL_MS = 2000;
22
+ export const MAGIC_LINK_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
23
+ /** HTTP retry config */
24
+ export const MAX_RETRIES = 3;
25
+ export const RETRY_DELAY_MS = 1000;
26
+ /** Exit codes following standard conventions */
27
+ export const EXIT_CODES = {
28
+ SUCCESS: 0,
29
+ USER_ERROR: 1,
30
+ API_ERROR: 2,
31
+ SIGINT: 130,
32
+ };
33
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAEpC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,qDAAqD,EAAE;IAC9E,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACrD,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,mCAAmC,EAAE;CACnD,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,iCAAiC,EAAE;IACxD,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,kCAAkC,EAAE;IAC1D,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,kCAAkC,EAAE;CAClD,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAG5E,gCAAgC;AAChC,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEhE,wBAAwB;AACxB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,gDAAgD;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,GAAG;CACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Formatters for consistent CLI output.
3
+ */
4
+ /** Format a date string or Date to a human-readable local string */
5
+ export declare function formatDate(date: string | Date): string;
6
+ /** Mask a secret key: show first 8 and last 4 chars */
7
+ export declare function maskSecret(secret: string): string;
8
+ /** Status badge with color */
9
+ export declare function statusBadge(status: string): string;
10
+ /** Create a table with consistent styling */
11
+ export declare function createTable(head: string[], rows: string[][]): string;
12
+ /** Print a success message */
13
+ export declare function success(msg: string): void;
14
+ /** Print a warning message */
15
+ export declare function warn(msg: string): void;
16
+ /** Print an error message */
17
+ export declare function error(msg: string): void;
18
+ /** Print an info message */
19
+ export declare function info(msg: string): void;
20
+ /** Print a key-value pair */
21
+ export declare function kvLine(key: string, value: string): void;
22
+ /** Step indicator for wizard: [1/4] */
23
+ export declare function stepLabel(current: number, total: number, title: string): string;
24
+ /** Big header banner */
25
+ export declare function banner(): void;
26
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGtD;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBlD;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CA0BpE;AAED,8BAA8B;AAC9B,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,8BAA8B;AAC9B,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,6BAA6B;AAC7B,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,4BAA4B;AAC5B,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,6BAA6B;AAC7B,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAwB;AACxB,wBAAgB,MAAM,IAAI,IAAI,CAO7B"}
@@ -0,0 +1,96 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ /**
4
+ * Formatters for consistent CLI output.
5
+ */
6
+ /** Format a date string or Date to a human-readable local string */
7
+ export function formatDate(date) {
8
+ const d = typeof date === 'string' ? new Date(date) : date;
9
+ return d.toLocaleString();
10
+ }
11
+ /** Mask a secret key: show first 8 and last 4 chars */
12
+ export function maskSecret(secret) {
13
+ if (secret.length <= 16)
14
+ return '****';
15
+ return `${secret.slice(0, 8)}...${secret.slice(-4)}`;
16
+ }
17
+ /** Status badge with color */
18
+ export function statusBadge(status) {
19
+ const s = status.toUpperCase();
20
+ switch (s) {
21
+ case 'ACTIVE':
22
+ case 'SUCCESS':
23
+ case 'VERIFIED':
24
+ return chalk.green(`● ${s}`);
25
+ case 'PENDING':
26
+ return chalk.yellow(`◐ ${s}`);
27
+ case 'INACTIVE':
28
+ case 'FAILED':
29
+ case 'EXPIRED':
30
+ return chalk.red(`○ ${s}`);
31
+ default:
32
+ return chalk.gray(`○ ${s}`);
33
+ }
34
+ }
35
+ /** Create a table with consistent styling */
36
+ export function createTable(head, rows) {
37
+ const table = new Table({
38
+ head: head.map((h) => chalk.cyan.bold(h)),
39
+ style: { head: [], border: ['gray'] },
40
+ chars: {
41
+ top: '─',
42
+ 'top-mid': '┬',
43
+ 'top-left': '┌',
44
+ 'top-right': '┐',
45
+ bottom: '─',
46
+ 'bottom-mid': '┴',
47
+ 'bottom-left': '└',
48
+ 'bottom-right': '┘',
49
+ left: '│',
50
+ 'left-mid': '├',
51
+ mid: '─',
52
+ 'mid-mid': '┼',
53
+ right: '│',
54
+ 'right-mid': '┤',
55
+ middle: '│',
56
+ },
57
+ });
58
+ for (const row of rows) {
59
+ table.push(row);
60
+ }
61
+ return table.toString();
62
+ }
63
+ /** Print a success message */
64
+ export function success(msg) {
65
+ console.log(`${chalk.green('✓')} ${msg}`);
66
+ }
67
+ /** Print a warning message */
68
+ export function warn(msg) {
69
+ console.log(`${chalk.yellow('⚠')} ${msg}`);
70
+ }
71
+ /** Print an error message */
72
+ export function error(msg) {
73
+ console.error(`${chalk.red('✗')} ${msg}`);
74
+ }
75
+ /** Print an info message */
76
+ export function info(msg) {
77
+ console.log(`${chalk.cyan('ℹ')} ${msg}`);
78
+ }
79
+ /** Print a key-value pair */
80
+ export function kvLine(key, value) {
81
+ console.log(` ${chalk.gray(key.padEnd(16))} ${value}`);
82
+ }
83
+ /** Step indicator for wizard: [1/4] */
84
+ export function stepLabel(current, total, title) {
85
+ return `${chalk.cyan(`[${current}/${total}]`)} ${chalk.bold(title)}`;
86
+ }
87
+ /** Big header banner */
88
+ export function banner() {
89
+ console.log('');
90
+ console.log(chalk.cyan.bold(' ╔══════════════════════════════════╗'));
91
+ console.log(chalk.cyan.bold(' ║ 🚀 ApiPay CLI ║'));
92
+ console.log(chalk.cyan.bold(' ║ Payment Gateway Setup Wizard ║'));
93
+ console.log(chalk.cyan.bold(' ╚══════════════════════════════════╝'));
94
+ console.log('');
95
+ }
96
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Reusable prompt functions for consistent UX across commands.
3
+ */
4
+ export declare function promptEmail(message?: string): Promise<string>;
5
+ export declare function promptPassword(message?: string): Promise<string>;
6
+ export declare function promptApiKeyName(): Promise<string>;
7
+ export declare function promptBankSelection(): Promise<string>;
8
+ export declare function promptAccountNumber(bankShortName?: string): Promise<string>;
9
+ export declare function promptAccountName(): Promise<string>;
10
+ export declare function promptMobile(): Promise<string>;
11
+ export declare function promptOtp(): Promise<string>;
12
+ export declare function promptWebhookUrl(): Promise<string>;
13
+ export declare function promptWebhookType(): Promise<string>;
14
+ export declare function promptConfirm(message: string, defaultValue?: boolean): Promise<boolean>;
15
+ export declare function promptBankFromList(banks: Array<{
16
+ publicId: string;
17
+ bankName: string;
18
+ accountNumber: string;
19
+ status: string;
20
+ }>): Promise<string>;
21
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAYA;;GAEG;AAEH,wBAAsB,WAAW,CAAC,OAAO,SAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7E;AAED,wBAAsB,cAAc,CAAC,OAAO,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3E;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAMxD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAQ3D;AAED,wBAAsB,mBAAmB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjF;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKzD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKpD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAKjD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAQzD;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAK3F;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAYrJ"}
@@ -0,0 +1,92 @@
1
+ import { input, select, confirm, password } from '@inquirer/prompts';
2
+ import { SUPPORTED_BANKS, WEBHOOK_TYPES } from './constants.js';
3
+ import { validateAccountNumber, validateApiKeyName, validateEmail, validateOtp, validatePhoneNumber, validateRequired, validateWebhookUrl, } from './validators.js';
4
+ /**
5
+ * Reusable prompt functions for consistent UX across commands.
6
+ */
7
+ export async function promptEmail(message = 'Email address:') {
8
+ return input({
9
+ message,
10
+ validate: validateEmail,
11
+ });
12
+ }
13
+ export async function promptPassword(message = 'Password:') {
14
+ return password({
15
+ message,
16
+ validate: validateRequired('Password'),
17
+ });
18
+ }
19
+ export async function promptApiKeyName() {
20
+ return input({
21
+ message: 'API key name (for your reference):',
22
+ default: 'cli-key',
23
+ validate: validateApiKeyName,
24
+ });
25
+ }
26
+ export async function promptBankSelection() {
27
+ return select({
28
+ message: 'Select your bank:',
29
+ choices: SUPPORTED_BANKS.map((b) => ({
30
+ value: b.value,
31
+ name: b.name,
32
+ })),
33
+ });
34
+ }
35
+ export async function promptAccountNumber(bankShortName) {
36
+ return input({
37
+ message: 'Bank account number:',
38
+ validate: (val) => validateAccountNumber(val, bankShortName),
39
+ });
40
+ }
41
+ export async function promptAccountName() {
42
+ return input({
43
+ message: 'Account holder name:',
44
+ validate: validateRequired('Account holder name'),
45
+ });
46
+ }
47
+ export async function promptMobile() {
48
+ return input({
49
+ message: 'Mobile number (linked to bank):',
50
+ validate: validatePhoneNumber,
51
+ });
52
+ }
53
+ export async function promptOtp() {
54
+ return input({
55
+ message: 'Enter OTP code:',
56
+ validate: validateOtp,
57
+ });
58
+ }
59
+ export async function promptWebhookUrl() {
60
+ return input({
61
+ message: 'Webhook URL (HTTPS):',
62
+ validate: validateWebhookUrl,
63
+ });
64
+ }
65
+ export async function promptWebhookType() {
66
+ return select({
67
+ message: 'Transaction type to listen for:',
68
+ choices: WEBHOOK_TYPES.map((t) => ({
69
+ value: t.value,
70
+ name: t.name,
71
+ })),
72
+ });
73
+ }
74
+ export async function promptConfirm(message, defaultValue = false) {
75
+ return confirm({
76
+ message,
77
+ default: defaultValue,
78
+ });
79
+ }
80
+ export async function promptBankFromList(banks) {
81
+ if (banks.length === 0) {
82
+ throw new Error('No banks available. Run `apipay banks:add` first.');
83
+ }
84
+ return select({
85
+ message: 'Select a bank account:',
86
+ choices: banks.map((b) => ({
87
+ value: b.publicId,
88
+ name: `${b.bankName} — ${b.accountNumber} (${b.status})`,
89
+ })),
90
+ });
91
+ }
92
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AAEH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAO,GAAG,gBAAgB;IAC1D,OAAO,KAAK,CAAC;QACX,OAAO;QACP,QAAQ,EAAE,aAAa;KACxB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAO,GAAG,WAAW;IACxD,OAAO,QAAQ,CAAC;QACd,OAAO;QACP,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC;KACvC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,KAAK,CAAC;QACX,OAAO,EAAE,oCAAoC;QAC7C,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,kBAAkB;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,aAAsB;IAC9D,OAAO,KAAK,CAAC;QACX,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,aAAa,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,OAAO,KAAK,CAAC;QACX,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC;KAClD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,KAAK,CAAC;QACX,OAAO,EAAE,iCAAiC;QAC1C,QAAQ,EAAE,mBAAmB;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,KAAK,CAAC;QACX,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,KAAK,CAAC;QACX,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,kBAAkB;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,iCAAiC;QAC1C,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,YAAY,GAAG,KAAK;IACvE,OAAO,OAAO,CAAC;QACb,OAAO;QACP,OAAO,EAAE,YAAY;KACtB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAA2F;IAClI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,wBAAwB;QACjC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,KAAK,EAAE,CAAC,CAAC,QAAQ;YACjB,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,MAAM,GAAG;SACzD,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Input validators for CLI prompts.
3
+ * Each returns true if valid, or an error message string if invalid.
4
+ */
5
+ export declare function validateEmail(input: string): string | true;
6
+ export declare function validateAccountNumber(input: string, bankShortName?: string): string | true;
7
+ export declare function validateOtp(input: string): string | true;
8
+ export declare function validateWebhookUrl(input: string): string | true;
9
+ export declare function validatePhoneNumber(input: string): string | true;
10
+ export declare function validateRequired(fieldName: string): (input: string) => string | true;
11
+ export declare function validateApiKeyName(input: string): string | true;
12
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB1F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2B/D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQhE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,IACxC,OAAO,MAAM,KAAG,MAAM,GAAG,IAAI,CAItC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/D"}
@@ -0,0 +1,91 @@
1
+ import chalk from 'chalk';
2
+ /**
3
+ * Input validators for CLI prompts.
4
+ * Each returns true if valid, or an error message string if invalid.
5
+ */
6
+ export function validateEmail(input) {
7
+ const trimmed = input.trim();
8
+ if (!trimmed)
9
+ return 'Email is required';
10
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
11
+ if (!emailRegex.test(trimmed))
12
+ return 'Please enter a valid email address';
13
+ return true;
14
+ }
15
+ export function validateAccountNumber(input, bankShortName) {
16
+ const trimmed = input.trim();
17
+ if (!trimmed)
18
+ return 'Account number is required';
19
+ if (!/^\d+$/.test(trimmed))
20
+ return 'Account number must contain only digits';
21
+ // Bank-specific length validation
22
+ if (bankShortName === 'BIDV' && trimmed.length !== 14) {
23
+ return 'BIDV account numbers must be 14 digits';
24
+ }
25
+ if (bankShortName === 'MBB' && trimmed.length !== 13) {
26
+ return 'MB Bank account numbers must be 13 digits';
27
+ }
28
+ if (trimmed.length < 6 || trimmed.length > 20) {
29
+ return 'Account number must be between 6 and 20 digits';
30
+ }
31
+ return true;
32
+ }
33
+ export function validateOtp(input) {
34
+ const trimmed = input.trim();
35
+ if (!trimmed)
36
+ return 'OTP is required';
37
+ if (!/^\d{4,8}$/.test(trimmed))
38
+ return 'OTP must be 4-8 digits';
39
+ return true;
40
+ }
41
+ export function validateWebhookUrl(input) {
42
+ const trimmed = input.trim();
43
+ if (!trimmed)
44
+ return 'Webhook URL is required';
45
+ try {
46
+ const url = new URL(trimmed);
47
+ if (url.protocol !== 'https:' && url.protocol !== 'http:') {
48
+ return 'URL must use https:// (or http:// for local testing)';
49
+ }
50
+ // Block obvious private/internal addresses
51
+ const hostname = url.hostname.toLowerCase();
52
+ const blocked = ['localhost', '127.0.0.1', '0.0.0.0', '169.254.169.254', 'metadata.google.internal'];
53
+ if (blocked.includes(hostname)) {
54
+ return `${chalk.yellow('Warning:')} ${hostname} is a private address. Use a publicly reachable URL.`;
55
+ }
56
+ // Block private IP ranges
57
+ if (/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(hostname)) {
58
+ return `${chalk.yellow('Warning:')} Private IP addresses are not reachable from the server.`;
59
+ }
60
+ }
61
+ catch {
62
+ return 'Please enter a valid URL (e.g., https://example.com/webhook)';
63
+ }
64
+ return true;
65
+ }
66
+ export function validatePhoneNumber(input) {
67
+ const trimmed = input.trim();
68
+ if (!trimmed)
69
+ return 'Phone number is required';
70
+ // Vietnamese phone: 0xxx or +84xxx, 9-11 digits
71
+ if (!/^(\+84|0)\d{8,10}$/.test(trimmed)) {
72
+ return 'Please enter a valid Vietnamese phone number (e.g., 0912345678)';
73
+ }
74
+ return true;
75
+ }
76
+ export function validateRequired(fieldName) {
77
+ return (input) => {
78
+ if (!input.trim())
79
+ return `${fieldName} is required`;
80
+ return true;
81
+ };
82
+ }
83
+ export function validateApiKeyName(input) {
84
+ const trimmed = input.trim();
85
+ if (!trimmed)
86
+ return 'API key name is required';
87
+ if (trimmed.length > 50)
88
+ return 'Name must be 50 characters or less';
89
+ return true;
90
+ }
91
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AAEH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,mBAAmB,CAAC;IACzC,MAAM,UAAU,GAAG,4BAA4B,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,oCAAoC,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,aAAsB;IACzE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,4BAA4B,CAAC;IAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,yCAAyC,CAAC;IAE7E,kCAAkC;IAClC,IAAI,aAAa,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtD,OAAO,wCAAwC,CAAC;IAClD,CAAC;IACD,IAAI,aAAa,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACrD,OAAO,2CAA2C,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC9C,OAAO,gDAAgD,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,iBAAiB,CAAC;IACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,wBAAwB,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,yBAAyB,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC1D,OAAO,sDAAsD,CAAC;QAChE,CAAC;QAED,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;QACrG,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,QAAQ,sDAAsD,CAAC;QACvG,CAAC;QAED,0BAA0B;QAC1B,IAAI,8CAA8C,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,0DAA0D,CAAC;QAC/F,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,8DAA8D,CAAC;IACxE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,0BAA0B,CAAC;IAChD,gDAAgD;IAChD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,iEAAiE,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,CAAC,KAAa,EAAiB,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,GAAG,SAAS,cAAc,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,0BAA0B,CAAC;IAChD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,oCAAoC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC"}