wjw-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/README.md +29 -0
- package/dist/api/normalize.d.ts +14 -0
- package/dist/api/normalize.d.ts.map +1 -0
- package/dist/api/normalize.js +282 -0
- package/dist/api/normalize.js.map +1 -0
- package/dist/api/project-detail.d.ts +7 -0
- package/dist/api/project-detail.d.ts.map +1 -0
- package/dist/api/project-detail.js +200 -0
- package/dist/api/project-detail.js.map +1 -0
- package/dist/api/structure-narrow.d.ts +21 -0
- package/dist/api/structure-narrow.d.ts.map +1 -0
- package/dist/api/structure-narrow.js +259 -0
- package/dist/api/structure-narrow.js.map +1 -0
- package/dist/api/survey-api.d.ts +48 -0
- package/dist/api/survey-api.d.ts.map +1 -0
- package/dist/api/survey-api.js +551 -0
- package/dist/api/survey-api.js.map +1 -0
- package/dist/argv.d.ts +9 -0
- package/dist/argv.d.ts.map +1 -0
- package/dist/argv.js +62 -0
- package/dist/argv.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/main.d.ts +2 -0
- package/dist/commands/main.d.ts.map +1 -0
- package/dist/commands/main.js +568 -0
- package/dist/commands/main.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +37 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials-store.d.ts +9 -0
- package/dist/credentials-store.d.ts.map +1 -0
- package/dist/credentials-store.js +38 -0
- package/dist/credentials-store.js.map +1 -0
- package/dist/handbook.d.ts +3 -0
- package/dist/handbook.d.ts.map +1 -0
- package/dist/handbook.js +43 -0
- package/dist/handbook.js.map +1 -0
- package/dist/http/request.d.ts +15 -0
- package/dist/http/request.d.ts.map +1 -0
- package/dist/http/request.js +65 -0
- package/dist/http/request.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/io/readInput.d.ts +7 -0
- package/dist/io/readInput.d.ts.map +1 -0
- package/dist/io/readInput.js +39 -0
- package/dist/io/readInput.js.map +1 -0
- package/dist/sign.d.ts +6 -0
- package/dist/sign.d.ts.map +1 -0
- package/dist/sign.js +46 -0
- package/dist/sign.js.map +1 -0
- package/dist/token.d.ts +4 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +65 -0
- package/dist/token.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +40 -0
- package/references/README.md +4 -0
- package/references/project_json_structure_guide.md +910 -0
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# wjw-cli
|
|
2
|
+
|
|
3
|
+
问卷网(wenjuan.com)命令行工具:项目列表/创建/结构、题目编辑、报表等。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g wjw-cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
需 Node.js **≥ 18**。
|
|
12
|
+
|
|
13
|
+
## 使用
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
wjw init --api-key <问卷网服务访问令牌>
|
|
17
|
+
wjw --help
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
令牌:<https://www.wenjuan.com/member/common/mcp/>
|
|
21
|
+
|
|
22
|
+
## 从源码发布到 npm(维护者)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm login
|
|
26
|
+
npm publish
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`prepublishOnly` 会先执行 `npm run build`。若包名 `wjw-cli` 已被占用,请在 `package.json` 中改为作用域包(如 `@你的组织/wjw-cli`)并 `npm publish --access public`。
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** 与 wenjuan-survey-mcp `api_client` 中题型推断 / 打分子类型规范化逻辑对齐 */
|
|
2
|
+
export type JsonObject = Record<string, unknown>;
|
|
3
|
+
export declare function guessQuestionEnName(question: JsonObject, trustClientEnName: boolean): string;
|
|
4
|
+
export declare function inferQuestionType(question: JsonObject): number;
|
|
5
|
+
export declare function inferQuestionTypeForProjectImport(question: JsonObject): number;
|
|
6
|
+
export declare function ensureQuestionStructMongoId(struct: JsonObject, questionId: string): void;
|
|
7
|
+
export declare function ensureCustomAttrShowSeqOn(question: JsonObject): void;
|
|
8
|
+
export declare function normalizeQuestionStructForUpstream(questionStruct: JsonObject): JsonObject;
|
|
9
|
+
export declare function normalizeQuestionListForCreate(questionList: unknown[]): JsonObject[];
|
|
10
|
+
export declare const PROJECT_TYPE_MAP: Record<string, {
|
|
11
|
+
type_id: string;
|
|
12
|
+
p_type: number | null;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/api/normalize.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAqEjD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,GAAG,MAAM,CAwB5F;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAe9D;AAED,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAI9E;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAIxF;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAOpE;AA+GD,wBAAgB,kCAAkC,CAAC,cAAc,EAAE,UAAU,GAAG,UAAU,CAOzF;AAED,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAYpF;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAKvF,CAAC"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/** 与 wenjuan-survey-mcp `api_client` 中题型推断 / 打分子类型规范化逻辑对齐 */
|
|
2
|
+
const QUESTION_TYPE_EN_NAME_MAP = {
|
|
3
|
+
2: "QUESTION_TYPE_SINGLE",
|
|
4
|
+
3: "QUESTION_TYPE_MULTIPLE",
|
|
5
|
+
4: "QUESTION_TYPE_MATRIX_SINGLE",
|
|
6
|
+
5: "QUESTION_TYPE_MATRIX_MULTIPLE",
|
|
7
|
+
6: "QUESTION_TYPE_BLANK",
|
|
8
|
+
7: "QUESTION_TYPE_MATRIX_SCORE",
|
|
9
|
+
8: "QUESTION_TYPE_ADDRESS",
|
|
10
|
+
9: "QUESTION_TYPE_CLASSIFY",
|
|
11
|
+
50: "QUESTION_TYPE_SCORE",
|
|
12
|
+
60: "QUESTION_TYPE_SORT",
|
|
13
|
+
95: "QUESTION_TYPE_UPLOAD",
|
|
14
|
+
100: "QUESTION_TYPE_MATRIX_BLANK",
|
|
15
|
+
};
|
|
16
|
+
const DISP_TYPE_EN_NAME_MAP = {
|
|
17
|
+
dropdown: "QUESTION_TYPE_SINGLE",
|
|
18
|
+
judge: "QUESTION_TYPE_SINGLE",
|
|
19
|
+
mobile: "QUESTION_TYPE_MOBILE",
|
|
20
|
+
email: "QUESTION_TYPE_EMAIL",
|
|
21
|
+
nps_score: "QUESTION_TYPE_SCORE",
|
|
22
|
+
scale: "QUESTION_TYPE_SCORE",
|
|
23
|
+
date: "QUESTION_TYPE_DATE",
|
|
24
|
+
time: "QUESTION_TYPE_DATE",
|
|
25
|
+
upload_file: "QUESTION_TYPE_UPLOAD",
|
|
26
|
+
image_upload: "QUESTION_TYPE_IMAGE_UPLOAD",
|
|
27
|
+
address: "QUESTION_TYPE_ADDRESS",
|
|
28
|
+
signature: "QUESTION_TYPE_SIGNATURE",
|
|
29
|
+
page_break: "QUESTION_TYPE_SPLIT_PAGE",
|
|
30
|
+
cascader: "QUESTION_TYPE_CASCADE",
|
|
31
|
+
};
|
|
32
|
+
const CONTENT_TYPE_EN_NAME_MAP = {
|
|
33
|
+
sex: "QUESTION_TYPE_SEX",
|
|
34
|
+
id_card: "QUESTION_TYPE_ID_CARD",
|
|
35
|
+
};
|
|
36
|
+
const EN_NAME_TO_QUESTION_TYPE = {
|
|
37
|
+
QUESTION_TYPE_SINGLE: 2,
|
|
38
|
+
QUESTION_TYPE_MULTIPLE: 3,
|
|
39
|
+
QUESTION_TYPE_MATRIX_SINGLE: 4,
|
|
40
|
+
QUESTION_TYPE_MATRIX_MULTIPLE: 5,
|
|
41
|
+
QUESTION_TYPE_BLANK: 6,
|
|
42
|
+
QUESTION_TYPE_MATRIX_SCORE: 7,
|
|
43
|
+
QUESTION_TYPE_ADDRESS: 8,
|
|
44
|
+
QUESTION_TYPE_CASCADE: 8,
|
|
45
|
+
QUESTION_TYPE_CLASSIFY: 9,
|
|
46
|
+
QUESTION_TYPE_SCORE: 50,
|
|
47
|
+
QUESTION_TYPE_SORT: 60,
|
|
48
|
+
QUESTION_TYPE_MATRIX_BLANK: 100,
|
|
49
|
+
QUESTION_TYPE_MULTIPLE_BLANK: 95,
|
|
50
|
+
QUESTION_TYPE_UPLOAD: 95,
|
|
51
|
+
QUESTION_TYPE_IMAGE_UPLOAD: 95,
|
|
52
|
+
QUESTION_TYPE_SIGNATURE: 95,
|
|
53
|
+
QUESTION_TYPE_SEX: 2,
|
|
54
|
+
QUESTION_TYPE_MOBILE: 6,
|
|
55
|
+
QUESTION_TYPE_EMAIL: 6,
|
|
56
|
+
QUESTION_TYPE_DATE: 6,
|
|
57
|
+
QUESTION_TYPE_NAME: 6,
|
|
58
|
+
QUESTION_TYPE_ID_CARD: 6,
|
|
59
|
+
QUESTION_TYPE_DESC: 6,
|
|
60
|
+
QUESTION_TYPE_SPLIT_PAGE: 6,
|
|
61
|
+
};
|
|
62
|
+
const EVALUATION_SCORE_DISPLAY_KNOWN = new Set(["star", "circle", "slider", "emoji", "number"]);
|
|
63
|
+
const EVALUATION_SCORE_DISPLAY_CONFUSED = new Set(["on", "off", "yes", "no", "true", "false", "0", "1"]);
|
|
64
|
+
export function guessQuestionEnName(question, trustClientEnName) {
|
|
65
|
+
if (trustClientEnName) {
|
|
66
|
+
const clientEn = String(question.en_name ?? "").trim();
|
|
67
|
+
if (clientEn)
|
|
68
|
+
return clientEn;
|
|
69
|
+
}
|
|
70
|
+
const customAttr = question.custom_attr;
|
|
71
|
+
if (customAttr && typeof customAttr === "object") {
|
|
72
|
+
const ca = customAttr;
|
|
73
|
+
const dispType = String(ca.disp_type ?? "").trim().toLowerCase();
|
|
74
|
+
const mappedByDisp = DISP_TYPE_EN_NAME_MAP[dispType];
|
|
75
|
+
if (mappedByDisp)
|
|
76
|
+
return mappedByDisp;
|
|
77
|
+
const contentType = String(ca.content_type ?? "").trim().toLowerCase();
|
|
78
|
+
const mappedByContent = CONTENT_TYPE_EN_NAME_MAP[contentType];
|
|
79
|
+
if (mappedByContent)
|
|
80
|
+
return mappedByContent;
|
|
81
|
+
}
|
|
82
|
+
let qt = question.question_type;
|
|
83
|
+
if (typeof qt === "string" && qt.trim().match(/^\d+$/))
|
|
84
|
+
qt = Number.parseInt(qt.trim(), 10);
|
|
85
|
+
if (typeof qt === "number" && Number.isInteger(qt)) {
|
|
86
|
+
const mapped = QUESTION_TYPE_EN_NAME_MAP[qt];
|
|
87
|
+
if (mapped)
|
|
88
|
+
return mapped;
|
|
89
|
+
}
|
|
90
|
+
const optionList = question.option_list;
|
|
91
|
+
if (Array.isArray(optionList) && optionList.length > 1)
|
|
92
|
+
return "QUESTION_TYPE_SINGLE";
|
|
93
|
+
return "QUESTION_TYPE_BLANK";
|
|
94
|
+
}
|
|
95
|
+
export function inferQuestionType(question) {
|
|
96
|
+
let qt = question.question_type;
|
|
97
|
+
if (typeof qt === "number" && Number.isInteger(qt))
|
|
98
|
+
return qt;
|
|
99
|
+
if (typeof qt === "number" && !Number.isInteger(qt) && Number.isFinite(qt))
|
|
100
|
+
return Math.trunc(qt);
|
|
101
|
+
if (typeof qt === "string") {
|
|
102
|
+
const s = qt.trim();
|
|
103
|
+
if (/^\d+$/.test(s))
|
|
104
|
+
return Number.parseInt(s, 10);
|
|
105
|
+
}
|
|
106
|
+
const en = String(question.en_name ?? "").trim();
|
|
107
|
+
if (en in EN_NAME_TO_QUESTION_TYPE)
|
|
108
|
+
return EN_NAME_TO_QUESTION_TYPE[en];
|
|
109
|
+
const guessed = guessQuestionEnName(question, false);
|
|
110
|
+
if (guessed in EN_NAME_TO_QUESTION_TYPE)
|
|
111
|
+
return EN_NAME_TO_QUESTION_TYPE[guessed];
|
|
112
|
+
const optionList = question.option_list;
|
|
113
|
+
if (Array.isArray(optionList) && optionList.length > 1)
|
|
114
|
+
return 2;
|
|
115
|
+
return 6;
|
|
116
|
+
}
|
|
117
|
+
export function inferQuestionTypeForProjectImport(question) {
|
|
118
|
+
const en = String(question.en_name ?? "").trim();
|
|
119
|
+
if (en in EN_NAME_TO_QUESTION_TYPE)
|
|
120
|
+
return EN_NAME_TO_QUESTION_TYPE[en];
|
|
121
|
+
return inferQuestionType(question);
|
|
122
|
+
}
|
|
123
|
+
export function ensureQuestionStructMongoId(struct, questionId) {
|
|
124
|
+
const qid = String(questionId).trim();
|
|
125
|
+
if (!qid)
|
|
126
|
+
throw new Error("Missing question_id");
|
|
127
|
+
struct._id = { $oid: qid };
|
|
128
|
+
}
|
|
129
|
+
export function ensureCustomAttrShowSeqOn(question) {
|
|
130
|
+
let ca = question.custom_attr;
|
|
131
|
+
if (!ca || typeof ca !== "object") {
|
|
132
|
+
question.custom_attr = {};
|
|
133
|
+
ca = question.custom_attr;
|
|
134
|
+
}
|
|
135
|
+
ca.show_seq = "on";
|
|
136
|
+
}
|
|
137
|
+
function coerceEvaluationScoreDisplay(ca) {
|
|
138
|
+
const raw = ca.score_display;
|
|
139
|
+
if (raw === null || raw === undefined) {
|
|
140
|
+
ca.score_display = "star";
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (typeof raw === "boolean") {
|
|
144
|
+
ca.score_display = "star";
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const s = String(raw).trim().toLowerCase();
|
|
148
|
+
if (!s || EVALUATION_SCORE_DISPLAY_CONFUSED.has(s)) {
|
|
149
|
+
ca.score_display = "star";
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (EVALUATION_SCORE_DISPLAY_KNOWN.has(s)) {
|
|
153
|
+
ca.score_display = s;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function normalizeEvaluationLabelDataFromStringList(struct, ca) {
|
|
158
|
+
const ol = struct.option_list;
|
|
159
|
+
if (!Array.isArray(ol))
|
|
160
|
+
return;
|
|
161
|
+
let tagOpt;
|
|
162
|
+
for (const opt of ol) {
|
|
163
|
+
if (opt && typeof opt === "object" && String(opt.title ?? "").trim() === "标签") {
|
|
164
|
+
tagOpt = opt;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (!tagOpt && ol.length >= 2 && ol[1] && typeof ol[1] === "object")
|
|
169
|
+
tagOpt = ol[1];
|
|
170
|
+
if (!tagOpt)
|
|
171
|
+
return;
|
|
172
|
+
let oca;
|
|
173
|
+
if (!tagOpt.custom_attr || typeof tagOpt.custom_attr !== "object" || Array.isArray(tagOpt.custom_attr)) {
|
|
174
|
+
tagOpt.custom_attr = {};
|
|
175
|
+
oca = tagOpt.custom_attr;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
oca = tagOpt.custom_attr;
|
|
179
|
+
}
|
|
180
|
+
const ld = oca.label_data;
|
|
181
|
+
if (ld && typeof ld === "object" && !Array.isArray(ld))
|
|
182
|
+
return;
|
|
183
|
+
if (!Array.isArray(ld) || ld.length === 0)
|
|
184
|
+
return;
|
|
185
|
+
if (!ld.every((x) => typeof x === "string"))
|
|
186
|
+
return;
|
|
187
|
+
let mn = Number.parseInt(String(ca.min_answer_num ?? 1), 10);
|
|
188
|
+
let mx = Number.parseInt(String(ca.max_answer_num ?? 5), 10);
|
|
189
|
+
if (!Number.isFinite(mn) || !Number.isFinite(mx)) {
|
|
190
|
+
mn = 1;
|
|
191
|
+
mx = 5;
|
|
192
|
+
}
|
|
193
|
+
const span = mx - mn + 1;
|
|
194
|
+
if (span <= 0 || ld.length !== span)
|
|
195
|
+
return;
|
|
196
|
+
const rebuilt = {};
|
|
197
|
+
for (let i = 0; i < ld.length; i++) {
|
|
198
|
+
const text = ld[i];
|
|
199
|
+
const desc = String(text).trim();
|
|
200
|
+
const key = String(mn + i);
|
|
201
|
+
rebuilt[key] = { score_desc: desc, label_list: [] };
|
|
202
|
+
}
|
|
203
|
+
oca.label_data = rebuilt;
|
|
204
|
+
}
|
|
205
|
+
function normalizeScoreSubtypeQuestion(struct) {
|
|
206
|
+
let qt = struct.question_type;
|
|
207
|
+
if (typeof qt === "string" && /^\d+$/.test(qt.trim()))
|
|
208
|
+
qt = Number.parseInt(qt.trim(), 10);
|
|
209
|
+
if (typeof qt !== "number" || !Number.isInteger(qt) || qt !== 50)
|
|
210
|
+
return;
|
|
211
|
+
let ca;
|
|
212
|
+
if (!struct.custom_attr || typeof struct.custom_attr !== "object" || Array.isArray(struct.custom_attr)) {
|
|
213
|
+
struct.custom_attr = {};
|
|
214
|
+
ca = struct.custom_attr;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
ca = struct.custom_attr;
|
|
218
|
+
}
|
|
219
|
+
let dispRaw = ca.disp_type;
|
|
220
|
+
let disp = dispRaw != null ? String(dispRaw).trim().toLowerCase() : "";
|
|
221
|
+
if (ca.magnitude_scale != null && disp === "scale") {
|
|
222
|
+
delete ca.disp_type;
|
|
223
|
+
disp = "";
|
|
224
|
+
}
|
|
225
|
+
if (disp === "nps_score") {
|
|
226
|
+
if (!("min_answer_num" in ca))
|
|
227
|
+
ca.min_answer_num = 0;
|
|
228
|
+
if (!("max_answer_num" in ca))
|
|
229
|
+
ca.max_answer_num = 10;
|
|
230
|
+
const ol = struct.option_list;
|
|
231
|
+
if (Array.isArray(ol) && ol.length === 1 && ol[0] && typeof ol[0] === "object") {
|
|
232
|
+
const opt = { ...ol[0] };
|
|
233
|
+
const oca = opt.custom_attr;
|
|
234
|
+
if (oca && typeof oca === "object" && !Array.isArray(oca)) {
|
|
235
|
+
const keys = ["min_score", "max_score", "min_desc", "max_desc"];
|
|
236
|
+
if (keys.some((k) => k in oca)) {
|
|
237
|
+
struct.option_list = [{ title: "选项1", is_open: false, custom_attr: {} }];
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (disp === "evaluation") {
|
|
244
|
+
if (ca.open_eval == null || String(ca.open_eval).trim() === "")
|
|
245
|
+
ca.open_eval = "on";
|
|
246
|
+
coerceEvaluationScoreDisplay(ca);
|
|
247
|
+
if (!("min_answer_num" in ca))
|
|
248
|
+
ca.min_answer_num = 1;
|
|
249
|
+
if (!("max_answer_num" in ca))
|
|
250
|
+
ca.max_answer_num = 5;
|
|
251
|
+
normalizeEvaluationLabelDataFromStringList(struct, ca);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export function normalizeQuestionStructForUpstream(questionStruct) {
|
|
255
|
+
const out = { ...questionStruct };
|
|
256
|
+
delete out.en_name;
|
|
257
|
+
out.question_type = inferQuestionType(out);
|
|
258
|
+
normalizeScoreSubtypeQuestion(out);
|
|
259
|
+
out.en_name = guessQuestionEnName(out, false);
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
export function normalizeQuestionListForCreate(questionList) {
|
|
263
|
+
const normalized = [];
|
|
264
|
+
for (let idx = 0; idx < questionList.length; idx++) {
|
|
265
|
+
const item = questionList[idx];
|
|
266
|
+
if (!item || typeof item !== "object")
|
|
267
|
+
throw new Error(`question_list[${idx}] must be an object`);
|
|
268
|
+
const question = { ...item };
|
|
269
|
+
question.en_name = guessQuestionEnName(question, true);
|
|
270
|
+
question.question_type = inferQuestionTypeForProjectImport(question);
|
|
271
|
+
ensureCustomAttrShowSeqOn(question);
|
|
272
|
+
normalized.push(question);
|
|
273
|
+
}
|
|
274
|
+
return normalized;
|
|
275
|
+
}
|
|
276
|
+
export const PROJECT_TYPE_MAP = {
|
|
277
|
+
survey: { type_id: "51dd234e9b9fbe6646bf4dcc", p_type: null },
|
|
278
|
+
form: { type_id: "536b5a38f7405b4d51ca75c6", p_type: 1 },
|
|
279
|
+
vote: { type_id: "5c0651e0a320fc9d0bb6aefb", p_type: null },
|
|
280
|
+
assess: { type_id: "54b638e0f7405b3dc0db45fb", p_type: 2 },
|
|
281
|
+
};
|
|
282
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/api/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JsonObject } from "./survey-api.js";
|
|
2
|
+
/**
|
|
3
|
+
* `wjw project detail`:从 `fetchProjectStructure` 原始数据中只抽取常用展示字段;
|
|
4
|
+
* 题目按 `questionpage_list` 的实际分页输出(与编辑端分页一致)。
|
|
5
|
+
*/
|
|
6
|
+
export declare function summarizeProjectDetail(struct: JsonObject): JsonObject;
|
|
7
|
+
//# sourceMappingURL=project-detail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detail.d.ts","sourceRoot":"","sources":["../../src/api/project-detail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAoKlD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CA2BrE"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/** 与上游 `question_type` 整型对应的逻辑题型名(展示用) */
|
|
2
|
+
const QUESTION_TYPE_EN_NAME_MAP = {
|
|
3
|
+
2: "QUESTION_TYPE_SINGLE",
|
|
4
|
+
3: "QUESTION_TYPE_MULTIPLE",
|
|
5
|
+
4: "QUESTION_TYPE_MATRIX_SINGLE",
|
|
6
|
+
5: "QUESTION_TYPE_MATRIX_MULTIPLE",
|
|
7
|
+
6: "QUESTION_TYPE_BLANK",
|
|
8
|
+
7: "QUESTION_TYPE_MATRIX_SCORE",
|
|
9
|
+
8: "QUESTION_TYPE_ADDRESS",
|
|
10
|
+
9: "QUESTION_TYPE_CLASSIFY",
|
|
11
|
+
50: "QUESTION_TYPE_SCORE",
|
|
12
|
+
60: "QUESTION_TYPE_SORT",
|
|
13
|
+
95: "QUESTION_TYPE_UPLOAD",
|
|
14
|
+
100: "QUESTION_TYPE_MATRIX_BLANK",
|
|
15
|
+
};
|
|
16
|
+
const PTYPE_ZH = {
|
|
17
|
+
survey: "问卷",
|
|
18
|
+
vote: "投票",
|
|
19
|
+
form: "表单",
|
|
20
|
+
assess: "测评",
|
|
21
|
+
};
|
|
22
|
+
/** `en_name` / 逻辑题型 → 中文展示(与问卷网常用叫法对齐) */
|
|
23
|
+
const EN_NAME_TO_ZH = {
|
|
24
|
+
QUESTION_TYPE_SINGLE: "单选题",
|
|
25
|
+
QUESTION_TYPE_MULTIPLE: "多选题",
|
|
26
|
+
QUESTION_TYPE_MATRIX_SINGLE: "矩阵单选题",
|
|
27
|
+
QUESTION_TYPE_MATRIX_MULTIPLE: "矩阵多选题",
|
|
28
|
+
QUESTION_TYPE_BLANK: "填空题",
|
|
29
|
+
QUESTION_TYPE_MATRIX_SCORE: "矩阵量表题",
|
|
30
|
+
QUESTION_TYPE_ADDRESS: "地址题",
|
|
31
|
+
QUESTION_TYPE_CASCADE: "级联题",
|
|
32
|
+
QUESTION_TYPE_CLASSIFY: "分类题",
|
|
33
|
+
QUESTION_TYPE_SCORE: "打分题",
|
|
34
|
+
QUESTION_TYPE_SORT: "排序题",
|
|
35
|
+
QUESTION_TYPE_MATRIX_BLANK: "矩阵填空题",
|
|
36
|
+
QUESTION_TYPE_MULTIPLE_BLANK: "多项填空题",
|
|
37
|
+
QUESTION_TYPE_UPLOAD: "文件上传题",
|
|
38
|
+
QUESTION_TYPE_IMAGE_UPLOAD: "图片上传题",
|
|
39
|
+
QUESTION_TYPE_SIGNATURE: "签名题",
|
|
40
|
+
QUESTION_TYPE_SEX: "性别",
|
|
41
|
+
QUESTION_TYPE_MOBILE: "手机号",
|
|
42
|
+
QUESTION_TYPE_EMAIL: "邮箱",
|
|
43
|
+
QUESTION_TYPE_DATE: "日期/时间",
|
|
44
|
+
QUESTION_TYPE_NAME: "姓名",
|
|
45
|
+
QUESTION_TYPE_ID_CARD: "身份证",
|
|
46
|
+
QUESTION_TYPE_DESC: "描述说明",
|
|
47
|
+
QUESTION_TYPE_SPLIT_PAGE: "分页",
|
|
48
|
+
};
|
|
49
|
+
const QUESTION_TYPE_NUM_TO_ZH = {
|
|
50
|
+
2: "单选题",
|
|
51
|
+
3: "多选题",
|
|
52
|
+
4: "矩阵单选题",
|
|
53
|
+
5: "矩阵多选题",
|
|
54
|
+
6: "填空题",
|
|
55
|
+
7: "矩阵量表题",
|
|
56
|
+
8: "地址题",
|
|
57
|
+
9: "分类题",
|
|
58
|
+
50: "打分题",
|
|
59
|
+
60: "排序题",
|
|
60
|
+
95: "附件类题",
|
|
61
|
+
100: "矩阵填空题",
|
|
62
|
+
};
|
|
63
|
+
function parseQuestionType(q) {
|
|
64
|
+
const qt = q.question_type;
|
|
65
|
+
if (typeof qt === "number" && Number.isInteger(qt))
|
|
66
|
+
return qt;
|
|
67
|
+
if (typeof qt === "string" && /^\d+$/.test(qt.trim()))
|
|
68
|
+
return Number.parseInt(qt.trim(), 10);
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
/** 题型 50 下按 `disp_type` 细分为中文 */
|
|
72
|
+
function scoreTypeChinese(q) {
|
|
73
|
+
const n = parseQuestionType(q);
|
|
74
|
+
if (n !== 50)
|
|
75
|
+
return undefined;
|
|
76
|
+
const ca = q.custom_attr;
|
|
77
|
+
if (!ca || typeof ca !== "object")
|
|
78
|
+
return "打分题";
|
|
79
|
+
const c = ca;
|
|
80
|
+
const dt = String(c.disp_type ?? "").trim().toLowerCase();
|
|
81
|
+
if (dt === "nps_score")
|
|
82
|
+
return "NPS";
|
|
83
|
+
if (dt === "evaluation")
|
|
84
|
+
return "评价题";
|
|
85
|
+
if (dt === "scale")
|
|
86
|
+
return "量表题";
|
|
87
|
+
return "打分题";
|
|
88
|
+
}
|
|
89
|
+
function resolveEnNameKey(q) {
|
|
90
|
+
const en = String(q.en_name ?? "").trim();
|
|
91
|
+
if (en)
|
|
92
|
+
return en;
|
|
93
|
+
const n = parseQuestionType(q);
|
|
94
|
+
if (n !== undefined && QUESTION_TYPE_EN_NAME_MAP[n])
|
|
95
|
+
return QUESTION_TYPE_EN_NAME_MAP[n];
|
|
96
|
+
return "";
|
|
97
|
+
}
|
|
98
|
+
function formatQuestionType(q) {
|
|
99
|
+
const scoreZh = scoreTypeChinese(q);
|
|
100
|
+
if (scoreZh)
|
|
101
|
+
return scoreZh;
|
|
102
|
+
const key = resolveEnNameKey(q);
|
|
103
|
+
if (key && EN_NAME_TO_ZH[key])
|
|
104
|
+
return EN_NAME_TO_ZH[key];
|
|
105
|
+
const n = parseQuestionType(q);
|
|
106
|
+
if (n !== undefined && QUESTION_TYPE_NUM_TO_ZH[n])
|
|
107
|
+
return QUESTION_TYPE_NUM_TO_ZH[n];
|
|
108
|
+
if (key)
|
|
109
|
+
return key;
|
|
110
|
+
return String(q.question_type ?? "");
|
|
111
|
+
}
|
|
112
|
+
function collectOptionTitles(q) {
|
|
113
|
+
const titles = [];
|
|
114
|
+
const ol = q.option_list;
|
|
115
|
+
if (Array.isArray(ol)) {
|
|
116
|
+
for (const opt of ol) {
|
|
117
|
+
if (opt && typeof opt === "object") {
|
|
118
|
+
titles.push(String(opt.title ?? "").trim());
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const mrl = q.matrixrow_list;
|
|
123
|
+
if (Array.isArray(mrl)) {
|
|
124
|
+
for (const row of mrl) {
|
|
125
|
+
if (row && typeof row === "object") {
|
|
126
|
+
titles.push(String(row.title ?? "").trim());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return titles.filter((t) => t.length > 0);
|
|
131
|
+
}
|
|
132
|
+
function formatSurveyType(struct) {
|
|
133
|
+
const code = String(struct.ptype_enname ?? struct.ptype ?? "").trim().toLowerCase();
|
|
134
|
+
if (code && PTYPE_ZH[code])
|
|
135
|
+
return `${PTYPE_ZH[code]}(${code})`;
|
|
136
|
+
if (code)
|
|
137
|
+
return code;
|
|
138
|
+
if (struct.p_type !== undefined && struct.p_type !== null)
|
|
139
|
+
return String(struct.p_type);
|
|
140
|
+
if (struct.scene_type !== undefined && struct.scene_type !== null)
|
|
141
|
+
return String(struct.scene_type);
|
|
142
|
+
return "";
|
|
143
|
+
}
|
|
144
|
+
/** 上游分页对象上可能出现的名称字段(用于摘要展示) */
|
|
145
|
+
function pageTitle(page) {
|
|
146
|
+
for (const key of ["title", "page_title", "name", "page_name"]) {
|
|
147
|
+
const v = page[key];
|
|
148
|
+
if (typeof v === "string" && v.trim())
|
|
149
|
+
return v.trim();
|
|
150
|
+
}
|
|
151
|
+
return "";
|
|
152
|
+
}
|
|
153
|
+
function summarizeQuestionsOnPage(qlist) {
|
|
154
|
+
const 题目 = [];
|
|
155
|
+
for (const item of qlist) {
|
|
156
|
+
if (!item || typeof item !== "object")
|
|
157
|
+
continue;
|
|
158
|
+
const q = item;
|
|
159
|
+
题目.push({
|
|
160
|
+
题目标题: String(q.title ?? ""),
|
|
161
|
+
题型: formatQuestionType(q),
|
|
162
|
+
选项标题: collectOptionTitles(q),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return 题目;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* `wjw project detail`:从 `fetchProjectStructure` 原始数据中只抽取常用展示字段;
|
|
169
|
+
* 题目按 `questionpage_list` 的实际分页输出(与编辑端分页一致)。
|
|
170
|
+
*/
|
|
171
|
+
export function summarizeProjectDetail(struct) {
|
|
172
|
+
const 分页 = [];
|
|
173
|
+
const pages = struct.questionpage_list;
|
|
174
|
+
if (Array.isArray(pages)) {
|
|
175
|
+
let 页码 = 0;
|
|
176
|
+
for (const page of pages) {
|
|
177
|
+
if (!page || typeof page !== "object")
|
|
178
|
+
continue;
|
|
179
|
+
页码 += 1;
|
|
180
|
+
const p = page;
|
|
181
|
+
const qlist = Array.isArray(p.question_list) ? p.question_list : [];
|
|
182
|
+
const row = {
|
|
183
|
+
页码,
|
|
184
|
+
题目: summarizeQuestionsOnPage(qlist),
|
|
185
|
+
};
|
|
186
|
+
const pt = pageTitle(p);
|
|
187
|
+
if (pt)
|
|
188
|
+
row.分页标题 = pt;
|
|
189
|
+
分页.push(row);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
项目标题: String(struct.title ?? ""),
|
|
194
|
+
欢迎语: String(struct.begin_desc ?? ""),
|
|
195
|
+
结束语: String(struct.end_desc ?? ""),
|
|
196
|
+
问卷类型: formatSurveyType(struct),
|
|
197
|
+
分页,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=project-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detail.js","sourceRoot":"","sources":["../../src/api/project-detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { JsonObject } from "./normalize.js";
|
|
2
|
+
/** 与 CLI / `fetchProjectStructure` 第三参一致 */
|
|
3
|
+
export type ProjectStructureNarrowOpts = {
|
|
4
|
+
questionpageId?: string;
|
|
5
|
+
questionId?: string;
|
|
6
|
+
optionId?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function narrowOptsHasAny(o: ProjectStructureNarrowOpts): boolean;
|
|
9
|
+
/** 兼容 HTTP/JSON 里混用 snake_case 的 opts */
|
|
10
|
+
export declare function coerceStructureNarrowOpts(o?: ProjectStructureNarrowOpts): ProjectStructureNarrowOpts | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* 上游 `edit_project` 的 data 可能在嵌套对象里才出现 `questionpage_list`,
|
|
13
|
+
* 在子树中 BFS 找到第一个带该数组的对象作为编辑结构根。
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveEditStructureRoot(d: JsonObject): JsonObject;
|
|
16
|
+
/**
|
|
17
|
+
* 在完整 `edit_project` data 上按 ID 裁剪。
|
|
18
|
+
* 根对象即上游片段、无中文包装键:仅分页 id → 该页对象;仅题目 id → 该题对象;含 option-id → 该选项行对象(与 option_list 中单条结构一致,含 _id / cid / question_id 等)。
|
|
19
|
+
*/
|
|
20
|
+
export declare function narrowProjectStructureData(struct: JsonObject, opts: ProjectStructureNarrowOpts): JsonObject;
|
|
21
|
+
//# sourceMappingURL=structure-narrow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure-narrow.d.ts","sourceRoot":"","sources":["../../src/api/structure-narrow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,4CAA4C;AAC5C,MAAM,MAAM,0BAA0B,GAAG;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAIvE;AAED,yCAAyC;AACzC,wBAAgB,yBAAyB,CACvC,CAAC,CAAC,EAAE,0BAA0B,GAC7B,0BAA0B,GAAG,SAAS,CAaxC;AAqBD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAuBlE;AAkID;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,0BAA0B,GAC/B,UAAU,CAgDZ"}
|