@usethrottle/cli 2.9.1 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/cli.js +285 -15
- package/dist/cli.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -17,6 +17,11 @@ npm install -g @usethrottle/cli
|
|
|
17
17
|
|
|
18
18
|
This installs a `throttle` binary (Node >= 20).
|
|
19
19
|
|
|
20
|
+
Human-readable output formats money with each record's own currency (`€54.00`,
|
|
21
|
+
`¥1,999`); `--json` prints the API's integer minor units unchanged. The CLI is a
|
|
22
|
+
binary with no library entry. To format money in your own scripts, install the
|
|
23
|
+
shared formatter: `npm i @usethrottle/money`.
|
|
24
|
+
|
|
20
25
|
## Auth & profiles
|
|
21
26
|
|
|
22
27
|
The CLI authenticates every request with a Throttle secret key (`sk_test_…` /
|
|
@@ -178,7 +183,7 @@ throttle subscriptions get <id>
|
|
|
178
183
|
throttle subscriptions cancel <id> [--at-period-end]
|
|
179
184
|
throttle subscriptions pause <id>
|
|
180
185
|
throttle subscriptions resume <id>
|
|
181
|
-
throttle subscriptions change-plan <id> --amount <cents> (--interval <i> | --interval-unit <u> --interval-count <n>) [--plan-reference <r>] [--plan-name <n>] [--effective now|period_end]
|
|
186
|
+
throttle subscriptions change-plan <id> --amount <cents> (--interval <i> | --interval-unit <u> --interval-count <n>) [--plan-reference <r>] [--plan-name <n>] [--effective now|period_end] [--allow-zero-amount]
|
|
182
187
|
throttle subscriptions cancel-pending-change <id>
|
|
183
188
|
```
|
|
184
189
|
|
package/dist/cli.js
CHANGED
|
@@ -495,6 +495,259 @@ function qs(params) {
|
|
|
495
495
|
return str ? `?${str}` : "";
|
|
496
496
|
}
|
|
497
497
|
|
|
498
|
+
// ../money/dist/index.js
|
|
499
|
+
var CURRENCY_ROWS = [
|
|
500
|
+
["AED", 2, "AED", false],
|
|
501
|
+
["AFN", 2, "AFN", false],
|
|
502
|
+
["ALL", 2, "ALL", false],
|
|
503
|
+
["AMD", 2, "AMD", false],
|
|
504
|
+
["AOA", 2, "AOA", false],
|
|
505
|
+
["ARS", 2, "ARS", false],
|
|
506
|
+
["AUD", 2, "A$", false],
|
|
507
|
+
["AWG", 2, "AWG", false],
|
|
508
|
+
["AZN", 2, "AZN", false],
|
|
509
|
+
["BAM", 2, "BAM", false],
|
|
510
|
+
["BBD", 2, "BBD", false],
|
|
511
|
+
["BDT", 2, "BDT", false],
|
|
512
|
+
["BHD", 3, "BHD", false],
|
|
513
|
+
["BIF", 0, "BIF", false],
|
|
514
|
+
["BMD", 2, "BMD", false],
|
|
515
|
+
["BND", 2, "BND", false],
|
|
516
|
+
["BOB", 2, "BOB", false],
|
|
517
|
+
["BOV", 2, "BOV", true],
|
|
518
|
+
["BRL", 2, "R$", false],
|
|
519
|
+
["BSD", 2, "BSD", false],
|
|
520
|
+
["BTN", 2, "BTN", false],
|
|
521
|
+
["BWP", 2, "BWP", false],
|
|
522
|
+
["BYN", 2, "BYN", false],
|
|
523
|
+
["BZD", 2, "BZD", false],
|
|
524
|
+
["CAD", 2, "CA$", false],
|
|
525
|
+
["CDF", 2, "CDF", false],
|
|
526
|
+
["CHE", 2, "CHE", true],
|
|
527
|
+
["CHF", 2, "CHF", false],
|
|
528
|
+
["CHW", 2, "CHW", true],
|
|
529
|
+
["CLF", 4, "CLF", true],
|
|
530
|
+
["CLP", 0, "CLP", false],
|
|
531
|
+
["CNY", 2, "CN\xA5", false],
|
|
532
|
+
["COP", 2, "COP", false],
|
|
533
|
+
["COU", 2, "COU", true],
|
|
534
|
+
["CRC", 2, "CRC", false],
|
|
535
|
+
["CUP", 2, "CUP", false],
|
|
536
|
+
["CVE", 2, "CVE", false],
|
|
537
|
+
["CZK", 2, "CZK", false],
|
|
538
|
+
["DJF", 0, "DJF", false],
|
|
539
|
+
["DKK", 2, "DKK", false],
|
|
540
|
+
["DOP", 2, "DOP", false],
|
|
541
|
+
["DZD", 2, "DZD", false],
|
|
542
|
+
["EGP", 2, "EGP", false],
|
|
543
|
+
["ERN", 2, "ERN", false],
|
|
544
|
+
["ETB", 2, "ETB", false],
|
|
545
|
+
["EUR", 2, "\u20AC", false],
|
|
546
|
+
["FJD", 2, "FJD", false],
|
|
547
|
+
["FKP", 2, "FKP", false],
|
|
548
|
+
["GBP", 2, "\xA3", false],
|
|
549
|
+
["GEL", 2, "GEL", false],
|
|
550
|
+
["GHS", 2, "GHS", false],
|
|
551
|
+
["GIP", 2, "GIP", false],
|
|
552
|
+
["GMD", 2, "GMD", false],
|
|
553
|
+
["GNF", 0, "GNF", false],
|
|
554
|
+
["GTQ", 2, "GTQ", false],
|
|
555
|
+
["GYD", 2, "GYD", false],
|
|
556
|
+
["HKD", 2, "HK$", false],
|
|
557
|
+
["HNL", 2, "HNL", false],
|
|
558
|
+
["HTG", 2, "HTG", false],
|
|
559
|
+
["HUF", 2, "HUF", false],
|
|
560
|
+
["IDR", 2, "IDR", false],
|
|
561
|
+
["ILS", 2, "\u20AA", false],
|
|
562
|
+
["INR", 2, "\u20B9", false],
|
|
563
|
+
["IQD", 3, "IQD", false],
|
|
564
|
+
["IRR", 2, "IRR", false],
|
|
565
|
+
["ISK", 0, "ISK", false],
|
|
566
|
+
["JMD", 2, "JMD", false],
|
|
567
|
+
["JOD", 3, "JOD", false],
|
|
568
|
+
["JPY", 0, "\xA5", false],
|
|
569
|
+
["KES", 2, "KES", false],
|
|
570
|
+
["KGS", 2, "KGS", false],
|
|
571
|
+
["KHR", 2, "KHR", false],
|
|
572
|
+
["KMF", 0, "KMF", false],
|
|
573
|
+
["KPW", 2, "KPW", false],
|
|
574
|
+
["KRW", 0, "\u20A9", false],
|
|
575
|
+
["KWD", 3, "KWD", false],
|
|
576
|
+
["KYD", 2, "KYD", false],
|
|
577
|
+
["KZT", 2, "KZT", false],
|
|
578
|
+
["LAK", 2, "LAK", false],
|
|
579
|
+
["LBP", 2, "LBP", false],
|
|
580
|
+
["LKR", 2, "LKR", false],
|
|
581
|
+
["LRD", 2, "LRD", false],
|
|
582
|
+
["LSL", 2, "LSL", false],
|
|
583
|
+
["LYD", 3, "LYD", false],
|
|
584
|
+
["MAD", 2, "MAD", false],
|
|
585
|
+
["MDL", 2, "MDL", false],
|
|
586
|
+
["MGA", 2, "MGA", false],
|
|
587
|
+
["MKD", 2, "MKD", false],
|
|
588
|
+
["MMK", 2, "MMK", false],
|
|
589
|
+
["MNT", 2, "MNT", false],
|
|
590
|
+
["MOP", 2, "MOP", false],
|
|
591
|
+
["MRU", 2, "MRU", false],
|
|
592
|
+
["MUR", 2, "MUR", false],
|
|
593
|
+
["MVR", 2, "MVR", false],
|
|
594
|
+
["MWK", 2, "MWK", false],
|
|
595
|
+
["MXN", 2, "MX$", false],
|
|
596
|
+
["MXV", 2, "MXV", true],
|
|
597
|
+
["MYR", 2, "MYR", false],
|
|
598
|
+
["MZN", 2, "MZN", false],
|
|
599
|
+
["NAD", 2, "NAD", false],
|
|
600
|
+
["NGN", 2, "NGN", false],
|
|
601
|
+
["NIO", 2, "NIO", false],
|
|
602
|
+
["NOK", 2, "NOK", false],
|
|
603
|
+
["NPR", 2, "NPR", false],
|
|
604
|
+
["NZD", 2, "NZ$", false],
|
|
605
|
+
["OMR", 3, "OMR", false],
|
|
606
|
+
["PAB", 2, "PAB", false],
|
|
607
|
+
["PEN", 2, "PEN", false],
|
|
608
|
+
["PGK", 2, "PGK", false],
|
|
609
|
+
["PHP", 2, "\u20B1", false],
|
|
610
|
+
["PKR", 2, "PKR", false],
|
|
611
|
+
["PLN", 2, "PLN", false],
|
|
612
|
+
["PYG", 0, "PYG", false],
|
|
613
|
+
["QAR", 2, "QAR", false],
|
|
614
|
+
["RON", 2, "RON", false],
|
|
615
|
+
["RSD", 2, "RSD", false],
|
|
616
|
+
["RUB", 2, "RUB", false],
|
|
617
|
+
["RWF", 0, "RWF", false],
|
|
618
|
+
["SAR", 2, "SAR", false],
|
|
619
|
+
["SBD", 2, "SBD", false],
|
|
620
|
+
["SCR", 2, "SCR", false],
|
|
621
|
+
["SDG", 2, "SDG", false],
|
|
622
|
+
["SEK", 2, "SEK", false],
|
|
623
|
+
["SGD", 2, "SGD", false],
|
|
624
|
+
["SHP", 2, "SHP", false],
|
|
625
|
+
["SLE", 2, "SLE", false],
|
|
626
|
+
["SOS", 2, "SOS", false],
|
|
627
|
+
["SRD", 2, "SRD", false],
|
|
628
|
+
["SSP", 2, "SSP", false],
|
|
629
|
+
["STN", 2, "STN", false],
|
|
630
|
+
["SVC", 2, "SVC", false],
|
|
631
|
+
["SYP", 2, "SYP", false],
|
|
632
|
+
["SZL", 2, "SZL", false],
|
|
633
|
+
["THB", 2, "THB", false],
|
|
634
|
+
["TJS", 2, "TJS", false],
|
|
635
|
+
["TMT", 2, "TMT", false],
|
|
636
|
+
["TND", 3, "TND", false],
|
|
637
|
+
["TOP", 2, "TOP", false],
|
|
638
|
+
["TRY", 2, "TRY", false],
|
|
639
|
+
["TTD", 2, "TTD", false],
|
|
640
|
+
["TWD", 2, "NT$", false],
|
|
641
|
+
["TZS", 2, "TZS", false],
|
|
642
|
+
["UAH", 2, "UAH", false],
|
|
643
|
+
["UGX", 0, "UGX", false],
|
|
644
|
+
["USD", 2, "$", false],
|
|
645
|
+
["USN", 2, "USN", true],
|
|
646
|
+
["UYI", 0, "UYI", true],
|
|
647
|
+
["UYU", 2, "UYU", false],
|
|
648
|
+
["UYW", 4, "UYW", true],
|
|
649
|
+
["UZS", 2, "UZS", false],
|
|
650
|
+
["VED", 2, "VED", false],
|
|
651
|
+
["VES", 2, "VES", false],
|
|
652
|
+
["VND", 0, "\u20AB", false],
|
|
653
|
+
["VUV", 0, "VUV", false],
|
|
654
|
+
["WST", 2, "WST", false],
|
|
655
|
+
["XAD", 2, "XAD", true],
|
|
656
|
+
["XAF", 0, "FCFA", false],
|
|
657
|
+
["XCD", 2, "EC$", false],
|
|
658
|
+
["XCG", 2, "Cg.", false],
|
|
659
|
+
["XOF", 0, "F\u202FCFA", false],
|
|
660
|
+
["XPF", 0, "CFPF", false],
|
|
661
|
+
["YER", 2, "YER", false],
|
|
662
|
+
["ZAR", 2, "ZAR", false],
|
|
663
|
+
["ZMW", 2, "ZMW", false],
|
|
664
|
+
["ZWG", 2, "ZWG", false]
|
|
665
|
+
];
|
|
666
|
+
var BY_CODE = new Map(
|
|
667
|
+
CURRENCY_ROWS.map(([code, minorUnits, symbol, fund]) => [code, { minorUnits, symbol, fund }])
|
|
668
|
+
);
|
|
669
|
+
var CURRENCIES = Object.freeze(
|
|
670
|
+
CURRENCY_ROWS.map(([code, minorUnits, symbol]) => Object.freeze({ code, minorUnits, symbol }))
|
|
671
|
+
);
|
|
672
|
+
var UNCONFIRMED = /* @__PURE__ */ new Set(["COP", "HUF", "IDR", "ISK", "TWD", "UGX"]);
|
|
673
|
+
var UNCONFIRMED_EXPONENT_CODES = Object.freeze({
|
|
674
|
+
has: (code) => UNCONFIRMED.has(code),
|
|
675
|
+
get size() {
|
|
676
|
+
return UNCONFIRMED.size;
|
|
677
|
+
},
|
|
678
|
+
forEach: (fn, thisArg) => UNCONFIRMED.forEach((v) => fn.call(thisArg, v, v, UNCONFIRMED_EXPONENT_CODES)),
|
|
679
|
+
keys: () => UNCONFIRMED.keys(),
|
|
680
|
+
values: () => UNCONFIRMED.values(),
|
|
681
|
+
entries: () => UNCONFIRMED.entries(),
|
|
682
|
+
[Symbol.iterator]: () => UNCONFIRMED.values()
|
|
683
|
+
});
|
|
684
|
+
function currencyRow(code) {
|
|
685
|
+
return BY_CODE.get(code);
|
|
686
|
+
}
|
|
687
|
+
var NBSP = "\xA0";
|
|
688
|
+
function normalizeCode(code) {
|
|
689
|
+
return typeof code === "string" ? code.trim().toUpperCase() : "";
|
|
690
|
+
}
|
|
691
|
+
function roundHalfAwayFromZero(n) {
|
|
692
|
+
return n < 0 ? -Math.round(-n) : Math.round(n);
|
|
693
|
+
}
|
|
694
|
+
function decimalDigits(abs, exponent, grouped) {
|
|
695
|
+
const raw = Number.isSafeInteger(abs) ? String(abs) : BigInt(abs).toString();
|
|
696
|
+
const padded = raw.padStart(exponent + 1, "0");
|
|
697
|
+
const cut = padded.length - exponent;
|
|
698
|
+
let integer = padded.slice(0, cut);
|
|
699
|
+
if (grouped) integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
700
|
+
return exponent === 0 ? integer : `${integer}.${padded.slice(cut)}`;
|
|
701
|
+
}
|
|
702
|
+
function formatMoney(minor, code, opts) {
|
|
703
|
+
if (typeof minor !== "number" || !Number.isFinite(minor)) return "\u2014";
|
|
704
|
+
const c = normalizeCode(code);
|
|
705
|
+
const row = currencyRow(c);
|
|
706
|
+
const n = roundHalfAwayFromZero(minor);
|
|
707
|
+
const sign = n < 0 ? "-" : "";
|
|
708
|
+
const digits = decimalDigits(Math.abs(n), row?.minorUnits ?? 2, true);
|
|
709
|
+
if (c === "") return sign + digits;
|
|
710
|
+
if (row === void 0) return `${sign}${digits}${NBSP}${c}`;
|
|
711
|
+
const separator = new RegExp("\\p{Sc}$", "u").test(row.symbol) ? "" : NBSP;
|
|
712
|
+
const text = `${sign}${row.symbol}${separator}${digits}`;
|
|
713
|
+
return opts?.display === "symbol-code" && row.symbol !== c ? `${text}${NBSP}${c}` : text;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// src/lib/money.ts
|
|
717
|
+
function fmt(minor, currency) {
|
|
718
|
+
return formatMoney(Number(minor ?? 0), String(currency ?? ""));
|
|
719
|
+
}
|
|
720
|
+
async function currencyOf(auth, path, g) {
|
|
721
|
+
if (g.yes || g.json || !process.stdin.isTTY) return void 0;
|
|
722
|
+
try {
|
|
723
|
+
const rec = await callThrottle(auth, path);
|
|
724
|
+
return rec?.currency || void 0;
|
|
725
|
+
} catch {
|
|
726
|
+
return void 0;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
async function mainCurrencyOf(auth) {
|
|
730
|
+
try {
|
|
731
|
+
const me = await callThrottle(auth, "/api/v1/whoami");
|
|
732
|
+
const id = me?.application?.id;
|
|
733
|
+
if (!id) return void 0;
|
|
734
|
+
const app = await callThrottle(auth, `/api/v1/stores/${id}`);
|
|
735
|
+
return app?.currency || void 0;
|
|
736
|
+
} catch {
|
|
737
|
+
return void 0;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
function amountPhrase(minor, currency) {
|
|
741
|
+
return currency ? fmt(minor, currency) : `${minor} minor units`;
|
|
742
|
+
}
|
|
743
|
+
function discountValue(d, mainCurrency) {
|
|
744
|
+
if (d.type === "percentage") return `${d.value}%`;
|
|
745
|
+
const main = String(d.currency ?? mainCurrency ?? "").toUpperCase();
|
|
746
|
+
const entries = Object.entries(d.amounts ?? {}).filter(([, a]) => typeof a?.value === "number").sort(([a], [b]) => a === main ? -1 : b === main ? 1 : a < b ? -1 : a > b ? 1 : 0);
|
|
747
|
+
if (entries.length > 0) return entries.map(([code, a]) => formatMoney(a.value, code)).join(" \xB7 ");
|
|
748
|
+
return d.value === void 0 ? "" : fmt(d.value, d.currency);
|
|
749
|
+
}
|
|
750
|
+
|
|
498
751
|
// src/commands/orders.ts
|
|
499
752
|
function register3(program2) {
|
|
500
753
|
const orders = program2.command("orders").description("Orders + order detail");
|
|
@@ -510,7 +763,7 @@ function register3(program2) {
|
|
|
510
763
|
// Its own column, not part of STATUS: a hold says nothing about money
|
|
511
764
|
// or delivery, and folding it into the status text would claim it does.
|
|
512
765
|
{ header: "HOLD", get: (o) => o.onHold ? "on hold" : "" },
|
|
513
|
-
{ header: "TOTAL", get: (o) =>
|
|
766
|
+
{ header: "TOTAL", get: (o) => fmt(o.total, o.currency) }
|
|
514
767
|
], { json: Boolean(g.json), pagination });
|
|
515
768
|
});
|
|
516
769
|
orders.command("get <id>").description("Show an order").action(async (id, _o, cmd) => {
|
|
@@ -560,7 +813,7 @@ function register3(program2) {
|
|
|
560
813
|
return;
|
|
561
814
|
}
|
|
562
815
|
const o = r?.data ?? r;
|
|
563
|
-
success(`Comped ${(
|
|
816
|
+
success(`Comped ${fmt(o.compAmount ?? 0, o.currency)} on ${o.orderNumber ?? id}`);
|
|
564
817
|
});
|
|
565
818
|
orders.command("comp-reverse <id>").description("Undo a comp; the order owes its balance again").action(async (id, _o, cmd) => {
|
|
566
819
|
const g = cmd.optsWithGlobals();
|
|
@@ -571,7 +824,7 @@ function register3(program2) {
|
|
|
571
824
|
return;
|
|
572
825
|
}
|
|
573
826
|
const o = r?.data ?? r;
|
|
574
|
-
success(`Comp reversed on ${o.orderNumber ?? id}; total is ${(o.total
|
|
827
|
+
success(`Comp reversed on ${o.orderNumber ?? id}; total is ${fmt(o.total, o.currency)}`);
|
|
575
828
|
});
|
|
576
829
|
orders.command("hold <id>").description("Freeze an order: no transitions, no manual money, no new fulfillments").requiredOption("--reason <text>", "Why the order is frozen (1-500 chars); whoever finds it later reads this").action(async (id, opts, cmd) => {
|
|
577
830
|
const g = cmd.optsWithGlobals();
|
|
@@ -614,13 +867,21 @@ function register3(program2) {
|
|
|
614
867
|
orders.command("timeline <id>").description("Everything that happened to an order \u2014 status, money and goods \u2014 newest first").option("--limit <n>", "Rows to fetch (1-200, default 50)").option("--cursor <c>").action(async (id, opts, cmd) => {
|
|
615
868
|
const g = cmd.optsWithGlobals();
|
|
616
869
|
const path = `/api/v1/orders/${id}/timeline` + qs({ limit: opts.limit, cursor: opts.cursor });
|
|
617
|
-
const
|
|
870
|
+
const auth = resolveAuth(g);
|
|
871
|
+
const { data, pagination } = await callThrottleList(auth, path);
|
|
872
|
+
let orderCurrency;
|
|
873
|
+
if (!g.json && data.some((e) => e.amount != null && !e.currency)) {
|
|
874
|
+
try {
|
|
875
|
+
orderCurrency = (await callThrottle(auth, `/api/v1/orders/${id}`)).currency || void 0;
|
|
876
|
+
} catch {
|
|
877
|
+
}
|
|
878
|
+
}
|
|
618
879
|
renderList(data, [
|
|
619
880
|
{ header: "WHEN", get: (e) => e.at },
|
|
620
881
|
{ header: "KIND", get: (e) => e.kind },
|
|
621
882
|
{ header: "WHAT", get: (e) => e.title },
|
|
622
883
|
{ header: "DETAIL", get: (e) => e.detail ?? "" },
|
|
623
|
-
{ header: "AMOUNT", get: (e) => e.amount == null ? "" :
|
|
884
|
+
{ header: "AMOUNT", get: (e) => e.amount == null ? "" : amountPhrase(e.amount, e.currency ?? orderCurrency) },
|
|
624
885
|
{ header: "REASON", get: (e) => e.reason ?? "" },
|
|
625
886
|
{ header: "SOURCE", get: (e) => e.source }
|
|
626
887
|
], { json: Boolean(g.json), pagination });
|
|
@@ -652,7 +913,7 @@ function register4(program2) {
|
|
|
652
913
|
r.command("list").requiredOption("--order <orderId>").action(async (opts, cmd) => {
|
|
653
914
|
const g = cmd.optsWithGlobals();
|
|
654
915
|
const data = await callThrottle(resolveAuth(g), `/api/v1/orders/${opts.order}/returns`);
|
|
655
|
-
renderList(data, [{ header: "ID", get: (x) => x.id }, { header: "STATUS", get: (x) => x.status }, { header: "REFUND", get: (x) => x.refundAmount }], { json: Boolean(g.json) });
|
|
916
|
+
renderList(data, [{ header: "ID", get: (x) => x.id }, { header: "STATUS", get: (x) => x.status }, { header: "REFUND", get: (x) => fmt(x.refundAmount, x.currency) }], { json: Boolean(g.json) });
|
|
656
917
|
});
|
|
657
918
|
r.command("open").requiredOption("--order <orderId>").requiredOption("--items <json>", "JSON array of {lineItemId, quantity}").option("--reason <r>").option("--restock").action(async (opts, cmd) => {
|
|
658
919
|
const g = cmd.optsWithGlobals();
|
|
@@ -686,7 +947,9 @@ function register5(program2) {
|
|
|
686
947
|
});
|
|
687
948
|
p.command("refund <id>").option("--amount <cents>", "Amount in minor units (default: full)").option("--reason <r>").action(async (id, opts, cmd) => {
|
|
688
949
|
const g = cmd.optsWithGlobals();
|
|
689
|
-
|
|
950
|
+
const auth = resolveAuth(g);
|
|
951
|
+
const currency = opts.amount ? await currencyOf(auth, `/api/v1/payments/${id}`, g) : void 0;
|
|
952
|
+
await confirmAction({ message: `Refund ${opts.amount ? amountPhrase(Number(opts.amount), currency) : "the full balance"} on payment ${id}?`, yes: g.yes, json: g.json });
|
|
690
953
|
const body = {};
|
|
691
954
|
if (opts.amount) body.amount = Number(opts.amount);
|
|
692
955
|
if (opts.reason) body.reason = opts.reason;
|
|
@@ -694,7 +957,8 @@ function register5(program2) {
|
|
|
694
957
|
});
|
|
695
958
|
p.command("capture <id>").option("--amount <cents>", "Amount to capture (default: full authorized)").action(async (id, opts, cmd) => {
|
|
696
959
|
const g = cmd.optsWithGlobals();
|
|
697
|
-
|
|
960
|
+
const currency = opts.amount ? await currencyOf(resolveAuth(g), `/api/v1/payments/${id}`, g) : void 0;
|
|
961
|
+
await confirmAction({ message: `Capture ${opts.amount ? amountPhrase(Number(opts.amount), currency) : "the full authorized amount"} on payment ${id}?`, yes: g.yes, json: g.json });
|
|
698
962
|
const body = opts.amount ? { amount: Number(opts.amount) } : {};
|
|
699
963
|
renderObject(await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/capture`, { method: "POST", body: JSON.stringify(body) }), { json: Boolean(g.json) });
|
|
700
964
|
});
|
|
@@ -704,7 +968,8 @@ function register5(program2) {
|
|
|
704
968
|
if (!RECORD_METHODS.includes(opts.method)) {
|
|
705
969
|
throw new Error(`Unknown method '${opts.method}'. Expected one of: ${RECORD_METHODS.join(", ")}`);
|
|
706
970
|
}
|
|
707
|
-
|
|
971
|
+
const currency = await currencyOf(resolveAuth(g), `/api/v1/orders/${opts.order}`, g);
|
|
972
|
+
await confirmAction({ message: `Record ${amountPhrase(Number(opts.amount), currency)} (${opts.method}) on order ${opts.order}?`, yes: g.yes, json: g.json });
|
|
708
973
|
const body = { amount: Number(opts.amount), method: opts.method };
|
|
709
974
|
if (opts.receivedAt) body.receivedAt = opts.receivedAt;
|
|
710
975
|
if (opts.reference) body.reference = opts.reference;
|
|
@@ -718,7 +983,7 @@ function register5(program2) {
|
|
|
718
983
|
return;
|
|
719
984
|
}
|
|
720
985
|
const pay = r?.data ?? r;
|
|
721
|
-
success(`Recorded ${(pay.amount
|
|
986
|
+
success(`Recorded ${fmt(pay.amount, pay.currency)} (${pay.method ?? opts.method}) as ${pay.id}`);
|
|
722
987
|
});
|
|
723
988
|
p.command("mark-failed <id>").description("Declare a payment failed by hand (the wire that never arrived)").requiredOption("--reason <text>", "Why it failed \u2014 stored on the payment and the timeline").action(async (id, opts, cmd) => {
|
|
724
989
|
const g = cmd.optsWithGlobals();
|
|
@@ -793,7 +1058,7 @@ function register7(program2) {
|
|
|
793
1058
|
s.command("list").option("--customer <id>").option("--limit <n>").option("--cursor <c>").action(async (opts, cmd) => {
|
|
794
1059
|
const g = cmd.optsWithGlobals();
|
|
795
1060
|
const { data, pagination } = await callThrottleList(resolveAuth(g), "/api/v1/subscriptions" + qs({ customerId: opts.customer, limit: opts.limit, cursor: opts.cursor }));
|
|
796
|
-
renderList(data, [{ header: "ID", get: (x) => x.id }, { header: "STATUS", get: (x) => x.status }, { header: "PLAN", get: (x) => x.planName ?? x.planReference }, { header: "AMOUNT", get: (x) => x.amount }, { header: "RENEWS", get: (x) => x.currentPeriodEnd }], { json: Boolean(g.json), pagination });
|
|
1061
|
+
renderList(data, [{ header: "ID", get: (x) => x.id }, { header: "STATUS", get: (x) => x.status }, { header: "PLAN", get: (x) => x.planName ?? x.planReference }, { header: "AMOUNT", get: (x) => fmt(x.amount, x.currency) }, { header: "RENEWS", get: (x) => x.currentPeriodEnd }], { json: Boolean(g.json), pagination });
|
|
797
1062
|
});
|
|
798
1063
|
s.command("get <id>").action(async (id, _o, cmd) => {
|
|
799
1064
|
const g = cmd.optsWithGlobals();
|
|
@@ -825,14 +1090,15 @@ function register7(program2) {
|
|
|
825
1090
|
const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/waive-period`, { method: "POST", body: JSON.stringify({ reason: opts.reason }) });
|
|
826
1091
|
g.json ? renderObject(res, { json: true }) : success(`Waived the current period on ${id}`);
|
|
827
1092
|
});
|
|
828
|
-
s.command("change-plan <id>").requiredOption("--amount <cents>").option("--interval <i>", "weekly|biweekly|monthly|quarterly|yearly").option("--interval-unit <u>", "hour|day|week|month (with --interval-count)").option("--interval-count <n>", "every N units, up to one year").option("--plan-reference <r>").option("--plan-name <n>").option("--effective <e>", "now|period_end", "now").action(async (id, opts, cmd) => {
|
|
1093
|
+
s.command("change-plan <id>").requiredOption("--amount <cents>").option("--interval <i>", "weekly|biweekly|monthly|quarterly|yearly").option("--interval-unit <u>", "hour|day|week|month (with --interval-count)").option("--interval-count <n>", "every N units, up to one year").option("--plan-reference <r>").option("--plan-name <n>").option("--effective <e>", "now|period_end", "now").option("--allow-zero-amount", "allow --amount 0 (a free or usage-only plan); the API refuses 0 without it").action(async (id, opts, cmd) => {
|
|
829
1094
|
const g = cmd.optsWithGlobals();
|
|
830
1095
|
const custom = opts.intervalUnit !== void 0 || opts.intervalCount !== void 0;
|
|
831
1096
|
if (!opts.interval && !(opts.intervalUnit && opts.intervalCount)) {
|
|
832
1097
|
throw new Error("Pass --interval, or both --interval-unit and --interval-count");
|
|
833
1098
|
}
|
|
834
1099
|
const cadence = custom ? `every ${opts.intervalCount} ${opts.intervalUnit}` : opts.interval;
|
|
835
|
-
|
|
1100
|
+
const currency = await currencyOf(resolveAuth(g), `/api/v1/subscriptions/${id}`, g);
|
|
1101
|
+
await confirmAction({ message: `Change plan on ${id} \u2192 ${amountPhrase(Number(opts.amount), currency)}/${cadence} (${opts.effective})?`, yes: g.yes, json: g.json });
|
|
836
1102
|
const body = { amount: Number(opts.amount), effective: opts.effective };
|
|
837
1103
|
if (opts.interval) body.interval = opts.interval;
|
|
838
1104
|
if (custom) {
|
|
@@ -841,6 +1107,7 @@ function register7(program2) {
|
|
|
841
1107
|
}
|
|
842
1108
|
if (opts.planReference) body.planReference = opts.planReference;
|
|
843
1109
|
if (opts.planName) body.planName = opts.planName;
|
|
1110
|
+
if (opts.allowZeroAmount) body.allowZeroAmount = true;
|
|
844
1111
|
renderObject(await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/change-plan`, { method: "POST", body: JSON.stringify(body) }), { json: Boolean(g.json) });
|
|
845
1112
|
});
|
|
846
1113
|
s.command("cancel-pending-change <id>").description("Cancel a scheduled plan change").action(async (id, _o, cmd) => {
|
|
@@ -855,8 +1122,11 @@ function register8(program2) {
|
|
|
855
1122
|
const d = program2.command("discounts").description("Discount codes");
|
|
856
1123
|
d.command("list").action(async (_o, cmd) => {
|
|
857
1124
|
const g = cmd.optsWithGlobals();
|
|
858
|
-
const
|
|
859
|
-
|
|
1125
|
+
const auth = resolveAuth(g);
|
|
1126
|
+
const data = await callThrottle(auth, "/api/v1/discounts");
|
|
1127
|
+
const multi = !g.json && data.some((x) => x.type !== "percentage" && !x.currency && Object.keys(x.amounts ?? {}).length > 1);
|
|
1128
|
+
const main = multi ? await mainCurrencyOf(auth) : void 0;
|
|
1129
|
+
renderList(data, [{ header: "ID", get: (x) => x.id }, { header: "CODE", get: (x) => x.code }, { header: "TYPE", get: (x) => x.type }, { header: "VALUE", get: (x) => discountValue(x, main) }, { header: "ACTIVE", get: (x) => x.active }], { json: Boolean(g.json) });
|
|
860
1130
|
});
|
|
861
1131
|
d.command("create").requiredOption("--json-body <json>", "Discount JSON (code, type, value, \u2026)").action(async (opts, cmd) => {
|
|
862
1132
|
const g = cmd.optsWithGlobals();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/version.ts","../src/banner.ts","../src/lib/errors.ts","../../errors/dist/index.js","../src/lib/client.ts","../src/sentry.ts","../src/config/profiles.ts","../src/lib/key-format.ts","../src/lib/output.ts","../src/commands/config.ts","../src/commands/whoami.ts","../src/commands/orders.ts","../src/lib/confirm.ts","../src/commands/fulfillments.ts","../src/lib/qs.ts","../src/commands/returns.ts","../src/commands/payments.ts","../src/commands/customers.ts","../src/commands/subscriptions.ts","../src/commands/discounts.ts","../src/commands/webhooks.ts","../src/commands/extensions.ts","../src/commands/events.ts","../src/commands/embed.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLI_VERSION } from './version.js';\nimport { printBanner } from './banner.js';\nimport { handleError } from './lib/errors.js';\nimport { captureCliException, flushCliSentry, initCliSentry } from './sentry.js';\nimport { register as registerConfig } from './commands/config.js';\nimport { register as registerWhoami } from './commands/whoami.js';\nimport { register as registerOrders } from './commands/orders.js';\nimport { register as registerReturns } from './commands/returns.js';\nimport { register as registerPayments } from './commands/payments.js';\nimport { register as registerCustomers } from './commands/customers.js';\nimport { register as registerSubscriptions } from './commands/subscriptions.js';\nimport { register as registerDiscounts } from './commands/discounts.js';\nimport { register as registerWebhooks } from './commands/webhooks.js';\nimport { register as registerExtensions } from './commands/extensions.js';\nimport { register as registerEvents } from './commands/events.js';\nimport { register as registerEmbed } from './commands/embed.js';\n\ninitCliSentry();\n\nconst program = new Command();\nprogram\n .name('throttle')\n .description('Throttle command-line tool')\n .version(CLI_VERSION, '-v, --version', 'Print the CLI version')\n .option('--json', 'Machine-readable JSON output (implies non-interactive)')\n .option('-q, --quiet', 'Suppress the banner')\n .option('--profile <name>', 'Config profile to use')\n .option('--api-key <sk_>', 'API key (overrides profile / $THROTTLE_API_KEY)')\n .option('--api <url>', 'API base URL (overrides profile / $THROTTLE_API_URL)')\n .option('-y, --yes', 'Skip confirmation prompts');\n\nconst args = process.argv.slice(2);\nconst bannerless = args.includes('--json') || args.includes('-q') || args.includes('--quiet')\n || args.length === 0 || args.includes('-h') || args.includes('--help') || args.includes('-v') || args.includes('--version');\nif (!bannerless) printBanner({ version: CLI_VERSION });\n\nfor (const reg of [registerConfig, registerWhoami, registerOrders, registerReturns, registerPayments, registerCustomers, registerSubscriptions, registerDiscounts, registerWebhooks, registerEvents, registerEmbed, registerExtensions]) reg(program);\n\nprogram.parseAsync().catch(async (err) => {\n const code = handleError(err);\n captureCliException(err);\n await flushCliSentry();\n process.exit(code);\n});\n","import { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\n// Read the version from package.json at runtime, resolved relative to this\n// module, so the binary's reported version always matches the published\n// package and can never drift from a hardcoded constant.\n// - bundled: dist/cli.js -> ../package.json = packages/cli/package.json\n// - vitest: src/version.ts -> ../package.json = packages/cli/package.json\nconst pkg = JSON.parse(\n readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8'),\n) as { version: string };\n\nexport const CLI_VERSION: string = pkg.version;\n","const BRAND_BLUE = '\\x1b[38;2;29;86;232m';\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\n\n/**\n * Print a compact, always-aligned banner. The previous box-drawing \"logo\"\n * rendered disjointed across terminals; a clean styled wordmark is legible\n * everywhere and can't break.\n */\nexport function printBanner(opts?: { version?: string }): void {\n if (process.env.THROTTLE_CLI_NO_BANNER === '1') return;\n if (!process.stdout.isTTY) return;\n const v = opts?.version ? `v${opts.version}` : '';\n process.stderr.write(\n `${BRAND_BLUE}${BOLD}▸ throttle${RESET} ${DIM}CLI${v ? ' ' + v : ''} · docs https://usethrottle.dev/docs${RESET}\\n\\n`,\n );\n}\n","import pc from 'picocolors';\nimport { isThrottleError } from './client.js';\n\nconst HINTS: Record<string, string> = {\n insufficient_scopes: 'Your API key lacks a required scope. Mint a key with the needed scope in the dashboard.',\n environment_mismatch: 'This resource is in a different environment than your key. Use a key for the right environment.',\n refund_amount_exceeds_balance: 'The refund is larger than the captured balance remaining on this payment.',\n invalid_api_key: 'The API key is invalid or expired. Re-run `throttle config set` with a fresh key.',\n not_found: 'Not found (or your key cannot see it in this environment).',\n};\n\nexport function handleError(err: unknown): number {\n if (isThrottleError(err)) {\n process.stderr.write(pc.red('✗') + ` (${err.code}): ${err.message}\\n`);\n const hint = HINTS[err.code];\n if (hint) process.stderr.write(pc.dim(' ' + hint) + '\\n');\n return 1;\n }\n const exitCode = typeof (err as { exitCode?: unknown })?.exitCode === 'number' ? (err as { exitCode: number }).exitCode : 1;\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(pc.red('✗') + ' ' + message + '\\n');\n return exitCode;\n}\n","// src/index.ts\nvar ThrottleError = class extends Error {\n code;\n statusCode;\n details;\n body;\n requestId;\n constructor(args) {\n super(args.message);\n this.name = \"ThrottleError\";\n this.code = args.code;\n this.statusCode = args.statusCode;\n this.details = args.details;\n this.body = args.body;\n const fromBody = args.body?.meta?.requestId;\n const fromHeader = typeof args.responseHeaders?.get === \"function\" ? args.responseHeaders.get(\"x-request-id\") : args.responseHeaders?.[\"x-request-id\"];\n this.requestId = args.requestId ?? (typeof fromBody === \"string\" ? fromBody : void 0) ?? (typeof fromHeader === \"string\" ? fromHeader : void 0);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n};\nfunction isThrottleError(value) {\n return value instanceof ThrottleError;\n}\nexport {\n ThrottleError,\n isThrottleError\n};\n","import { ThrottleError, type ThrottleErrorArgs } from '@usethrottle/errors';\n\nexport interface AuthCtx { apiKey: string; apiBaseUrl: string }\n\nexport class ThrottleApiError extends ThrottleError {\n constructor(code: string, message: string, statusCode: number, responseHeaders?: ThrottleErrorArgs['responseHeaders']) {\n super({ code, message, statusCode, responseHeaders });\n this.name = 'ThrottleApiError';\n }\n}\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\n\nfunction url(auth: AuthCtx, path: string): string {\n return `${auth.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n}\nfunction headers(auth: AuthCtx, init: RequestInit): Record<string, string> {\n return { 'content-type': 'application/json', 'x-api-key': auth.apiKey, ...(init.headers as Record<string, string> ?? {}) };\n}\n\nexport interface Pagination { cursor: string | null; hasMore: boolean }\n\nasync function requestJson(auth: AuthCtx, path: string, init: RequestInit): Promise<Record<string, unknown>> {\n // Write verbs advertise `content-type: application/json`, so a bodyless\n // POST/PATCH/PUT would send an empty body that the API's object-body schemas\n // reject with `validation_error: body must be object`. Default to `{}` so\n // action commands that carry no payload (cancel, send-test, replay, …) work.\n const method = (init.method ?? 'GET').toUpperCase();\n if (init.body == null && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {\n init = { ...init, body: '{}' };\n }\n const res = await fetch(url(auth, path), { ...init, headers: headers(auth, init) });\n const text = await res.text();\n let body: Record<string, unknown> = {};\n try { body = text ? JSON.parse(text) : {}; } catch { /* non-JSON */ }\n if (!res.ok) {\n const err = body.error as { code?: string; message?: string } | undefined;\n const code = err?.code ?? `http_${res.status}`;\n const message = err?.message ?? `Request failed (${res.status}): ${text.slice(0, 120)}`;\n throw new ThrottleApiError(code, message, res.status, res.headers);\n }\n return body;\n}\n\nexport async function callThrottle<T>(auth: AuthCtx, path: string, init: RequestInit = {}): Promise<T> {\n const body = await requestJson(auth, path, init);\n // Use key presence, not `??`: a legitimate `{ \"data\": null }` success envelope\n // must unwrap to `null`, not fall through to the whole envelope object.\n return (body && typeof body === 'object' && 'data' in body ? body.data : (body as unknown)) as T;\n}\n\n/** List calls keep `meta.pagination` from the envelope so commands can surface the next cursor. */\nexport async function callThrottleList<T>(\n auth: AuthCtx, path: string, init: RequestInit = {},\n): Promise<{ data: T[]; pagination: Pagination | null }> {\n const body = await requestJson(auth, path, init);\n const data = ('data' in body ? body.data : body) as T[];\n const meta = body.meta as { pagination?: Pagination } | undefined;\n return { data: Array.isArray(data) ? data : [], pagination: meta?.pagination ?? null };\n}\n\nexport async function callThrottleText(auth: AuthCtx, path: string, init: RequestInit = {}): Promise<string> {\n const res = await fetch(url(auth, path), { ...init, headers: headers(auth, init) });\n const text = await res.text();\n if (!res.ok) throw new ThrottleApiError(`http_${res.status}`, text.slice(0, 120), res.status, res.headers);\n return text;\n}\n","import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport * as Sentry from '@sentry/node';\nimport type { Event, NodeOptions } from '@sentry/node';\n\ntype Env = Record<string, string | undefined>;\ntype EventHeaders = NonNullable<Event['request']>['headers'];\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nconst DEFAULT_CLI_DSN =\n 'https://519163f0134350c7b5845efee80f457c@o432365.ingest.us.sentry.io/4511401030516736';\n\nconst SENSITIVE_HEADER_KEYS = new Set([\n 'authorization',\n 'cookie',\n 'setcookie',\n 'xapikey',\n 'xthrottleapikey',\n]);\n\nconst SENSITIVE_EXTRA_KEYS = new Set([\n 'apikey',\n 'accesstoken',\n 'authorization',\n 'body',\n 'data',\n 'formdata',\n 'payload',\n 'rawbody',\n 'requestbody',\n 'token',\n]);\n\nfunction removeSensitiveKeys(\n value: Record<string, unknown> | undefined,\n sensitiveKeys: ReadonlySet<string>,\n): Record<string, unknown> | undefined {\n if (!value) return value;\n\n const keptEntries = Object.entries(value).filter(\n ([key]) => !sensitiveKeys.has(normalizeKey(key)),\n );\n return Object.fromEntries(keptEntries);\n}\n\nfunction isOptInValue(value: string | undefined): boolean {\n if (!value) return false;\n return ['1', 'true', 'yes', 'on'].includes(value.toLowerCase());\n}\n\nfunction readCliPackageRelease(): string | undefined {\n try {\n const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return packageJson.version ? `@usethrottle/cli@${packageJson.version}` : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function isCliSentryEnabled(env: Env = process.env): boolean {\n return isOptInValue(env.THROTTLE_CLI_TELEMETRY) || isOptInValue(env.THROTTLE_CLI_SENTRY_ENABLED);\n}\n\nexport function scrubCliSentryEvent<T extends Event>(event: T): T {\n if (event.request) {\n delete event.request.data;\n delete event.request.cookies;\n event.request.headers = removeSensitiveKeys(\n event.request.headers as Record<string, unknown> | undefined,\n SENSITIVE_HEADER_KEYS,\n ) as EventHeaders;\n }\n\n if (event.extra) {\n event.extra = removeSensitiveKeys(event.extra, SENSITIVE_EXTRA_KEYS);\n }\n\n if (event.user) {\n event.user = event.user.id ? { id: event.user.id } : undefined;\n }\n\n return event;\n}\n\nexport function buildCliSentryOptions(env: Env = process.env): NodeOptions {\n const enabled = isCliSentryEnabled(env);\n\n return {\n dsn: enabled ? (env.THROTTLE_CLI_SENTRY_DSN ?? env.SENTRY_DSN ?? DEFAULT_CLI_DSN) : undefined,\n enabled,\n environment: env.SENTRY_ENVIRONMENT ?? env.NODE_ENV ?? 'production',\n release: env.SENTRY_RELEASE ?? env.THROTTLE_CLI_RELEASE ?? readCliPackageRelease(),\n sendDefaultPii: false,\n tracesSampleRate: 0,\n beforeSend: scrubCliSentryEvent,\n };\n}\n\nexport function initCliSentry(env: Env = process.env): void {\n if (!isCliSentryEnabled(env) || Sentry.isInitialized()) return;\n\n Sentry.init(buildCliSentryOptions(env));\n}\n\nexport function captureCliException(error: unknown): void {\n if (!Sentry.isInitialized()) return;\n Sentry.captureException(error);\n}\n\nexport async function flushCliSentry(timeout = 2000): Promise<void> {\n if (!Sentry.isInitialized()) return;\n await Sentry.flush(timeout);\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { parseRawKey } from '../lib/key-format.js';\n\nexport interface Profile { apiKey: string; apiBaseUrl: string; label?: string }\nexport interface CliConfig { defaultProfile?: string; profiles: Record<string, Profile> }\n\nconst DEFAULT_API_URL = 'https://api.usethrottle.dev';\n\nexport class ConfigError extends Error { exitCode = 2; }\n\nfunction home(): string { return process.env.THROTTLE_CONFIG_HOME || join(homedir(), '.throttle'); }\nexport function configPath(): string { return join(home(), 'config.json'); }\n\nexport function loadConfig(): CliConfig {\n const p = configPath();\n if (!existsSync(p)) return { profiles: {} };\n try { return JSON.parse(readFileSync(p, 'utf8')) as CliConfig; }\n catch { throw new ConfigError(`Config at ${p} is not valid JSON`); }\n}\n\nexport function saveConfig(cfg: CliConfig): void {\n mkdirSync(home(), { recursive: true });\n const p = configPath();\n writeFileSync(p, JSON.stringify(cfg, null, 2) + '\\n', { mode: 0o600 });\n chmodSync(p, 0o600);\n}\n\nexport function setProfile(name: string, prof: Profile): void {\n const cfg = loadConfig();\n cfg.profiles[name] = prof;\n if (!cfg.defaultProfile) cfg.defaultProfile = name;\n saveConfig(cfg);\n}\n\nexport function useProfile(name: string): void {\n const cfg = loadConfig();\n if (!cfg.profiles[name]) throw new ConfigError(`No profile named \"${name}\"`);\n cfg.defaultProfile = name;\n saveConfig(cfg);\n}\n\nexport function removeProfile(name: string): void {\n const cfg = loadConfig();\n if (!cfg.profiles[name]) throw new ConfigError(`No profile named \"${name}\"`);\n delete cfg.profiles[name];\n if (cfg.defaultProfile === name) cfg.defaultProfile = Object.keys(cfg.profiles)[0];\n saveConfig(cfg);\n}\n\nexport function maskKey(key: string): string {\n if (key.length <= 12) return '****';\n const parsed = parseRawKey(key);\n const prefix = parsed ? `${parsed.type}_${parsed.environment}_` : key.slice(0, 4);\n return `${prefix}…${key.slice(-4)}`;\n}\n\nexport function resolveAuth(globals: { profile?: string; apiKey?: string; api?: string }): { apiKey: string; apiBaseUrl: string } {\n const cfg = loadConfig();\n const profName = globals.profile ?? cfg.defaultProfile;\n const prof = profName ? cfg.profiles[profName] : undefined;\n if (globals.profile && !prof) throw new ConfigError(`No profile named \"${globals.profile}\"`);\n const apiKey = globals.apiKey ?? process.env.THROTTLE_API_KEY ?? prof?.apiKey;\n if (!apiKey) throw new ConfigError('No API key. Set one with `throttle config set <name> --api-key sk_...`, pass --api-key, or set $THROTTLE_API_KEY.');\n const apiBaseUrl = globals.api ?? process.env.THROTTLE_API_URL ?? prof?.apiBaseUrl ?? DEFAULT_API_URL;\n return { apiKey, apiBaseUrl };\n}\n","/**\n * Throttle raw API keys are `<type>_<environment segment>_<64 hex>`, where the\n * environment segment is the workspace environment's normalized slug — `live`\n * for production, `test` / `uat` / anything else for non-production. The\n * segment may itself contain underscores (`production_1`), so anchor on the\n * fixed-length hex tail rather than splitting on the first underscore.\n */\nconst KEY_RE = /^(sk|pk)_([a-z0-9_]+)_([0-9a-f]{64})$/;\n\nexport interface ParsedKey {\n type: string;\n environment: string;\n random: string;\n}\n\nexport function parseRawKey(key: string): ParsedKey | null {\n const m = KEY_RE.exec(key);\n if (!m) return null;\n return { type: m[1], environment: m[2], random: m[3] };\n}\n\n/** Reconstruct the server-side `key_prefix`: type + first 16 chars of the random tail. */\nexport function storedPrefixOf(key: string): string {\n const parsed = parseRawKey(key);\n if (!parsed) return key.slice(0, 16);\n return `${parsed.type}_${parsed.random.slice(0, 16)}`;\n}\n\n/** Environment segment as minted (`live`, `test`, `uat`, …), or `unknown`. */\nexport function modeOf(key: string): string {\n return parseRawKey(key)?.environment ?? 'unknown';\n}\n","import pc from 'picocolors';\nimport type { Pagination } from './client.js';\n\nexport interface Column<T> { header: string; get: (row: T) => unknown }\n\nfunction cell(v: unknown): string { return v === null || v === undefined ? '' : String(v); }\n\nexport function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + '\\n');\n}\n\nexport function renderList<T>(rows: T[], columns: Column<T>[], opts: { json: boolean; pagination?: Pagination | null }): void {\n // Paginated commands pass `pagination` (possibly null) and get the { data, pagination }\n // envelope under --json; commands without cursors omit it and keep the bare array.\n if (opts.json) { printJson(opts.pagination === undefined ? rows : { data: rows, pagination: opts.pagination }); return; }\n if (rows.length === 0) { process.stdout.write(pc.dim('No results.\\n')); return; }\n const headers = columns.map((c) => c.header);\n const body = rows.map((r) => columns.map((c) => cell(c.get(r))));\n const widths = headers.map((h, i) => Math.max(h.length, ...body.map((row) => row[i].length)));\n const line = (cells: string[]) => cells.map((v, i) => v.padEnd(widths[i])).join(' ').trimEnd();\n process.stdout.write(pc.bold(line(headers)) + '\\n');\n for (const row of body) process.stdout.write(line(row) + '\\n');\n if (opts.pagination?.cursor) process.stdout.write(pc.dim(`More results — next page: --cursor ${opts.pagination.cursor}\\n`));\n}\n\nexport function renderObject(obj: unknown, opts: { json: boolean }): void {\n if (opts.json) { printJson(obj); return; }\n if (obj === null || typeof obj !== 'object') { process.stdout.write(cell(obj) + '\\n'); return; }\n const entries = Object.entries(obj as Record<string, unknown>);\n const w = Math.max(0, ...entries.map(([k]) => k.length));\n for (const [k, v] of entries) {\n const val = v !== null && typeof v === 'object' ? JSON.stringify(v) : cell(v);\n process.stdout.write(`${pc.dim(k.padEnd(w))} ${val}\\n`);\n }\n}\n\nexport function success(msg: string): void { process.stdout.write(pc.green('✓') + ' ' + msg + '\\n'); }\nexport function note(msg: string): void { process.stdout.write(pc.dim(msg) + '\\n'); }\n","import { Command } from 'commander';\nimport { setProfile, useProfile, removeProfile, loadConfig, maskKey, ConfigError } from '../config/profiles.js';\nimport { renderList, success } from '../lib/output.js';\n\nexport function register(program: Command): void {\n const config = program.command('config').description('Manage local CLI profiles (~/.throttle/config.json)');\n\n config.command('set <profile>')\n .description('Create or update a profile')\n // Not .requiredOption: --api-key/--api share a name with the top-level\n // global options in index.ts, and Commander resolves a shared option\n // name at the ANCESTOR command that declares it — the value never\n // reaches this subcommand's own local slot, so a native required-option\n // check here would always fail once wired into the full program. Read\n // the effective value via optsWithGlobals() (root wins if it captured\n // the flag, else this command's own value/default is used) and validate\n // manually instead.\n .option('--api-key <sk_>', 'Throttle API key')\n .option('--api <url>', 'API base URL', 'https://api.usethrottle.dev')\n .option('--label <text>', 'Human label')\n .action((name, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (!g.apiKey) throw new ConfigError('required option \\'--api-key <sk_>\\' not specified');\n setProfile(name, { apiKey: g.apiKey, apiBaseUrl: g.api, label: opts.label });\n success(`Saved profile \"${name}\"`);\n });\n\n config.command('use <profile>').description('Set the default profile')\n .action((name) => { useProfile(name); success(`Default profile is now \"${name}\"`); });\n\n config.command('remove <profile>').description('Delete a profile')\n .action((name) => { removeProfile(name); success(`Removed profile \"${name}\"`); });\n\n config.command('list').description('List profiles (keys masked)')\n // Same shared-name caveat as `set` above: --json also exists as a\n // top-level global option, so read the effective value from\n // optsWithGlobals() rather than this command's own local opts.\n .option('--json', 'Output JSON')\n .action((opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const cfg = loadConfig();\n const rows = Object.entries(cfg.profiles).map(([name, p]) => ({\n name, default: name === cfg.defaultProfile ? '*' : '', apiBaseUrl: p.apiBaseUrl, apiKey: maskKey(p.apiKey), label: p.label ?? '',\n }));\n renderList(rows, [\n { header: 'NAME', get: (r) => r.name }, { header: 'DEFAULT', get: (r) => r.default },\n { header: 'API', get: (r) => r.apiBaseUrl }, { header: 'KEY', get: (r) => r.apiKey }, { header: 'LABEL', get: (r) => r.label },\n ], { json: Boolean(g.json) });\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, isThrottleError } from '../lib/client.js';\nimport { modeOf, storedPrefixOf } from '../lib/key-format.js';\nimport { renderObject } from '../lib/output.js';\n\ninterface ApiKeyRow {\n keyPrefix: string;\n applicationId: string;\n environmentId: string;\n environmentSlug?: string;\n environmentKind?: string;\n scopes: string[];\n}\n\nexport function register(program: Command): void {\n program\n .command('whoami')\n .description('Show the active key context (environment + granted scopes)')\n .action(async (_opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const auth = resolveAuth(g);\n const info: Record<string, unknown> = {\n apiBaseUrl: auth.apiBaseUrl,\n mode: modeOf(auth.apiKey),\n keyPrefix: storedPrefixOf(auth.apiKey),\n };\n // Enrich with environment + this key's scopes when the key can list keys\n // (needs merchant:read). `/auth/permissions` is Clerk/workspace-only and\n // rejects api keys, so we derive context from the api-keys catalog instead.\n try {\n const keys = await callThrottle<ApiKeyRow[]>(auth, '/api/v1/api-keys');\n const first = keys[0];\n if (first) {\n info.applicationId = first.applicationId;\n info.environmentId = first.environmentId;\n if (first.environmentSlug) info.environment = first.environmentSlug;\n if (first.environmentKind) info.environmentKind = first.environmentKind;\n }\n const mine = keys.find((k) => k.keyPrefix === info.keyPrefix);\n info.scopes = mine ? mine.scopes : '(this key not found in the catalog)';\n info.authenticated = true;\n } catch (err) {\n if (!isThrottleError(err)) throw err;\n // 401 = the key itself is invalid/expired. 403 = the key authenticated\n // fine but can't read the api-key catalog (needs merchant:read + the\n // dashboard `application:api-keys` permission, which api keys lack), so\n // environment/scopes can't be shown — the key is still valid.\n info.authenticated = err.statusCode === 401 ? false : true;\n if (err.statusCode !== 401) {\n info.note = `key valid; environment/scopes unavailable to api keys (${err.code})`;\n }\n }\n renderObject(info, { json: Boolean(g.json) });\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList, callThrottleText } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { registerFulfillments } from './fulfillments.js';\nimport { qs } from '../lib/qs.js';\n\ninterface TimelineEntry { id: string; at: string; kind: string; title: string; detail?: string | null; amount?: number | null; currency?: string | null; source: string; reason?: string | null }\n\ninterface Order { id: string; orderNumber?: string; status: string; displayStatus?: string; paymentStatus?: string; total: number; currency: string; createdAt?: string; onHold?: boolean; holdReason?: string | null }\n\nexport function register(program: Command): void {\n const orders = program.command('orders').description('Orders + order detail');\n\n orders.command('list')\n .description('List orders')\n .option('--status <s>').option('--payment-status <s>').option('--type <t>').option('--source <s>')\n .option('--delivery <state>', 'Where the goods are: in_transit | delivered | returned')\n .option('-q, --query <text>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const auth = resolveAuth(g);\n const path = '/api/v1/orders' + qs({ status: opts.status, paymentStatus: opts.paymentStatus, type: opts.type, source: opts.source, delivery: opts.delivery, q: opts.query, limit: opts.limit, cursor: opts.cursor });\n const { data, pagination } = await callThrottleList<Order>(auth, path);\n renderList(data, [\n { header: 'ID', get: (o) => o.id }, { header: 'NUMBER', get: (o) => o.orderNumber },\n { header: 'STATUS', get: (o) => o.displayStatus ?? o.status },\n // Its own column, not part of STATUS: a hold says nothing about money\n // or delivery, and folding it into the status text would claim it does.\n { header: 'HOLD', get: (o) => (o.onHold ? 'on hold' : '') },\n { header: 'TOTAL', get: (o) => `${(o.total / 100).toFixed(2)} ${o.currency}` },\n ], { json: Boolean(g.json), pagination });\n });\n\n orders.command('get <id>').description('Show an order')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/orders/${id}`), { json: Boolean(g.json) });\n });\n\n orders.command('cancel <id>').description('Cancel an order')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Cancel order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/cancel`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Order ${id} cancelled`);\n });\n\n const ORDER_STATUSES = [\n 'draft',\n 'pending',\n 'processing',\n 'partially_fulfilled',\n 'fulfilled',\n 'cancelled',\n 'closed',\n ];\n\n orders.command('status <id> <status>')\n .description(`Set an order status (${ORDER_STATUSES.join(' | ')}). Moves in both directions.`)\n .option('--reason <text>', 'Note recorded on the status-history row')\n .action(async (id, status, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (!ORDER_STATUSES.includes(status)) {\n throw new Error(`Unknown status '${status}'. Expected one of: ${ORDER_STATUSES.join(', ')}`);\n }\n await confirmAction({ message: `Set order ${id} to ${status}?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { status };\n if (opts.reason) body.reason = opts.reason;\n renderObject(\n await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/status`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n { json: Boolean(g.json) },\n );\n });\n\n orders.command('comp <id>')\n .description(\"Waive the order's remaining balance (no processor is contacted)\")\n .requiredOption('--reason <text>', 'Why the balance is being waived (3-500 chars)')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Waive the remaining balance on order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/comp`, {\n method: 'POST',\n body: JSON.stringify({ reason: opts.reason }),\n });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order & { compAmount?: number };\n success(`Comped ${((o.compAmount ?? 0) / 100).toFixed(2)} ${o.currency} on ${o.orderNumber ?? id}`);\n });\n\n orders.command('comp-reverse <id>')\n .description('Undo a comp; the order owes its balance again')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Reverse the comp on order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/comp/reverse`, { method: 'POST' });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order;\n success(`Comp reversed on ${o.orderNumber ?? id}; total is ${(o.total / 100).toFixed(2)} ${o.currency}`);\n });\n\n orders.command('hold <id>')\n .description('Freeze an order: no transitions, no manual money, no new fulfillments')\n .requiredOption('--reason <text>', 'Why the order is frozen (1-500 chars); whoever finds it later reads this')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Put order ${id} on hold?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/hold`, {\n method: 'POST',\n body: JSON.stringify({ reason: opts.reason }),\n });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order;\n success(`${o.orderNumber ?? id} is on hold: ${o.holdReason ?? opts.reason}`);\n });\n\n orders.command('release-hold <id>')\n .description('Unfreeze an order')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Release the hold on order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/hold/release`, { method: 'POST' });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order;\n success(`Hold released on ${o.orderNumber ?? id}`);\n });\n\n orders.command('history <id>').description('Show an order\\'s status history')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/status-history`);\n const rows = (r as any)?.data ?? r;\n renderList(rows, [\n { header: 'WHEN', get: (h: any) => h.createdAt },\n { header: 'FROM', get: (h: any) => h.fromStatus ?? '—' },\n { header: 'TO', get: (h: any) => h.toStatus },\n { header: 'BY', get: (h: any) => h.actorType },\n { header: 'SOURCE', get: (h: any) => h.source },\n { header: 'REASON', get: (h: any) => h.reason ?? '' },\n ], { json: Boolean(g.json) });\n });\n\n orders.command('timeline <id>')\n .description(\"Everything that happened to an order — status, money and goods — newest first\")\n .option('--limit <n>', 'Rows to fetch (1-200, default 50)')\n .option('--cursor <c>')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const path = `/api/v1/orders/${id}/timeline` + qs({ limit: opts.limit, cursor: opts.cursor });\n const { data, pagination } = await callThrottleList<TimelineEntry>(resolveAuth(g), path);\n renderList(data, [\n { header: 'WHEN', get: (e) => e.at },\n { header: 'KIND', get: (e) => e.kind },\n { header: 'WHAT', get: (e) => e.title },\n { header: 'DETAIL', get: (e) => e.detail ?? '' },\n { header: 'AMOUNT', get: (e) => (e.amount == null ? '' : `${(e.amount / 100).toFixed(2)} ${e.currency ?? ''}`.trim()) },\n { header: 'REASON', get: (e) => e.reason ?? '' },\n { header: 'SOURCE', get: (e) => e.source },\n ], { json: Boolean(g.json), pagination });\n });\n\n orders.command('export')\n .description('Export orders as CSV (respects filters)')\n .option('--status <s>').option('--payment-status <s>').option('--type <t>').option('--source <s>')\n .option('-o, --out <file>', 'Write to file instead of stdout')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const path = '/api/v1/orders/export.csv' + qs({ status: opts.status, paymentStatus: opts.paymentStatus, type: opts.type, source: opts.source });\n const csv = await callThrottleText(resolveAuth(g), path);\n if (opts.out) { writeFileSync(opts.out, csv); success(`Wrote ${opts.out}`); } else process.stdout.write(csv);\n });\n\n orders.command('line-items <id>')\n .description('Edit order line items (JSON for add/update; comma ids for remove)')\n .option('--add <json>', 'JSON array: [{\"name\",\"unitPrice\",\"quantity\"}]')\n .option('--update <json>', 'JSON array: [{\"lineItemId\",\"quantity\"?,\"unitPrice\"?}]')\n .option('--remove <ids>', 'Comma-separated line item ids')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.add) body.add = JSON.parse(opts.add);\n if (opts.update) body.update = JSON.parse(opts.update);\n if (opts.remove) body.remove = String(opts.remove).split(',').map((s) => s.trim());\n await confirmAction({ message: `Edit line items on ${id} (may charge/refund the delta)?`, yes: g.yes, json: g.json });\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/line-items`, { method: 'PATCH', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n registerFulfillments(orders);\n}\n","import prompts from 'prompts';\n\nexport class ConfirmError extends Error { exitCode: number; constructor(m: string, code = 1) { super(m); this.exitCode = code; } }\n\nexport async function confirmAction(opts: { message: string; yes?: boolean; json?: boolean }): Promise<void> {\n if (opts.yes) return;\n if (opts.json || !process.stdin.isTTY) {\n throw new ConfirmError('This action needs confirmation. Re-run with --yes to proceed non-interactively.', 2);\n }\n const res = await prompts({ type: 'confirm', name: 'ok', message: opts.message, initial: false }, { onCancel: () => { throw new ConfirmError('Aborted.', 1); } });\n if (!res.ok) throw new ConfirmError('Aborted.', 1);\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\n\nconst base = (orderId: string) => `/api/v1/orders/${orderId}/fulfillments`;\n\nexport function registerFulfillments(orders: Command): void {\n const f = orders.command('fulfillments').description('Order fulfillments');\n\n f.command('list <orderId>').action(async (orderId, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), base(orderId));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'STATUS', get: (x) => x.status }, { header: 'TYPE', get: (x) => x.type }], { json: Boolean(g.json) });\n });\n\n f.command('get <orderId> <id>').action(async (orderId, id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `${base(orderId)}/${id}`), { json: Boolean(g.json) });\n });\n\n f.command('create <orderId>').option('--items <json>', 'JSON array of items').action(async (orderId, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Create a fulfillment on ${orderId}?`, yes: g.yes, json: g.json });\n const body = opts.items ? { items: JSON.parse(opts.items) } : {};\n renderObject(await callThrottle(resolveAuth(g), base(orderId), { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n const transition = (name: string, verb: 'POST', suffix: string, msg: (o: string, i: string) => string) =>\n f.command(`${name} <orderId> <id>`).action(async (orderId, id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: msg(orderId, id), yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `${base(orderId)}/${id}/${suffix}`, { method: verb });\n g.json ? renderObject(r, { json: true }) : success(`Fulfillment ${id} → ${name}`);\n });\n transition('processing', 'POST', 'processing', (o, i) => `Mark fulfillment ${i} processing?`);\n transition('complete', 'POST', 'complete', (o, i) => `Complete fulfillment ${i}?`);\n transition('cancel', 'POST', 'cancel', (o, i) => `Cancel fulfillment ${i}?`);\n\n // Only the fulfillment id: the endpoint is flat (`/api/v1/fulfillments/:id/delivered`)\n // because a carrier tracking webhook knows the fulfillment, not the order.\n // Asking for an orderId here would invent a parameter the API does not take.\n f.command('delivered <id>')\n .description('Record that a shipment arrived')\n .option('--at <iso8601>', 'When it arrived (defaults to now)')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Mark shipment for fulfillment ${id} delivered?`, yes: g.yes, json: g.json });\n const r = await callThrottle<any>(resolveAuth(g), `/api/v1/fulfillments/${id}/delivered`, {\n method: 'POST',\n body: JSON.stringify(opts.at ? { deliveredAt: opts.at } : {}),\n });\n g.json\n ? renderObject(r, { json: true })\n : success(`Fulfillment ${id} delivered ${r?.actualDelivery ?? ''}`.trim());\n });\n\n f.command('ship <orderId> <id>')\n .requiredOption('--carrier <c>').requiredOption('--tracking <t>')\n .action(async (orderId, id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Mark fulfillment ${id} shipped (${opts.carrier} ${opts.tracking})?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `${base(orderId)}/${id}/shipment`, { method: 'PATCH', body: JSON.stringify({ carrier: opts.carrier, trackingNumber: opts.tracking }) });\n g.json ? renderObject(r, { json: true }) : success(`Fulfillment ${id} shipped`);\n });\n}\n","/**\n * Build a query-string suffix from defined params.\n * Returns `?a=1&b=2` (leading `?`) when any value is set, else `''`.\n * Undefined values are skipped so callers can pass optional filters directly.\n */\nexport function qs(params: Record<string, string | undefined>): string {\n const s = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) if (v !== undefined) s.set(k, v);\n const str = s.toString();\n return str ? `?${str}` : '';\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\n\nexport function register(program: Command): void {\n const r = program.command('returns').description('Returns / RMA (order detail → Returns)');\n\n r.command('list').requiredOption('--order <orderId>').action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), `/api/v1/orders/${opts.order}/returns`);\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'STATUS', get: (x) => x.status }, { header: 'REFUND', get: (x) => x.refundAmount }], { json: Boolean(g.json) });\n });\n\n r.command('open').requiredOption('--order <orderId>').requiredOption('--items <json>', 'JSON array of {lineItemId, quantity}')\n .option('--reason <r>').option('--restock')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Open a return on order ${opts.order}?`, yes: g.yes, json: g.json });\n const body = { items: JSON.parse(opts.items), reason: opts.reason, restock: Boolean(opts.restock) };\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/orders/${opts.order}/returns`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n r.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/returns/${id}`), { json: Boolean(g.json) });\n });\n\n r.command('transition <id>').requiredOption('--action <a>', 'approve|receive|complete|reject|cancel')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Transition return ${id} → ${opts.action}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/returns/${id}/transition`, { method: 'POST', body: JSON.stringify({ action: opts.action }) });\n g.json ? renderObject(res, { json: true }) : success(`Return ${id} → ${opts.action}`);\n });\n\n r.command('exchange <id>').requiredOption('--items <json>', 'JSON array of replacement items')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Complete return ${id} as an exchange (may charge/refund the delta)?`, yes: g.yes, json: g.json });\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/returns/${id}/exchange`, { method: 'POST', body: JSON.stringify({ items: JSON.parse(opts.items) }) }), { json: Boolean(g.json) });\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\n\nexport function register(program: Command): void {\n const p = program.command('payments').description('Payment actions (order detail + invoices)');\n\n p.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/payments/${id}`), { json: Boolean(g.json) });\n });\n\n p.command('refund <id>').option('--amount <cents>', 'Amount in minor units (default: full)').option('--reason <r>')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Refund ${opts.amount ? opts.amount + ' minor units' : 'the full balance'} on payment ${id}?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = {};\n if (opts.amount) body.amount = Number(opts.amount);\n if (opts.reason) body.reason = opts.reason;\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/refund`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n p.command('capture <id>').option('--amount <cents>', 'Amount to capture (default: full authorized)')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Capture ${opts.amount ? opts.amount + ' minor units' : 'the full authorized amount'} on payment ${id}?`, yes: g.yes, json: g.json });\n const body = opts.amount ? { amount: Number(opts.amount) } : {};\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/capture`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n const RECORD_METHODS = ['cash', 'bank_transfer', 'cheque', 'external'];\n\n p.command('record')\n .description('Record money that arrived outside Throttle')\n .requiredOption('--order <id>', 'Order the money is for')\n .requiredOption('--amount <cents>', 'Amount in minor units')\n .requiredOption('--method <method>', RECORD_METHODS.join(' | '))\n .option('--received-at <date>', 'ISO date-time the money arrived (default: now)')\n .option('--reference <text>', 'Cheque number, till id, wire reference')\n .option('--note <text>', 'Free-text note')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (!RECORD_METHODS.includes(opts.method)) {\n throw new Error(`Unknown method '${opts.method}'. Expected one of: ${RECORD_METHODS.join(', ')}`);\n }\n await confirmAction({ message: `Record ${opts.amount} minor units (${opts.method}) on order ${opts.order}?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { amount: Number(opts.amount), method: opts.method };\n if (opts.receivedAt) body.receivedAt = opts.receivedAt;\n if (opts.reference) body.reference = opts.reference;\n if (opts.note) body.note = opts.note;\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${opts.order}/payments/record`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n if (g.json) { renderObject(r, { json: true }); return; }\n const pay = ((r as any)?.data ?? r) as { id: string; amount: number; currency: string; method?: string };\n success(`Recorded ${(pay.amount / 100).toFixed(2)} ${pay.currency} (${pay.method ?? opts.method}) as ${pay.id}`);\n });\n\n p.command('mark-failed <id>')\n .description('Declare a payment failed by hand (the wire that never arrived)')\n .requiredOption('--reason <text>', 'Why it failed — stored on the payment and the timeline')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Mark payment ${id} failed?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/mark-failed`, {\n method: 'POST',\n body: JSON.stringify({ reason: opts.reason }),\n });\n g.json ? renderObject(r, { json: true }) : success(`Payment ${id} marked failed`);\n });\n\n p.command('resend-invoice <id>').description('Re-send the invoice email for a payment')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const r = await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/invoice/resend`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Invoice resent for payment ${id}`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { qs } from '../lib/qs.js';\n\nexport function register(program: Command): void {\n const c = program.command('customers').description('Customers');\n\n c.command('list').option('-q, --query <text>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const { data, pagination } = await callThrottleList<any>(resolveAuth(g), '/api/v1/customers' + qs({ q: opts.query, limit: opts.limit, cursor: opts.cursor }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'EMAIL', get: (x) => x.email }, { header: 'NAME', get: (x) => [x.firstName, x.lastName].filter(Boolean).join(' ') }, { header: 'EXTERNAL', get: (x) => x.externalId }], { json: Boolean(g.json), pagination });\n });\n\n c.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}`), { json: Boolean(g.json) });\n });\n\n c.command('create').requiredOption('--email <e>').option('--first-name <n>').option('--last-name <n>')\n .option('--name <n>', 'Alias for --first-name').option('--external-id <x>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = { email: opts.email };\n if (opts.firstName ?? opts.name) body.firstName = opts.firstName ?? opts.name;\n if (opts.lastName) body.lastName = opts.lastName;\n if (opts.externalId) body.externalId = opts.externalId;\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/customers', { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n c.command('update <id>').option('--email <e>').option('--first-name <n>').option('--last-name <n>')\n .option('--name <n>', 'Alias for --first-name').option('--external-id <x>')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.email) body.email = opts.email;\n if (opts.firstName ?? opts.name) body.firstName = opts.firstName ?? opts.name;\n if (opts.lastName) body.lastName = opts.lastName;\n if (opts.externalId !== undefined) body.externalId = opts.externalId;\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}`, { method: 'PATCH', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n const addr = c.command('addresses').description('Customer addresses');\n addr.command('list <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), `/api/v1/customers/${id}/addresses`);\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'LINE1', get: (x) => x.line1 }, { header: 'CITY', get: (x) => x.city }, { header: 'COUNTRY', get: (x) => x.country }], { json: Boolean(g.json) });\n });\n addr.command('add <id>').requiredOption('--json-body <json>', 'Address JSON').action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}/addresses`, { method: 'POST', body: opts.jsonBody }), { json: Boolean(g.json) });\n });\n addr.command('update <id> <addrId>').requiredOption('--json-body <json>', 'Address JSON').action(async (id, addrId, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}/addresses/${addrId}`, { method: 'PATCH', body: opts.jsonBody }), { json: Boolean(g.json) });\n });\n addr.command('remove <id> <addrId>').action(async (id, addrId, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Delete address ${addrId} on customer ${id}?`, yes: g.yes, json: g.json });\n await callThrottle(resolveAuth(g), `/api/v1/customers/${id}/addresses/${addrId}`, { method: 'DELETE' });\n success(`Address ${addrId} removed`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { qs } from '../lib/qs.js';\n\nexport function register(program: Command): void {\n const s = program.command('subscriptions').description('Subscriptions');\n\n s.command('list').option('--customer <id>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const { data, pagination } = await callThrottleList<any>(resolveAuth(g), '/api/v1/subscriptions' + qs({ customerId: opts.customer, limit: opts.limit, cursor: opts.cursor }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'STATUS', get: (x) => x.status }, { header: 'PLAN', get: (x) => x.planName ?? x.planReference }, { header: 'AMOUNT', get: (x) => x.amount }, { header: 'RENEWS', get: (x) => x.currentPeriodEnd }], { json: Boolean(g.json), pagination });\n });\n\n s.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}`), { json: Boolean(g.json) });\n });\n\n s.command('cancel <id>').option('--at-period-end', 'Cancel at the period boundary instead of now')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Cancel subscription ${id}${opts.atPeriodEnd ? ' at period end' : ' now'}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/cancel`, { method: 'POST', body: JSON.stringify({ atPeriodEnd: Boolean(opts.atPeriodEnd) }) });\n g.json ? renderObject(res, { json: true }) : success(`Subscription ${id} cancelled`);\n });\n\n for (const verb of ['pause', 'resume'] as const) {\n s.command(`${verb} <id>`).action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `${verb[0].toUpperCase() + verb.slice(1)} subscription ${id}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/${verb}`, { method: 'POST' });\n g.json ? renderObject(res, { json: true }) : success(`Subscription ${id} ${verb}d`);\n });\n }\n\n // Both only apply to a past-due subscription — the API answers 422 otherwise,\n // and the message says which state it found.\n s.command('retry-charge <id>').description(\"Retry a past-due subscription's failed renewal charge now\")\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Charge the saved card for subscription ${id} now?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/retry-charge`, { method: 'POST' });\n g.json ? renderObject(res, { json: true }) : success(`Retried the charge on ${id} — status is now ${(res as any)?.status ?? 'unknown'}`);\n });\n\n s.command('waive-period <id>').description('Forgive the current period on a past-due subscription (settles it at zero)')\n .requiredOption('--reason <r>', 'Why the money is not being collected — recorded on the order')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Write off the current period on subscription ${id}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/waive-period`, { method: 'POST', body: JSON.stringify({ reason: opts.reason }) });\n g.json ? renderObject(res, { json: true }) : success(`Waived the current period on ${id}`);\n });\n\n s.command('change-plan <id>')\n .requiredOption('--amount <cents>')\n .option('--interval <i>', 'weekly|biweekly|monthly|quarterly|yearly')\n .option('--interval-unit <u>', 'hour|day|week|month (with --interval-count)')\n .option('--interval-count <n>', 'every N units, up to one year')\n .option('--plan-reference <r>').option('--plan-name <n>').option('--effective <e>', 'now|period_end', 'now')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const custom = opts.intervalUnit !== undefined || opts.intervalCount !== undefined;\n if (!opts.interval && !(opts.intervalUnit && opts.intervalCount)) {\n throw new Error('Pass --interval, or both --interval-unit and --interval-count');\n }\n const cadence = custom ? `every ${opts.intervalCount} ${opts.intervalUnit}` : opts.interval;\n await confirmAction({ message: `Change plan on ${id} → ${opts.amount}/${cadence} (${opts.effective})?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { amount: Number(opts.amount), effective: opts.effective };\n if (opts.interval) body.interval = opts.interval;\n if (custom) {\n body.intervalUnit = opts.intervalUnit;\n body.intervalCount = Number(opts.intervalCount);\n }\n if (opts.planReference) body.planReference = opts.planReference;\n if (opts.planName) body.planName = opts.planName;\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/change-plan`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n s.command('cancel-pending-change <id>').description('Cancel a scheduled plan change')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/pending-change`, { method: 'DELETE' });\n success(`Cleared pending change on ${id}`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\n\nexport function register(program: Command): void {\n const d = program.command('discounts').description('Discount codes');\n\n d.command('list').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), '/api/v1/discounts');\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'CODE', get: (x) => x.code }, { header: 'TYPE', get: (x) => x.type }, { header: 'VALUE', get: (x) => x.value }, { header: 'ACTIVE', get: (x) => x.active }], { json: Boolean(g.json) });\n });\n\n d.command('create').requiredOption('--json-body <json>', 'Discount JSON (code, type, value, …)')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/discounts', { method: 'POST', body: opts.jsonBody }), { json: Boolean(g.json) });\n });\n\n d.command('toggle <id>').option('--active', 'Enable').option('--inactive', 'Disable')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (Boolean(opts.active) === Boolean(opts.inactive)) { const e = new Error('Pass exactly one of --active or --inactive'); (e as any).exitCode = 2; throw e; }\n const active = Boolean(opts.active);\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/discounts/${id}`, { method: 'PATCH', body: JSON.stringify({ active }) }), { json: Boolean(g.json) });\n });\n\n d.command('delete <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Delete discount ${id}?`, yes: g.yes, json: g.json });\n await callThrottle(resolveAuth(g), `/api/v1/discounts/${id}`, { method: 'DELETE' });\n success(`Discount ${id} deleted`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { qs } from '../lib/qs.js';\n\nexport function register(program: Command): void {\n const w = program.command('webhooks').description('Webhook endpoints + deliveries');\n\n const ep = w.command('endpoints').description('Manage endpoints');\n ep.command('list').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), '/api/v1/webhook-endpoints');\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'URL', get: (x) => x.url }, { header: 'ACTIVE', get: (x) => x.isActive }, { header: 'EVENTS', get: (x) => (x.enabledEvents ?? []).length }], { json: Boolean(g.json) });\n });\n ep.command('create').requiredOption('--url <u>').requiredOption('--events <list>', 'Comma-separated event types')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body = { url: opts.url, enabledEvents: String(opts.events).split(',').map((s: string) => s.trim()) };\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/webhook-endpoints', { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n ep.command('update <id>').option('--url <u>').option('--events <list>').option('--active <bool>', \"'true' or 'false'\")\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.url) body.url = opts.url;\n if (opts.events) body.enabledEvents = String(opts.events).split(',').map((s: string) => s.trim());\n if (opts.active !== undefined) {\n if (opts.active !== 'true' && opts.active !== 'false') { const e = new Error(`--active must be 'true' or 'false' (got '${opts.active}')`); (e as any).exitCode = 2; throw e; }\n body.isActive = opts.active === 'true';\n }\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}`, { method: 'PATCH', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n ep.command('delete <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Delete webhook endpoint ${id}?`, yes: g.yes, json: g.json });\n await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}`, { method: 'DELETE' });\n success(`Endpoint ${id} deleted`);\n });\n ep.command('send-test <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const r = await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}/test`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Test event queued to ${id}`);\n });\n ep.command('rotate-secret <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Rotate the signing secret for ${id}? (old secret stops validating)`, yes: g.yes, json: g.json });\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}/rotate-secret`, { method: 'POST' }), { json: Boolean(g.json) });\n });\n\n const del = w.command('deliveries').description('Inspect + replay deliveries');\n del.command('list').option('--endpoint <id>').option('--status <s>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), '/api/v1/webhook-deliveries' + qs({ endpointId: opts.endpoint, status: opts.status }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'EVENT', get: (x) => x.eventType }, { header: 'STATUS', get: (x) => x.status }, { header: 'ATTEMPTS', get: (x) => x.attemptCount }], { json: Boolean(g.json) });\n });\n del.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/webhook-deliveries/${id}`), { json: Boolean(g.json) });\n });\n del.command('replay <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Replay delivery ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/webhook-deliveries/${id}/replay`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Delivery ${id} replayed`);\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\n\n/** Shared by `push` and `list` so the two never disagree about a script's shape. */\ninterface ExtensionScript {\n id: string;\n key: string;\n name: string;\n tier: 'sandbox' | 'dom';\n surfaces: string[];\n consentCategory: string;\n protectedData: string;\n externalDomains: string[];\n}\n\nconst COLUMNS = [\n { header: 'KEY', get: (x: ExtensionScript) => x.key },\n { header: 'TIER', get: (x: ExtensionScript) => x.tier },\n { header: 'SURFACES', get: (x: ExtensionScript) => (x.surfaces ?? []).join(',') },\n { header: 'CONSENT', get: (x: ExtensionScript) => x.consentCategory },\n { header: 'PII', get: (x: ExtensionScript) => x.protectedData },\n { header: 'DOMAINS', get: (x: ExtensionScript) => (x.externalDomains ?? []).join(',') || '-' },\n { header: 'ID', get: (x: ExtensionScript) => x.id },\n];\n\nfunction fail(message: string): never {\n const e = new Error(message);\n (e as any).exitCode = 2;\n throw e;\n}\n\nfunction splitList(value: string | undefined): string[] {\n return String(value ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nexport function register(program: Command): void {\n const ext = program.command('extensions').description('Marketplace extensions');\n const scripts = ext\n .command('scripts')\n .description('Buyer-facing scripts an extension ships');\n\n scripts\n .command('list <extensionId>')\n .description('List the scripts declared on an extension')\n .action(async (extensionId: string, _o: unknown, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<{ scripts: ExtensionScript[] }>(\n resolveAuth(g),\n `/api/v1/extensions/${extensionId}/scripts`,\n );\n renderList(data.scripts ?? [], COLUMNS, { json: Boolean(g.json) });\n });\n\n scripts\n .command('push <extensionId>')\n .description('Create or replace a script on an extension from a source file')\n // Pushing a key that already exists replaces its source on the target\n // draft version — that is how an app ships an update. Capabilities\n // (tier/surfaces/consent/pii/domains) are frozen once the script has\n // shipped in a published version, so a push that changes one is refused.\n .requiredOption('--version-id <id>', 'Draft extension version to attach the source to')\n .requiredOption('--key <key>', 'Stable handle, lowercase slug')\n .requiredOption('--name <name>', 'Human-readable name')\n .requiredOption('--source <path>', 'Path to the .js file')\n .requiredOption('--surfaces <list>', 'Comma-separated: storefront,checkout,quote')\n .option('--tier <tier>', \"'sandbox' (default) or 'dom'\", 'sandbox')\n .option('--consent <category>', 'essential|functional|analytics|marketing', 'analytics')\n .option('--pii <grade>', 'none|hashed|raw', 'none')\n .option('--domains <list>', 'Comma-separated hostnames the script may reach (static.example.com or *.example.com)')\n .action(async (extensionId: string, opts: any, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n\n // Read locally and fail early with the path in the message. The API\n // would otherwise reject an empty body and the developer would be left\n // guessing whether the file or the request was wrong.\n const path = resolve(process.cwd(), String(opts.source));\n let source: string;\n try {\n source = readFileSync(path, 'utf8');\n } catch {\n fail(`Could not read --source ${path}`);\n }\n if (!source.trim()) fail(`--source ${path} is empty`);\n\n const surfaces = splitList(opts.surfaces);\n if (surfaces.length === 0) fail('--surfaces must name at least one surface');\n\n // Checked here as well as by the API, purely so the developer gets the\n // reason without a round trip. The API and the database are what\n // actually enforce it — a dom-tier script runs outside the sandbox on\n // the merchant's page and must never reach a payment page.\n if (opts.tier === 'dom' && !(surfaces.length === 1 && surfaces[0] === 'storefront')) {\n fail(\"--tier dom may only be used with --surfaces storefront\");\n }\n\n const body = {\n key: opts.key,\n name: opts.name,\n source,\n tier: opts.tier,\n surfaces,\n consentCategory: opts.consent,\n protectedData: opts.pii,\n externalDomains: splitList(opts.domains),\n extensionVersionId: opts.versionId,\n };\n\n renderObject(\n await callThrottle(resolveAuth(g), `/api/v1/extensions/${extensionId}/scripts`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n { json: Boolean(g.json) },\n );\n });\n\n scripts\n .command('rm <extensionId> <scriptId>')\n .description('Delete a script from an extension')\n .action(async (extensionId: string, scriptId: string, _o: unknown, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({\n message: `Delete script ${scriptId} from extension ${extensionId}?`,\n yes: g.yes,\n json: g.json,\n });\n await callThrottle(resolveAuth(g), `/api/v1/extensions/${extensionId}/scripts/${scriptId}`, {\n method: 'DELETE',\n });\n success(`Script ${scriptId} deleted`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList } from '../lib/client.js';\nimport { renderList, renderObject } from '../lib/output.js';\nimport { qs } from '../lib/qs.js';\n\nexport function register(program: Command): void {\n const e = program.command('events').description('Emitted events + catalog');\n\n e.command('list').option('--type <t>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const { data, pagination } = await callThrottleList<any>(resolveAuth(g), '/api/v1/events' + qs({ type: opts.type, limit: opts.limit, cursor: opts.cursor }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'TYPE', get: (x) => x.type }, { header: 'ENTITY', get: (x) => x.entityId }, { header: 'CREATED', get: (x) => x.createdAt }], { json: Boolean(g.json), pagination });\n });\n\n e.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/events/${id}`), { json: Boolean(g.json) });\n });\n\n e.command('types').description('List the event-type catalog').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), '/api/v1/event-types');\n renderList(data, [{ header: 'TYPE', get: (x) => (typeof x === 'string' ? x : x.type) }, { header: 'SCOPE', get: (x) => (typeof x === 'string' ? '' : x.readScope) }], { json: Boolean(g.json) });\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderObject } from '../lib/output.js';\n\nexport function register(program: Command): void {\n const e = program.command('embed').description('Embed allowlist + branding');\n\n e.command('show').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/embed-config'), { json: Boolean(g.json) });\n });\n\n e.command('set')\n .option('--origins <csv>', 'Comma-separated parent origins')\n .option('--primary <hex>', 'Primary brand color #rrggbb')\n .option('--logo <url>').option('--merchant-name <name>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.origins) body.allowedOrigins = String(opts.origins).split(',').map((s: string) => s.trim()).filter(Boolean);\n if (opts.primary) body.primaryColor = opts.primary;\n if (opts.logo) body.logoUrl = opts.logo;\n if (opts.merchantName) body.merchantName = opts.merchantName;\n if (Object.keys(body).length === 0) { const err = new Error('Pass at least one of --origins, --primary, --logo, --merchant-name'); (err as any).exitCode = 2; throw err; }\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/embed-config', { method: 'PUT', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n}\n"],"mappings":"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","names":["args","init","readFileSync","fileURLToPath","readFileSync","readFileSync","pc","headers","program","register","program","writeFileSync","register","program","writeFileSync","register","program","register","program","register","program","register","program","register","program","register","program","readFileSync","resolve","register","program","resolve","readFileSync","register","program","register","program","register"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/version.ts","../src/banner.ts","../src/lib/errors.ts","../../errors/dist/index.js","../src/lib/client.ts","../src/sentry.ts","../src/config/profiles.ts","../src/lib/key-format.ts","../src/lib/output.ts","../src/commands/config.ts","../src/commands/whoami.ts","../src/commands/orders.ts","../src/lib/confirm.ts","../src/commands/fulfillments.ts","../src/lib/qs.ts","../../money/dist/index.js","../src/lib/money.ts","../src/commands/returns.ts","../src/commands/payments.ts","../src/commands/customers.ts","../src/commands/subscriptions.ts","../src/commands/discounts.ts","../src/commands/webhooks.ts","../src/commands/extensions.ts","../src/commands/events.ts","../src/commands/embed.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLI_VERSION } from './version.js';\nimport { printBanner } from './banner.js';\nimport { handleError } from './lib/errors.js';\nimport { captureCliException, flushCliSentry, initCliSentry } from './sentry.js';\nimport { register as registerConfig } from './commands/config.js';\nimport { register as registerWhoami } from './commands/whoami.js';\nimport { register as registerOrders } from './commands/orders.js';\nimport { register as registerReturns } from './commands/returns.js';\nimport { register as registerPayments } from './commands/payments.js';\nimport { register as registerCustomers } from './commands/customers.js';\nimport { register as registerSubscriptions } from './commands/subscriptions.js';\nimport { register as registerDiscounts } from './commands/discounts.js';\nimport { register as registerWebhooks } from './commands/webhooks.js';\nimport { register as registerExtensions } from './commands/extensions.js';\nimport { register as registerEvents } from './commands/events.js';\nimport { register as registerEmbed } from './commands/embed.js';\n\ninitCliSentry();\n\nconst program = new Command();\nprogram\n .name('throttle')\n .description('Throttle command-line tool')\n .version(CLI_VERSION, '-v, --version', 'Print the CLI version')\n .option('--json', 'Machine-readable JSON output (implies non-interactive)')\n .option('-q, --quiet', 'Suppress the banner')\n .option('--profile <name>', 'Config profile to use')\n .option('--api-key <sk_>', 'API key (overrides profile / $THROTTLE_API_KEY)')\n .option('--api <url>', 'API base URL (overrides profile / $THROTTLE_API_URL)')\n .option('-y, --yes', 'Skip confirmation prompts');\n\nconst args = process.argv.slice(2);\nconst bannerless = args.includes('--json') || args.includes('-q') || args.includes('--quiet')\n || args.length === 0 || args.includes('-h') || args.includes('--help') || args.includes('-v') || args.includes('--version');\nif (!bannerless) printBanner({ version: CLI_VERSION });\n\nfor (const reg of [registerConfig, registerWhoami, registerOrders, registerReturns, registerPayments, registerCustomers, registerSubscriptions, registerDiscounts, registerWebhooks, registerEvents, registerEmbed, registerExtensions]) reg(program);\n\nprogram.parseAsync().catch(async (err) => {\n const code = handleError(err);\n captureCliException(err);\n await flushCliSentry();\n process.exit(code);\n});\n","import { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\n// Read the version from package.json at runtime, resolved relative to this\n// module, so the binary's reported version always matches the published\n// package and can never drift from a hardcoded constant.\n// - bundled: dist/cli.js -> ../package.json = packages/cli/package.json\n// - vitest: src/version.ts -> ../package.json = packages/cli/package.json\nconst pkg = JSON.parse(\n readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8'),\n) as { version: string };\n\nexport const CLI_VERSION: string = pkg.version;\n","const BRAND_BLUE = '\\x1b[38;2;29;86;232m';\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\n\n/**\n * Print a compact, always-aligned banner. The previous box-drawing \"logo\"\n * rendered disjointed across terminals; a clean styled wordmark is legible\n * everywhere and can't break.\n */\nexport function printBanner(opts?: { version?: string }): void {\n if (process.env.THROTTLE_CLI_NO_BANNER === '1') return;\n if (!process.stdout.isTTY) return;\n const v = opts?.version ? `v${opts.version}` : '';\n process.stderr.write(\n `${BRAND_BLUE}${BOLD}▸ throttle${RESET} ${DIM}CLI${v ? ' ' + v : ''} · docs https://usethrottle.dev/docs${RESET}\\n\\n`,\n );\n}\n","import pc from 'picocolors';\nimport { isThrottleError } from './client.js';\n\nconst HINTS: Record<string, string> = {\n insufficient_scopes: 'Your API key lacks a required scope. Mint a key with the needed scope in the dashboard.',\n environment_mismatch: 'This resource is in a different environment than your key. Use a key for the right environment.',\n refund_amount_exceeds_balance: 'The refund is larger than the captured balance remaining on this payment.',\n invalid_api_key: 'The API key is invalid or expired. Re-run `throttle config set` with a fresh key.',\n not_found: 'Not found (or your key cannot see it in this environment).',\n};\n\nexport function handleError(err: unknown): number {\n if (isThrottleError(err)) {\n process.stderr.write(pc.red('✗') + ` (${err.code}): ${err.message}\\n`);\n const hint = HINTS[err.code];\n if (hint) process.stderr.write(pc.dim(' ' + hint) + '\\n');\n return 1;\n }\n const exitCode = typeof (err as { exitCode?: unknown })?.exitCode === 'number' ? (err as { exitCode: number }).exitCode : 1;\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(pc.red('✗') + ' ' + message + '\\n');\n return exitCode;\n}\n","// src/index.ts\nvar ThrottleError = class extends Error {\n code;\n statusCode;\n details;\n body;\n requestId;\n constructor(args) {\n super(args.message);\n this.name = \"ThrottleError\";\n this.code = args.code;\n this.statusCode = args.statusCode;\n this.details = args.details;\n this.body = args.body;\n const fromBody = args.body?.meta?.requestId;\n const fromHeader = typeof args.responseHeaders?.get === \"function\" ? args.responseHeaders.get(\"x-request-id\") : args.responseHeaders?.[\"x-request-id\"];\n this.requestId = args.requestId ?? (typeof fromBody === \"string\" ? fromBody : void 0) ?? (typeof fromHeader === \"string\" ? fromHeader : void 0);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n};\nfunction isThrottleError(value) {\n return value instanceof ThrottleError;\n}\nexport {\n ThrottleError,\n isThrottleError\n};\n","import { ThrottleError, type ThrottleErrorArgs } from '@usethrottle/errors';\n\nexport interface AuthCtx { apiKey: string; apiBaseUrl: string }\n\nexport class ThrottleApiError extends ThrottleError {\n constructor(code: string, message: string, statusCode: number, responseHeaders?: ThrottleErrorArgs['responseHeaders']) {\n super({ code, message, statusCode, responseHeaders });\n this.name = 'ThrottleApiError';\n }\n}\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\n\nfunction url(auth: AuthCtx, path: string): string {\n return `${auth.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n}\nfunction headers(auth: AuthCtx, init: RequestInit): Record<string, string> {\n return { 'content-type': 'application/json', 'x-api-key': auth.apiKey, ...(init.headers as Record<string, string> ?? {}) };\n}\n\nexport interface Pagination { cursor: string | null; hasMore: boolean }\n\nasync function requestJson(auth: AuthCtx, path: string, init: RequestInit): Promise<Record<string, unknown>> {\n // Write verbs advertise `content-type: application/json`, so a bodyless\n // POST/PATCH/PUT would send an empty body that the API's object-body schemas\n // reject with `validation_error: body must be object`. Default to `{}` so\n // action commands that carry no payload (cancel, send-test, replay, …) work.\n const method = (init.method ?? 'GET').toUpperCase();\n if (init.body == null && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {\n init = { ...init, body: '{}' };\n }\n const res = await fetch(url(auth, path), { ...init, headers: headers(auth, init) });\n const text = await res.text();\n let body: Record<string, unknown> = {};\n try { body = text ? JSON.parse(text) : {}; } catch { /* non-JSON */ }\n if (!res.ok) {\n const err = body.error as { code?: string; message?: string } | undefined;\n const code = err?.code ?? `http_${res.status}`;\n const message = err?.message ?? `Request failed (${res.status}): ${text.slice(0, 120)}`;\n throw new ThrottleApiError(code, message, res.status, res.headers);\n }\n return body;\n}\n\nexport async function callThrottle<T>(auth: AuthCtx, path: string, init: RequestInit = {}): Promise<T> {\n const body = await requestJson(auth, path, init);\n // Use key presence, not `??`: a legitimate `{ \"data\": null }` success envelope\n // must unwrap to `null`, not fall through to the whole envelope object.\n return (body && typeof body === 'object' && 'data' in body ? body.data : (body as unknown)) as T;\n}\n\n/** List calls keep `meta.pagination` from the envelope so commands can surface the next cursor. */\nexport async function callThrottleList<T>(\n auth: AuthCtx, path: string, init: RequestInit = {},\n): Promise<{ data: T[]; pagination: Pagination | null }> {\n const body = await requestJson(auth, path, init);\n const data = ('data' in body ? body.data : body) as T[];\n const meta = body.meta as { pagination?: Pagination } | undefined;\n return { data: Array.isArray(data) ? data : [], pagination: meta?.pagination ?? null };\n}\n\nexport async function callThrottleText(auth: AuthCtx, path: string, init: RequestInit = {}): Promise<string> {\n const res = await fetch(url(auth, path), { ...init, headers: headers(auth, init) });\n const text = await res.text();\n if (!res.ok) throw new ThrottleApiError(`http_${res.status}`, text.slice(0, 120), res.status, res.headers);\n return text;\n}\n","import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport * as Sentry from '@sentry/node';\nimport type { Event, NodeOptions } from '@sentry/node';\n\ntype Env = Record<string, string | undefined>;\ntype EventHeaders = NonNullable<Event['request']>['headers'];\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nconst DEFAULT_CLI_DSN =\n 'https://519163f0134350c7b5845efee80f457c@o432365.ingest.us.sentry.io/4511401030516736';\n\nconst SENSITIVE_HEADER_KEYS = new Set([\n 'authorization',\n 'cookie',\n 'setcookie',\n 'xapikey',\n 'xthrottleapikey',\n]);\n\nconst SENSITIVE_EXTRA_KEYS = new Set([\n 'apikey',\n 'accesstoken',\n 'authorization',\n 'body',\n 'data',\n 'formdata',\n 'payload',\n 'rawbody',\n 'requestbody',\n 'token',\n]);\n\nfunction removeSensitiveKeys(\n value: Record<string, unknown> | undefined,\n sensitiveKeys: ReadonlySet<string>,\n): Record<string, unknown> | undefined {\n if (!value) return value;\n\n const keptEntries = Object.entries(value).filter(\n ([key]) => !sensitiveKeys.has(normalizeKey(key)),\n );\n return Object.fromEntries(keptEntries);\n}\n\nfunction isOptInValue(value: string | undefined): boolean {\n if (!value) return false;\n return ['1', 'true', 'yes', 'on'].includes(value.toLowerCase());\n}\n\nfunction readCliPackageRelease(): string | undefined {\n try {\n const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return packageJson.version ? `@usethrottle/cli@${packageJson.version}` : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function isCliSentryEnabled(env: Env = process.env): boolean {\n return isOptInValue(env.THROTTLE_CLI_TELEMETRY) || isOptInValue(env.THROTTLE_CLI_SENTRY_ENABLED);\n}\n\nexport function scrubCliSentryEvent<T extends Event>(event: T): T {\n if (event.request) {\n delete event.request.data;\n delete event.request.cookies;\n event.request.headers = removeSensitiveKeys(\n event.request.headers as Record<string, unknown> | undefined,\n SENSITIVE_HEADER_KEYS,\n ) as EventHeaders;\n }\n\n if (event.extra) {\n event.extra = removeSensitiveKeys(event.extra, SENSITIVE_EXTRA_KEYS);\n }\n\n if (event.user) {\n event.user = event.user.id ? { id: event.user.id } : undefined;\n }\n\n return event;\n}\n\nexport function buildCliSentryOptions(env: Env = process.env): NodeOptions {\n const enabled = isCliSentryEnabled(env);\n\n return {\n dsn: enabled ? (env.THROTTLE_CLI_SENTRY_DSN ?? env.SENTRY_DSN ?? DEFAULT_CLI_DSN) : undefined,\n enabled,\n environment: env.SENTRY_ENVIRONMENT ?? env.NODE_ENV ?? 'production',\n release: env.SENTRY_RELEASE ?? env.THROTTLE_CLI_RELEASE ?? readCliPackageRelease(),\n sendDefaultPii: false,\n tracesSampleRate: 0,\n beforeSend: scrubCliSentryEvent,\n };\n}\n\nexport function initCliSentry(env: Env = process.env): void {\n if (!isCliSentryEnabled(env) || Sentry.isInitialized()) return;\n\n Sentry.init(buildCliSentryOptions(env));\n}\n\nexport function captureCliException(error: unknown): void {\n if (!Sentry.isInitialized()) return;\n Sentry.captureException(error);\n}\n\nexport async function flushCliSentry(timeout = 2000): Promise<void> {\n if (!Sentry.isInitialized()) return;\n await Sentry.flush(timeout);\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { parseRawKey } from '../lib/key-format.js';\n\nexport interface Profile { apiKey: string; apiBaseUrl: string; label?: string }\nexport interface CliConfig { defaultProfile?: string; profiles: Record<string, Profile> }\n\nconst DEFAULT_API_URL = 'https://api.usethrottle.dev';\n\nexport class ConfigError extends Error { exitCode = 2; }\n\nfunction home(): string { return process.env.THROTTLE_CONFIG_HOME || join(homedir(), '.throttle'); }\nexport function configPath(): string { return join(home(), 'config.json'); }\n\nexport function loadConfig(): CliConfig {\n const p = configPath();\n if (!existsSync(p)) return { profiles: {} };\n try { return JSON.parse(readFileSync(p, 'utf8')) as CliConfig; }\n catch { throw new ConfigError(`Config at ${p} is not valid JSON`); }\n}\n\nexport function saveConfig(cfg: CliConfig): void {\n mkdirSync(home(), { recursive: true });\n const p = configPath();\n writeFileSync(p, JSON.stringify(cfg, null, 2) + '\\n', { mode: 0o600 });\n chmodSync(p, 0o600);\n}\n\nexport function setProfile(name: string, prof: Profile): void {\n const cfg = loadConfig();\n cfg.profiles[name] = prof;\n if (!cfg.defaultProfile) cfg.defaultProfile = name;\n saveConfig(cfg);\n}\n\nexport function useProfile(name: string): void {\n const cfg = loadConfig();\n if (!cfg.profiles[name]) throw new ConfigError(`No profile named \"${name}\"`);\n cfg.defaultProfile = name;\n saveConfig(cfg);\n}\n\nexport function removeProfile(name: string): void {\n const cfg = loadConfig();\n if (!cfg.profiles[name]) throw new ConfigError(`No profile named \"${name}\"`);\n delete cfg.profiles[name];\n if (cfg.defaultProfile === name) cfg.defaultProfile = Object.keys(cfg.profiles)[0];\n saveConfig(cfg);\n}\n\nexport function maskKey(key: string): string {\n if (key.length <= 12) return '****';\n const parsed = parseRawKey(key);\n const prefix = parsed ? `${parsed.type}_${parsed.environment}_` : key.slice(0, 4);\n return `${prefix}…${key.slice(-4)}`;\n}\n\nexport function resolveAuth(globals: { profile?: string; apiKey?: string; api?: string }): { apiKey: string; apiBaseUrl: string } {\n const cfg = loadConfig();\n const profName = globals.profile ?? cfg.defaultProfile;\n const prof = profName ? cfg.profiles[profName] : undefined;\n if (globals.profile && !prof) throw new ConfigError(`No profile named \"${globals.profile}\"`);\n const apiKey = globals.apiKey ?? process.env.THROTTLE_API_KEY ?? prof?.apiKey;\n if (!apiKey) throw new ConfigError('No API key. Set one with `throttle config set <name> --api-key sk_...`, pass --api-key, or set $THROTTLE_API_KEY.');\n const apiBaseUrl = globals.api ?? process.env.THROTTLE_API_URL ?? prof?.apiBaseUrl ?? DEFAULT_API_URL;\n return { apiKey, apiBaseUrl };\n}\n","/**\n * Throttle raw API keys are `<type>_<environment segment>_<64 hex>`, where the\n * environment segment is the workspace environment's normalized slug — `live`\n * for production, `test` / `uat` / anything else for non-production. The\n * segment may itself contain underscores (`production_1`), so anchor on the\n * fixed-length hex tail rather than splitting on the first underscore.\n */\nconst KEY_RE = /^(sk|pk)_([a-z0-9_]+)_([0-9a-f]{64})$/;\n\nexport interface ParsedKey {\n type: string;\n environment: string;\n random: string;\n}\n\nexport function parseRawKey(key: string): ParsedKey | null {\n const m = KEY_RE.exec(key);\n if (!m) return null;\n return { type: m[1], environment: m[2], random: m[3] };\n}\n\n/** Reconstruct the server-side `key_prefix`: type + first 16 chars of the random tail. */\nexport function storedPrefixOf(key: string): string {\n const parsed = parseRawKey(key);\n if (!parsed) return key.slice(0, 16);\n return `${parsed.type}_${parsed.random.slice(0, 16)}`;\n}\n\n/** Environment segment as minted (`live`, `test`, `uat`, …), or `unknown`. */\nexport function modeOf(key: string): string {\n return parseRawKey(key)?.environment ?? 'unknown';\n}\n","import pc from 'picocolors';\nimport type { Pagination } from './client.js';\n\nexport interface Column<T> { header: string; get: (row: T) => unknown }\n\nfunction cell(v: unknown): string { return v === null || v === undefined ? '' : String(v); }\n\nexport function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + '\\n');\n}\n\nexport function renderList<T>(rows: T[], columns: Column<T>[], opts: { json: boolean; pagination?: Pagination | null }): void {\n // Paginated commands pass `pagination` (possibly null) and get the { data, pagination }\n // envelope under --json; commands without cursors omit it and keep the bare array.\n if (opts.json) { printJson(opts.pagination === undefined ? rows : { data: rows, pagination: opts.pagination }); return; }\n if (rows.length === 0) { process.stdout.write(pc.dim('No results.\\n')); return; }\n const headers = columns.map((c) => c.header);\n const body = rows.map((r) => columns.map((c) => cell(c.get(r))));\n const widths = headers.map((h, i) => Math.max(h.length, ...body.map((row) => row[i].length)));\n const line = (cells: string[]) => cells.map((v, i) => v.padEnd(widths[i])).join(' ').trimEnd();\n process.stdout.write(pc.bold(line(headers)) + '\\n');\n for (const row of body) process.stdout.write(line(row) + '\\n');\n if (opts.pagination?.cursor) process.stdout.write(pc.dim(`More results — next page: --cursor ${opts.pagination.cursor}\\n`));\n}\n\nexport function renderObject(obj: unknown, opts: { json: boolean }): void {\n if (opts.json) { printJson(obj); return; }\n if (obj === null || typeof obj !== 'object') { process.stdout.write(cell(obj) + '\\n'); return; }\n const entries = Object.entries(obj as Record<string, unknown>);\n const w = Math.max(0, ...entries.map(([k]) => k.length));\n for (const [k, v] of entries) {\n const val = v !== null && typeof v === 'object' ? JSON.stringify(v) : cell(v);\n process.stdout.write(`${pc.dim(k.padEnd(w))} ${val}\\n`);\n }\n}\n\nexport function success(msg: string): void { process.stdout.write(pc.green('✓') + ' ' + msg + '\\n'); }\nexport function note(msg: string): void { process.stdout.write(pc.dim(msg) + '\\n'); }\n","import { Command } from 'commander';\nimport { setProfile, useProfile, removeProfile, loadConfig, maskKey, ConfigError } from '../config/profiles.js';\nimport { renderList, success } from '../lib/output.js';\n\nexport function register(program: Command): void {\n const config = program.command('config').description('Manage local CLI profiles (~/.throttle/config.json)');\n\n config.command('set <profile>')\n .description('Create or update a profile')\n // Not .requiredOption: --api-key/--api share a name with the top-level\n // global options in index.ts, and Commander resolves a shared option\n // name at the ANCESTOR command that declares it — the value never\n // reaches this subcommand's own local slot, so a native required-option\n // check here would always fail once wired into the full program. Read\n // the effective value via optsWithGlobals() (root wins if it captured\n // the flag, else this command's own value/default is used) and validate\n // manually instead.\n .option('--api-key <sk_>', 'Throttle API key')\n .option('--api <url>', 'API base URL', 'https://api.usethrottle.dev')\n .option('--label <text>', 'Human label')\n .action((name, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (!g.apiKey) throw new ConfigError('required option \\'--api-key <sk_>\\' not specified');\n setProfile(name, { apiKey: g.apiKey, apiBaseUrl: g.api, label: opts.label });\n success(`Saved profile \"${name}\"`);\n });\n\n config.command('use <profile>').description('Set the default profile')\n .action((name) => { useProfile(name); success(`Default profile is now \"${name}\"`); });\n\n config.command('remove <profile>').description('Delete a profile')\n .action((name) => { removeProfile(name); success(`Removed profile \"${name}\"`); });\n\n config.command('list').description('List profiles (keys masked)')\n // Same shared-name caveat as `set` above: --json also exists as a\n // top-level global option, so read the effective value from\n // optsWithGlobals() rather than this command's own local opts.\n .option('--json', 'Output JSON')\n .action((opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const cfg = loadConfig();\n const rows = Object.entries(cfg.profiles).map(([name, p]) => ({\n name, default: name === cfg.defaultProfile ? '*' : '', apiBaseUrl: p.apiBaseUrl, apiKey: maskKey(p.apiKey), label: p.label ?? '',\n }));\n renderList(rows, [\n { header: 'NAME', get: (r) => r.name }, { header: 'DEFAULT', get: (r) => r.default },\n { header: 'API', get: (r) => r.apiBaseUrl }, { header: 'KEY', get: (r) => r.apiKey }, { header: 'LABEL', get: (r) => r.label },\n ], { json: Boolean(g.json) });\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, isThrottleError } from '../lib/client.js';\nimport { modeOf, storedPrefixOf } from '../lib/key-format.js';\nimport { renderObject } from '../lib/output.js';\n\ninterface ApiKeyRow {\n keyPrefix: string;\n applicationId: string;\n environmentId: string;\n environmentSlug?: string;\n environmentKind?: string;\n scopes: string[];\n}\n\nexport function register(program: Command): void {\n program\n .command('whoami')\n .description('Show the active key context (environment + granted scopes)')\n .action(async (_opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const auth = resolveAuth(g);\n const info: Record<string, unknown> = {\n apiBaseUrl: auth.apiBaseUrl,\n mode: modeOf(auth.apiKey),\n keyPrefix: storedPrefixOf(auth.apiKey),\n };\n // Enrich with environment + this key's scopes when the key can list keys\n // (needs merchant:read). `/auth/permissions` is Clerk/workspace-only and\n // rejects api keys, so we derive context from the api-keys catalog instead.\n try {\n const keys = await callThrottle<ApiKeyRow[]>(auth, '/api/v1/api-keys');\n const first = keys[0];\n if (first) {\n info.applicationId = first.applicationId;\n info.environmentId = first.environmentId;\n if (first.environmentSlug) info.environment = first.environmentSlug;\n if (first.environmentKind) info.environmentKind = first.environmentKind;\n }\n const mine = keys.find((k) => k.keyPrefix === info.keyPrefix);\n info.scopes = mine ? mine.scopes : '(this key not found in the catalog)';\n info.authenticated = true;\n } catch (err) {\n if (!isThrottleError(err)) throw err;\n // 401 = the key itself is invalid/expired. 403 = the key authenticated\n // fine but can't read the api-key catalog (needs merchant:read + the\n // dashboard `application:api-keys` permission, which api keys lack), so\n // environment/scopes can't be shown — the key is still valid.\n info.authenticated = err.statusCode === 401 ? false : true;\n if (err.statusCode !== 401) {\n info.note = `key valid; environment/scopes unavailable to api keys (${err.code})`;\n }\n }\n renderObject(info, { json: Boolean(g.json) });\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList, callThrottleText } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { registerFulfillments } from './fulfillments.js';\nimport { qs } from '../lib/qs.js';\nimport { amountPhrase, fmt } from '../lib/money.js';\n\ninterface TimelineEntry { id: string; at: string; kind: string; title: string; detail?: string | null; amount?: number | null; currency?: string | null; source: string; reason?: string | null }\n\ninterface Order { id: string; orderNumber?: string; status: string; displayStatus?: string; paymentStatus?: string; total: number; currency: string; createdAt?: string; onHold?: boolean; holdReason?: string | null }\n\nexport function register(program: Command): void {\n const orders = program.command('orders').description('Orders + order detail');\n\n orders.command('list')\n .description('List orders')\n .option('--status <s>').option('--payment-status <s>').option('--type <t>').option('--source <s>')\n .option('--delivery <state>', 'Where the goods are: in_transit | delivered | returned')\n .option('-q, --query <text>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const auth = resolveAuth(g);\n const path = '/api/v1/orders' + qs({ status: opts.status, paymentStatus: opts.paymentStatus, type: opts.type, source: opts.source, delivery: opts.delivery, q: opts.query, limit: opts.limit, cursor: opts.cursor });\n const { data, pagination } = await callThrottleList<Order>(auth, path);\n renderList(data, [\n { header: 'ID', get: (o) => o.id }, { header: 'NUMBER', get: (o) => o.orderNumber },\n { header: 'STATUS', get: (o) => o.displayStatus ?? o.status },\n // Its own column, not part of STATUS: a hold says nothing about money\n // or delivery, and folding it into the status text would claim it does.\n { header: 'HOLD', get: (o) => (o.onHold ? 'on hold' : '') },\n { header: 'TOTAL', get: (o) => fmt(o.total, o.currency) },\n ], { json: Boolean(g.json), pagination });\n });\n\n orders.command('get <id>').description('Show an order')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/orders/${id}`), { json: Boolean(g.json) });\n });\n\n orders.command('cancel <id>').description('Cancel an order')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Cancel order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/cancel`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Order ${id} cancelled`);\n });\n\n const ORDER_STATUSES = [\n 'draft',\n 'pending',\n 'processing',\n 'partially_fulfilled',\n 'fulfilled',\n 'cancelled',\n 'closed',\n ];\n\n orders.command('status <id> <status>')\n .description(`Set an order status (${ORDER_STATUSES.join(' | ')}). Moves in both directions.`)\n .option('--reason <text>', 'Note recorded on the status-history row')\n .action(async (id, status, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (!ORDER_STATUSES.includes(status)) {\n throw new Error(`Unknown status '${status}'. Expected one of: ${ORDER_STATUSES.join(', ')}`);\n }\n await confirmAction({ message: `Set order ${id} to ${status}?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { status };\n if (opts.reason) body.reason = opts.reason;\n renderObject(\n await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/status`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n { json: Boolean(g.json) },\n );\n });\n\n orders.command('comp <id>')\n .description(\"Waive the order's remaining balance (no processor is contacted)\")\n .requiredOption('--reason <text>', 'Why the balance is being waived (3-500 chars)')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Waive the remaining balance on order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/comp`, {\n method: 'POST',\n body: JSON.stringify({ reason: opts.reason }),\n });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order & { compAmount?: number };\n success(`Comped ${fmt(o.compAmount ?? 0, o.currency)} on ${o.orderNumber ?? id}`);\n });\n\n orders.command('comp-reverse <id>')\n .description('Undo a comp; the order owes its balance again')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Reverse the comp on order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/comp/reverse`, { method: 'POST' });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order;\n success(`Comp reversed on ${o.orderNumber ?? id}; total is ${fmt(o.total, o.currency)}`);\n });\n\n orders.command('hold <id>')\n .description('Freeze an order: no transitions, no manual money, no new fulfillments')\n .requiredOption('--reason <text>', 'Why the order is frozen (1-500 chars); whoever finds it later reads this')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Put order ${id} on hold?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/hold`, {\n method: 'POST',\n body: JSON.stringify({ reason: opts.reason }),\n });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order;\n success(`${o.orderNumber ?? id} is on hold: ${o.holdReason ?? opts.reason}`);\n });\n\n orders.command('release-hold <id>')\n .description('Unfreeze an order')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Release the hold on order ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/hold/release`, { method: 'POST' });\n if (g.json) { renderObject(r, { json: true }); return; }\n const o = ((r as any)?.data ?? r) as Order;\n success(`Hold released on ${o.orderNumber ?? id}`);\n });\n\n orders.command('history <id>').description('Show an order\\'s status history')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/status-history`);\n const rows = (r as any)?.data ?? r;\n renderList(rows, [\n { header: 'WHEN', get: (h: any) => h.createdAt },\n { header: 'FROM', get: (h: any) => h.fromStatus ?? '—' },\n { header: 'TO', get: (h: any) => h.toStatus },\n { header: 'BY', get: (h: any) => h.actorType },\n { header: 'SOURCE', get: (h: any) => h.source },\n { header: 'REASON', get: (h: any) => h.reason ?? '' },\n ], { json: Boolean(g.json) });\n });\n\n orders.command('timeline <id>')\n .description(\"Everything that happened to an order — status, money and goods — newest first\")\n .option('--limit <n>', 'Rows to fetch (1-200, default 50)')\n .option('--cursor <c>')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const path = `/api/v1/orders/${id}/timeline` + qs({ limit: opts.limit, cursor: opts.cursor });\n const auth = resolveAuth(g);\n const { data, pagination } = await callThrottleList<TimelineEntry>(auth, path);\n // An entry without its own currency is in the order's. Read it only when a\n // human-readable row needs it, so --json makes the same requests as before.\n let orderCurrency: string | undefined;\n if (!g.json && data.some((e) => e.amount != null && !e.currency)) {\n try { orderCurrency = (await callThrottle<{ currency?: string }>(auth, `/api/v1/orders/${id}`)).currency || undefined; } catch { /* worded without a currency below */ }\n }\n renderList(data, [\n { header: 'WHEN', get: (e) => e.at },\n { header: 'KIND', get: (e) => e.kind },\n { header: 'WHAT', get: (e) => e.title },\n { header: 'DETAIL', get: (e) => e.detail ?? '' },\n { header: 'AMOUNT', get: (e) => (e.amount == null ? '' : amountPhrase(e.amount, e.currency ?? orderCurrency)) },\n { header: 'REASON', get: (e) => e.reason ?? '' },\n { header: 'SOURCE', get: (e) => e.source },\n ], { json: Boolean(g.json), pagination });\n });\n\n orders.command('export')\n .description('Export orders as CSV (respects filters)')\n .option('--status <s>').option('--payment-status <s>').option('--type <t>').option('--source <s>')\n .option('-o, --out <file>', 'Write to file instead of stdout')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const path = '/api/v1/orders/export.csv' + qs({ status: opts.status, paymentStatus: opts.paymentStatus, type: opts.type, source: opts.source });\n const csv = await callThrottleText(resolveAuth(g), path);\n if (opts.out) { writeFileSync(opts.out, csv); success(`Wrote ${opts.out}`); } else process.stdout.write(csv);\n });\n\n orders.command('line-items <id>')\n .description('Edit order line items (JSON for add/update; comma ids for remove)')\n .option('--add <json>', 'JSON array: [{\"name\",\"unitPrice\",\"quantity\"}]')\n .option('--update <json>', 'JSON array: [{\"lineItemId\",\"quantity\"?,\"unitPrice\"?}]')\n .option('--remove <ids>', 'Comma-separated line item ids')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.add) body.add = JSON.parse(opts.add);\n if (opts.update) body.update = JSON.parse(opts.update);\n if (opts.remove) body.remove = String(opts.remove).split(',').map((s) => s.trim());\n await confirmAction({ message: `Edit line items on ${id} (may charge/refund the delta)?`, yes: g.yes, json: g.json });\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/line-items`, { method: 'PATCH', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n registerFulfillments(orders);\n}\n","import prompts from 'prompts';\n\nexport class ConfirmError extends Error { exitCode: number; constructor(m: string, code = 1) { super(m); this.exitCode = code; } }\n\nexport async function confirmAction(opts: { message: string; yes?: boolean; json?: boolean }): Promise<void> {\n if (opts.yes) return;\n if (opts.json || !process.stdin.isTTY) {\n throw new ConfirmError('This action needs confirmation. Re-run with --yes to proceed non-interactively.', 2);\n }\n const res = await prompts({ type: 'confirm', name: 'ok', message: opts.message, initial: false }, { onCancel: () => { throw new ConfirmError('Aborted.', 1); } });\n if (!res.ok) throw new ConfirmError('Aborted.', 1);\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\n\nconst base = (orderId: string) => `/api/v1/orders/${orderId}/fulfillments`;\n\nexport function registerFulfillments(orders: Command): void {\n const f = orders.command('fulfillments').description('Order fulfillments');\n\n f.command('list <orderId>').action(async (orderId, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), base(orderId));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'STATUS', get: (x) => x.status }, { header: 'TYPE', get: (x) => x.type }], { json: Boolean(g.json) });\n });\n\n f.command('get <orderId> <id>').action(async (orderId, id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `${base(orderId)}/${id}`), { json: Boolean(g.json) });\n });\n\n f.command('create <orderId>').option('--items <json>', 'JSON array of items').action(async (orderId, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Create a fulfillment on ${orderId}?`, yes: g.yes, json: g.json });\n const body = opts.items ? { items: JSON.parse(opts.items) } : {};\n renderObject(await callThrottle(resolveAuth(g), base(orderId), { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n const transition = (name: string, verb: 'POST', suffix: string, msg: (o: string, i: string) => string) =>\n f.command(`${name} <orderId> <id>`).action(async (orderId, id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: msg(orderId, id), yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `${base(orderId)}/${id}/${suffix}`, { method: verb });\n g.json ? renderObject(r, { json: true }) : success(`Fulfillment ${id} → ${name}`);\n });\n transition('processing', 'POST', 'processing', (o, i) => `Mark fulfillment ${i} processing?`);\n transition('complete', 'POST', 'complete', (o, i) => `Complete fulfillment ${i}?`);\n transition('cancel', 'POST', 'cancel', (o, i) => `Cancel fulfillment ${i}?`);\n\n // Only the fulfillment id: the endpoint is flat (`/api/v1/fulfillments/:id/delivered`)\n // because a carrier tracking webhook knows the fulfillment, not the order.\n // Asking for an orderId here would invent a parameter the API does not take.\n f.command('delivered <id>')\n .description('Record that a shipment arrived')\n .option('--at <iso8601>', 'When it arrived (defaults to now)')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Mark shipment for fulfillment ${id} delivered?`, yes: g.yes, json: g.json });\n const r = await callThrottle<any>(resolveAuth(g), `/api/v1/fulfillments/${id}/delivered`, {\n method: 'POST',\n body: JSON.stringify(opts.at ? { deliveredAt: opts.at } : {}),\n });\n g.json\n ? renderObject(r, { json: true })\n : success(`Fulfillment ${id} delivered ${r?.actualDelivery ?? ''}`.trim());\n });\n\n f.command('ship <orderId> <id>')\n .requiredOption('--carrier <c>').requiredOption('--tracking <t>')\n .action(async (orderId, id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Mark fulfillment ${id} shipped (${opts.carrier} ${opts.tracking})?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `${base(orderId)}/${id}/shipment`, { method: 'PATCH', body: JSON.stringify({ carrier: opts.carrier, trackingNumber: opts.tracking }) });\n g.json ? renderObject(r, { json: true }) : success(`Fulfillment ${id} shipped`);\n });\n}\n","/**\n * Build a query-string suffix from defined params.\n * Returns `?a=1&b=2` (leading `?`) when any value is set, else `''`.\n * Undefined values are skipped so callers can pass optional filters directly.\n */\nexport function qs(params: Record<string, string | undefined>): string {\n const s = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) if (v !== undefined) s.set(k, v);\n const str = s.toString();\n return str ? `?${str}` : '';\n}\n","// src/tables.ts\nvar CURRENCY_ROWS = [\n [\"AED\", 2, \"AED\", false],\n [\"AFN\", 2, \"AFN\", false],\n [\"ALL\", 2, \"ALL\", false],\n [\"AMD\", 2, \"AMD\", false],\n [\"AOA\", 2, \"AOA\", false],\n [\"ARS\", 2, \"ARS\", false],\n [\"AUD\", 2, \"A$\", false],\n [\"AWG\", 2, \"AWG\", false],\n [\"AZN\", 2, \"AZN\", false],\n [\"BAM\", 2, \"BAM\", false],\n [\"BBD\", 2, \"BBD\", false],\n [\"BDT\", 2, \"BDT\", false],\n [\"BHD\", 3, \"BHD\", false],\n [\"BIF\", 0, \"BIF\", false],\n [\"BMD\", 2, \"BMD\", false],\n [\"BND\", 2, \"BND\", false],\n [\"BOB\", 2, \"BOB\", false],\n [\"BOV\", 2, \"BOV\", true],\n [\"BRL\", 2, \"R$\", false],\n [\"BSD\", 2, \"BSD\", false],\n [\"BTN\", 2, \"BTN\", false],\n [\"BWP\", 2, \"BWP\", false],\n [\"BYN\", 2, \"BYN\", false],\n [\"BZD\", 2, \"BZD\", false],\n [\"CAD\", 2, \"CA$\", false],\n [\"CDF\", 2, \"CDF\", false],\n [\"CHE\", 2, \"CHE\", true],\n [\"CHF\", 2, \"CHF\", false],\n [\"CHW\", 2, \"CHW\", true],\n [\"CLF\", 4, \"CLF\", true],\n [\"CLP\", 0, \"CLP\", false],\n [\"CNY\", 2, \"CN\\xA5\", false],\n [\"COP\", 2, \"COP\", false],\n [\"COU\", 2, \"COU\", true],\n [\"CRC\", 2, \"CRC\", false],\n [\"CUP\", 2, \"CUP\", false],\n [\"CVE\", 2, \"CVE\", false],\n [\"CZK\", 2, \"CZK\", false],\n [\"DJF\", 0, \"DJF\", false],\n [\"DKK\", 2, \"DKK\", false],\n [\"DOP\", 2, \"DOP\", false],\n [\"DZD\", 2, \"DZD\", false],\n [\"EGP\", 2, \"EGP\", false],\n [\"ERN\", 2, \"ERN\", false],\n [\"ETB\", 2, \"ETB\", false],\n [\"EUR\", 2, \"\\u20AC\", false],\n [\"FJD\", 2, \"FJD\", false],\n [\"FKP\", 2, \"FKP\", false],\n [\"GBP\", 2, \"\\xA3\", false],\n [\"GEL\", 2, \"GEL\", false],\n [\"GHS\", 2, \"GHS\", false],\n [\"GIP\", 2, \"GIP\", false],\n [\"GMD\", 2, \"GMD\", false],\n [\"GNF\", 0, \"GNF\", false],\n [\"GTQ\", 2, \"GTQ\", false],\n [\"GYD\", 2, \"GYD\", false],\n [\"HKD\", 2, \"HK$\", false],\n [\"HNL\", 2, \"HNL\", false],\n [\"HTG\", 2, \"HTG\", false],\n [\"HUF\", 2, \"HUF\", false],\n [\"IDR\", 2, \"IDR\", false],\n [\"ILS\", 2, \"\\u20AA\", false],\n [\"INR\", 2, \"\\u20B9\", false],\n [\"IQD\", 3, \"IQD\", false],\n [\"IRR\", 2, \"IRR\", false],\n [\"ISK\", 0, \"ISK\", false],\n [\"JMD\", 2, \"JMD\", false],\n [\"JOD\", 3, \"JOD\", false],\n [\"JPY\", 0, \"\\xA5\", false],\n [\"KES\", 2, \"KES\", false],\n [\"KGS\", 2, \"KGS\", false],\n [\"KHR\", 2, \"KHR\", false],\n [\"KMF\", 0, \"KMF\", false],\n [\"KPW\", 2, \"KPW\", false],\n [\"KRW\", 0, \"\\u20A9\", false],\n [\"KWD\", 3, \"KWD\", false],\n [\"KYD\", 2, \"KYD\", false],\n [\"KZT\", 2, \"KZT\", false],\n [\"LAK\", 2, \"LAK\", false],\n [\"LBP\", 2, \"LBP\", false],\n [\"LKR\", 2, \"LKR\", false],\n [\"LRD\", 2, \"LRD\", false],\n [\"LSL\", 2, \"LSL\", false],\n [\"LYD\", 3, \"LYD\", false],\n [\"MAD\", 2, \"MAD\", false],\n [\"MDL\", 2, \"MDL\", false],\n [\"MGA\", 2, \"MGA\", false],\n [\"MKD\", 2, \"MKD\", false],\n [\"MMK\", 2, \"MMK\", false],\n [\"MNT\", 2, \"MNT\", false],\n [\"MOP\", 2, \"MOP\", false],\n [\"MRU\", 2, \"MRU\", false],\n [\"MUR\", 2, \"MUR\", false],\n [\"MVR\", 2, \"MVR\", false],\n [\"MWK\", 2, \"MWK\", false],\n [\"MXN\", 2, \"MX$\", false],\n [\"MXV\", 2, \"MXV\", true],\n [\"MYR\", 2, \"MYR\", false],\n [\"MZN\", 2, \"MZN\", false],\n [\"NAD\", 2, \"NAD\", false],\n [\"NGN\", 2, \"NGN\", false],\n [\"NIO\", 2, \"NIO\", false],\n [\"NOK\", 2, \"NOK\", false],\n [\"NPR\", 2, \"NPR\", false],\n [\"NZD\", 2, \"NZ$\", false],\n [\"OMR\", 3, \"OMR\", false],\n [\"PAB\", 2, \"PAB\", false],\n [\"PEN\", 2, \"PEN\", false],\n [\"PGK\", 2, \"PGK\", false],\n [\"PHP\", 2, \"\\u20B1\", false],\n [\"PKR\", 2, \"PKR\", false],\n [\"PLN\", 2, \"PLN\", false],\n [\"PYG\", 0, \"PYG\", false],\n [\"QAR\", 2, \"QAR\", false],\n [\"RON\", 2, \"RON\", false],\n [\"RSD\", 2, \"RSD\", false],\n [\"RUB\", 2, \"RUB\", false],\n [\"RWF\", 0, \"RWF\", false],\n [\"SAR\", 2, \"SAR\", false],\n [\"SBD\", 2, \"SBD\", false],\n [\"SCR\", 2, \"SCR\", false],\n [\"SDG\", 2, \"SDG\", false],\n [\"SEK\", 2, \"SEK\", false],\n [\"SGD\", 2, \"SGD\", false],\n [\"SHP\", 2, \"SHP\", false],\n [\"SLE\", 2, \"SLE\", false],\n [\"SOS\", 2, \"SOS\", false],\n [\"SRD\", 2, \"SRD\", false],\n [\"SSP\", 2, \"SSP\", false],\n [\"STN\", 2, \"STN\", false],\n [\"SVC\", 2, \"SVC\", false],\n [\"SYP\", 2, \"SYP\", false],\n [\"SZL\", 2, \"SZL\", false],\n [\"THB\", 2, \"THB\", false],\n [\"TJS\", 2, \"TJS\", false],\n [\"TMT\", 2, \"TMT\", false],\n [\"TND\", 3, \"TND\", false],\n [\"TOP\", 2, \"TOP\", false],\n [\"TRY\", 2, \"TRY\", false],\n [\"TTD\", 2, \"TTD\", false],\n [\"TWD\", 2, \"NT$\", false],\n [\"TZS\", 2, \"TZS\", false],\n [\"UAH\", 2, \"UAH\", false],\n [\"UGX\", 0, \"UGX\", false],\n [\"USD\", 2, \"$\", false],\n [\"USN\", 2, \"USN\", true],\n [\"UYI\", 0, \"UYI\", true],\n [\"UYU\", 2, \"UYU\", false],\n [\"UYW\", 4, \"UYW\", true],\n [\"UZS\", 2, \"UZS\", false],\n [\"VED\", 2, \"VED\", false],\n [\"VES\", 2, \"VES\", false],\n [\"VND\", 0, \"\\u20AB\", false],\n [\"VUV\", 0, \"VUV\", false],\n [\"WST\", 2, \"WST\", false],\n [\"XAD\", 2, \"XAD\", true],\n [\"XAF\", 0, \"FCFA\", false],\n [\"XCD\", 2, \"EC$\", false],\n [\"XCG\", 2, \"Cg.\", false],\n [\"XOF\", 0, \"F\\u202FCFA\", false],\n [\"XPF\", 0, \"CFPF\", false],\n [\"YER\", 2, \"YER\", false],\n [\"ZAR\", 2, \"ZAR\", false],\n [\"ZMW\", 2, \"ZMW\", false],\n [\"ZWG\", 2, \"ZWG\", false]\n];\n\n// src/currencies.ts\nvar UnknownCurrencyError = class extends Error {\n constructor(currency) {\n super(`Unknown currency code: ${currency}`);\n this.code = \"unknown_currency\";\n this.name = \"UnknownCurrencyError\";\n this.currency = currency;\n }\n};\nvar BY_CODE = new Map(\n CURRENCY_ROWS.map(([code, minorUnits, symbol, fund]) => [code, { minorUnits, symbol, fund }])\n);\nvar CURRENCIES = Object.freeze(\n CURRENCY_ROWS.map(([code, minorUnits, symbol]) => Object.freeze({ code, minorUnits, symbol }))\n);\nvar UNCONFIRMED = /* @__PURE__ */ new Set([\"COP\", \"HUF\", \"IDR\", \"ISK\", \"TWD\", \"UGX\"]);\nvar UNCONFIRMED_EXPONENT_CODES = Object.freeze({\n has: (code) => UNCONFIRMED.has(code),\n get size() {\n return UNCONFIRMED.size;\n },\n forEach: (fn, thisArg) => UNCONFIRMED.forEach((v) => fn.call(thisArg, v, v, UNCONFIRMED_EXPONENT_CODES)),\n keys: () => UNCONFIRMED.keys(),\n values: () => UNCONFIRMED.values(),\n entries: () => UNCONFIRMED.entries(),\n [Symbol.iterator]: () => UNCONFIRMED.values()\n});\nfunction currencyRow(code) {\n return BY_CODE.get(code);\n}\nfunction isKnownCurrency(code) {\n return BY_CODE.has(code);\n}\nfunction minorUnitsOf(code) {\n const row = BY_CODE.get(code);\n if (row === void 0) throw new UnknownCurrencyError(code);\n return row.minorUnits;\n}\nfunction isEnableableCurrency(code) {\n const row = BY_CODE.get(code);\n return row !== void 0 && row.minorUnits !== 4 && !row.fund && !UNCONFIRMED.has(code);\n}\n\n// src/format.ts\nvar NBSP = \"\\xA0\";\nfunction normalizeCode(code) {\n return typeof code === \"string\" ? code.trim().toUpperCase() : \"\";\n}\nfunction displayExponent(normalizedCode) {\n return currencyRow(normalizedCode)?.minorUnits ?? 2;\n}\nfunction roundHalfAwayFromZero(n) {\n return n < 0 ? -Math.round(-n) : Math.round(n);\n}\nfunction decimalDigits(abs, exponent, grouped) {\n const raw = Number.isSafeInteger(abs) ? String(abs) : BigInt(abs).toString();\n const padded = raw.padStart(exponent + 1, \"0\");\n const cut = padded.length - exponent;\n let integer = padded.slice(0, cut);\n if (grouped) integer = integer.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return exponent === 0 ? integer : `${integer}.${padded.slice(cut)}`;\n}\nfunction formatMoney(minor, code, opts) {\n if (typeof minor !== \"number\" || !Number.isFinite(minor)) return \"\\u2014\";\n const c = normalizeCode(code);\n const row = currencyRow(c);\n const n = roundHalfAwayFromZero(minor);\n const sign = n < 0 ? \"-\" : \"\";\n const digits = decimalDigits(Math.abs(n), row?.minorUnits ?? 2, true);\n if (c === \"\") return sign + digits;\n if (row === void 0) return `${sign}${digits}${NBSP}${c}`;\n const separator = /\\p{Sc}$/u.test(row.symbol) ? \"\" : NBSP;\n const text = `${sign}${row.symbol}${separator}${digits}`;\n return opts?.display === \"symbol-code\" && row.symbol !== c ? `${text}${NBSP}${c}` : text;\n}\nfunction currencySymbol(code) {\n const c = normalizeCode(code);\n return currencyRow(c)?.symbol ?? c;\n}\nfunction toDecimalString(minor, code) {\n if (typeof minor !== \"number\" || !Number.isFinite(minor)) return \"\";\n const n = roundHalfAwayFromZero(minor);\n const sign = n < 0 ? \"-\" : \"\";\n return sign + decimalDigits(Math.abs(n), displayExponent(normalizeCode(code)), false);\n}\nfunction moneyValue(amount, currency) {\n return { amount, currency: normalizeCode(currency), display: formatMoney(amount, currency) };\n}\n\n// src/parse.ts\nfunction toMinorUnits(negative, integer, fraction, exponent) {\n if (fraction.length > exponent) return null;\n const n = Number(integer + fraction.padEnd(exponent, \"0\"));\n if (!Number.isSafeInteger(n)) return null;\n return negative && n !== 0 ? -n : n;\n}\nfunction toMinor(decimal, code) {\n const text = typeof decimal === \"number\" ? String(decimal) : typeof decimal === \"string\" ? decimal : \"\";\n const m = /^(-?)(\\d+)(?:\\.(\\d+))?$/.exec(text);\n if (m === null) return null;\n return toMinorUnits(m[1] === \"-\", m[2], m[3] ?? \"\", displayExponent(normalizeCode(code)));\n}\nvar SPACE = /^[ \\u00A0]/;\nvar TRAILING_SPACE = /[ \\u00A0]$/;\nvar AMOUNT = /^([1-9]\\d{0,2}(?:,\\d{3})+|\\d+)(?:\\.(\\d+))?$/;\nfunction withoutMarker(text, markers) {\n for (const marker of markers) {\n if (text.startsWith(marker)) return text.slice(marker.length).replace(SPACE, \"\");\n }\n for (const marker of markers) {\n if (text.endsWith(marker)) return text.slice(0, text.length - marker.length).replace(TRAILING_SPACE, \"\");\n }\n return text;\n}\nfunction parseMoney(text, code) {\n if (typeof text !== \"string\") return null;\n const c = normalizeCode(code);\n let rest = text.trim();\n const negative = rest.startsWith(\"-\");\n if (negative) rest = rest.slice(1);\n if (c !== \"\") {\n const symbol = currencySymbol(c);\n rest = withoutMarker(rest, symbol === c ? [c] : [symbol, c]);\n }\n const m = AMOUNT.exec(rest);\n if (m === null) return null;\n return toMinorUnits(negative, m[1].replace(/,/g, \"\"), m[2] ?? \"\", displayExponent(c));\n}\nexport {\n CURRENCIES,\n UNCONFIRMED_EXPONENT_CODES,\n UnknownCurrencyError,\n currencySymbol,\n formatMoney,\n isEnableableCurrency,\n isKnownCurrency,\n minorUnitsOf,\n moneyValue,\n parseMoney,\n toDecimalString,\n toMinor\n};\n","import { formatMoney } from '@usethrottle/money';\nimport { callThrottle, type AuthCtx } from './client.js';\n\n/** Human output only. `--json` prints the API's integers untouched. */\nexport function fmt(minor: number | null | undefined, currency: string | null | undefined): string {\n return formatMoney(Number(minor ?? 0), String(currency ?? ''));\n}\n\n/**\n * The currency a confirm prompt should name, read from the record the action is\n * about. A prompt is advice, so a failed lookup falls back to `undefined` and the\n * caller words the prompt without a currency instead of blocking the action.\n */\nexport async function currencyOf(auth: AuthCtx, path: string, g: { yes?: boolean; json?: boolean }): Promise<string | undefined> {\n // Only a prompt that will actually be shown needs the lookup; --yes and --json\n // paths make exactly the requests they made before.\n if (g.yes || g.json || !process.stdin.isTTY) return undefined;\n try {\n const rec = await callThrottle<{ currency?: string }>(auth, path);\n return rec?.currency || undefined;\n } catch {\n return undefined;\n }\n}\n\n/** The store's main currency (whoami names the application, the application names its currency); undefined when it cannot be read. */\nexport async function mainCurrencyOf(auth: AuthCtx): Promise<string | undefined> {\n try {\n const me = await callThrottle<{ application?: { id?: string } | null }>(auth, '/api/v1/whoami');\n const id = me?.application?.id;\n if (!id) return undefined;\n const app = await callThrottle<{ currency?: string }>(auth, `/api/v1/stores/${id}`);\n return app?.currency || undefined;\n } catch {\n return undefined;\n }\n}\n\n/** `€5.00` when the currency is known, else the bare minor-unit count in words. */\nexport function amountPhrase(minor: number, currency: string | undefined): string {\n return currency ? fmt(minor, currency) : `${minor} minor units`;\n}\n\n/** A discount's value: `15%`, or each currency's fixed amount, main first: `$10.00 · €9.00`. */\nexport function discountValue(d: { type?: string; value?: number; currency?: string; amounts?: Record<string, { value?: number }> }, mainCurrency?: string): string {\n if (d.type === 'percentage') return `${d.value}%`;\n // jsonb does not keep key order, so the main currency is named, not assumed:\n // the row's own `currency` if the API sent one, else the store's. The rest\n // follow in code order so the output is stable.\n const main = String(d.currency ?? mainCurrency ?? '').toUpperCase();\n const entries = Object.entries(d.amounts ?? {})\n .filter(([, a]) => typeof a?.value === 'number')\n .sort(([a], [b]) => (a === main ? -1 : b === main ? 1 : a < b ? -1 : a > b ? 1 : 0));\n if (entries.length > 0) return entries.map(([code, a]) => formatMoney(a.value as number, code)).join(' · ');\n return d.value === undefined ? '' : fmt(d.value, d.currency);\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { fmt } from '../lib/money.js';\n\nexport function register(program: Command): void {\n const r = program.command('returns').description('Returns / RMA (order detail → Returns)');\n\n r.command('list').requiredOption('--order <orderId>').action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), `/api/v1/orders/${opts.order}/returns`);\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'STATUS', get: (x) => x.status }, { header: 'REFUND', get: (x) => fmt(x.refundAmount, x.currency) }], { json: Boolean(g.json) });\n });\n\n r.command('open').requiredOption('--order <orderId>').requiredOption('--items <json>', 'JSON array of {lineItemId, quantity}')\n .option('--reason <r>').option('--restock')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Open a return on order ${opts.order}?`, yes: g.yes, json: g.json });\n const body = { items: JSON.parse(opts.items), reason: opts.reason, restock: Boolean(opts.restock) };\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/orders/${opts.order}/returns`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n r.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/returns/${id}`), { json: Boolean(g.json) });\n });\n\n r.command('transition <id>').requiredOption('--action <a>', 'approve|receive|complete|reject|cancel')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Transition return ${id} → ${opts.action}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/returns/${id}/transition`, { method: 'POST', body: JSON.stringify({ action: opts.action }) });\n g.json ? renderObject(res, { json: true }) : success(`Return ${id} → ${opts.action}`);\n });\n\n r.command('exchange <id>').requiredOption('--items <json>', 'JSON array of replacement items')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Complete return ${id} as an exchange (may charge/refund the delta)?`, yes: g.yes, json: g.json });\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/returns/${id}/exchange`, { method: 'POST', body: JSON.stringify({ items: JSON.parse(opts.items) }) }), { json: Boolean(g.json) });\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { amountPhrase, currencyOf, fmt } from '../lib/money.js';\n\nexport function register(program: Command): void {\n const p = program.command('payments').description('Payment actions (order detail + invoices)');\n\n p.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/payments/${id}`), { json: Boolean(g.json) });\n });\n\n p.command('refund <id>').option('--amount <cents>', 'Amount in minor units (default: full)').option('--reason <r>')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const auth = resolveAuth(g);\n const currency = opts.amount ? await currencyOf(auth, `/api/v1/payments/${id}`, g) : undefined;\n await confirmAction({ message: `Refund ${opts.amount ? amountPhrase(Number(opts.amount), currency) : 'the full balance'} on payment ${id}?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = {};\n if (opts.amount) body.amount = Number(opts.amount);\n if (opts.reason) body.reason = opts.reason;\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/refund`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n p.command('capture <id>').option('--amount <cents>', 'Amount to capture (default: full authorized)')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const currency = opts.amount ? await currencyOf(resolveAuth(g), `/api/v1/payments/${id}`, g) : undefined;\n await confirmAction({ message: `Capture ${opts.amount ? amountPhrase(Number(opts.amount), currency) : 'the full authorized amount'} on payment ${id}?`, yes: g.yes, json: g.json });\n const body = opts.amount ? { amount: Number(opts.amount) } : {};\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/capture`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n const RECORD_METHODS = ['cash', 'bank_transfer', 'cheque', 'external'];\n\n p.command('record')\n .description('Record money that arrived outside Throttle')\n .requiredOption('--order <id>', 'Order the money is for')\n .requiredOption('--amount <cents>', 'Amount in minor units')\n .requiredOption('--method <method>', RECORD_METHODS.join(' | '))\n .option('--received-at <date>', 'ISO date-time the money arrived (default: now)')\n .option('--reference <text>', 'Cheque number, till id, wire reference')\n .option('--note <text>', 'Free-text note')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (!RECORD_METHODS.includes(opts.method)) {\n throw new Error(`Unknown method '${opts.method}'. Expected one of: ${RECORD_METHODS.join(', ')}`);\n }\n const currency = await currencyOf(resolveAuth(g), `/api/v1/orders/${opts.order}`, g);\n await confirmAction({ message: `Record ${amountPhrase(Number(opts.amount), currency)} (${opts.method}) on order ${opts.order}?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { amount: Number(opts.amount), method: opts.method };\n if (opts.receivedAt) body.receivedAt = opts.receivedAt;\n if (opts.reference) body.reference = opts.reference;\n if (opts.note) body.note = opts.note;\n const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${opts.order}/payments/record`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n if (g.json) { renderObject(r, { json: true }); return; }\n const pay = ((r as any)?.data ?? r) as { id: string; amount: number; currency: string; method?: string };\n success(`Recorded ${fmt(pay.amount, pay.currency)} (${pay.method ?? opts.method}) as ${pay.id}`);\n });\n\n p.command('mark-failed <id>')\n .description('Declare a payment failed by hand (the wire that never arrived)')\n .requiredOption('--reason <text>', 'Why it failed — stored on the payment and the timeline')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Mark payment ${id} failed?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/mark-failed`, {\n method: 'POST',\n body: JSON.stringify({ reason: opts.reason }),\n });\n g.json ? renderObject(r, { json: true }) : success(`Payment ${id} marked failed`);\n });\n\n p.command('resend-invoice <id>').description('Re-send the invoice email for a payment')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const r = await callThrottle(resolveAuth(g), `/api/v1/payments/${id}/invoice/resend`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Invoice resent for payment ${id}`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { qs } from '../lib/qs.js';\n\nexport function register(program: Command): void {\n const c = program.command('customers').description('Customers');\n\n c.command('list').option('-q, --query <text>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const { data, pagination } = await callThrottleList<any>(resolveAuth(g), '/api/v1/customers' + qs({ q: opts.query, limit: opts.limit, cursor: opts.cursor }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'EMAIL', get: (x) => x.email }, { header: 'NAME', get: (x) => [x.firstName, x.lastName].filter(Boolean).join(' ') }, { header: 'EXTERNAL', get: (x) => x.externalId }], { json: Boolean(g.json), pagination });\n });\n\n c.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}`), { json: Boolean(g.json) });\n });\n\n c.command('create').requiredOption('--email <e>').option('--first-name <n>').option('--last-name <n>')\n .option('--name <n>', 'Alias for --first-name').option('--external-id <x>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = { email: opts.email };\n if (opts.firstName ?? opts.name) body.firstName = opts.firstName ?? opts.name;\n if (opts.lastName) body.lastName = opts.lastName;\n if (opts.externalId) body.externalId = opts.externalId;\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/customers', { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n c.command('update <id>').option('--email <e>').option('--first-name <n>').option('--last-name <n>')\n .option('--name <n>', 'Alias for --first-name').option('--external-id <x>')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.email) body.email = opts.email;\n if (opts.firstName ?? opts.name) body.firstName = opts.firstName ?? opts.name;\n if (opts.lastName) body.lastName = opts.lastName;\n if (opts.externalId !== undefined) body.externalId = opts.externalId;\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}`, { method: 'PATCH', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n const addr = c.command('addresses').description('Customer addresses');\n addr.command('list <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), `/api/v1/customers/${id}/addresses`);\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'LINE1', get: (x) => x.line1 }, { header: 'CITY', get: (x) => x.city }, { header: 'COUNTRY', get: (x) => x.country }], { json: Boolean(g.json) });\n });\n addr.command('add <id>').requiredOption('--json-body <json>', 'Address JSON').action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}/addresses`, { method: 'POST', body: opts.jsonBody }), { json: Boolean(g.json) });\n });\n addr.command('update <id> <addrId>').requiredOption('--json-body <json>', 'Address JSON').action(async (id, addrId, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}/addresses/${addrId}`, { method: 'PATCH', body: opts.jsonBody }), { json: Boolean(g.json) });\n });\n addr.command('remove <id> <addrId>').action(async (id, addrId, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Delete address ${addrId} on customer ${id}?`, yes: g.yes, json: g.json });\n await callThrottle(resolveAuth(g), `/api/v1/customers/${id}/addresses/${addrId}`, { method: 'DELETE' });\n success(`Address ${addrId} removed`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { qs } from '../lib/qs.js';\nimport { amountPhrase, currencyOf, fmt } from '../lib/money.js';\n\nexport function register(program: Command): void {\n const s = program.command('subscriptions').description('Subscriptions');\n\n s.command('list').option('--customer <id>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const { data, pagination } = await callThrottleList<any>(resolveAuth(g), '/api/v1/subscriptions' + qs({ customerId: opts.customer, limit: opts.limit, cursor: opts.cursor }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'STATUS', get: (x) => x.status }, { header: 'PLAN', get: (x) => x.planName ?? x.planReference }, { header: 'AMOUNT', get: (x) => fmt(x.amount, x.currency) }, { header: 'RENEWS', get: (x) => x.currentPeriodEnd }], { json: Boolean(g.json), pagination });\n });\n\n s.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}`), { json: Boolean(g.json) });\n });\n\n s.command('cancel <id>').option('--at-period-end', 'Cancel at the period boundary instead of now')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Cancel subscription ${id}${opts.atPeriodEnd ? ' at period end' : ' now'}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/cancel`, { method: 'POST', body: JSON.stringify({ atPeriodEnd: Boolean(opts.atPeriodEnd) }) });\n g.json ? renderObject(res, { json: true }) : success(`Subscription ${id} cancelled`);\n });\n\n for (const verb of ['pause', 'resume'] as const) {\n s.command(`${verb} <id>`).action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `${verb[0].toUpperCase() + verb.slice(1)} subscription ${id}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/${verb}`, { method: 'POST' });\n g.json ? renderObject(res, { json: true }) : success(`Subscription ${id} ${verb}d`);\n });\n }\n\n // Both only apply to a past-due subscription — the API answers 422 otherwise,\n // and the message says which state it found.\n s.command('retry-charge <id>').description(\"Retry a past-due subscription's failed renewal charge now\")\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Charge the saved card for subscription ${id} now?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/retry-charge`, { method: 'POST' });\n g.json ? renderObject(res, { json: true }) : success(`Retried the charge on ${id} — status is now ${(res as any)?.status ?? 'unknown'}`);\n });\n\n s.command('waive-period <id>').description('Forgive the current period on a past-due subscription (settles it at zero)')\n .requiredOption('--reason <r>', 'Why the money is not being collected — recorded on the order')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Write off the current period on subscription ${id}?`, yes: g.yes, json: g.json });\n const res = await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/waive-period`, { method: 'POST', body: JSON.stringify({ reason: opts.reason }) });\n g.json ? renderObject(res, { json: true }) : success(`Waived the current period on ${id}`);\n });\n\n s.command('change-plan <id>')\n .requiredOption('--amount <cents>')\n .option('--interval <i>', 'weekly|biweekly|monthly|quarterly|yearly')\n .option('--interval-unit <u>', 'hour|day|week|month (with --interval-count)')\n .option('--interval-count <n>', 'every N units, up to one year')\n .option('--plan-reference <r>').option('--plan-name <n>').option('--effective <e>', 'now|period_end', 'now')\n .option('--allow-zero-amount', 'allow --amount 0 (a free or usage-only plan); the API refuses 0 without it')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const custom = opts.intervalUnit !== undefined || opts.intervalCount !== undefined;\n if (!opts.interval && !(opts.intervalUnit && opts.intervalCount)) {\n throw new Error('Pass --interval, or both --interval-unit and --interval-count');\n }\n const cadence = custom ? `every ${opts.intervalCount} ${opts.intervalUnit}` : opts.interval;\n const currency = await currencyOf(resolveAuth(g), `/api/v1/subscriptions/${id}`, g);\n await confirmAction({ message: `Change plan on ${id} → ${amountPhrase(Number(opts.amount), currency)}/${cadence} (${opts.effective})?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { amount: Number(opts.amount), effective: opts.effective };\n if (opts.interval) body.interval = opts.interval;\n if (custom) {\n body.intervalUnit = opts.intervalUnit;\n body.intervalCount = Number(opts.intervalCount);\n }\n if (opts.planReference) body.planReference = opts.planReference;\n if (opts.planName) body.planName = opts.planName;\n if (opts.allowZeroAmount) body.allowZeroAmount = true;\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/change-plan`, { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n\n s.command('cancel-pending-change <id>').description('Cancel a scheduled plan change')\n .action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await callThrottle(resolveAuth(g), `/api/v1/subscriptions/${id}/pending-change`, { method: 'DELETE' });\n success(`Cleared pending change on ${id}`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { discountValue, mainCurrencyOf } from '../lib/money.js';\n\nexport function register(program: Command): void {\n const d = program.command('discounts').description('Discount codes');\n\n d.command('list').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const auth = resolveAuth(g);\n const data = await callThrottle<any[]>(auth, '/api/v1/discounts');\n // Human output only: the store's main currency orders a multi-currency value.\n const multi = !g.json && data.some((x) => x.type !== 'percentage' && !x.currency && Object.keys(x.amounts ?? {}).length > 1);\n const main = multi ? await mainCurrencyOf(auth) : undefined;\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'CODE', get: (x) => x.code }, { header: 'TYPE', get: (x) => x.type }, { header: 'VALUE', get: (x) => discountValue(x, main) }, { header: 'ACTIVE', get: (x) => x.active }], { json: Boolean(g.json) });\n });\n\n d.command('create').requiredOption('--json-body <json>', 'Discount JSON (code, type, value, …)')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/discounts', { method: 'POST', body: opts.jsonBody }), { json: Boolean(g.json) });\n });\n\n d.command('toggle <id>').option('--active', 'Enable').option('--inactive', 'Disable')\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (Boolean(opts.active) === Boolean(opts.inactive)) { const e = new Error('Pass exactly one of --active or --inactive'); (e as any).exitCode = 2; throw e; }\n const active = Boolean(opts.active);\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/discounts/${id}`, { method: 'PATCH', body: JSON.stringify({ active }) }), { json: Boolean(g.json) });\n });\n\n d.command('delete <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Delete discount ${id}?`, yes: g.yes, json: g.json });\n await callThrottle(resolveAuth(g), `/api/v1/discounts/${id}`, { method: 'DELETE' });\n success(`Discount ${id} deleted`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\nimport { qs } from '../lib/qs.js';\n\nexport function register(program: Command): void {\n const w = program.command('webhooks').description('Webhook endpoints + deliveries');\n\n const ep = w.command('endpoints').description('Manage endpoints');\n ep.command('list').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), '/api/v1/webhook-endpoints');\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'URL', get: (x) => x.url }, { header: 'ACTIVE', get: (x) => x.isActive }, { header: 'EVENTS', get: (x) => (x.enabledEvents ?? []).length }], { json: Boolean(g.json) });\n });\n ep.command('create').requiredOption('--url <u>').requiredOption('--events <list>', 'Comma-separated event types')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body = { url: opts.url, enabledEvents: String(opts.events).split(',').map((s: string) => s.trim()) };\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/webhook-endpoints', { method: 'POST', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n ep.command('update <id>').option('--url <u>').option('--events <list>').option('--active <bool>', \"'true' or 'false'\")\n .action(async (id, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.url) body.url = opts.url;\n if (opts.events) body.enabledEvents = String(opts.events).split(',').map((s: string) => s.trim());\n if (opts.active !== undefined) {\n if (opts.active !== 'true' && opts.active !== 'false') { const e = new Error(`--active must be 'true' or 'false' (got '${opts.active}')`); (e as any).exitCode = 2; throw e; }\n body.isActive = opts.active === 'true';\n }\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}`, { method: 'PATCH', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n ep.command('delete <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Delete webhook endpoint ${id}?`, yes: g.yes, json: g.json });\n await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}`, { method: 'DELETE' });\n success(`Endpoint ${id} deleted`);\n });\n ep.command('send-test <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const r = await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}/test`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Test event queued to ${id}`);\n });\n ep.command('rotate-secret <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Rotate the signing secret for ${id}? (old secret stops validating)`, yes: g.yes, json: g.json });\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}/rotate-secret`, { method: 'POST' }), { json: Boolean(g.json) });\n });\n\n const del = w.command('deliveries').description('Inspect + replay deliveries');\n del.command('list').option('--endpoint <id>').option('--status <s>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), '/api/v1/webhook-deliveries' + qs({ endpointId: opts.endpoint, status: opts.status }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'EVENT', get: (x) => x.eventType }, { header: 'STATUS', get: (x) => x.status }, { header: 'ATTEMPTS', get: (x) => x.attemptCount }], { json: Boolean(g.json) });\n });\n del.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/webhook-deliveries/${id}`), { json: Boolean(g.json) });\n });\n del.command('replay <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({ message: `Replay delivery ${id}?`, yes: g.yes, json: g.json });\n const r = await callThrottle(resolveAuth(g), `/api/v1/webhook-deliveries/${id}/replay`, { method: 'POST' });\n g.json ? renderObject(r, { json: true }) : success(`Delivery ${id} replayed`);\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderList, renderObject, success } from '../lib/output.js';\nimport { confirmAction } from '../lib/confirm.js';\n\n/** Shared by `push` and `list` so the two never disagree about a script's shape. */\ninterface ExtensionScript {\n id: string;\n key: string;\n name: string;\n tier: 'sandbox' | 'dom';\n surfaces: string[];\n consentCategory: string;\n protectedData: string;\n externalDomains: string[];\n}\n\nconst COLUMNS = [\n { header: 'KEY', get: (x: ExtensionScript) => x.key },\n { header: 'TIER', get: (x: ExtensionScript) => x.tier },\n { header: 'SURFACES', get: (x: ExtensionScript) => (x.surfaces ?? []).join(',') },\n { header: 'CONSENT', get: (x: ExtensionScript) => x.consentCategory },\n { header: 'PII', get: (x: ExtensionScript) => x.protectedData },\n { header: 'DOMAINS', get: (x: ExtensionScript) => (x.externalDomains ?? []).join(',') || '-' },\n { header: 'ID', get: (x: ExtensionScript) => x.id },\n];\n\nfunction fail(message: string): never {\n const e = new Error(message);\n (e as any).exitCode = 2;\n throw e;\n}\n\nfunction splitList(value: string | undefined): string[] {\n return String(value ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nexport function register(program: Command): void {\n const ext = program.command('extensions').description('Marketplace extensions');\n const scripts = ext\n .command('scripts')\n .description('Buyer-facing scripts an extension ships');\n\n scripts\n .command('list <extensionId>')\n .description('List the scripts declared on an extension')\n .action(async (extensionId: string, _o: unknown, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<{ scripts: ExtensionScript[] }>(\n resolveAuth(g),\n `/api/v1/extensions/${extensionId}/scripts`,\n );\n renderList(data.scripts ?? [], COLUMNS, { json: Boolean(g.json) });\n });\n\n scripts\n .command('push <extensionId>')\n .description('Create or replace a script on an extension from a source file')\n // Pushing a key that already exists replaces its source on the target\n // draft version — that is how an app ships an update. Capabilities\n // (tier/surfaces/consent/pii/domains) are frozen once the script has\n // shipped in a published version, so a push that changes one is refused.\n .requiredOption('--version-id <id>', 'Draft extension version to attach the source to')\n .requiredOption('--key <key>', 'Stable handle, lowercase slug')\n .requiredOption('--name <name>', 'Human-readable name')\n .requiredOption('--source <path>', 'Path to the .js file')\n .requiredOption('--surfaces <list>', 'Comma-separated: storefront,checkout,quote')\n .option('--tier <tier>', \"'sandbox' (default) or 'dom'\", 'sandbox')\n .option('--consent <category>', 'essential|functional|analytics|marketing', 'analytics')\n .option('--pii <grade>', 'none|hashed|raw', 'none')\n .option('--domains <list>', 'Comma-separated hostnames the script may reach (static.example.com or *.example.com)')\n .action(async (extensionId: string, opts: any, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n\n // Read locally and fail early with the path in the message. The API\n // would otherwise reject an empty body and the developer would be left\n // guessing whether the file or the request was wrong.\n const path = resolve(process.cwd(), String(opts.source));\n let source: string;\n try {\n source = readFileSync(path, 'utf8');\n } catch {\n fail(`Could not read --source ${path}`);\n }\n if (!source.trim()) fail(`--source ${path} is empty`);\n\n const surfaces = splitList(opts.surfaces);\n if (surfaces.length === 0) fail('--surfaces must name at least one surface');\n\n // Checked here as well as by the API, purely so the developer gets the\n // reason without a round trip. The API and the database are what\n // actually enforce it — a dom-tier script runs outside the sandbox on\n // the merchant's page and must never reach a payment page.\n if (opts.tier === 'dom' && !(surfaces.length === 1 && surfaces[0] === 'storefront')) {\n fail(\"--tier dom may only be used with --surfaces storefront\");\n }\n\n const body = {\n key: opts.key,\n name: opts.name,\n source,\n tier: opts.tier,\n surfaces,\n consentCategory: opts.consent,\n protectedData: opts.pii,\n externalDomains: splitList(opts.domains),\n extensionVersionId: opts.versionId,\n };\n\n renderObject(\n await callThrottle(resolveAuth(g), `/api/v1/extensions/${extensionId}/scripts`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n { json: Boolean(g.json) },\n );\n });\n\n scripts\n .command('rm <extensionId> <scriptId>')\n .description('Delete a script from an extension')\n .action(async (extensionId: string, scriptId: string, _o: unknown, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n await confirmAction({\n message: `Delete script ${scriptId} from extension ${extensionId}?`,\n yes: g.yes,\n json: g.json,\n });\n await callThrottle(resolveAuth(g), `/api/v1/extensions/${extensionId}/scripts/${scriptId}`, {\n method: 'DELETE',\n });\n success(`Script ${scriptId} deleted`);\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle, callThrottleList } from '../lib/client.js';\nimport { renderList, renderObject } from '../lib/output.js';\nimport { qs } from '../lib/qs.js';\n\nexport function register(program: Command): void {\n const e = program.command('events').description('Emitted events + catalog');\n\n e.command('list').option('--type <t>').option('--limit <n>').option('--cursor <c>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const { data, pagination } = await callThrottleList<any>(resolveAuth(g), '/api/v1/events' + qs({ type: opts.type, limit: opts.limit, cursor: opts.cursor }));\n renderList(data, [{ header: 'ID', get: (x) => x.id }, { header: 'TYPE', get: (x) => x.type }, { header: 'ENTITY', get: (x) => x.entityId }, { header: 'CREATED', get: (x) => x.createdAt }], { json: Boolean(g.json), pagination });\n });\n\n e.command('get <id>').action(async (id, _o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), `/api/v1/events/${id}`), { json: Boolean(g.json) });\n });\n\n e.command('types').description('List the event-type catalog').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const data = await callThrottle<any[]>(resolveAuth(g), '/api/v1/event-types');\n renderList(data, [{ header: 'TYPE', get: (x) => (typeof x === 'string' ? x : x.type) }, { header: 'SCOPE', get: (x) => (typeof x === 'string' ? '' : x.readScope) }], { json: Boolean(g.json) });\n });\n}\n","import { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } from '../lib/client.js';\nimport { renderObject } from '../lib/output.js';\n\nexport function register(program: Command): void {\n const e = program.command('embed').description('Embed allowlist + branding');\n\n e.command('show').action(async (_o, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/embed-config'), { json: Boolean(g.json) });\n });\n\n e.command('set')\n .option('--origins <csv>', 'Comma-separated parent origins')\n .option('--primary <hex>', 'Primary brand color #rrggbb')\n .option('--logo <url>').option('--merchant-name <name>')\n .action(async (opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const body: Record<string, unknown> = {};\n if (opts.origins) body.allowedOrigins = String(opts.origins).split(',').map((s: string) => s.trim()).filter(Boolean);\n if (opts.primary) body.primaryColor = opts.primary;\n if (opts.logo) body.logoUrl = opts.logo;\n if (opts.merchantName) body.merchantName = opts.merchantName;\n if (Object.keys(body).length === 0) { const err = new Error('Pass at least one of --origins, --primary, --logo, --merchant-name'); (err as any).exitCode = 2; throw err; }\n renderObject(await callThrottle(resolveAuth(g), '/api/v1/embed-config', { method: 'PUT', body: JSON.stringify(body) }), { json: Boolean(g.json) });\n });\n}\n"],"mappings":"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OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,UAAU,KAAK;AAAA,EAC1B,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AAAA,EACvB,CAAC,OAAO,GAAG,OAAO,KAAK;AA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","names":["args","init","readFileSync","fileURLToPath","readFileSync","readFileSync","pc","headers","program","register","program","writeFileSync","register","program","writeFileSync","register","program","register","program","register","program","register","program","register","program","register","program","readFileSync","resolve","register","program","resolve","readFileSync","register","program","register","program","register"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usethrottle/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.0",
|
|
4
4
|
"description": "Throttle command-line tool — manage orders, payments, customers, subscriptions, discounts, webhooks and embed config from your terminal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -22,8 +22,9 @@
|
|
|
22
22
|
"tsup": "^8.0.0",
|
|
23
23
|
"typescript": "^5.7.0",
|
|
24
24
|
"vitest": "^2.1.9",
|
|
25
|
+
"@usethrottle/api-client": "^5.19.0",
|
|
25
26
|
"@usethrottle/errors": "^1.1.0",
|
|
26
|
-
"@usethrottle/
|
|
27
|
+
"@usethrottle/money": "^1.0.0"
|
|
27
28
|
},
|
|
28
29
|
"publishConfig": {
|
|
29
30
|
"access": "public"
|