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.
- package/README.md +141 -0
- package/bin/dev.js +5 -0
- package/bin/run.js +4 -0
- package/dist/commands/banks/add.d.ts +7 -0
- package/dist/commands/banks/add.d.ts.map +1 -0
- package/dist/commands/banks/add.js +84 -0
- package/dist/commands/banks/add.js.map +1 -0
- package/dist/commands/banks/list.d.ts +7 -0
- package/dist/commands/banks/list.d.ts.map +1 -0
- package/dist/commands/banks/list.js +37 -0
- package/dist/commands/banks/list.js.map +1 -0
- package/dist/commands/banks/remove.d.ts +10 -0
- package/dist/commands/banks/remove.d.ts.map +1 -0
- package/dist/commands/banks/remove.js +47 -0
- package/dist/commands/banks/remove.js.map +1 -0
- package/dist/commands/banks/toggle.d.ts +10 -0
- package/dist/commands/banks/toggle.d.ts.map +1 -0
- package/dist/commands/banks/toggle.js +29 -0
- package/dist/commands/banks/toggle.js.map +1 -0
- package/dist/commands/config/get.d.ts +10 -0
- package/dist/commands/config/get.d.ts.map +1 -0
- package/dist/commands/config/get.js +50 -0
- package/dist/commands/config/get.js.map +1 -0
- package/dist/commands/config/reset.d.ts +7 -0
- package/dist/commands/config/reset.d.ts.map +1 -0
- package/dist/commands/config/reset.js +21 -0
- package/dist/commands/config/reset.js.map +1 -0
- package/dist/commands/config/set.d.ts +11 -0
- package/dist/commands/config/set.d.ts.map +1 -0
- package/dist/commands/config/set.js +25 -0
- package/dist/commands/config/set.js.map +1 -0
- package/dist/commands/init.d.ts +18 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +109 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/keys/create.d.ts +7 -0
- package/dist/commands/keys/create.d.ts.map +1 -0
- package/dist/commands/keys/create.js +68 -0
- package/dist/commands/keys/create.js.map +1 -0
- package/dist/commands/keys/list.d.ts +7 -0
- package/dist/commands/keys/list.d.ts.map +1 -0
- package/dist/commands/keys/list.js +36 -0
- package/dist/commands/keys/list.js.map +1 -0
- package/dist/commands/keys/revoke.d.ts +10 -0
- package/dist/commands/keys/revoke.d.ts.map +1 -0
- package/dist/commands/keys/revoke.js +66 -0
- package/dist/commands/keys/revoke.js.map +1 -0
- package/dist/commands/login.d.ts +17 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +171 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +32 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/metrics/summary.d.ts +7 -0
- package/dist/commands/metrics/summary.d.ts.map +1 -0
- package/dist/commands/metrics/summary.js +38 -0
- package/dist/commands/metrics/summary.js.map +1 -0
- package/dist/commands/metrics/transactions.d.ts +13 -0
- package/dist/commands/metrics/transactions.d.ts.map +1 -0
- package/dist/commands/metrics/transactions.js +51 -0
- package/dist/commands/metrics/transactions.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +98 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/webhooks/add.d.ts +7 -0
- package/dist/commands/webhooks/add.d.ts.map +1 -0
- package/dist/commands/webhooks/add.js +66 -0
- package/dist/commands/webhooks/add.js.map +1 -0
- package/dist/commands/webhooks/history.d.ts +10 -0
- package/dist/commands/webhooks/history.d.ts.map +1 -0
- package/dist/commands/webhooks/history.js +42 -0
- package/dist/commands/webhooks/history.js.map +1 -0
- package/dist/commands/webhooks/list.d.ts +7 -0
- package/dist/commands/webhooks/list.d.ts.map +1 -0
- package/dist/commands/webhooks/list.js +37 -0
- package/dist/commands/webhooks/list.js.map +1 -0
- package/dist/commands/webhooks/remove.d.ts +10 -0
- package/dist/commands/webhooks/remove.d.ts.map +1 -0
- package/dist/commands/webhooks/remove.js +34 -0
- package/dist/commands/webhooks/remove.js.map +1 -0
- package/dist/commands/webhooks/resend.d.ts +10 -0
- package/dist/commands/webhooks/resend.d.ts.map +1 -0
- package/dist/commands/webhooks/resend.js +28 -0
- package/dist/commands/webhooks/resend.js.map +1 -0
- package/dist/commands/webhooks/toggle.d.ts +10 -0
- package/dist/commands/webhooks/toggle.d.ts.map +1 -0
- package/dist/commands/webhooks/toggle.js +29 -0
- package/dist/commands/webhooks/toggle.js.map +1 -0
- package/dist/commands/webhooks/update.d.ts +10 -0
- package/dist/commands/webhooks/update.d.ts.map +1 -0
- package/dist/commands/webhooks/update.js +42 -0
- package/dist/commands/webhooks/update.js.map +1 -0
- package/dist/commands/whoami.d.ts +7 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +33 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +44 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +177 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/base-command.d.ts +42 -0
- package/dist/lib/base-command.d.ts.map +1 -0
- package/dist/lib/base-command.js +81 -0
- package/dist/lib/base-command.js.map +1 -0
- package/dist/lib/config.d.ts +50 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +106 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +44 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +33 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/formatters.d.ts +26 -0
- package/dist/lib/formatters.d.ts.map +1 -0
- package/dist/lib/formatters.js +96 -0
- package/dist/lib/formatters.js.map +1 -0
- package/dist/lib/prompts.d.ts +21 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +92 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/validators.d.ts +12 -0
- package/dist/lib/validators.d.ts.map +1 -0
- package/dist/lib/validators.js +91 -0
- package/dist/lib/validators.js.map +1 -0
- package/oclif.manifest.json +1002 -0
- 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
package/bin/run.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|