wjx-cli 0.1.2 → 0.1.3
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/dist/commands/diagnostics.js +11 -3
- package/dist/commands/diagnostics.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +77 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/auth.js +3 -2
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config.d.ts +13 -0
- package/dist/lib/config.js +42 -0
- package/dist/lib/config.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@ import { listSurveys } from "wjx-api-sdk";
|
|
|
2
2
|
import { getCredentials } from "../lib/auth.js";
|
|
3
3
|
import { formatOutput } from "../lib/output.js";
|
|
4
4
|
import { handleError } from "../lib/errors.js";
|
|
5
|
+
import { loadConfig, CONFIG_PATH } from "../lib/config.js";
|
|
5
6
|
export function registerDiagnosticCommands(program) {
|
|
6
7
|
// --- whoami ---
|
|
7
8
|
program
|
|
@@ -34,6 +35,13 @@ export function registerDiagnosticCommands(program) {
|
|
|
34
35
|
.action(async () => {
|
|
35
36
|
try {
|
|
36
37
|
const checks = [];
|
|
38
|
+
// 0. Config file
|
|
39
|
+
const config = loadConfig();
|
|
40
|
+
checks.push({
|
|
41
|
+
check: "配置文件",
|
|
42
|
+
status: config ? "ok" : "info",
|
|
43
|
+
detail: config ? CONFIG_PATH : `未找到 (运行 wjx init 创建)`,
|
|
44
|
+
});
|
|
37
45
|
// 1. Node version
|
|
38
46
|
const nodeVersion = process.version;
|
|
39
47
|
const major = parseInt(nodeVersion.slice(1), 10);
|
|
@@ -43,21 +51,21 @@ export function registerDiagnosticCommands(program) {
|
|
|
43
51
|
detail: `${nodeVersion}${major < 20 ? " (建议 >= 20)" : ""}`,
|
|
44
52
|
});
|
|
45
53
|
// 2. WJX_API_KEY set?
|
|
46
|
-
const apiKey = program.opts().apiKey || process.env.WJX_API_KEY;
|
|
54
|
+
const apiKey = program.opts().apiKey || process.env.WJX_API_KEY || config?.apiKey;
|
|
47
55
|
checks.push({
|
|
48
56
|
check: "WJX_API_KEY",
|
|
49
57
|
status: apiKey ? "ok" : "fail",
|
|
50
58
|
detail: apiKey ? `已设置 (${apiKey.slice(0, 8)}...)` : "未设置",
|
|
51
59
|
});
|
|
52
60
|
// 3. WJX_CORP_ID
|
|
53
|
-
const corpId = process.env.WJX_CORP_ID;
|
|
61
|
+
const corpId = process.env.WJX_CORP_ID || config?.corpId;
|
|
54
62
|
checks.push({
|
|
55
63
|
check: "WJX_CORP_ID",
|
|
56
64
|
status: corpId ? "ok" : "info",
|
|
57
65
|
detail: corpId ? `已设置 (${corpId})` : "未设置(通讯录功能需要)",
|
|
58
66
|
});
|
|
59
67
|
// 4. WJX_BASE_URL
|
|
60
|
-
const baseUrl = process.env.WJX_BASE_URL || "https://www.wjx.cn";
|
|
68
|
+
const baseUrl = process.env.WJX_BASE_URL || config?.baseUrl || "https://www.wjx.cn";
|
|
61
69
|
checks.push({
|
|
62
70
|
check: "WJX_BASE_URL",
|
|
63
71
|
status: "ok",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/commands/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/commands/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin, stderr } from "node:process";
|
|
3
|
+
import { listSurveys } from "wjx-api-sdk";
|
|
4
|
+
import { loadConfig, saveConfig, CONFIG_PATH } from "../lib/config.js";
|
|
5
|
+
export function registerInitCommands(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("init")
|
|
8
|
+
.description("初始化配置(交互式设置 API Key、Base URL、Corp ID)")
|
|
9
|
+
.action(async () => {
|
|
10
|
+
const rl = createInterface({ input: stdin, output: stderr });
|
|
11
|
+
try {
|
|
12
|
+
// Check existing config
|
|
13
|
+
const existing = loadConfig();
|
|
14
|
+
if (existing) {
|
|
15
|
+
const masked = existing.apiKey.length > 8
|
|
16
|
+
? existing.apiKey.slice(0, 8) + "..."
|
|
17
|
+
: "***";
|
|
18
|
+
stderr.write(`已存在配置文件: ${CONFIG_PATH}\n`);
|
|
19
|
+
stderr.write(` apiKey: ${masked}\n`);
|
|
20
|
+
if (existing.baseUrl)
|
|
21
|
+
stderr.write(` baseUrl: ${existing.baseUrl}\n`);
|
|
22
|
+
if (existing.corpId)
|
|
23
|
+
stderr.write(` corpId: ${existing.corpId}\n`);
|
|
24
|
+
const overwrite = await rl.question("\n覆盖现有配置?(y/N) ");
|
|
25
|
+
if (overwrite.trim().toLowerCase() !== "y") {
|
|
26
|
+
stderr.write("已取消。\n");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
stderr.write("\n");
|
|
30
|
+
}
|
|
31
|
+
// Prompt API Key (required)
|
|
32
|
+
let apiKey = "";
|
|
33
|
+
while (!apiKey) {
|
|
34
|
+
const input = await rl.question("WJX_API_KEY (必填): ");
|
|
35
|
+
apiKey = input.trim();
|
|
36
|
+
if (!apiKey) {
|
|
37
|
+
stderr.write("API Key 不能为空。\n");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Prompt Base URL (optional)
|
|
41
|
+
const baseUrlInput = await rl.question("WJX_BASE_URL (可选, 默认 https://www.wjx.cn): ");
|
|
42
|
+
const baseUrl = baseUrlInput.trim() || undefined;
|
|
43
|
+
// Prompt Corp ID (optional)
|
|
44
|
+
const corpIdInput = await rl.question("WJX_CORP_ID (可选, 通讯录功能需要): ");
|
|
45
|
+
const corpId = corpIdInput.trim() || undefined;
|
|
46
|
+
// Validate API Key
|
|
47
|
+
stderr.write("\n正在验证 API Key...\n");
|
|
48
|
+
try {
|
|
49
|
+
const result = await listSurveys({ page_index: 1, page_size: 1 }, { apiKey });
|
|
50
|
+
if (result.result === false) {
|
|
51
|
+
stderr.write(`! API Key 验证失败: ${result.errormsg}\n`);
|
|
52
|
+
stderr.write(" 配置仍将保存,请检查 Key 是否正确。\n");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
stderr.write("OK API Key 验证成功。\n");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
stderr.write(`! 无法连接 API: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
60
|
+
stderr.write(" 配置仍将保存。\n");
|
|
61
|
+
}
|
|
62
|
+
// Save config
|
|
63
|
+
const config = { apiKey };
|
|
64
|
+
if (baseUrl)
|
|
65
|
+
config.baseUrl = baseUrl;
|
|
66
|
+
if (corpId)
|
|
67
|
+
config.corpId = corpId;
|
|
68
|
+
saveConfig(config);
|
|
69
|
+
stderr.write(`\nOK 配置已保存到 ${CONFIG_PATH}\n`);
|
|
70
|
+
stderr.write("提示: 你也可以直接编辑该文件来修改配置。\n");
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
rl.close();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -11,8 +11,12 @@ import { registerUserSystemCommands } from "./commands/user-system.js";
|
|
|
11
11
|
import { registerAccountCommands } from "./commands/account.js";
|
|
12
12
|
import { registerSsoCommands } from "./commands/sso.js";
|
|
13
13
|
import { registerAnalyticsCommands } from "./commands/analytics.js";
|
|
14
|
+
import { registerInitCommands } from "./commands/init.js";
|
|
14
15
|
import { readStdin } from "./lib/stdin.js";
|
|
15
16
|
import { handleError } from "./lib/errors.js";
|
|
17
|
+
import { applyConfigToEnv } from "./lib/config.js";
|
|
18
|
+
// Load ~/.wjxrc config into process.env (env vars take precedence)
|
|
19
|
+
applyConfigToEnv();
|
|
16
20
|
const program = new Command();
|
|
17
21
|
program
|
|
18
22
|
.name("wjx")
|
|
@@ -47,6 +51,7 @@ registerUserSystemCommands(program);
|
|
|
47
51
|
registerAccountCommands(program);
|
|
48
52
|
registerSsoCommands(program);
|
|
49
53
|
registerAnalyticsCommands(program);
|
|
54
|
+
registerInitCommands(program);
|
|
50
55
|
(async () => {
|
|
51
56
|
try {
|
|
52
57
|
await program.parseAsync();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { CliError } from "./errors.js";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
2
3
|
export function getCredentials(globalOpts) {
|
|
3
|
-
const apiKey = globalOpts.apiKey || process.env.WJX_API_KEY;
|
|
4
|
+
const apiKey = globalOpts.apiKey || process.env.WJX_API_KEY || loadConfig()?.apiKey;
|
|
4
5
|
if (!apiKey) {
|
|
5
|
-
throw new CliError("AUTH_ERROR", "WJX_API_KEY 未设置。请通过 --api-key
|
|
6
|
+
throw new CliError("AUTH_ERROR", "WJX_API_KEY 未设置。请通过 --api-key 参数、WJX_API_KEY 环境变量、或运行 wjx init 配置。");
|
|
6
7
|
}
|
|
7
8
|
return { apiKey };
|
|
8
9
|
}
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,cAAc,CAAC,UAA+B;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU,EAAE,EAAE,MAAM,CAAC;IACpF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,YAAY,EACZ,oEAAoE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface WjxConfig {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
corpId?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const CONFIG_PATH: string;
|
|
7
|
+
export declare function loadConfig(): WjxConfig | null;
|
|
8
|
+
export declare function saveConfig(config: WjxConfig): void;
|
|
9
|
+
/**
|
|
10
|
+
* Apply config values to process.env where env vars are not already set.
|
|
11
|
+
* This makes SDK layer (which reads process.env) automatically use config values.
|
|
12
|
+
*/
|
|
13
|
+
export declare function applyConfigToEnv(): void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
export const CONFIG_PATH = process.env.WJX_CONFIG_PATH || join(homedir(), ".wjxrc");
|
|
5
|
+
export function loadConfig() {
|
|
6
|
+
try {
|
|
7
|
+
const raw = readFileSync(CONFIG_PATH, "utf8");
|
|
8
|
+
const parsed = JSON.parse(raw);
|
|
9
|
+
if (typeof parsed === "object" && parsed !== null && typeof parsed.apiKey === "string") {
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function saveConfig(config) {
|
|
19
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", {
|
|
20
|
+
encoding: "utf8",
|
|
21
|
+
mode: 0o600,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Apply config values to process.env where env vars are not already set.
|
|
26
|
+
* This makes SDK layer (which reads process.env) automatically use config values.
|
|
27
|
+
*/
|
|
28
|
+
export function applyConfigToEnv() {
|
|
29
|
+
const config = loadConfig();
|
|
30
|
+
if (!config)
|
|
31
|
+
return;
|
|
32
|
+
if (!process.env.WJX_API_KEY && config.apiKey) {
|
|
33
|
+
process.env.WJX_API_KEY = config.apiKey;
|
|
34
|
+
}
|
|
35
|
+
if (!process.env.WJX_BASE_URL && config.baseUrl) {
|
|
36
|
+
process.env.WJX_BASE_URL = config.baseUrl;
|
|
37
|
+
}
|
|
38
|
+
if (!process.env.WJX_CORP_ID && config.corpId) {
|
|
39
|
+
process.env.WJX_CORP_ID = config.corpId;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAQlC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAEpF,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvF,OAAO,MAAmB,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACjE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1C,CAAC;AACH,CAAC"}
|