@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.
Files changed (68) hide show
  1. package/bin/cli.js +2 -0
  2. package/dist/commands/addresses.d.ts +5 -0
  3. package/dist/commands/addresses.js +90 -0
  4. package/dist/commands/addresses.js.map +1 -0
  5. package/dist/commands/api-keys.d.ts +5 -0
  6. package/dist/commands/api-keys.js +78 -0
  7. package/dist/commands/api-keys.js.map +1 -0
  8. package/dist/commands/api.generated.d.ts +23 -0
  9. package/dist/commands/api.generated.js +2003 -0
  10. package/dist/commands/api.generated.js.map +1 -0
  11. package/dist/commands/audit-log.d.ts +5 -0
  12. package/dist/commands/audit-log.js +46 -0
  13. package/dist/commands/audit-log.js.map +1 -0
  14. package/dist/commands/auth.d.ts +10 -0
  15. package/dist/commands/auth.js +116 -0
  16. package/dist/commands/auth.js.map +1 -0
  17. package/dist/commands/billing.d.ts +5 -0
  18. package/dist/commands/billing.js +144 -0
  19. package/dist/commands/billing.js.map +1 -0
  20. package/dist/commands/deliveries.d.ts +5 -0
  21. package/dist/commands/deliveries.js +77 -0
  22. package/dist/commands/deliveries.js.map +1 -0
  23. package/dist/commands/integrations.d.ts +5 -0
  24. package/dist/commands/integrations.js +24 -0
  25. package/dist/commands/integrations.js.map +1 -0
  26. package/dist/commands/licenses.d.ts +5 -0
  27. package/dist/commands/licenses.js +142 -0
  28. package/dist/commands/licenses.js.map +1 -0
  29. package/dist/commands/products.d.ts +12 -0
  30. package/dist/commands/products.js +244 -0
  31. package/dist/commands/products.js.map +1 -0
  32. package/dist/commands/shipments.d.ts +6 -0
  33. package/dist/commands/shipments.js +108 -0
  34. package/dist/commands/shipments.js.map +1 -0
  35. package/dist/commands/shipping.d.ts +2 -0
  36. package/dist/commands/shipping.js +269 -0
  37. package/dist/commands/shipping.js.map +1 -0
  38. package/dist/commands/stats.d.ts +5 -0
  39. package/dist/commands/stats.js +24 -0
  40. package/dist/commands/stats.js.map +1 -0
  41. package/dist/commands/stock.d.ts +5 -0
  42. package/dist/commands/stock.js +112 -0
  43. package/dist/commands/stock.js.map +1 -0
  44. package/dist/commands/warehouses.d.ts +5 -0
  45. package/dist/commands/warehouses.js +111 -0
  46. package/dist/commands/warehouses.js.map +1 -0
  47. package/dist/commands/webhooks.d.ts +5 -0
  48. package/dist/commands/webhooks.js +125 -0
  49. package/dist/commands/webhooks.js.map +1 -0
  50. package/dist/index.d.ts +14 -0
  51. package/dist/index.js +77 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/lib/apigen-call.d.ts +4 -0
  54. package/dist/lib/apigen-call.js +34 -0
  55. package/dist/lib/apigen-call.js.map +1 -0
  56. package/dist/lib/client.d.ts +21 -0
  57. package/dist/lib/client.js +41 -0
  58. package/dist/lib/client.js.map +1 -0
  59. package/dist/lib/credentials.d.ts +25 -0
  60. package/dist/lib/credentials.js +158 -0
  61. package/dist/lib/credentials.js.map +1 -0
  62. package/dist/lib/output.d.ts +19 -0
  63. package/dist/lib/output.js +69 -0
  64. package/dist/lib/output.js.map +1 -0
  65. package/dist/lib/util.d.ts +18 -0
  66. package/dist/lib/util.js +65 -0
  67. package/dist/lib/util.js.map +1 -0
  68. package/package.json +35 -0
@@ -0,0 +1,269 @@
1
+ /**
2
+ * `fulkruma shipping …` — couriers, origin, set-origin, rates, config,
3
+ * track, label, cancel, areas.
4
+ *
5
+ * The SDK only types couriers/origin/setOrigin/rates. For
6
+ * `config`/`track`/`label`/`cancel`/`areas` we fall through to
7
+ * `client.request<T>({ method, path })` since the SDK doesn't expose
8
+ * dedicated helpers yet.
9
+ */
10
+ import { writeFileSync } from 'node:fs';
11
+ import { Command } from 'commander';
12
+ import { getClient } from '../lib/client.js';
13
+ import { formatOpts, getGlobalOpts, handleError, parseBody } from '../lib/util.js';
14
+ import { printJson, printResult } from '../lib/output.js';
15
+ export const shippingCommand = new Command('shipping').description('Shipping origin, couriers, rates');
16
+ shippingCommand
17
+ .command('couriers')
18
+ .description('List supported couriers')
19
+ .action(async (_options, cmd) => {
20
+ const g = getGlobalOpts(cmd);
21
+ try {
22
+ const client = getClient(g);
23
+ const couriers = await client.shipping.couriers();
24
+ // courier payload is provider-defined; render JSON in both modes for fidelity.
25
+ if (g.json) {
26
+ printJson(couriers);
27
+ }
28
+ else {
29
+ const rows = couriers ?? [];
30
+ printResult(rows, [
31
+ { header: 'Code', accessor: (r) => r['courier_code'] ?? r['code'] },
32
+ { header: 'Name', accessor: (r) => r['courier_name'] ?? r['name'] },
33
+ { header: 'Service', accessor: (r) => r['courier_service_code'] ?? r['service'] },
34
+ { header: 'Type', accessor: (r) => r['courier_service_name'] ?? r['type'] },
35
+ ], formatOpts(g));
36
+ }
37
+ process.exit(0);
38
+ }
39
+ catch (err) {
40
+ handleError(err, g);
41
+ }
42
+ });
43
+ shippingCommand
44
+ .command('origin')
45
+ .description('Show the configured origin location')
46
+ .action(async (_options, cmd) => {
47
+ const g = getGlobalOpts(cmd);
48
+ try {
49
+ const client = getClient(g);
50
+ const origin = await client.shipping.origin();
51
+ printJson(origin);
52
+ process.exit(0);
53
+ }
54
+ catch (err) {
55
+ handleError(err, g);
56
+ }
57
+ });
58
+ shippingCommand
59
+ .command('set-origin')
60
+ .description('Set the origin location (use --body for the JSON payload)')
61
+ .requiredOption('--body <json>', 'origin payload (inline JSON, @file, or "-")')
62
+ .action(async (options, cmd) => {
63
+ const g = getGlobalOpts(cmd);
64
+ try {
65
+ const client = getClient(g);
66
+ const body = parseBody(options.body);
67
+ if (!body)
68
+ throw new Error('--body is required');
69
+ const result = await client.shipping.setOrigin(body);
70
+ printJson(result);
71
+ process.exit(0);
72
+ }
73
+ catch (err) {
74
+ handleError(err, g);
75
+ }
76
+ });
77
+ shippingCommand
78
+ .command('rates')
79
+ .description('Compute shipping rates for a destination + items (use --body)')
80
+ .requiredOption('--body <json>', 'rates payload (inline JSON, @file, or "-")')
81
+ .action(async (options, cmd) => {
82
+ const g = getGlobalOpts(cmd);
83
+ try {
84
+ const client = getClient(g);
85
+ const body = parseBody(options.body);
86
+ if (!body)
87
+ throw new Error('--body is required');
88
+ const result = await client.shipping.rates(body);
89
+ printJson(result);
90
+ process.exit(0);
91
+ }
92
+ catch (err) {
93
+ handleError(err, g);
94
+ }
95
+ });
96
+ // ─── Advanced shipping (SDK passthrough via client.request) ────
97
+ const configCommand = new Command('config').description('Shipping account configuration');
98
+ configCommand
99
+ .command('get')
100
+ .description('Get current shipping config (GET /api/v1/shipping/config)')
101
+ .action(async (_options, cmd) => {
102
+ const g = getGlobalOpts(cmd);
103
+ try {
104
+ const client = getClient(g);
105
+ const result = await client.request({
106
+ method: 'GET',
107
+ path: '/api/v1/shipping/config',
108
+ });
109
+ printJson(result);
110
+ process.exit(0);
111
+ }
112
+ catch (err) {
113
+ handleError(err, g);
114
+ }
115
+ });
116
+ configCommand
117
+ .command('update')
118
+ .description('Update shipping config (PUT /api/v1/shipping/config)')
119
+ .requiredOption('--body <json>', 'config payload (inline JSON, @file, or "-")')
120
+ .action(async (options, cmd) => {
121
+ const g = getGlobalOpts(cmd);
122
+ try {
123
+ const client = getClient(g);
124
+ const body = parseBody(options.body);
125
+ if (!body)
126
+ throw new Error('--body is required');
127
+ const result = await client.request({
128
+ method: 'PUT',
129
+ path: '/api/v1/shipping/config',
130
+ body,
131
+ });
132
+ printJson(result);
133
+ process.exit(0);
134
+ }
135
+ catch (err) {
136
+ handleError(err, g);
137
+ }
138
+ });
139
+ shippingCommand.addCommand(configCommand);
140
+ shippingCommand
141
+ .command('track <waybill>')
142
+ .description('Track a shipment by waybill (GET /api/v1/shipping/track/:waybill)')
143
+ .action(async (waybill, _options, cmd) => {
144
+ const g = getGlobalOpts(cmd);
145
+ try {
146
+ const client = getClient(g);
147
+ const result = await client.request({
148
+ method: 'GET',
149
+ path: `/api/v1/shipping/track/${encodeURIComponent(waybill)}`,
150
+ });
151
+ printJson(result);
152
+ process.exit(0);
153
+ }
154
+ catch (err) {
155
+ handleError(err, g);
156
+ }
157
+ });
158
+ shippingCommand
159
+ .command('label <shipment-id>')
160
+ .description('Fetch a shipping label. If the response is a JSON envelope with a URL, ' +
161
+ 'prints the URL; otherwise writes binary to --out or stdout.')
162
+ .option('--out <file>', 'write the label binary to this file path')
163
+ .action(async (shipmentId, options, cmd) => {
164
+ const g = getGlobalOpts(cmd);
165
+ try {
166
+ const client = getClient(g);
167
+ // We don't know whether the backend returns JSON or binary here.
168
+ // Try JSON first (most Forjio routes do); fall back to a separate
169
+ // request flag if request<T> throws on non-JSON. The SDK's request
170
+ // method assumes JSON envelopes, so binary endpoints would need a
171
+ // raw fetch — we treat this as JSON-with-URL by convention for now
172
+ // and document the fallback.
173
+ const result = await client.request({
174
+ method: 'GET',
175
+ path: `/api/v1/shipping/shipments/${encodeURIComponent(shipmentId)}/label`,
176
+ });
177
+ const url = result.url ?? result.labelUrl;
178
+ if (url) {
179
+ if (g.json) {
180
+ printJson(result);
181
+ }
182
+ else {
183
+ process.stdout.write(`${url}\n`);
184
+ }
185
+ process.exit(0);
186
+ }
187
+ // Inline base64 data fallback — write binary to file or stdout.
188
+ if (result.data) {
189
+ const buf = Buffer.from(result.data, 'base64');
190
+ if (options.out) {
191
+ writeFileSync(options.out, buf);
192
+ if (!g.json)
193
+ process.stdout.write(`label written to ${options.out}\n`);
194
+ else
195
+ printJson({ ok: true, file: options.out, bytes: buf.length });
196
+ }
197
+ else {
198
+ process.stdout.write(buf);
199
+ }
200
+ process.exit(0);
201
+ }
202
+ // Unknown shape — emit raw response for inspection.
203
+ printJson(result);
204
+ process.exit(0);
205
+ }
206
+ catch (err) {
207
+ handleError(err, g);
208
+ }
209
+ });
210
+ shippingCommand
211
+ .command('cancel <shipment-id>')
212
+ .description('Cancel a shipment (POST /api/v1/shipping/shipments/:id/cancel)')
213
+ .option('--reason <text>', 'cancellation reason')
214
+ .action(async (shipmentId, options, cmd) => {
215
+ const g = getGlobalOpts(cmd);
216
+ try {
217
+ const client = getClient(g);
218
+ const body = {};
219
+ if (options.reason)
220
+ body['reason'] = options.reason;
221
+ const result = await client.request({
222
+ method: 'POST',
223
+ path: `/api/v1/shipping/shipments/${encodeURIComponent(shipmentId)}/cancel`,
224
+ body,
225
+ });
226
+ printJson(result);
227
+ process.exit(0);
228
+ }
229
+ catch (err) {
230
+ handleError(err, g);
231
+ }
232
+ });
233
+ shippingCommand
234
+ .command('areas')
235
+ .description('Look up shipping areas (GET /api/v1/shipping/areas)')
236
+ .option('--keyword <q>', 'search keyword (city, postcode, area name)')
237
+ .action(async (options, cmd) => {
238
+ const g = getGlobalOpts(cmd);
239
+ try {
240
+ const client = getClient(g);
241
+ const qs = options.keyword
242
+ ? `?keyword=${encodeURIComponent(options.keyword)}`
243
+ : '';
244
+ const result = await client.request({
245
+ method: 'GET',
246
+ path: `/api/v1/shipping/areas${qs}`,
247
+ });
248
+ if (g.json) {
249
+ printJson(result);
250
+ }
251
+ else {
252
+ const rows = result.areas ?? [];
253
+ printResult(rows, [
254
+ { header: 'ID', accessor: (r) => r['id'] ?? r['area_id'] },
255
+ { header: 'Name', accessor: (r) => r['name'] ?? r['area_name'] },
256
+ { header: 'City', accessor: (r) => r['city'] ?? r['city_name'] },
257
+ {
258
+ header: 'Postal',
259
+ accessor: (r) => r['postalCode'] ?? r['postal_code'],
260
+ },
261
+ ], formatOpts(g));
262
+ }
263
+ process.exit(0);
264
+ }
265
+ catch (err) {
266
+ handleError(err, g);
267
+ }
268
+ });
269
+ //# sourceMappingURL=shipping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipping.js","sourceRoot":"","sources":["../../src/commands/shipping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `fulkruma stats …` — overview counters + recent activity.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const statsCommand: Command;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `fulkruma stats …` — overview counters + recent activity.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { getClient } from '../lib/client.js';
6
+ import { getGlobalOpts, handleError } from '../lib/util.js';
7
+ import { printJson } from '../lib/output.js';
8
+ export const statsCommand = new Command('stats').description('Aggregate counters and recent activity');
9
+ statsCommand
10
+ .command('overview')
11
+ .description('Show stats overview')
12
+ .action(async (_options, cmd) => {
13
+ const g = getGlobalOpts(cmd);
14
+ try {
15
+ const client = getClient(g);
16
+ const overview = await client.stats.overview();
17
+ printJson(overview);
18
+ process.exit(0);
19
+ }
20
+ catch (err) {
21
+ handleError(err, g);
22
+ }
23
+ });
24
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,wCAAwC,CAAC,CAAC;AAEvG,YAAY;KACT,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE;IAC9B,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/C,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpB,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,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `fulkruma stock …` — levels, movements, reservations, adjust.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const stockCommand: Command;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * `fulkruma stock …` — levels, movements, reservations, adjust.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { getClient } from '../lib/client.js';
6
+ import { formatOpts, getGlobalOpts, handleError, parseIntArg } from '../lib/util.js';
7
+ import { printResult } from '../lib/output.js';
8
+ const levelColumns = [
9
+ { header: 'Variant', accessor: (s) => s.variantId },
10
+ { header: 'Warehouse', accessor: (s) => s.warehouse?.name ?? s.warehouseId },
11
+ { header: 'Qty', accessor: (s) => s.quantity },
12
+ { header: 'Updated', accessor: (s) => s.updatedAt },
13
+ ];
14
+ const movementColumns = [
15
+ { header: 'ID', accessor: (m) => m.id },
16
+ { header: 'Variant', accessor: (m) => m.variantId },
17
+ { header: 'Warehouse', accessor: (m) => m.warehouseId },
18
+ { header: 'Δ', accessor: (m) => m.delta },
19
+ { header: 'Reason', accessor: (m) => m.reason },
20
+ { header: 'Note', accessor: (m) => m.note },
21
+ { header: 'At', accessor: (m) => m.createdAt },
22
+ ];
23
+ const reservationColumns = [
24
+ { header: 'ID', accessor: (r) => r.id },
25
+ { header: 'Variant', accessor: (r) => r.variantId },
26
+ { header: 'Warehouse', accessor: (r) => r.warehouseId },
27
+ { header: 'Qty', accessor: (r) => r.quantity },
28
+ { header: 'Checkout', accessor: (r) => r.checkoutSessionId },
29
+ { header: 'Expires', accessor: (r) => r.expiresAt },
30
+ ];
31
+ export const stockCommand = new Command('stock').description('Inventory levels, movements, reservations');
32
+ stockCommand
33
+ .command('levels')
34
+ .description('Show stock levels')
35
+ .option('--variant-id <id>', 'filter to a single variant')
36
+ .action(async (options, cmd) => {
37
+ const g = getGlobalOpts(cmd);
38
+ try {
39
+ const client = getClient(g);
40
+ const { stock } = await client.stock.levels(options.variantId ? { variant_id: options.variantId } : undefined);
41
+ printResult(stock, levelColumns, formatOpts(g));
42
+ process.exit(0);
43
+ }
44
+ catch (err) {
45
+ handleError(err, g);
46
+ }
47
+ });
48
+ stockCommand
49
+ .command('movements')
50
+ .description('Show stock movements')
51
+ .option('--variant-id <id>', 'filter to a single variant')
52
+ .action(async (options, cmd) => {
53
+ const g = getGlobalOpts(cmd);
54
+ try {
55
+ const client = getClient(g);
56
+ const { movements } = await client.stock.movements(options.variantId ? { variant_id: options.variantId } : undefined);
57
+ printResult(movements, movementColumns, formatOpts(g));
58
+ process.exit(0);
59
+ }
60
+ catch (err) {
61
+ handleError(err, g);
62
+ }
63
+ });
64
+ stockCommand
65
+ .command('reservations')
66
+ .description('Show outstanding stock reservations')
67
+ .action(async (_options, cmd) => {
68
+ const g = getGlobalOpts(cmd);
69
+ try {
70
+ const client = getClient(g);
71
+ const { reservations } = await client.stock.reservations();
72
+ printResult(reservations, reservationColumns, formatOpts(g));
73
+ process.exit(0);
74
+ }
75
+ catch (err) {
76
+ handleError(err, g);
77
+ }
78
+ });
79
+ const adjustCmd = stockCommand
80
+ .command('adjust <variantId> <warehouseId> <delta>')
81
+ .description('Adjust stock for a variant in a warehouse. <delta> is a signed integer ' +
82
+ '(positive to add, negative to remove).')
83
+ .requiredOption('--reason <reason>', 'reason: manual_adjust|initial_stock|damaged|returned_to_supplier|import|transfer_in|transfer_out')
84
+ .option('--note <text>', 'optional human-readable note');
85
+ // allow negative-number positional delta (commander treats leading `-` as flag by default)
86
+ adjustCmd.configureHelp({ showGlobalOptions: false });
87
+ adjustCmd.action(async (variantId, warehouseId, delta, options, cmd) => {
88
+ const g = getGlobalOpts(cmd);
89
+ try {
90
+ const client = getClient(g);
91
+ const result = await client.stock.adjust({
92
+ variantId,
93
+ warehouseId,
94
+ delta: parseIntArg(delta),
95
+ reason: options.reason,
96
+ note: options.note,
97
+ });
98
+ printResult(result, [
99
+ { header: 'Variant', accessor: (r) => r.stock.variantId },
100
+ { header: 'Warehouse', accessor: (r) => r.stock.warehouseId },
101
+ { header: 'New Qty', accessor: (r) => r.stock.quantity },
102
+ { header: 'Movement', accessor: (r) => r.movement.id },
103
+ { header: 'Δ', accessor: (r) => r.movement.delta },
104
+ { header: 'Reason', accessor: (r) => r.movement.reason },
105
+ ], formatOpts(g));
106
+ process.exit(0);
107
+ }
108
+ catch (err) {
109
+ handleError(err, g);
110
+ }
111
+ });
112
+ //# sourceMappingURL=stock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock.js","sourceRoot":"","sources":["../../src/commands/stock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `fulkruma warehouses …` — list, create, update, archive.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const warehousesCommand: Command;
@@ -0,0 +1,111 @@
1
+ /**
2
+ * `fulkruma warehouses …` — list, create, update, archive.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { getClient } from '../lib/client.js';
6
+ import { formatOpts, getGlobalOpts, handleError } from '../lib/util.js';
7
+ import { printResult } from '../lib/output.js';
8
+ const warehouseColumns = [
9
+ { header: 'ID', accessor: (w) => w.id },
10
+ { header: 'Name', accessor: (w) => w.name },
11
+ { header: 'City', accessor: (w) => w.city },
12
+ { header: 'Postal', accessor: (w) => w.postal },
13
+ { header: 'Default', accessor: (w) => w.isDefault },
14
+ { header: 'Archived', accessor: (w) => w.archived },
15
+ ];
16
+ export const warehousesCommand = new Command('warehouses').description('Manage warehouses');
17
+ warehousesCommand
18
+ .command('list')
19
+ .description('List warehouses')
20
+ .action(async (_options, cmd) => {
21
+ const g = getGlobalOpts(cmd);
22
+ try {
23
+ const client = getClient(g);
24
+ const { warehouses } = await client.warehouses.list();
25
+ printResult(warehouses, warehouseColumns, formatOpts(g));
26
+ process.exit(0);
27
+ }
28
+ catch (err) {
29
+ handleError(err, g);
30
+ }
31
+ });
32
+ warehousesCommand
33
+ .command('create')
34
+ .description('Create a warehouse')
35
+ .requiredOption('--name <name>', 'warehouse name')
36
+ .option('--address <text>', 'street address')
37
+ .option('--city <city>', 'city')
38
+ .option('--postal <code>', 'postal code')
39
+ .option('--phone <phone>', 'phone number')
40
+ .option('--lat <number>', 'latitude', (v) => Number.parseFloat(v))
41
+ .option('--lng <number>', 'longitude', (v) => Number.parseFloat(v))
42
+ .option('--default', 'set as default warehouse')
43
+ .action(async (options, cmd) => {
44
+ const g = getGlobalOpts(cmd);
45
+ try {
46
+ const client = getClient(g);
47
+ const { warehouse } = await client.warehouses.create({
48
+ name: options['name'],
49
+ address: options['address'],
50
+ city: options['city'],
51
+ postal: options['postal'],
52
+ phone: options['phone'],
53
+ lat: options['lat'],
54
+ lng: options['lng'],
55
+ isDefault: options['default'],
56
+ });
57
+ printResult(warehouse, warehouseColumns, formatOpts(g));
58
+ process.exit(0);
59
+ }
60
+ catch (err) {
61
+ handleError(err, g);
62
+ }
63
+ });
64
+ warehousesCommand
65
+ .command('update <id>')
66
+ .description('Update a warehouse')
67
+ .option('--name <name>', 'warehouse name')
68
+ .option('--address <text>', 'street address')
69
+ .option('--city <city>', 'city')
70
+ .option('--postal <code>', 'postal code')
71
+ .option('--phone <phone>', 'phone number')
72
+ .option('--default <bool>', 'set as default (true|false)')
73
+ .action(async (id, options, cmd) => {
74
+ const g = getGlobalOpts(cmd);
75
+ try {
76
+ const client = getClient(g);
77
+ const patch = {};
78
+ for (const k of ['name', 'address', 'city', 'postal', 'phone']) {
79
+ if (options[k] !== undefined)
80
+ patch[k] = options[k];
81
+ }
82
+ if (options['default'] !== undefined) {
83
+ patch['isDefault'] = options['default'] === 'true' || options['default'] === true;
84
+ }
85
+ const { warehouse } = await client.warehouses.update(id, patch);
86
+ printResult(warehouse, warehouseColumns, formatOpts(g));
87
+ process.exit(0);
88
+ }
89
+ catch (err) {
90
+ handleError(err, g);
91
+ }
92
+ });
93
+ warehousesCommand
94
+ .command('archive <id>')
95
+ .description('Archive a warehouse')
96
+ .action(async (id, _options, cmd) => {
97
+ const g = getGlobalOpts(cmd);
98
+ try {
99
+ const client = getClient(g);
100
+ const result = await client.warehouses.archive(id);
101
+ printResult({ id, archived: result.archived }, [
102
+ { header: 'ID', accessor: (r) => r.id },
103
+ { header: 'Archived', accessor: (r) => r.archived },
104
+ ], formatOpts(g));
105
+ process.exit(0);
106
+ }
107
+ catch (err) {
108
+ handleError(err, g);
109
+ }
110
+ });
111
+ //# sourceMappingURL=warehouses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warehouses.js","sourceRoot":"","sources":["../../src/commands/warehouses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `fulkruma webhooks …` — endpoints (list/create/update/delete) + events list.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const webhooksCommand: Command;