lightshortcuts 1.0.8 → 1.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 +18 -4
- package/bin/lsc.js +660 -395
- package/docs/README.md +357 -0
- package/lib/LSC.js +303 -122
- package/lib/core/api.js +1134 -0
- package/lib/core/apiUrl.js +20 -8
- package/lib/defaults.js +7 -8
- package/lib/helpers/hsMd5.js +177 -0
- package/lib/helpers/hsUtils.js +74 -0
- package/lib/helpers/zip.js +164 -0
- package/lib/utils.js +66 -5
- package/lsc.config.json +22 -7
- package/package.json +2 -2
- package/lib/core/API.js +0 -342
package/lib/LSC.js
CHANGED
|
@@ -1,151 +1,332 @@
|
|
|
1
1
|
const { statSync } = require("fs");
|
|
2
2
|
const path = require("path");
|
|
3
|
-
const { getPkgInfo, setPkgVersion, merge } = require("./utils");
|
|
3
|
+
const { getPkgInfo, setPkgVersion, merge, fmtTime } = require("./utils");
|
|
4
|
+
|
|
5
|
+
const log = (message, ...args) => {
|
|
6
|
+
console.log(`[${fmtTime()}] ${message}`, ...args);
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const error = (message, ...args) => {
|
|
10
|
+
console.error(`[${fmtTime()}] ${message}`, ...args);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const warn = (message, ...args) => {
|
|
14
|
+
console.warn(`[${fmtTime()}] ${message}`, ...args);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const info = (message, ...args) => {
|
|
18
|
+
console.info(`[${fmtTime()}] ${message}`, ...args);
|
|
19
|
+
};
|
|
4
20
|
const axios = require("axios").default;
|
|
5
21
|
|
|
6
22
|
let totalConfig = {};
|
|
7
23
|
var token,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
24
|
+
pkgid = "ffff",
|
|
25
|
+
publish_app_arr,
|
|
26
|
+
set_pkg_version,
|
|
27
|
+
task_status,
|
|
28
|
+
release_desc,
|
|
29
|
+
android_version_scope, //Android端离线包兼容版本
|
|
30
|
+
ios_version_scope, //iOS端离线包兼容版本
|
|
31
|
+
harmony_version_scope, //Harmony端离线包兼容版本
|
|
32
|
+
pkg_zip_name,
|
|
33
|
+
pkg_dir,
|
|
34
|
+
apps_name,
|
|
35
|
+
need_wechat_push = false, //是否需要企业微信推送
|
|
36
|
+
webhookUrl,
|
|
37
|
+
//以下是H5web相关配置
|
|
38
|
+
publish_h5web_arr,
|
|
39
|
+
h5web_name;
|
|
19
40
|
|
|
20
41
|
//引入API
|
|
21
42
|
const {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
43
|
+
queryApp,
|
|
44
|
+
queryCompList,
|
|
45
|
+
queryOfflineVersionDetail,
|
|
46
|
+
releaseMuchVersion,
|
|
47
|
+
addH5webPkg,
|
|
48
|
+
sendWechatWebhook,
|
|
49
|
+
allOfflinePkgLists,
|
|
50
|
+
checkSession,
|
|
51
|
+
fileUpload,
|
|
52
|
+
addOfflineVersion,
|
|
53
|
+
addOfflineTask,
|
|
54
|
+
queryOfflineTask,
|
|
55
|
+
updateOfflineTask,
|
|
56
|
+
queryOfflinePkgList,
|
|
57
|
+
queryOfflineVersionlist,
|
|
58
|
+
syncPkgList,
|
|
59
|
+
dealVersionList,
|
|
32
60
|
} = require("./core/API");
|
|
33
61
|
|
|
34
62
|
//在APP上发布指定离线包主逻辑
|
|
35
|
-
async function publish(h5pkgid, app_id) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
async function publish(h5pkgid, app_id, app_name = "") {
|
|
64
|
+
try {
|
|
65
|
+
const __filePath = path.join(process.cwd(), `${pkg_dir}${pkg_zip_name}`);
|
|
66
|
+
log("上传离线包");
|
|
67
|
+
let package_id = await fileUpload(__filePath);
|
|
68
|
+
log("上传离线包成功", package_id);
|
|
69
|
+
|
|
70
|
+
log("查询离线包版本列表");
|
|
71
|
+
let mvRes = await queryOfflineVersionlist(app_id, h5pkgid),
|
|
72
|
+
{ max_version } = mvRes.data;
|
|
73
|
+
log("查询离线包版本列表成功");
|
|
74
|
+
|
|
75
|
+
log("获取离线包信息");
|
|
76
|
+
let { id } = await getPkgInfo(allOfflinePkgLists, app_id, h5pkgid);
|
|
77
|
+
log("获取离线包信息成功", id);
|
|
78
|
+
|
|
79
|
+
let file_size = await statSync(__filePath).size;
|
|
80
|
+
let pkg_id = id;
|
|
81
|
+
log("创建离线包版本号");
|
|
82
|
+
let relVersion = await setPkgVersion(set_pkg_version, max_version);
|
|
83
|
+
log("即将发布的版本号:", relVersion);
|
|
84
|
+
//创建离线发布版本
|
|
85
|
+
log("创建离线包版本号");
|
|
86
|
+
let aovRes = await addOfflineVersion({
|
|
87
|
+
app_id,
|
|
88
|
+
pkg_id,
|
|
89
|
+
version: relVersion,
|
|
90
|
+
android_version_scope, //Android端离线包兼容版本
|
|
91
|
+
ios_version_scope, //iOS端离线包兼容版本
|
|
92
|
+
harmony_version_scope, //Harmony端离线包兼容版本
|
|
93
|
+
is_wifi: "0",
|
|
94
|
+
is_pub_latest: "1", //是否发布为最新版本
|
|
95
|
+
package_id,
|
|
96
|
+
file_name: pkg_zip_name,
|
|
97
|
+
file_size,
|
|
98
|
+
});
|
|
99
|
+
if (aovRes) {
|
|
100
|
+
//更新列表
|
|
101
|
+
let m = await queryOfflineVersionlist(app_id, h5pkgid),
|
|
102
|
+
{ id } = m.data.list[0];
|
|
103
|
+
log("即将创建发布任务");
|
|
104
|
+
let aotRes = await addOfflineTask({
|
|
105
|
+
app_id,
|
|
106
|
+
version_id: id,
|
|
107
|
+
pkg_id,
|
|
108
|
+
release_type: 0,
|
|
109
|
+
update_strategy: 0,
|
|
110
|
+
release_strategy: "",
|
|
111
|
+
release_desc,
|
|
112
|
+
});
|
|
113
|
+
let msg = `创建${app_name}离线包${h5pkgid}@${relVersion}发布任务${aotRes ? "成功!" : "失败🔥 "}`;
|
|
114
|
+
info(msg);
|
|
115
|
+
if (aotRes) {
|
|
116
|
+
//查询执行发布任务状态成功与否接口
|
|
117
|
+
let qotRes = await queryOfflineVersionDetail({
|
|
118
|
+
id,
|
|
119
|
+
app_id,
|
|
60
120
|
});
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
status: task_status, //0发布,1暂停,2下架
|
|
91
|
-
app_id,
|
|
92
|
-
});
|
|
93
|
-
console.log(
|
|
94
|
-
`版本${prevVerInfo.version}${sm[task_status]}${
|
|
95
|
-
uotRes ? "成功" : "失败"
|
|
96
|
-
}`
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
121
|
+
msg = `${app_name}离线包${h5pkgid}@${relVersion}版本发布${qotRes ? "成功!" : "失败🔥 "}`;
|
|
122
|
+
log(msg);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (need_wechat_push && webhookUrl) {
|
|
126
|
+
const message = msg;
|
|
127
|
+
try {
|
|
128
|
+
// 发送企业微信消息
|
|
129
|
+
const result = await sendWechatWebhook(webhookUrl, message);
|
|
130
|
+
log("消息发送成功:", result);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
error("消息发送失败:", error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
let ls = m.data.list.slice(1),
|
|
137
|
+
fs = ls.length > 0 ? ls.filter((val) => val.status === 1) : [],
|
|
138
|
+
prevVerInfo = fs[0];
|
|
139
|
+
if (fs.length > 0) {
|
|
140
|
+
const qotRes = await queryOfflineTask({
|
|
141
|
+
app_id,
|
|
142
|
+
version_id: prevVerInfo.id,
|
|
143
|
+
}),
|
|
144
|
+
e = qotRes.filter((val) => val.status == 0),
|
|
145
|
+
f = e[0];
|
|
146
|
+
// 处理上一版本的问题:保持、暂停、下架
|
|
147
|
+
if (task_status != 0) {
|
|
148
|
+
let sm = { 0: "发布", 1: "暂停", 2: "下架" };
|
|
149
|
+
await dealVersionList({ app_id, pkg_id, status: task_status });
|
|
100
150
|
}
|
|
101
|
-
|
|
102
|
-
console.log("发布失败:", error);
|
|
151
|
+
}
|
|
103
152
|
}
|
|
153
|
+
} catch (error) {
|
|
154
|
+
log("发布失败:", error);
|
|
155
|
+
}
|
|
104
156
|
}
|
|
105
157
|
|
|
106
158
|
async function Main(h5pkgid, ids) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
159
|
+
let tokenIsReady = await checkSession();
|
|
160
|
+
if (tokenIsReady) {
|
|
161
|
+
info("会话有效,准备处理!");
|
|
162
|
+
const appList = await queryApp();
|
|
163
|
+
// log("查询APP列表", appList);
|
|
164
|
+
//检验APP列表是否包含ids中的所有应用
|
|
165
|
+
let existIds = checkAppIds(appList, ids);
|
|
166
|
+
ids = existIds;
|
|
167
|
+
//同步APP列表和离线包列表
|
|
168
|
+
let chkPkg = await syncPkgList(ids, h5pkgid);
|
|
169
|
+
if (chkPkg) {
|
|
170
|
+
log("查询离线包列表", chkPkg);
|
|
171
|
+
await queryOfflinePkgList(ids);
|
|
172
|
+
for (let i = 0; i < ids.length; i++) {
|
|
173
|
+
log(
|
|
174
|
+
`*************${apps_name[ids[i]] == undefined ? "" : apps_name[ids[i]]}:::${h5pkgid}*************`,
|
|
175
|
+
);
|
|
176
|
+
// log(apps_name[ids[i]]==undefined,ids[i])
|
|
177
|
+
await publish(h5pkgid, ids[i], apps_name[ids[i]]);
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
warn("请联系Light管理员先在创建离线包!");
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
info("token已过期");
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const publishH5web = async (pkg_id_arr, app_name = "") => {
|
|
187
|
+
try {
|
|
188
|
+
log(`*************发布H5web应用*************`);
|
|
189
|
+
log("发布H5web离线包", pkg_id_arr, app_name);
|
|
190
|
+
const __filePath = path.join(process.cwd(), `${pkg_dir}${pkg_zip_name}`);
|
|
191
|
+
log("上传H5应用离线包");
|
|
192
|
+
let pkg_id = await fileUpload(__filePath, "h5_src");
|
|
193
|
+
log("上传H5应用离线包成功", pkg_id);
|
|
194
|
+
log("创建H5应用包");
|
|
195
|
+
let comp_pkg_id = await addH5webPkg({
|
|
196
|
+
pkg_name: `${pkg_zip_name}(${new Date().getTime()})`,
|
|
197
|
+
pkg_id,
|
|
198
|
+
pkg_desc: release_desc || "此版本为自动化方式进行快捷发布",
|
|
199
|
+
});
|
|
200
|
+
log("创建H5应用包成功", comp_pkg_id);
|
|
201
|
+
log("以快捷发布方式发布H5应用包到对应产品下");
|
|
202
|
+
|
|
203
|
+
for (let i = 0; i < pkg_id_arr.length; i++) {
|
|
204
|
+
const result = await releaseMuchVersion(pkg_id_arr[i], comp_pkg_id);
|
|
205
|
+
log(`🔥发布${h5web_name[pkg_id_arr[i]]}H5应用包成功!`);
|
|
206
|
+
const msg = `发布 ${h5web_name[pkg_id_arr[i]]} H5应用包成功!`;
|
|
207
|
+
if (need_wechat_push && webhookUrl) {
|
|
208
|
+
const message = msg;
|
|
209
|
+
try {
|
|
210
|
+
await sendWechatWebhook(webhookUrl, message);
|
|
211
|
+
log("消息发送成功:", result);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
await sendWechatWebhook(
|
|
214
|
+
webhookUrl,
|
|
215
|
+
`发布 ${h5web_name[pkg_id_arr[i]]} H5应用包失败❌!原因:${error}`,
|
|
216
|
+
);
|
|
217
|
+
error("消息发送失败:", error);
|
|
120
218
|
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
} catch (error) {
|
|
222
|
+
await sendWechatWebhook(
|
|
223
|
+
webhookUrl,
|
|
224
|
+
`发布${h5web_name[pkg_id_arr[i]]}H5应用包失败❌!原因:${error}`,
|
|
225
|
+
);
|
|
226
|
+
log("发布H5web离线包失败:", error);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
//在H5web上发布指定离线包主逻辑
|
|
230
|
+
async function MainH5web(publish_h5web_arr) {
|
|
231
|
+
let tokenIsReady = await checkSession();
|
|
232
|
+
if (tokenIsReady) {
|
|
233
|
+
info("会话有效,准备处理!");
|
|
234
|
+
let chkH5webid = await queryCompList();
|
|
235
|
+
let chkPkg = checkH5webAppIds(chkH5webid, publish_h5web_arr); //过滤id,只处理存在H5web离线包发布
|
|
236
|
+
if (chkPkg && chkPkg.length > 0) {
|
|
237
|
+
await publishH5web(chkPkg);
|
|
121
238
|
} else {
|
|
122
|
-
|
|
239
|
+
warn("请联系Light管理员先在创建H5web离线包!");
|
|
123
240
|
}
|
|
241
|
+
} else {
|
|
242
|
+
info("token已过期");
|
|
243
|
+
}
|
|
124
244
|
}
|
|
125
245
|
|
|
246
|
+
//检查H5web应用ID是否存在
|
|
247
|
+
const checkH5webAppIds = function (appList, checkIds) {
|
|
248
|
+
try {
|
|
249
|
+
// 提取应用列表中的所有ID并存储在Set中,提高查找效率
|
|
250
|
+
const existingIdsSet = new Set(appList.map((app) => app.id.toString()));
|
|
251
|
+
|
|
252
|
+
// 使用reduce过滤出存在的ID
|
|
253
|
+
const foundIds = checkIds.reduce((acc, id) => {
|
|
254
|
+
if (existingIdsSet.has(id)) {
|
|
255
|
+
h5web_name[id] = appList.find((app) => app.id.toString() === id).name;
|
|
256
|
+
acc.push(id);
|
|
257
|
+
}
|
|
258
|
+
return acc;
|
|
259
|
+
}, []);
|
|
260
|
+
|
|
261
|
+
return foundIds;
|
|
262
|
+
} catch (error) {
|
|
263
|
+
log(`检查H5web应用ID是否存在报错:${error}`);
|
|
264
|
+
return [];
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
//检查APP列表是否包含ids中的所有应用
|
|
269
|
+
const checkAppIds = function (appList, checkIds) {
|
|
270
|
+
try {
|
|
271
|
+
// 提取APP列表中的所有ID并存储在Set中,提高查找效率
|
|
272
|
+
const existingIdsSet = new Set(appList.map((app) => app.id.toString()));
|
|
273
|
+
|
|
274
|
+
// 使用reduce过滤出存在的ID
|
|
275
|
+
const foundIds = checkIds.reduce((acc, id) => {
|
|
276
|
+
if (existingIdsSet.has(id)) {
|
|
277
|
+
apps_name[id] = appList.find((app) => app.id.toString() === id).show_name;
|
|
278
|
+
acc.push(id);
|
|
279
|
+
}
|
|
280
|
+
return acc;
|
|
281
|
+
}, []);
|
|
282
|
+
|
|
283
|
+
return foundIds;
|
|
284
|
+
} catch (error) {
|
|
285
|
+
log(`检查APP列表是否包含ids中的所有应用报错:${error}`);
|
|
286
|
+
return [];
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
|
|
126
290
|
async function LSC(config = {}) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
291
|
+
// log("发布配置:\n", config);
|
|
292
|
+
let { publishInfo, lightBaseURL, wecomWebhook } = config;
|
|
293
|
+
totalConfig = publishInfo;
|
|
294
|
+
|
|
295
|
+
token = publishInfo.token;
|
|
296
|
+
pkgid = publishInfo.pkgid;
|
|
297
|
+
publish_app_arr = publishInfo.publish_app_arr;
|
|
298
|
+
|
|
299
|
+
set_pkg_version = publishInfo.set_pkg_version;
|
|
300
|
+
task_status = publishInfo.task_status;
|
|
301
|
+
release_desc = publishInfo.release_desc;
|
|
302
|
+
android_version_scope = publishInfo.android_version_scope; //Android端离线包兼容版本
|
|
303
|
+
ios_version_scope = publishInfo.ios_version_scope; //iOS端离线包兼容版本
|
|
304
|
+
harmony_version_scope = publishInfo.harmony_version_scope; //Harmony端离线包兼容版本
|
|
305
|
+
pkg_zip_name = publishInfo.pkg_zip_name;
|
|
306
|
+
pkg_dir = publishInfo.pkg_dir;
|
|
307
|
+
apps_name = publishInfo.apps_name;
|
|
308
|
+
need_wechat_push = publishInfo.need_wechat_push; //是否需要企业微信推送
|
|
309
|
+
webhookUrl = wecomWebhook;
|
|
310
|
+
publish_h5web_arr = publishInfo.publish_h5web_arr;
|
|
311
|
+
h5web_name = publishInfo.h5web_name;
|
|
312
|
+
|
|
313
|
+
//全局配置
|
|
314
|
+
axios.defaults.baseURL = lightBaseURL;
|
|
315
|
+
axios.defaults.headers["cookie"] = `token=${token}`;
|
|
316
|
+
axios.defaults.headers["User-Agent"] =
|
|
317
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.8.8.8";
|
|
318
|
+
axios.defaults.timeout = 60000;
|
|
319
|
+
log(pkgid, publish_app_arr);
|
|
320
|
+
if (publish_app_arr.length > 0) {
|
|
146
321
|
await Main(pkgid, publish_app_arr);
|
|
322
|
+
}
|
|
323
|
+
if (publish_h5web_arr && publish_h5web_arr.length > 0) {
|
|
324
|
+
await MainH5web(publish_h5web_arr);
|
|
325
|
+
}
|
|
147
326
|
}
|
|
148
327
|
|
|
149
328
|
module.exports = {
|
|
150
|
-
|
|
329
|
+
LSC,
|
|
330
|
+
checkH5webAppIds,
|
|
331
|
+
checkAppIds,
|
|
151
332
|
};
|