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
package/README.md ADDED
@@ -0,0 +1,141 @@
1
+ # ApiPay CLI
2
+
3
+ The official command-line tool for [ApiPay](https://apipay.vn) — a payment gateway platform for Vietnamese banks.
4
+
5
+ ## Installation
6
+
7
+ ### Via npm (recommended)
8
+
9
+ ```bash
10
+ npm install -g apipay
11
+ ```
12
+
13
+ ### Via curl (macOS / Linux)
14
+
15
+ ```bash
16
+ curl -fsSL https://apipay.vn/install | bash
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ```bash
22
+ # Interactive setup wizard — walks you through everything
23
+ apipay init
24
+
25
+ # Or step-by-step:
26
+ apipay login # Authenticate (magic link or email/password)
27
+ apipay keys:create # Generate your API key
28
+ apipay banks:add # Connect a bank account
29
+ apipay webhooks:add # Register a webhook for notifications
30
+ ```
31
+
32
+ ## Commands
33
+
34
+ ### Authentication
35
+
36
+ | Command | Description |
37
+ |---------|-------------|
38
+ | `apipay login` | Sign in via magic link or email/password |
39
+ | `apipay logout` | Sign out and clear stored credentials |
40
+ | `apipay whoami` | Show current authenticated user |
41
+
42
+ ### API Keys
43
+
44
+ | Command | Description |
45
+ |---------|-------------|
46
+ | `apipay keys:create` | Generate a new API key |
47
+ | `apipay keys:list` | List your API keys |
48
+ | `apipay keys:revoke [ID]` | Revoke an API key |
49
+
50
+ ### Bank Accounts
51
+
52
+ | Command | Description |
53
+ |---------|-------------|
54
+ | `apipay banks:add` | Add a bank account (BIDV, ACB, MB Bank) |
55
+ | `apipay banks:list` | List connected bank accounts |
56
+ | `apipay banks:toggle <ID>` | Toggle bank active/inactive |
57
+ | `apipay banks:remove <ID>` | Remove a bank account |
58
+
59
+ ### Webhooks
60
+
61
+ | Command | Description |
62
+ |---------|-------------|
63
+ | `apipay webhooks:add` | Register a webhook endpoint |
64
+ | `apipay webhooks:list` | List registered webhooks |
65
+ | `apipay webhooks:update <ID>` | Update webhook URL or type |
66
+ | `apipay webhooks:toggle <ID>` | Toggle webhook active/inactive |
67
+ | `apipay webhooks:remove <ID>` | Remove a webhook |
68
+ | `apipay webhooks:history <ID>` | View delivery history |
69
+ | `apipay webhooks:resend <ID>` | Resend a failed delivery |
70
+
71
+ ### Metrics
72
+
73
+ | Command | Description |
74
+ |---------|-------------|
75
+ | `apipay metrics:summary` | Transaction summary by bank |
76
+ | `apipay metrics:transactions` | List recent transactions |
77
+
78
+ ### Configuration
79
+
80
+ | Command | Description |
81
+ |---------|-------------|
82
+ | `apipay status` | Show setup status and configuration |
83
+ | `apipay config:get [KEY]` | Show configuration values |
84
+ | `apipay config:set KEY VALUE` | Set a configuration value |
85
+ | `apipay config:reset` | Clear all stored data |
86
+
87
+ ## Global Flags
88
+
89
+ | Flag | Description |
90
+ |------|-------------|
91
+ | `--json` | Output raw JSON (for scripting/CI) |
92
+ | `--quiet` / `-q` | Suppress interactive output |
93
+ | `--help` / `-h` | Show command help |
94
+ | `--version` / `-v` | Show CLI version |
95
+
96
+ ## Configuration
97
+
98
+ Credentials and settings are stored in `~/.config/apipay/config.json`.
99
+
100
+ To connect to a staging API:
101
+
102
+ ```bash
103
+ apipay config:set apiBaseUrl https://staging.apipay.vn/v1
104
+ ```
105
+
106
+ ## Autocomplete
107
+
108
+ ```bash
109
+ apipay autocomplete bash # or zsh/fish
110
+ ```
111
+
112
+ ## For CI/CD Pipelines
113
+
114
+ Use non-interactive flags for automation:
115
+
116
+ ```bash
117
+ apipay login --email user@example.com --password "$APIPAY_PASSWORD"
118
+ apipay banks:list --json
119
+ apipay metrics:transactions --json --page 1 --limit 100
120
+ ```
121
+
122
+ ## Supported Banks
123
+
124
+ - **BIDV** — Ngân hàng TMCP Đầu tư và Phát triển Việt Nam
125
+ - **ACB** — Ngân hàng TMCP Á Châu
126
+ - **MB Bank** — Ngân hàng TMCP Quân đội
127
+
128
+ ## Development
129
+
130
+ ```bash
131
+ # From the monorepo root
132
+ cd cli
133
+ npm install
134
+ npm run dev -- login # Run a command in dev mode
135
+ npm run build # Compile TypeScript
136
+ npm link # Install locally for testing
137
+ ```
138
+
139
+ ## License
140
+
141
+ MIT
package/bin/dev.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Dev mode entry point — runs TypeScript directly
4
+ import { execute } from '@oclif/core';
5
+ await execute({ development: true, dir: import.meta.url });
package/bin/run.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execute } from '@oclif/core';
4
+ await execute({ dir: import.meta.url });
@@ -0,0 +1,7 @@
1
+ import { ApiKeyCommand } from '../../lib/base-command.js';
2
+ export default class BanksAdd extends ApiKeyCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/banks/add.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAW1D,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,aAAa;IACjD,OAAgB,WAAW,SAAmD;IAE9E,OAAgB,QAAQ,WAAmC;IAErD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0F3B"}
@@ -0,0 +1,84 @@
1
+ import chalk from 'chalk';
2
+ import { ApiKeyCommand } from '../../lib/base-command.js';
3
+ import { markStepComplete } from '../../lib/config.js';
4
+ import { success, info, kvLine } from '../../lib/formatters.js';
5
+ import { promptBankSelection, promptAccountNumber, promptAccountName, promptMobile, promptOtp, } from '../../lib/prompts.js';
6
+ export default class BanksAdd extends ApiKeyCommand {
7
+ static description = 'Add a bank account to your ApiPay integration';
8
+ static examples = ['<%= config.bin %> banks:add'];
9
+ async run() {
10
+ console.log('');
11
+ console.log(chalk.bold(' Add Bank Account'));
12
+ console.log(chalk.gray(' ────────────────'));
13
+ console.log('');
14
+ // Step 1: Select bank
15
+ const bankShortName = await promptBankSelection();
16
+ // Step 2: Account details
17
+ const accountNumber = await promptAccountNumber(bankShortName);
18
+ const accName = await promptAccountName();
19
+ const accMobile = await promptMobile();
20
+ // Step 3: Submit to API
21
+ this.spinner.start('Adding bank account...');
22
+ try {
23
+ const data = await this.api.post('/client/banks', {
24
+ type: 'openapi',
25
+ bankShortName,
26
+ accountNumber,
27
+ accName,
28
+ accMobile,
29
+ }, 'apikey');
30
+ const bank = data?.data ?? data;
31
+ this.spinner.succeed('Bank account submitted!');
32
+ // Check if OTP is required
33
+ if (bank?.otpType || bank?.status === 'PENDING') {
34
+ console.log('');
35
+ info(`OTP verification required. Check your phone (${accMobile}) for the code.`);
36
+ console.log('');
37
+ const otp = await promptOtp();
38
+ this.spinner.start('Confirming OTP...');
39
+ try {
40
+ const otpResult = await this.api.post('/client/banks/confirm-otp', {
41
+ type: 'openapi',
42
+ bankShortName,
43
+ accountNumber,
44
+ otp,
45
+ }, 'apikey');
46
+ const confirmed = otpResult?.data ?? otpResult;
47
+ this.spinner.succeed('Bank account verified!');
48
+ console.log('');
49
+ kvLine('Bank', bankShortName);
50
+ kvLine('Account', accountNumber);
51
+ kvLine('Name', accName);
52
+ if (confirmed?.vaNumber) {
53
+ kvLine('VA Number', chalk.cyan(confirmed.vaNumber));
54
+ }
55
+ kvLine('Status', chalk.green('ACTIVE'));
56
+ console.log('');
57
+ }
58
+ catch (error) {
59
+ this.spinner.fail('OTP verification failed');
60
+ this.handleError(error);
61
+ }
62
+ }
63
+ else {
64
+ console.log('');
65
+ kvLine('Bank', bankShortName);
66
+ kvLine('Account', accountNumber);
67
+ kvLine('Name', accName);
68
+ kvLine('Public ID', bank?.publicId ?? '—');
69
+ kvLine('Status', chalk.green(bank?.status ?? 'ACTIVE'));
70
+ console.log('');
71
+ }
72
+ markStepComplete('bank');
73
+ success('Bank account added successfully.');
74
+ if (this.jsonOutput) {
75
+ this.outputJson(bank);
76
+ }
77
+ }
78
+ catch (error) {
79
+ this.spinner.fail('Failed to add bank account');
80
+ this.handleError(error);
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/banks/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ApiKeyCommand } from '../../lib/base-command.js';
2
+ export default class BanksList extends ApiKeyCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/banks/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,aAAa;IAClD,OAAgB,WAAW,SAA6B;IAExD,OAAgB,QAAQ,WAAoC;IAEtD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoC3B"}
@@ -0,0 +1,37 @@
1
+ import chalk from 'chalk';
2
+ import { ApiKeyCommand } from '../../lib/base-command.js';
3
+ import { createTable, statusBadge } from '../../lib/formatters.js';
4
+ export default class BanksList extends ApiKeyCommand {
5
+ static description = 'List your bank accounts';
6
+ static examples = ['<%= config.bin %> banks:list'];
7
+ async run() {
8
+ this.spinner.start('Fetching bank accounts...');
9
+ try {
10
+ const data = await this.api.get('/client/banks', 'apikey');
11
+ const banks = data?.data ?? data;
12
+ this.spinner.stop();
13
+ if (!Array.isArray(banks) || banks.length === 0) {
14
+ this.log(`\n No bank accounts found. Run ${chalk.cyan('apipay banks:add')} to add one.\n`);
15
+ return;
16
+ }
17
+ console.log('');
18
+ const table = createTable(['Bank', 'Account #', 'VA Number', 'Status', 'Public ID'], banks.map((b) => [
19
+ b.bankShortName ?? b.bankName ?? '—',
20
+ b.accountNumber ?? '—',
21
+ b.vaNumber ?? '—',
22
+ statusBadge(b.status ?? 'UNKNOWN'),
23
+ b.publicId ? b.publicId.slice(0, 8) + '...' : '—',
24
+ ]));
25
+ console.log(table);
26
+ console.log(`\n ${chalk.gray(`${banks.length} bank account(s)`)}\n`);
27
+ if (this.jsonOutput) {
28
+ this.outputJson(banks);
29
+ }
30
+ }
31
+ catch (error) {
32
+ this.spinner.fail('Failed to fetch bank accounts');
33
+ this.handleError(error);
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/banks/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,aAAa;IAClD,MAAM,CAAU,WAAW,GAAG,yBAAyB,CAAC;IAExD,MAAM,CAAU,QAAQ,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5D,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;YAEjC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAEpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;gBAC5F,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,EACzD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC;gBACpB,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG;gBACpC,CAAC,CAAC,aAAa,IAAI,GAAG;gBACtB,CAAC,CAAC,QAAQ,IAAI,GAAG;gBACjB,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC;gBAClC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG;aAClD,CAAC,CACH,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAEtE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ApiKeyCommand } from '../../lib/base-command.js';
2
+ export default class BanksRemove extends ApiKeyCommand {
3
+ static description: string;
4
+ static args: {
5
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ static examples: string[];
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/banks/remove.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI1D,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,aAAa;IACpD,OAAgB,WAAW,SAA2B;IAEtD,OAAgB,IAAI;;MAElB;IAEF,OAAgB,QAAQ,WAAkD;IAEpE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA4C3B"}
@@ -0,0 +1,47 @@
1
+ import { Args } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { ApiKeyCommand } from '../../lib/base-command.js';
4
+ import { success, warn, info } from '../../lib/formatters.js';
5
+ import { promptConfirm, promptOtp } from '../../lib/prompts.js';
6
+ export default class BanksRemove extends ApiKeyCommand {
7
+ static description = 'Remove a bank account';
8
+ static args = {
9
+ id: Args.string({ description: 'Bank public ID', required: true }),
10
+ };
11
+ static examples = ['<%= config.bin %> banks:remove <public-id>'];
12
+ async run() {
13
+ const { args } = await this.parse(BanksRemove);
14
+ warn('This will permanently disconnect this bank account from ApiPay.');
15
+ const confirmed = await promptConfirm(`Remove bank ${chalk.bold(args.id.slice(0, 8))}...?`);
16
+ if (!confirmed) {
17
+ this.log('Cancelled.');
18
+ return;
19
+ }
20
+ this.spinner.start('Removing bank account...');
21
+ try {
22
+ const data = await this.api.delete(`/client/banks/${args.id}`, 'apikey');
23
+ const result = data?.data ?? data;
24
+ // Some banks require OTP confirmation for deletion
25
+ if (result?.requiresOtp || result?.otpRequired) {
26
+ this.spinner.stop();
27
+ info('OTP required to confirm deletion. Check your phone.');
28
+ const otp = await promptOtp();
29
+ this.spinner.start('Confirming deletion...');
30
+ await this.api.post(`/client/banks/${args.id}/confirm-delete`, { otp }, 'apikey');
31
+ this.spinner.succeed('Bank account removed');
32
+ }
33
+ else {
34
+ this.spinner.succeed('Bank account removed');
35
+ }
36
+ success('Bank account has been disconnected.');
37
+ if (this.jsonOutput) {
38
+ this.outputJson({ success: true, id: args.id });
39
+ }
40
+ }
41
+ catch (error) {
42
+ this.spinner.fail('Failed to remove bank account');
43
+ this.handleError(error);
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/banks/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,aAAa;IACpD,MAAM,CAAU,WAAW,GAAG,uBAAuB,CAAC;IAEtD,MAAM,CAAU,IAAI,GAAG;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACnE,CAAC;IAEF,MAAM,CAAU,QAAQ,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1E,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE/C,IAAI,CAAC,iEAAiE,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;YAElC,mDAAmD;YACnD,IAAI,MAAM,EAAE,WAAW,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;gBAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,qDAAqD,CAAC,CAAC;gBAE5D,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;gBAE9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC7C,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACjB,iBAAiB,IAAI,CAAC,EAAE,iBAAiB,EACzC,EAAE,GAAG,EAAE,EACP,QAAQ,CACT,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YAC/C,CAAC;YAED,OAAO,CAAC,qCAAqC,CAAC,CAAC;YAE/C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ApiKeyCommand } from '../../lib/base-command.js';
2
+ export default class BanksToggle extends ApiKeyCommand {
3
+ static description: string;
4
+ static args: {
5
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ static examples: string[];
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../../src/commands/banks/toggle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,aAAa;IACpD,OAAgB,WAAW,SAAuD;IAElF,OAAgB,IAAI;;MAElB;IAEF,OAAgB,QAAQ,WAAkD;IAEpE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB3B"}
@@ -0,0 +1,29 @@
1
+ import { Args } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { ApiKeyCommand } from '../../lib/base-command.js';
4
+ import { success, statusBadge } from '../../lib/formatters.js';
5
+ export default class BanksToggle extends ApiKeyCommand {
6
+ static description = 'Toggle a bank account between ACTIVE and INACTIVE';
7
+ static args = {
8
+ id: Args.string({ description: 'Bank public ID', required: true }),
9
+ };
10
+ static examples = ['<%= config.bin %> banks:toggle <public-id>'];
11
+ async run() {
12
+ const { args } = await this.parse(BanksToggle);
13
+ this.spinner.start('Toggling bank status...');
14
+ try {
15
+ const data = await this.api.patch(`/client/banks/${args.id}/status`, undefined, 'apikey');
16
+ const bank = data?.data ?? data;
17
+ this.spinner.succeed('Bank status updated');
18
+ success(`Bank ${chalk.bold(args.id.slice(0, 8))}... is now ${statusBadge(bank?.status ?? 'UNKNOWN')}`);
19
+ if (this.jsonOutput) {
20
+ this.outputJson(bank);
21
+ }
22
+ }
23
+ catch (error) {
24
+ this.spinner.fail('Failed to toggle bank status');
25
+ this.handleError(error);
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.js","sourceRoot":"","sources":["../../../src/commands/banks/toggle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,aAAa;IACpD,MAAM,CAAU,WAAW,GAAG,mDAAmD,CAAC;IAElF,MAAM,CAAU,IAAI,GAAG;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACnE,CAAC;IAEF,MAAM,CAAU,QAAQ,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1E,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;YAEhC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAC5C,OAAO,CACL,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,WAAW,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC,EAAE,CAC9F,CAAC;YAEF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAClD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { BaseCommand } from '../../lib/base-command.js';
2
+ export default class ConfigGet extends BaseCommand {
3
+ static description: string;
4
+ static args: {
5
+ key: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static examples: string[];
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/config/get.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAgB,WAAW,SAAmC;IAE9D,OAAgB,IAAI;;MAElB;IAEF,OAAgB,QAAQ,WAGtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqC3B"}
@@ -0,0 +1,50 @@
1
+ import { Args } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { BaseCommand } from '../../lib/base-command.js';
4
+ import { getStore } from '../../lib/config.js';
5
+ export default class ConfigGet extends BaseCommand {
6
+ static description = 'Get a CLI configuration value';
7
+ static args = {
8
+ key: Args.string({ description: 'Config key (e.g., apiBaseUrl)', required: false }),
9
+ };
10
+ static examples = [
11
+ '<%= config.bin %> config:get apiBaseUrl',
12
+ '<%= config.bin %> config:get',
13
+ ];
14
+ async run() {
15
+ const { args } = await this.parse(ConfigGet);
16
+ const store = getStore();
17
+ if (args.key) {
18
+ const value = store.get(args.key);
19
+ if (value === undefined) {
20
+ this.error(`Key ${chalk.bold(args.key)} is not set.`, { exit: 1 });
21
+ }
22
+ if (typeof value === 'object') {
23
+ console.log(JSON.stringify(value, null, 2));
24
+ }
25
+ else {
26
+ console.log(String(value));
27
+ }
28
+ }
29
+ else {
30
+ // Print all config (mask sensitive values)
31
+ const all = store.store;
32
+ const safe = { ...all };
33
+ if (safe.auth?.accessToken) {
34
+ safe.auth = {
35
+ ...safe.auth,
36
+ accessToken: safe.auth.accessToken.slice(0, 20) + '...',
37
+ refreshToken: safe.auth.refreshToken?.slice(0, 20) + '...',
38
+ };
39
+ }
40
+ if (safe.apiKey?.secretKey) {
41
+ safe.apiKey = {
42
+ ...safe.apiKey,
43
+ secretKey: '****',
44
+ };
45
+ }
46
+ console.log(JSON.stringify(safe, null, 2));
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/config/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAU,WAAW,GAAG,+BAA+B,CAAC;IAE9D,MAAM,CAAU,IAAI,GAAG;QACrB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACpF,CAAC;IAEF,MAAM,CAAU,QAAQ,GAAG;QACzB,yCAAyC;QACzC,8BAA8B;KAC/B,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAU,CAAC,CAAC;YACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;YACxB,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAAS,CAAC;YAE/B,IAAI,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,GAAG;oBACV,GAAG,IAAI,CAAC,IAAI;oBACZ,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;oBACvD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;iBAC3D,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG;oBACZ,GAAG,IAAI,CAAC,MAAM;oBACd,SAAS,EAAE,MAAM;iBAClB,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { BaseCommand } from '../../lib/base-command.js';
2
+ export default class ConfigReset extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../../src/commands/config/reset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKxD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,OAAgB,WAAW,SAAwD;IAEnF,OAAgB,QAAQ,WAAsC;IAExD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
@@ -0,0 +1,21 @@
1
+ import chalk from 'chalk';
2
+ import { BaseCommand } from '../../lib/base-command.js';
3
+ import { resetAll } from '../../lib/config.js';
4
+ import { success, warn } from '../../lib/formatters.js';
5
+ import { promptConfirm } from '../../lib/prompts.js';
6
+ export default class ConfigReset extends BaseCommand {
7
+ static description = 'Reset all CLI configuration and stored credentials';
8
+ static examples = ['<%= config.bin %> config:reset'];
9
+ async run() {
10
+ warn('This will clear ALL stored data: tokens, API keys, and settings.');
11
+ const confirmed = await promptConfirm(`${chalk.red('Are you sure?')} Reset all ApiPay CLI configuration?`);
12
+ if (!confirmed) {
13
+ this.log('Cancelled.');
14
+ return;
15
+ }
16
+ resetAll();
17
+ success('All configuration has been reset.');
18
+ this.log(`\n Run ${chalk.cyan('apipay init')} to start fresh.\n`);
19
+ }
20
+ }
21
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../../src/commands/config/reset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,MAAM,CAAU,WAAW,GAAG,oDAAoD,CAAC;IAEnF,MAAM,CAAU,QAAQ,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9D,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAEzE,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,sCAAsC,CACpE,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACrE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { BaseCommand } from '../../lib/base-command.js';
2
+ export default class ConfigSet extends BaseCommand {
3
+ static description: string;
4
+ static args: {
5
+ key: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
+ value: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static examples: string[];
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/config/set.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAIxD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAgB,WAAW,SAAmC;IAE9D,OAAgB,IAAI;;;MAGlB;IAEF,OAAgB,QAAQ,WAEtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAc3B"}
@@ -0,0 +1,25 @@
1
+ import { Args } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { BaseCommand } from '../../lib/base-command.js';
4
+ import { getStore } from '../../lib/config.js';
5
+ import { success } from '../../lib/formatters.js';
6
+ export default class ConfigSet extends BaseCommand {
7
+ static description = 'Set a CLI configuration value';
8
+ static args = {
9
+ key: Args.string({ description: 'Config key (e.g., apiBaseUrl)', required: true }),
10
+ value: Args.string({ description: 'Config value', required: true }),
11
+ };
12
+ static examples = [
13
+ '<%= config.bin %> config:set apiBaseUrl https://staging.apipay.vn/v1',
14
+ ];
15
+ async run() {
16
+ const { args } = await this.parse(ConfigSet);
17
+ const allowedKeys = ['apiBaseUrl'];
18
+ if (!allowedKeys.includes(args.key)) {
19
+ this.error(`Unknown config key: ${chalk.bold(args.key)}. Allowed keys: ${allowedKeys.join(', ')}`, { exit: 1 });
20
+ }
21
+ getStore().set(args.key, args.value);
22
+ success(`${args.key} = ${chalk.cyan(args.value)}`);
23
+ }
24
+ }
25
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/config/set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAU,WAAW,GAAG,+BAA+B,CAAC;IAE9D,MAAM,CAAU,IAAI,GAAG;QACrB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAClF,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACpE,CAAC;IAEF,MAAM,CAAU,QAAQ,GAAG;QACzB,sEAAsE;KACvE,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,WAAW,GAAG,CAAC,YAAY,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CACR,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACtF,EAAE,IAAI,EAAE,CAAC,EAAE,CACZ,CAAC;QACJ,CAAC;QAED,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { BaseCommand } from '../lib/base-command.js';
2
+ /**
3
+ * `apipay init` — Guided setup wizard.
4
+ * Walks new users through the complete setup flow:
5
+ * 1. Login (magic link or password)
6
+ * 2. Generate API key
7
+ * 3. Add bank account
8
+ * 4. Register webhook
9
+ *
10
+ * Resumes from the last incomplete step automatically.
11
+ */
12
+ export default class Init extends BaseCommand {
13
+ static description: string;
14
+ static examples: string[];
15
+ run(): Promise<void>;
16
+ private printChecklist;
17
+ }
18
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAiBrD;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,OAAgB,WAAW,SAC2D;IAEtF,OAAgB,QAAQ,WAA8B;IAEhD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF1B,OAAO,CAAC,cAAc;CAevB"}