wjx-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.
- package/LICENSE +21 -0
- package/README.md +836 -0
- package/dist/commands/account.d.ts +2 -0
- package/dist/commands/account.js +100 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/admin.d.ts +2 -0
- package/dist/commands/admin.js +42 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/analytics.d.ts +2 -0
- package/dist/commands/analytics.js +136 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/contacts.d.ts +2 -0
- package/dist/commands/contacts.js +49 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/department.d.ts +2 -0
- package/dist/commands/department.js +60 -0
- package/dist/commands/department.js.map +1 -0
- package/dist/commands/diagnostics.d.ts +2 -0
- package/dist/commands/diagnostics.js +110 -0
- package/dist/commands/diagnostics.js.map +1 -0
- package/dist/commands/response.d.ts +2 -0
- package/dist/commands/response.js +241 -0
- package/dist/commands/response.js.map +1 -0
- package/dist/commands/sso.d.ts +2 -0
- package/dist/commands/sso.js +79 -0
- package/dist/commands/sso.js.map +1 -0
- package/dist/commands/survey.d.ts +2 -0
- package/dist/commands/survey.js +247 -0
- package/dist/commands/survey.js.map +1 -0
- package/dist/commands/tag.d.ts +2 -0
- package/dist/commands/tag.js +66 -0
- package/dist/commands/tag.js.map +1 -0
- package/dist/commands/user-system.d.ts +2 -0
- package/dist/commands/user-system.js +137 -0
- package/dist/commands/user-system.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +4 -0
- package/dist/lib/auth.js +9 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/command-helpers.d.ts +25 -0
- package/dist/lib/command-helpers.js +64 -0
- package/dist/lib/command-helpers.js.map +1 -0
- package/dist/lib/errors.d.ts +14 -0
- package/dist/lib/errors.js +52 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/output.d.ts +6 -0
- package/dist/lib/output.js +59 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/stdin.d.ts +10 -0
- package/dist/lib/stdin.js +51 -0
- package/dist/lib/stdin.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { listTags, addTag, modifyTag, deleteTag, } from "wjx-api-sdk";
|
|
2
|
+
import { executeCommand, requireField } from "../lib/command-helpers.js";
|
|
3
|
+
export function registerTagCommands(program) {
|
|
4
|
+
const tag = program.command("tag").description("标签管理");
|
|
5
|
+
// --- list ---
|
|
6
|
+
tag
|
|
7
|
+
.command("list")
|
|
8
|
+
.description("列出标签")
|
|
9
|
+
.option("--corpid <s>", "企业ID")
|
|
10
|
+
.action(async (_opts, cmd) => {
|
|
11
|
+
await executeCommand(program, cmd, listTags, (m) => ({
|
|
12
|
+
corpid: m.corpid,
|
|
13
|
+
}));
|
|
14
|
+
});
|
|
15
|
+
// --- add ---
|
|
16
|
+
tag
|
|
17
|
+
.command("add")
|
|
18
|
+
.description("添加标签")
|
|
19
|
+
.option("--child_names <json>", "标签路径JSON数组")
|
|
20
|
+
.option("--corpid <s>", "企业ID")
|
|
21
|
+
.option("--is_radio", "单选标签")
|
|
22
|
+
.action(async (_opts, cmd) => {
|
|
23
|
+
await executeCommand(program, cmd, addTag, (m) => {
|
|
24
|
+
requireField(m, "child_names");
|
|
25
|
+
return {
|
|
26
|
+
child_names: m.child_names,
|
|
27
|
+
corpid: m.corpid,
|
|
28
|
+
is_radio: m.is_radio,
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
// --- modify ---
|
|
33
|
+
tag
|
|
34
|
+
.command("modify")
|
|
35
|
+
.description("修改标签")
|
|
36
|
+
.option("--tp_id <s>", "标签组ID")
|
|
37
|
+
.option("--tp_name <s>", "标签组名称")
|
|
38
|
+
.option("--child_names <json>", "标签对象JSON数组")
|
|
39
|
+
.option("--corpid <s>", "企业ID")
|
|
40
|
+
.action(async (_opts, cmd) => {
|
|
41
|
+
await executeCommand(program, cmd, modifyTag, (m) => {
|
|
42
|
+
requireField(m, "tp_id");
|
|
43
|
+
return {
|
|
44
|
+
tp_id: m.tp_id,
|
|
45
|
+
tp_name: m.tp_name,
|
|
46
|
+
child_names: m.child_names,
|
|
47
|
+
corpid: m.corpid,
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// --- delete ---
|
|
52
|
+
tag
|
|
53
|
+
.command("delete")
|
|
54
|
+
.description("删除标签")
|
|
55
|
+
.option("--type <s>", "类型: 1=按ID, 2=按名称")
|
|
56
|
+
.option("--tags <json>", "标签标识JSON数组")
|
|
57
|
+
.option("--corpid <s>", "企业ID")
|
|
58
|
+
.action(async (_opts, cmd) => {
|
|
59
|
+
await executeCommand(program, cmd, deleteTag, (m) => {
|
|
60
|
+
requireField(m, "type");
|
|
61
|
+
requireField(m, "tags");
|
|
62
|
+
return { type: m.type, tags: m.tags, corpid: m.corpid };
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=tag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { addParticipants, modifyParticipants, deleteParticipants, bindActivity, querySurveyBinding, queryUserSurveys, } from "wjx-api-sdk";
|
|
2
|
+
import { executeCommand, strictInt, requireField } from "../lib/command-helpers.js";
|
|
3
|
+
export function registerUserSystemCommands(program) {
|
|
4
|
+
const userSystem = program.command("user-system").description("用户系统管理");
|
|
5
|
+
// --- add-participants ---
|
|
6
|
+
userSystem
|
|
7
|
+
.command("add-participants")
|
|
8
|
+
.description("添加参与者")
|
|
9
|
+
.option("--username <s>", "用户名")
|
|
10
|
+
.option("--users <json>", "参与者JSON")
|
|
11
|
+
.option("--sysid <n>", "系统ID", strictInt)
|
|
12
|
+
.action(async (_opts, cmd) => {
|
|
13
|
+
await executeCommand(program, cmd, addParticipants, (m) => {
|
|
14
|
+
requireField(m, "username");
|
|
15
|
+
requireField(m, "users");
|
|
16
|
+
requireField(m, "sysid");
|
|
17
|
+
return { username: m.username, users: m.users, sysid: m.sysid };
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
// --- modify-participants ---
|
|
21
|
+
userSystem
|
|
22
|
+
.command("modify-participants")
|
|
23
|
+
.description("修改参与者")
|
|
24
|
+
.option("--username <s>", "用户名")
|
|
25
|
+
.option("--users <json>", "参与者JSON")
|
|
26
|
+
.option("--sysid <n>", "系统ID", strictInt)
|
|
27
|
+
.action(async (_opts, cmd) => {
|
|
28
|
+
await executeCommand(program, cmd, modifyParticipants, (m) => {
|
|
29
|
+
requireField(m, "username");
|
|
30
|
+
requireField(m, "users");
|
|
31
|
+
requireField(m, "sysid");
|
|
32
|
+
return { username: m.username, users: m.users, sysid: m.sysid };
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
// --- delete-participants ---
|
|
36
|
+
userSystem
|
|
37
|
+
.command("delete-participants")
|
|
38
|
+
.description("删除参与者")
|
|
39
|
+
.option("--username <s>", "用户名")
|
|
40
|
+
.option("--uids <json>", "用户ID JSON数组")
|
|
41
|
+
.option("--sysid <n>", "系统ID", strictInt)
|
|
42
|
+
.action(async (_opts, cmd) => {
|
|
43
|
+
await executeCommand(program, cmd, deleteParticipants, (m) => {
|
|
44
|
+
requireField(m, "username");
|
|
45
|
+
requireField(m, "uids");
|
|
46
|
+
requireField(m, "sysid");
|
|
47
|
+
return { username: m.username, uids: m.uids, sysid: m.sysid };
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
// --- bind ---
|
|
51
|
+
userSystem
|
|
52
|
+
.command("bind")
|
|
53
|
+
.description("绑定问卷到用户系统")
|
|
54
|
+
.option("--username <s>", "用户名")
|
|
55
|
+
.option("--vid <n>", "问卷ID", strictInt)
|
|
56
|
+
.option("--sysid <n>", "系统ID", strictInt)
|
|
57
|
+
.option("--uids <s>", "参与者ID列表")
|
|
58
|
+
.option("--answer_times <n>", "可答次数", strictInt)
|
|
59
|
+
.option("--can_chg_answer", "允许修改答案")
|
|
60
|
+
.option("--can_view_result", "允许查看结果")
|
|
61
|
+
.option("--can_hide_qlist <n>", "隐藏问卷列表", strictInt)
|
|
62
|
+
.action(async (_opts, cmd) => {
|
|
63
|
+
await executeCommand(program, cmd, bindActivity, (m) => {
|
|
64
|
+
requireField(m, "username");
|
|
65
|
+
requireField(m, "vid");
|
|
66
|
+
requireField(m, "sysid");
|
|
67
|
+
requireField(m, "uids");
|
|
68
|
+
return {
|
|
69
|
+
username: m.username,
|
|
70
|
+
vid: m.vid,
|
|
71
|
+
sysid: m.sysid,
|
|
72
|
+
uids: m.uids,
|
|
73
|
+
answer_times: m.answer_times,
|
|
74
|
+
can_chg_answer: m.can_chg_answer,
|
|
75
|
+
can_view_result: m.can_view_result,
|
|
76
|
+
can_hide_qlist: m.can_hide_qlist,
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
// --- query-binding ---
|
|
81
|
+
userSystem
|
|
82
|
+
.command("query-binding")
|
|
83
|
+
.description("查询问卷绑定关系")
|
|
84
|
+
.option("--username <s>", "用户名")
|
|
85
|
+
.option("--vid <n>", "问卷ID", strictInt)
|
|
86
|
+
.option("--sysid <n>", "系统ID", strictInt)
|
|
87
|
+
.option("--page_index <n>", "页码", strictInt)
|
|
88
|
+
.option("--page_size <n>", "每页数量", strictInt)
|
|
89
|
+
.option("--join_status <n>", "参与状态", strictInt)
|
|
90
|
+
.option("--day <s>", "按天筛选")
|
|
91
|
+
.option("--week <s>", "按周筛选")
|
|
92
|
+
.option("--month <s>", "按月筛选")
|
|
93
|
+
.option("--force_join_times", "强制参与次数")
|
|
94
|
+
.action(async (_opts, cmd) => {
|
|
95
|
+
await executeCommand(program, cmd, querySurveyBinding, (m) => {
|
|
96
|
+
requireField(m, "username");
|
|
97
|
+
requireField(m, "vid");
|
|
98
|
+
requireField(m, "sysid");
|
|
99
|
+
return {
|
|
100
|
+
username: m.username,
|
|
101
|
+
vid: m.vid,
|
|
102
|
+
sysid: m.sysid,
|
|
103
|
+
page_index: m.page_index,
|
|
104
|
+
page_size: m.page_size,
|
|
105
|
+
join_status: m.join_status,
|
|
106
|
+
day: m.day,
|
|
107
|
+
week: m.week,
|
|
108
|
+
month: m.month,
|
|
109
|
+
force_join_times: m.force_join_times,
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
// --- query-surveys ---
|
|
114
|
+
userSystem
|
|
115
|
+
.command("query-surveys")
|
|
116
|
+
.description("查询用户关联问卷")
|
|
117
|
+
.option("--username <s>", "用户名")
|
|
118
|
+
.option("--uid <s>", "参与者ID")
|
|
119
|
+
.option("--sysid <n>", "系统ID", strictInt)
|
|
120
|
+
.option("--page_index <n>", "页码", strictInt)
|
|
121
|
+
.option("--page_size <n>", "每页数量", strictInt)
|
|
122
|
+
.action(async (_opts, cmd) => {
|
|
123
|
+
await executeCommand(program, cmd, queryUserSurveys, (m) => {
|
|
124
|
+
requireField(m, "username");
|
|
125
|
+
requireField(m, "uid");
|
|
126
|
+
requireField(m, "sysid");
|
|
127
|
+
return {
|
|
128
|
+
username: m.username,
|
|
129
|
+
uid: m.uid,
|
|
130
|
+
sysid: m.sysid,
|
|
131
|
+
page_index: m.page_index,
|
|
132
|
+
page_size: m.page_size,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=user-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-system.js","sourceRoot":"","sources":["../../src/commands/user-system.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command, CommanderError } from "commander";
|
|
3
|
+
import { registerSurveyCommands } from "./commands/survey.js";
|
|
4
|
+
import { registerDiagnosticCommands } from "./commands/diagnostics.js";
|
|
5
|
+
import { registerResponseCommands } from "./commands/response.js";
|
|
6
|
+
import { registerContactsCommands } from "./commands/contacts.js";
|
|
7
|
+
import { registerDepartmentCommands } from "./commands/department.js";
|
|
8
|
+
import { registerAdminCommands } from "./commands/admin.js";
|
|
9
|
+
import { registerTagCommands } from "./commands/tag.js";
|
|
10
|
+
import { registerUserSystemCommands } from "./commands/user-system.js";
|
|
11
|
+
import { registerAccountCommands } from "./commands/account.js";
|
|
12
|
+
import { registerSsoCommands } from "./commands/sso.js";
|
|
13
|
+
import { registerAnalyticsCommands } from "./commands/analytics.js";
|
|
14
|
+
import { readStdin } from "./lib/stdin.js";
|
|
15
|
+
import { handleError } from "./lib/errors.js";
|
|
16
|
+
const program = new Command();
|
|
17
|
+
program
|
|
18
|
+
.name("wjx")
|
|
19
|
+
.description("问卷星 (Wenjuanxing) CLI — AI Agent 原生命令行工具")
|
|
20
|
+
.version("0.1.0")
|
|
21
|
+
.option("--token <token>", "WJX API Token(或设置 WJX_TOKEN 环境变量)")
|
|
22
|
+
.option("--json", "JSON 输出(默认)")
|
|
23
|
+
.option("--table", "表格输出")
|
|
24
|
+
.option("--verbose", "详细输出")
|
|
25
|
+
.option("--stdin", "从 stdin 读取 JSON 参数");
|
|
26
|
+
// Prevent Commander from calling process.exit on errors — we handle it ourselves
|
|
27
|
+
program.exitOverride();
|
|
28
|
+
// Global preAction hook: read stdin and merge with command opts
|
|
29
|
+
program.hook("preAction", async (thisCommand, actionCommand) => {
|
|
30
|
+
const globalOpts = thisCommand.opts();
|
|
31
|
+
if (globalOpts.stdin) {
|
|
32
|
+
const stdinData = await readStdin();
|
|
33
|
+
if (Object.keys(stdinData).length > 0) {
|
|
34
|
+
// Store stdin data on the action command for executeCommand to pick up
|
|
35
|
+
actionCommand.__stdinData = stdinData;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
registerSurveyCommands(program);
|
|
40
|
+
registerDiagnosticCommands(program);
|
|
41
|
+
registerResponseCommands(program);
|
|
42
|
+
registerContactsCommands(program);
|
|
43
|
+
registerDepartmentCommands(program);
|
|
44
|
+
registerAdminCommands(program);
|
|
45
|
+
registerTagCommands(program);
|
|
46
|
+
registerUserSystemCommands(program);
|
|
47
|
+
registerAccountCommands(program);
|
|
48
|
+
registerSsoCommands(program);
|
|
49
|
+
registerAnalyticsCommands(program);
|
|
50
|
+
(async () => {
|
|
51
|
+
try {
|
|
52
|
+
await program.parseAsync();
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
// Commander throws CommanderError for --help, --version, missing args, etc.
|
|
56
|
+
if (err instanceof CommanderError) {
|
|
57
|
+
// help and version are normal exits
|
|
58
|
+
if (err.code === "commander.helpDisplayed" || err.code === "commander.version") {
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
// Missing required option, unknown option, etc. — treat as INPUT_ERROR
|
|
62
|
+
handleError(err);
|
|
63
|
+
}
|
|
64
|
+
handleError(err);
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CliError } from "./errors.js";
|
|
2
|
+
export function getCredentials(globalOpts) {
|
|
3
|
+
const token = globalOpts.token || process.env.WJX_TOKEN;
|
|
4
|
+
if (!token) {
|
|
5
|
+
throw new CliError("AUTH_ERROR", "WJX_TOKEN 未设置。请通过 --token 参数或 WJX_TOKEN 环境变量提供。");
|
|
6
|
+
}
|
|
7
|
+
return { token };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,cAAc,CAAC,UAA8B;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAChB,YAAY,EACZ,iDAAiD,CAClD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import type { WjxApiResponse } from "wjx-api-sdk";
|
|
3
|
+
/**
|
|
4
|
+
* Strict integer parser. Rejects garbage like "123abc".
|
|
5
|
+
*/
|
|
6
|
+
export declare function strictInt(v: string): number;
|
|
7
|
+
/**
|
|
8
|
+
* Require a field in the merged input. Throws INPUT_ERROR if missing.
|
|
9
|
+
*/
|
|
10
|
+
export declare function requireField(merged: Record<string, unknown>, field: string, label?: string): void;
|
|
11
|
+
interface ExecuteOpts {
|
|
12
|
+
noAuth?: boolean;
|
|
13
|
+
}
|
|
14
|
+
type SdkFunction = (input: any, creds: any, ...rest: any[]) => Promise<WjxApiResponse<any>>;
|
|
15
|
+
/**
|
|
16
|
+
* Central command executor.
|
|
17
|
+
* - Merges stdin data with CLI opts (source-aware)
|
|
18
|
+
* - Gets credentials (unless noAuth)
|
|
19
|
+
* - Calls SDK function
|
|
20
|
+
* - Checks result===false (P0 fix)
|
|
21
|
+
* - Formats output to stdout
|
|
22
|
+
* - Routes errors to stderr JSON with correct exit codes
|
|
23
|
+
*/
|
|
24
|
+
export declare function executeCommand(program: Command, actionCommand: Command, sdkFn: SdkFunction, buildInput: (merged: Record<string, unknown>) => Record<string, unknown>, opts?: ExecuteOpts): Promise<void>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { getCredentials } from "./auth.js";
|
|
2
|
+
import { formatOutput } from "./output.js";
|
|
3
|
+
import { CliError, handleError } from "./errors.js";
|
|
4
|
+
import { mergeStdinWithOpts } from "./stdin.js";
|
|
5
|
+
/**
|
|
6
|
+
* Strict integer parser. Rejects garbage like "123abc".
|
|
7
|
+
*/
|
|
8
|
+
export function strictInt(v) {
|
|
9
|
+
const n = Number(v);
|
|
10
|
+
if (!Number.isInteger(n)) {
|
|
11
|
+
throw new CliError("INPUT_ERROR", `Invalid integer: "${v}"`);
|
|
12
|
+
}
|
|
13
|
+
return n;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Require a field in the merged input. Throws INPUT_ERROR if missing.
|
|
17
|
+
*/
|
|
18
|
+
export function requireField(merged, field, label) {
|
|
19
|
+
if (merged[field] === undefined || merged[field] === null) {
|
|
20
|
+
throw new CliError("INPUT_ERROR", `Missing required option: --${label || field}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Central command executor.
|
|
25
|
+
* - Merges stdin data with CLI opts (source-aware)
|
|
26
|
+
* - Gets credentials (unless noAuth)
|
|
27
|
+
* - Calls SDK function
|
|
28
|
+
* - Checks result===false (P0 fix)
|
|
29
|
+
* - Formats output to stdout
|
|
30
|
+
* - Routes errors to stderr JSON with correct exit codes
|
|
31
|
+
*/
|
|
32
|
+
export async function executeCommand(program, actionCommand, sdkFn, buildInput, opts = {}) {
|
|
33
|
+
try {
|
|
34
|
+
// Source-aware merge: stdin base + CLI-explicit overrides
|
|
35
|
+
const stdinData = actionCommand.__stdinData;
|
|
36
|
+
const commandOpts = actionCommand.opts();
|
|
37
|
+
let merged;
|
|
38
|
+
if (stdinData && Object.keys(stdinData).length > 0) {
|
|
39
|
+
merged = mergeStdinWithOpts(stdinData, actionCommand);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
merged = { ...commandOpts };
|
|
43
|
+
}
|
|
44
|
+
const input = buildInput(merged);
|
|
45
|
+
if (opts.noAuth) {
|
|
46
|
+
// Local commands (e.g. buildSurveyUrl) — call with input only
|
|
47
|
+
const localFn = sdkFn;
|
|
48
|
+
const result = localFn(input);
|
|
49
|
+
formatOutput(result, program.opts());
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const creds = getCredentials(program.opts());
|
|
53
|
+
const result = await sdkFn(input, creds);
|
|
54
|
+
// P0 fix: detect SDK API failure response
|
|
55
|
+
if (result.result === false) {
|
|
56
|
+
throw new CliError("API_ERROR", result.errormsg || "API request failed");
|
|
57
|
+
}
|
|
58
|
+
formatOutput(result, program.opts());
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
handleError(e);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=command-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../src/lib/command-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAA+B,EAAE,KAAa,EAAE,KAAc;IACzF,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,8BAA8B,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AASD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,aAAsB,EACtB,KAAkB,EAClB,UAAwE,EACxE,OAAoB,EAAE;IAEtB,IAAI,CAAC;QACH,0DAA0D;QAC1D,MAAM,SAAS,GAAI,aAAoD,CAAC,WAAkD,CAAC;QAC3H,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,MAA+B,CAAC;QAEpC,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,8DAA8D;YAC9D,MAAM,OAAO,GAAG,KAA+D,CAAC;YAChF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEzC,0CAA0C;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,QAAQ,CAChB,WAAW,EACX,MAAM,CAAC,QAAQ,IAAI,oBAAoB,CACxC,CAAC;QACJ,CAAC;QAED,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,WAAW,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ErrorCode = "API_ERROR" | "INPUT_ERROR" | "AUTH_ERROR";
|
|
2
|
+
export declare class CliError extends Error {
|
|
3
|
+
readonly code: ErrorCode;
|
|
4
|
+
readonly exitCode: number;
|
|
5
|
+
constructor(code: ErrorCode, message: string);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Write structured JSON error to stderr and exit.
|
|
9
|
+
*/
|
|
10
|
+
export declare function stderrJson(code: ErrorCode, message: string): never;
|
|
11
|
+
/**
|
|
12
|
+
* Central error handler. Classifies the error, writes stderr JSON, exits.
|
|
13
|
+
*/
|
|
14
|
+
export declare function handleError(err: unknown): never;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const EXIT_CODES = {
|
|
2
|
+
API_ERROR: 1,
|
|
3
|
+
AUTH_ERROR: 1,
|
|
4
|
+
INPUT_ERROR: 2,
|
|
5
|
+
};
|
|
6
|
+
export class CliError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
exitCode;
|
|
9
|
+
constructor(code, message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "CliError";
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.exitCode = EXIT_CODES[code];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Write structured JSON error to stderr and exit.
|
|
18
|
+
*/
|
|
19
|
+
export function stderrJson(code, message) {
|
|
20
|
+
const exitCode = EXIT_CODES[code];
|
|
21
|
+
process.stderr.write(JSON.stringify({ error: true, message, code, exitCode }) + "\n");
|
|
22
|
+
process.exit(exitCode);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Classify an unknown error into a CliError.
|
|
26
|
+
* SDK validation errors (e.g. validateQuestionsJson) are INPUT_ERROR.
|
|
27
|
+
*/
|
|
28
|
+
function classifyError(err) {
|
|
29
|
+
if (err instanceof CliError)
|
|
30
|
+
return err;
|
|
31
|
+
if (err instanceof SyntaxError) {
|
|
32
|
+
return new CliError("INPUT_ERROR", err.message);
|
|
33
|
+
}
|
|
34
|
+
if (err instanceof Error) {
|
|
35
|
+
// SDK validation errors contain these patterns
|
|
36
|
+
if (err.message.includes("must be valid JSON") ||
|
|
37
|
+
err.message.includes("must be a JSON array") ||
|
|
38
|
+
err.message.includes("missing required field")) {
|
|
39
|
+
return new CliError("INPUT_ERROR", err.message);
|
|
40
|
+
}
|
|
41
|
+
return new CliError("API_ERROR", err.message);
|
|
42
|
+
}
|
|
43
|
+
return new CliError("API_ERROR", String(err));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Central error handler. Classifies the error, writes stderr JSON, exits.
|
|
47
|
+
*/
|
|
48
|
+
export function handleError(err) {
|
|
49
|
+
const cliErr = classifyError(err);
|
|
50
|
+
stderrJson(cliErr.code, cliErr.message);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA8B;IAC5C,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAY;IAChB,QAAQ,CAAS;IAE1B,YAAY,IAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,OAAe;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAChE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,+CAA+C;QAC/C,IACE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC1C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC5C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAC9C,CAAC;YACD,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function formatOutput(data, opts) {
|
|
2
|
+
if (opts.table) {
|
|
3
|
+
printTable(data);
|
|
4
|
+
}
|
|
5
|
+
else {
|
|
6
|
+
console.log(JSON.stringify(data, null, 2));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function printTable(data) {
|
|
10
|
+
if (data === null || data === undefined) {
|
|
11
|
+
console.log("(empty)");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// If it's an API response with result/data, unwrap
|
|
15
|
+
const obj = data;
|
|
16
|
+
const payload = obj.result !== undefined && obj.data !== undefined ? obj.data : data;
|
|
17
|
+
if (Array.isArray(payload)) {
|
|
18
|
+
if (payload.length === 0) {
|
|
19
|
+
console.log("(empty)");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
console.table(payload);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (typeof payload === "object" && payload !== null) {
|
|
26
|
+
const record = payload;
|
|
27
|
+
// If it contains a list/array field, table that
|
|
28
|
+
for (const key of ["survey_list", "list", "items", "data", "rows"]) {
|
|
29
|
+
if (Array.isArray(record[key])) {
|
|
30
|
+
console.table(record[key]);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// activitys is a vid→object map from listSurveys — convert to array
|
|
35
|
+
for (const key of ["activitys", "activities"]) {
|
|
36
|
+
const val = record[key];
|
|
37
|
+
if (val && typeof val === "object" && !Array.isArray(val)) {
|
|
38
|
+
const arr = Object.values(val);
|
|
39
|
+
if (arr.length > 0 && typeof arr[0] === "object") {
|
|
40
|
+
const simplified = arr.map((item) => {
|
|
41
|
+
const r = item;
|
|
42
|
+
return { vid: r.vid, title: r.title, status: r.status, answers: r.answer_valid, created: r.create_date, creator: r.creater };
|
|
43
|
+
});
|
|
44
|
+
console.table(simplified);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Single object — show key/value pairs
|
|
50
|
+
const rows = Object.entries(record).map(([k, v]) => ({
|
|
51
|
+
key: k,
|
|
52
|
+
value: typeof v === "object" ? JSON.stringify(v) : String(v ?? ""),
|
|
53
|
+
}));
|
|
54
|
+
console.table(rows);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
console.log(String(payload));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Read JSON from stdin. Returns parsed object or empty object if no data.
|
|
4
|
+
*/
|
|
5
|
+
export declare function readStdin(): Promise<Record<string, unknown>>;
|
|
6
|
+
/**
|
|
7
|
+
* Source-aware merge: stdin as base, only CLI-explicit args override.
|
|
8
|
+
* Uses Commander's getOptionValueSource() to distinguish user input from defaults.
|
|
9
|
+
*/
|
|
10
|
+
export declare function mergeStdinWithOpts(stdinData: Record<string, unknown>, command: Command): Record<string, unknown>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CliError } from "./errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Read JSON from stdin. Returns parsed object or empty object if no data.
|
|
4
|
+
*/
|
|
5
|
+
export async function readStdin() {
|
|
6
|
+
// If stdin is a TTY (no pipe), return empty
|
|
7
|
+
if (process.stdin.isTTY) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
const chunks = [];
|
|
11
|
+
for await (const chunk of process.stdin) {
|
|
12
|
+
chunks.push(chunk);
|
|
13
|
+
}
|
|
14
|
+
const raw = Buffer.concat(chunks).toString("utf8").trim();
|
|
15
|
+
if (!raw) {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(raw);
|
|
20
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
21
|
+
throw new CliError("INPUT_ERROR", "stdin JSON must be an object, got " + typeof parsed);
|
|
22
|
+
}
|
|
23
|
+
return parsed;
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
if (e instanceof CliError)
|
|
27
|
+
throw e;
|
|
28
|
+
throw new CliError("INPUT_ERROR", `stdin JSON parse error: ${e instanceof Error ? e.message : String(e)}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Source-aware merge: stdin as base, only CLI-explicit args override.
|
|
33
|
+
* Uses Commander's getOptionValueSource() to distinguish user input from defaults.
|
|
34
|
+
*/
|
|
35
|
+
export function mergeStdinWithOpts(stdinData, command) {
|
|
36
|
+
const opts = command.opts();
|
|
37
|
+
const merged = { ...stdinData };
|
|
38
|
+
for (const key of Object.keys(opts)) {
|
|
39
|
+
// Skip internal flags
|
|
40
|
+
if (key === "stdin" || key === "token" || key === "json" || key === "table" || key === "verbose") {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const source = command.getOptionValueSource(key);
|
|
44
|
+
// Only override stdin with explicitly provided CLI values, not defaults
|
|
45
|
+
if (source === "cli") {
|
|
46
|
+
merged[key] = opts[key];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return merged;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=stdin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,4CAA4C;IAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,oCAAoC,GAAG,OAAO,MAAM,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,QAAQ;YAAE,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,QAAQ,CAChB,aAAa,EACb,2BAA2B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAkC,EAClC,OAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,MAAM,GAA4B,EAAE,GAAG,SAAS,EAAE,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,sBAAsB;QACtB,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACjG,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACjD,wEAAwE;QACxE,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|