@forjio/fulkruma-cli 0.4.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/bin/cli.js +2 -0
- package/dist/commands/addresses.d.ts +5 -0
- package/dist/commands/addresses.js +90 -0
- package/dist/commands/addresses.js.map +1 -0
- package/dist/commands/api-keys.d.ts +5 -0
- package/dist/commands/api-keys.js +78 -0
- package/dist/commands/api-keys.js.map +1 -0
- package/dist/commands/api.generated.d.ts +23 -0
- package/dist/commands/api.generated.js +2003 -0
- package/dist/commands/api.generated.js.map +1 -0
- package/dist/commands/audit-log.d.ts +5 -0
- package/dist/commands/audit-log.js +46 -0
- package/dist/commands/audit-log.js.map +1 -0
- package/dist/commands/auth.d.ts +10 -0
- package/dist/commands/auth.js +116 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/billing.d.ts +5 -0
- package/dist/commands/billing.js +144 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/deliveries.d.ts +5 -0
- package/dist/commands/deliveries.js +77 -0
- package/dist/commands/deliveries.js.map +1 -0
- package/dist/commands/integrations.d.ts +5 -0
- package/dist/commands/integrations.js +24 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/licenses.d.ts +5 -0
- package/dist/commands/licenses.js +142 -0
- package/dist/commands/licenses.js.map +1 -0
- package/dist/commands/products.d.ts +12 -0
- package/dist/commands/products.js +244 -0
- package/dist/commands/products.js.map +1 -0
- package/dist/commands/shipments.d.ts +6 -0
- package/dist/commands/shipments.js +108 -0
- package/dist/commands/shipments.js.map +1 -0
- package/dist/commands/shipping.d.ts +2 -0
- package/dist/commands/shipping.js +269 -0
- package/dist/commands/shipping.js.map +1 -0
- package/dist/commands/stats.d.ts +5 -0
- package/dist/commands/stats.js +24 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/stock.d.ts +5 -0
- package/dist/commands/stock.js +112 -0
- package/dist/commands/stock.js.map +1 -0
- package/dist/commands/warehouses.d.ts +5 -0
- package/dist/commands/warehouses.js +111 -0
- package/dist/commands/warehouses.js.map +1 -0
- package/dist/commands/webhooks.d.ts +5 -0
- package/dist/commands/webhooks.js +125 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/apigen-call.d.ts +4 -0
- package/dist/lib/apigen-call.js +34 -0
- package/dist/lib/apigen-call.js.map +1 -0
- package/dist/lib/client.d.ts +21 -0
- package/dist/lib/client.js +41 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/credentials.d.ts +25 -0
- package/dist/lib/credentials.js +158 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/output.d.ts +19 -0
- package/dist/lib/output.js +69 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/util.d.ts +18 -0
- package/dist/lib/util.js +65 -0
- package/dist/lib/util.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `fulkruma webhooks …` — endpoints (list/create/update/delete) + events list.
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { getClient } from '../lib/client.js';
|
|
6
|
+
import { formatOpts, getGlobalOpts, handleError } from '../lib/util.js';
|
|
7
|
+
import { printJson, printResult } from '../lib/output.js';
|
|
8
|
+
export const webhooksCommand = new Command('webhooks').description('Webhook endpoints and event history');
|
|
9
|
+
const endpoints = new Command('endpoints').description('Manage webhook endpoints');
|
|
10
|
+
endpoints
|
|
11
|
+
.command('list')
|
|
12
|
+
.description('List endpoints')
|
|
13
|
+
.action(async (_options, cmd) => {
|
|
14
|
+
const g = getGlobalOpts(cmd);
|
|
15
|
+
try {
|
|
16
|
+
const client = getClient(g);
|
|
17
|
+
const { endpoints: rows } = await client.webhooks.listEndpoints();
|
|
18
|
+
printResult(rows, [
|
|
19
|
+
{ header: 'ID', accessor: (e) => e['id'] },
|
|
20
|
+
{ header: 'URL', accessor: (e) => e['url'] },
|
|
21
|
+
{ header: 'Active', accessor: (e) => e['active'] },
|
|
22
|
+
{ header: 'Events', accessor: (e) => e['events']?.join(',') },
|
|
23
|
+
], formatOpts(g));
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
handleError(err, g);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
endpoints
|
|
31
|
+
.command('create')
|
|
32
|
+
.description('Create an endpoint')
|
|
33
|
+
.requiredOption('--url <url>', 'destination URL')
|
|
34
|
+
.option('--events <list>', 'comma-separated event types', (v) => v.split(',').map((s) => s.trim()))
|
|
35
|
+
.option('--description <text>', 'human-readable description')
|
|
36
|
+
.action(async (options, cmd) => {
|
|
37
|
+
const g = getGlobalOpts(cmd);
|
|
38
|
+
try {
|
|
39
|
+
const client = getClient(g);
|
|
40
|
+
const { endpoint } = await client.webhooks.createEndpoint({
|
|
41
|
+
url: options.url,
|
|
42
|
+
events: options.events,
|
|
43
|
+
description: options.description,
|
|
44
|
+
});
|
|
45
|
+
printJson(endpoint);
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
handleError(err, g);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
endpoints
|
|
53
|
+
.command('update <id>')
|
|
54
|
+
.description('Update an endpoint')
|
|
55
|
+
.option('--url <url>', 'destination URL')
|
|
56
|
+
.option('--events <list>', 'comma-separated event types', (v) => v.split(',').map((s) => s.trim()))
|
|
57
|
+
.option('--description <text>', 'description')
|
|
58
|
+
.option('--active <bool>', 'true|false')
|
|
59
|
+
.action(async (id, options, cmd) => {
|
|
60
|
+
const g = getGlobalOpts(cmd);
|
|
61
|
+
try {
|
|
62
|
+
const client = getClient(g);
|
|
63
|
+
const patch = {};
|
|
64
|
+
for (const k of ['url', 'events', 'description']) {
|
|
65
|
+
if (options[k] !== undefined)
|
|
66
|
+
patch[k] = options[k];
|
|
67
|
+
}
|
|
68
|
+
if (options['active'] !== undefined) {
|
|
69
|
+
patch['active'] = options['active'] === 'true' || options['active'] === true;
|
|
70
|
+
}
|
|
71
|
+
const { endpoint } = await client.webhooks.updateEndpoint(id, patch);
|
|
72
|
+
printJson(endpoint);
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
handleError(err, g);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
endpoints
|
|
80
|
+
.command('delete <id>')
|
|
81
|
+
.description('Delete an endpoint')
|
|
82
|
+
.action(async (id, _options, cmd) => {
|
|
83
|
+
const g = getGlobalOpts(cmd);
|
|
84
|
+
try {
|
|
85
|
+
const client = getClient(g);
|
|
86
|
+
const result = await client.webhooks.deleteEndpoint(id);
|
|
87
|
+
printResult({ id, deleted: result.deleted }, [
|
|
88
|
+
{ header: 'ID', accessor: (r) => r.id },
|
|
89
|
+
{ header: 'Deleted', accessor: (r) => r.deleted },
|
|
90
|
+
], formatOpts(g));
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
handleError(err, g);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
webhooksCommand.addCommand(endpoints);
|
|
98
|
+
const events = new Command('events').description('Webhook event history');
|
|
99
|
+
events
|
|
100
|
+
.command('list')
|
|
101
|
+
.description('List the 50 most recent webhook events')
|
|
102
|
+
.action(async (_options, cmd) => {
|
|
103
|
+
const g = getGlobalOpts(cmd);
|
|
104
|
+
try {
|
|
105
|
+
const client = getClient(g);
|
|
106
|
+
const result = await client.webhooks.listEvents();
|
|
107
|
+
if (g.json) {
|
|
108
|
+
printJson(result);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
printResult(result.events, [
|
|
112
|
+
{ header: 'ID', accessor: (e) => e['id'] },
|
|
113
|
+
{ header: 'Type', accessor: (e) => e['type'] },
|
|
114
|
+
{ header: 'Status', accessor: (e) => e['status'] },
|
|
115
|
+
{ header: 'Created', accessor: (e) => e['createdAt'] },
|
|
116
|
+
], formatOpts(g));
|
|
117
|
+
}
|
|
118
|
+
process.exit(0);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
handleError(err, g);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
webhooksCommand.addCommand(events);
|
|
125
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @forjio/fulkruma-cli entrypoint.
|
|
3
|
+
*
|
|
4
|
+
* Wires the auth command + 10 product command groups (plus integrations,
|
|
5
|
+
* stats, webhooks, audit-log bonuses) on top of @forjio/fulkruma-node.
|
|
6
|
+
*
|
|
7
|
+
* Global flags:
|
|
8
|
+
* --json emit raw JSON instead of chalk tables
|
|
9
|
+
* --profile <name> select a credential profile (default: "default")
|
|
10
|
+
* --base-url <url> override the API base URL
|
|
11
|
+
* --on-behalf-of <id> forward X-Fulkruma-On-Behalf-Of (platform admin only)
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
export declare function buildProgram(): Command;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @forjio/fulkruma-cli entrypoint.
|
|
3
|
+
*
|
|
4
|
+
* Wires the auth command + 10 product command groups (plus integrations,
|
|
5
|
+
* stats, webhooks, audit-log bonuses) on top of @forjio/fulkruma-node.
|
|
6
|
+
*
|
|
7
|
+
* Global flags:
|
|
8
|
+
* --json emit raw JSON instead of chalk tables
|
|
9
|
+
* --profile <name> select a credential profile (default: "default")
|
|
10
|
+
* --base-url <url> override the API base URL
|
|
11
|
+
* --on-behalf-of <id> forward X-Fulkruma-On-Behalf-Of (platform admin only)
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
import { authCommand } from './commands/auth.js';
|
|
15
|
+
import { productsCommand } from './commands/products.js';
|
|
16
|
+
import { warehousesCommand } from './commands/warehouses.js';
|
|
17
|
+
import { stockCommand } from './commands/stock.js';
|
|
18
|
+
import { addressesCommand } from './commands/addresses.js';
|
|
19
|
+
import { shipmentsCommand } from './commands/shipments.js';
|
|
20
|
+
import { shippingCommand } from './commands/shipping.js';
|
|
21
|
+
import { licensesCommand } from './commands/licenses.js';
|
|
22
|
+
import { deliveriesCommand } from './commands/deliveries.js';
|
|
23
|
+
import { billingCommand } from './commands/billing.js';
|
|
24
|
+
import { apiKeysCommand } from './commands/api-keys.js';
|
|
25
|
+
import { integrationsCommand } from './commands/integrations.js';
|
|
26
|
+
import { statsCommand } from './commands/stats.js';
|
|
27
|
+
import { webhooksCommand } from './commands/webhooks.js';
|
|
28
|
+
import { auditLogCommand } from './commands/audit-log.js';
|
|
29
|
+
import { buildApiCommand } from './commands/api.generated.js';
|
|
30
|
+
const brand = process.env['FORJIO_BRAND'] ?? 'fulkruma';
|
|
31
|
+
export function buildProgram() {
|
|
32
|
+
const program = new Command()
|
|
33
|
+
.name(brand)
|
|
34
|
+
.description(`CLI for ${brand} — part of the Forjio commerce suite.`)
|
|
35
|
+
.version('0.3.1')
|
|
36
|
+
.option('--json', 'emit JSON instead of human-readable tables')
|
|
37
|
+
.option('--profile <name>', 'credential profile name (default: "default")')
|
|
38
|
+
.option('--base-url <url>', 'override the Fulkruma API base URL')
|
|
39
|
+
.option('--on-behalf-of <accountId>', 'forward X-Fulkruma-On-Behalf-Of (platform admin keys only)');
|
|
40
|
+
program.addCommand(authCommand);
|
|
41
|
+
program.addCommand(productsCommand);
|
|
42
|
+
program.addCommand(warehousesCommand);
|
|
43
|
+
program.addCommand(stockCommand);
|
|
44
|
+
program.addCommand(addressesCommand);
|
|
45
|
+
program.addCommand(shipmentsCommand);
|
|
46
|
+
program.addCommand(shippingCommand);
|
|
47
|
+
program.addCommand(licensesCommand);
|
|
48
|
+
program.addCommand(deliveriesCommand);
|
|
49
|
+
program.addCommand(billingCommand);
|
|
50
|
+
program.addCommand(apiKeysCommand);
|
|
51
|
+
program.addCommand(integrationsCommand);
|
|
52
|
+
program.addCommand(statsCommand);
|
|
53
|
+
program.addCommand(webhooksCommand);
|
|
54
|
+
program.addCommand(auditLogCommand);
|
|
55
|
+
program.addCommand(buildApiCommand());
|
|
56
|
+
return program;
|
|
57
|
+
}
|
|
58
|
+
// Only auto-run when invoked as the CLI binary — not when imported by
|
|
59
|
+
// tests via `buildProgram`. Detect by comparing the resolved entrypoint
|
|
60
|
+
// of import.meta.url to argv[1].
|
|
61
|
+
const isCliEntry = (() => {
|
|
62
|
+
if (process.env['FULKRUMA_DISABLE_AUTORUN'] === '1')
|
|
63
|
+
return false;
|
|
64
|
+
const argv1 = process.argv[1];
|
|
65
|
+
if (!argv1)
|
|
66
|
+
return false;
|
|
67
|
+
// bin/cli.js imports dist/index.js, which imports this file at runtime.
|
|
68
|
+
return /\/(bin\/cli\.js|dist\/index\.js)$/.test(argv1);
|
|
69
|
+
})();
|
|
70
|
+
if (isCliEntry) {
|
|
71
|
+
const program = buildProgram();
|
|
72
|
+
program.parseAsync(process.argv).catch((e) => {
|
|
73
|
+
console.error(e);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
export declare function callRoute(cmd: Command, method: string, path: string, query: Record<string, unknown>, body: Record<string, unknown> | undefined): Promise<void>;
|
|
3
|
+
/** Bad input to a generated command (a missing field, a value the spec does not allow). */
|
|
4
|
+
export declare function failRoute(cmd: Command, err: unknown): Promise<never>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the generated `fulkruma api <area> <action>` commands (commands/api.generated.ts)
|
|
3
|
+
* make their call: this CLI's own credentials and client (the SDK's signed `request`),
|
|
4
|
+
* its own output and errors.
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { getClient } from './client.js';
|
|
8
|
+
import { getGlobalOpts, handleError } from './util.js';
|
|
9
|
+
import { printJson } from './output.js';
|
|
10
|
+
export async function callRoute(cmd, method, path, query, body) {
|
|
11
|
+
const g = getGlobalOpts(cmd);
|
|
12
|
+
try {
|
|
13
|
+
const qs = new URLSearchParams(Object.entries(query).map(([k, v]) => [k, typeof v === 'string' ? v : JSON.stringify(v)])).toString();
|
|
14
|
+
const client = getClient(g);
|
|
15
|
+
const data = await client.request({
|
|
16
|
+
method: method,
|
|
17
|
+
path: qs ? `${path}?${qs}` : path,
|
|
18
|
+
// The server hashes an empty JSON body as '' (middleware/hmac-auth.ts), the SDK as
|
|
19
|
+
// '{}': send no body at all when no field was given, so the signatures agree.
|
|
20
|
+
body: body && Object.keys(body).length ? body : undefined,
|
|
21
|
+
idempotencyKey: method === 'GET' ? undefined : `idem_${randomUUID()}`,
|
|
22
|
+
});
|
|
23
|
+
printJson(data);
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
handleError(err, g);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Bad input to a generated command (a missing field, a value the spec does not allow). */
|
|
31
|
+
export async function failRoute(cmd, err) {
|
|
32
|
+
handleError(err, getGlobalOpts(cmd));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=apigen-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apigen-call.js","sourceRoot":"","sources":["../../src/lib/apigen-call.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAY,EACZ,MAAc,EACd,IAAY,EACZ,KAA8B,EAC9B,IAAyC;IAEzC,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,eAAe,CAC5B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5G,CAAC,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAU;YACzC,MAAM,EAAE,MAAgB;YACxB,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;YACjC,mFAAmF;YACnF,8EAA8E;YAC9E,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACzD,cAAc,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,UAAU,EAAE,EAAE;SACtE,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY,EAAE,GAAY;IACxD,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FulkrumaClient factory. Loads credentials from `~/.fulkruma/credentials`
|
|
3
|
+
* (or env) and constructs a SDK client with the active profile.
|
|
4
|
+
*
|
|
5
|
+
* Tests inject a fake client via `setClientFactory` so we never hit the
|
|
6
|
+
* network in unit tests.
|
|
7
|
+
*/
|
|
8
|
+
import { FulkrumaClient, FulkrumaError } from '@forjio/fulkruma-node';
|
|
9
|
+
export interface GlobalOpts {
|
|
10
|
+
json?: boolean;
|
|
11
|
+
profile?: string;
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
onBehalfOf?: string;
|
|
14
|
+
}
|
|
15
|
+
export type ClientFactory = (opts: GlobalOpts) => FulkrumaClient;
|
|
16
|
+
/** Test seam — vitest tests replace this with a mock. */
|
|
17
|
+
export declare function setClientFactory(f: ClientFactory): void;
|
|
18
|
+
/** Reset to default behaviour (load creds + new SDK client). */
|
|
19
|
+
export declare function resetClientFactory(): void;
|
|
20
|
+
export declare function getClient(opts: GlobalOpts): FulkrumaClient;
|
|
21
|
+
export declare function isFulkrumaError(err: unknown): err is FulkrumaError;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FulkrumaClient factory. Loads credentials from `~/.fulkruma/credentials`
|
|
3
|
+
* (or env) and constructs a SDK client with the active profile.
|
|
4
|
+
*
|
|
5
|
+
* Tests inject a fake client via `setClientFactory` so we never hit the
|
|
6
|
+
* network in unit tests.
|
|
7
|
+
*/
|
|
8
|
+
import { FulkrumaClient, FulkrumaError } from '@forjio/fulkruma-node';
|
|
9
|
+
import { loadCredentials } from './credentials.js';
|
|
10
|
+
let factory = (opts) => {
|
|
11
|
+
const creds = loadCredentials(opts.profile);
|
|
12
|
+
return new FulkrumaClient({
|
|
13
|
+
keyId: creds.keyId,
|
|
14
|
+
secret: creds.secret,
|
|
15
|
+
baseUrl: opts.baseUrl ?? process.env['FULKRUMA_BASE_URL'] ?? undefined,
|
|
16
|
+
onBehalfOf: opts.onBehalfOf,
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
/** Test seam — vitest tests replace this with a mock. */
|
|
20
|
+
export function setClientFactory(f) {
|
|
21
|
+
factory = f;
|
|
22
|
+
}
|
|
23
|
+
/** Reset to default behaviour (load creds + new SDK client). */
|
|
24
|
+
export function resetClientFactory() {
|
|
25
|
+
factory = (opts) => {
|
|
26
|
+
const creds = loadCredentials(opts.profile);
|
|
27
|
+
return new FulkrumaClient({
|
|
28
|
+
keyId: creds.keyId,
|
|
29
|
+
secret: creds.secret,
|
|
30
|
+
baseUrl: opts.baseUrl ?? process.env['FULKRUMA_BASE_URL'] ?? undefined,
|
|
31
|
+
onBehalfOf: opts.onBehalfOf,
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function getClient(opts) {
|
|
36
|
+
return factory(opts);
|
|
37
|
+
}
|
|
38
|
+
export function isFulkrumaError(err) {
|
|
39
|
+
return err instanceof FulkrumaError;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAWnD,IAAI,OAAO,GAAkB,CAAC,IAAI,EAAE,EAAE;IACpC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,cAAc,CAAC;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,SAAS;QACtE,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,CAAgB;IAC/C,OAAO,GAAG,CAAC,CAAC;AACd,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB;IAChC,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,SAAS;YACtE,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,GAAG,YAAY,aAAa,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface Credentials {
|
|
2
|
+
keyId: string;
|
|
3
|
+
secret: string;
|
|
4
|
+
}
|
|
5
|
+
export interface StoredProfile extends Credentials {
|
|
6
|
+
profile: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function credentialsPath(): string;
|
|
9
|
+
export declare function resolveProfileName(explicit?: string): string;
|
|
10
|
+
/** Load credentials from env or file. Throws if nothing is configured. */
|
|
11
|
+
export declare function loadCredentials(profile?: string): StoredProfile;
|
|
12
|
+
/** Try to load without throwing — returns null if no creds. */
|
|
13
|
+
export declare function tryLoadCredentials(profile?: string): StoredProfile | null;
|
|
14
|
+
/** Save credentials into a profile (creates or overwrites). */
|
|
15
|
+
export declare function saveCredentials(input: {
|
|
16
|
+
profile?: string;
|
|
17
|
+
keyId: string;
|
|
18
|
+
secret: string;
|
|
19
|
+
}): string;
|
|
20
|
+
/** Clear a profile. Returns true if removed, false if it didn't exist. */
|
|
21
|
+
export declare function clearCredentials(profile?: string): boolean;
|
|
22
|
+
/** List profile names for diagnostics. */
|
|
23
|
+
export declare function listProfiles(): string[];
|
|
24
|
+
/** Mask the secret half of an API key for display. */
|
|
25
|
+
export declare function maskKey(keyId: string): string;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMAC credentials store for Fulkruma CLI.
|
|
3
|
+
*
|
|
4
|
+
* Why not @forjio/sdk's `Session`? `Session` is OIDC-focused — refresh
|
|
5
|
+
* tokens, expiry, device-flow state. Fulkruma's CLI uses an AKIA-style
|
|
6
|
+
* HMAC key+secret (key_id + secret) issued from the dashboard, so we
|
|
7
|
+
* roll a small INI multi-profile store at `~/.fulkruma/credentials`,
|
|
8
|
+
* shaped like AWS' credentials file.
|
|
9
|
+
*
|
|
10
|
+
* Format:
|
|
11
|
+
*
|
|
12
|
+
* [default]
|
|
13
|
+
* key_id = AKIAFULK...
|
|
14
|
+
* secret = ...
|
|
15
|
+
*
|
|
16
|
+
* [staging]
|
|
17
|
+
* key_id = AKIAFULK...
|
|
18
|
+
* secret = ...
|
|
19
|
+
*
|
|
20
|
+
* Resolution order for the active profile:
|
|
21
|
+
* 1. `--profile <name>` global flag
|
|
22
|
+
* 2. `FULKRUMA_PROFILE` env var
|
|
23
|
+
* 3. `"default"`
|
|
24
|
+
*
|
|
25
|
+
* Direct env override (skips file entirely): `FULKRUMA_KEY_ID` +
|
|
26
|
+
* `FULKRUMA_SECRET`.
|
|
27
|
+
*/
|
|
28
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';
|
|
29
|
+
import { homedir } from 'node:os';
|
|
30
|
+
import { dirname, join } from 'node:path';
|
|
31
|
+
const DEFAULT_PROFILE = 'default';
|
|
32
|
+
export function credentialsPath() {
|
|
33
|
+
return process.env['FULKRUMA_CREDENTIALS_FILE'] ?? join(homedir(), '.fulkruma', 'credentials');
|
|
34
|
+
}
|
|
35
|
+
export function resolveProfileName(explicit) {
|
|
36
|
+
return explicit ?? process.env['FULKRUMA_PROFILE'] ?? DEFAULT_PROFILE;
|
|
37
|
+
}
|
|
38
|
+
function parseIni(content) {
|
|
39
|
+
const profiles = new Map();
|
|
40
|
+
const order = [];
|
|
41
|
+
let current = null;
|
|
42
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
43
|
+
const line = rawLine.trim();
|
|
44
|
+
if (!line || line.startsWith('#') || line.startsWith(';'))
|
|
45
|
+
continue;
|
|
46
|
+
if (line.startsWith('[') && line.endsWith(']')) {
|
|
47
|
+
current = line.slice(1, -1).trim();
|
|
48
|
+
if (!profiles.has(current)) {
|
|
49
|
+
profiles.set(current, new Map());
|
|
50
|
+
order.push(current);
|
|
51
|
+
}
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const eq = line.indexOf('=');
|
|
55
|
+
if (eq <= 0 || current === null)
|
|
56
|
+
continue;
|
|
57
|
+
const key = line.slice(0, eq).trim();
|
|
58
|
+
const value = line.slice(eq + 1).trim();
|
|
59
|
+
profiles.get(current).set(key, value);
|
|
60
|
+
}
|
|
61
|
+
return { profiles, order };
|
|
62
|
+
}
|
|
63
|
+
function serializeIni(parsed) {
|
|
64
|
+
const blocks = [];
|
|
65
|
+
for (const name of parsed.order) {
|
|
66
|
+
const kv = parsed.profiles.get(name);
|
|
67
|
+
if (!kv)
|
|
68
|
+
continue;
|
|
69
|
+
const lines = [`[${name}]`];
|
|
70
|
+
for (const [k, v] of kv.entries())
|
|
71
|
+
lines.push(`${k} = ${v}`);
|
|
72
|
+
blocks.push(lines.join('\n'));
|
|
73
|
+
}
|
|
74
|
+
return blocks.join('\n\n') + '\n';
|
|
75
|
+
}
|
|
76
|
+
function readFile() {
|
|
77
|
+
const path = credentialsPath();
|
|
78
|
+
if (!existsSync(path))
|
|
79
|
+
return { profiles: new Map(), order: [] };
|
|
80
|
+
return parseIni(readFileSync(path, 'utf8'));
|
|
81
|
+
}
|
|
82
|
+
function writeFile(parsed) {
|
|
83
|
+
const path = credentialsPath();
|
|
84
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
85
|
+
writeFileSync(path, serializeIni(parsed), { encoding: 'utf8' });
|
|
86
|
+
try {
|
|
87
|
+
chmodSync(path, 0o600);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* on Windows chmod is a no-op; ignore */
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Load credentials from env or file. Throws if nothing is configured. */
|
|
94
|
+
export function loadCredentials(profile) {
|
|
95
|
+
const envKey = process.env['FULKRUMA_KEY_ID'];
|
|
96
|
+
const envSecret = process.env['FULKRUMA_SECRET'];
|
|
97
|
+
if (envKey && envSecret) {
|
|
98
|
+
return { profile: '(env)', keyId: envKey, secret: envSecret };
|
|
99
|
+
}
|
|
100
|
+
const name = resolveProfileName(profile);
|
|
101
|
+
const { profiles } = readFile();
|
|
102
|
+
const kv = profiles.get(name);
|
|
103
|
+
if (!kv) {
|
|
104
|
+
throw new Error(`No credentials found for profile "${name}" at ${credentialsPath()}. ` +
|
|
105
|
+
`Run \`fulkruma auth login --key-id <id> --secret <secret>\` first.`);
|
|
106
|
+
}
|
|
107
|
+
const keyId = kv.get('key_id');
|
|
108
|
+
const secret = kv.get('secret');
|
|
109
|
+
if (!keyId || !secret) {
|
|
110
|
+
throw new Error(`Profile "${name}" is missing key_id or secret.`);
|
|
111
|
+
}
|
|
112
|
+
return { profile: name, keyId, secret };
|
|
113
|
+
}
|
|
114
|
+
/** Try to load without throwing — returns null if no creds. */
|
|
115
|
+
export function tryLoadCredentials(profile) {
|
|
116
|
+
try {
|
|
117
|
+
return loadCredentials(profile);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** Save credentials into a profile (creates or overwrites). */
|
|
124
|
+
export function saveCredentials(input) {
|
|
125
|
+
const name = resolveProfileName(input.profile);
|
|
126
|
+
const parsed = readFile();
|
|
127
|
+
if (!parsed.profiles.has(name)) {
|
|
128
|
+
parsed.profiles.set(name, new Map());
|
|
129
|
+
parsed.order.push(name);
|
|
130
|
+
}
|
|
131
|
+
const kv = parsed.profiles.get(name);
|
|
132
|
+
kv.set('key_id', input.keyId);
|
|
133
|
+
kv.set('secret', input.secret);
|
|
134
|
+
writeFile(parsed);
|
|
135
|
+
return name;
|
|
136
|
+
}
|
|
137
|
+
/** Clear a profile. Returns true if removed, false if it didn't exist. */
|
|
138
|
+
export function clearCredentials(profile) {
|
|
139
|
+
const name = resolveProfileName(profile);
|
|
140
|
+
const parsed = readFile();
|
|
141
|
+
if (!parsed.profiles.has(name))
|
|
142
|
+
return false;
|
|
143
|
+
parsed.profiles.delete(name);
|
|
144
|
+
parsed.order = parsed.order.filter((n) => n !== name);
|
|
145
|
+
writeFile(parsed);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
/** List profile names for diagnostics. */
|
|
149
|
+
export function listProfiles() {
|
|
150
|
+
return readFile().order.slice();
|
|
151
|
+
}
|
|
152
|
+
/** Mask the secret half of an API key for display. */
|
|
153
|
+
export function maskKey(keyId) {
|
|
154
|
+
if (keyId.length <= 10)
|
|
155
|
+
return keyId;
|
|
156
|
+
return `${keyId.slice(0, 10)}…${keyId.slice(-4)}`;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface Column<T> {
|
|
2
|
+
header: string;
|
|
3
|
+
accessor: (row: T) => string | number | boolean | null | undefined;
|
|
4
|
+
width?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface FormatOptions {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
noColor?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatTable<T>(rows: readonly T[], columns: readonly Column<T>[]): string;
|
|
11
|
+
export declare function formatJson(data: unknown): string;
|
|
12
|
+
export declare function printResult<T>(data: T | readonly T[], columns: readonly Column<T>[], opts?: FormatOptions): void;
|
|
13
|
+
export declare function printJson(data: unknown): void;
|
|
14
|
+
export declare function printMessage(msg: string, opts?: FormatOptions): void;
|
|
15
|
+
export declare function printError(err: {
|
|
16
|
+
code?: string;
|
|
17
|
+
message: string;
|
|
18
|
+
requestId?: string;
|
|
19
|
+
}, opts?: FormatOptions): void;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output helpers — chalk-styled table by default, raw JSON when --json
|
|
3
|
+
* is on. Mirrors plugipay's CLI output shape so shells scripts can rely
|
|
4
|
+
* on the same conventions across the Forjio family.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
function cellValue(v) {
|
|
8
|
+
if (v === null || v === undefined || v === '')
|
|
9
|
+
return '–';
|
|
10
|
+
return String(v);
|
|
11
|
+
}
|
|
12
|
+
export function formatTable(rows, columns) {
|
|
13
|
+
if (columns.length === 0)
|
|
14
|
+
return '';
|
|
15
|
+
const stringRows = rows.map((row) => columns.map((col) => cellValue(col.accessor(row))));
|
|
16
|
+
const widths = columns.map((col, idx) => {
|
|
17
|
+
const dataMax = stringRows.reduce((max, r) => Math.max(max, (r[idx] ?? '').length), 0);
|
|
18
|
+
return Math.max(col.header.length, dataMax, col.width ?? 0);
|
|
19
|
+
});
|
|
20
|
+
const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
|
|
21
|
+
const headerLine = columns
|
|
22
|
+
.map((c, i) => chalk.bold(pad(c.header, widths[i] ?? c.header.length)))
|
|
23
|
+
.join(' ');
|
|
24
|
+
const divider = widths.map((w) => '─'.repeat(w)).join(' ');
|
|
25
|
+
const bodyLines = stringRows.map((r) => r.map((cell, i) => pad(cell, widths[i] ?? cell.length)).join(' '));
|
|
26
|
+
return [headerLine, divider, ...bodyLines].join('\n');
|
|
27
|
+
}
|
|
28
|
+
export function formatJson(data) {
|
|
29
|
+
return JSON.stringify(data, null, 2);
|
|
30
|
+
}
|
|
31
|
+
export function printResult(data, columns, opts = {}) {
|
|
32
|
+
if (opts.json) {
|
|
33
|
+
process.stdout.write(`${formatJson(data)}\n`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (Array.isArray(data) && data.length === 0) {
|
|
37
|
+
process.stdout.write(chalk.dim('(no results)\n'));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const rows = Array.isArray(data) ? data : [data];
|
|
41
|
+
process.stdout.write(`${formatTable(rows, columns)}\n`);
|
|
42
|
+
}
|
|
43
|
+
export function printJson(data) {
|
|
44
|
+
process.stdout.write(`${formatJson(data)}\n`);
|
|
45
|
+
}
|
|
46
|
+
export function printMessage(msg, opts = {}) {
|
|
47
|
+
if (opts.json) {
|
|
48
|
+
process.stdout.write(`${formatJson({ ok: true, message: msg })}\n`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
process.stdout.write(`${msg}\n`);
|
|
52
|
+
}
|
|
53
|
+
export function printError(err, opts = {}) {
|
|
54
|
+
if (opts.json) {
|
|
55
|
+
process.stderr.write(`${formatJson({
|
|
56
|
+
error: {
|
|
57
|
+
code: err.code ?? 'unknown',
|
|
58
|
+
message: err.message,
|
|
59
|
+
requestId: err.requestId,
|
|
60
|
+
},
|
|
61
|
+
})}\n`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
process.stderr.write(`${chalk.red(`Error: ${err.code ?? 'error'} — ${err.message}`)}\n`);
|
|
65
|
+
if (err.requestId) {
|
|
66
|
+
process.stderr.write(`${chalk.dim(`Request ID: ${err.requestId}`)}\n`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|