@nuno1026/bithumb-cli 0.1.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.
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/formatter.ts
4
+ var impl = {
5
+ out: (msg) => process.stdout.write(msg),
6
+ err: (msg) => process.stderr.write(msg)
7
+ };
8
+ function outputLine(message) {
9
+ impl.out(message + "\n");
10
+ }
11
+ function errorLine(message) {
12
+ impl.err(message + "\n");
13
+ }
14
+ function printJson(data) {
15
+ outputLine(JSON.stringify(data, null, 2));
16
+ }
17
+ function printTable(rows) {
18
+ if (rows.length === 0) {
19
+ outputLine("No data");
20
+ return;
21
+ }
22
+ const keys = Object.keys(rows[0]);
23
+ const toStr = (v) => {
24
+ if (v === null || v === void 0) return "";
25
+ if (typeof v === "object") return JSON.stringify(v);
26
+ return String(v);
27
+ };
28
+ const widths = keys.map(
29
+ (k) => Math.max(k.length, ...rows.map((r) => toStr(r[k]).length))
30
+ );
31
+ const header = keys.map((k, i) => k.padEnd(widths[i])).join(" ");
32
+ outputLine(header);
33
+ const separator = widths.map((w) => "-".repeat(w)).join(" ");
34
+ outputLine(separator);
35
+ for (const row of rows) {
36
+ const line = keys.map((k, i) => toStr(row[k]).padEnd(widths[i])).join(" ");
37
+ outputLine(line);
38
+ }
39
+ }
40
+ function printKv(obj, indent = 0) {
41
+ const prefix = " ".repeat(indent);
42
+ for (const [key, value] of Object.entries(obj)) {
43
+ if (Array.isArray(value)) {
44
+ impl.out(`${prefix}${key}:
45
+ `);
46
+ for (const item of value) {
47
+ if (item !== null && typeof item === "object" && !Array.isArray(item)) {
48
+ printKv(item, indent + 2);
49
+ } else {
50
+ impl.out(`${prefix} ${String(item)}
51
+ `);
52
+ }
53
+ }
54
+ } else if (value !== null && typeof value === "object") {
55
+ impl.out(`${prefix}${key}:
56
+ `);
57
+ printKv(value, indent + 2);
58
+ } else {
59
+ impl.out(`${prefix}${key}: ${String(value)}
60
+ `);
61
+ }
62
+ }
63
+ }
64
+
65
+ export {
66
+ outputLine,
67
+ errorLine,
68
+ printJson,
69
+ printTable,
70
+ printKv
71
+ };
72
+ //# sourceMappingURL=chunk-FYO6WLZI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/formatter.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Output interface — defines the contract for any IO sink.\n// The default implementation writes to process.stdout/stderr.\n// Swap it out in tests or to redirect to a file.\n// ---------------------------------------------------------------------------\n\nexport interface CliOutput {\n out(msg: string): void;\n err(msg: string): void;\n}\n\n// Default output using process.stdout/stderr\nlet impl: CliOutput = {\n out: (msg) => process.stdout.write(msg),\n err: (msg) => process.stderr.write(msg),\n};\n\nexport function setOutput(newImpl: CliOutput): void {\n impl = newImpl;\n}\n\nexport function resetOutput(): void {\n impl = {\n out: (msg) => process.stdout.write(msg),\n err: (msg) => process.stderr.write(msg),\n };\n}\n\n// Emit a raw string to stdout.\nexport function output(message: string): void {\n impl.out(message);\n}\n\n// Emit a single line to stdout with trailing newline.\nexport function outputLine(message: string): void {\n impl.out(message + \"\\n\");\n}\n\n// Emit a single line to stderr with trailing newline.\nexport function errorLine(message: string): void {\n impl.err(message + \"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Structured output helpers (always write to stdout)\n// ---------------------------------------------------------------------------\n\nexport function printJson(data: unknown): void {\n outputLine(JSON.stringify(data, null, 2));\n}\n\nexport function printTable(rows: Record<string, unknown>[]): void {\n if (rows.length === 0) {\n outputLine(\"No data\");\n return;\n }\n\n const keys = Object.keys(rows[0]);\n\n // Convert a cell value to a display string\n const toStr = (v: unknown): string => {\n if (v === null || v === undefined) return \"\";\n if (typeof v === \"object\") return JSON.stringify(v);\n return String(v);\n };\n\n // Calculate max width per column from headers and values\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => toStr(r[k]).length)),\n );\n\n // Header row\n const header = keys.map((k, i) => k.padEnd(widths[i])).join(\" \");\n outputLine(header);\n\n // Separator line\n const separator = widths.map((w) => \"-\".repeat(w)).join(\" \");\n outputLine(separator);\n\n // Data rows\n for (const row of rows) {\n const line = keys.map((k, i) => toStr(row[k]).padEnd(widths[i])).join(\" \");\n outputLine(line);\n }\n}\n\nexport function printKv(obj: Record<string, unknown>, indent: number = 0): void {\n const prefix = \" \".repeat(indent);\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n impl.out(`${prefix}${key}:\\n`);\n for (const item of value) {\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n printKv(item as Record<string, unknown>, indent + 2);\n } else {\n impl.out(`${prefix} ${String(item)}\\n`);\n }\n }\n } else if (value !== null && typeof value === \"object\") {\n impl.out(`${prefix}${key}:\\n`);\n printKv(value as Record<string, unknown>, indent + 2);\n } else {\n impl.out(`${prefix}${key}: ${String(value)}\\n`);\n }\n }\n}\n"],"mappings":";;;AAYA,IAAI,OAAkB;AAAA,EACpB,KAAK,CAAC,QAAQ,QAAQ,OAAO,MAAM,GAAG;AAAA,EACtC,KAAK,CAAC,QAAQ,QAAQ,OAAO,MAAM,GAAG;AACxC;AAmBO,SAAS,WAAW,SAAuB;AAChD,OAAK,IAAI,UAAU,IAAI;AACzB;AAGO,SAAS,UAAU,SAAuB;AAC/C,OAAK,IAAI,UAAU,IAAI;AACzB;AAMO,SAAS,UAAU,MAAqB;AAC7C,aAAW,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC1C;AAEO,SAAS,WAAW,MAAuC;AAChE,MAAI,KAAK,WAAW,GAAG;AACrB,eAAW,SAAS;AACpB;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC;AAGhC,QAAM,QAAQ,CAAC,MAAuB;AACpC,QAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAC1C,QAAI,OAAO,MAAM,SAAU,QAAO,KAAK,UAAU,CAAC;AAClD,WAAO,OAAO,CAAC;AAAA,EACjB;AAGA,QAAM,SAAS,KAAK;AAAA,IAAI,CAAC,MACvB,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EAC3D;AAGA,QAAM,SAAS,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAChE,aAAW,MAAM;AAGjB,QAAM,YAAY,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAC5D,aAAW,SAAS;AAGpB,aAAW,OAAO,MAAM;AACtB,UAAM,OAAO,KAAK,IAAI,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAC1E,eAAW,IAAI;AAAA,EACjB;AACF;AAEO,SAAS,QAAQ,KAA8B,SAAiB,GAAS;AAC9E,QAAM,SAAS,IAAI,OAAO,MAAM;AAChC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAK,IAAI,GAAG,MAAM,GAAG,GAAG;AAAA,CAAK;AAC7B,iBAAW,QAAQ,OAAO;AACxB,YAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AACrE,kBAAQ,MAAiC,SAAS,CAAC;AAAA,QACrD,OAAO;AACL,eAAK,IAAI,GAAG,MAAM,KAAK,OAAO,IAAI,CAAC;AAAA,CAAI;AAAA,QACzC;AAAA,MACF;AAAA,IACF,WAAW,UAAU,QAAQ,OAAO,UAAU,UAAU;AACtD,WAAK,IAAI,GAAG,MAAM,GAAG,GAAG;AAAA,CAAK;AAC7B,cAAQ,OAAkC,SAAS,CAAC;AAAA,IACtD,OAAO;AACL,WAAK,IAAI,GAAG,MAAM,GAAG,GAAG,KAAK,OAAO,KAAK,CAAC;AAAA,CAAI;AAAA,IAChD;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/parser.ts
4
+ import { parseArgs } from "util";
5
+ var CLI_OPTIONS = {
6
+ profile: { type: "string" },
7
+ json: { type: "boolean", default: false },
8
+ help: { type: "boolean", short: "h", default: false },
9
+ version: { type: "boolean", short: "v", default: false },
10
+ verbose: { type: "boolean", default: false },
11
+ client: { type: "string" },
12
+ modules: { type: "string" },
13
+ "read-only": { type: "boolean", default: false },
14
+ unit: { type: "string" },
15
+ count: { type: "string" },
16
+ to: { type: "string" },
17
+ "is-details": { type: "boolean", default: false },
18
+ market: { type: "string" },
19
+ uuid: { type: "string" },
20
+ "client-order-id": { type: "string" },
21
+ side: { type: "string" },
22
+ "ord-type": { type: "string" },
23
+ "order-type": { type: "string" },
24
+ price: { type: "string" },
25
+ volume: { type: "string" },
26
+ state: { type: "string" },
27
+ states: { type: "string" },
28
+ uuids: { type: "string" },
29
+ "client-order-ids": { type: "string" },
30
+ "order-by": { type: "string" },
31
+ cursor: { type: "string" },
32
+ "days-ago": { type: "string" },
33
+ "converting-price-unit": { type: "string" },
34
+ page: { type: "string" },
35
+ limit: { type: "string" },
36
+ tool: { type: "string" },
37
+ since: { type: "string" },
38
+ level: { type: "string" },
39
+ currency: { type: "string" },
40
+ "net-type": { type: "string" },
41
+ address: { type: "string" },
42
+ "secondary-address": { type: "string" },
43
+ "exchange-name": { type: "string" },
44
+ "receiver-type": { type: "string" },
45
+ "receiver-ko-name": { type: "string" },
46
+ "receiver-en-name": { type: "string" },
47
+ "receiver-corp-ko-name": { type: "string" },
48
+ "receiver-corp-en-name": { type: "string" },
49
+ amount: { type: "string" },
50
+ "two-factor-type": { type: "string" },
51
+ txids: { type: "string" },
52
+ "withdrawal-id": { type: "string" },
53
+ duration: { type: "string" },
54
+ frequency: { type: "string" },
55
+ "algo-order-id": { type: "string" },
56
+ "next-key": { type: "string" },
57
+ file: { type: "string" }
58
+ };
59
+ function parseCli(argv) {
60
+ const { values: raw, positionals } = parseArgs({
61
+ args: argv,
62
+ options: CLI_OPTIONS,
63
+ allowPositionals: true,
64
+ strict: false
65
+ });
66
+ const values = {
67
+ profile: raw.profile,
68
+ json: raw.json,
69
+ help: raw.help,
70
+ version: raw.version,
71
+ verbose: raw.verbose,
72
+ client: raw.client,
73
+ modules: raw.modules,
74
+ readOnly: raw["read-only"],
75
+ unit: raw.unit,
76
+ count: raw.count,
77
+ to: raw.to,
78
+ isDetails: raw["is-details"],
79
+ market: raw.market,
80
+ uuid: raw.uuid,
81
+ clientOrderId: raw["client-order-id"],
82
+ side: raw.side,
83
+ // Canonical: --order-type. Deprecated alias: --ord-type. Prefer canonical.
84
+ ordType: raw["order-type"] ?? raw["ord-type"],
85
+ ordTypeFromDeprecatedAlias: raw["order-type"] === void 0 && raw["ord-type"] !== void 0,
86
+ ordTypeConflict: raw["order-type"] !== void 0 && raw["ord-type"] !== void 0,
87
+ price: raw.price,
88
+ volume: raw.volume,
89
+ state: raw.state,
90
+ states: raw.states,
91
+ uuids: raw.uuids,
92
+ clientOrderIds: raw["client-order-ids"],
93
+ orderBy: raw["order-by"],
94
+ cursor: raw.cursor,
95
+ daysAgo: raw["days-ago"],
96
+ convertingPriceUnit: raw["converting-price-unit"],
97
+ page: raw.page,
98
+ limit: raw.limit,
99
+ tool: raw.tool,
100
+ since: raw.since,
101
+ level: raw.level,
102
+ currency: raw.currency,
103
+ netType: raw["net-type"],
104
+ address: raw.address,
105
+ secondaryAddress: raw["secondary-address"],
106
+ exchangeName: raw["exchange-name"],
107
+ receiverType: raw["receiver-type"],
108
+ receiverKoName: raw["receiver-ko-name"],
109
+ receiverEnName: raw["receiver-en-name"],
110
+ receiverCorpKoName: raw["receiver-corp-ko-name"],
111
+ receiverCorpEnName: raw["receiver-corp-en-name"],
112
+ amount: raw.amount,
113
+ twoFactorType: raw["two-factor-type"],
114
+ txids: raw.txids,
115
+ withdrawalId: raw["withdrawal-id"],
116
+ duration: raw.duration,
117
+ frequency: raw.frequency,
118
+ algoOrderId: raw["algo-order-id"],
119
+ nextKey: raw["next-key"],
120
+ file: raw.file
121
+ };
122
+ return { values, positionals };
123
+ }
124
+ function toArray(value) {
125
+ if (!value) return void 0;
126
+ return value.split(",").map((s) => s.trim()).filter(Boolean);
127
+ }
128
+ function toNumber(value) {
129
+ if (value === void 0 || value === null) return void 0;
130
+ const n = Number(value);
131
+ return Number.isNaN(n) ? void 0 : n;
132
+ }
133
+
134
+ export {
135
+ parseCli,
136
+ toArray,
137
+ toNumber
138
+ };
139
+ //# sourceMappingURL=chunk-XOKGESZ3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/parser.ts"],"sourcesContent":["import { parseArgs } from \"node:util\";\n\nexport interface CliValues {\n // Global\n profile?: string;\n json?: boolean;\n help?: boolean;\n version?: boolean;\n verbose?: boolean;\n // Setup\n client?: string;\n modules?: string;\n readOnly?: boolean;\n // Market\n unit?: string;\n count?: string;\n to?: string;\n isDetails?: boolean;\n // Trade / Account\n market?: string;\n uuid?: string;\n clientOrderId?: string;\n side?: string;\n ordType?: string;\n // Deprecated alias indicator: true if user passed --ord-type instead of --order-type\n ordTypeFromDeprecatedAlias?: boolean;\n // True when both --order-type and --ord-type are provided. Used to block\n // silent-loss of one flag's value (the deprecated alias was previously dropped).\n ordTypeConflict?: boolean;\n price?: string;\n volume?: string;\n state?: string;\n states?: string;\n uuids?: string;\n clientOrderIds?: string;\n orderBy?: string;\n cursor?: string;\n daysAgo?: string;\n convertingPriceUnit?: string;\n page?: string;\n // Audit\n limit?: string;\n tool?: string;\n since?: string;\n level?: string;\n // Withdraw / Deposit\n currency?: string;\n netType?: string;\n address?: string;\n secondaryAddress?: string;\n exchangeName?: string;\n receiverType?: string;\n receiverKoName?: string;\n receiverEnName?: string;\n receiverCorpKoName?: string;\n receiverCorpEnName?: string;\n amount?: string;\n twoFactorType?: string;\n txids?: string;\n withdrawalId?: string;\n // TWAP\n duration?: string;\n frequency?: string;\n algoOrderId?: string;\n nextKey?: string;\n // Batch\n file?: string;\n}\n\nconst CLI_OPTIONS: Record<string, { type: \"string\" | \"boolean\"; short?: string; default?: string | boolean }> = {\n profile: { type: \"string\" },\n json: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n version: { type: \"boolean\", short: \"v\", default: false },\n verbose: { type: \"boolean\", default: false },\n client: { type: \"string\" },\n modules: { type: \"string\" },\n \"read-only\": { type: \"boolean\", default: false },\n unit: { type: \"string\" },\n count: { type: \"string\" },\n to: { type: \"string\" },\n \"is-details\": { type: \"boolean\", default: false },\n market: { type: \"string\" },\n uuid: { type: \"string\" },\n \"client-order-id\": { type: \"string\" },\n side: { type: \"string\" },\n \"ord-type\": { type: \"string\" },\n \"order-type\": { type: \"string\" },\n price: { type: \"string\" },\n volume: { type: \"string\" },\n state: { type: \"string\" },\n states: { type: \"string\" },\n uuids: { type: \"string\" },\n \"client-order-ids\": { type: \"string\" },\n \"order-by\": { type: \"string\" },\n cursor: { type: \"string\" },\n \"days-ago\": { type: \"string\" },\n \"converting-price-unit\": { type: \"string\" },\n page: { type: \"string\" },\n limit: { type: \"string\" },\n tool: { type: \"string\" },\n since: { type: \"string\" },\n level: { type: \"string\" },\n currency: { type: \"string\" },\n \"net-type\": { type: \"string\" },\n address: { type: \"string\" },\n \"secondary-address\": { type: \"string\" },\n \"exchange-name\": { type: \"string\" },\n \"receiver-type\": { type: \"string\" },\n \"receiver-ko-name\": { type: \"string\" },\n \"receiver-en-name\": { type: \"string\" },\n \"receiver-corp-ko-name\": { type: \"string\" },\n \"receiver-corp-en-name\": { type: \"string\" },\n amount: { type: \"string\" },\n \"two-factor-type\": { type: \"string\" },\n txids: { type: \"string\" },\n \"withdrawal-id\": { type: \"string\" },\n duration: { type: \"string\" },\n frequency: { type: \"string\" },\n \"algo-order-id\": { type: \"string\" },\n \"next-key\": { type: \"string\" },\n file: { type: \"string\" },\n};\n\nexport function parseCli(argv: string[]): { values: CliValues; positionals: string[] } {\n const { values: raw, positionals } = parseArgs({\n args: argv,\n options: CLI_OPTIONS,\n allowPositionals: true,\n strict: false,\n });\n\n // Map kebab-case to camelCase\n const values: CliValues = {\n profile: raw.profile as string | undefined,\n json: raw.json as boolean | undefined,\n help: raw.help as boolean | undefined,\n version: raw.version as boolean | undefined,\n verbose: raw.verbose as boolean | undefined,\n client: raw.client as string | undefined,\n modules: raw.modules as string | undefined,\n readOnly: raw[\"read-only\"] as boolean | undefined,\n unit: raw.unit as string | undefined,\n count: raw.count as string | undefined,\n to: raw.to as string | undefined,\n isDetails: raw[\"is-details\"] as boolean | undefined,\n market: raw.market as string | undefined,\n uuid: raw.uuid as string | undefined,\n clientOrderId: raw[\"client-order-id\"] as string | undefined,\n side: raw.side as string | undefined,\n // Canonical: --order-type. Deprecated alias: --ord-type. Prefer canonical.\n ordType:\n (raw[\"order-type\"] as string | undefined) ??\n (raw[\"ord-type\"] as string | undefined),\n ordTypeFromDeprecatedAlias:\n (raw[\"order-type\"] as string | undefined) === undefined &&\n (raw[\"ord-type\"] as string | undefined) !== undefined,\n ordTypeConflict:\n (raw[\"order-type\"] as string | undefined) !== undefined &&\n (raw[\"ord-type\"] as string | undefined) !== undefined,\n price: raw.price as string | undefined,\n volume: raw.volume as string | undefined,\n state: raw.state as string | undefined,\n states: raw.states as string | undefined,\n uuids: raw.uuids as string | undefined,\n clientOrderIds: raw[\"client-order-ids\"] as string | undefined,\n orderBy: raw[\"order-by\"] as string | undefined,\n cursor: raw.cursor as string | undefined,\n daysAgo: raw[\"days-ago\"] as string | undefined,\n convertingPriceUnit: raw[\"converting-price-unit\"] as string | undefined,\n page: raw.page as string | undefined,\n limit: raw.limit as string | undefined,\n tool: raw.tool as string | undefined,\n since: raw.since as string | undefined,\n level: raw.level as string | undefined,\n currency: raw.currency as string | undefined,\n netType: raw[\"net-type\"] as string | undefined,\n address: raw.address as string | undefined,\n secondaryAddress: raw[\"secondary-address\"] as string | undefined,\n exchangeName: raw[\"exchange-name\"] as string | undefined,\n receiverType: raw[\"receiver-type\"] as string | undefined,\n receiverKoName: raw[\"receiver-ko-name\"] as string | undefined,\n receiverEnName: raw[\"receiver-en-name\"] as string | undefined,\n receiverCorpKoName: raw[\"receiver-corp-ko-name\"] as string | undefined,\n receiverCorpEnName: raw[\"receiver-corp-en-name\"] as string | undefined,\n amount: raw.amount as string | undefined,\n twoFactorType: raw[\"two-factor-type\"] as string | undefined,\n txids: raw.txids as string | undefined,\n withdrawalId: raw[\"withdrawal-id\"] as string | undefined,\n duration: raw.duration as string | undefined,\n frequency: raw.frequency as string | undefined,\n algoOrderId: raw[\"algo-order-id\"] as string | undefined,\n nextKey: raw[\"next-key\"] as string | undefined,\n file: raw.file as string | undefined,\n };\n\n return { values, positionals };\n}\n\n// Helper: convert comma-separated string to array\nexport function toArray(value?: string): string[] | undefined {\n if (!value) return undefined;\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n// Helper: convert string to number or undefined\nexport function toNumber(value?: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n const n = Number(value);\n return Number.isNaN(n) ? undefined : n;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ configFilePath,
4
+ readFullConfig,
5
+ writeFullConfig
6
+ } from "./chunk-6NIRYFQU.js";
7
+ import {
8
+ errorLine,
9
+ outputLine,
10
+ printJson,
11
+ printKv,
12
+ printTable
13
+ } from "./chunk-FYO6WLZI.js";
14
+
15
+ // src/commands/config.ts
16
+ import { existsSync, mkdirSync } from "fs";
17
+ import { dirname } from "path";
18
+ function handleConfigCommand(action, rest, v) {
19
+ const json = v.json ?? false;
20
+ switch (action) {
21
+ case "show":
22
+ return cmdConfigShow(json);
23
+ case "init":
24
+ return cmdConfigInit();
25
+ case "set":
26
+ return cmdConfigSet(rest[0], rest[1], v.profile);
27
+ case "add-profile":
28
+ return cmdConfigAddProfile(rest, v);
29
+ case "list-profiles":
30
+ return cmdConfigListProfiles(json);
31
+ case "use":
32
+ return cmdConfigUse(rest[0]);
33
+ case "path":
34
+ outputLine(configFilePath());
35
+ return;
36
+ default:
37
+ if (!action) {
38
+ return cmdConfigShow(json);
39
+ }
40
+ errorLine(`Unknown config command: ${action}. Available: show, init, set, add-profile, list-profiles, use, path`);
41
+ process.exitCode = 1;
42
+ }
43
+ }
44
+ function cmdConfigShow(json) {
45
+ const config = readFullConfig();
46
+ if (json) return printJson(config);
47
+ outputLine(`Config file: ${configFilePath()}`);
48
+ if (config.default_profile) {
49
+ outputLine(`Default profile: ${config.default_profile}`);
50
+ }
51
+ outputLine("");
52
+ const profileNames = Object.keys(config.profiles);
53
+ if (profileNames.length === 0) {
54
+ outputLine("No profiles configured. Run 'bithumb-trade config init' to create one.");
55
+ return;
56
+ }
57
+ for (const name of profileNames) {
58
+ const p = config.profiles[name];
59
+ outputLine(`[${name}]`);
60
+ printKv({
61
+ access_key: p.access_key ? `${p.access_key.slice(0, 8)}...` : "(not set)",
62
+ secret_key: p.secret_key ? "***" : "(not set)",
63
+ ...p.base_url ? { base_url: p.base_url } : {},
64
+ ...p.timeout_ms ? { timeout_ms: p.timeout_ms } : {}
65
+ });
66
+ outputLine("");
67
+ }
68
+ }
69
+ function cmdConfigInit() {
70
+ const path = configFilePath();
71
+ if (existsSync(path)) {
72
+ outputLine(`Config file already exists: ${path}`);
73
+ outputLine("Use 'bithumb-trade config add-profile' to add a new profile.");
74
+ return;
75
+ }
76
+ const dir = dirname(path);
77
+ if (!existsSync(dir)) {
78
+ mkdirSync(dir, { recursive: true });
79
+ }
80
+ const config = {
81
+ default_profile: "default",
82
+ profiles: {
83
+ default: {
84
+ access_key: "",
85
+ secret_key: ""
86
+ }
87
+ }
88
+ };
89
+ writeFullConfig(config);
90
+ outputLine(`Config file created: ${path}`);
91
+ outputLine("Edit it to add your API credentials.");
92
+ }
93
+ function cmdConfigSet(key, value, profileName) {
94
+ if (!key || value === void 0) {
95
+ errorLine("Usage: bithumb-trade config set <key> <value> [--profile <name>]");
96
+ errorLine("Keys: access_key, secret_key, base_url, timeout_ms");
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ const validKeys = /* @__PURE__ */ new Set(["access_key", "secret_key", "base_url", "timeout_ms"]);
101
+ if (!validKeys.has(key)) {
102
+ errorLine(`Invalid key: ${key}. Valid keys: ${[...validKeys].join(", ")}`);
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ const config = readFullConfig();
107
+ const name = profileName ?? config.default_profile ?? "default";
108
+ if (!config.profiles[name]) {
109
+ config.profiles[name] = {};
110
+ }
111
+ if (key === "timeout_ms") {
112
+ config.profiles[name][key] = Number(value);
113
+ } else {
114
+ config.profiles[name][key] = value;
115
+ }
116
+ writeFullConfig(config);
117
+ outputLine(`Set ${name}.${key}`);
118
+ }
119
+ function cmdConfigAddProfile(rest, _v) {
120
+ const name = rest[0];
121
+ if (!name) {
122
+ errorLine("Usage: bithumb-trade config add-profile <name>");
123
+ process.exitCode = 1;
124
+ return;
125
+ }
126
+ const config = readFullConfig();
127
+ if (config.profiles[name]) {
128
+ errorLine(`Profile '${name}' already exists.`);
129
+ process.exitCode = 1;
130
+ return;
131
+ }
132
+ config.profiles[name] = {
133
+ access_key: "",
134
+ secret_key: ""
135
+ };
136
+ writeFullConfig(config);
137
+ outputLine(`Profile '${name}' added. Edit ${configFilePath()} to set credentials.`);
138
+ }
139
+ function cmdConfigListProfiles(json) {
140
+ const config = readFullConfig();
141
+ const profiles = Object.entries(config.profiles).map(([name, p]) => ({
142
+ name,
143
+ default: name === (config.default_profile ?? "default") ? "*" : "",
144
+ has_credentials: p.access_key && p.secret_key ? "yes" : "no"
145
+ }));
146
+ if (json) return printJson(profiles);
147
+ if (profiles.length === 0) {
148
+ outputLine("No profiles configured.");
149
+ return;
150
+ }
151
+ printTable(profiles);
152
+ }
153
+ function cmdConfigUse(profileName) {
154
+ if (!profileName) {
155
+ errorLine("Usage: bithumb-trade config use <profile-name>");
156
+ process.exitCode = 1;
157
+ return;
158
+ }
159
+ const config = readFullConfig();
160
+ if (!config.profiles[profileName]) {
161
+ errorLine(`Profile '${profileName}' not found. Run 'bithumb-trade config list-profiles' to see available profiles.`);
162
+ process.exitCode = 1;
163
+ return;
164
+ }
165
+ config.default_profile = profileName;
166
+ writeFullConfig(config);
167
+ outputLine(`Default profile set to '${profileName}'`);
168
+ }
169
+ export {
170
+ handleConfigCommand
171
+ };
172
+ //# sourceMappingURL=config-5T2Z7X5D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/config.ts"],"sourcesContent":["import {\n configFilePath,\n readFullConfig,\n writeFullConfig,\n} from \"@bithumb-tradekit/core\";\nimport type { BithumbTomlConfig } from \"@bithumb-tradekit/core\";\nimport type { CliValues } from \"../parser.js\";\nimport { outputLine, errorLine, printJson, printKv, printTable } from \"../formatter.js\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport function handleConfigCommand(\n action: string,\n rest: string[],\n v: CliValues,\n): void {\n const json = v.json ?? false;\n switch (action) {\n case \"show\":\n return cmdConfigShow(json);\n case \"init\":\n return cmdConfigInit();\n case \"set\":\n return cmdConfigSet(rest[0], rest[1], v.profile);\n case \"add-profile\":\n return cmdConfigAddProfile(rest, v);\n case \"list-profiles\":\n return cmdConfigListProfiles(json);\n case \"use\":\n return cmdConfigUse(rest[0]);\n case \"path\":\n outputLine(configFilePath());\n return;\n default:\n if (!action) {\n return cmdConfigShow(json);\n }\n errorLine(`Unknown config command: ${action}. Available: show, init, set, add-profile, list-profiles, use, path`);\n process.exitCode = 1;\n }\n}\n\nfunction cmdConfigShow(json: boolean): void {\n const config = readFullConfig();\n if (json) return printJson(config);\n outputLine(`Config file: ${configFilePath()}`);\n if (config.default_profile) {\n outputLine(`Default profile: ${config.default_profile}`);\n }\n outputLine(\"\");\n const profileNames = Object.keys(config.profiles);\n if (profileNames.length === 0) {\n outputLine(\"No profiles configured. Run 'bithumb-trade config init' to create one.\");\n return;\n }\n for (const name of profileNames) {\n const p = config.profiles[name];\n outputLine(`[${name}]`);\n printKv({\n access_key: p.access_key ? `${p.access_key.slice(0, 8)}...` : \"(not set)\",\n secret_key: p.secret_key ? \"***\" : \"(not set)\",\n ...(p.base_url ? { base_url: p.base_url } : {}),\n ...(p.timeout_ms ? { timeout_ms: p.timeout_ms } : {}),\n });\n outputLine(\"\");\n }\n}\n\nfunction cmdConfigInit(): void {\n const path = configFilePath();\n if (existsSync(path)) {\n outputLine(`Config file already exists: ${path}`);\n outputLine(\"Use 'bithumb-trade config add-profile' to add a new profile.\");\n return;\n }\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n const config: BithumbTomlConfig = {\n default_profile: \"default\",\n profiles: {\n default: {\n access_key: \"\",\n secret_key: \"\",\n },\n },\n };\n writeFullConfig(config);\n outputLine(`Config file created: ${path}`);\n outputLine(\"Edit it to add your API credentials.\");\n}\n\nfunction cmdConfigSet(key: string | undefined, value: string | undefined, profileName?: string): void {\n if (!key || value === undefined) {\n errorLine(\"Usage: bithumb-trade config set <key> <value> [--profile <name>]\");\n errorLine(\"Keys: access_key, secret_key, base_url, timeout_ms\");\n process.exitCode = 1;\n return;\n }\n const validKeys = new Set([\"access_key\", \"secret_key\", \"base_url\", \"timeout_ms\"]);\n if (!validKeys.has(key)) {\n errorLine(`Invalid key: ${key}. Valid keys: ${[...validKeys].join(\", \")}`);\n process.exitCode = 1;\n return;\n }\n const config = readFullConfig();\n const name = profileName ?? config.default_profile ?? \"default\";\n if (!config.profiles[name]) {\n config.profiles[name] = {};\n }\n if (key === \"timeout_ms\") {\n (config.profiles[name] as Record<string, unknown>)[key] = Number(value);\n } else {\n (config.profiles[name] as Record<string, unknown>)[key] = value;\n }\n writeFullConfig(config);\n outputLine(`Set ${name}.${key}`);\n}\n\nfunction cmdConfigAddProfile(rest: string[], _v: CliValues): void {\n const name = rest[0];\n if (!name) {\n errorLine(\"Usage: bithumb-trade config add-profile <name>\");\n process.exitCode = 1;\n return;\n }\n const config = readFullConfig();\n if (config.profiles[name]) {\n errorLine(`Profile '${name}' already exists.`);\n process.exitCode = 1;\n return;\n }\n config.profiles[name] = {\n access_key: \"\",\n secret_key: \"\",\n };\n writeFullConfig(config);\n outputLine(`Profile '${name}' added. Edit ${configFilePath()} to set credentials.`);\n}\n\nfunction cmdConfigListProfiles(json: boolean): void {\n const config = readFullConfig();\n const profiles = Object.entries(config.profiles).map(([name, p]) => ({\n name,\n default: name === (config.default_profile ?? \"default\") ? \"*\" : \"\",\n has_credentials: p.access_key && p.secret_key ? \"yes\" : \"no\",\n }));\n if (json) return printJson(profiles);\n if (profiles.length === 0) {\n outputLine(\"No profiles configured.\");\n return;\n }\n printTable(profiles);\n}\n\nfunction cmdConfigUse(profileName: string | undefined): void {\n if (!profileName) {\n errorLine(\"Usage: bithumb-trade config use <profile-name>\");\n process.exitCode = 1;\n return;\n }\n const config = readFullConfig();\n if (!config.profiles[profileName]) {\n errorLine(`Profile '${profileName}' not found. Run 'bithumb-trade config list-profiles' to see available profiles.`);\n process.exitCode = 1;\n return;\n }\n config.default_profile = profileName;\n writeFullConfig(config);\n outputLine(`Default profile set to '${profileName}'`);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ BithumbApiError
4
+ } from "./chunk-6NIRYFQU.js";
5
+ import {
6
+ toArray,
7
+ toNumber
8
+ } from "./chunk-XOKGESZ3.js";
9
+ import {
10
+ errorLine,
11
+ outputLine,
12
+ printJson,
13
+ printKv,
14
+ printTable
15
+ } from "./chunk-FYO6WLZI.js";
16
+
17
+ // src/commands/deposit.ts
18
+ async function handleDepositCommand(run, action, v, json) {
19
+ switch (action) {
20
+ case "get":
21
+ return cmdGet(run, v, json);
22
+ case "list":
23
+ return cmdList(run, v, json);
24
+ case "list-krw":
25
+ return cmdListKrw(run, v, json);
26
+ case "krw":
27
+ return cmdKrw(run, v, json);
28
+ case "generate-address":
29
+ return cmdGenerateAddress(run, v, json);
30
+ case "addresses":
31
+ return cmdAddresses(run, json);
32
+ case "address":
33
+ return cmdAddress(run, v, json);
34
+ default:
35
+ errorLine(`Unknown deposit command: ${action}. Run 'bithumb-trade deposit --help' for usage.`);
36
+ process.exitCode = 1;
37
+ }
38
+ }
39
+ async function cmdGet(run, v, json) {
40
+ if (v.txids) {
41
+ errorLine("Error: 'deposit get' supports --uuid only. For txid lookup use:");
42
+ errorLine(" bithumb-trade deposit list --txids <txid1,txid2>");
43
+ process.exitCode = 1;
44
+ return;
45
+ }
46
+ if (!v.currency) {
47
+ errorLine("Error: --currency required. Example: bithumb-trade deposit get --currency BTC --uuid abc-123");
48
+ process.exitCode = 1;
49
+ return;
50
+ }
51
+ if (!v.uuid) {
52
+ errorLine("Error: --uuid required for 'deposit get'. Example: bithumb-trade deposit get --currency BTC --uuid abc-123");
53
+ errorLine("Tip: To search by txid, use 'bithumb-trade deposit list --txids <txid>'.");
54
+ process.exitCode = 1;
55
+ return;
56
+ }
57
+ const args = { currency: v.currency, uuid: v.uuid };
58
+ try {
59
+ const result = await run("deposit_get", args);
60
+ const data = result.data;
61
+ if (!data || typeof data === "object" && Object.keys(data).length === 0) {
62
+ outputLine("No deposit found.");
63
+ return;
64
+ }
65
+ if (json) return printJson(data);
66
+ printKv(data);
67
+ } catch (err) {
68
+ if (err instanceof BithumbApiError) {
69
+ const codeNum = Number(err.code);
70
+ const codeStr = err.code ?? "";
71
+ const errNamePattern = /not.?found|invalid|forbidden|unauthorized|bad.?request/i;
72
+ const messagePattern = /not.?found|invalid/i;
73
+ const isClientError = Number.isFinite(codeNum) && codeNum >= 400 && codeNum < 500 || errNamePattern.test(codeStr) || messagePattern.test(err.message);
74
+ if (isClientError) {
75
+ errorLine(`Error: deposit not found or invalid request (${err.code}). ${err.message}`);
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ errorLine(`Error: ${err.message}`);
80
+ process.exitCode = 1;
81
+ return;
82
+ }
83
+ throw err;
84
+ }
85
+ }
86
+ async function cmdList(run, v, json) {
87
+ const args = {};
88
+ if (v.currency) args.currency = v.currency;
89
+ if (v.state) args.state = v.state;
90
+ if (v.uuids) args.uuids = toArray(v.uuids);
91
+ if (v.txids) args.txids = toArray(v.txids);
92
+ if (v.limit) args.limit = toNumber(v.limit);
93
+ if (v.page) args.page = toNumber(v.page);
94
+ if (v.orderBy) args.order_by = v.orderBy;
95
+ const result = await run("deposit_get_list", args);
96
+ const items = result.data;
97
+ if (json) return printJson(items);
98
+ if (!items?.length) {
99
+ outputLine("No deposits found");
100
+ return;
101
+ }
102
+ printTable(items);
103
+ }
104
+ async function cmdListKrw(run, v, json) {
105
+ const args = {};
106
+ if (v.state) args.state = v.state;
107
+ if (v.uuids) args.uuids = toArray(v.uuids);
108
+ if (v.txids) args.txids = toArray(v.txids);
109
+ if (v.limit) args.limit = toNumber(v.limit);
110
+ if (v.page) args.page = toNumber(v.page);
111
+ if (v.orderBy) args.order_by = v.orderBy;
112
+ const result = await run("deposit_get_list_krw", args);
113
+ const items = result.data;
114
+ if (json) return printJson(items);
115
+ if (!items?.length) {
116
+ outputLine("No KRW deposits found");
117
+ return;
118
+ }
119
+ printTable(items);
120
+ }
121
+ async function cmdKrw(run, v, json) {
122
+ if (!v.amount || !v.twoFactorType) {
123
+ errorLine("Error: --amount and --two-factor-type required.");
124
+ errorLine("CAUTION: This will initiate a real KRW deposit request!");
125
+ process.exitCode = 1;
126
+ return;
127
+ }
128
+ outputLine("WARNING: Initiating KRW deposit request.");
129
+ const result = await run("deposit_krw", { amount: v.amount, two_factor_type: v.twoFactorType });
130
+ const data = result.data;
131
+ if (json) return printJson(data);
132
+ printKv(data);
133
+ }
134
+ async function cmdGenerateAddress(run, v, json) {
135
+ if (!v.currency || !v.netType) {
136
+ errorLine("Error: --currency and --net-type required. Example: bithumb-trade deposit generate-address --currency BTC --net-type BTC");
137
+ process.exitCode = 1;
138
+ return;
139
+ }
140
+ const result = await run("deposit_generate_address", { currency: v.currency, net_type: v.netType });
141
+ const data = result.data;
142
+ if (json) return printJson(data);
143
+ printKv(data);
144
+ }
145
+ async function cmdAddresses(run, json) {
146
+ const result = await run("deposit_get_addresses", {});
147
+ const items = result.data;
148
+ if (json) return printJson(items);
149
+ if (!items?.length) {
150
+ outputLine("No deposit addresses found");
151
+ return;
152
+ }
153
+ printTable(items);
154
+ }
155
+ async function cmdAddress(run, v, json) {
156
+ if (!v.currency || !v.netType) {
157
+ errorLine("Error: --currency and --net-type required. Example: bithumb-trade deposit address --currency BTC --net-type BTC");
158
+ process.exitCode = 1;
159
+ return;
160
+ }
161
+ const result = await run("deposit_get_address", { currency: v.currency, net_type: v.netType });
162
+ const data = result.data;
163
+ if (json) return printJson(data);
164
+ printKv(data);
165
+ }
166
+ export {
167
+ handleDepositCommand
168
+ };
169
+ //# sourceMappingURL=deposit-PBP2KDXP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/deposit.ts"],"sourcesContent":["import type { ToolRunner } from \"@bithumb-tradekit/core\";\nimport { BithumbApiError } from \"@bithumb-tradekit/core\";\nimport type { CliValues } from \"../parser.js\";\nimport { toNumber, toArray } from \"../parser.js\";\nimport { outputLine, errorLine, printJson, printTable, printKv } from \"../formatter.js\";\n\nexport async function handleDepositCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean,\n): Promise<void> {\n switch (action) {\n case \"get\":\n return cmdGet(run, v, json);\n case \"list\":\n return cmdList(run, v, json);\n case \"list-krw\":\n return cmdListKrw(run, v, json);\n case \"krw\":\n return cmdKrw(run, v, json);\n case \"generate-address\":\n return cmdGenerateAddress(run, v, json);\n case \"addresses\":\n return cmdAddresses(run, json);\n case \"address\":\n return cmdAddress(run, v, json);\n default:\n errorLine(`Unknown deposit command: ${action}. Run 'bithumb-trade deposit --help' for usage.`);\n process.exitCode = 1;\n }\n}\n\nasync function cmdGet(run: ToolRunner, v: CliValues, json: boolean): Promise<void> {\n if (v.txids) {\n errorLine(\"Error: 'deposit get' supports --uuid only. For txid lookup use:\");\n errorLine(\" bithumb-trade deposit list --txids <txid1,txid2>\");\n process.exitCode = 1;\n return;\n }\n if (!v.currency) {\n errorLine(\"Error: --currency required. Example: bithumb-trade deposit get --currency BTC --uuid abc-123\");\n process.exitCode = 1;\n return;\n }\n if (!v.uuid) {\n errorLine(\"Error: --uuid required for 'deposit get'. Example: bithumb-trade deposit get --currency BTC --uuid abc-123\");\n errorLine(\"Tip: To search by txid, use 'bithumb-trade deposit list --txids <txid>'.\");\n process.exitCode = 1;\n return;\n }\n const args: Record<string, unknown> = { currency: v.currency, uuid: v.uuid };\n try {\n const result = await run(\"deposit_get\", args);\n const data = result.data as Record<string, unknown> | undefined;\n if (!data || (typeof data === \"object\" && Object.keys(data).length === 0)) {\n outputLine(\"No deposit found.\");\n return;\n }\n if (json) return printJson(data);\n printKv(data);\n } catch (err) {\n // Bithumb API may return 4xx for unknown UUID; render gracefully without the `Fatal:` prefix.\n if (err instanceof BithumbApiError) {\n const codeNum = Number(err.code);\n const codeStr = err.code ?? \"\";\n const errNamePattern = /not.?found|invalid|forbidden|unauthorized|bad.?request/i;\n const messagePattern = /not.?found|invalid/i;\n const isClientError =\n (Number.isFinite(codeNum) && codeNum >= 400 && codeNum < 500) ||\n errNamePattern.test(codeStr) ||\n messagePattern.test(err.message);\n if (isClientError) {\n errorLine(`Error: deposit not found or invalid request (${err.code}). ${err.message}`);\n process.exitCode = 1;\n return;\n }\n // Other Bithumb API errors (5xx, unknown code): still graceful, not Fatal.\n errorLine(`Error: ${err.message}`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n\nasync function cmdList(run: ToolRunner, v: CliValues, json: boolean): Promise<void> {\n const args: Record<string, unknown> = {};\n if (v.currency) args.currency = v.currency;\n if (v.state) args.state = v.state;\n if (v.uuids) args.uuids = toArray(v.uuids);\n if (v.txids) args.txids = toArray(v.txids);\n if (v.limit) args.limit = toNumber(v.limit);\n if (v.page) args.page = toNumber(v.page);\n if (v.orderBy) args.order_by = v.orderBy;\n const result = await run(\"deposit_get_list\", args);\n const items = result.data as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No deposits found\"); return; }\n printTable(items);\n}\n\nasync function cmdListKrw(run: ToolRunner, v: CliValues, json: boolean): Promise<void> {\n const args: Record<string, unknown> = {};\n if (v.state) args.state = v.state;\n if (v.uuids) args.uuids = toArray(v.uuids);\n if (v.txids) args.txids = toArray(v.txids);\n if (v.limit) args.limit = toNumber(v.limit);\n if (v.page) args.page = toNumber(v.page);\n if (v.orderBy) args.order_by = v.orderBy;\n const result = await run(\"deposit_get_list_krw\", args);\n const items = result.data as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No KRW deposits found\"); return; }\n printTable(items);\n}\n\nasync function cmdKrw(run: ToolRunner, v: CliValues, json: boolean): Promise<void> {\n if (!v.amount || !v.twoFactorType) {\n errorLine(\"Error: --amount and --two-factor-type required.\");\n errorLine(\"CAUTION: This will initiate a real KRW deposit request!\");\n process.exitCode = 1;\n return;\n }\n outputLine(\"WARNING: Initiating KRW deposit request.\");\n const result = await run(\"deposit_krw\", { amount: v.amount, two_factor_type: v.twoFactorType });\n const data = result.data as Record<string, unknown>;\n if (json) return printJson(data);\n printKv(data);\n}\n\nasync function cmdGenerateAddress(run: ToolRunner, v: CliValues, json: boolean): Promise<void> {\n if (!v.currency || !v.netType) {\n errorLine(\"Error: --currency and --net-type required. Example: bithumb-trade deposit generate-address --currency BTC --net-type BTC\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"deposit_generate_address\", { currency: v.currency, net_type: v.netType });\n const data = result.data as Record<string, unknown>;\n if (json) return printJson(data);\n printKv(data);\n}\n\nasync function cmdAddresses(run: ToolRunner, json: boolean): Promise<void> {\n const result = await run(\"deposit_get_addresses\", {});\n const items = result.data as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No deposit addresses found\"); return; }\n printTable(items);\n}\n\nasync function cmdAddress(run: ToolRunner, v: CliValues, json: boolean): Promise<void> {\n if (!v.currency || !v.netType) {\n errorLine(\"Error: --currency and --net-type required. Example: bithumb-trade deposit address --currency BTC --net-type BTC\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"deposit_get_address\", { currency: v.currency, net_type: v.netType });\n const data = result.data as Record<string, unknown>;\n if (json) return printJson(data);\n printKv(data);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }