@bithumb-official/bithumb-cli 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/account-UVDNQRB7.js +78 -0
  2. package/dist/account-UVDNQRB7.js.map +1 -0
  3. package/dist/account-YNPFEHQT.js +90 -0
  4. package/dist/account-YNPFEHQT.js.map +1 -0
  5. package/dist/chunk-AUQ7MB6O.js +143 -0
  6. package/dist/chunk-AUQ7MB6O.js.map +1 -0
  7. package/dist/chunk-FYO6WLZI.js +72 -0
  8. package/dist/chunk-FYO6WLZI.js.map +1 -0
  9. package/dist/chunk-YXIFBNEQ.js +3488 -0
  10. package/dist/chunk-YXIFBNEQ.js.map +1 -0
  11. package/dist/config-2P3Y3TQH.js +182 -0
  12. package/dist/config-2P3Y3TQH.js.map +1 -0
  13. package/dist/config-6BIS2PLC.js +154 -0
  14. package/dist/config-6BIS2PLC.js.map +1 -0
  15. package/dist/deposit-HNUSMKX5.js +161 -0
  16. package/dist/deposit-HNUSMKX5.js.map +1 -0
  17. package/dist/deposit-TCMLJ7MI.js +169 -0
  18. package/dist/deposit-TCMLJ7MI.js.map +1 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +211 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/market-EEF3KI4T.js +219 -0
  23. package/dist/market-EEF3KI4T.js.map +1 -0
  24. package/dist/market-GLU62BWO.js +304 -0
  25. package/dist/market-GLU62BWO.js.map +1 -0
  26. package/dist/setup-LAAVO63H.js +21 -0
  27. package/dist/setup-LAAVO63H.js.map +1 -0
  28. package/dist/system-BRZY7PTZ.js +98 -0
  29. package/dist/system-BRZY7PTZ.js.map +1 -0
  30. package/dist/system-XRZ2KHXL.js +69 -0
  31. package/dist/system-XRZ2KHXL.js.map +1 -0
  32. package/dist/trade-FERR47DJ.js +233 -0
  33. package/dist/trade-FERR47DJ.js.map +1 -0
  34. package/dist/trade-H4G5P2W2.js +159 -0
  35. package/dist/trade-H4G5P2W2.js.map +1 -0
  36. package/dist/twap-44UCVSIR.js +91 -0
  37. package/dist/twap-44UCVSIR.js.map +1 -0
  38. package/dist/twap-4LRBUMTG.js +82 -0
  39. package/dist/twap-4LRBUMTG.js.map +1 -0
  40. package/dist/withdraw-IRMICBD2.js +203 -0
  41. package/dist/withdraw-IRMICBD2.js.map +1 -0
  42. package/dist/withdraw-TLGVRUBS.js +161 -0
  43. package/dist/withdraw-TLGVRUBS.js.map +1 -0
  44. package/package.json +25 -0
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ errorLine,
4
+ outputLine,
5
+ printJson,
6
+ printKv,
7
+ printTable
8
+ } from "./chunk-FYO6WLZI.js";
9
+
10
+ // src/commands/account.ts
11
+ async function handleAccountCommand(run, action, v, json) {
12
+ switch (action) {
13
+ case "balance":
14
+ return cmdBalance(run, json);
15
+ case "order-chance":
16
+ return cmdOrderChance(run, v.market, json);
17
+ case "wallet-status":
18
+ return cmdWalletStatus(run, json);
19
+ case "api-keys":
20
+ return cmdApiKeys(run, json);
21
+ default:
22
+ errorLine(`Unknown account command: ${action}. Run 'bithumb account --help' for usage.`);
23
+ process.exitCode = 1;
24
+ }
25
+ }
26
+ async function cmdBalance(run, json) {
27
+ const result = await run("account_get_balance", {});
28
+ const items = result.data;
29
+ if (json) return printJson(items);
30
+ if (!items?.length) {
31
+ outputLine("No balances found");
32
+ return;
33
+ }
34
+ printTable(items.map((b) => ({
35
+ currency: b["currency"],
36
+ balance: b["balance"],
37
+ locked: b["locked"],
38
+ avg_buy_price: b["avg_buy_price"],
39
+ unit_currency: b["unit_currency"]
40
+ })));
41
+ }
42
+ async function cmdOrderChance(run, market, json) {
43
+ if (!market) {
44
+ errorLine("Error: --market is required. Example: bithumb account order-chance --market KRW-BTC");
45
+ process.exitCode = 1;
46
+ return;
47
+ }
48
+ const result = await run("account_get_order_chance", { market });
49
+ const data = result.data;
50
+ if (json) return printJson(data);
51
+ printKv(data);
52
+ }
53
+ async function cmdWalletStatus(run, json) {
54
+ const result = await run("account_get_wallet_status", {});
55
+ const data = result.data;
56
+ if (json) return printJson(data);
57
+ const items = data;
58
+ if (!items?.length) {
59
+ outputLine("No wallet status data");
60
+ return;
61
+ }
62
+ printTable(items);
63
+ }
64
+ async function cmdApiKeys(run, json) {
65
+ const result = await run("account_get_api_keys", {});
66
+ const data = result.data;
67
+ if (json) return printJson(data);
68
+ const items = data;
69
+ if (!items?.length) {
70
+ outputLine("No API keys found");
71
+ return;
72
+ }
73
+ printTable(items);
74
+ }
75
+ export {
76
+ handleAccountCommand
77
+ };
78
+ //# sourceMappingURL=account-UVDNQRB7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/account.ts"],"sourcesContent":["import type { ToolRunner } from \"@bithumb-official/bithumb-core\";\nimport type { CliValues } from \"../parser.js\";\nimport { outputLine, errorLine, printJson, printTable, printKv } from \"../formatter.js\";\n\nexport async function handleAccountCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean,\n): Promise<void> {\n switch (action) {\n case \"balance\":\n return cmdBalance(run, json);\n case \"order-chance\":\n return cmdOrderChance(run, v.market, json);\n case \"wallet-status\":\n return cmdWalletStatus(run, json);\n case \"api-keys\":\n return cmdApiKeys(run, json);\n default:\n errorLine(`Unknown account command: ${action}. Run 'bithumb account --help' for usage.`);\n process.exitCode = 1;\n }\n}\n\nasync function cmdBalance(run: ToolRunner, json: boolean): Promise<void> {\n const result = await run(\"account_get_balance\", {});\n const items = result.data as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No balances found\"); return; }\n printTable(items.map((b) => ({\n currency: b[\"currency\"],\n balance: b[\"balance\"],\n locked: b[\"locked\"],\n avg_buy_price: b[\"avg_buy_price\"],\n unit_currency: b[\"unit_currency\"],\n })));\n}\n\nasync function cmdOrderChance(run: ToolRunner, market: string | undefined, json: boolean): Promise<void> {\n if (!market) {\n errorLine(\"Error: --market is required. Example: bithumb account order-chance --market KRW-BTC\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"account_get_order_chance\", { market });\n const data = result.data as Record<string, unknown>;\n if (json) return printJson(data);\n printKv(data);\n}\n\nasync function cmdWalletStatus(run: ToolRunner, json: boolean): Promise<void> {\n const result = await run(\"account_get_wallet_status\", {});\n const data = result.data;\n if (json) return printJson(data);\n const items = data as Record<string, unknown>[];\n if (!items?.length) { outputLine(\"No wallet status data\"); return; }\n printTable(items);\n}\n\nasync function cmdApiKeys(run: ToolRunner, json: boolean): Promise<void> {\n const result = await run(\"account_get_api_keys\", {});\n const data = result.data;\n if (json) return printJson(data);\n const items = data as Record<string, unknown>[];\n if (!items?.length) { outputLine(\"No API keys found\"); return; }\n printTable(items);\n}\n"],"mappings":";;;;;;;;;;AAIA,eAAsB,qBACpB,KACA,QACA,GACA,MACe;AACf,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,WAAW,KAAK,IAAI;AAAA,IAC7B,KAAK;AACH,aAAO,eAAe,KAAK,EAAE,QAAQ,IAAI;AAAA,IAC3C,KAAK;AACH,aAAO,gBAAgB,KAAK,IAAI;AAAA,IAClC,KAAK;AACH,aAAO,WAAW,KAAK,IAAI;AAAA,IAC7B;AACE,gBAAU,4BAA4B,MAAM,2CAA2C;AACvF,cAAQ,WAAW;AAAA,EACvB;AACF;AAEA,eAAe,WAAW,KAAiB,MAA8B;AACvE,QAAM,SAAS,MAAM,IAAI,uBAAuB,CAAC,CAAC;AAClD,QAAM,QAAQ,OAAO;AACrB,MAAI,KAAM,QAAO,UAAU,KAAK;AAChC,MAAI,CAAC,OAAO,QAAQ;AAAE,eAAW,mBAAmB;AAAG;AAAA,EAAQ;AAC/D,aAAW,MAAM,IAAI,CAAC,OAAO;AAAA,IAC3B,UAAU,EAAE,UAAU;AAAA,IACtB,SAAS,EAAE,SAAS;AAAA,IACpB,QAAQ,EAAE,QAAQ;AAAA,IAClB,eAAe,EAAE,eAAe;AAAA,IAChC,eAAe,EAAE,eAAe;AAAA,EAClC,EAAE,CAAC;AACL;AAEA,eAAe,eAAe,KAAiB,QAA4B,MAA8B;AACvG,MAAI,CAAC,QAAQ;AACX,cAAU,qFAAqF;AAC/F,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,QAAM,SAAS,MAAM,IAAI,4BAA4B,EAAE,OAAO,CAAC;AAC/D,QAAM,OAAO,OAAO;AACpB,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,UAAQ,IAAI;AACd;AAEA,eAAe,gBAAgB,KAAiB,MAA8B;AAC5E,QAAM,SAAS,MAAM,IAAI,6BAA6B,CAAC,CAAC;AACxD,QAAM,OAAO,OAAO;AACpB,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,QAAQ;AACd,MAAI,CAAC,OAAO,QAAQ;AAAE,eAAW,uBAAuB;AAAG;AAAA,EAAQ;AACnE,aAAW,KAAK;AAClB;AAEA,eAAe,WAAW,KAAiB,MAA8B;AACvE,QAAM,SAAS,MAAM,IAAI,wBAAwB,CAAC,CAAC;AACnD,QAAM,OAAO,OAAO;AACpB,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,QAAQ;AACd,MAAI,CAAC,OAAO,QAAQ;AAAE,eAAW,mBAAmB;AAAG;AAAA,EAAQ;AAC/D,aAAW,KAAK;AAClB;","names":[]}
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/help/account.ts
4
+ var MODULE_HELP = `
5
+ Usage: bithumb account <command> [options]
6
+
7
+ Commands:
8
+ balance Get account balances
9
+ order-chance Get order chance for a market
10
+ wallet-status Get wallet deposit/withdrawal status
11
+ api-keys Get API key list
12
+
13
+ Run bithumb account <command> --help for command-specific options.
14
+
15
+ Examples:
16
+ bithumb account balance
17
+ bithumb account order-chance --market KRW-BTC
18
+ bithumb account wallet-status
19
+ `;
20
+ var BALANCE_HELP = `
21
+ Usage: bithumb account balance [options]
22
+
23
+ Get balances for all currencies in the account.
24
+
25
+ Required:
26
+ (none)
27
+
28
+ Options:
29
+ (none)
30
+
31
+ Examples:
32
+ bithumb account balance
33
+ bithumb account balance --json
34
+ `;
35
+ var ORDER_CHANCE_HELP = `
36
+ Usage: bithumb account order-chance --market <market> [options]
37
+
38
+ Get order chance (available balances and order constraints) for a market.
39
+
40
+ Required:
41
+ --market <market> Market identifier (e.g., KRW-BTC)
42
+
43
+ Options:
44
+ (none)
45
+
46
+ Examples:
47
+ bithumb account order-chance --market KRW-BTC
48
+ bithumb account order-chance --market KRW-ETH --json
49
+ `;
50
+ var WALLET_STATUS_HELP = `
51
+ Usage: bithumb account wallet-status [options]
52
+
53
+ Get wallet deposit/withdrawal status for each supported currency.
54
+
55
+ Required:
56
+ (none)
57
+
58
+ Options:
59
+ (none)
60
+
61
+ Examples:
62
+ bithumb account wallet-status
63
+ bithumb account wallet-status --json
64
+ `;
65
+ var API_KEYS_HELP = `
66
+ Usage: bithumb account api-keys [options]
67
+
68
+ Get the list of API keys associated with the account.
69
+
70
+ Required:
71
+ (none)
72
+
73
+ Options:
74
+ (none)
75
+
76
+ Examples:
77
+ bithumb account api-keys
78
+ bithumb account api-keys --json
79
+ `;
80
+ var ACTION_HELP = {
81
+ balance: BALANCE_HELP,
82
+ "order-chance": ORDER_CHANCE_HELP,
83
+ "wallet-status": WALLET_STATUS_HELP,
84
+ "api-keys": API_KEYS_HELP
85
+ };
86
+ export {
87
+ ACTION_HELP,
88
+ MODULE_HELP
89
+ };
90
+ //# sourceMappingURL=account-YNPFEHQT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/help/account.ts"],"sourcesContent":["export const MODULE_HELP = `\nUsage: bithumb account <command> [options]\n\nCommands:\n balance Get account balances\n order-chance Get order chance for a market\n wallet-status Get wallet deposit/withdrawal status\n api-keys Get API key list\n\nRun bithumb account <command> --help for command-specific options.\n\nExamples:\n bithumb account balance\n bithumb account order-chance --market KRW-BTC\n bithumb account wallet-status\n`;\n\nconst BALANCE_HELP = `\nUsage: bithumb account balance [options]\n\nGet balances for all currencies in the account.\n\nRequired:\n (none)\n\nOptions:\n (none)\n\nExamples:\n bithumb account balance\n bithumb account balance --json\n`;\n\nconst ORDER_CHANCE_HELP = `\nUsage: bithumb account order-chance --market <market> [options]\n\nGet order chance (available balances and order constraints) for a market.\n\nRequired:\n --market <market> Market identifier (e.g., KRW-BTC)\n\nOptions:\n (none)\n\nExamples:\n bithumb account order-chance --market KRW-BTC\n bithumb account order-chance --market KRW-ETH --json\n`;\n\nconst WALLET_STATUS_HELP = `\nUsage: bithumb account wallet-status [options]\n\nGet wallet deposit/withdrawal status for each supported currency.\n\nRequired:\n (none)\n\nOptions:\n (none)\n\nExamples:\n bithumb account wallet-status\n bithumb account wallet-status --json\n`;\n\nconst API_KEYS_HELP = `\nUsage: bithumb account api-keys [options]\n\nGet the list of API keys associated with the account.\n\nRequired:\n (none)\n\nOptions:\n (none)\n\nExamples:\n bithumb account api-keys\n bithumb account api-keys --json\n`;\n\nexport const ACTION_HELP: Record<string, string> = {\n balance: BALANCE_HELP,\n \"order-chance\": ORDER_CHANCE_HELP,\n \"wallet-status\": WALLET_STATUS_HELP,\n \"api-keys\": API_KEYS_HELP,\n};\n"],"mappings":";;;AAAO,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB3B,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBrB,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB1B,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB3B,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBf,IAAM,cAAsC;AAAA,EACjD,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,YAAY;AACd;","names":[]}
@@ -0,0 +1,143 @@
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
+ "order-id": { type: "string" },
30
+ "order-ids": { type: "string" },
31
+ "client-order-ids": { type: "string" },
32
+ "order-by": { type: "string" },
33
+ cursor: { type: "string" },
34
+ "days-ago": { type: "string" },
35
+ "converting-price-unit": { type: "string" },
36
+ page: { type: "string" },
37
+ limit: { type: "string" },
38
+ tool: { type: "string" },
39
+ since: { type: "string" },
40
+ level: { type: "string" },
41
+ currency: { type: "string" },
42
+ "net-type": { type: "string" },
43
+ address: { type: "string" },
44
+ "secondary-address": { type: "string" },
45
+ "exchange-name": { type: "string" },
46
+ "receiver-type": { type: "string" },
47
+ "receiver-ko-name": { type: "string" },
48
+ "receiver-en-name": { type: "string" },
49
+ "receiver-corp-ko-name": { type: "string" },
50
+ "receiver-corp-en-name": { type: "string" },
51
+ amount: { type: "string" },
52
+ "two-factor-type": { type: "string" },
53
+ txids: { type: "string" },
54
+ "withdrawal-id": { type: "string" },
55
+ duration: { type: "string" },
56
+ frequency: { type: "string" },
57
+ "algo-order-id": { type: "string" },
58
+ "next-key": { type: "string" },
59
+ file: { type: "string" }
60
+ };
61
+ function parseCli(argv) {
62
+ const { values: raw, positionals } = parseArgs({
63
+ args: argv,
64
+ options: CLI_OPTIONS,
65
+ allowPositionals: true,
66
+ strict: false
67
+ });
68
+ const values = {
69
+ profile: raw.profile,
70
+ json: raw.json,
71
+ help: raw.help,
72
+ version: raw.version,
73
+ verbose: raw.verbose,
74
+ client: raw.client,
75
+ modules: raw.modules,
76
+ readOnly: raw["read-only"],
77
+ unit: raw.unit,
78
+ count: raw.count,
79
+ to: raw.to,
80
+ isDetails: raw["is-details"],
81
+ market: raw.market,
82
+ uuid: raw.uuid,
83
+ clientOrderId: raw["client-order-id"],
84
+ side: raw.side,
85
+ // Canonical: --order-type. Deprecated alias: --ord-type. Prefer canonical.
86
+ ordType: raw["order-type"] ?? raw["ord-type"],
87
+ ordTypeFromDeprecatedAlias: raw["order-type"] === void 0 && raw["ord-type"] !== void 0,
88
+ ordTypeConflict: raw["order-type"] !== void 0 && raw["ord-type"] !== void 0,
89
+ price: raw.price,
90
+ volume: raw.volume,
91
+ state: raw.state,
92
+ states: raw.states,
93
+ uuids: raw.uuids,
94
+ orderId: raw["order-id"],
95
+ orderIds: raw["order-ids"],
96
+ clientOrderIds: raw["client-order-ids"],
97
+ orderBy: raw["order-by"],
98
+ cursor: raw.cursor,
99
+ daysAgo: raw["days-ago"],
100
+ convertingPriceUnit: raw["converting-price-unit"],
101
+ page: raw.page,
102
+ limit: raw.limit,
103
+ tool: raw.tool,
104
+ since: raw.since,
105
+ level: raw.level,
106
+ currency: raw.currency,
107
+ netType: raw["net-type"],
108
+ address: raw.address,
109
+ secondaryAddress: raw["secondary-address"],
110
+ exchangeName: raw["exchange-name"],
111
+ receiverType: raw["receiver-type"],
112
+ receiverKoName: raw["receiver-ko-name"],
113
+ receiverEnName: raw["receiver-en-name"],
114
+ receiverCorpKoName: raw["receiver-corp-ko-name"],
115
+ receiverCorpEnName: raw["receiver-corp-en-name"],
116
+ amount: raw.amount,
117
+ twoFactorType: raw["two-factor-type"],
118
+ txids: raw.txids,
119
+ withdrawalId: raw["withdrawal-id"],
120
+ duration: raw.duration,
121
+ frequency: raw.frequency,
122
+ algoOrderId: raw["algo-order-id"],
123
+ nextKey: raw["next-key"],
124
+ file: raw.file
125
+ };
126
+ return { values, positionals };
127
+ }
128
+ function toArray(value) {
129
+ if (!value) return void 0;
130
+ return value.split(",").map((s) => s.trim()).filter(Boolean);
131
+ }
132
+ function toNumber(value) {
133
+ if (value === void 0 || value === null) return void 0;
134
+ const n = Number(value);
135
+ return Number.isNaN(n) ? void 0 : n;
136
+ }
137
+
138
+ export {
139
+ parseCli,
140
+ toArray,
141
+ toNumber
142
+ };
143
+ //# sourceMappingURL=chunk-AUQ7MB6O.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 orderId?: string;\n orderIds?: 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 \"order-id\": { type: \"string\" },\n \"order-ids\": { 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 orderId: raw[\"order-id\"] as string | undefined,\n orderIds: raw[\"order-ids\"] 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,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":[]}