@sfmc-bds/bds-tools 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.
Files changed (70) hide show
  1. package/README.md +18 -0
  2. package/dist/bds-manager.d.ts +27 -0
  3. package/dist/bds-manager.d.ts.map +1 -0
  4. package/dist/bds-manager.js +294 -0
  5. package/dist/bds-manager.js.map +1 -0
  6. package/dist/changelog.d.ts +9 -0
  7. package/dist/changelog.d.ts.map +1 -0
  8. package/dist/changelog.js +59 -0
  9. package/dist/changelog.js.map +1 -0
  10. package/dist/check-update.d.ts +12 -0
  11. package/dist/check-update.d.ts.map +1 -0
  12. package/dist/check-update.js +442 -0
  13. package/dist/check-update.js.map +1 -0
  14. package/dist/cli-pack-manager.d.ts +19 -0
  15. package/dist/cli-pack-manager.d.ts.map +1 -0
  16. package/dist/cli-pack-manager.js +154 -0
  17. package/dist/cli-pack-manager.js.map +1 -0
  18. package/dist/fsx.d.ts +25 -0
  19. package/dist/fsx.d.ts.map +1 -0
  20. package/dist/fsx.js +117 -0
  21. package/dist/fsx.js.map +1 -0
  22. package/dist/http.d.ts +37 -0
  23. package/dist/http.d.ts.map +1 -0
  24. package/dist/http.js +203 -0
  25. package/dist/http.js.map +1 -0
  26. package/dist/log.d.ts +13 -0
  27. package/dist/log.d.ts.map +1 -0
  28. package/dist/log.js +22 -0
  29. package/dist/log.js.map +1 -0
  30. package/dist/logger.d.ts +10 -0
  31. package/dist/logger.d.ts.map +1 -0
  32. package/dist/logger.js +10 -0
  33. package/dist/logger.js.map +1 -0
  34. package/dist/pack-manager.d.ts +136 -0
  35. package/dist/pack-manager.d.ts.map +1 -0
  36. package/dist/pack-manager.js +264 -0
  37. package/dist/pack-manager.js.map +1 -0
  38. package/dist/paths.d.ts +28 -0
  39. package/dist/paths.d.ts.map +1 -0
  40. package/dist/paths.js +47 -0
  41. package/dist/paths.js.map +1 -0
  42. package/dist/qqutil.d.ts +13 -0
  43. package/dist/qqutil.d.ts.map +1 -0
  44. package/dist/qqutil.js +101 -0
  45. package/dist/qqutil.js.map +1 -0
  46. package/dist/recovery.d.ts +8 -0
  47. package/dist/recovery.d.ts.map +1 -0
  48. package/dist/recovery.js +45 -0
  49. package/dist/recovery.js.map +1 -0
  50. package/dist/rollback.d.ts +36 -0
  51. package/dist/rollback.d.ts.map +1 -0
  52. package/dist/rollback.js +87 -0
  53. package/dist/rollback.js.map +1 -0
  54. package/dist/taskbar.d.ts +42 -0
  55. package/dist/taskbar.d.ts.map +1 -0
  56. package/dist/taskbar.js +94 -0
  57. package/dist/taskbar.js.map +1 -0
  58. package/dist/types.d.ts +56 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +5 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/upstream.d.ts +20 -0
  63. package/dist/upstream.d.ts.map +1 -0
  64. package/dist/upstream.js +126 -0
  65. package/dist/upstream.js.map +1 -0
  66. package/dist/version.d.ts +20 -0
  67. package/dist/version.d.ts.map +1 -0
  68. package/dist/version.js +97 -0
  69. package/dist/version.js.map +1 -0
  70. package/package.json +62 -0
@@ -0,0 +1,442 @@
1
+ /**
2
+ * check-update.ts — BDS 自动更新器 (主流程)
3
+ *
4
+ * 1. 临时 staging 目录 (mkdtempSync) - 避免污染 SCRIPT_DIR
5
+ * 2. 下载/解压失败 → 自动从备份回滚 preserves
6
+ * 3. 流式 SHA256 校验 - 不把 250MB 文件读入内存
7
+ * 4. 兼容版本白名单 - 不匹配则跳过升级
8
+ * 5. QQ 通知统一加 5s 超时 - 永远不阻塞主流程
9
+ * 6. Rollback marker 落盘 - 跨进程 / 跨重启可恢复
10
+ */
11
+ import { createFileSink, createLogger, createStdoutSink } from "@sfmc-bds/sdk/logs";
12
+ import cliProgress from "cli-progress";
13
+ import JSZip from "jszip";
14
+ import fs from "node:fs";
15
+ import os from "node:os";
16
+ import path from "node:path";
17
+ import { createBdsManager } from "./bds-manager.js";
18
+ import { CHANGELOG_BASE, fetchChangelog } from "./changelog.js";
19
+ import { copyDirSync, emptyDirSync, hashFileAsync, rmSafe } from "./fsx.js";
20
+ import { httpDownload } from "./http.js";
21
+ import { loadConfig, LOG_PATH, resolvePaths } from "./paths.js";
22
+ import { sendText, sendWithImage } from "./qqutil.js";
23
+ import { clearRollbackMarker, getDirSize, rollbackFromBackup, verifyBdsInstall, writeRollbackMarker, } from "./rollback.js";
24
+ import { clearTaskbarProgress, isTaskbarSupported, setTaskbarProgress } from "./taskbar.js";
25
+ import { buildDownloadUrls, fetchVersionDetails, getVersionInfo, isVersionCompatible, verifyFileHash, } from "./upstream.js";
26
+ import { compareVersions, getCurrentVersionAsync, getCurrentVersionSync, saveVersionCache } from "./version.js";
27
+ // 独立入口:source = "updater",与 bds-manager 的 "bds-tools" 区分
28
+ const updaterFileSink = createFileSink(LOG_PATH);
29
+ const log = createLogger({ source: "updater", sinks: [createStdoutSink({ bare: true }), updaterFileSink] });
30
+ const closeLog = () => updaterFileSink.close();
31
+ function parseArgs(argv) {
32
+ const out = {};
33
+ for (const a of argv) {
34
+ const m = a.match(/^--([\w-]+)(?:=(.+))?$/);
35
+ if (m)
36
+ out[m[1]] = m[2] || true;
37
+ }
38
+ return out;
39
+ }
40
+ function buildContext() {
41
+ const cfg = loadConfig();
42
+ const args = parseArgs(process.argv.slice(2));
43
+ const { bds_path, backup_dir, preserve } = resolvePaths(cfg);
44
+ const channel = String(args["channel"] || cfg.channel || "release");
45
+ return {
46
+ cfg,
47
+ channel,
48
+ checkOnly: !!args["check-only"],
49
+ force: !!args["force"],
50
+ bdsPath: bds_path,
51
+ backupDir: backup_dir,
52
+ preserve,
53
+ autoRestart: !args["no-start"] && cfg.auto_restart !== false,
54
+ qqNotify: !!cfg.qq_notify,
55
+ };
56
+ }
57
+ async function doBackup(bdsPath, backupDir, preserve) {
58
+ const dateStr = new Date().toISOString().slice(0, 10);
59
+ const dest = path.join(backupDir, dateStr);
60
+ fs.mkdirSync(dest, { recursive: true });
61
+ let anyCopied = false;
62
+ for (const item of preserve) {
63
+ const src = path.join(bdsPath, item);
64
+ const target = path.join(dest, item);
65
+ if (!fs.existsSync(src))
66
+ continue;
67
+ fs.mkdirSync(path.dirname(target), { recursive: true });
68
+ if (fs.statSync(src).isDirectory())
69
+ copyDirSync(src, target);
70
+ else
71
+ fs.copyFileSync(src, target);
72
+ anyCopied = true;
73
+ log.info(`已备份: ${item}`);
74
+ }
75
+ // 即使全部 preserve 都跳过,也让目录存在以便记录时间戳
76
+ if (!anyCopied) {
77
+ log.info(`没有需要备份的文件 (preserve 列表为空或全部缺失)`);
78
+ }
79
+ return { path: dest, size: getDirSize(dest) };
80
+ }
81
+ /** 异步恢复 preserves 从备份到 BDS 路径 */
82
+ async function restorePreserves(bdsPath, backupDir, preserve) {
83
+ for (const item of preserve) {
84
+ const src = path.join(backupDir, item);
85
+ const dest = path.join(bdsPath, item);
86
+ if (!fs.existsSync(src))
87
+ continue;
88
+ try {
89
+ if (fs.statSync(src).isDirectory()) {
90
+ if (fs.existsSync(dest))
91
+ emptyDirSync(dest);
92
+ copyDirSync(src, dest);
93
+ }
94
+ else {
95
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
96
+ fs.copyFileSync(src, dest);
97
+ }
98
+ log.info(`已恢复: ${item}`);
99
+ }
100
+ catch (e) {
101
+ log.warn(`恢复失败 ${item}: ${e.message}`);
102
+ }
103
+ }
104
+ }
105
+ /** 把 srcDir 下的内容移动到 destDir (覆盖) */
106
+ async function extractZipToBds(zipPath, destDir) {
107
+ const data = await fs.promises.readFile(zipPath);
108
+ const zip = await JSZip.loadAsync(data);
109
+ // 抽出到临时目录,避免旧内容干扰
110
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "bds-extract-"));
111
+ try {
112
+ const entries = Object.values(zip.files);
113
+ for (const e of entries) {
114
+ const out = path.join(tmpDir, e.name);
115
+ if (e.dir) {
116
+ fs.mkdirSync(out, { recursive: true });
117
+ continue;
118
+ }
119
+ fs.mkdirSync(path.dirname(out), { recursive: true });
120
+ const buf = await e.async("nodebuffer");
121
+ fs.writeFileSync(out, buf);
122
+ }
123
+ // 把临时目录里的内容复制到 BDS 路径
124
+ for (const entry of fs.readdirSync(tmpDir)) {
125
+ const srcPath = path.join(tmpDir, entry);
126
+ const destPath = path.join(destDir, entry);
127
+ if (fs.statSync(srcPath).isDirectory()) {
128
+ if (fs.existsSync(destPath))
129
+ emptyDirSync(destPath);
130
+ copyDirSync(srcPath, destPath);
131
+ }
132
+ else {
133
+ fs.copyFileSync(srcPath, destPath);
134
+ }
135
+ }
136
+ }
137
+ finally {
138
+ rmSafe(tmpDir);
139
+ }
140
+ }
141
+ export async function runUpdate() {
142
+ const startTime = Date.now();
143
+ const ctx = buildContext();
144
+ const { cfg, channel, checkOnly, force, bdsPath, backupDir, preserve, autoRestart, qqNotify } = ctx;
145
+ log.info(`===== 开始检查更新 (${channel}) =====`);
146
+ fs.mkdirSync(bdsPath, { recursive: true });
147
+ fs.mkdirSync(backupDir, { recursive: true });
148
+ // 1. 当前版本
149
+ const exePath = path.join(bdsPath, "bedrock_server.exe");
150
+ const currentVer = await getCurrentVersionAsync(exePath).catch(() => getCurrentVersionSync(exePath));
151
+ log.info(`当前版本: ${currentVer}`);
152
+ // 2. 获取最新版本
153
+ let latestVer;
154
+ try {
155
+ const info = await getVersionInfo(cfg, channel);
156
+ latestVer = info.version;
157
+ log.info(`最新版本: ${latestVer}`);
158
+ const cmp = compareVersions(latestVer, currentVer);
159
+ if (cmp <= 0 && !force) {
160
+ log.info("已是最新版本,无需更新");
161
+ if (qqNotify) {
162
+ await sendText(`✅ BDS 已是最新版本\n\n当前: ${currentVer}\n最新: ${latestVer}`);
163
+ }
164
+ console.log(`CURRENT=${currentVer}`);
165
+ console.log(`LATEST=${latestVer}`);
166
+ return 0;
167
+ }
168
+ }
169
+ catch (e) {
170
+ log.error(`获取版本信息失败: ${e.message}`);
171
+ await sendText(`❌ BDS 更新失败\n\n无法获取版本信息: ${e.message}`);
172
+ return 1;
173
+ }
174
+ // 兼容性检查
175
+ if (!force && !isVersionCompatible(cfg, latestVer)) {
176
+ log.warn(`${latestVer} 不在兼容版本白名单中,跳过升级`);
177
+ if (qqNotify) {
178
+ await sendText(`⚠️ BDS ${latestVer} 不在兼容性白名单,已跳过升级。请人工确认。`);
179
+ }
180
+ return 2;
181
+ }
182
+ // 3. 取下载链接
183
+ let downloadUrls;
184
+ let hash;
185
+ try {
186
+ const details = await fetchVersionDetails(cfg, channel, latestVer);
187
+ downloadUrls = buildDownloadUrls(cfg, channel, latestVer, details);
188
+ hash = { sha1: details.sha1, sha256: details.sha256 };
189
+ }
190
+ catch (e) {
191
+ log.error(`获取下载详情失败: ${e.message}`);
192
+ await sendText(`❌ BDS 更新失败\n\n下载详情获取失败: ${e.message}`);
193
+ return 1;
194
+ }
195
+ if (checkOnly) {
196
+ console.log(`CURRENT=${currentVer}`);
197
+ console.log(`LATEST=${latestVer}`);
198
+ console.log(`CHANNEL=${channel}`);
199
+ console.log(`URLS=${downloadUrls.length}`);
200
+ return 0;
201
+ }
202
+ log.info(`发现新版本: ${currentVer} → ${latestVer}`);
203
+ // 4. QQ 预告
204
+ if (qqNotify) {
205
+ await sendText(`𝐌𝐢𝐧𝐞𝐜𝐫𝐚𝐟𝐭 𝐁𝐃𝐒 更新通知\n\n` +
206
+ `检测到新版本!\n\n` +
207
+ `当前: ${currentVer}\n` +
208
+ `最新: ${latestVer}\n` +
209
+ `频道: ${channel === "preview" ? "预览版" : "正式版"}\n\n` +
210
+ `服务器即将开始更新~ 请耐心等待^(* ̄(oo) ̄)^`);
211
+ const cl = await fetchChangelog(channel);
212
+ if (cl) {
213
+ const text = `📋 更新内容概要\n\n${cl.text.slice(0, 1500)}\n\n完整日志: ${CHANGELOG_BASE}`;
214
+ if (cl.imageBase64)
215
+ await sendWithImage(text, cl.imageBase64);
216
+ else
217
+ await sendText(text);
218
+ }
219
+ else {
220
+ await sendText(`📋 更新日志: ${CHANGELOG_BASE}`);
221
+ }
222
+ }
223
+ // 5. 备份
224
+ let backupInfo;
225
+ try {
226
+ backupInfo = await doBackup(bdsPath, backupDir, preserve);
227
+ log.info(`备份完成: ${backupInfo.path} (${(backupInfo.size / 1024 / 1024).toFixed(1)} MB)`);
228
+ if (qqNotify) {
229
+ await sendText(`✅ 备份完成\n\n大小: ${(backupInfo.size / 1024 / 1024).toFixed(1)} MB\n位置: ${backupInfo.path}`);
230
+ }
231
+ }
232
+ catch (e) {
233
+ log.error(`备份失败: ${e.message}`);
234
+ await sendText(`❌ BDS 更新失败\n\n备份失败: ${e.message}\n操作已中止`);
235
+ return 1;
236
+ }
237
+ // 6. 写回滚标记 (跨进程可恢复)
238
+ writeRollbackMarker({
239
+ timestamp: Date.now(),
240
+ bds_path: bdsPath,
241
+ backup_dir: backupInfo.path,
242
+ preserve,
243
+ previous_version: currentVer,
244
+ });
245
+ // 7. 停服
246
+ const bds = createBdsManager({ detached: true });
247
+ try {
248
+ log.info("停止 BDS 服务...");
249
+ await bds.stop();
250
+ log.info("BDS 已停止");
251
+ }
252
+ catch (e) {
253
+ log.warn(`BDS 停止异常: ${e.message}`);
254
+ }
255
+ // 8. 下载 (全部失败则回滚)
256
+ // 用 mkdtempSync 创建临时 staging 目录 - 避免污染 SCRIPT_DIR
257
+ const stagingDir = fs.mkdtempSync(path.join(os.tmpdir(), "bds-update-"));
258
+ const zipPath = path.join(stagingDir, `bedrock-server-${latestVer}.zip`);
259
+ let downloaded = false;
260
+ try {
261
+ log.info(`开始下载 ${latestVer}...`);
262
+ if (qqNotify)
263
+ await sendText(`📥 正在下载 BDS ${latestVer}...`);
264
+ let lastErr = null;
265
+ const downloadTimeoutMs = (cfg.download_timeout ?? 120) * 1000;
266
+ const progressBar = new cliProgress.SingleBar({
267
+ format: "下载进度 | {bar} | {percentage}% | {value}/{total} MB | 速度: {speed}",
268
+ barCompleteChar: "\u2588",
269
+ barIncompleteChar: "\u2591",
270
+ hideCursor: true,
271
+ clearOnComplete: false, // 保留进度条
272
+ }, cliProgress.Presets.shades_classic);
273
+ let lastTime = Date.now();
274
+ let lastLoaded = 0;
275
+ let barStarted = false; // 标记是否已启动
276
+ if (isTaskbarSupported()) {
277
+ log.info("检测到 Windows Terminal,任务栏进度已启用 (OSC 9;4)");
278
+ }
279
+ for (const url of downloadUrls) {
280
+ try {
281
+ await httpDownload(url, zipPath, {
282
+ totalTimeoutMs: Math.max(downloadTimeoutMs, 600_000), // 不少于 10 分钟
283
+ onProgress: (dl, total) => {
284
+ // 第一次触发时启动进度条
285
+ if (!barStarted) {
286
+ progressBar.start(total, 0, { speed: "0 KB/s" });
287
+ barStarted = true;
288
+ setTaskbarProgress(0); // 启动任务栏进度(0%)
289
+ }
290
+ const now = Date.now();
291
+ const timeDelta = (now - lastTime) / 1000; // 秒
292
+ const bytesDelta = dl - lastLoaded;
293
+ const speed = timeDelta > 0 ? bytesDelta / timeDelta : 0;
294
+ const speedStr = speed > 1024 * 1024
295
+ ? `${(speed / 1024 / 1024).toFixed(1)} MB/s`
296
+ : speed > 1024
297
+ ? `${(speed / 1024).toFixed(1)} KB/s`
298
+ : `${speed.toFixed(0)} B/s`;
299
+ progressBar.update(dl, { speed: speedStr });
300
+ // 同步任务栏进度(0-100)。httpDownload 内部已做 100ms 节流,
301
+ // 这里再 set 一次,getSnapshot 比较,相同值直接跳过
302
+ setTaskbarProgress((dl / total) * 100);
303
+ lastLoaded = dl;
304
+ lastTime = now;
305
+ },
306
+ });
307
+ progressBar.stop();
308
+ // 下载完成,任务栏收到 100% 绿条后清掉
309
+ setTaskbarProgress(100);
310
+ clearTaskbarProgress();
311
+ downloaded = true;
312
+ lastErr = null;
313
+ break;
314
+ }
315
+ catch (e) {
316
+ if (barStarted)
317
+ progressBar.stop();
318
+ // 下载失败,任务栏亮红
319
+ setTaskbarProgress(100, "error");
320
+ clearTaskbarProgress();
321
+ lastErr = e;
322
+ log.warn(`${url} 不可用: ${lastErr.message},尝试备用地址...`);
323
+ }
324
+ }
325
+ if (!downloaded && lastErr)
326
+ throw lastErr;
327
+ const zipSizeMB = (fs.statSync(zipPath).size / 1024 / 1024).toFixed(1);
328
+ log.info(`下载完成 (${zipSizeMB} MB)`);
329
+ // 流式哈希校验
330
+ if (hash.sha1 || hash.sha256) {
331
+ const algo = hash.sha256 ? "SHA256" : "SHA1";
332
+ log.info(`校验文件完整性 (${algo})...`);
333
+ const ok = await verifyFileHash(zipPath, hash.sha1, hash.sha256);
334
+ if (!ok)
335
+ throw new Error(`${algo} 校验不通过,文件可能损坏`);
336
+ log.info(`${algo} 校验通过`);
337
+ }
338
+ }
339
+ catch (e) {
340
+ log.error(`下载失败: ${e.message}`);
341
+ await sendText(`❌ BDS 更新失败\n\n下载失败: ${e.message}\nBDS 已停止,请手动恢复`);
342
+ // 自动回滚
343
+ rollbackFromBackup({
344
+ timestamp: Date.now(),
345
+ bds_path: bdsPath,
346
+ backup_dir: backupInfo.path,
347
+ preserve,
348
+ previous_version: currentVer,
349
+ });
350
+ rmSafe(stagingDir);
351
+ return 1;
352
+ }
353
+ // 9. 解压 + 部署
354
+ try {
355
+ log.info("解压中...");
356
+ // 先清空 BDS 目录
357
+ emptyDirSync(bdsPath);
358
+ await extractZipToBds(zipPath, bdsPath);
359
+ log.info("解压完成");
360
+ }
361
+ catch (e) {
362
+ log.error(`解压失败: ${e.message}`);
363
+ await sendText(`❌ BDS 更新失败\n\n解压失败: ${e.message}\nBDS 已停止,请手动恢复`);
364
+ // 回滚: 清空 + 从备份恢复 preserves
365
+ emptyDirSync(bdsPath);
366
+ await restorePreserves(bdsPath, backupInfo.path, preserve);
367
+ rmSafe(stagingDir);
368
+ return 1;
369
+ }
370
+ finally {
371
+ rmSafe(zipPath); // 清掉 staging zip
372
+ }
373
+ // 10. 完整性检查 (避免解压出空/缺文件的病态包)
374
+ const verify = verifyBdsInstall(bdsPath, [
375
+ "bedrock_server.exe",
376
+ /*"bedrock_server_symbols.debug",*/ "permissions.json",
377
+ ]);
378
+ if (!verify.ok) {
379
+ log.error(`解压后的 BDS 不完整,缺失文件: ${verify.missing.join(", ")}`);
380
+ await sendText(`❌ BDS 更新失败\n\n部署后缺失关键文件: ${verify.missing.join(", ")}`);
381
+ emptyDirSync(bdsPath);
382
+ await restorePreserves(bdsPath, backupInfo.path, preserve);
383
+ rmSafe(stagingDir);
384
+ return 1;
385
+ }
386
+ // 11. 恢复 preserves (zip 解压时这些目录可能被覆盖)
387
+ await restorePreserves(bdsPath, backupInfo.path, preserve);
388
+ // 12. 写入版本缓存
389
+ const newExeHash = await hashFileAsync(exePath, "sha256").catch(() => "");
390
+ if (newExeHash) {
391
+ saveVersionCache(latestVer, newExeHash);
392
+ log.info(`已记录版本 ${latestVer} 的 SHA256`);
393
+ }
394
+ // 13. 启动 BDS
395
+ if (autoRestart) {
396
+ try {
397
+ log.info("启动 BDS...");
398
+ await bds.start();
399
+ }
400
+ catch (e) {
401
+ log.error(`启动失败: ${e.message}`);
402
+ await sendText(`❌ BDS 更新失败\n\n启动失败: ${e.message}\n请手动启动 BDS`);
403
+ // 注意: 此时 BDS 已经部署完成,启动失败 → 启动问题,不做文件级回滚
404
+ rmSafe(stagingDir);
405
+ clearRollbackMarker();
406
+ return 1;
407
+ }
408
+ }
409
+ rmSafe(stagingDir);
410
+ clearRollbackMarker();
411
+ // 14. QQ 通知结果
412
+ const durationMs = Date.now() - startTime;
413
+ if (qqNotify) {
414
+ await sendText(`✅ BDS 更新完成\n\n` +
415
+ `${currentVer} → ${latestVer}\n` +
416
+ `耗时: ${(durationMs / 1000).toFixed(1)}s\n` +
417
+ `${autoRestart ? "服务器已重新启动" : "请手动重启服务器"}`);
418
+ }
419
+ log.info(`===== 更新完成 (${(durationMs / 1000).toFixed(1)}s) =====`);
420
+ return 0;
421
+ }
422
+ function isMain() {
423
+ if (process.env.SFMC_SERVICE === "update")
424
+ return true;
425
+ if (require.main === module)
426
+ return true;
427
+ const entry = process.argv[1] ?? "";
428
+ return entry.endsWith("check-update.js") || entry.endsWith("check-update.ts");
429
+ }
430
+ if (isMain()) {
431
+ runUpdate()
432
+ .then((code) => {
433
+ closeLog();
434
+ process.exit(code);
435
+ })
436
+ .catch((e) => {
437
+ log.error(`未捕获错误: ${e.message}`);
438
+ closeLog();
439
+ process.exit(1);
440
+ });
441
+ }
442
+ //# sourceMappingURL=check-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-update.js","sourceRoot":"","sources":["../src/check-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhH,yDAAyD;AACzD,MAAM,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;AACjD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;AAC5G,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;AAErD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,GAAG,GAAqC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAcD,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IACpE,OAAO;QACL,GAAG;QACH,OAAO;QACP,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACtB,OAAO,EAAE,QAAQ;QACjB,SAAS,EAAE,UAAU;QACrB,QAAQ;QACR,WAAW,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK;QAC5D,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,OAAe,EACf,SAAiB,EACjB,QAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YAAE,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;YACxD,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClC,SAAS,GAAG,IAAI,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,iCAAiC;AACjC,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,SAAiB,EAAE,QAAkB;IACpF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACnC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC5C,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,OAAe;IAC7D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxC,kBAAkB;IAClB,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACV,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,SAAS;YACX,CAAC;YACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,sBAAsB;QACtB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACpD,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAEpG,GAAG,CAAC,IAAI,CAAC,iBAAiB,OAAO,SAAS,CAAC,CAAC;IAC5C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,UAAU;IACV,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrG,GAAG,CAAC,IAAI,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;IAEhC,YAAY;IACZ,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChD,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxB,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,QAAQ,CAAC,uBAAuB,UAAU,SAAS,SAAS,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,aAAc,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,CAAC,2BAA4B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,QAAQ;IACR,IAAI,CAAC,KAAK,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,kBAAkB,CAAC,CAAC;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,UAAU,SAAS,wBAAwB,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,WAAW;IACX,IAAI,YAAsB,CAAC;IAC3B,IAAI,IAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACnE,YAAY,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,aAAc,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,CAAC,2BAA4B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,QAAQ,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,UAAU,UAAU,MAAM,SAAS,EAAE,CAAC,CAAC;IAEhD,WAAW;IACX,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,CACZ,oCAAoC;YAClC,aAAa;YACb,OAAO,UAAU,IAAI;YACrB,OAAO,SAAS,IAAI;YACpB,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;YAClD,6BAA6B,CAChC,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,cAAc,EAAE,CAAC;YACjF,IAAI,EAAE,CAAC,WAAW;gBAAE,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;;gBACzD,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,YAAY,cAAc,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,QAAQ;IACR,IAAI,UAA0C,CAAC;IAC/C,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,SAAU,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,MAAM,QAAQ,CAAC,uBAAwB,CAAW,CAAC,OAAO,SAAS,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,oBAAoB;IACpB,mBAAmB,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,UAAU,CAAC,IAAI;QAC3B,QAAQ;QACR,gBAAgB,EAAE,UAAU;KAC7B,CAAC,CAAC;IAEH,QAAQ;IACR,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,aAAc,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,kBAAkB;IAClB,kDAAkD;IAClD,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,SAAS,MAAM,CAAC,CAAC;IACzE,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,QAAQ,SAAS,KAAK,CAAC,CAAC;QACjC,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC,eAAe,SAAS,KAAK,CAAC,CAAC;QAE5D,IAAI,OAAO,GAAiB,IAAI,CAAC;QACjC,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QAC/D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,SAAS,CAC3C;YACE,MAAM,EAAE,iEAAiE;YACzE,eAAe,EAAE,QAAQ;YACzB,iBAAiB,EAAE,QAAQ;YAC3B,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,KAAK,EAAE,QAAQ;SACjC,EACD,WAAW,CAAC,OAAO,CAAC,cAAc,CACnC,CAAC;QAEF,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU;QAClC,IAAI,kBAAkB,EAAE,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE;oBAC/B,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,YAAY;oBAClE,UAAU,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;wBACxB,cAAc;wBACd,IAAI,CAAC,UAAU,EAAE,CAAC;4BAChB,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;4BACjD,UAAU,GAAG,IAAI,CAAC;4BAClB,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;wBACvC,CAAC;wBACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBACvB,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI;wBAC/C,MAAM,UAAU,GAAG,EAAE,GAAG,UAAU,CAAC;wBACnC,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;wBACzD,MAAM,QAAQ,GACZ,KAAK,GAAG,IAAI,GAAG,IAAI;4BACjB,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;4BAC5C,CAAC,CAAC,KAAK,GAAG,IAAI;gCACZ,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gCACrC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;wBAClC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;wBAC5C,6CAA6C;wBAC7C,oCAAoC;wBACpC,kBAAkB,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;wBACvC,UAAU,GAAG,EAAE,CAAC;wBAChB,QAAQ,GAAG,GAAG,CAAC;oBACjB,CAAC;iBACF,CAAC,CAAC;gBACH,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnB,wBAAwB;gBACxB,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACxB,oBAAoB,EAAE,CAAC;gBACvB,UAAU,GAAG,IAAI,CAAC;gBAClB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,UAAU;oBAAE,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnC,aAAa;gBACb,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACjC,oBAAoB,EAAE,CAAC;gBACvB,OAAO,GAAG,CAAU,CAAC;gBACrB,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,OAAO,CAAC,OAAO,YAAY,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,OAAO;YAAE,MAAM,OAAO,CAAC;QAE1C,MAAM,SAAS,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,SAAS,SAAS,MAAM,CAAC,CAAC;QAEnC,SAAS;QACT,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;YACjC,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,SAAU,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,MAAM,QAAQ,CAAC,uBAAwB,CAAW,CAAC,OAAO,iBAAiB,CAAC,CAAC;QAC7E,OAAO;QACP,kBAAkB,CAAC;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,UAAU,CAAC,IAAI;YAC3B,QAAQ;YACR,gBAAgB,EAAE,UAAU;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,aAAa;IACb,IAAI,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnB,aAAa;QACb,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,SAAU,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,MAAM,QAAQ,CAAC,uBAAwB,CAAW,CAAC,OAAO,iBAAiB,CAAC,CAAC;QAC7E,2BAA2B;QAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB;IACpC,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE;QACvC,oBAAoB;QACpB,mCAAmC,CAAC,kBAAkB;KACvD,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,QAAQ,CAAC,4BAA4B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,sCAAsC;IACtC,MAAM,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3D,aAAa;IACb,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,UAAU,EAAE,CAAC;QACf,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,SAAS,SAAS,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa;IACb,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,SAAU,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3C,MAAM,QAAQ,CAAC,uBAAwB,CAAW,CAAC,OAAO,aAAa,CAAC,CAAC;YACzE,wCAAwC;YACxC,MAAM,CAAC,UAAU,CAAC,CAAC;YACnB,mBAAmB,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,CAAC;IACnB,mBAAmB,EAAE,CAAC;IAEtB,cAAc;IACd,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,CACZ,gBAAgB;YACd,GAAG,UAAU,MAAM,SAAS,IAAI;YAChC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YAC1C,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAC7C,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,MAAM;IACb,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,MAAM,EAAE,EAAE,CAAC;IACb,SAAS,EAAE;SACR,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACX,GAAG,CAAC,KAAK,CAAC,UAAW,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * pack-manager CLI — thin wrapper around the pack-manager pure functions
4
+ * so spawnService can call it as a sub-process.
5
+ *
6
+ * node bds-tools/dist/pack-manager.js assemble-bp --src <dir> --out <dir> --name <name> [--version 1,0,0] [--description "..."] [--icon <png>]
7
+ * node bds-tools/dist/pack-manager.js assemble-rp --modules-dir <dir> --out <dir> --name <name> [--version 1,0,0] [--description "..."]
8
+ * node bds-tools/dist/pack-manager.js deploy --bds-root <dir> --level <name> --bp-src <dir> [--rp-src <dir>] --bp-name <name> [--rp-name <name>]
9
+ * node bds-tools/dist/pack-manager.js enable-pack --worlds-dir <dir> --level <name> --kind behavior|resource --pack-id <uuid> --version 1,0,0
10
+ * node bds-tools/dist/pack-manager.js disable-pack --worlds-dir <dir> --level <name> --kind behavior|resource --pack-id <uuid>
11
+ * node bds-tools/dist/pack-manager.js read-level --bds-root <dir>
12
+ *
13
+ * The pure-function API lives in pack-manager.ts. This CLI exists so the
14
+ * SEA-launched child process doesn't have to deal with module resolution —
15
+ * it just gets spawnService-injected SFMC_ROOT, finds its own dist sibling,
16
+ * and reads JSON flags from argv.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=cli-pack-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-pack-manager.d.ts","sourceRoot":"","sources":["../src/cli-pack-manager.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * pack-manager CLI — thin wrapper around the pack-manager pure functions
4
+ * so spawnService can call it as a sub-process.
5
+ *
6
+ * node bds-tools/dist/pack-manager.js assemble-bp --src <dir> --out <dir> --name <name> [--version 1,0,0] [--description "..."] [--icon <png>]
7
+ * node bds-tools/dist/pack-manager.js assemble-rp --modules-dir <dir> --out <dir> --name <name> [--version 1,0,0] [--description "..."]
8
+ * node bds-tools/dist/pack-manager.js deploy --bds-root <dir> --level <name> --bp-src <dir> [--rp-src <dir>] --bp-name <name> [--rp-name <name>]
9
+ * node bds-tools/dist/pack-manager.js enable-pack --worlds-dir <dir> --level <name> --kind behavior|resource --pack-id <uuid> --version 1,0,0
10
+ * node bds-tools/dist/pack-manager.js disable-pack --worlds-dir <dir> --level <name> --kind behavior|resource --pack-id <uuid>
11
+ * node bds-tools/dist/pack-manager.js read-level --bds-root <dir>
12
+ *
13
+ * The pure-function API lives in pack-manager.ts. This CLI exists so the
14
+ * SEA-launched child process doesn't have to deal with module resolution —
15
+ * it just gets spawnService-injected SFMC_ROOT, finds its own dist sibling,
16
+ * and reads JSON flags from argv.
17
+ */
18
+ import path from "node:path";
19
+ import process from "node:process";
20
+ import { readLevelName } from "./pack-manager.js";
21
+ function die(msg, code = 1) {
22
+ process.stderr.write(`[pack-manager] ${msg}\n`);
23
+ process.exit(code);
24
+ }
25
+ function parseArgs(argv) {
26
+ const out = {};
27
+ for (let i = 0; i < argv.length; i++) {
28
+ const a = argv[i];
29
+ if (a && a.startsWith("--")) {
30
+ const key = a.slice(2);
31
+ const next = argv[++i];
32
+ out[key] = next;
33
+ }
34
+ }
35
+ return out;
36
+ }
37
+ function need(args, key) {
38
+ const v = args[key];
39
+ if (!v)
40
+ die(`--${key} required`);
41
+ return v;
42
+ }
43
+ function parseVersion(s) {
44
+ if (!s)
45
+ return [1, 0, 0];
46
+ const parts = s.split(",").map((x) => Number(x.trim()));
47
+ if (parts.length !== 3 || parts.some((n) => !Number.isInteger(n) || n < 0)) {
48
+ die(`invalid --version (expected "M,m,p"): ${s}`);
49
+ }
50
+ return parts;
51
+ }
52
+ async function main() {
53
+ const argv = process.argv.slice(2);
54
+ if (argv.length === 0) {
55
+ die("usage: pack-manager <verb> [--flags]");
56
+ }
57
+ const verb = argv[0];
58
+ const args = parseArgs(argv.slice(1));
59
+ const mod = await import("./pack-manager.js");
60
+ switch (verb) {
61
+ case "assemble-bp": {
62
+ const src = need(args, "src");
63
+ const out = need(args, "out");
64
+ const name = need(args, "name");
65
+ const icon = args["icon"];
66
+ await mod.assembleBehaviorPack({
67
+ srcDir: path.resolve(src),
68
+ outDir: path.resolve(out),
69
+ projectName: name,
70
+ version: parseVersion(args["version"]),
71
+ description: args["description"],
72
+ ...(icon ? { iconSrc: path.resolve(icon) } : {}),
73
+ });
74
+ process.stdout.write(`[pack-manager] assembled BP at ${out}\n`);
75
+ return;
76
+ }
77
+ case "assemble-rp": {
78
+ const modulesDir = need(args, "modules-dir");
79
+ const out = need(args, "out");
80
+ const name = need(args, "name");
81
+ const map = mod.scanModuleResourcePacks(path.resolve(modulesDir));
82
+ await mod.assembleResourcePack({
83
+ moduleResourceDirs: map,
84
+ outDir: path.resolve(out),
85
+ projectName: name,
86
+ version: parseVersion(args["version"]),
87
+ description: args["description"],
88
+ });
89
+ process.stdout.write(`[pack-manager] assembled RP at ${out} (${Object.keys(map).length} modules)\n`);
90
+ return;
91
+ }
92
+ case "deploy": {
93
+ const bdsRoot = need(args, "bds-root");
94
+ const level = need(args, "level");
95
+ const bpSrc = need(args, "bp-src");
96
+ const bpName = need(args, "bp-name");
97
+ const rpSrc = args["rp-src"];
98
+ const rpName = args["rp-name"];
99
+ await mod.deployToBDS({
100
+ bdsRoot: path.resolve(bdsRoot),
101
+ levelName: level,
102
+ behaviorPackSrc: path.resolve(bpSrc),
103
+ ...(rpSrc ? { resourcePackSrc: path.resolve(rpSrc) } : {}),
104
+ bpName,
105
+ ...(rpName ? { rpName } : {}),
106
+ });
107
+ process.stdout.write(`[pack-manager] deployed to ${path.join(bdsRoot, "worlds", level)}\n`);
108
+ return;
109
+ }
110
+ case "enable-pack": {
111
+ const worldsDir = need(args, "worlds-dir");
112
+ const level = need(args, "level");
113
+ const kind = need(args, "kind");
114
+ const packId = need(args, "pack-id");
115
+ await mod.enablePackInWorld({
116
+ worldsDir: path.resolve(worldsDir),
117
+ levelName: level,
118
+ kind,
119
+ packUuid: packId,
120
+ version: parseVersion(args["version"]),
121
+ });
122
+ process.stdout.write(`[pack-manager] enabled ${kind} pack ${packId} in ${level}\n`);
123
+ return;
124
+ }
125
+ case "disable-pack": {
126
+ const worldsDir = need(args, "worlds-dir");
127
+ const level = need(args, "level");
128
+ const kind = need(args, "kind");
129
+ const packId = need(args, "pack-id");
130
+ await mod.disablePackInWorld({
131
+ worldsDir: path.resolve(worldsDir),
132
+ levelName: level,
133
+ kind,
134
+ packUuid: packId,
135
+ version: parseVersion(args["version"] ?? "1,0,0"),
136
+ });
137
+ process.stdout.write(`[pack-manager] disabled ${kind} pack ${packId} in ${level}\n`);
138
+ return;
139
+ }
140
+ case "read-level": {
141
+ const root = need(args, "bds-root");
142
+ const name = await readLevelName(path.resolve(root));
143
+ process.stdout.write(`${name}\n`);
144
+ return;
145
+ }
146
+ default:
147
+ die(`unknown verb: ${verb}`);
148
+ }
149
+ }
150
+ main().catch((err) => {
151
+ const msg = err instanceof Error ? (err.stack ?? err.message) : String(err);
152
+ die(msg);
153
+ });
154
+ //# sourceMappingURL=cli-pack-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-pack-manager.js","sourceRoot":"","sources":["../src/cli-pack-manager.ts"],"names":[],"mappings":"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"}