@sfmc-bds/bds-tools 0.1.0 → 0.2.0-beta.1

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 (73) hide show
  1. package/dist/bds-manager.d.ts.map +1 -1
  2. package/dist/bds-manager.js +236 -263
  3. package/dist/bds-manager.js.map +7 -1
  4. package/dist/changelog.js +39 -50
  5. package/dist/changelog.js.map +7 -1
  6. package/dist/check-update.d.ts +2 -2
  7. package/dist/check-update.d.ts.map +1 -1
  8. package/dist/check-update.js +361 -401
  9. package/dist/check-update.js.map +7 -1
  10. package/dist/cli-pack-manager.d.ts +10 -6
  11. package/dist/cli-pack-manager.d.ts.map +1 -1
  12. package/dist/cli-pack-manager.js +229 -134
  13. package/dist/cli-pack-manager.js.map +7 -1
  14. package/dist/fsx.d.ts +9 -0
  15. package/dist/fsx.d.ts.map +1 -1
  16. package/dist/fsx.js +105 -100
  17. package/dist/fsx.js.map +7 -1
  18. package/dist/http.d.ts.map +1 -1
  19. package/dist/http.js +166 -185
  20. package/dist/http.js.map +7 -1
  21. package/dist/is-main.d.ts +17 -0
  22. package/dist/is-main.d.ts.map +1 -0
  23. package/dist/is-main.js +32 -0
  24. package/dist/is-main.js.map +7 -0
  25. package/dist/log.d.ts +2 -4
  26. package/dist/log.d.ts.map +1 -1
  27. package/dist/log.js +12 -19
  28. package/dist/log.js.map +7 -1
  29. package/dist/logger.js +6 -10
  30. package/dist/logger.js.map +7 -1
  31. package/dist/pack-manager.d.ts +88 -24
  32. package/dist/pack-manager.d.ts.map +1 -1
  33. package/dist/pack-manager.js +282 -246
  34. package/dist/pack-manager.js.map +7 -1
  35. package/dist/paths.d.ts +8 -3
  36. package/dist/paths.d.ts.map +1 -1
  37. package/dist/paths.js +53 -39
  38. package/dist/paths.js.map +7 -1
  39. package/dist/qqutil.d.ts.map +1 -1
  40. package/dist/qqutil.js +90 -87
  41. package/dist/qqutil.js.map +7 -1
  42. package/dist/recovery.js +26 -37
  43. package/dist/recovery.js.map +7 -1
  44. package/dist/rollback.d.ts +1 -1
  45. package/dist/rollback.js +55 -74
  46. package/dist/rollback.js.map +7 -1
  47. package/dist/server-properties.d.ts +12 -0
  48. package/dist/server-properties.d.ts.map +1 -0
  49. package/dist/server-properties.js +28 -0
  50. package/dist/server-properties.js.map +7 -0
  51. package/dist/taskbar.d.ts +2 -0
  52. package/dist/taskbar.d.ts.map +1 -1
  53. package/dist/taskbar.js +51 -82
  54. package/dist/taskbar.js.map +7 -1
  55. package/dist/types.js +1 -5
  56. package/dist/types.js.map +7 -1
  57. package/dist/update-result.d.ts +18 -0
  58. package/dist/update-result.d.ts.map +1 -0
  59. package/dist/update-result.js +17 -0
  60. package/dist/update-result.js.map +7 -0
  61. package/dist/upstream.js +94 -108
  62. package/dist/upstream.js.map +7 -1
  63. package/dist/version.js +63 -81
  64. package/dist/version.js.map +7 -1
  65. package/dist/world-packs.d.ts +174 -0
  66. package/dist/world-packs.d.ts.map +1 -0
  67. package/dist/world-packs.js +509 -0
  68. package/dist/world-packs.js.map +7 -0
  69. package/dist/zipx.d.ts +10 -0
  70. package/dist/zipx.d.ts.map +1 -0
  71. package/dist/zipx.js +48 -0
  72. package/dist/zipx.js.map +7 -0
  73. package/package.json +17 -6
package/dist/version.js CHANGED
@@ -1,97 +1,79 @@
1
- /**
2
- * version.ts — 版本号工具 / 版本缓存
3
- */
4
1
  import { readJson, writeJson } from "@sfmc-bds/sdk/node/config";
5
2
  import fs from "node:fs";
6
3
  import { VERSION_CACHE } from "./paths.js";
7
4
  import { hashFileSync, hashFileAsync } from "./fsx.js";
8
5
  import { log } from "./log.js";
9
- /** 4段 → 3段 (去尾) */
10
- export function toVer3(v) {
11
- return v.split(".").slice(0, 3).join(".");
6
+ function toVer3(v) {
7
+ return v.split(".").slice(0, 3).join(".");
12
8
  }
13
- /** 3段 → 4段 (补 0) */
14
- export function toVer4(v) {
15
- const p = v.split(".");
16
- while (p.length < 4)
17
- p.push("0");
18
- return p.join(".");
9
+ function toVer4(v) {
10
+ const p = v.split(".");
11
+ while (p.length < 4) p.push("0");
12
+ return p.join(".");
19
13
  }
20
- /** 版本比较 ( 4 段数字排序) */
21
- export function compareVersions(a, b) {
22
- const sa = a.replace(/-preview$/, "");
23
- const sb = b.replace(/-preview$/, "");
24
- const pa = sa.split(".").map(Number);
25
- const pb = sb.split(".").map(Number);
26
- for (let i = 0; i < 4; i++) {
27
- const ai = pa[i] ?? 0;
28
- const bi = pb[i] ?? 0;
29
- if (ai !== bi)
30
- return ai - bi;
31
- }
32
- // preview 低于不带 -preview 的同一数字
33
- if (a.endsWith("-preview") && !b.endsWith("-preview"))
34
- return -1;
35
- if (!a.endsWith("-preview") && b.endsWith("-preview"))
36
- return 1;
37
- return 0;
14
+ function compareVersions(a, b) {
15
+ const sa = a.replace(/-preview$/, "");
16
+ const sb = b.replace(/-preview$/, "");
17
+ const pa = sa.split(".").map(Number);
18
+ const pb = sb.split(".").map(Number);
19
+ for (let i = 0; i < 4; i++) {
20
+ const ai = pa[i] ?? 0;
21
+ const bi = pb[i] ?? 0;
22
+ if (ai !== bi) return ai - bi;
23
+ }
24
+ if (a.endsWith("-preview") && !b.endsWith("-preview")) return -1;
25
+ if (!a.endsWith("-preview") && b.endsWith("-preview")) return 1;
26
+ return 0;
38
27
  }
39
- /** 简单的真值校验 (按版本号外形) */
40
- export function isValidVersion(v) {
41
- return /^\d+\.\d+\.\d+(\.\d+)?(-preview)?$/.test(v);
28
+ function isValidVersion(v) {
29
+ return /^\d+\.\d+\.\d+(\.\d+)?(-preview)?$/.test(v);
42
30
  }
43
31
  function readCache() {
44
- return readJson(VERSION_CACHE) ?? {};
32
+ return readJson(VERSION_CACHE) ?? {};
45
33
  }
46
- /** 仅保留最近 3 条版本缓存 (避免无限增长) */
47
34
  function trimCache(cache) {
48
- const keys = Object.keys(cache).sort(compareVersions).slice(-3);
49
- const trimmed = {};
50
- for (const k of keys)
51
- trimmed[k] = cache[k];
52
- return trimmed;
35
+ const keys = Object.keys(cache).sort(compareVersions).slice(-3);
36
+ const trimmed = {};
37
+ for (const k of keys) trimmed[k] = cache[k];
38
+ return trimmed;
53
39
  }
54
- export function saveVersionCache(version, sha256) {
55
- const cache = readCache();
56
- cache[version] = { sha256, verified_at: Date.now() };
57
- try {
58
- writeJson(VERSION_CACHE, trimCache(cache));
59
- }
60
- catch {
61
- /* ignore */
62
- }
40
+ function saveVersionCache(version, sha256) {
41
+ const cache = readCache();
42
+ cache[version] = { sha256, verified_at: Date.now() };
43
+ try {
44
+ writeJson(VERSION_CACHE, trimCache(cache));
45
+ } catch {
46
+ }
63
47
  }
64
- /**
65
- * 异步识别当前 BDS 版本
66
- * 优先通过 SHA256 反查缓存,失败则回退 `current_version.txt`(如果存在)
67
- */
68
- export async function getCurrentVersionAsync(exePath) {
69
- if (!fs.existsSync(exePath))
70
- return "0.0.0.0";
71
- const actual = await hashFileAsync(exePath, "sha256");
72
- if (!actual)
73
- return "0.0.0.0";
74
- const cache = readCache();
75
- for (const [ver, entry] of Object.entries(cache)) {
76
- if (entry.sha256 === actual)
77
- return ver;
78
- }
79
- log.warn("[BDSUpdater] bedrock_server.exe 哈希未匹配缓存,疑似被改动或首次启动");
80
- return "0.0.0.0";
48
+ async function getCurrentVersionAsync(exePath) {
49
+ if (!fs.existsSync(exePath)) return "0.0.0.0";
50
+ const actual = await hashFileAsync(exePath, "sha256");
51
+ if (!actual) return "0.0.0.0";
52
+ const cache = readCache();
53
+ for (const [ver, entry] of Object.entries(cache)) {
54
+ if (entry.sha256 === actual) return ver;
55
+ }
56
+ log.warn("[BDSUpdater] bedrock_server.exe \u54C8\u5E0C\u672A\u5339\u914D\u7F13\u5B58\uFF0C\u7591\u4F3C\u88AB\u6539\u52A8\u6216\u9996\u6B21\u542F\u52A8");
57
+ return "0.0.0.0";
81
58
  }
82
- /** 同步版本 (兼容旧流程) */
83
- export function getCurrentVersionSync(exePath) {
84
- if (!fs.existsSync(exePath))
85
- return "0.0.0.0";
86
- const actual = hashFileSync(exePath, "sha256");
87
- if (!actual)
88
- return "0.0.0.0";
89
- const cache = readCache();
90
- for (const [ver, entry] of Object.entries(cache)) {
91
- if (entry.sha256 === actual)
92
- return ver;
93
- }
94
- log.warn("[BDSUpdater] bedrock_server.exe 哈希未匹配缓存");
95
- return "0.0.0.0";
59
+ function getCurrentVersionSync(exePath) {
60
+ if (!fs.existsSync(exePath)) return "0.0.0.0";
61
+ const actual = hashFileSync(exePath, "sha256");
62
+ if (!actual) return "0.0.0.0";
63
+ const cache = readCache();
64
+ for (const [ver, entry] of Object.entries(cache)) {
65
+ if (entry.sha256 === actual) return ver;
66
+ }
67
+ log.warn("[BDSUpdater] bedrock_server.exe \u54C8\u5E0C\u672A\u5339\u914D\u7F13\u5B58");
68
+ return "0.0.0.0";
96
69
  }
97
- //# sourceMappingURL=version.js.map
70
+ export {
71
+ compareVersions,
72
+ getCurrentVersionAsync,
73
+ getCurrentVersionSync,
74
+ isValidVersion,
75
+ saveVersionCache,
76
+ toVer3,
77
+ toVer4
78
+ };
79
+ //# sourceMappingURL=version.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,mBAAmB;AACnB,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,oBAAoB;AACpB,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IACD,8BAA8B;IAC9B,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,OAAO,oCAAoC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAQD,SAAS,SAAS;IAChB,OAAO,QAAQ,CAA6B,aAAa,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC;AAED,6BAA6B;AAC7B,SAAS,SAAS,CAAC,KAAiC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAA+B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC7C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,MAAc;IAC9D,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAe;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAC/D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/version.ts"],
4
+ "sourcesContent": ["/**\n * version.ts \u2014 \u7248\u672C\u53F7\u5DE5\u5177 / \u7248\u672C\u7F13\u5B58\n */\n\nimport { readJson, writeJson } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport { VERSION_CACHE } from \"./paths.js\";\nimport { hashFileSync, hashFileAsync } from \"./fsx.js\";\nimport { log } from \"./log.js\";\n\n/** 4\u6BB5 \u2192 3\u6BB5 (\u53BB\u5C3E) */\nexport function toVer3(v: string): string {\n return v.split(\".\").slice(0, 3).join(\".\");\n}\n\n/** 3\u6BB5 \u2192 4\u6BB5 (\u8865 0) */\nexport function toVer4(v: string): string {\n const p = v.split(\".\");\n while (p.length < 4) p.push(\"0\");\n return p.join(\".\");\n}\n\n/** \u7248\u672C\u6BD4\u8F83 (\u6309 4 \u6BB5\u6570\u5B57\u6392\u5E8F) */\nexport function compareVersions(a: string, b: string): number {\n const sa = a.replace(/-preview$/, \"\");\n const sb = b.replace(/-preview$/, \"\");\n const pa = sa.split(\".\").map(Number);\n const pb = sb.split(\".\").map(Number);\n for (let i = 0; i < 4; i++) {\n const ai = pa[i] ?? 0;\n const bi = pb[i] ?? 0;\n if (ai !== bi) return ai - bi;\n }\n // preview \u4F4E\u4E8E\u4E0D\u5E26 -preview \u7684\u540C\u4E00\u6570\u5B57\n if (a.endsWith(\"-preview\") && !b.endsWith(\"-preview\")) return -1;\n if (!a.endsWith(\"-preview\") && b.endsWith(\"-preview\")) return 1;\n return 0;\n}\n\n/** \u7B80\u5355\u7684\u771F\u503C\u6821\u9A8C (\u6309\u7248\u672C\u53F7\u5916\u5F62) */\nexport function isValidVersion(v: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+(\\.\\d+)?(-preview)?$/.test(v);\n}\n\n/** \u7F13\u5B58\u6761\u76EE\u7C7B\u578B */\ninterface CacheEntry {\n sha256: string;\n verified_at: number;\n}\n\nfunction readCache(): Record<string, CacheEntry> {\n return readJson<Record<string, CacheEntry>>(VERSION_CACHE) ?? {};\n}\n\n/** \u4EC5\u4FDD\u7559\u6700\u8FD1 3 \u6761\u7248\u672C\u7F13\u5B58 (\u907F\u514D\u65E0\u9650\u589E\u957F) */\nfunction trimCache(cache: Record<string, CacheEntry>): Record<string, CacheEntry> {\n const keys = Object.keys(cache).sort(compareVersions).slice(-3);\n const trimmed: Record<string, CacheEntry> = {};\n for (const k of keys) trimmed[k] = cache[k]!;\n return trimmed;\n}\n\nexport function saveVersionCache(version: string, sha256: string): void {\n const cache = readCache();\n cache[version] = { sha256, verified_at: Date.now() };\n try {\n writeJson(VERSION_CACHE, trimCache(cache));\n } catch {\n /* ignore */\n }\n}\n\n/**\n * \u5F02\u6B65\u8BC6\u522B\u5F53\u524D BDS \u7248\u672C\n * \u4F18\u5148\u901A\u8FC7 SHA256 \u53CD\u67E5\u7F13\u5B58\uFF0C\u5931\u8D25\u5219\u56DE\u9000 `current_version.txt`\uFF08\u5982\u679C\u5B58\u5728\uFF09\n */\nexport async function getCurrentVersionAsync(exePath: string): Promise<string> {\n if (!fs.existsSync(exePath)) return \"0.0.0.0\";\n const actual = await hashFileAsync(exePath, \"sha256\");\n if (!actual) return \"0.0.0.0\";\n\n const cache = readCache();\n for (const [ver, entry] of Object.entries(cache)) {\n if (entry.sha256 === actual) return ver;\n }\n log.warn(\"[BDSUpdater] bedrock_server.exe \u54C8\u5E0C\u672A\u5339\u914D\u7F13\u5B58\uFF0C\u7591\u4F3C\u88AB\u6539\u52A8\u6216\u9996\u6B21\u542F\u52A8\");\n return \"0.0.0.0\";\n}\n\n/** \u540C\u6B65\u7248\u672C (\u517C\u5BB9\u65E7\u6D41\u7A0B) */\nexport function getCurrentVersionSync(exePath: string): string {\n if (!fs.existsSync(exePath)) return \"0.0.0.0\";\n const actual = hashFileSync(exePath, \"sha256\");\n if (!actual) return \"0.0.0.0\";\n const cache = readCache();\n for (const [ver, entry] of Object.entries(cache)) {\n if (entry.sha256 === actual) return ver;\n }\n log.warn(\"[BDSUpdater] bedrock_server.exe \u54C8\u5E0C\u672A\u5339\u914D\u7F13\u5B58\");\n return \"0.0.0.0\";\n}\n"],
5
+ "mappings": "AAIA,SAAS,UAAU,iBAAiB;AACpC,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,SAAS,cAAc,qBAAqB;AAC5C,SAAS,WAAW;AAGb,SAAS,OAAO,GAAmB;AACxC,SAAO,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAC1C;AAGO,SAAS,OAAO,GAAmB;AACxC,QAAM,IAAI,EAAE,MAAM,GAAG;AACrB,SAAO,EAAE,SAAS,EAAG,GAAE,KAAK,GAAG;AAC/B,SAAO,EAAE,KAAK,GAAG;AACnB;AAGO,SAAS,gBAAgB,GAAW,GAAmB;AAC5D,QAAM,KAAK,EAAE,QAAQ,aAAa,EAAE;AACpC,QAAM,KAAK,EAAE,QAAQ,aAAa,EAAE;AACpC,QAAM,KAAK,GAAG,MAAM,GAAG,EAAE,IAAI,MAAM;AACnC,QAAM,KAAK,GAAG,MAAM,GAAG,EAAE,IAAI,MAAM;AACnC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,QAAI,OAAO,GAAI,QAAO,KAAK;AAAA,EAC7B;AAEA,MAAI,EAAE,SAAS,UAAU,KAAK,CAAC,EAAE,SAAS,UAAU,EAAG,QAAO;AAC9D,MAAI,CAAC,EAAE,SAAS,UAAU,KAAK,EAAE,SAAS,UAAU,EAAG,QAAO;AAC9D,SAAO;AACT;AAGO,SAAS,eAAe,GAAoB;AACjD,SAAO,qCAAqC,KAAK,CAAC;AACpD;AAQA,SAAS,YAAwC;AAC/C,SAAO,SAAqC,aAAa,KAAK,CAAC;AACjE;AAGA,SAAS,UAAU,OAA+D;AAChF,QAAM,OAAO,OAAO,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,EAAE;AAC9D,QAAM,UAAsC,CAAC;AAC7C,aAAW,KAAK,KAAM,SAAQ,CAAC,IAAI,MAAM,CAAC;AAC1C,SAAO;AACT;AAEO,SAAS,iBAAiB,SAAiB,QAAsB;AACtE,QAAM,QAAQ,UAAU;AACxB,QAAM,OAAO,IAAI,EAAE,QAAQ,aAAa,KAAK,IAAI,EAAE;AACnD,MAAI;AACF,cAAU,eAAe,UAAU,KAAK,CAAC;AAAA,EAC3C,QAAQ;AAAA,EAER;AACF;AAMA,eAAsB,uBAAuB,SAAkC;AAC7E,MAAI,CAAC,GAAG,WAAW,OAAO,EAAG,QAAO;AACpC,QAAM,SAAS,MAAM,cAAc,SAAS,QAAQ;AACpD,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,QAAQ,UAAU;AACxB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,MAAM,WAAW,OAAQ,QAAO;AAAA,EACtC;AACA,MAAI,KAAK,8IAAoD;AAC7D,SAAO;AACT;AAGO,SAAS,sBAAsB,SAAyB;AAC7D,MAAI,CAAC,GAAG,WAAW,OAAO,EAAG,QAAO;AACpC,QAAM,SAAS,aAAa,SAAS,QAAQ;AAC7C,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,UAAU;AACxB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,MAAM,WAAW,OAAQ,QAAO;AAAA,EACtC;AACA,MAAI,KAAK,4EAAyC;AAClD,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,174 @@
1
+ import { Utf8BomError } from "./fsx.js";
2
+ import { type WorldPackListReadResult } from "./pack-manager.js";
3
+ export type WorldPackKind = "behavior" | "resource";
4
+ export interface PackManifestInfo {
5
+ name: string;
6
+ uuid: string;
7
+ version: [number, number, number];
8
+ kind: WorldPackKind;
9
+ description?: string;
10
+ }
11
+ export interface InstalledWorldPack {
12
+ kind: WorldPackKind;
13
+ folderName: string;
14
+ dir: string;
15
+ name: string;
16
+ uuid: string;
17
+ version: [number, number, number];
18
+ enabled: boolean;
19
+ }
20
+ /** 滤掉 §x(Minecraft 格式码)、残余压缩后缀,加 [BP]/[RP] 前缀 */
21
+ export declare function formatWorldPackFolderName(rawName: string, kind: WorldPackKind): string;
22
+ /** 去掉已有 [BP]/[RP] 前缀,得到文件夹名主干 */
23
+ export declare function stripWorldPackFolderPrefix(rawName: string): string;
24
+ /**
25
+ * 归档内常见占位目录名(B / R / BP / RP)过短或过泛,不能作为世界目录名,
26
+ * 否则不同包会撞到同一路径并被误判为「覆盖」。
27
+ */
28
+ export declare function isGenericPackFolderStem(rawName: string): boolean;
29
+ /**
30
+ * 选定安装文件夹名:hint 过泛时改用 manifest.name;再与 dest 内已有目录避让(不同 uuid 不互相覆盖)。
31
+ */
32
+ export declare function choosePackInstallFolderName(opts: {
33
+ hint?: string;
34
+ info: PackManifestInfo;
35
+ destParent: string;
36
+ /** 同 uuid 更新时允许占用的已有目录名(不触发避让) */
37
+ allowFolderName?: string;
38
+ }): string;
39
+ /** 根据 manifest modules[].type 判定 BP / RP */
40
+ export declare function detectPackKindFromManifest(raw: {
41
+ modules?: Array<{
42
+ type?: string;
43
+ }>;
44
+ }): WorldPackKind | null;
45
+ export declare function readPackManifestInfo(packDir: string): PackManifestInfo | null;
46
+ export { Utf8BomError };
47
+ /** 深度优先找含 manifest.json 的包根(默认 maxDepth=2,root 自身为 depth 0) */
48
+ export declare function discoverPackRoots(root: string, opts?: {
49
+ maxDepth?: number;
50
+ }): string[];
51
+ export declare function isPackArchive(filePath: string): boolean;
52
+ /**
53
+ * 列出目录树内的包归档文件。
54
+ * 已是包根(含 manifest.json)的目录不再下钻,避免误解压包内资源。
55
+ */
56
+ export declare function listPackArchiveFiles(root: string, opts?: {
57
+ maxDepth?: number;
58
+ }): string[];
59
+ /**
60
+ * 在临时树内原地展开嵌套归档:解压到同级目录并删除归档文件,多轮直至没有新归档。
61
+ * 仅应对我们自己的 staging,禁止用于用户 inbox 原目录。
62
+ */
63
+ export declare function expandNestedArchivesInPlace(workDir: string, opts?: {
64
+ maxRounds?: number;
65
+ maxScanDepth?: number;
66
+ }): Promise<number>;
67
+ export type ResolvePackRootsResult = {
68
+ roots: string[];
69
+ /** 清理本轮创建的全部临时目录(可安全多次调用) */
70
+ dispose: () => void;
71
+ };
72
+ /**
73
+ * 统一包根解析:目录 / 顶层归档 / 嵌套 .mcpack|.zip|.mcaddon。
74
+ * 规则:先展开归档为目录树,再只认含 manifest.json 的目录为包根。
75
+ * 用户目录内的嵌套归档解到独立 temp,不修改原目录。
76
+ */
77
+ export declare function resolvePackRoots(src: string, opts?: {
78
+ maxDirDepth?: number;
79
+ maxArchiveRounds?: number;
80
+ }): Promise<ResolvePackRootsResult>;
81
+ /** 解压 zip/mcpack/mcaddon 到临时目录,返回该目录(经 zipx 防 zip-slip) */
82
+ export declare function extractArchiveToTemp(filePath: string): Promise<string>;
83
+ /** 扫描世界内已安装 BP/RP 目录 */
84
+ export declare function listInstalledWorldPacks(bdsRoot: string, levelName: string): InstalledWorldPack[];
85
+ /** RP/BP 第三位版本 +1,写回 manifest */
86
+ export declare function bumpPackPatchVersion(packDir: string): [number, number, number];
87
+ /** 写入 header.version(并同步 modules[].version 的 patch) */
88
+ export declare function writePackHeaderVersion(packDir: string, next: [number, number, number]): [number, number, number];
89
+ /** 读取 BP manifest 中依赖的资源包 uuid(非 @minecraft 模块) */
90
+ export declare function readPackDependencyUuids(packDir: string): string[];
91
+ /** 比较 SemVer 三元组;a>b 正,a<b 负,相等 0 */
92
+ export declare function compareSemVer3(a: [number, number, number], b: [number, number, number]): number;
93
+ /** 取较大的 SemVer 三元组 */
94
+ export declare function maxSemVer3(a: [number, number, number], b: [number, number, number]): [number, number, number];
95
+ /** 按 component 抬一级 */
96
+ export declare function bumpSemVer3(v: [number, number, number], component: "patch" | "minor"): [number, number, number];
97
+ /**
98
+ * 进服启用版本:max(远程/新包, 旧启用) 再抬一级。
99
+ * 单一规则,禁止 while 追赶(作者乱写高版本如 [1,21,100] 时也能一次算完)。
100
+ */
101
+ export declare function nextEnabledVersion(remote: [number, number, number], previous: [number, number, number], component?: "patch" | "minor"): [number, number, number];
102
+ /**
103
+ * 将包目录 manifest 抬到 nextEnabledVersion(当前, previous)。
104
+ * previous 一般为更新前已安装 RP / 世界 enable 列表中的版本。
105
+ */
106
+ export declare function ensureVersionGreaterThan(packDir: string, previous: [number, number, number], component?: "patch" | "minor"): [number, number, number];
107
+ export interface InstallPackResult {
108
+ ok: boolean;
109
+ skipped?: boolean;
110
+ reason?: string;
111
+ destDir?: string;
112
+ folderName?: string;
113
+ info?: PackManifestInfo;
114
+ conflict?: {
115
+ existing: PackManifestInfo & {
116
+ dir: string;
117
+ };
118
+ incoming: PackManifestInfo;
119
+ };
120
+ }
121
+ /**
122
+ * 将包目录安装到 destParent(behavior_packs 或 resource_packs)。
123
+ * force=true 时覆盖「同 uuid」冲突;同名不同 uuid 会自动换文件夹名,不删别人的包。
124
+ */
125
+ export declare function installPackDirectory(opts: {
126
+ srcDir: string;
127
+ destParent: string;
128
+ folderName?: string;
129
+ force?: boolean;
130
+ }): Promise<InstallPackResult>;
131
+ /** 安装后写入世界 enable 清单 */
132
+ export declare function enableInstalledPack(opts: {
133
+ bdsRoot: string;
134
+ levelName: string;
135
+ info: PackManifestInfo;
136
+ }): Promise<void>;
137
+ /** 从世界 enable 清单移除 */
138
+ export declare function disableInstalledPack(opts: {
139
+ bdsRoot: string;
140
+ levelName: string;
141
+ kind: WorldPackKind;
142
+ packUuid: string;
143
+ version: [number, number, number];
144
+ }): Promise<void>;
145
+ export type UninstallPackResult = {
146
+ action: "trashed";
147
+ dest: string;
148
+ } | {
149
+ action: "deleted";
150
+ } | {
151
+ action: "missing";
152
+ };
153
+ export type UninstallPackAction = UninstallPackResult["action"];
154
+ /**
155
+ * 卸载已安装世界包:先 disable enable-list,再移入 trashDir 或直接删除目录。
156
+ * trashDir 跨盘符时 fallback 为 copy + rm。
157
+ */
158
+ export declare function uninstallInstalledPack(opts: {
159
+ bdsRoot: string;
160
+ levelName: string;
161
+ pack: InstalledWorldPack;
162
+ /** 提供则移入该目录;null/省略则直接删除 */
163
+ trashDir?: string | null;
164
+ }): Promise<UninstallPackResult>;
165
+ export declare function worldPackParentDir(bdsRoot: string, levelName: string, kind: WorldPackKind): string;
166
+ /** 世界 enable-list 权威读取 — 委托 pack-manager(供 doctor 等,避免硬编码文件名) */
167
+ export declare function listWorldEnableEntries(bdsRoot: string, levelName: string, kind: WorldPackKind): Array<{
168
+ pack_id: string;
169
+ version: [number, number, number];
170
+ }>;
171
+ /** 含 parseFail 信号的 enable-list 快照(doctor 用;不暴露 JSON 路径构造细节) */
172
+ export declare function listWorldEnableListResult(bdsRoot: string, levelName: string, kind: WorldPackKind): WorldPackListReadResult;
173
+ export declare function findInstalledPackById(packs: InstalledWorldPack[], id: string): InstalledWorldPack | null;
174
+ //# sourceMappingURL=world-packs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"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"}