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,109 @@
1
+ import chalk from 'chalk';
2
+ import { BaseCommand } from '../lib/base-command.js';
3
+ import { isLoggedIn, getApiKey, getCompletedSteps, getNextIncompleteStep, } from '../lib/config.js';
4
+ import { SETUP_STEPS } from '../lib/constants.js';
5
+ import { banner, stepLabel, success, info } from '../lib/formatters.js';
6
+ // Import command runners
7
+ import Login from './login.js';
8
+ import KeysCreate from './keys/create.js';
9
+ import BanksAdd from './banks/add.js';
10
+ import WebhooksAdd from './webhooks/add.js';
11
+ /**
12
+ * `apipay init` — Guided setup wizard.
13
+ * Walks new users through the complete setup flow:
14
+ * 1. Login (magic link or password)
15
+ * 2. Generate API key
16
+ * 3. Add bank account
17
+ * 4. Register webhook
18
+ *
19
+ * Resumes from the last incomplete step automatically.
20
+ */
21
+ export default class Init extends BaseCommand {
22
+ static description = 'Set up ApiPay interactively — login, generate API key, add bank, register webhook';
23
+ static examples = ['<%= config.bin %> init'];
24
+ async run() {
25
+ banner();
26
+ const completed = getCompletedSteps();
27
+ const nextStep = getNextIncompleteStep();
28
+ if (!nextStep) {
29
+ this.printChecklist(completed);
30
+ console.log('');
31
+ success('Setup is already complete! You\'re ready to receive payments.');
32
+ console.log('');
33
+ info(`Run ${chalk.cyan('apipay status')} to see your current configuration.`);
34
+ info(`Run ${chalk.cyan('apipay --help')} to explore all commands.`);
35
+ console.log('');
36
+ return;
37
+ }
38
+ if (completed.length > 0) {
39
+ info(`Resuming setup from step ${completed.length + 1}/${SETUP_STEPS.length}...`);
40
+ this.printChecklist(completed);
41
+ console.log('');
42
+ }
43
+ const totalSteps = SETUP_STEPS.length;
44
+ // Step 1: Login
45
+ if (!completed.includes('login')) {
46
+ console.log(stepLabel(1, totalSteps, 'Authenticate with ApiPay'));
47
+ console.log(chalk.gray(' Sign in to your account or create a new one.\n'));
48
+ await Login.run([]);
49
+ console.log('');
50
+ }
51
+ // Step 2: API Key
52
+ if (!completed.includes('api-key')) {
53
+ if (!isLoggedIn()) {
54
+ this.error('Login is required before proceeding. Run `apipay login` first.', { exit: 1 });
55
+ }
56
+ console.log(stepLabel(2, totalSteps, 'Generate API Key'));
57
+ console.log(chalk.gray(' Create an API key to authenticate your integration.\n'));
58
+ await KeysCreate.run([]);
59
+ console.log('');
60
+ }
61
+ // Step 3: Add Bank
62
+ if (!completed.includes('bank')) {
63
+ if (!getApiKey()) {
64
+ this.error('API key is required. Run `apipay keys:create` first.', { exit: 1 });
65
+ }
66
+ console.log(stepLabel(3, totalSteps, 'Add Bank Account'));
67
+ console.log(chalk.gray(' Connect a bank account to start receiving payments.\n'));
68
+ await BanksAdd.run([]);
69
+ console.log('');
70
+ }
71
+ // Step 4: Add Webhook
72
+ if (!completed.includes('webhook')) {
73
+ if (!getApiKey()) {
74
+ this.error('API key is required. Run `apipay keys:create` first.', { exit: 1 });
75
+ }
76
+ console.log(stepLabel(4, totalSteps, 'Register Webhook'));
77
+ console.log(chalk.gray(' Set up a webhook to receive transaction notifications.\n'));
78
+ await WebhooksAdd.run([]);
79
+ console.log('');
80
+ }
81
+ // Final summary
82
+ console.log('');
83
+ console.log(chalk.green.bold(' ╔══════════════════════════════════════╗'));
84
+ console.log(chalk.green.bold(' ║ ✓ Setup Complete! ║'));
85
+ console.log(chalk.green.bold(' ╚══════════════════════════════════════╝'));
86
+ console.log('');
87
+ this.printChecklist(getCompletedSteps());
88
+ console.log('');
89
+ info(`Dashboard: ${chalk.underline.cyan('https://apipay.vn/dashboard')}`);
90
+ info(`Docs: ${chalk.underline.cyan('https://apipay.vn/docs')}`);
91
+ info(`Status: ${chalk.cyan('apipay status')}`);
92
+ console.log('');
93
+ }
94
+ printChecklist(completed) {
95
+ const labels = {
96
+ login: 'Login',
97
+ 'api-key': 'API Key',
98
+ bank: 'Bank Account',
99
+ webhook: 'Webhook',
100
+ };
101
+ for (const step of SETUP_STEPS) {
102
+ const done = completed.includes(step);
103
+ const icon = done ? chalk.green('✓') : chalk.gray('○');
104
+ const label = done ? chalk.white(labels[step]) : chalk.gray(labels[step]);
105
+ console.log(` ${icon} ${label}`);
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { AuthenticatedCommand } from '../../lib/base-command.js';
2
+ export default class KeysCreate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,oBAAoB;IAC1D,OAAgB,WAAW,SAAoD;IAE/E,OAAgB,QAAQ,WAAqC;IAEvD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgE3B"}
@@ -0,0 +1,68 @@
1
+ import chalk from 'chalk';
2
+ import { AuthenticatedCommand } from '../../lib/base-command.js';
3
+ import { setApiKey } from '../../lib/config.js';
4
+ import { success, warn, kvLine } from '../../lib/formatters.js';
5
+ import { promptApiKeyName, promptConfirm } from '../../lib/prompts.js';
6
+ export default class KeysCreate extends AuthenticatedCommand {
7
+ static description = 'Generate a new API key for client integrations';
8
+ static examples = ['<%= config.bin %> keys:create'];
9
+ async run() {
10
+ // Check if user already has keys
11
+ this.spinner.start('Checking existing keys...');
12
+ try {
13
+ const existing = await this.api.get('/client-auth/keys', 'jwt');
14
+ const keys = existing?.data ?? existing;
15
+ if (Array.isArray(keys) && keys.length > 0) {
16
+ this.spinner.stop();
17
+ warn('You already have an API key. Only 1 key is allowed per account.');
18
+ console.log(` Current key: ${chalk.cyan(keys[0].accessKey)}`);
19
+ console.log('');
20
+ const revoke = await promptConfirm('Revoke existing key and create a new one?');
21
+ if (!revoke)
22
+ return;
23
+ this.spinner.start('Revoking existing key...');
24
+ await this.api.delete(`/client-auth/keys/${keys[0].id}`, 'jwt');
25
+ this.spinner.succeed('Existing key revoked');
26
+ }
27
+ else {
28
+ this.spinner.stop();
29
+ }
30
+ }
31
+ catch (error) {
32
+ this.spinner.fail('Failed to check existing keys');
33
+ this.handleError(error);
34
+ }
35
+ const name = await promptApiKeyName();
36
+ this.spinner.start('Generating API key...');
37
+ try {
38
+ const data = await this.api.post('/client-auth/keys', { name }, 'jwt');
39
+ const key = data?.data ?? data;
40
+ this.spinner.succeed('API key created!');
41
+ console.log('');
42
+ console.log(chalk.bold(' Your API Key'));
43
+ console.log(chalk.gray(' ────────────'));
44
+ kvLine('Name', key.name ?? name);
45
+ kvLine('Access Key', chalk.cyan(key.accessKey));
46
+ kvLine('Secret Key', chalk.yellow(key.secretKey));
47
+ console.log('');
48
+ console.log(chalk.yellow.bold(' ⚠ Save your secret key now — it will not be shown again!'));
49
+ console.log('');
50
+ // Store in config for CLI use
51
+ setApiKey({
52
+ id: key.id,
53
+ accessKey: key.accessKey,
54
+ secretKey: key.secretKey,
55
+ name: key.name ?? name,
56
+ });
57
+ success('API key saved to CLI config.');
58
+ if (this.jsonOutput) {
59
+ this.outputJson(key);
60
+ }
61
+ }
62
+ catch (error) {
63
+ this.spinner.fail('Failed to create API key');
64
+ this.handleError(error);
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/keys/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { AuthenticatedCommand } from '../../lib/base-command.js';
2
+ export default class KeysList extends AuthenticatedCommand {
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/keys/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,oBAAoB;IACxD,OAAgB,WAAW,SAAwB;IAEnD,OAAgB,QAAQ,WAAmC;IAErD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmC3B"}
@@ -0,0 +1,36 @@
1
+ import chalk from 'chalk';
2
+ import { AuthenticatedCommand } from '../../lib/base-command.js';
3
+ import { createTable, formatDate, statusBadge } from '../../lib/formatters.js';
4
+ export default class KeysList extends AuthenticatedCommand {
5
+ static description = 'List your API keys';
6
+ static examples = ['<%= config.bin %> keys:list'];
7
+ async run() {
8
+ this.spinner.start('Fetching API keys...');
9
+ try {
10
+ const data = await this.api.get('/client-auth/keys', 'jwt');
11
+ const keys = data?.data ?? data;
12
+ this.spinner.stop();
13
+ if (!Array.isArray(keys) || keys.length === 0) {
14
+ this.log(`\n No API keys found. Run ${chalk.cyan('apipay keys:create')} to generate one.\n`);
15
+ return;
16
+ }
17
+ console.log('');
18
+ const table = createTable(['Name', 'Access Key', 'Status', 'Created'], keys.map((k) => [
19
+ k.name || '—',
20
+ k.accessKey ?? '—',
21
+ statusBadge(k.isActive ? 'ACTIVE' : 'INACTIVE'),
22
+ formatDate(k.createdAt),
23
+ ]));
24
+ console.log(table);
25
+ console.log('');
26
+ if (this.jsonOutput) {
27
+ this.outputJson(keys);
28
+ }
29
+ }
30
+ catch (error) {
31
+ this.spinner.fail('Failed to fetch API keys');
32
+ this.handleError(error);
33
+ }
34
+ }
35
+ }
36
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/keys/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE/E,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,oBAAoB;IACxD,MAAM,CAAU,WAAW,GAAG,oBAAoB,CAAC;IAEnD,MAAM,CAAU,QAAQ,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3D,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;YAEhC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAEpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;gBAC9F,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,EAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC;gBACnB,CAAC,CAAC,IAAI,IAAI,GAAG;gBACb,CAAC,CAAC,SAAS,IAAI,GAAG;gBAClB,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC/C,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;aACxB,CAAC,CACH,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,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,0BAA0B,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { AuthenticatedCommand } from '../../lib/base-command.js';
2
+ export default class KeysRevoke extends AuthenticatedCommand {
3
+ static description: string;
4
+ static args: {
5
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static examples: string[];
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=revoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/revoke.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,oBAAoB;IAC1D,OAAgB,WAAW,SAAuB;IAElD,OAAgB,IAAI;;MAElB;IAEF,OAAgB,QAAQ,WAGtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsD3B"}
@@ -0,0 +1,66 @@
1
+ import { Args } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { AuthenticatedCommand } from '../../lib/base-command.js';
4
+ import { clearApiKey, getApiKey } from '../../lib/config.js';
5
+ import { success } from '../../lib/formatters.js';
6
+ import { promptConfirm } from '../../lib/prompts.js';
7
+ export default class KeysRevoke extends AuthenticatedCommand {
8
+ static description = 'Revoke an API key';
9
+ static args = {
10
+ id: Args.string({ description: 'API key ID to revoke (defaults to current key)', required: false }),
11
+ };
12
+ static examples = [
13
+ '<%= config.bin %> keys:revoke',
14
+ '<%= config.bin %> keys:revoke <key-id>',
15
+ ];
16
+ async run() {
17
+ const { args } = await this.parse(KeysRevoke);
18
+ let keyId = args.id;
19
+ // If no ID provided, use the stored key or list and pick
20
+ if (!keyId) {
21
+ const stored = getApiKey();
22
+ if (stored?.id) {
23
+ keyId = stored.id;
24
+ this.log(`Revoking key: ${chalk.cyan(stored.accessKey)}`);
25
+ }
26
+ else {
27
+ // Fetch from API
28
+ this.spinner.start('Fetching keys...');
29
+ try {
30
+ const data = await this.api.get('/client-auth/keys', 'jwt');
31
+ const keys = data?.data ?? data;
32
+ this.spinner.stop();
33
+ if (!Array.isArray(keys) || keys.length === 0) {
34
+ this.error('No API keys to revoke.', { exit: 1 });
35
+ }
36
+ keyId = keys[0].id;
37
+ this.log(`Revoking key: ${chalk.cyan(keys[0].accessKey)}`);
38
+ }
39
+ catch (error) {
40
+ this.spinner.fail();
41
+ this.handleError(error);
42
+ }
43
+ }
44
+ }
45
+ const confirmed = await promptConfirm(`${chalk.red('This action is irreversible.')} Revoke this API key?`);
46
+ if (!confirmed) {
47
+ this.log('Cancelled.');
48
+ return;
49
+ }
50
+ this.spinner.start('Revoking API key...');
51
+ try {
52
+ await this.api.delete(`/client-auth/keys/${keyId}`, 'jwt');
53
+ clearApiKey();
54
+ this.spinner.succeed('API key revoked');
55
+ success('Key has been permanently revoked.');
56
+ if (this.jsonOutput) {
57
+ this.outputJson({ success: true, id: keyId });
58
+ }
59
+ }
60
+ catch (error) {
61
+ this.spinner.fail('Failed to revoke API key');
62
+ this.handleError(error);
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=revoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke.js","sourceRoot":"","sources":["../../../src/commands/keys/revoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseCommand } from '../lib/base-command.js';
2
+ export default class Login extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ password: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ 'no-browser': import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ private loginWithMagicLink;
14
+ private loginWithPassword;
15
+ private sleep;
16
+ }
17
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAMrD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,WAAW;IAC5C,OAAgB,WAAW,SAA8B;IAEzD,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;;;MAcnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBZ,kBAAkB;YAiGlB,iBAAiB;IAqC/B,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,171 @@
1
+ import { Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import open from 'open';
4
+ import { BaseCommand } from '../lib/base-command.js';
5
+ import { setAuth, isLoggedIn, getAuth } from '../lib/config.js';
6
+ import { DASHBOARD_URL, MAGIC_LINK_POLL_INTERVAL_MS, MAGIC_LINK_TIMEOUT_MS } from '../lib/constants.js';
7
+ import { success, warn, info, kvLine } from '../lib/formatters.js';
8
+ import { promptEmail, promptConfirm } from '../lib/prompts.js';
9
+ export default class Login extends BaseCommand {
10
+ static description = 'Authenticate with ApiPay';
11
+ static examples = [
12
+ '<%= config.bin %> login',
13
+ '<%= config.bin %> login --email user@example.com',
14
+ '<%= config.bin %> login --email user@example.com --password mypass',
15
+ ];
16
+ static flags = {
17
+ ...BaseCommand.baseFlags,
18
+ email: Flags.string({
19
+ char: 'e',
20
+ description: 'Email address (skip interactive prompt)',
21
+ }),
22
+ password: Flags.string({
23
+ char: 'p',
24
+ description: 'Password for email+password login (CI/scripting)',
25
+ }),
26
+ 'no-browser': Flags.boolean({
27
+ description: 'Don\'t open the browser for magic link',
28
+ default: false,
29
+ }),
30
+ };
31
+ async run() {
32
+ const { flags } = await this.parse(Login);
33
+ // Already logged in?
34
+ if (isLoggedIn()) {
35
+ const auth = getAuth();
36
+ warn(`Already logged in as ${chalk.bold(auth.email)}`);
37
+ const relogin = await promptConfirm('Login with a different account?');
38
+ if (!relogin)
39
+ return;
40
+ }
41
+ const email = flags.email ?? (await promptEmail());
42
+ // Password flow (for CI/scripting)
43
+ if (flags.password) {
44
+ return this.loginWithPassword(email, flags.password);
45
+ }
46
+ // Magic link flow (default — best UX)
47
+ return this.loginWithMagicLink(email, flags['no-browser']);
48
+ }
49
+ async loginWithMagicLink(email, noBrowser) {
50
+ this.spinner.start('Requesting magic link...');
51
+ let data;
52
+ try {
53
+ data = await this.api.post('/auth/magic-link/request', { email });
54
+ }
55
+ catch (error) {
56
+ this.spinner.fail('Failed to request magic link');
57
+ this.handleError(error);
58
+ }
59
+ const token = data?.data?.token ?? data?.token;
60
+ if (!token) {
61
+ this.spinner.fail('Failed to get magic link token');
62
+ this.error('Unexpected response from server', { exit: 2 });
63
+ }
64
+ this.spinner.succeed('Magic link sent!');
65
+ // Open browser
66
+ const verifyUrl = `${DASHBOARD_URL}/auth/verify?token=${token}`;
67
+ console.log('');
68
+ info(`Open this URL to authenticate:`);
69
+ console.log(` ${chalk.underline.cyan(verifyUrl)}`);
70
+ console.log('');
71
+ if (!noBrowser) {
72
+ try {
73
+ await open(verifyUrl);
74
+ info('Browser opened automatically.');
75
+ }
76
+ catch {
77
+ warn('Could not open browser. Please open the URL manually.');
78
+ }
79
+ }
80
+ // Poll for verification
81
+ this.spinner.start('Waiting for authentication...');
82
+ const startTime = Date.now();
83
+ while (Date.now() - startTime < MAGIC_LINK_TIMEOUT_MS) {
84
+ await this.sleep(MAGIC_LINK_POLL_INTERVAL_MS);
85
+ try {
86
+ const status = await this.api.get(`/auth/magic-link/status?token=${token}`);
87
+ const st = status?.data?.status ?? status?.status;
88
+ if (st === 'verified') {
89
+ // Token has been consumed — now exchange for auth tokens
90
+ // The verify endpoint was already called by the browser;
91
+ // we need to call it ourselves too to get the tokens for CLI
92
+ try {
93
+ const authResult = await this.api.post('/auth/magic-link/verify', { token });
94
+ const result = authResult?.data ?? authResult;
95
+ const user = result?.user;
96
+ const tokens = result?.tokens;
97
+ if (tokens?.accessToken) {
98
+ setAuth({
99
+ accessToken: tokens.accessToken,
100
+ refreshToken: tokens.refreshToken,
101
+ expiresAt: Date.now() + (tokens.expiresIn ?? 900) * 1000,
102
+ email: user?.email ?? email,
103
+ userId: user?.id ?? '',
104
+ });
105
+ this.spinner.succeed('Authenticated!');
106
+ console.log('');
107
+ success(`Logged in as ${chalk.bold(user?.email ?? email)}`);
108
+ if (this.jsonOutput) {
109
+ this.outputJson({ email: user?.email, userId: user?.id });
110
+ }
111
+ return;
112
+ }
113
+ }
114
+ catch {
115
+ // Token already consumed by browser — that's expected.
116
+ // In this case, the CLI should have its own token.
117
+ // We'll try the password fallback or re-request.
118
+ this.spinner.fail('Magic link was verified in browser but could not retrieve tokens for CLI.');
119
+ info(`Please run ${chalk.cyan('apipay login --email ' + email + ' --password <password>')} instead.`);
120
+ return;
121
+ }
122
+ }
123
+ if (st === 'expired') {
124
+ this.spinner.fail('Magic link expired');
125
+ this.error('The magic link has expired. Please try again.', { exit: 1 });
126
+ }
127
+ }
128
+ catch {
129
+ // Network error during poll — continue
130
+ }
131
+ }
132
+ this.spinner.fail('Authentication timed out');
133
+ this.error('Timed out waiting for authentication. Please try again.', { exit: 1 });
134
+ }
135
+ async loginWithPassword(email, password) {
136
+ this.spinner.start('Logging in...');
137
+ try {
138
+ const data = await this.api.post('/auth/login', { email, password });
139
+ const result = data?.data ?? data;
140
+ const user = result?.user;
141
+ const tokens = result?.tokens;
142
+ if (!tokens?.accessToken) {
143
+ this.spinner.fail('Login failed');
144
+ this.error('Unexpected response from server', { exit: 2 });
145
+ }
146
+ setAuth({
147
+ accessToken: tokens.accessToken,
148
+ refreshToken: tokens.refreshToken,
149
+ expiresAt: Date.now() + (tokens.expiresIn ?? 900) * 1000,
150
+ email: user?.email ?? email,
151
+ userId: user?.id ?? '',
152
+ });
153
+ this.spinner.succeed('Authenticated!');
154
+ console.log('');
155
+ success(`Logged in as ${chalk.bold(user?.email ?? email)}`);
156
+ kvLine('User ID', user?.id ?? '');
157
+ kvLine('Role', user?.role ?? 'USER');
158
+ if (this.jsonOutput) {
159
+ this.outputJson({ email: user?.email, userId: user?.id, role: user?.role });
160
+ }
161
+ }
162
+ catch (error) {
163
+ this.spinner.fail('Login failed');
164
+ this.handleError(error);
165
+ }
166
+ }
167
+ sleep(ms) {
168
+ return new Promise((r) => setTimeout(r, ms));
169
+ }
170
+ }
171
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { AuthenticatedCommand } from '../lib/base-command.js';
2
+ export default class Logout extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAK9D,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,oBAAoB;IACtD,OAAgB,WAAW,SAAsD;IAEjF,OAAgB,QAAQ,WAAgC;IAElD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B3B"}
@@ -0,0 +1,32 @@
1
+ import chalk from 'chalk';
2
+ import { AuthenticatedCommand } from '../lib/base-command.js';
3
+ import { clearAuth, clearApiKey, getAuth } from '../lib/config.js';
4
+ import { success } from '../lib/formatters.js';
5
+ import { promptConfirm } from '../lib/prompts.js';
6
+ export default class Logout extends AuthenticatedCommand {
7
+ static description = 'Log out from ApiPay and clear stored credentials';
8
+ static examples = ['<%= config.bin %> logout'];
9
+ async run() {
10
+ const auth = getAuth();
11
+ const confirmed = await promptConfirm(`Log out from ${chalk.bold(auth.email)}? This will clear stored tokens and API keys.`);
12
+ if (!confirmed) {
13
+ this.log('Cancelled.');
14
+ return;
15
+ }
16
+ this.spinner.start('Logging out...');
17
+ try {
18
+ await this.api.post('/auth/logout', undefined, 'jwt');
19
+ }
20
+ catch {
21
+ // Server logout might fail if token expired — that's fine
22
+ }
23
+ clearAuth();
24
+ clearApiKey();
25
+ this.spinner.succeed('Logged out');
26
+ success('All credentials cleared.');
27
+ if (this.jsonOutput) {
28
+ this.outputJson({ success: true });
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,oBAAoB;IACtD,MAAM,CAAU,WAAW,GAAG,kDAAkD,CAAC;IAEjF,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,OAAO,EAAG,CAAC;QAExB,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,+CAA+C,CACtF,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;QAED,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QAEd,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACnC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ApiKeyCommand } from '../../lib/base-command.js';
2
+ export default class MetricsSummary extends ApiKeyCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../src/commands/metrics/summary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa;IACvD,OAAgB,WAAW,SAA8C;IAEzE,OAAgB,QAAQ,WAAyC;IAE3D,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsC3B"}