@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,2003 @@
1
+ // Generated by apigen cli from backend/openapi.json — do not edit by hand.
2
+ // Every feature route as `api <area> <action>`; the call goes through callRoute
3
+ // (cli/src/lib/apigen-call.ts), which uses this CLI's own sign-in and client, and bad
4
+ // input through failRoute (the CLI's own error output).
5
+ import { Command } from 'commander';
6
+ import { callRoute, failRoute } from '../lib/apigen-call.js';
7
+ export const API_ROUTES = [
8
+ {
9
+ "area": "addresses",
10
+ "routes": [
11
+ {
12
+ "name": "create",
13
+ "method": "POST",
14
+ "path": "/api/v1/addresses",
15
+ "summary": "Create an address",
16
+ "pathParams": [],
17
+ "query": [],
18
+ "body": [
19
+ {
20
+ "name": "customerId",
21
+ "kind": "string",
22
+ "required": true
23
+ },
24
+ {
25
+ "name": "label",
26
+ "kind": "string",
27
+ "required": true
28
+ },
29
+ {
30
+ "name": "contactName",
31
+ "kind": "string",
32
+ "required": true
33
+ },
34
+ {
35
+ "name": "contactPhone",
36
+ "kind": "string",
37
+ "required": true
38
+ },
39
+ {
40
+ "name": "email",
41
+ "kind": "string",
42
+ "required": false
43
+ },
44
+ {
45
+ "name": "address",
46
+ "kind": "string",
47
+ "required": true
48
+ },
49
+ {
50
+ "name": "note",
51
+ "kind": "string",
52
+ "required": false
53
+ },
54
+ {
55
+ "name": "postalCode",
56
+ "kind": "string",
57
+ "required": false
58
+ },
59
+ {
60
+ "name": "areaId",
61
+ "kind": "string",
62
+ "required": false
63
+ },
64
+ {
65
+ "name": "lat",
66
+ "kind": "number",
67
+ "required": false
68
+ },
69
+ {
70
+ "name": "lng",
71
+ "kind": "number",
72
+ "required": false
73
+ },
74
+ {
75
+ "name": "isDefault",
76
+ "kind": "boolean",
77
+ "required": false
78
+ }
79
+ ]
80
+ },
81
+ {
82
+ "name": "delete",
83
+ "method": "DELETE",
84
+ "path": "/api/v1/addresses/{id}",
85
+ "summary": "Delete an address",
86
+ "pathParams": [
87
+ "id"
88
+ ],
89
+ "query": [],
90
+ "body": null
91
+ },
92
+ {
93
+ "name": "list",
94
+ "method": "GET",
95
+ "path": "/api/v1/addresses",
96
+ "summary": "List addresses",
97
+ "pathParams": [],
98
+ "query": [
99
+ {
100
+ "name": "customer_id",
101
+ "kind": "string",
102
+ "required": false
103
+ }
104
+ ],
105
+ "body": null
106
+ },
107
+ {
108
+ "name": "update",
109
+ "method": "PATCH",
110
+ "path": "/api/v1/addresses/{id}",
111
+ "summary": "Update an address",
112
+ "pathParams": [
113
+ "id"
114
+ ],
115
+ "query": [],
116
+ "body": [
117
+ {
118
+ "name": "label",
119
+ "kind": "string",
120
+ "required": false
121
+ },
122
+ {
123
+ "name": "contactName",
124
+ "kind": "string",
125
+ "required": false
126
+ },
127
+ {
128
+ "name": "contactPhone",
129
+ "kind": "string",
130
+ "required": false
131
+ },
132
+ {
133
+ "name": "email",
134
+ "kind": "string",
135
+ "required": false
136
+ },
137
+ {
138
+ "name": "address",
139
+ "kind": "string",
140
+ "required": false
141
+ },
142
+ {
143
+ "name": "note",
144
+ "kind": "string",
145
+ "required": false
146
+ },
147
+ {
148
+ "name": "postalCode",
149
+ "kind": "string",
150
+ "required": false
151
+ },
152
+ {
153
+ "name": "areaId",
154
+ "kind": "string",
155
+ "required": false
156
+ },
157
+ {
158
+ "name": "lat",
159
+ "kind": "number",
160
+ "required": false
161
+ },
162
+ {
163
+ "name": "lng",
164
+ "kind": "number",
165
+ "required": false
166
+ },
167
+ {
168
+ "name": "isDefault",
169
+ "kind": "boolean",
170
+ "required": false
171
+ }
172
+ ]
173
+ }
174
+ ]
175
+ },
176
+ {
177
+ "area": "api-keys",
178
+ "routes": [
179
+ {
180
+ "name": "create",
181
+ "method": "POST",
182
+ "path": "/api/v1/api-keys",
183
+ "summary": "Create an api key",
184
+ "pathParams": [],
185
+ "query": [],
186
+ "body": [
187
+ {
188
+ "name": "name",
189
+ "kind": "string",
190
+ "required": true
191
+ },
192
+ {
193
+ "name": "scopes",
194
+ "kind": "array",
195
+ "required": false
196
+ }
197
+ ]
198
+ },
199
+ {
200
+ "name": "list",
201
+ "method": "GET",
202
+ "path": "/api/v1/api-keys",
203
+ "summary": "List api keys",
204
+ "pathParams": [],
205
+ "query": [],
206
+ "body": null
207
+ },
208
+ {
209
+ "name": "revoke",
210
+ "method": "POST",
211
+ "path": "/api/v1/api-keys/{id}/revoke",
212
+ "summary": "Revoke an api key",
213
+ "pathParams": [
214
+ "id"
215
+ ],
216
+ "query": [],
217
+ "body": null
218
+ }
219
+ ]
220
+ },
221
+ {
222
+ "area": "audit-log",
223
+ "routes": [
224
+ {
225
+ "name": "list",
226
+ "method": "GET",
227
+ "path": "/api/v1/audit-log",
228
+ "summary": "List audit log",
229
+ "pathParams": [],
230
+ "query": [
231
+ {
232
+ "name": "action",
233
+ "kind": "string",
234
+ "required": false
235
+ },
236
+ {
237
+ "name": "limit",
238
+ "kind": "string",
239
+ "required": false
240
+ },
241
+ {
242
+ "name": "target_type",
243
+ "kind": "string",
244
+ "required": false
245
+ }
246
+ ],
247
+ "body": null
248
+ }
249
+ ]
250
+ },
251
+ {
252
+ "area": "billing",
253
+ "routes": [
254
+ {
255
+ "name": "cancel",
256
+ "method": "POST",
257
+ "path": "/api/v1/billing/cancel",
258
+ "summary": "Create a cancel",
259
+ "pathParams": [],
260
+ "query": [],
261
+ "body": []
262
+ },
263
+ {
264
+ "name": "checkout",
265
+ "method": "POST",
266
+ "path": "/api/v1/billing/checkout",
267
+ "summary": "Create a checkout",
268
+ "pathParams": [],
269
+ "query": [],
270
+ "body": [
271
+ {
272
+ "name": "plan",
273
+ "kind": "string",
274
+ "required": true,
275
+ "choices": [
276
+ "STARTER",
277
+ "GROWTH",
278
+ "SCALE"
279
+ ]
280
+ },
281
+ {
282
+ "name": "email",
283
+ "kind": "string",
284
+ "required": false
285
+ },
286
+ {
287
+ "name": "name",
288
+ "kind": "string",
289
+ "required": false
290
+ }
291
+ ]
292
+ },
293
+ {
294
+ "name": "invoices",
295
+ "method": "GET",
296
+ "path": "/api/v1/billing/invoices",
297
+ "summary": "List invoices",
298
+ "pathParams": [],
299
+ "query": [
300
+ {
301
+ "name": "cursor",
302
+ "kind": "string",
303
+ "required": false
304
+ },
305
+ {
306
+ "name": "limit",
307
+ "kind": "string",
308
+ "required": false
309
+ }
310
+ ],
311
+ "body": null
312
+ },
313
+ {
314
+ "name": "plan",
315
+ "method": "GET",
316
+ "path": "/api/v1/billing/plan",
317
+ "summary": "List plan",
318
+ "pathParams": [],
319
+ "query": [],
320
+ "body": null
321
+ },
322
+ {
323
+ "name": "plans",
324
+ "method": "GET",
325
+ "path": "/api/v1/billing/plans",
326
+ "summary": "Public, no auth.",
327
+ "pathParams": [],
328
+ "query": [],
329
+ "body": null
330
+ },
331
+ {
332
+ "name": "subscription",
333
+ "method": "GET",
334
+ "path": "/api/v1/billing/subscription",
335
+ "summary": "List subscription",
336
+ "pathParams": [],
337
+ "query": [],
338
+ "body": null
339
+ },
340
+ {
341
+ "name": "usage",
342
+ "method": "GET",
343
+ "path": "/api/v1/billing/usage",
344
+ "summary": "List usage",
345
+ "pathParams": [],
346
+ "query": [],
347
+ "body": null
348
+ }
349
+ ]
350
+ },
351
+ {
352
+ "area": "deliveries",
353
+ "routes": [
354
+ {
355
+ "name": "create",
356
+ "method": "POST",
357
+ "path": "/api/v1/deliveries",
358
+ "summary": "Create a delivery",
359
+ "pathParams": [],
360
+ "query": [],
361
+ "body": [
362
+ {
363
+ "name": "productId",
364
+ "kind": "string",
365
+ "required": true
366
+ },
367
+ {
368
+ "name": "customerId",
369
+ "kind": "string",
370
+ "required": true
371
+ },
372
+ {
373
+ "name": "checkoutSessionId",
374
+ "kind": "string",
375
+ "required": true
376
+ },
377
+ {
378
+ "name": "maxDownloads",
379
+ "kind": "number",
380
+ "required": false
381
+ },
382
+ {
383
+ "name": "expiresAt",
384
+ "kind": "string",
385
+ "required": false
386
+ },
387
+ {
388
+ "name": "externalSource",
389
+ "kind": "string",
390
+ "required": false
391
+ },
392
+ {
393
+ "name": "externalRef",
394
+ "kind": "string",
395
+ "required": false
396
+ }
397
+ ]
398
+ },
399
+ {
400
+ "name": "extend",
401
+ "method": "POST",
402
+ "path": "/api/v1/deliveries/{id}/extend",
403
+ "summary": "Extend the download window 30 days (from now, or the current expiry).",
404
+ "pathParams": [
405
+ "id"
406
+ ],
407
+ "query": [],
408
+ "body": null
409
+ },
410
+ {
411
+ "name": "get",
412
+ "method": "GET",
413
+ "path": "/api/v1/deliveries/{id}",
414
+ "summary": "Get a delivery",
415
+ "pathParams": [
416
+ "id"
417
+ ],
418
+ "query": [],
419
+ "body": null
420
+ },
421
+ {
422
+ "name": "list",
423
+ "method": "GET",
424
+ "path": "/api/v1/deliveries",
425
+ "summary": "List deliveries",
426
+ "pathParams": [],
427
+ "query": [],
428
+ "body": null
429
+ },
430
+ {
431
+ "name": "reset-downloads",
432
+ "method": "POST",
433
+ "path": "/api/v1/deliveries/{id}/reset-downloads",
434
+ "summary": "Reset the download counter so the buyer can download again.",
435
+ "pathParams": [
436
+ "id"
437
+ ],
438
+ "query": [],
439
+ "body": null
440
+ },
441
+ {
442
+ "name": "revoke",
443
+ "method": "POST",
444
+ "path": "/api/v1/deliveries/{id}/revoke",
445
+ "summary": "Revoke: expire the delivery now.",
446
+ "pathParams": [
447
+ "id"
448
+ ],
449
+ "query": [],
450
+ "body": null
451
+ }
452
+ ]
453
+ },
454
+ {
455
+ "area": "integrations",
456
+ "routes": [
457
+ {
458
+ "name": "status",
459
+ "method": "GET",
460
+ "path": "/api/v1/integrations/status",
461
+ "summary": "List status",
462
+ "pathParams": [],
463
+ "query": [],
464
+ "body": null
465
+ }
466
+ ]
467
+ },
468
+ {
469
+ "area": "licenses",
470
+ "routes": [
471
+ {
472
+ "name": "activate",
473
+ "method": "POST",
474
+ "path": "/api/v1/licenses/activate",
475
+ "summary": "/v1/licenses/activate is unauthenticated — buyers' apps call this with the license key directly.",
476
+ "pathParams": [],
477
+ "query": [],
478
+ "body": [
479
+ {
480
+ "name": "key",
481
+ "kind": "string",
482
+ "required": true
483
+ },
484
+ {
485
+ "name": "instanceId",
486
+ "kind": "string",
487
+ "required": true
488
+ }
489
+ ]
490
+ },
491
+ {
492
+ "name": "create",
493
+ "method": "POST",
494
+ "path": "/api/v1/licenses",
495
+ "summary": "Create a license",
496
+ "pathParams": [],
497
+ "query": [],
498
+ "body": [
499
+ {
500
+ "name": "productId",
501
+ "kind": "string",
502
+ "required": true
503
+ },
504
+ {
505
+ "name": "customerId",
506
+ "kind": "string",
507
+ "required": true
508
+ },
509
+ {
510
+ "name": "maxActivations",
511
+ "kind": "number",
512
+ "required": false
513
+ },
514
+ {
515
+ "name": "expiresAt",
516
+ "kind": "string",
517
+ "required": false
518
+ },
519
+ {
520
+ "name": "externalSource",
521
+ "kind": "string",
522
+ "required": false
523
+ },
524
+ {
525
+ "name": "externalRef",
526
+ "kind": "string",
527
+ "required": false
528
+ },
529
+ {
530
+ "name": "key",
531
+ "kind": "string",
532
+ "required": false
533
+ }
534
+ ]
535
+ },
536
+ {
537
+ "name": "deactivate",
538
+ "method": "POST",
539
+ "path": "/api/v1/licenses/deactivate",
540
+ "summary": "Release a previously-activated instance.",
541
+ "pathParams": [],
542
+ "query": [],
543
+ "body": [
544
+ {
545
+ "name": "key",
546
+ "kind": "string",
547
+ "required": true
548
+ },
549
+ {
550
+ "name": "instanceId",
551
+ "kind": "string",
552
+ "required": true
553
+ }
554
+ ]
555
+ },
556
+ {
557
+ "name": "list",
558
+ "method": "GET",
559
+ "path": "/api/v1/licenses",
560
+ "summary": "List licenses",
561
+ "pathParams": [],
562
+ "query": [],
563
+ "body": null
564
+ },
565
+ {
566
+ "name": "lookup",
567
+ "method": "GET",
568
+ "path": "/api/v1/licenses/lookup",
569
+ "summary": "Full license + its activation rows, resolved by key within the merchant's account.",
570
+ "pathParams": [],
571
+ "query": [
572
+ {
573
+ "name": "key",
574
+ "kind": "string",
575
+ "required": true
576
+ }
577
+ ],
578
+ "body": null
579
+ },
580
+ {
581
+ "name": "revoke",
582
+ "method": "POST",
583
+ "path": "/api/v1/licenses/{id}/revoke",
584
+ "summary": "Revoke a license",
585
+ "pathParams": [
586
+ "id"
587
+ ],
588
+ "query": [],
589
+ "body": null
590
+ },
591
+ {
592
+ "name": "validate",
593
+ "method": "GET",
594
+ "path": "/api/v1/licenses/validate",
595
+ "summary": "Public unauthenticated endpoints — buyers' software calls these with just the license key.",
596
+ "pathParams": [],
597
+ "query": [
598
+ {
599
+ "name": "key",
600
+ "kind": "string",
601
+ "required": true
602
+ },
603
+ {
604
+ "name": "productId",
605
+ "kind": "string",
606
+ "required": false
607
+ }
608
+ ],
609
+ "body": null
610
+ }
611
+ ]
612
+ },
613
+ {
614
+ "area": "products",
615
+ "routes": [
616
+ {
617
+ "name": "create",
618
+ "method": "POST",
619
+ "path": "/api/v1/products",
620
+ "summary": "Create a product",
621
+ "pathParams": [],
622
+ "query": [],
623
+ "body": [
624
+ {
625
+ "name": "name",
626
+ "kind": "string",
627
+ "required": true
628
+ },
629
+ {
630
+ "name": "sku",
631
+ "kind": "string",
632
+ "required": false
633
+ },
634
+ {
635
+ "name": "description",
636
+ "kind": "string",
637
+ "required": false
638
+ },
639
+ {
640
+ "name": "type",
641
+ "kind": "string",
642
+ "required": false,
643
+ "choices": [
644
+ "physical",
645
+ "digital",
646
+ "license"
647
+ ]
648
+ },
649
+ {
650
+ "name": "weight",
651
+ "kind": "number",
652
+ "required": false
653
+ },
654
+ {
655
+ "name": "length",
656
+ "kind": "number",
657
+ "required": false
658
+ },
659
+ {
660
+ "name": "width",
661
+ "kind": "number",
662
+ "required": false
663
+ },
664
+ {
665
+ "name": "height",
666
+ "kind": "number",
667
+ "required": false
668
+ },
669
+ {
670
+ "name": "licenseEnabled",
671
+ "kind": "boolean",
672
+ "required": false
673
+ },
674
+ {
675
+ "name": "maxActivations",
676
+ "kind": "number",
677
+ "required": false
678
+ }
679
+ ]
680
+ },
681
+ {
682
+ "name": "create-variants",
683
+ "method": "POST",
684
+ "path": "/api/v1/products/{id}/variants",
685
+ "summary": "Variants a product",
686
+ "pathParams": [
687
+ "id"
688
+ ],
689
+ "query": [],
690
+ "body": [
691
+ {
692
+ "name": "sku",
693
+ "kind": "string",
694
+ "required": false
695
+ },
696
+ {
697
+ "name": "name",
698
+ "kind": "string",
699
+ "required": true
700
+ },
701
+ {
702
+ "name": "priceCents",
703
+ "kind": "number",
704
+ "required": false
705
+ },
706
+ {
707
+ "name": "costCents",
708
+ "kind": "number",
709
+ "required": false
710
+ },
711
+ {
712
+ "name": "lowStockThreshold",
713
+ "kind": "number",
714
+ "required": false
715
+ },
716
+ {
717
+ "name": "weight",
718
+ "kind": "number",
719
+ "required": false
720
+ },
721
+ {
722
+ "name": "isDefault",
723
+ "kind": "boolean",
724
+ "required": false
725
+ }
726
+ ]
727
+ },
728
+ {
729
+ "name": "delete",
730
+ "method": "DELETE",
731
+ "path": "/api/v1/products/{id}",
732
+ "summary": "Delete a product",
733
+ "pathParams": [
734
+ "id"
735
+ ],
736
+ "query": [],
737
+ "body": null
738
+ },
739
+ {
740
+ "name": "delete-variants",
741
+ "method": "DELETE",
742
+ "path": "/api/v1/products/{id}/variants/{variantId}",
743
+ "summary": "Delete a variant",
744
+ "pathParams": [
745
+ "id",
746
+ "variantId"
747
+ ],
748
+ "query": [],
749
+ "body": null
750
+ },
751
+ {
752
+ "name": "get",
753
+ "method": "GET",
754
+ "path": "/api/v1/products/{id}",
755
+ "summary": "Get a product",
756
+ "pathParams": [
757
+ "id"
758
+ ],
759
+ "query": [],
760
+ "body": null
761
+ },
762
+ {
763
+ "name": "list",
764
+ "method": "GET",
765
+ "path": "/api/v1/products",
766
+ "summary": "List products",
767
+ "pathParams": [],
768
+ "query": [
769
+ {
770
+ "name": "archived",
771
+ "kind": "string",
772
+ "required": false
773
+ }
774
+ ],
775
+ "body": null
776
+ },
777
+ {
778
+ "name": "update",
779
+ "method": "PATCH",
780
+ "path": "/api/v1/products/{id}",
781
+ "summary": "Update a product",
782
+ "pathParams": [
783
+ "id"
784
+ ],
785
+ "query": [],
786
+ "body": [
787
+ {
788
+ "name": "name",
789
+ "kind": "string",
790
+ "required": false
791
+ },
792
+ {
793
+ "name": "sku",
794
+ "kind": "string",
795
+ "required": false
796
+ },
797
+ {
798
+ "name": "description",
799
+ "kind": "string",
800
+ "required": false
801
+ },
802
+ {
803
+ "name": "type",
804
+ "kind": "string",
805
+ "required": false,
806
+ "choices": [
807
+ "physical",
808
+ "digital",
809
+ "license"
810
+ ]
811
+ },
812
+ {
813
+ "name": "weight",
814
+ "kind": "number",
815
+ "required": false
816
+ },
817
+ {
818
+ "name": "length",
819
+ "kind": "number",
820
+ "required": false
821
+ },
822
+ {
823
+ "name": "width",
824
+ "kind": "number",
825
+ "required": false
826
+ },
827
+ {
828
+ "name": "height",
829
+ "kind": "number",
830
+ "required": false
831
+ },
832
+ {
833
+ "name": "licenseEnabled",
834
+ "kind": "boolean",
835
+ "required": false
836
+ },
837
+ {
838
+ "name": "maxActivations",
839
+ "kind": "number",
840
+ "required": false
841
+ }
842
+ ]
843
+ },
844
+ {
845
+ "name": "update-variants",
846
+ "method": "PATCH",
847
+ "path": "/api/v1/products/{id}/variants/{variantId}",
848
+ "summary": "Update a variant",
849
+ "pathParams": [
850
+ "id",
851
+ "variantId"
852
+ ],
853
+ "query": [],
854
+ "body": [
855
+ {
856
+ "name": "sku",
857
+ "kind": "string",
858
+ "required": false
859
+ },
860
+ {
861
+ "name": "name",
862
+ "kind": "string",
863
+ "required": false
864
+ },
865
+ {
866
+ "name": "priceCents",
867
+ "kind": "number",
868
+ "required": false
869
+ },
870
+ {
871
+ "name": "costCents",
872
+ "kind": "number",
873
+ "required": false
874
+ },
875
+ {
876
+ "name": "lowStockThreshold",
877
+ "kind": "number",
878
+ "required": false
879
+ },
880
+ {
881
+ "name": "weight",
882
+ "kind": "number",
883
+ "required": false
884
+ },
885
+ {
886
+ "name": "isDefault",
887
+ "kind": "boolean",
888
+ "required": false
889
+ }
890
+ ]
891
+ }
892
+ ]
893
+ },
894
+ {
895
+ "area": "shipments",
896
+ "routes": [
897
+ {
898
+ "name": "cancel",
899
+ "method": "POST",
900
+ "path": "/api/v1/shipments/{id}/cancel",
901
+ "summary": "Cancel a booking the courier hasn't collected yet, and give back the shipping credit confirm-pickup consumed.",
902
+ "pathParams": [
903
+ "id"
904
+ ],
905
+ "query": [],
906
+ "body": [
907
+ {
908
+ "name": "reason",
909
+ "kind": "string",
910
+ "required": false
911
+ }
912
+ ]
913
+ },
914
+ {
915
+ "name": "confirm-pickup",
916
+ "method": "POST",
917
+ "path": "/api/v1/shipments/{id}/confirm-pickup",
918
+ "summary": "F-004: Merchant clicks \"Book courier\" once the parcel is actually ready.",
919
+ "pathParams": [
920
+ "id"
921
+ ],
922
+ "query": [],
923
+ "body": null
924
+ },
925
+ {
926
+ "name": "create",
927
+ "method": "POST",
928
+ "path": "/api/v1/shipments",
929
+ "summary": "Create a shipment",
930
+ "pathParams": [],
931
+ "query": [],
932
+ "body": [
933
+ {
934
+ "name": "productId",
935
+ "kind": "string",
936
+ "required": false
937
+ },
938
+ {
939
+ "name": "checkoutSessionId",
940
+ "kind": "string",
941
+ "required": false
942
+ },
943
+ {
944
+ "name": "customerId",
945
+ "kind": "string",
946
+ "required": false
947
+ },
948
+ {
949
+ "name": "customerEmail",
950
+ "kind": "string",
951
+ "required": false
952
+ },
953
+ {
954
+ "name": "courierCode",
955
+ "kind": "string",
956
+ "required": true
957
+ },
958
+ {
959
+ "name": "courierServiceCode",
960
+ "kind": "string",
961
+ "required": true
962
+ },
963
+ {
964
+ "name": "courierType",
965
+ "kind": "string",
966
+ "required": true
967
+ },
968
+ {
969
+ "name": "price",
970
+ "kind": "number",
971
+ "required": true
972
+ },
973
+ {
974
+ "name": "insurance",
975
+ "kind": "number",
976
+ "required": false
977
+ },
978
+ {
979
+ "name": "insured",
980
+ "kind": "boolean",
981
+ "required": false
982
+ },
983
+ {
984
+ "name": "origin",
985
+ "kind": "json",
986
+ "required": true
987
+ },
988
+ {
989
+ "name": "destination",
990
+ "kind": "json",
991
+ "required": true
992
+ },
993
+ {
994
+ "name": "items",
995
+ "kind": "array",
996
+ "required": true
997
+ },
998
+ {
999
+ "name": "externalSource",
1000
+ "kind": "string",
1001
+ "required": false
1002
+ },
1003
+ {
1004
+ "name": "externalRef",
1005
+ "kind": "string",
1006
+ "required": false
1007
+ }
1008
+ ]
1009
+ },
1010
+ {
1011
+ "name": "get",
1012
+ "method": "GET",
1013
+ "path": "/api/v1/shipments/{id}",
1014
+ "summary": "Get a shipment",
1015
+ "pathParams": [
1016
+ "id"
1017
+ ],
1018
+ "query": [],
1019
+ "body": null
1020
+ },
1021
+ {
1022
+ "name": "label",
1023
+ "method": "GET",
1024
+ "path": "/api/v1/shipments/{id}/label",
1025
+ "summary": "Biteship deliberately has no shipping-label API.",
1026
+ "pathParams": [
1027
+ "id"
1028
+ ],
1029
+ "query": [
1030
+ {
1031
+ "name": "size",
1032
+ "kind": "string",
1033
+ "required": false,
1034
+ "choices": [
1035
+ "a4",
1036
+ "thermal-80x100",
1037
+ "thermal-100x150"
1038
+ ]
1039
+ },
1040
+ {
1041
+ "name": "showSenderPhone",
1042
+ "kind": "string",
1043
+ "required": false,
1044
+ "choices": [
1045
+ "true",
1046
+ "false"
1047
+ ]
1048
+ },
1049
+ {
1050
+ "name": "showRecipientPhone",
1051
+ "kind": "string",
1052
+ "required": false,
1053
+ "choices": [
1054
+ "true",
1055
+ "false"
1056
+ ]
1057
+ },
1058
+ {
1059
+ "name": "maskRecipientName",
1060
+ "kind": "string",
1061
+ "required": false,
1062
+ "choices": [
1063
+ "true",
1064
+ "false"
1065
+ ]
1066
+ },
1067
+ {
1068
+ "name": "maskRecipientPhone",
1069
+ "kind": "string",
1070
+ "required": false,
1071
+ "choices": [
1072
+ "true",
1073
+ "false"
1074
+ ]
1075
+ },
1076
+ {
1077
+ "name": "showShippingCost",
1078
+ "kind": "string",
1079
+ "required": false,
1080
+ "choices": [
1081
+ "true",
1082
+ "false"
1083
+ ]
1084
+ },
1085
+ {
1086
+ "name": "showInsurance",
1087
+ "kind": "string",
1088
+ "required": false,
1089
+ "choices": [
1090
+ "true",
1091
+ "false"
1092
+ ]
1093
+ },
1094
+ {
1095
+ "name": "showItems",
1096
+ "kind": "string",
1097
+ "required": false,
1098
+ "choices": [
1099
+ "true",
1100
+ "false"
1101
+ ]
1102
+ },
1103
+ {
1104
+ "name": "showItemDescriptions",
1105
+ "kind": "string",
1106
+ "required": false,
1107
+ "choices": [
1108
+ "true",
1109
+ "false"
1110
+ ]
1111
+ },
1112
+ {
1113
+ "name": "showItemSkus",
1114
+ "kind": "string",
1115
+ "required": false,
1116
+ "choices": [
1117
+ "true",
1118
+ "false"
1119
+ ]
1120
+ }
1121
+ ],
1122
+ "body": null
1123
+ },
1124
+ {
1125
+ "name": "list",
1126
+ "method": "GET",
1127
+ "path": "/api/v1/shipments",
1128
+ "summary": "List shipments",
1129
+ "pathParams": [],
1130
+ "query": [
1131
+ {
1132
+ "name": "status",
1133
+ "kind": "string",
1134
+ "required": false
1135
+ }
1136
+ ],
1137
+ "body": null
1138
+ },
1139
+ {
1140
+ "name": "rebook",
1141
+ "method": "POST",
1142
+ "path": "/api/v1/shipments/{id}/rebook",
1143
+ "summary": "Rebook a shipment",
1144
+ "pathParams": [
1145
+ "id"
1146
+ ],
1147
+ "query": [],
1148
+ "body": [
1149
+ {
1150
+ "name": "courierCode",
1151
+ "kind": "string",
1152
+ "required": false
1153
+ },
1154
+ {
1155
+ "name": "courierServiceCode",
1156
+ "kind": "string",
1157
+ "required": false
1158
+ },
1159
+ {
1160
+ "name": "courierType",
1161
+ "kind": "string",
1162
+ "required": false
1163
+ },
1164
+ {
1165
+ "name": "price",
1166
+ "kind": "number",
1167
+ "required": false
1168
+ },
1169
+ {
1170
+ "name": "insured",
1171
+ "kind": "boolean",
1172
+ "required": false
1173
+ },
1174
+ {
1175
+ "name": "insurance",
1176
+ "kind": "number",
1177
+ "required": false
1178
+ }
1179
+ ]
1180
+ },
1181
+ {
1182
+ "name": "tracking",
1183
+ "method": "GET",
1184
+ "path": "/api/v1/shipments/{id}/tracking",
1185
+ "summary": "F-008: live tracking detail (driver, status history, ETA) from Biteship.",
1186
+ "pathParams": [
1187
+ "id"
1188
+ ],
1189
+ "query": [],
1190
+ "body": null
1191
+ }
1192
+ ]
1193
+ },
1194
+ {
1195
+ "area": "shipping",
1196
+ "routes": [
1197
+ {
1198
+ "name": "areas",
1199
+ "method": "GET",
1200
+ "path": "/api/v1/shipping/areas",
1201
+ "summary": "List areas",
1202
+ "pathParams": [],
1203
+ "query": [
1204
+ {
1205
+ "name": "q",
1206
+ "kind": "string",
1207
+ "required": false
1208
+ }
1209
+ ],
1210
+ "body": null
1211
+ },
1212
+ {
1213
+ "name": "config",
1214
+ "method": "GET",
1215
+ "path": "/api/v1/shipping/config",
1216
+ "summary": "List config",
1217
+ "pathParams": [],
1218
+ "query": [],
1219
+ "body": null
1220
+ },
1221
+ {
1222
+ "name": "couriers",
1223
+ "method": "GET",
1224
+ "path": "/api/v1/shipping/couriers",
1225
+ "summary": "In Fulkruma we still gate this behind requireAuth: the dashboard always has a session, and we want per-merchant API key resolution.",
1226
+ "pathParams": [],
1227
+ "query": [],
1228
+ "body": null
1229
+ },
1230
+ {
1231
+ "name": "origin",
1232
+ "method": "GET",
1233
+ "path": "/api/v1/shipping/origin",
1234
+ "summary": "List origin",
1235
+ "pathParams": [],
1236
+ "query": [],
1237
+ "body": null
1238
+ },
1239
+ {
1240
+ "name": "rates",
1241
+ "method": "POST",
1242
+ "path": "/api/v1/shipping/rates",
1243
+ "summary": "Create a rate",
1244
+ "pathParams": [],
1245
+ "query": [],
1246
+ "body": [
1247
+ {
1248
+ "name": "destination",
1249
+ "kind": "json",
1250
+ "required": true
1251
+ },
1252
+ {
1253
+ "name": "items",
1254
+ "kind": "array",
1255
+ "required": true
1256
+ },
1257
+ {
1258
+ "name": "insurance",
1259
+ "kind": "boolean",
1260
+ "required": false
1261
+ }
1262
+ ]
1263
+ },
1264
+ {
1265
+ "name": "set-config",
1266
+ "method": "PUT",
1267
+ "path": "/api/v1/shipping/config",
1268
+ "summary": "Set config",
1269
+ "pathParams": [],
1270
+ "query": [],
1271
+ "body": [
1272
+ {
1273
+ "name": "apiKey",
1274
+ "kind": "string",
1275
+ "required": false
1276
+ },
1277
+ {
1278
+ "name": "defaultOriginId",
1279
+ "kind": "string",
1280
+ "required": false
1281
+ },
1282
+ {
1283
+ "name": "enabledCouriers",
1284
+ "kind": "array",
1285
+ "required": false
1286
+ },
1287
+ {
1288
+ "name": "defaultCourier",
1289
+ "kind": "string",
1290
+ "required": false
1291
+ },
1292
+ {
1293
+ "name": "active",
1294
+ "kind": "boolean",
1295
+ "required": false
1296
+ }
1297
+ ]
1298
+ },
1299
+ {
1300
+ "name": "shipments",
1301
+ "method": "GET",
1302
+ "path": "/api/v1/shipping/shipments",
1303
+ "summary": "List shipments",
1304
+ "pathParams": [],
1305
+ "query": [
1306
+ {
1307
+ "name": "cursor",
1308
+ "kind": "string",
1309
+ "required": false
1310
+ },
1311
+ {
1312
+ "name": "limit",
1313
+ "kind": "string",
1314
+ "required": false
1315
+ },
1316
+ {
1317
+ "name": "status",
1318
+ "kind": "string",
1319
+ "required": false
1320
+ }
1321
+ ],
1322
+ "body": null
1323
+ },
1324
+ {
1325
+ "name": "shipments-2",
1326
+ "method": "GET",
1327
+ "path": "/api/v1/shipping/shipments/{id}",
1328
+ "summary": "Get a shipment",
1329
+ "pathParams": [
1330
+ "id"
1331
+ ],
1332
+ "query": [],
1333
+ "body": null
1334
+ },
1335
+ {
1336
+ "name": "shipments-cancel",
1337
+ "method": "POST",
1338
+ "path": "/api/v1/shipping/shipments/{id}/cancel",
1339
+ "summary": "Legacy namespace.",
1340
+ "pathParams": [
1341
+ "id"
1342
+ ],
1343
+ "query": [],
1344
+ "body": [
1345
+ {
1346
+ "name": "reason",
1347
+ "kind": "string",
1348
+ "required": false
1349
+ }
1350
+ ]
1351
+ },
1352
+ {
1353
+ "name": "shipments-label",
1354
+ "method": "GET",
1355
+ "path": "/api/v1/shipping/shipments/{id}/label",
1356
+ "summary": "Legacy shipping namespace.",
1357
+ "pathParams": [
1358
+ "id"
1359
+ ],
1360
+ "query": [
1361
+ {
1362
+ "name": "size",
1363
+ "kind": "string",
1364
+ "required": false
1365
+ }
1366
+ ],
1367
+ "body": null
1368
+ },
1369
+ {
1370
+ "name": "shipments-rebook",
1371
+ "method": "POST",
1372
+ "path": "/api/v1/shipping/shipments/{id}/rebook",
1373
+ "summary": "Legacy-namespace twin of /shipments/:id/rebook.",
1374
+ "pathParams": [
1375
+ "id"
1376
+ ],
1377
+ "query": [],
1378
+ "body": [
1379
+ {
1380
+ "name": "courierCode",
1381
+ "kind": "string",
1382
+ "required": false
1383
+ },
1384
+ {
1385
+ "name": "courierServiceCode",
1386
+ "kind": "string",
1387
+ "required": false
1388
+ },
1389
+ {
1390
+ "name": "courierType",
1391
+ "kind": "string",
1392
+ "required": false
1393
+ },
1394
+ {
1395
+ "name": "price",
1396
+ "kind": "number",
1397
+ "required": false
1398
+ },
1399
+ {
1400
+ "name": "insured",
1401
+ "kind": "boolean",
1402
+ "required": false
1403
+ },
1404
+ {
1405
+ "name": "insurance",
1406
+ "kind": "number",
1407
+ "required": false
1408
+ }
1409
+ ]
1410
+ },
1411
+ {
1412
+ "name": "track",
1413
+ "method": "GET",
1414
+ "path": "/api/v1/shipping/track/{waybillId}",
1415
+ "summary": "Get a track",
1416
+ "pathParams": [
1417
+ "waybillId"
1418
+ ],
1419
+ "query": [
1420
+ {
1421
+ "name": "courier",
1422
+ "kind": "string",
1423
+ "required": false
1424
+ }
1425
+ ],
1426
+ "body": null
1427
+ },
1428
+ {
1429
+ "name": "update-origin",
1430
+ "method": "PATCH",
1431
+ "path": "/api/v1/shipping/origin",
1432
+ "summary": "Update origin",
1433
+ "pathParams": [],
1434
+ "query": [],
1435
+ "body": [
1436
+ {
1437
+ "name": "address",
1438
+ "kind": "string",
1439
+ "required": true
1440
+ },
1441
+ {
1442
+ "name": "province",
1443
+ "kind": "string",
1444
+ "required": false
1445
+ },
1446
+ {
1447
+ "name": "city",
1448
+ "kind": "string",
1449
+ "required": false
1450
+ },
1451
+ {
1452
+ "name": "district",
1453
+ "kind": "string",
1454
+ "required": false
1455
+ },
1456
+ {
1457
+ "name": "village",
1458
+ "kind": "string",
1459
+ "required": false
1460
+ },
1461
+ {
1462
+ "name": "postal",
1463
+ "kind": "string",
1464
+ "required": false
1465
+ },
1466
+ {
1467
+ "name": "areaId",
1468
+ "kind": "string",
1469
+ "required": false
1470
+ },
1471
+ {
1472
+ "name": "lat",
1473
+ "kind": "number",
1474
+ "required": false
1475
+ },
1476
+ {
1477
+ "name": "lng",
1478
+ "kind": "number",
1479
+ "required": false
1480
+ },
1481
+ {
1482
+ "name": "note",
1483
+ "kind": "string",
1484
+ "required": false
1485
+ },
1486
+ {
1487
+ "name": "contactName",
1488
+ "kind": "string",
1489
+ "required": true
1490
+ },
1491
+ {
1492
+ "name": "contactPhone",
1493
+ "kind": "string",
1494
+ "required": true
1495
+ },
1496
+ {
1497
+ "name": "couriers",
1498
+ "kind": "array",
1499
+ "required": false
1500
+ }
1501
+ ]
1502
+ }
1503
+ ]
1504
+ },
1505
+ {
1506
+ "area": "shipping-credits",
1507
+ "routes": [
1508
+ {
1509
+ "name": "adjust",
1510
+ "method": "POST",
1511
+ "path": "/api/v1/shipping-credits/adjust",
1512
+ "summary": "Create an adjust",
1513
+ "pathParams": [],
1514
+ "query": [],
1515
+ "body": [
1516
+ {
1517
+ "name": "amount",
1518
+ "kind": "number",
1519
+ "required": true
1520
+ },
1521
+ {
1522
+ "name": "kind",
1523
+ "kind": "string",
1524
+ "required": true,
1525
+ "choices": [
1526
+ "manual_adjustment",
1527
+ "shipment_refund"
1528
+ ]
1529
+ },
1530
+ {
1531
+ "name": "shipmentId",
1532
+ "kind": "string",
1533
+ "required": false
1534
+ },
1535
+ {
1536
+ "name": "externalRef",
1537
+ "kind": "string",
1538
+ "required": false
1539
+ },
1540
+ {
1541
+ "name": "memo",
1542
+ "kind": "string",
1543
+ "required": false
1544
+ }
1545
+ ]
1546
+ },
1547
+ {
1548
+ "name": "checkout",
1549
+ "method": "POST",
1550
+ "path": "/api/v1/shipping-credits/checkout",
1551
+ "summary": "Create a checkout",
1552
+ "pathParams": [],
1553
+ "query": [],
1554
+ "body": [
1555
+ {
1556
+ "name": "amount",
1557
+ "kind": "number",
1558
+ "required": true
1559
+ },
1560
+ {
1561
+ "name": "email",
1562
+ "kind": "string",
1563
+ "required": false
1564
+ },
1565
+ {
1566
+ "name": "name",
1567
+ "kind": "string",
1568
+ "required": false
1569
+ }
1570
+ ]
1571
+ },
1572
+ {
1573
+ "name": "list",
1574
+ "method": "GET",
1575
+ "path": "/api/v1/shipping-credits",
1576
+ "summary": "Balance for the calling merchant.",
1577
+ "pathParams": [],
1578
+ "query": [],
1579
+ "body": null
1580
+ },
1581
+ {
1582
+ "name": "topup",
1583
+ "method": "POST",
1584
+ "path": "/api/v1/shipping-credits/topup",
1585
+ "summary": "Create a topup",
1586
+ "pathParams": [],
1587
+ "query": [],
1588
+ "body": [
1589
+ {
1590
+ "name": "amount",
1591
+ "kind": "number",
1592
+ "required": true
1593
+ },
1594
+ {
1595
+ "name": "externalRef",
1596
+ "kind": "string",
1597
+ "required": false
1598
+ },
1599
+ {
1600
+ "name": "memo",
1601
+ "kind": "string",
1602
+ "required": false
1603
+ }
1604
+ ]
1605
+ },
1606
+ {
1607
+ "name": "transactions",
1608
+ "method": "GET",
1609
+ "path": "/api/v1/shipping-credits/transactions",
1610
+ "summary": "List transactions",
1611
+ "pathParams": [],
1612
+ "query": [
1613
+ {
1614
+ "name": "limit",
1615
+ "kind": "number",
1616
+ "required": false
1617
+ },
1618
+ {
1619
+ "name": "cursor",
1620
+ "kind": "string",
1621
+ "required": false
1622
+ }
1623
+ ],
1624
+ "body": null
1625
+ }
1626
+ ]
1627
+ },
1628
+ {
1629
+ "area": "stats",
1630
+ "routes": [
1631
+ {
1632
+ "name": "overview",
1633
+ "method": "GET",
1634
+ "path": "/api/v1/stats/overview",
1635
+ "summary": "Powers the /dashboard overview tiles.",
1636
+ "pathParams": [],
1637
+ "query": [],
1638
+ "body": null
1639
+ }
1640
+ ]
1641
+ },
1642
+ {
1643
+ "area": "stock",
1644
+ "routes": [
1645
+ {
1646
+ "name": "adjust",
1647
+ "method": "POST",
1648
+ "path": "/api/v1/stock/adjust",
1649
+ "summary": "Create an adjust",
1650
+ "pathParams": [],
1651
+ "query": [],
1652
+ "body": [
1653
+ {
1654
+ "name": "variantId",
1655
+ "kind": "string",
1656
+ "required": true
1657
+ },
1658
+ {
1659
+ "name": "warehouseId",
1660
+ "kind": "string",
1661
+ "required": true
1662
+ },
1663
+ {
1664
+ "name": "delta",
1665
+ "kind": "number",
1666
+ "required": true
1667
+ },
1668
+ {
1669
+ "name": "reason",
1670
+ "kind": "string",
1671
+ "required": true,
1672
+ "choices": [
1673
+ "manual_adjust",
1674
+ "initial_stock",
1675
+ "transfer_in",
1676
+ "transfer_out",
1677
+ "damaged",
1678
+ "returned_to_supplier",
1679
+ "refund_restock",
1680
+ "import"
1681
+ ]
1682
+ },
1683
+ {
1684
+ "name": "note",
1685
+ "kind": "string",
1686
+ "required": false
1687
+ }
1688
+ ]
1689
+ },
1690
+ {
1691
+ "name": "levels",
1692
+ "method": "GET",
1693
+ "path": "/api/v1/stock/levels",
1694
+ "summary": "List levels",
1695
+ "pathParams": [],
1696
+ "query": [
1697
+ {
1698
+ "name": "variant_id",
1699
+ "kind": "string",
1700
+ "required": false
1701
+ }
1702
+ ],
1703
+ "body": null
1704
+ },
1705
+ {
1706
+ "name": "movements",
1707
+ "method": "GET",
1708
+ "path": "/api/v1/stock/movements",
1709
+ "summary": "List movements",
1710
+ "pathParams": [],
1711
+ "query": [
1712
+ {
1713
+ "name": "variant_id",
1714
+ "kind": "string",
1715
+ "required": false
1716
+ }
1717
+ ],
1718
+ "body": null
1719
+ },
1720
+ {
1721
+ "name": "reservations",
1722
+ "method": "GET",
1723
+ "path": "/api/v1/stock/reservations",
1724
+ "summary": "List reservations",
1725
+ "pathParams": [],
1726
+ "query": [],
1727
+ "body": null
1728
+ }
1729
+ ]
1730
+ },
1731
+ {
1732
+ "area": "warehouses",
1733
+ "routes": [
1734
+ {
1735
+ "name": "create",
1736
+ "method": "POST",
1737
+ "path": "/api/v1/warehouses",
1738
+ "summary": "Create a warehouse",
1739
+ "pathParams": [],
1740
+ "query": [],
1741
+ "body": [
1742
+ {
1743
+ "name": "name",
1744
+ "kind": "string",
1745
+ "required": true
1746
+ },
1747
+ {
1748
+ "name": "address",
1749
+ "kind": "string",
1750
+ "required": false
1751
+ },
1752
+ {
1753
+ "name": "city",
1754
+ "kind": "string",
1755
+ "required": false
1756
+ },
1757
+ {
1758
+ "name": "postal",
1759
+ "kind": "string",
1760
+ "required": false
1761
+ },
1762
+ {
1763
+ "name": "lat",
1764
+ "kind": "number",
1765
+ "required": false
1766
+ },
1767
+ {
1768
+ "name": "lng",
1769
+ "kind": "number",
1770
+ "required": false
1771
+ },
1772
+ {
1773
+ "name": "phone",
1774
+ "kind": "string",
1775
+ "required": false
1776
+ },
1777
+ {
1778
+ "name": "isDefault",
1779
+ "kind": "boolean",
1780
+ "required": false
1781
+ }
1782
+ ]
1783
+ },
1784
+ {
1785
+ "name": "delete",
1786
+ "method": "DELETE",
1787
+ "path": "/api/v1/warehouses/{id}",
1788
+ "summary": "Delete a warehouse",
1789
+ "pathParams": [
1790
+ "id"
1791
+ ],
1792
+ "query": [],
1793
+ "body": null
1794
+ },
1795
+ {
1796
+ "name": "list",
1797
+ "method": "GET",
1798
+ "path": "/api/v1/warehouses",
1799
+ "summary": "List warehouses",
1800
+ "pathParams": [],
1801
+ "query": [],
1802
+ "body": null
1803
+ },
1804
+ {
1805
+ "name": "update",
1806
+ "method": "PATCH",
1807
+ "path": "/api/v1/warehouses/{id}",
1808
+ "summary": "Update a warehouse",
1809
+ "pathParams": [
1810
+ "id"
1811
+ ],
1812
+ "query": [],
1813
+ "body": [
1814
+ {
1815
+ "name": "name",
1816
+ "kind": "string",
1817
+ "required": false
1818
+ },
1819
+ {
1820
+ "name": "address",
1821
+ "kind": "string",
1822
+ "required": false
1823
+ },
1824
+ {
1825
+ "name": "city",
1826
+ "kind": "string",
1827
+ "required": false
1828
+ },
1829
+ {
1830
+ "name": "postal",
1831
+ "kind": "string",
1832
+ "required": false
1833
+ },
1834
+ {
1835
+ "name": "lat",
1836
+ "kind": "number",
1837
+ "required": false
1838
+ },
1839
+ {
1840
+ "name": "lng",
1841
+ "kind": "number",
1842
+ "required": false
1843
+ },
1844
+ {
1845
+ "name": "phone",
1846
+ "kind": "string",
1847
+ "required": false
1848
+ },
1849
+ {
1850
+ "name": "isDefault",
1851
+ "kind": "boolean",
1852
+ "required": false
1853
+ }
1854
+ ]
1855
+ }
1856
+ ]
1857
+ },
1858
+ {
1859
+ "area": "webhooks",
1860
+ "routes": [
1861
+ {
1862
+ "name": "create-endpoints",
1863
+ "method": "POST",
1864
+ "path": "/api/v1/webhooks/endpoints",
1865
+ "summary": "Create an endpoint",
1866
+ "pathParams": [],
1867
+ "query": [],
1868
+ "body": [
1869
+ {
1870
+ "name": "url",
1871
+ "kind": "string",
1872
+ "required": true
1873
+ },
1874
+ {
1875
+ "name": "events",
1876
+ "kind": "array",
1877
+ "required": false
1878
+ },
1879
+ {
1880
+ "name": "description",
1881
+ "kind": "string",
1882
+ "required": false
1883
+ }
1884
+ ]
1885
+ },
1886
+ {
1887
+ "name": "delete-endpoints",
1888
+ "method": "DELETE",
1889
+ "path": "/api/v1/webhooks/endpoints/{id}",
1890
+ "summary": "Delete an endpoint",
1891
+ "pathParams": [
1892
+ "id"
1893
+ ],
1894
+ "query": [],
1895
+ "body": null
1896
+ },
1897
+ {
1898
+ "name": "endpoints",
1899
+ "method": "GET",
1900
+ "path": "/api/v1/webhooks/endpoints",
1901
+ "summary": "List endpoints",
1902
+ "pathParams": [],
1903
+ "query": [],
1904
+ "body": null
1905
+ },
1906
+ {
1907
+ "name": "events",
1908
+ "method": "GET",
1909
+ "path": "/api/v1/webhooks/events",
1910
+ "summary": "List events",
1911
+ "pathParams": [],
1912
+ "query": [],
1913
+ "body": null
1914
+ },
1915
+ {
1916
+ "name": "update-endpoints",
1917
+ "method": "PATCH",
1918
+ "path": "/api/v1/webhooks/endpoints/{id}",
1919
+ "summary": "Update an endpoint",
1920
+ "pathParams": [
1921
+ "id"
1922
+ ],
1923
+ "query": [],
1924
+ "body": []
1925
+ }
1926
+ ]
1927
+ }
1928
+ ];
1929
+ // A field whose flag would clash with this command's own options or the CLI's global ones
1930
+ // is given as --field-<name>.
1931
+ const RESERVED = new Set(['help', 'version', 'json', 'profile', 'api', 'on-behalf-of', 'color', 'no-color', 'body-json']);
1932
+ const plain = (name) => name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/_/g, '-').toLowerCase();
1933
+ const flag = (name) => (RESERVED.has(plain(name)) ? `field-${plain(name)}` : plain(name));
1934
+ const camel = (name) => flag(name).replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
1935
+ function value(field, raw) {
1936
+ if (field.kind === 'number') {
1937
+ const n = Number(raw);
1938
+ if (Number.isNaN(n))
1939
+ throw new Error(`--${flag(field.name)} must be a number`);
1940
+ return n;
1941
+ }
1942
+ if (field.kind === 'boolean')
1943
+ return raw === '' || raw === 'true' || raw === '1' || raw === 'yes';
1944
+ if (field.kind === 'array')
1945
+ return raw.trim().startsWith('[') ? JSON.parse(raw) : raw.split(',').map((x) => x.trim()).filter(Boolean);
1946
+ if (field.kind === 'json')
1947
+ return JSON.parse(raw);
1948
+ if (field.choices && !field.choices.includes(raw))
1949
+ throw new Error(`--${flag(field.name)} must be one of: ${field.choices.join(', ')}`);
1950
+ return raw;
1951
+ }
1952
+ export function buildApiCommand() {
1953
+ const api = new Command('api').description('Every route of the API, one command each (generated from the API spec)');
1954
+ for (const { area, routes } of API_ROUTES) {
1955
+ const group = new Command(area).description(`${area} routes`);
1956
+ for (const route of routes) {
1957
+ const cmd = new Command(route.name).description(`${route.summary} (${route.method} ${route.path})`);
1958
+ for (const p of route.pathParams)
1959
+ cmd.argument(`<${p}>`);
1960
+ const fields = [...route.query, ...(route.body ?? [])];
1961
+ for (const f of fields) {
1962
+ const hint = f.choices ? ` (${f.choices.join('|')})` : f.kind === 'json' || f.kind === 'array' ? ` (${f.kind})` : '';
1963
+ cmd.option(f.kind === 'boolean' ? `--${flag(f.name)} [value]` : `--${flag(f.name)} <value>`, `${f.required ? 'required' : 'optional'}${hint}`);
1964
+ }
1965
+ if (route.body)
1966
+ cmd.option('--body-json <json>', 'the whole body as JSON (fields given as flags override it)');
1967
+ cmd.action(async (...parts) => {
1968
+ const command = parts[parts.length - 1];
1969
+ const opts = command.opts();
1970
+ try {
1971
+ let path = route.path;
1972
+ route.pathParams.forEach((p, i) => { path = path.replace(`{${p}}`, encodeURIComponent(String(parts[i]))); });
1973
+ const query = {};
1974
+ for (const f of route.query) {
1975
+ const raw = opts[camel(f.name)];
1976
+ if (raw !== undefined)
1977
+ query[f.name] = value(f, raw === true ? '' : String(raw));
1978
+ }
1979
+ let body;
1980
+ if (route.body) {
1981
+ body = opts.bodyJson ? JSON.parse(String(opts.bodyJson)) : {};
1982
+ for (const f of route.body) {
1983
+ const raw = opts[camel(f.name)];
1984
+ if (raw !== undefined)
1985
+ body[f.name] = value(f, raw === true ? '' : String(raw));
1986
+ }
1987
+ const missing = route.body.filter((f) => f.required && body[f.name] === undefined).map((f) => `--${flag(f.name)}`);
1988
+ if (missing.length)
1989
+ throw new Error(`missing ${missing.join(', ')}`);
1990
+ }
1991
+ await callRoute(command, route.method, path, query, body);
1992
+ }
1993
+ catch (err) {
1994
+ await failRoute(command, err);
1995
+ }
1996
+ });
1997
+ group.addCommand(cmd);
1998
+ }
1999
+ api.addCommand(group);
2000
+ }
2001
+ return api;
2002
+ }
2003
+ //# sourceMappingURL=api.generated.js.map