@usethrottle/cli 2.0.1 → 2.2.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 +9 -2
- package/dist/cli.js +102 -34
- package/dist/cli.js.map +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -120,6 +120,11 @@ throttle orders fulfillments ship <orderId> <id> --carrier <c> --tracking <t>
|
|
|
120
120
|
`-q/--query`, `--limit`, `--cursor`. `orders export` writes CSV to stdout, or
|
|
121
121
|
to `--out <file>` when given.
|
|
122
122
|
|
|
123
|
+
Cursor-paginated lists (`orders`, `customers`, `subscriptions`, `events`) print
|
|
124
|
+
a `More results — next page: --cursor <c>` hint when more pages exist; under
|
|
125
|
+
`--json` they emit `{ "data": [...], "pagination": { "cursor", "hasMore" } }`
|
|
126
|
+
so scripts can page.
|
|
127
|
+
|
|
123
128
|
### `returns` — RMA / exchanges
|
|
124
129
|
|
|
125
130
|
```
|
|
@@ -147,8 +152,8 @@ balance / full authorized amount.
|
|
|
147
152
|
```
|
|
148
153
|
throttle customers list [-q, --query <text>] [--limit <n>] [--cursor <c>]
|
|
149
154
|
throttle customers get <id>
|
|
150
|
-
throttle customers create --email <e> [--name <n>] [--external-id <x>]
|
|
151
|
-
throttle customers update <id> [--email <e>] [--name <n>] [--external-id <x>]
|
|
155
|
+
throttle customers create --email <e> [--first-name <n>] [--last-name <n>] [--external-id <x>]
|
|
156
|
+
throttle customers update <id> [--email <e>] [--first-name <n>] [--last-name <n>] [--external-id <x>]
|
|
152
157
|
|
|
153
158
|
throttle customers addresses list <id>
|
|
154
159
|
throttle customers addresses add <id> --json-body <json>
|
|
@@ -156,6 +161,8 @@ throttle customers addresses update <id> <addrId> --json-body <json>
|
|
|
156
161
|
throttle customers addresses remove <id> <addrId>
|
|
157
162
|
```
|
|
158
163
|
|
|
164
|
+
`--name` is kept as an alias for `--first-name`.
|
|
165
|
+
|
|
159
166
|
### `subscriptions`
|
|
160
167
|
|
|
161
168
|
```
|
package/dist/cli.js
CHANGED
|
@@ -21,7 +21,7 @@ function printBanner(opts) {
|
|
|
21
21
|
if (!process.stdout.isTTY) return;
|
|
22
22
|
const v = opts?.version ? `v${opts.version}` : "";
|
|
23
23
|
process.stderr.write(
|
|
24
|
-
`${BRAND_BLUE}${BOLD}\u25B8 throttle${RESET} ${DIM}CLI${v ? " " + v : ""} \xB7 docs https://
|
|
24
|
+
`${BRAND_BLUE}${BOLD}\u25B8 throttle${RESET} ${DIM}CLI${v ? " " + v : ""} \xB7 docs https://usethrottle.dev/docs${RESET}
|
|
25
25
|
|
|
26
26
|
`
|
|
27
27
|
);
|
|
@@ -63,7 +63,7 @@ function url(auth, path) {
|
|
|
63
63
|
function headers(auth, init2) {
|
|
64
64
|
return { "content-type": "application/json", "x-api-key": auth.apiKey, ...init2.headers ?? {} };
|
|
65
65
|
}
|
|
66
|
-
async function
|
|
66
|
+
async function requestJson(auth, path, init2) {
|
|
67
67
|
const method = (init2.method ?? "GET").toUpperCase();
|
|
68
68
|
if (init2.body == null && (method === "POST" || method === "PATCH" || method === "PUT")) {
|
|
69
69
|
init2 = { ...init2, body: "{}" };
|
|
@@ -76,12 +76,23 @@ async function callThrottle(auth, path, init2 = {}) {
|
|
|
76
76
|
} catch {
|
|
77
77
|
}
|
|
78
78
|
if (!res.ok) {
|
|
79
|
-
const
|
|
80
|
-
const
|
|
79
|
+
const err = body.error;
|
|
80
|
+
const code = err?.code ?? `http_${res.status}`;
|
|
81
|
+
const message = err?.message ?? `Request failed (${res.status}): ${text.slice(0, 120)}`;
|
|
81
82
|
throw new ThrottleApiError(code, message, res.status);
|
|
82
83
|
}
|
|
84
|
+
return body;
|
|
85
|
+
}
|
|
86
|
+
async function callThrottle(auth, path, init2 = {}) {
|
|
87
|
+
const body = await requestJson(auth, path, init2);
|
|
83
88
|
return body && typeof body === "object" && "data" in body ? body.data : body;
|
|
84
89
|
}
|
|
90
|
+
async function callThrottleList(auth, path, init2 = {}) {
|
|
91
|
+
const body = await requestJson(auth, path, init2);
|
|
92
|
+
const data = "data" in body ? body.data : body;
|
|
93
|
+
const meta = body.meta;
|
|
94
|
+
return { data: Array.isArray(data) ? data : [], pagination: meta?.pagination ?? null };
|
|
95
|
+
}
|
|
85
96
|
async function callThrottleText(auth, path, init2 = {}) {
|
|
86
97
|
const res = await fetch(url(auth, path), { ...init2, headers: headers(auth, init2) });
|
|
87
98
|
const text = await res.text();
|
|
@@ -208,6 +219,24 @@ async function flushCliSentry(timeout = 2e3) {
|
|
|
208
219
|
import { mkdirSync, readFileSync as readFileSync3, writeFileSync, existsSync, chmodSync } from "fs";
|
|
209
220
|
import { homedir } from "os";
|
|
210
221
|
import { join } from "path";
|
|
222
|
+
|
|
223
|
+
// src/lib/key-format.ts
|
|
224
|
+
var KEY_RE = /^(sk|pk)_([a-z0-9_]+)_([0-9a-f]{64})$/;
|
|
225
|
+
function parseRawKey(key) {
|
|
226
|
+
const m = KEY_RE.exec(key);
|
|
227
|
+
if (!m) return null;
|
|
228
|
+
return { type: m[1], environment: m[2], random: m[3] };
|
|
229
|
+
}
|
|
230
|
+
function storedPrefixOf(key) {
|
|
231
|
+
const parsed = parseRawKey(key);
|
|
232
|
+
if (!parsed) return key.slice(0, 16);
|
|
233
|
+
return `${parsed.type}_${parsed.random.slice(0, 16)}`;
|
|
234
|
+
}
|
|
235
|
+
function modeOf(key) {
|
|
236
|
+
return parseRawKey(key)?.environment ?? "unknown";
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// src/config/profiles.ts
|
|
211
240
|
var DEFAULT_API_URL = "https://api.usethrottle.dev";
|
|
212
241
|
var ConfigError = class extends Error {
|
|
213
242
|
exitCode = 2;
|
|
@@ -254,8 +283,8 @@ function removeProfile(name) {
|
|
|
254
283
|
}
|
|
255
284
|
function maskKey(key) {
|
|
256
285
|
if (key.length <= 12) return "****";
|
|
257
|
-
const
|
|
258
|
-
const prefix =
|
|
286
|
+
const parsed = parseRawKey(key);
|
|
287
|
+
const prefix = parsed ? `${parsed.type}_${parsed.environment}_` : key.slice(0, 4);
|
|
259
288
|
return `${prefix}\u2026${key.slice(-4)}`;
|
|
260
289
|
}
|
|
261
290
|
function resolveAuth(globals) {
|
|
@@ -279,7 +308,7 @@ function printJson(data) {
|
|
|
279
308
|
}
|
|
280
309
|
function renderList(rows, columns, opts) {
|
|
281
310
|
if (opts.json) {
|
|
282
|
-
printJson(rows);
|
|
311
|
+
printJson(opts.pagination === void 0 ? rows : { data: rows, pagination: opts.pagination });
|
|
283
312
|
return;
|
|
284
313
|
}
|
|
285
314
|
if (rows.length === 0) {
|
|
@@ -292,6 +321,8 @@ function renderList(rows, columns, opts) {
|
|
|
292
321
|
const line = (cells) => cells.map((v, i) => v.padEnd(widths[i])).join(" ").trimEnd();
|
|
293
322
|
process.stdout.write(pc2.bold(line(headers2)) + "\n");
|
|
294
323
|
for (const row of body) process.stdout.write(line(row) + "\n");
|
|
324
|
+
if (opts.pagination?.cursor) process.stdout.write(pc2.dim(`More results \u2014 next page: --cursor ${opts.pagination.cursor}
|
|
325
|
+
`));
|
|
295
326
|
}
|
|
296
327
|
function renderObject(obj, opts) {
|
|
297
328
|
if (opts.json) {
|
|
@@ -352,23 +383,14 @@ function register(program2) {
|
|
|
352
383
|
}
|
|
353
384
|
|
|
354
385
|
// src/commands/whoami.ts
|
|
355
|
-
function modeFromKey(key) {
|
|
356
|
-
if (key.startsWith("sk_live_") || key.startsWith("pk_live_")) return "live";
|
|
357
|
-
if (key.startsWith("sk_test_") || key.startsWith("pk_test_")) return "test";
|
|
358
|
-
return "unknown";
|
|
359
|
-
}
|
|
360
|
-
function storedPrefix(key) {
|
|
361
|
-
const hex = key.replace(/^(sk|pk)_(test|live)_/, "");
|
|
362
|
-
return `${key.slice(0, 2)}_${hex.slice(0, 16)}`;
|
|
363
|
-
}
|
|
364
386
|
function register2(program2) {
|
|
365
387
|
program2.command("whoami").description("Show the active key context (environment + granted scopes)").action(async (_opts, cmd) => {
|
|
366
388
|
const g = cmd.optsWithGlobals();
|
|
367
389
|
const auth = resolveAuth(g);
|
|
368
390
|
const info = {
|
|
369
391
|
apiBaseUrl: auth.apiBaseUrl,
|
|
370
|
-
mode:
|
|
371
|
-
keyPrefix:
|
|
392
|
+
mode: modeOf(auth.apiKey),
|
|
393
|
+
keyPrefix: storedPrefixOf(auth.apiKey)
|
|
372
394
|
};
|
|
373
395
|
try {
|
|
374
396
|
const keys = await callThrottle(auth, "/api/v1/api-keys");
|
|
@@ -467,14 +489,13 @@ function register3(program2) {
|
|
|
467
489
|
const g = cmd.optsWithGlobals();
|
|
468
490
|
const auth = resolveAuth(g);
|
|
469
491
|
const path = "/api/v1/orders" + qs({ status: opts.status, paymentStatus: opts.paymentStatus, type: opts.type, source: opts.source, q: opts.query, limit: opts.limit, cursor: opts.cursor });
|
|
470
|
-
const data = await
|
|
492
|
+
const { data, pagination } = await callThrottleList(auth, path);
|
|
471
493
|
renderList(data, [
|
|
472
494
|
{ header: "ID", get: (o) => o.id },
|
|
473
495
|
{ header: "NUMBER", get: (o) => o.orderNumber },
|
|
474
|
-
{ header: "STATUS", get: (o) => o.status },
|
|
475
|
-
{ header: "PAYMENT", get: (o) => o.paymentStatus },
|
|
496
|
+
{ header: "STATUS", get: (o) => o.displayStatus ?? o.status },
|
|
476
497
|
{ header: "TOTAL", get: (o) => `${(o.total / 100).toFixed(2)} ${o.currency}` }
|
|
477
|
-
], { json: Boolean(g.json) });
|
|
498
|
+
], { json: Boolean(g.json), pagination });
|
|
478
499
|
});
|
|
479
500
|
orders.command("get <id>").description("Show an order").action(async (id, _o, cmd) => {
|
|
480
501
|
const g = cmd.optsWithGlobals();
|
|
@@ -486,6 +507,44 @@ function register3(program2) {
|
|
|
486
507
|
const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/cancel`, { method: "POST" });
|
|
487
508
|
g.json ? renderObject(r, { json: true }) : success(`Order ${id} cancelled`);
|
|
488
509
|
});
|
|
510
|
+
const ORDER_STATUSES = [
|
|
511
|
+
"draft",
|
|
512
|
+
"pending",
|
|
513
|
+
"processing",
|
|
514
|
+
"partially_fulfilled",
|
|
515
|
+
"fulfilled",
|
|
516
|
+
"cancelled",
|
|
517
|
+
"closed"
|
|
518
|
+
];
|
|
519
|
+
orders.command("status <id> <status>").description(`Set an order status (${ORDER_STATUSES.join(" | ")}). Moves in both directions.`).option("--reason <text>", "Note recorded on the status-history row").action(async (id, status, opts, cmd) => {
|
|
520
|
+
const g = cmd.optsWithGlobals();
|
|
521
|
+
if (!ORDER_STATUSES.includes(status)) {
|
|
522
|
+
throw new Error(`Unknown status '${status}'. Expected one of: ${ORDER_STATUSES.join(", ")}`);
|
|
523
|
+
}
|
|
524
|
+
await confirmAction({ message: `Set order ${id} to ${status}?`, yes: g.yes, json: g.json });
|
|
525
|
+
const body = { status };
|
|
526
|
+
if (opts.reason) body.reason = opts.reason;
|
|
527
|
+
renderObject(
|
|
528
|
+
await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/status`, {
|
|
529
|
+
method: "POST",
|
|
530
|
+
body: JSON.stringify(body)
|
|
531
|
+
}),
|
|
532
|
+
{ json: Boolean(g.json) }
|
|
533
|
+
);
|
|
534
|
+
});
|
|
535
|
+
orders.command("history <id>").description("Show an order's status history").action(async (id, _o, cmd) => {
|
|
536
|
+
const g = cmd.optsWithGlobals();
|
|
537
|
+
const r = await callThrottle(resolveAuth(g), `/api/v1/orders/${id}/status-history`);
|
|
538
|
+
const rows = r?.data ?? r;
|
|
539
|
+
renderList(rows, [
|
|
540
|
+
{ header: "WHEN", get: (h) => h.createdAt },
|
|
541
|
+
{ header: "FROM", get: (h) => h.fromStatus ?? "\u2014" },
|
|
542
|
+
{ header: "TO", get: (h) => h.toStatus },
|
|
543
|
+
{ header: "BY", get: (h) => h.actorType },
|
|
544
|
+
{ header: "SOURCE", get: (h) => h.source },
|
|
545
|
+
{ header: "REASON", get: (h) => h.reason ?? "" }
|
|
546
|
+
], { json: Boolean(g.json) });
|
|
547
|
+
});
|
|
489
548
|
orders.command("export").description("Export orders as CSV (respects filters)").option("--status <s>").option("--payment-status <s>").option("--type <t>").option("--source <s>").option("-o, --out <file>", "Write to file instead of stdout").action(async (opts, cmd) => {
|
|
490
549
|
const g = cmd.optsWithGlobals();
|
|
491
550
|
const path = "/api/v1/orders/export.csv" + qs({ status: opts.status, paymentStatus: opts.paymentStatus, type: opts.type, source: opts.source });
|
|
@@ -571,25 +630,27 @@ function register6(program2) {
|
|
|
571
630
|
const c = program2.command("customers").description("Customers");
|
|
572
631
|
c.command("list").option("-q, --query <text>").option("--limit <n>").option("--cursor <c>").action(async (opts, cmd) => {
|
|
573
632
|
const g = cmd.optsWithGlobals();
|
|
574
|
-
const data = await
|
|
575
|
-
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) });
|
|
633
|
+
const { data, pagination } = await callThrottleList(resolveAuth(g), "/api/v1/customers" + qs({ q: opts.query, limit: opts.limit, cursor: opts.cursor }));
|
|
634
|
+
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 });
|
|
576
635
|
});
|
|
577
636
|
c.command("get <id>").action(async (id, _o, cmd) => {
|
|
578
637
|
const g = cmd.optsWithGlobals();
|
|
579
638
|
renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}`), { json: Boolean(g.json) });
|
|
580
639
|
});
|
|
581
|
-
c.command("create").requiredOption("--email <e>").option("--name <n>").option("--external-id <x>").action(async (opts, cmd) => {
|
|
640
|
+
c.command("create").requiredOption("--email <e>").option("--first-name <n>").option("--last-name <n>").option("--name <n>", "Alias for --first-name").option("--external-id <x>").action(async (opts, cmd) => {
|
|
582
641
|
const g = cmd.optsWithGlobals();
|
|
583
642
|
const body = { email: opts.email };
|
|
584
|
-
if (opts.name) body.firstName = opts.name;
|
|
643
|
+
if (opts.firstName ?? opts.name) body.firstName = opts.firstName ?? opts.name;
|
|
644
|
+
if (opts.lastName) body.lastName = opts.lastName;
|
|
585
645
|
if (opts.externalId) body.externalId = opts.externalId;
|
|
586
646
|
renderObject(await callThrottle(resolveAuth(g), "/api/v1/customers", { method: "POST", body: JSON.stringify(body) }), { json: Boolean(g.json) });
|
|
587
647
|
});
|
|
588
|
-
c.command("update <id>").option("--email <e>").option("--name <n>").option("--external-id <x>").action(async (id, opts, cmd) => {
|
|
648
|
+
c.command("update <id>").option("--email <e>").option("--first-name <n>").option("--last-name <n>").option("--name <n>", "Alias for --first-name").option("--external-id <x>").action(async (id, opts, cmd) => {
|
|
589
649
|
const g = cmd.optsWithGlobals();
|
|
590
650
|
const body = {};
|
|
591
651
|
if (opts.email) body.email = opts.email;
|
|
592
|
-
if (opts.name) body.firstName = opts.name;
|
|
652
|
+
if (opts.firstName ?? opts.name) body.firstName = opts.firstName ?? opts.name;
|
|
653
|
+
if (opts.lastName) body.lastName = opts.lastName;
|
|
593
654
|
if (opts.externalId !== void 0) body.externalId = opts.externalId;
|
|
594
655
|
renderObject(await callThrottle(resolveAuth(g), `/api/v1/customers/${id}`, { method: "PATCH", body: JSON.stringify(body) }), { json: Boolean(g.json) });
|
|
595
656
|
});
|
|
@@ -620,8 +681,8 @@ function register7(program2) {
|
|
|
620
681
|
const s = program2.command("subscriptions").description("Subscriptions");
|
|
621
682
|
s.command("list").option("--customer <id>").option("--limit <n>").option("--cursor <c>").action(async (opts, cmd) => {
|
|
622
683
|
const g = cmd.optsWithGlobals();
|
|
623
|
-
const data = await
|
|
624
|
-
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) });
|
|
684
|
+
const { data, pagination } = await callThrottleList(resolveAuth(g), "/api/v1/subscriptions" + qs({ customerId: opts.customer, limit: opts.limit, cursor: opts.cursor }));
|
|
685
|
+
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 });
|
|
625
686
|
});
|
|
626
687
|
s.command("get <id>").action(async (id, _o, cmd) => {
|
|
627
688
|
const g = cmd.optsWithGlobals();
|
|
@@ -700,12 +761,19 @@ function register9(program2) {
|
|
|
700
761
|
const body = { url: opts.url, enabledEvents: String(opts.events).split(",").map((s) => s.trim()) };
|
|
701
762
|
renderObject(await callThrottle(resolveAuth(g), "/api/v1/webhook-endpoints", { method: "POST", body: JSON.stringify(body) }), { json: Boolean(g.json) });
|
|
702
763
|
});
|
|
703
|
-
ep.command("update <id>").option("--url <u>").option("--events <list>").option("--active <bool>").action(async (id, opts, cmd) => {
|
|
764
|
+
ep.command("update <id>").option("--url <u>").option("--events <list>").option("--active <bool>", "'true' or 'false'").action(async (id, opts, cmd) => {
|
|
704
765
|
const g = cmd.optsWithGlobals();
|
|
705
766
|
const body = {};
|
|
706
767
|
if (opts.url) body.url = opts.url;
|
|
707
768
|
if (opts.events) body.enabledEvents = String(opts.events).split(",").map((s) => s.trim());
|
|
708
|
-
if (opts.active !== void 0)
|
|
769
|
+
if (opts.active !== void 0) {
|
|
770
|
+
if (opts.active !== "true" && opts.active !== "false") {
|
|
771
|
+
const e = new Error(`--active must be 'true' or 'false' (got '${opts.active}')`);
|
|
772
|
+
e.exitCode = 2;
|
|
773
|
+
throw e;
|
|
774
|
+
}
|
|
775
|
+
body.isActive = opts.active === "true";
|
|
776
|
+
}
|
|
709
777
|
renderObject(await callThrottle(resolveAuth(g), `/api/v1/webhook-endpoints/${id}`, { method: "PATCH", body: JSON.stringify(body) }), { json: Boolean(g.json) });
|
|
710
778
|
});
|
|
711
779
|
ep.command("delete <id>").action(async (id, _o, cmd) => {
|
|
@@ -747,8 +815,8 @@ function register10(program2) {
|
|
|
747
815
|
const e = program2.command("events").description("Emitted events + catalog");
|
|
748
816
|
e.command("list").option("--type <t>").option("--limit <n>").option("--cursor <c>").action(async (opts, cmd) => {
|
|
749
817
|
const g = cmd.optsWithGlobals();
|
|
750
|
-
const data = await
|
|
751
|
-
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) });
|
|
818
|
+
const { data, pagination } = await callThrottleList(resolveAuth(g), "/api/v1/events" + qs({ type: opts.type, limit: opts.limit, cursor: opts.cursor }));
|
|
819
|
+
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 });
|
|
752
820
|
});
|
|
753
821
|
e.command("get <id>").action(async (id, _o, cmd) => {
|
|
754
822
|
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/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/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 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]) 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://docs.usethrottle.dev${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 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 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 } 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) {\n super({ code, message, statusCode });\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 async function callThrottle<T>(auth: AuthCtx, path: string, init: RequestInit = {}): Promise<T> {\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: { data?: T; error?: { code: string; message: string } } = {};\n try { body = text ? JSON.parse(text) : {}; } catch { /* non-JSON */ }\n if (!res.ok) {\n const code = body.error?.code ?? `http_${res.status}`;\n const message = body.error?.message ?? `Request failed (${res.status}): ${text.slice(0, 120)}`;\n throw new ThrottleApiError(code, message, res.status);\n }\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\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);\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';\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 m = key.match(/^(sk|pk)_(live|test)_/);\n const prefix = m ? m[0] : 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","import pc from 'picocolors';\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 }): void {\n if (opts.json) { printJson(rows); 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}\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 { renderObject } from '../lib/output.js';\n\nfunction modeFromKey(key: string): string {\n if (key.startsWith('sk_live_') || key.startsWith('pk_live_')) return 'live';\n if (key.startsWith('sk_test_') || key.startsWith('pk_test_')) return 'test';\n return 'unknown';\n}\n\n/** Reconstruct the stored key prefix (`sk_` + first 16 hex of the random part). */\nfunction storedPrefix(key: string): string {\n const hex = key.replace(/^(sk|pk)_(test|live)_/, '');\n return `${key.slice(0, 2)}_${hex.slice(0, 16)}`;\n}\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: modeFromKey(auth.apiKey),\n keyPrefix: storedPrefix(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, 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 Order { id: string; orderNumber?: string; status: string; paymentStatus?: string; total: number; currency: string; createdAt?: string }\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('-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, q: opts.query, limit: opts.limit, cursor: opts.cursor });\n const data = await callThrottle<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.status }, { header: 'PAYMENT', get: (o) => o.paymentStatus },\n { header: 'TOTAL', get: (o) => `${(o.total / 100).toFixed(2)} ${o.currency}` },\n ], { json: Boolean(g.json) });\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 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 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 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 } 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 = await callThrottle<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) });\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('--name <n>').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.name) body.firstName = opts.name;\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('--name <n>').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.name) body.firstName = opts.name;\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 } 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 = await callThrottle<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) });\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 s.command('change-plan <id>')\n .requiredOption('--amount <cents>').requiredOption('--interval <i>')\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 await confirmAction({ message: `Change plan on ${id} → ${opts.amount}/${opts.interval} (${opts.effective})?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { amount: Number(opts.amount), interval: opts.interval, effective: opts.effective };\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>')\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) body.isActive = opts.active === 'true';\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 { Command } from 'commander';\nimport { resolveAuth } from '../config/profiles.js';\nimport { callThrottle } 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 = await callThrottle<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) });\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","pc","headers","program","register","program","writeFileSync","register","program","writeFileSync","register","program","register","program","register","program","register","program","register","program","register","program","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","../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/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 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]) 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 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 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 } 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) {\n super({ code, message, statusCode });\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);\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);\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 Order { id: string; orderNumber?: string; status: string; displayStatus?: string; paymentStatus?: string; total: number; currency: string; createdAt?: string }\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('-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, 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 { 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('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('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 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 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 s.command('change-plan <id>')\n .requiredOption('--amount <cents>').requiredOption('--interval <i>')\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 await confirmAction({ message: `Change plan on ${id} → ${opts.amount}/${opts.interval} (${opts.effective})?`, yes: g.yes, json: g.json });\n const body: Record<string, unknown> = { amount: Number(opts.amount), interval: opts.interval, effective: opts.effective };\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 { 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":";;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAO9B,IAAM,MAAM,KAAK;AAAA,EACf,aAAa,cAAc,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAAC,GAAG,MAAM;AACjF;AAEO,IAAM,cAAsB,IAAI;;;ACZvC,IAAM,aAAa;AACnB,IAAM,QAAQ;AACd,IAAM,MAAM;AACZ,IAAM,OAAO;AAON,SAAS,YAAY,MAAmC;AAC7D,MAAI,QAAQ,IAAI,2BAA2B,IAAK;AAChD,MAAI,CAAC,QAAQ,OAAO,MAAO;AAC3B,QAAM,IAAI,MAAM,UAAU,IAAI,KAAK,OAAO,KAAK;AAC/C,UAAQ,OAAO;AAAA,IACb,GAAG,UAAU,GAAG,IAAI,kBAAa,KAAK,IAAI,GAAG,MAAM,IAAI,MAAM,IAAI,EAAE,0CAAuC,KAAK;AAAA;AAAA;AAAA,EACjH;AACF;;;ACjBA,OAAO,QAAQ;;;ACCf,IAAI,gBAAgB,cAAc,MAAM;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAYA,OAAM;AAChB,UAAMA,MAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,OAAOA,MAAK;AACjB,SAAK,aAAaA,MAAK;AACvB,SAAK,UAAUA,MAAK;AACpB,SAAK,OAAOA,MAAK;AACjB,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;AACA,SAAS,gBAAgB,OAAO;AAC9B,SAAO,iBAAiB;AAC1B;;;ACdO,IAAM,mBAAN,cAA+B,cAAc;AAAA,EAClD,YAAY,MAAc,SAAiB,YAAoB;AAC7D,UAAM,EAAE,MAAM,SAAS,WAAW,CAAC;AACnC,SAAK,OAAO;AAAA,EACd;AACF;AAGA,SAAS,IAAI,MAAe,MAAsB;AAChD,SAAO,GAAG,KAAK,WAAW,QAAQ,OAAO,EAAE,CAAC,GAAG,IAAI;AACrD;AACA,SAAS,QAAQ,MAAeC,OAA2C;AACzE,SAAO,EAAE,gBAAgB,oBAAoB,aAAa,KAAK,QAAQ,GAAIA,MAAK,WAAqC,CAAC,EAAG;AAC3H;AAIA,eAAe,YAAY,MAAe,MAAcA,OAAqD;AAK3G,QAAM,UAAUA,MAAK,UAAU,OAAO,YAAY;AAClD,MAAIA,MAAK,QAAQ,SAAS,WAAW,UAAU,WAAW,WAAW,WAAW,QAAQ;AACtF,IAAAA,QAAO,EAAE,GAAGA,OAAM,MAAM,KAAK;AAAA,EAC/B;AACA,QAAM,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,GAAG,EAAE,GAAGA,OAAM,SAAS,QAAQ,MAAMA,KAAI,EAAE,CAAC;AAClF,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,OAAgC,CAAC;AACrC,MAAI;AAAE,WAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,EAAG,QAAQ;AAAA,EAAiB;AACpE,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAM,KAAK;AACjB,UAAM,OAAO,KAAK,QAAQ,QAAQ,IAAI,MAAM;AAC5C,UAAM,UAAU,KAAK,WAAW,mBAAmB,IAAI,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC;AACrF,UAAM,IAAI,iBAAiB,MAAM,SAAS,IAAI,MAAM;AAAA,EACtD;AACA,SAAO;AACT;AAEA,eAAsB,aAAgB,MAAe,MAAcA,QAAoB,CAAC,GAAe;AACrG,QAAM,OAAO,MAAM,YAAY,MAAM,MAAMA,KAAI;AAG/C,SAAQ,QAAQ,OAAO,SAAS,YAAY,UAAU,OAAO,KAAK,OAAQ;AAC5E;AAGA,eAAsB,iBACpB,MAAe,MAAcA,QAAoB,CAAC,GACK;AACvD,QAAM,OAAO,MAAM,YAAY,MAAM,MAAMA,KAAI;AAC/C,QAAM,OAAQ,UAAU,OAAO,KAAK,OAAO;AAC3C,QAAM,OAAO,KAAK;AAClB,SAAO,EAAE,MAAM,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,GAAG,YAAY,MAAM,cAAc,KAAK;AACvF;AAEA,eAAsB,iBAAiB,MAAe,MAAcA,QAAoB,CAAC,GAAoB;AAC3G,QAAM,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,GAAG,EAAE,GAAGA,OAAM,SAAS,QAAQ,MAAMA,KAAI,EAAE,CAAC;AAClF,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,iBAAiB,QAAQ,IAAI,MAAM,IAAI,KAAK,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM;AAC5F,SAAO;AACT;;;AF9DA,IAAM,QAAgC;AAAA,EACpC,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,+BAA+B;AAAA,EAC/B,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,SAAS,YAAY,KAAsB;AAChD,MAAI,gBAAgB,GAAG,GAAG;AACxB,YAAQ,OAAO,MAAM,GAAG,IAAI,QAAG,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO;AAAA,CAAI;AACrE,UAAM,OAAO,MAAM,IAAI,IAAI;AAC3B,QAAI,KAAM,SAAQ,OAAO,MAAM,GAAG,IAAI,OAAO,IAAI,IAAI,IAAI;AACzD,WAAO;AAAA,EACT;AACA,QAAM,WAAW,OAAQ,KAAgC,aAAa,WAAY,IAA6B,WAAW;AAC1H,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAQ,OAAO,MAAM,GAAG,IAAI,QAAG,IAAI,MAAM,UAAU,IAAI;AACvD,SAAO;AACT;;;AGtBA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,SAAS,eAAe;AACjC,SAAS,iBAAAC,sBAAqB;AAC9B,YAAY,YAAY;AAMxB,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,YAAY,EAAE,QAAQ,cAAc,EAAE;AACnD;AAEA,IAAM,kBACJ;AAEF,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,oBACP,OACA,eACqC;AACrC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,cAAc,OAAO,QAAQ,KAAK,EAAE;AAAA,IACxC,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,IAAI,aAAa,GAAG,CAAC;AAAA,EACjD;AACA,SAAO,OAAO,YAAY,WAAW;AACvC;AAEA,SAAS,aAAa,OAAoC;AACxD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,MAAM,YAAY,CAAC;AAChE;AAEA,SAAS,wBAA4C;AACnD,MAAI;AACF,UAAM,kBAAkB,QAAQ,QAAQA,eAAc,YAAY,GAAG,CAAC,GAAG,iBAAiB;AAC1F,UAAM,cAAc,KAAK,MAAMD,cAAa,iBAAiB,MAAM,CAAC;AACpE,WAAO,YAAY,UAAU,oBAAoB,YAAY,OAAO,KAAK;AAAA,EAC3E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,MAAW,QAAQ,KAAc;AAClE,SAAO,aAAa,IAAI,sBAAsB,KAAK,aAAa,IAAI,2BAA2B;AACjG;AAEO,SAAS,oBAAqC,OAAa;AAChE,MAAI,MAAM,SAAS;AACjB,WAAO,MAAM,QAAQ;AACrB,WAAO,MAAM,QAAQ;AACrB,UAAM,QAAQ,UAAU;AAAA,MACtB,MAAM,QAAQ;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,oBAAoB,MAAM,OAAO,oBAAoB;AAAA,EACrE;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,IAAI,MAAM,KAAK,GAAG,IAAI;AAAA,EACvD;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,MAAW,QAAQ,KAAkB;AACzE,QAAM,UAAU,mBAAmB,GAAG;AAEtC,SAAO;AAAA,IACL,KAAK,UAAW,IAAI,2BAA2B,IAAI,cAAc,kBAAmB;AAAA,IACpF;AAAA,IACA,aAAa,IAAI,sBAAsB,IAAI,YAAY;AAAA,IACvD,SAAS,IAAI,kBAAkB,IAAI,wBAAwB,sBAAsB;AAAA,IACjF,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,YAAY;AAAA,EACd;AACF;AAEO,SAAS,cAAc,MAAW,QAAQ,KAAW;AAC1D,MAAI,CAAC,mBAAmB,GAAG,KAAY,qBAAc,EAAG;AAExD,EAAO,YAAK,sBAAsB,GAAG,CAAC;AACxC;AAEO,SAAS,oBAAoB,OAAsB;AACxD,MAAI,CAAQ,qBAAc,EAAG;AAC7B,EAAO,wBAAiB,KAAK;AAC/B;AAEA,eAAsB,eAAe,UAAU,KAAqB;AAClE,MAAI,CAAQ,qBAAc,EAAG;AAC7B,QAAa,aAAM,OAAO;AAC5B;;;ACrHA,SAAS,WAAW,gBAAAE,eAAc,eAAe,YAAY,iBAAiB;AAC9E,SAAS,eAAe;AACxB,SAAS,YAAY;;;ACKrB,IAAM,SAAS;AAQR,SAAS,YAAY,KAA+B;AACzD,QAAM,IAAI,OAAO,KAAK,GAAG;AACzB,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,EAAE,MAAM,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;AACvD;AAGO,SAAS,eAAe,KAAqB;AAClD,QAAM,SAAS,YAAY,GAAG;AAC9B,MAAI,CAAC,OAAQ,QAAO,IAAI,MAAM,GAAG,EAAE;AACnC,SAAO,GAAG,OAAO,IAAI,IAAI,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC;AACrD;AAGO,SAAS,OAAO,KAAqB;AAC1C,SAAO,YAAY,GAAG,GAAG,eAAe;AAC1C;;;ADvBA,IAAM,kBAAkB;AAEjB,IAAM,cAAN,cAA0B,MAAM;AAAA,EAAE,WAAW;AAAG;AAEvD,SAAS,OAAe;AAAE,SAAO,QAAQ,IAAI,wBAAwB,KAAK,QAAQ,GAAG,WAAW;AAAG;AAC5F,SAAS,aAAqB;AAAE,SAAO,KAAK,KAAK,GAAG,aAAa;AAAG;AAEpE,SAAS,aAAwB;AACtC,QAAM,IAAI,WAAW;AACrB,MAAI,CAAC,WAAW,CAAC,EAAG,QAAO,EAAE,UAAU,CAAC,EAAE;AAC1C,MAAI;AAAE,WAAO,KAAK,MAAMC,cAAa,GAAG,MAAM,CAAC;AAAA,EAAgB,QACzD;AAAE,UAAM,IAAI,YAAY,aAAa,CAAC,oBAAoB;AAAA,EAAG;AACrE;AAEO,SAAS,WAAW,KAAsB;AAC/C,YAAU,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AACrC,QAAM,IAAI,WAAW;AACrB,gBAAc,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AACrE,YAAU,GAAG,GAAK;AACpB;AAEO,SAAS,WAAW,MAAc,MAAqB;AAC5D,QAAM,MAAM,WAAW;AACvB,MAAI,SAAS,IAAI,IAAI;AACrB,MAAI,CAAC,IAAI,eAAgB,KAAI,iBAAiB;AAC9C,aAAW,GAAG;AAChB;AAEO,SAAS,WAAW,MAAoB;AAC7C,QAAM,MAAM,WAAW;AACvB,MAAI,CAAC,IAAI,SAAS,IAAI,EAAG,OAAM,IAAI,YAAY,qBAAqB,IAAI,GAAG;AAC3E,MAAI,iBAAiB;AACrB,aAAW,GAAG;AAChB;AAEO,SAAS,cAAc,MAAoB;AAChD,QAAM,MAAM,WAAW;AACvB,MAAI,CAAC,IAAI,SAAS,IAAI,EAAG,OAAM,IAAI,YAAY,qBAAqB,IAAI,GAAG;AAC3E,SAAO,IAAI,SAAS,IAAI;AACxB,MAAI,IAAI,mBAAmB,KAAM,KAAI,iBAAiB,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;AACjF,aAAW,GAAG;AAChB;AAEO,SAAS,QAAQ,KAAqB;AAC3C,MAAI,IAAI,UAAU,GAAI,QAAO;AAC7B,QAAM,SAAS,YAAY,GAAG;AAC9B,QAAM,SAAS,SAAS,GAAG,OAAO,IAAI,IAAI,OAAO,WAAW,MAAM,IAAI,MAAM,GAAG,CAAC;AAChF,SAAO,GAAG,MAAM,SAAI,IAAI,MAAM,EAAE,CAAC;AACnC;AAEO,SAAS,YAAY,SAAsG;AAChI,QAAM,MAAM,WAAW;AACvB,QAAM,WAAW,QAAQ,WAAW,IAAI;AACxC,QAAM,OAAO,WAAW,IAAI,SAAS,QAAQ,IAAI;AACjD,MAAI,QAAQ,WAAW,CAAC,KAAM,OAAM,IAAI,YAAY,qBAAqB,QAAQ,OAAO,GAAG;AAC3F,QAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,oBAAoB,MAAM;AACvE,MAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,mHAAmH;AACtJ,QAAM,aAAa,QAAQ,OAAO,QAAQ,IAAI,oBAAoB,MAAM,cAAc;AACtF,SAAO,EAAE,QAAQ,WAAW;AAC9B;;;AEnEA,OAAOC,SAAQ;AAKf,SAAS,KAAK,GAAoB;AAAE,SAAO,MAAM,QAAQ,MAAM,SAAY,KAAK,OAAO,CAAC;AAAG;AAEpF,SAAS,UAAU,MAAqB;AAC7C,UAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAC3D;AAEO,SAAS,WAAc,MAAW,SAAsB,MAA+D;AAG5H,MAAI,KAAK,MAAM;AAAE,cAAU,KAAK,eAAe,SAAY,OAAO,EAAE,MAAM,MAAM,YAAY,KAAK,WAAW,CAAC;AAAG;AAAA,EAAQ;AACxH,MAAI,KAAK,WAAW,GAAG;AAAE,YAAQ,OAAO,MAAMA,IAAG,IAAI,eAAe,CAAC;AAAG;AAAA,EAAQ;AAChF,QAAMC,WAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM;AAC3C,QAAM,OAAO,KAAK,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/D,QAAM,SAASA,SAAQ,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5F,QAAM,OAAO,CAAC,UAAoB,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,QAAQ;AAC9F,UAAQ,OAAO,MAAMD,IAAG,KAAK,KAAKC,QAAO,CAAC,IAAI,IAAI;AAClD,aAAW,OAAO,KAAM,SAAQ,OAAO,MAAM,KAAK,GAAG,IAAI,IAAI;AAC7D,MAAI,KAAK,YAAY,OAAQ,SAAQ,OAAO,MAAMD,IAAG,IAAI,2CAAsC,KAAK,WAAW,MAAM;AAAA,CAAI,CAAC;AAC5H;AAEO,SAAS,aAAa,KAAc,MAA+B;AACxE,MAAI,KAAK,MAAM;AAAE,cAAU,GAAG;AAAG;AAAA,EAAQ;AACzC,MAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAAE,YAAQ,OAAO,MAAM,KAAK,GAAG,IAAI,IAAI;AAAG;AAAA,EAAQ;AAC/F,QAAM,UAAU,OAAO,QAAQ,GAA8B;AAC7D,QAAM,IAAI,KAAK,IAAI,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;AACvD,aAAW,CAAC,GAAG,CAAC,KAAK,SAAS;AAC5B,UAAM,MAAM,MAAM,QAAQ,OAAO,MAAM,WAAW,KAAK,UAAU,CAAC,IAAI,KAAK,CAAC;AAC5E,YAAQ,OAAO,MAAM,GAAGA,IAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AAAA,CAAI;AAAA,EACzD;AACF;AAEO,SAAS,QAAQ,KAAmB;AAAE,UAAQ,OAAO,MAAMA,IAAG,MAAM,QAAG,IAAI,MAAM,MAAM,IAAI;AAAG;;;AChC9F,SAAS,SAASE,UAAwB;AAC/C,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,qDAAqD;AAE1G,SAAO,QAAQ,eAAe,EAC3B,YAAY,4BAA4B,EASxC,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,eAAe,gBAAgB,6BAA6B,EACnE,OAAO,kBAAkB,aAAa,EACtC,OAAO,CAAC,MAAM,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,QAAI,CAAC,EAAE,OAAQ,OAAM,IAAI,YAAY,iDAAmD;AACxF,eAAW,MAAM,EAAE,QAAQ,EAAE,QAAQ,YAAY,EAAE,KAAK,OAAO,KAAK,MAAM,CAAC;AAC3E,YAAQ,kBAAkB,IAAI,GAAG;AAAA,EACnC,CAAC;AAEH,SAAO,QAAQ,eAAe,EAAE,YAAY,yBAAyB,EAClE,OAAO,CAAC,SAAS;AAAE,eAAW,IAAI;AAAG,YAAQ,2BAA2B,IAAI,GAAG;AAAA,EAAG,CAAC;AAEtF,SAAO,QAAQ,kBAAkB,EAAE,YAAY,kBAAkB,EAC9D,OAAO,CAAC,SAAS;AAAE,kBAAc,IAAI;AAAG,YAAQ,oBAAoB,IAAI,GAAG;AAAA,EAAG,CAAC;AAElF,SAAO,QAAQ,MAAM,EAAE,YAAY,6BAA6B,EAI7D,OAAO,UAAU,aAAa,EAC9B,OAAO,CAAC,MAAM,QAAiB;AAC9B,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,MAAM,WAAW;AACvB,UAAM,OAAO,OAAO,QAAQ,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;AAAA,MAC5D;AAAA,MAAM,SAAS,SAAS,IAAI,iBAAiB,MAAM;AAAA,MAAI,YAAY,EAAE;AAAA,MAAY,QAAQ,QAAQ,EAAE,MAAM;AAAA,MAAG,OAAO,EAAE,SAAS;AAAA,IAChI,EAAE;AACF,eAAW,MAAM;AAAA,MACf,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,MAAG,EAAE,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ;AAAA,MACnF,EAAE,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW;AAAA,MAAG,EAAE,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,MAAG,EAAE,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM;AAAA,IAC/H,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC9B,CAAC;AACL;;;AClCO,SAASC,UAASC,UAAwB;AAC/C,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,4DAA4D,EACxE,OAAO,OAAO,OAAO,QAAiB;AACrC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,YAAY,CAAC;AAC1B,UAAM,OAAgC;AAAA,MACpC,YAAY,KAAK;AAAA,MACjB,MAAM,OAAO,KAAK,MAAM;AAAA,MACxB,WAAW,eAAe,KAAK,MAAM;AAAA,IACvC;AAIA,QAAI;AACF,YAAM,OAAO,MAAM,aAA0B,MAAM,kBAAkB;AACrE,YAAM,QAAQ,KAAK,CAAC;AACpB,UAAI,OAAO;AACT,aAAK,gBAAgB,MAAM;AAC3B,aAAK,gBAAgB,MAAM;AAC3B,YAAI,MAAM,gBAAiB,MAAK,cAAc,MAAM;AACpD,YAAI,MAAM,gBAAiB,MAAK,kBAAkB,MAAM;AAAA,MAC1D;AACA,YAAM,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE,cAAc,KAAK,SAAS;AAC5D,WAAK,SAAS,OAAO,KAAK,SAAS;AACnC,WAAK,gBAAgB;AAAA,IACvB,SAAS,KAAK;AACZ,UAAI,CAAC,gBAAgB,GAAG,EAAG,OAAM;AAKjC,WAAK,gBAAgB,IAAI,eAAe,MAAM,QAAQ;AACtD,UAAI,IAAI,eAAe,KAAK;AAC1B,aAAK,OAAO,0DAA0D,IAAI,IAAI;AAAA,MAChF;AAAA,IACF;AACA,iBAAa,MAAM,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC9C,CAAC;AACL;;;ACvDA,SAAS,iBAAAC,sBAAqB;;;ACA9B,OAAO,aAAa;AAEb,IAAM,eAAN,cAA2B,MAAM;AAAA,EAAE;AAAA,EAAkB,YAAY,GAAW,OAAO,GAAG;AAAE,UAAM,CAAC;AAAG,SAAK,WAAW;AAAA,EAAM;AAAE;AAEjI,eAAsB,cAAc,MAAyE;AAC3G,MAAI,KAAK,IAAK;AACd,MAAI,KAAK,QAAQ,CAAC,QAAQ,MAAM,OAAO;AACrC,UAAM,IAAI,aAAa,mFAAmF,CAAC;AAAA,EAC7G;AACA,QAAM,MAAM,MAAM,QAAQ,EAAE,MAAM,WAAW,MAAM,MAAM,SAAS,KAAK,SAAS,SAAS,MAAM,GAAG,EAAE,UAAU,MAAM;AAAE,UAAM,IAAI,aAAa,YAAY,CAAC;AAAA,EAAG,EAAE,CAAC;AAChK,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,aAAa,YAAY,CAAC;AACnD;;;ACLA,IAAM,OAAO,CAAC,YAAoB,kBAAkB,OAAO;AAEpD,SAAS,qBAAqB,QAAuB;AAC1D,QAAM,IAAI,OAAO,QAAQ,cAAc,EAAE,YAAY,oBAAoB;AAEzE,IAAE,QAAQ,gBAAgB,EAAE,OAAO,OAAO,SAAS,IAAI,QAAiB;AACtE,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,MAAM,aAAoB,YAAY,CAAC,GAAG,KAAK,OAAO,CAAC;AACpE,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACtK,CAAC;AAED,IAAE,QAAQ,oBAAoB,EAAE,OAAO,OAAO,SAAS,IAAI,IAAI,QAAiB;AAC9E,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACtG,CAAC;AAED,IAAE,QAAQ,kBAAkB,EAAE,OAAO,kBAAkB,qBAAqB,EAAE,OAAO,OAAO,SAAS,MAAM,QAAiB;AAC1H,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,2BAA2B,OAAO,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAChG,UAAM,OAAO,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC;AAC/D,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,KAAK,OAAO,GAAG,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC3I,CAAC;AAED,QAAM,aAAa,CAAC,MAAc,MAAc,QAAgB,QAC9D,EAAE,QAAQ,GAAG,IAAI,iBAAiB,EAAE,OAAO,OAAO,SAAS,IAAI,IAAI,QAAiB;AAClF,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,IAAI,SAAS,EAAE,GAAG,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAC3E,UAAM,IAAI,MAAM,aAAa,YAAY,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,QAAQ,KAAK,CAAC;AACjG,MAAE,OAAO,aAAa,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,eAAe,EAAE,WAAM,IAAI,EAAE;AAAA,EAClF,CAAC;AACH,aAAW,cAAc,QAAQ,cAAc,CAAC,GAAG,MAAM,oBAAoB,CAAC,cAAc;AAC5F,aAAW,YAAY,QAAQ,YAAY,CAAC,GAAG,MAAM,wBAAwB,CAAC,GAAG;AACjF,aAAW,UAAU,QAAQ,UAAU,CAAC,GAAG,MAAM,sBAAsB,CAAC,GAAG;AAE3E,IAAE,QAAQ,qBAAqB,EAC5B,eAAe,eAAe,EAAE,eAAe,gBAAgB,EAC/D,OAAO,OAAO,SAAS,IAAI,MAAM,QAAiB;AACjD,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,oBAAoB,EAAE,aAAa,KAAK,OAAO,IAAI,KAAK,QAAQ,MAAM,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAC/H,UAAM,IAAI,MAAM,aAAa,YAAY,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,SAAS,MAAM,KAAK,UAAU,EAAE,SAAS,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,EAAE,CAAC;AACnL,MAAE,OAAO,aAAa,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,eAAe,EAAE,UAAU;AAAA,EAChF,CAAC;AACL;;;AC3CO,SAAS,GAAG,QAAoD;AACrE,QAAM,IAAI,IAAI,gBAAgB;AAC9B,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,EAAG,KAAI,MAAM,OAAW,GAAE,IAAI,GAAG,CAAC;AAC5E,QAAM,MAAM,EAAE,SAAS;AACvB,SAAO,MAAM,IAAI,GAAG,KAAK;AAC3B;;;AHCO,SAASC,UAASC,UAAwB;AAC/C,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,uBAAuB;AAE5E,SAAO,QAAQ,MAAM,EAClB,YAAY,aAAa,EACzB,OAAO,cAAc,EAAE,OAAO,sBAAsB,EAAE,OAAO,YAAY,EAAE,OAAO,cAAc,EAChG,OAAO,oBAAoB,EAAE,OAAO,aAAa,EAAE,OAAO,cAAc,EACxE,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,YAAY,CAAC;AAC1B,UAAM,OAAO,mBAAmB,GAAG,EAAE,QAAQ,KAAK,QAAQ,eAAe,KAAK,eAAe,MAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AAC1L,UAAM,EAAE,MAAM,WAAW,IAAI,MAAM,iBAAwB,MAAM,IAAI;AACrE,eAAW,MAAM;AAAA,MACf,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG;AAAA,MAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY;AAAA,MAClF,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO;AAAA,MAC5D,EAAE,QAAQ,SAAS,KAAK,CAAC,MAAM,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG;AAAA,IAC/E,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,GAAG,WAAW,CAAC;AAAA,EAC1C,CAAC;AAEH,SAAO,QAAQ,UAAU,EAAE,YAAY,eAAe,EACnD,OAAO,OAAO,IAAI,IAAI,QAAiB;AACtC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,kBAAkB,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACpG,CAAC;AAEH,SAAO,QAAQ,aAAa,EAAE,YAAY,iBAAiB,EACxD,OAAO,OAAO,IAAI,IAAI,QAAiB;AACtC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,gBAAgB,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAChF,UAAM,IAAI,MAAM,aAAa,YAAY,CAAC,GAAG,kBAAkB,EAAE,WAAW,EAAE,QAAQ,OAAO,CAAC;AAC9F,MAAE,OAAO,aAAa,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,SAAS,EAAE,YAAY;AAAA,EAC5E,CAAC;AAEH,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,QAAQ,sBAAsB,EAClC,YAAY,wBAAwB,eAAe,KAAK,KAAK,CAAC,8BAA8B,EAC5F,OAAO,mBAAmB,yCAAyC,EACnE,OAAO,OAAO,IAAI,QAAQ,MAAM,QAAiB;AAChD,UAAM,IAAI,IAAI,gBAAgB;AAC9B,QAAI,CAAC,eAAe,SAAS,MAAM,GAAG;AACpC,YAAM,IAAI,MAAM,mBAAmB,MAAM,uBAAuB,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7F;AACA,UAAM,cAAc,EAAE,SAAS,aAAa,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAC1F,UAAM,OAAgC,EAAE,OAAO;AAC/C,QAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC;AAAA,MACE,MAAM,aAAa,YAAY,CAAC,GAAG,kBAAkB,EAAE,WAAW;AAAA,QAChE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B,CAAC;AAAA,MACD,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE;AAAA,IAC1B;AAAA,EACF,CAAC;AAEH,SAAO,QAAQ,cAAc,EAAE,YAAY,gCAAiC,EACzE,OAAO,OAAO,IAAI,IAAI,QAAiB;AACtC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,IAAI,MAAM,aAAa,YAAY,CAAC,GAAG,kBAAkB,EAAE,iBAAiB;AAClF,UAAM,OAAQ,GAAW,QAAQ;AACjC,eAAW,MAAM;AAAA,MACf,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAW,EAAE,UAAU;AAAA,MAC/C,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAW,EAAE,cAAc,SAAI;AAAA,MACvD,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAW,EAAE,SAAS;AAAA,MAC5C,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAW,EAAE,UAAU;AAAA,MAC7C,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAW,EAAE,OAAO;AAAA,MAC9C,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAW,EAAE,UAAU,GAAG;AAAA,IACtD,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC9B,CAAC;AAEH,SAAO,QAAQ,QAAQ,EACpB,YAAY,yCAAyC,EACrD,OAAO,cAAc,EAAE,OAAO,sBAAsB,EAAE,OAAO,YAAY,EAAE,OAAO,cAAc,EAChG,OAAO,oBAAoB,iCAAiC,EAC5D,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,8BAA8B,GAAG,EAAE,QAAQ,KAAK,QAAQ,eAAe,KAAK,eAAe,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAO,CAAC;AAC9I,UAAM,MAAM,MAAM,iBAAiB,YAAY,CAAC,GAAG,IAAI;AACvD,QAAI,KAAK,KAAK;AAAE,MAAAC,eAAc,KAAK,KAAK,GAAG;AAAG,cAAQ,SAAS,KAAK,GAAG,EAAE;AAAA,IAAG,MAAO,SAAQ,OAAO,MAAM,GAAG;AAAA,EAC7G,CAAC;AAEH,SAAO,QAAQ,iBAAiB,EAC7B,YAAY,mEAAmE,EAC/E,OAAO,gBAAgB,+CAA+C,EACtE,OAAO,mBAAmB,uDAAuD,EACjF,OAAO,kBAAkB,+BAA+B,EACxD,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,IAAK,MAAK,MAAM,KAAK,MAAM,KAAK,GAAG;AAC5C,QAAI,KAAK,OAAQ,MAAK,SAAS,KAAK,MAAM,KAAK,MAAM;AACrD,QAAI,KAAK,OAAQ,MAAK,SAAS,OAAO,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACjF,UAAM,cAAc,EAAE,SAAS,sBAAsB,EAAE,mCAAmC,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACpH,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,kBAAkB,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAChK,CAAC;AAEH,uBAAqB,MAAM;AAC7B;;;AI9GO,SAASC,UAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,SAAS,EAAE,YAAY,6CAAwC;AAEzF,IAAE,QAAQ,MAAM,EAAE,eAAe,mBAAmB,EAAE,OAAO,OAAO,MAAM,QAAiB;AACzF,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,MAAM,aAAoB,YAAY,CAAC,GAAG,kBAAkB,KAAK,KAAK,UAAU;AAC7F,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAChL,CAAC;AAED,IAAE,QAAQ,MAAM,EAAE,eAAe,mBAAmB,EAAE,eAAe,kBAAkB,sCAAsC,EAC1H,OAAO,cAAc,EAAE,OAAO,WAAW,EACzC,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,0BAA0B,KAAK,KAAK,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAClG,UAAM,OAAO,EAAE,OAAO,KAAK,MAAM,KAAK,KAAK,GAAG,QAAQ,KAAK,QAAQ,SAAS,QAAQ,KAAK,OAAO,EAAE;AAClG,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,kBAAkB,KAAK,KAAK,YAAY,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACpK,CAAC;AAEH,IAAE,QAAQ,UAAU,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC3D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,mBAAmB,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACrG,CAAC;AAED,IAAE,QAAQ,iBAAiB,EAAE,eAAe,gBAAgB,wCAAwC,EACjG,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,qBAAqB,EAAE,WAAM,KAAK,MAAM,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACtG,UAAM,MAAM,MAAM,aAAa,YAAY,CAAC,GAAG,mBAAmB,EAAE,eAAe,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;AACpJ,MAAE,OAAO,aAAa,KAAK,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,UAAU,EAAE,WAAM,KAAK,MAAM,EAAE;AAAA,EACtF,CAAC;AAEH,IAAE,QAAQ,eAAe,EAAE,eAAe,kBAAkB,iCAAiC,EAC1F,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,mBAAmB,EAAE,kDAAkD,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAChI,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,mBAAmB,EAAE,aAAa,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,MAAM,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC3L,CAAC;AACL;;;ACrCO,SAASC,UAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,UAAU,EAAE,YAAY,2CAA2C;AAE7F,IAAE,QAAQ,UAAU,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC3D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,oBAAoB,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACtG,CAAC;AAED,IAAE,QAAQ,aAAa,EAAE,OAAO,oBAAoB,uCAAuC,EAAE,OAAO,cAAc,EAC/G,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,UAAU,KAAK,SAAS,KAAK,SAAS,iBAAiB,kBAAkB,eAAe,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACxJ,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,OAAQ,MAAK,SAAS,OAAO,KAAK,MAAM;AACjD,QAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,oBAAoB,EAAE,WAAW,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC7J,CAAC;AAEH,IAAE,QAAQ,cAAc,EAAE,OAAO,oBAAoB,8CAA8C,EAChG,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,WAAW,KAAK,SAAS,KAAK,SAAS,iBAAiB,4BAA4B,eAAe,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACnK,UAAM,OAAO,KAAK,SAAS,EAAE,QAAQ,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC;AAC9D,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,oBAAoB,EAAE,YAAY,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC9J,CAAC;AAEH,IAAE,QAAQ,qBAAqB,EAAE,YAAY,yCAAyC,EACnF,OAAO,OAAO,IAAI,IAAI,QAAiB;AACtC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,IAAI,MAAM,aAAa,YAAY,CAAC,GAAG,oBAAoB,EAAE,mBAAmB,EAAE,QAAQ,OAAO,CAAC;AACxG,MAAE,OAAO,aAAa,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,8BAA8B,EAAE,EAAE;AAAA,EACvF,CAAC;AACL;;;AC/BO,SAASC,UAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,WAAW,EAAE,YAAY,WAAW;AAE9D,IAAE,QAAQ,MAAM,EAAE,OAAO,oBAAoB,EAAE,OAAO,aAAa,EAAE,OAAO,cAAc,EACvF,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,EAAE,MAAM,WAAW,IAAI,MAAM,iBAAsB,YAAY,CAAC,GAAG,sBAAsB,GAAG,EAAE,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC;AAC5J,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,QAAQ,YAAY,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,GAAG,WAAW,CAAC;AAAA,EAC/Q,CAAC;AAEH,IAAE,QAAQ,UAAU,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC3D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACvG,CAAC;AAED,IAAE,QAAQ,QAAQ,EAAE,eAAe,aAAa,EAAE,OAAO,kBAAkB,EAAE,OAAO,iBAAiB,EAClG,OAAO,cAAc,wBAAwB,EAAE,OAAO,mBAAmB,EACzE,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAgC,EAAE,OAAO,KAAK,MAAM;AAC1D,QAAI,KAAK,aAAa,KAAK,KAAM,MAAK,YAAY,KAAK,aAAa,KAAK;AACzE,QAAI,KAAK,SAAU,MAAK,WAAW,KAAK;AACxC,QAAI,KAAK,WAAY,MAAK,aAAa,KAAK;AAC5C,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACjJ,CAAC;AAEH,IAAE,QAAQ,aAAa,EAAE,OAAO,aAAa,EAAE,OAAO,kBAAkB,EAAE,OAAO,iBAAiB,EAC/F,OAAO,cAAc,wBAAwB,EAAE,OAAO,mBAAmB,EACzE,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,QAAI,KAAK,aAAa,KAAK,KAAM,MAAK,YAAY,KAAK,aAAa,KAAK;AACzE,QAAI,KAAK,SAAU,MAAK,WAAW,KAAK;AACxC,QAAI,KAAK,eAAe,OAAW,MAAK,aAAa,KAAK;AAC1D,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,IAAI,EAAE,QAAQ,SAAS,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACxJ,CAAC;AAEH,QAAM,OAAO,EAAE,QAAQ,WAAW,EAAE,YAAY,oBAAoB;AACpE,OAAK,QAAQ,WAAW,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC/D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,MAAM,aAAoB,YAAY,CAAC,GAAG,qBAAqB,EAAE,YAAY;AAC1F,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAClN,CAAC;AACD,OAAK,QAAQ,UAAU,EAAE,eAAe,sBAAsB,cAAc,EAAE,OAAO,OAAO,IAAI,MAAM,QAAiB;AACrH,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,cAAc,EAAE,QAAQ,QAAQ,MAAM,KAAK,SAAS,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC1J,CAAC;AACD,OAAK,QAAQ,sBAAsB,EAAE,eAAe,sBAAsB,cAAc,EAAE,OAAO,OAAO,IAAI,QAAQ,MAAM,QAAiB;AACzI,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,cAAc,MAAM,IAAI,EAAE,QAAQ,SAAS,MAAM,KAAK,SAAS,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACrK,CAAC;AACD,OAAK,QAAQ,sBAAsB,EAAE,OAAO,OAAO,IAAI,QAAQ,IAAI,QAAiB;AAClF,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,kBAAkB,MAAM,gBAAgB,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACxG,UAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,cAAc,MAAM,IAAI,EAAE,QAAQ,SAAS,CAAC;AACtG,YAAQ,WAAW,MAAM,UAAU;AAAA,EACrC,CAAC;AACH;;;AC1DO,SAASC,UAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,eAAe,EAAE,YAAY,eAAe;AAEtE,IAAE,QAAQ,MAAM,EAAE,OAAO,iBAAiB,EAAE,OAAO,aAAa,EAAE,OAAO,cAAc,EACpF,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,EAAE,MAAM,WAAW,IAAI,MAAM,iBAAsB,YAAY,CAAC,GAAG,0BAA0B,GAAG,EAAE,YAAY,KAAK,UAAU,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC;AAC5K,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,GAAG,WAAW,CAAC;AAAA,EAC3S,CAAC;AAEH,IAAE,QAAQ,UAAU,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC3D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,yBAAyB,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC3G,CAAC;AAED,IAAE,QAAQ,aAAa,EAAE,OAAO,mBAAmB,8CAA8C,EAC9F,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,uBAAuB,EAAE,GAAG,KAAK,cAAc,mBAAmB,MAAM,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACtI,UAAM,MAAM,MAAM,aAAa,YAAY,CAAC,GAAG,yBAAyB,EAAE,WAAW,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,aAAa,QAAQ,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC;AACzK,MAAE,OAAO,aAAa,KAAK,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,gBAAgB,EAAE,YAAY;AAAA,EACrF,CAAC;AAEH,aAAW,QAAQ,CAAC,SAAS,QAAQ,GAAY;AAC/C,MAAE,QAAQ,GAAG,IAAI,OAAO,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC/D,YAAM,IAAI,IAAI,gBAAgB;AAC9B,YAAM,cAAc,EAAE,SAAS,GAAG,KAAK,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,iBAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACzH,YAAM,MAAM,MAAM,aAAa,YAAY,CAAC,GAAG,yBAAyB,EAAE,IAAI,IAAI,IAAI,EAAE,QAAQ,OAAO,CAAC;AACxG,QAAE,OAAO,aAAa,KAAK,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,gBAAgB,EAAE,IAAI,IAAI,GAAG;AAAA,IACpF,CAAC;AAAA,EACH;AAEA,IAAE,QAAQ,kBAAkB,EACzB,eAAe,kBAAkB,EAAE,eAAe,gBAAgB,EAClE,OAAO,sBAAsB,EAAE,OAAO,iBAAiB,EAAE,OAAO,mBAAmB,kBAAkB,KAAK,EAC1G,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,kBAAkB,EAAE,WAAM,KAAK,MAAM,IAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,MAAM,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACxI,UAAM,OAAgC,EAAE,QAAQ,OAAO,KAAK,MAAM,GAAG,UAAU,KAAK,UAAU,WAAW,KAAK,UAAU;AACxH,QAAI,KAAK,cAAe,MAAK,gBAAgB,KAAK;AAClD,QAAI,KAAK,SAAU,MAAK,WAAW,KAAK;AACxC,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACvK,CAAC;AAEH,IAAE,QAAQ,4BAA4B,EAAE,YAAY,gCAAgC,EACjF,OAAO,OAAO,IAAI,IAAI,QAAiB;AACtC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,aAAa,YAAY,CAAC,GAAG,yBAAyB,EAAE,mBAAmB,EAAE,QAAQ,SAAS,CAAC;AACrG,YAAQ,6BAA6B,EAAE,EAAE;AAAA,EAC3C,CAAC;AACL;;;ACnDO,SAASC,UAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,WAAW,EAAE,YAAY,gBAAgB;AAEnE,IAAE,QAAQ,MAAM,EAAE,OAAO,OAAO,IAAI,QAAiB;AACnD,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,MAAM,aAAoB,YAAY,CAAC,GAAG,mBAAmB;AAC1E,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACxP,CAAC;AAED,IAAE,QAAQ,QAAQ,EAAE,eAAe,sBAAsB,2CAAsC,EAC5F,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,QAAQ,QAAQ,MAAM,KAAK,SAAS,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC1I,CAAC;AAEH,IAAE,QAAQ,aAAa,EAAE,OAAO,YAAY,QAAQ,EAAE,OAAO,cAAc,SAAS,EACjF,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,QAAI,QAAQ,KAAK,MAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAE,YAAM,IAAI,IAAI,MAAM,4CAA4C;AAAG,MAAC,EAAU,WAAW;AAAG,YAAM;AAAA,IAAG;AAC5J,UAAM,SAAS,QAAQ,KAAK,MAAM;AAClC,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,IAAI,EAAE,QAAQ,SAAS,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAC9J,CAAC;AAEH,IAAE,QAAQ,aAAa,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC9D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,mBAAmB,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACnF,UAAM,aAAa,YAAY,CAAC,GAAG,qBAAqB,EAAE,IAAI,EAAE,QAAQ,SAAS,CAAC;AAClF,YAAQ,YAAY,EAAE,UAAU;AAAA,EAClC,CAAC;AACH;;;AC5BO,SAASC,UAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,UAAU,EAAE,YAAY,gCAAgC;AAElF,QAAM,KAAK,EAAE,QAAQ,WAAW,EAAE,YAAY,kBAAkB;AAChE,KAAG,QAAQ,MAAM,EAAE,OAAO,OAAO,IAAI,QAAiB;AACpD,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,MAAM,aAAoB,YAAY,CAAC,GAAG,2BAA2B;AAClF,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACxO,CAAC;AACD,KAAG,QAAQ,QAAQ,EAAE,eAAe,WAAW,EAAE,eAAe,mBAAmB,6BAA6B,EAC7G,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,EAAE,KAAK,KAAK,KAAK,eAAe,OAAO,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE;AACzG,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,6BAA6B,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACzJ,CAAC;AACH,KAAG,QAAQ,aAAa,EAAE,OAAO,WAAW,EAAE,OAAO,iBAAiB,EAAE,OAAO,mBAAmB,mBAAmB,EAClH,OAAO,OAAO,IAAI,MAAM,QAAiB;AACxC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,IAAK,MAAK,MAAM,KAAK;AAC9B,QAAI,KAAK,OAAQ,MAAK,gBAAgB,OAAO,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAChG,QAAI,KAAK,WAAW,QAAW;AAC7B,UAAI,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AAAE,cAAM,IAAI,IAAI,MAAM,4CAA4C,KAAK,MAAM,IAAI;AAAG,QAAC,EAAU,WAAW;AAAG,cAAM;AAAA,MAAG;AAC7K,WAAK,WAAW,KAAK,WAAW;AAAA,IAClC;AACA,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,6BAA6B,EAAE,IAAI,EAAE,QAAQ,SAAS,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAChK,CAAC;AACH,KAAG,QAAQ,aAAa,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC/D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,2BAA2B,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAC3F,UAAM,aAAa,YAAY,CAAC,GAAG,6BAA6B,EAAE,IAAI,EAAE,QAAQ,SAAS,CAAC;AAC1F,YAAQ,YAAY,EAAE,UAAU;AAAA,EAClC,CAAC;AACD,KAAG,QAAQ,gBAAgB,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAClE,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,IAAI,MAAM,aAAa,YAAY,CAAC,GAAG,6BAA6B,EAAE,SAAS,EAAE,QAAQ,OAAO,CAAC;AACvG,MAAE,OAAO,aAAa,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,wBAAwB,EAAE,EAAE;AAAA,EACjF,CAAC;AACD,KAAG,QAAQ,oBAAoB,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AACtE,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,iCAAiC,EAAE,mCAAmC,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AAC/H,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,6BAA6B,EAAE,kBAAkB,EAAE,QAAQ,OAAO,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACjJ,CAAC;AAED,QAAM,MAAM,EAAE,QAAQ,YAAY,EAAE,YAAY,6BAA6B;AAC7E,MAAI,QAAQ,MAAM,EAAE,OAAO,iBAAiB,EAAE,OAAO,cAAc,EAChE,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,MAAM,aAAoB,YAAY,CAAC,GAAG,+BAA+B,GAAG,EAAE,YAAY,KAAK,UAAU,QAAQ,KAAK,OAAO,CAAC,CAAC;AAC5I,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,QAAQ,YAAY,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAChO,CAAC;AACH,MAAI,QAAQ,UAAU,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC7D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,8BAA8B,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EAChH,CAAC;AACD,MAAI,QAAQ,aAAa,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAChE,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,cAAc,EAAE,SAAS,mBAAmB,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;AACnF,UAAM,IAAI,MAAM,aAAa,YAAY,CAAC,GAAG,8BAA8B,EAAE,WAAW,EAAE,QAAQ,OAAO,CAAC;AAC1G,MAAE,OAAO,aAAa,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,QAAQ,YAAY,EAAE,WAAW;AAAA,EAC9E,CAAC;AACH;;;AC9DO,SAASC,WAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,0BAA0B;AAE1E,IAAE,QAAQ,MAAM,EAAE,OAAO,YAAY,EAAE,OAAO,aAAa,EAAE,OAAO,cAAc,EAC/E,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,EAAE,MAAM,WAAW,IAAI,MAAM,iBAAsB,YAAY,CAAC,GAAG,mBAAmB,GAAG,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC;AAC3J,eAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,EAAE,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,GAAG,WAAW,CAAC;AAAA,EACpO,CAAC;AAEH,IAAE,QAAQ,UAAU,EAAE,OAAO,OAAO,IAAI,IAAI,QAAiB;AAC3D,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,kBAAkB,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACpG,CAAC;AAED,IAAE,QAAQ,OAAO,EAAE,YAAY,6BAA6B,EAAE,OAAO,OAAO,IAAI,QAAiB;AAC/F,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAO,MAAM,aAAoB,YAAY,CAAC,GAAG,qBAAqB;AAC5E,eAAW,MAAM,CAAC,EAAE,QAAQ,QAAQ,KAAK,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,KAAM,GAAG,EAAE,QAAQ,SAAS,KAAK,CAAC,MAAO,OAAO,MAAM,WAAW,KAAK,EAAE,UAAW,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACjM,CAAC;AACH;;;ACrBO,SAASC,WAASC,UAAwB;AAC/C,QAAM,IAAIA,SAAQ,QAAQ,OAAO,EAAE,YAAY,4BAA4B;AAE3E,IAAE,QAAQ,MAAM,EAAE,OAAO,OAAO,IAAI,QAAiB;AACnD,UAAM,IAAI,IAAI,gBAAgB;AAC9B,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,sBAAsB,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACpG,CAAC;AAED,IAAE,QAAQ,KAAK,EACZ,OAAO,mBAAmB,gCAAgC,EAC1D,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,cAAc,EAAE,OAAO,wBAAwB,EACtD,OAAO,OAAO,MAAM,QAAiB;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,QAAS,MAAK,iBAAiB,OAAO,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACnH,QAAI,KAAK,QAAS,MAAK,eAAe,KAAK;AAC3C,QAAI,KAAK,KAAM,MAAK,UAAU,KAAK;AACnC,QAAI,KAAK,aAAc,MAAK,eAAe,KAAK;AAChD,QAAI,OAAO,KAAK,IAAI,EAAE,WAAW,GAAG;AAAE,YAAM,MAAM,IAAI,MAAM,oEAAoE;AAAG,MAAC,IAAY,WAAW;AAAG,YAAM;AAAA,IAAK;AACzK,iBAAa,MAAM,aAAa,YAAY,CAAC,GAAG,wBAAwB,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,EACnJ,CAAC;AACL;;;AvBVA,cAAc;AAEd,IAAM,UAAU,IAAI,QAAQ;AAC5B,QACG,KAAK,UAAU,EACf,YAAY,4BAA4B,EACxC,QAAQ,aAAa,iBAAiB,uBAAuB,EAC7D,OAAO,UAAU,wDAAwD,EACzE,OAAO,eAAe,qBAAqB,EAC3C,OAAO,oBAAoB,uBAAuB,EAClD,OAAO,mBAAmB,iDAAiD,EAC3E,OAAO,eAAe,sDAAsD,EAC5E,OAAO,aAAa,2BAA2B;AAElD,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,aAAa,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,SAAS,KACvF,KAAK,WAAW,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,WAAW;AAC5H,IAAI,CAAC,WAAY,aAAY,EAAE,SAAS,YAAY,CAAC;AAErD,WAAW,OAAO,CAAC,UAAgBC,WAAgBA,WAAgBA,WAAiBA,WAAkBA,WAAmBA,WAAuBA,WAAmBA,WAAkBA,YAAgBA,UAAa,EAAG,KAAI,OAAO;AAEhO,QAAQ,WAAW,EAAE,MAAM,OAAO,QAAQ;AACxC,QAAM,OAAO,YAAY,GAAG;AAC5B,sBAAoB,GAAG;AACvB,QAAM,eAAe;AACrB,UAAQ,KAAK,IAAI;AACnB,CAAC;","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","register","program","register","program","register"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usethrottle/cli",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.2.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": {
|
|
@@ -10,12 +10,6 @@
|
|
|
10
10
|
"dist",
|
|
11
11
|
"README.md"
|
|
12
12
|
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsup",
|
|
15
|
-
"dev": "tsup --watch",
|
|
16
|
-
"test": "vitest run",
|
|
17
|
-
"test:watch": "vitest"
|
|
18
|
-
},
|
|
19
13
|
"dependencies": {
|
|
20
14
|
"@sentry/node": "^10.53.1",
|
|
21
15
|
"commander": "^12.1.0",
|
|
@@ -25,16 +19,22 @@
|
|
|
25
19
|
"devDependencies": {
|
|
26
20
|
"@types/node": "^20.0.0",
|
|
27
21
|
"@types/prompts": "^2.4.0",
|
|
28
|
-
"@usethrottle/api-client": "workspace:^",
|
|
29
|
-
"@usethrottle/errors": "workspace:^",
|
|
30
22
|
"tsup": "^8.0.0",
|
|
31
23
|
"typescript": "^5.7.0",
|
|
32
|
-
"vitest": "^2.1.9"
|
|
24
|
+
"vitest": "^2.1.9",
|
|
25
|
+
"@usethrottle/api-client": "^3.0.0",
|
|
26
|
+
"@usethrottle/errors": "^1.0.0"
|
|
33
27
|
},
|
|
34
28
|
"publishConfig": {
|
|
35
29
|
"access": "public"
|
|
36
30
|
},
|
|
37
31
|
"engines": {
|
|
38
32
|
"node": ">=20"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"dev": "tsup --watch",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"test:watch": "vitest"
|
|
39
39
|
}
|
|
40
|
-
}
|
|
40
|
+
}
|