@sfmc-bds/bds-tools 0.2.0-beta.9 → 0.2.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 (66) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +1 -1
  3. package/dist/bds-manager.d.ts +16 -6
  4. package/dist/bds-manager.d.ts.map +1 -1
  5. package/dist/bds-manager.js +19 -1
  6. package/dist/bds-manager.js.map +2 -2
  7. package/dist/changelog.d.ts +11 -7
  8. package/dist/changelog.d.ts.map +1 -1
  9. package/dist/changelog.js +60 -34
  10. package/dist/changelog.js.map +2 -2
  11. package/dist/check-update.d.ts.map +1 -1
  12. package/dist/check-update.js +55 -17
  13. package/dist/check-update.js.map +2 -2
  14. package/dist/cli-pack-manager.js +11 -1
  15. package/dist/cli-pack-manager.js.map +2 -2
  16. package/dist/dependency-negotiator.d.ts +73 -0
  17. package/dist/dependency-negotiator.d.ts.map +1 -0
  18. package/dist/dependency-negotiator.js +151 -0
  19. package/dist/dependency-negotiator.js.map +7 -0
  20. package/dist/fsx.d.ts +15 -7
  21. package/dist/fsx.d.ts.map +1 -1
  22. package/dist/fsx.js +67 -8
  23. package/dist/fsx.js.map +2 -2
  24. package/dist/http.d.ts +49 -11
  25. package/dist/http.d.ts.map +1 -1
  26. package/dist/http.js.map +2 -2
  27. package/dist/level-dat.d.ts +105 -0
  28. package/dist/level-dat.d.ts.map +1 -0
  29. package/dist/level-dat.js +490 -0
  30. package/dist/level-dat.js.map +7 -0
  31. package/dist/pack-manager.d.ts +41 -34
  32. package/dist/pack-manager.d.ts.map +1 -1
  33. package/dist/pack-manager.js +73 -24
  34. package/dist/pack-manager.js.map +2 -2
  35. package/dist/qq-events-notify.d.ts +1 -1
  36. package/dist/qq-events-notify.d.ts.map +1 -1
  37. package/dist/qq-events-notify.js.map +1 -1
  38. package/dist/qqutil.d.ts +10 -6
  39. package/dist/qqutil.d.ts.map +1 -1
  40. package/dist/qqutil.js +14 -12
  41. package/dist/qqutil.js.map +2 -2
  42. package/dist/rollback.d.ts.map +1 -1
  43. package/dist/rollback.js +2 -2
  44. package/dist/rollback.js.map +2 -2
  45. package/dist/server-properties-i18n.d.ts +17 -0
  46. package/dist/server-properties-i18n.d.ts.map +1 -0
  47. package/dist/server-properties-i18n.js +201 -0
  48. package/dist/server-properties-i18n.js.map +7 -0
  49. package/dist/server-properties.d.ts +25 -0
  50. package/dist/server-properties.d.ts.map +1 -1
  51. package/dist/server-properties.js +141 -1
  52. package/dist/server-properties.js.map +2 -2
  53. package/dist/types.d.ts +1 -0
  54. package/dist/types.d.ts.map +1 -1
  55. package/dist/upstream.d.ts +14 -6
  56. package/dist/upstream.d.ts.map +1 -1
  57. package/dist/upstream.js.map +2 -2
  58. package/dist/world-packs.d.ts +106 -3
  59. package/dist/world-packs.d.ts.map +1 -1
  60. package/dist/world-packs.js +245 -10
  61. package/dist/world-packs.js.map +3 -3
  62. package/package.json +19 -14
  63. package/dist/qq-events-notify.test.d.ts +0 -5
  64. package/dist/qq-events-notify.test.d.ts.map +0 -1
  65. package/dist/qq-events-notify.test.js +0 -41
  66. package/dist/qq-events-notify.test.js.map +0 -7
@@ -1,7 +1,11 @@
1
+ import { configPath, readJson } from "@sfmc-bds/sdk/node/config";
1
2
  import fs from "node:fs";
2
3
  import { serverPropertiesPath } from "./pack-manager.js";
4
+ import { ROOT_DIR } from "./paths.js";
5
+ import { getServerPropertyDoc } from "./server-properties-i18n.js";
3
6
  const EMIT_SERVER_TELEMETRY_KEY = "emit-server-telemetry";
4
7
  const EMIT_SERVER_TELEMETRY_LINE = "emit-server-telemetry=true";
8
+ const NETHERNET_TRANSPORT_LINE = "transport=nethernet";
5
9
  function ensureEmitServerTelemetry(bdsRoot, logger) {
6
10
  const file = serverPropertiesPath(bdsRoot);
7
11
  if (!fs.existsSync(file)) return false;
@@ -20,9 +24,145 @@ function ensureEmitServerTelemetry(bdsRoot, logger) {
20
24
  );
21
25
  return true;
22
26
  }
27
+ function ensureNetherNetTransport(bdsRoot, logger) {
28
+ const file = serverPropertiesPath(bdsRoot);
29
+ if (!fs.existsSync(file)) return false;
30
+ let text = fs.readFileSync(file, "utf8");
31
+ if (/^\s*transport\s*=/im.test(text)) return false;
32
+ if (text.length > 0 && !text.endsWith("\n")) text += "\n";
33
+ text += `${NETHERNET_TRANSPORT_LINE}
34
+ `;
35
+ fs.writeFileSync(file, text, "utf8");
36
+ logger?.info("\u5DF2\u5411 server.properties \u8FFD\u52A0 transport=nethernet");
37
+ return true;
38
+ }
39
+ function resolveBdsLocale(rootDir) {
40
+ const envLang = process.env.SFMC_LOCALE || process.env.SFMC_LANG;
41
+ if (envLang) {
42
+ return envLang;
43
+ }
44
+ const root = rootDir || ROOT_DIR;
45
+ try {
46
+ const runtime = readJson(configPath(root, "runtime.json"));
47
+ if (runtime?.locale) {
48
+ return runtime.locale;
49
+ }
50
+ } catch {
51
+ }
52
+ const osLangs = [
53
+ process.env.LC_ALL,
54
+ process.env.LC_MESSAGES,
55
+ process.env.LANG,
56
+ Intl.DateTimeFormat().resolvedOptions().locale
57
+ ];
58
+ for (const raw of osLangs) {
59
+ if (raw && /^zh\b/i.test(raw)) {
60
+ return "zh-CN";
61
+ }
62
+ }
63
+ return "en";
64
+ }
65
+ function localizeServerPropertiesContent(text, locale = "zh-CN") {
66
+ const normalizedLocale = locale.toLowerCase();
67
+ if (!normalizedLocale.startsWith("zh")) {
68
+ return { content: text, modified: false };
69
+ }
70
+ if (!text || text.trim().length === 0) {
71
+ return { content: text, modified: false };
72
+ }
73
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
74
+ const lines = text.split(/\r?\n/);
75
+ const blocks = [];
76
+ let currentBlock = [];
77
+ let currentKey;
78
+ let currentValue;
79
+ function flushBlock() {
80
+ if (currentBlock.length > 0) {
81
+ blocks.push({
82
+ key: currentKey,
83
+ value: currentValue,
84
+ originalLines: currentBlock
85
+ });
86
+ currentBlock = [];
87
+ currentKey = void 0;
88
+ currentValue = void 0;
89
+ }
90
+ }
91
+ const kvRegex = /^\s*([A-Za-z0-9._-]+)\s*=\s*(.*)$/;
92
+ for (let i = 0; i < lines.length; i++) {
93
+ const line = lines[i];
94
+ if (typeof line !== "string") continue;
95
+ const isBlank = line.trim() === "";
96
+ if (isBlank) {
97
+ flushBlock();
98
+ continue;
99
+ }
100
+ const match = line.match(kvRegex);
101
+ if (match && match[1] !== void 0) {
102
+ if (currentKey !== void 0) {
103
+ flushBlock();
104
+ }
105
+ currentKey = match[1];
106
+ currentValue = match[2] ?? "";
107
+ currentBlock.push(line);
108
+ } else {
109
+ currentBlock.push(line);
110
+ }
111
+ }
112
+ flushBlock();
113
+ const outputBlocks = [];
114
+ for (const block of blocks) {
115
+ if (block.key) {
116
+ const doc = getServerPropertyDoc(block.key, locale);
117
+ if (doc) {
118
+ const outLines = [`${block.key}=${block.value ?? ""}`];
119
+ outLines.push(`# ${doc.desc}`);
120
+ if (doc.values) {
121
+ outLines.push(`# \u53EF\u9009\u503C\uFF1A${doc.values}`);
122
+ }
123
+ if (doc.tip) {
124
+ outLines.push(`# \u63D0\u793A\uFF1A${doc.tip}`);
125
+ }
126
+ outputBlocks.push(outLines.join(eol));
127
+ continue;
128
+ }
129
+ }
130
+ outputBlocks.push(block.originalLines.join(eol));
131
+ }
132
+ let newContent = outputBlocks.join(eol + eol);
133
+ if (newContent.length > 0 && !newContent.endsWith(eol)) {
134
+ newContent += eol;
135
+ }
136
+ return {
137
+ content: newContent,
138
+ modified: newContent !== text
139
+ };
140
+ }
141
+ function localizeServerProperties(bdsRoot, options) {
142
+ const file = serverPropertiesPath(bdsRoot);
143
+ if (!fs.existsSync(file)) return false;
144
+ const locale = options?.locale || resolveBdsLocale(options?.rootDir);
145
+ const normalizedLocale = locale.toLowerCase();
146
+ if (!normalizedLocale.startsWith("zh")) {
147
+ return false;
148
+ }
149
+ const raw = fs.readFileSync(file, "utf8");
150
+ const { content, modified } = localizeServerPropertiesContent(raw, locale);
151
+ if (!modified) {
152
+ return false;
153
+ }
154
+ fs.writeFileSync(file, content, "utf8");
155
+ options?.logger?.info("\u5DF2\u5C06 server.properties \u4E2D\u7684\u6CE8\u91CA\u672C\u5730\u5316\u4E3A\u7B80\u4F53\u4E2D\u6587\uFF08\u4FDD\u7559\u6240\u6709\u65E2\u6709\u914D\u7F6E\u503C\uFF09");
156
+ return true;
157
+ }
23
158
  export {
24
159
  EMIT_SERVER_TELEMETRY_KEY,
25
160
  EMIT_SERVER_TELEMETRY_LINE,
26
- ensureEmitServerTelemetry
161
+ NETHERNET_TRANSPORT_LINE,
162
+ ensureEmitServerTelemetry,
163
+ ensureNetherNetTransport,
164
+ localizeServerProperties,
165
+ localizeServerPropertiesContent,
166
+ resolveBdsLocale
27
167
  };
28
168
  //# sourceMappingURL=server-properties.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server-properties.ts"],
4
- "sourcesContent": ["/**\n * server.properties \u8F85\u52A9\uFF1A\u5B89\u88C5/\u542F\u52A8\u65F6\u786E\u4FDD emit-server-telemetry=true\n */\nimport fs from \"node:fs\";\nimport { serverPropertiesPath } from \"./pack-manager.js\";\n\nexport const EMIT_SERVER_TELEMETRY_KEY = \"emit-server-telemetry\";\nexport const EMIT_SERVER_TELEMETRY_LINE = \"emit-server-telemetry=true\";\n\nexport type ServerPropertiesLogger = {\n info: (msg: string) => void;\n};\n\n/**\n * \u82E5 `<bdsRoot>/server.properties` \u4E2D\u5C1A\u65E0 emit-server-telemetry\uFF0C\u5219\u8FFD\u52A0 `=true`\u3002\n * \u5DF2\u6709\u8BE5\u952E\uFF08\u4EFB\u610F\u503C\uFF09\u5219\u8DF3\u8FC7\u3002\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8DF3\u8FC7\uFF08BDS \u5C1A\u672A\u89E3\u538B\uFF09\u3002\n * @returns true = \u672C\u6B21\u65B0\u8FFD\u52A0\uFF1Bfalse = \u8DF3\u8FC7\n */\nexport function ensureEmitServerTelemetry(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*emit-server-telemetry\\s*=/im.test(text)) {\n return false;\n }\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) {\n text += \"\\n\";\n }\n text += `${EMIT_SERVER_TELEMETRY_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n\n logger?.info(\n \"\u5DF2\u5411 server.properties \u8FFD\u52A0 emit-server-telemetry=true\uFF08\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA\uFF0C\u6309\u534F\u8BAE\u542F\u7528\u670D\u52A1\u5668\u9065\u6D4B\uFF09\"\n );\n return true;\n}\n"],
5
- "mappings": "AAGA,OAAO,QAAQ;AACf,SAAS,4BAA4B;AAE9B,MAAM,4BAA4B;AAClC,MAAM,6BAA6B;AAWnC,SAAS,0BACd,SACA,QACS;AACT,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AAEjC,MAAI,OAAO,GAAG,aAAa,MAAM,MAAM;AACvC,MAAI,kCAAkC,KAAK,IAAI,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,KAAK,CAAC,KAAK,SAAS,IAAI,GAAG;AAC3C,YAAQ;AAAA,EACV;AACA,UAAQ,GAAG,0BAA0B;AAAA;AACrC,KAAG,cAAc,MAAM,MAAM,MAAM;AAEnC,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;",
4
+ "sourcesContent": ["/**\n * server-properties.ts \u2014 BDS server.properties \u8F85\u52A9\u5DE5\u5177\u96C6\n *\n * \u804C\u8D23\uFF1A\n * 1. \u5B89\u88C5/\u542F\u52A8\u65F6\u786E\u4FDD emit-server-telemetry=true \u4E0E transport=nethernet\n * 2. \u5B89\u88C5/\u66F4\u65B0/\u542F\u52A8\u65F6\u652F\u6301\u5C06\u914D\u7F6E\u6CE8\u91CA\u7ED3\u6784\u5316\u672C\u5730\u5316\uFF08\u5982\u7FFB\u8BD1\u4E3A\u7B80\u4F53\u4E2D\u6587 zh-CN\uFF09\uFF0C\n * \u4E25\u683C\u4FDD\u7559\u6240\u6709\u914D\u7F6E\u952E\uFF08Key\uFF09\u4E0E\u7528\u6237\u914D\u7F6E\u503C\uFF08Value\uFF09\u3002\n */\nimport { configPath, readJson } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport { serverPropertiesPath } from \"./pack-manager.js\";\nimport { ROOT_DIR } from \"./paths.js\";\nimport { getServerPropertyDoc } from \"./server-properties-i18n.js\";\n\nexport const EMIT_SERVER_TELEMETRY_KEY = \"emit-server-telemetry\";\nexport const EMIT_SERVER_TELEMETRY_LINE = \"emit-server-telemetry=true\";\nexport const NETHERNET_TRANSPORT_LINE = \"transport=nethernet\";\n\nexport type ServerPropertiesLogger = {\n info: (msg: string) => void;\n};\n\n/**\n * \u82E5 `<bdsRoot>/server.properties` \u4E2D\u5C1A\u65E0 emit-server-telemetry\uFF0C\u5219\u8FFD\u52A0 `=true`\u3002\n * \u5DF2\u6709\u8BE5\u952E\uFF08\u4EFB\u610F\u503C\uFF09\u5219\u8DF3\u8FC7\u3002\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8DF3\u8FC7\uFF08BDS \u5C1A\u672A\u89E3\u538B\uFF09\u3002\n * @returns true = \u672C\u6B21\u65B0\u8FFD\u52A0\uFF1Bfalse = \u8DF3\u8FC7\n */\nexport function ensureEmitServerTelemetry(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*emit-server-telemetry\\s*=/im.test(text)) {\n return false;\n }\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) {\n text += \"\\n\";\n }\n text += `${EMIT_SERVER_TELEMETRY_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n\n logger?.info(\n \"\u5DF2\u5411 server.properties \u8FFD\u52A0 emit-server-telemetry=true\uFF08\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA\uFF0C\u6309\u534F\u8BAE\u542F\u7528\u670D\u52A1\u5668\u9065\u6D4B\uFF09\"\n );\n return true;\n}\n\n/** \u7F3A\u5C11\u4F20\u8F93\u65B9\u5F0F\u65F6\u8865\u4E0A\u5F53\u524D BDS \u6240\u9700\u7684 NetherNet\uFF0C\u4FDD\u7559\u670D\u4E3B\u5DF2\u6709\u8BBE\u7F6E\u3002 */\nexport function ensureNetherNetTransport(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*transport\\s*=/im.test(text)) return false;\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) text += \"\\n\";\n text += `${NETHERNET_TRANSPORT_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n logger?.info(\"\u5DF2\u5411 server.properties \u8FFD\u52A0 transport=nethernet\");\n return true;\n}\n\n/**\n * \u89E3\u6790\u5E76\u63A2\u6D4B\u5F53\u524D\u5E94\u5F53\u91C7\u7528\u7684 BDS \u672C\u5730\u5316\u8BED\u8A00\u4EE3\u7801\uFF08\u4F8B\u5982 zh-CN \u6216 en\uFF09\u3002\n */\nexport function resolveBdsLocale(rootDir?: string): string {\n const envLang = process.env.SFMC_LOCALE || process.env.SFMC_LANG;\n if (envLang) {\n return envLang;\n }\n\n const root = rootDir || ROOT_DIR;\n try {\n const runtime = readJson<{ locale?: string }>(configPath(root, \"runtime.json\"));\n if (runtime?.locale) {\n return runtime.locale;\n }\n } catch {\n // \u5FFD\u7565\u5F02\u5E38\uFF0C\u964D\u7EA7\u5230\u7CFB\u7EDF\u8BED\u8A00\u63A2\u6D4B\n }\n\n const osLangs = [\n process.env.LC_ALL,\n process.env.LC_MESSAGES,\n process.env.LANG,\n Intl.DateTimeFormat().resolvedOptions().locale,\n ];\n for (const raw of osLangs) {\n if (raw && /^zh\\b/i.test(raw)) {\n return \"zh-CN\";\n }\n }\n return \"en\";\n}\n\n/**\n * \u7EAF\u51FD\u6570\uFF1A\u5C06 server.properties \u6587\u672C\u4E2D\u7684\u6CE8\u91CA\u66FF\u6362\u4E3A\u76EE\u6807\u8BED\u8A00\u7684\u7ED3\u6784\u5316\u4E2D\u6587\u8BF4\u660E\u3002\n * \u4E25\u683C\u4FDD\u7559\u914D\u7F6E\u9879\u7684 key \u4E0E\u5F53\u524D\u751F\u6548\u7684 value\u3002\u82E5\u9047\u5230\u672A\u6536\u5F55\u7684\u952E\u6216\u7EAF\u6CE8\u91CA\u5757\uFF0C\u539F\u6837\u4FDD\u7559\u3002\n */\nexport function localizeServerPropertiesContent(\n text: string,\n locale: string = \"zh-CN\"\n): { content: string; modified: boolean } {\n const normalizedLocale = locale.toLowerCase();\n // \u76EE\u524D\u4EC5\u5BF9\u4E2D\u6587\u505A\u672C\u5730\u5316\u91CD\u5199\uFF1B\u82F1\u6587\u6216\u5176\u4ED6\u8BED\u8A00\u4FDD\u6301\u539F\u6C41\u539F\u5473\n if (!normalizedLocale.startsWith(\"zh\")) {\n return { content: text, modified: false };\n }\n\n if (!text || text.trim().length === 0) {\n return { content: text, modified: false };\n }\n\n const eol = text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const lines = text.split(/\\r?\\n/);\n\n interface Block {\n key: string | undefined;\n value: string | undefined;\n originalLines: string[];\n }\n\n const blocks: Block[] = [];\n let currentBlock: string[] = [];\n let currentKey: string | undefined;\n let currentValue: string | undefined;\n\n function flushBlock() {\n if (currentBlock.length > 0) {\n blocks.push({\n key: currentKey,\n value: currentValue,\n originalLines: currentBlock,\n });\n currentBlock = [];\n currentKey = undefined;\n currentValue = undefined;\n }\n }\n\n const kvRegex = /^\\s*([A-Za-z0-9._-]+)\\s*=\\s*(.*)$/;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (typeof line !== \"string\") continue;\n const isBlank = line.trim() === \"\";\n\n if (isBlank) {\n flushBlock();\n continue;\n }\n\n const match = line.match(kvRegex);\n if (match && match[1] !== undefined) {\n // \u82E5\u5F53\u524D\u5757\u5185\u5DF2\u7ECF\u5B58\u5728\u4E00\u4E2A\u952E\u503C\u5BF9\uFF0C\u5219\u5148\u7ED3\u7B97\u4E0A\u4E00\u5757\n if (currentKey !== undefined) {\n flushBlock();\n }\n currentKey = match[1];\n currentValue = match[2] ?? \"\";\n currentBlock.push(line);\n } else {\n currentBlock.push(line);\n }\n }\n flushBlock();\n\n const outputBlocks: string[] = [];\n\n for (const block of blocks) {\n if (block.key) {\n const doc = getServerPropertyDoc(block.key, locale);\n if (doc) {\n const outLines: string[] = [`${block.key}=${block.value ?? \"\"}`];\n outLines.push(`# ${doc.desc}`);\n if (doc.values) {\n outLines.push(`# \u53EF\u9009\u503C\uFF1A${doc.values}`);\n }\n if (doc.tip) {\n outLines.push(`# \u63D0\u793A\uFF1A${doc.tip}`);\n }\n outputBlocks.push(outLines.join(eol));\n continue;\n }\n }\n // \u672A\u6536\u5F55\u7684\u9879\u6216\u666E\u901A\u6CE8\u91CA\u5757\uFF0C\u4FDD\u7559\u539F\u6587\u672C\n outputBlocks.push(block.originalLines.join(eol));\n }\n\n let newContent = outputBlocks.join(eol + eol);\n if (newContent.length > 0 && !newContent.endsWith(eol)) {\n newContent += eol;\n }\n\n return {\n content: newContent,\n modified: newContent !== text,\n };\n}\n\nexport interface LocalizeServerPropertiesOptions {\n locale?: string;\n rootDir?: string;\n logger?: ServerPropertiesLogger;\n}\n\n/**\n * \u5BF9 `<bdsRoot>/server.properties` \u4E2D\u7684\u6CE8\u91CA\u6267\u884C\u672C\u5730\u5316\u91CD\u5199\u3002\n * @returns true = \u672C\u6B21\u6210\u529F\u91CD\u5199\u5E76\u4FDD\u5B58\uFF1Bfalse = \u8DF3\u8FC7\u6216\u65E0\u6539\u52A8\n */\nexport function localizeServerProperties(\n bdsRoot: string,\n options?: LocalizeServerPropertiesOptions\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n const locale = options?.locale || resolveBdsLocale(options?.rootDir);\n const normalizedLocale = locale.toLowerCase();\n if (!normalizedLocale.startsWith(\"zh\")) {\n return false;\n }\n\n const raw = fs.readFileSync(file, \"utf8\");\n const { content, modified } = localizeServerPropertiesContent(raw, locale);\n if (!modified) {\n return false;\n }\n\n fs.writeFileSync(file, content, \"utf8\");\n options?.logger?.info(\"\u5DF2\u5C06 server.properties \u4E2D\u7684\u6CE8\u91CA\u672C\u5730\u5316\u4E3A\u7B80\u4F53\u4E2D\u6587\uFF08\u4FDD\u7559\u6240\u6709\u65E2\u6709\u914D\u7F6E\u503C\uFF09\");\n return true;\n}\n"],
5
+ "mappings": "AAQA,SAAS,YAAY,gBAAgB;AACrC,OAAO,QAAQ;AACf,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AAE9B,MAAM,4BAA4B;AAClC,MAAM,6BAA6B;AACnC,MAAM,2BAA2B;AAWjC,SAAS,0BACd,SACA,QACS;AACT,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AAEjC,MAAI,OAAO,GAAG,aAAa,MAAM,MAAM;AACvC,MAAI,kCAAkC,KAAK,IAAI,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,KAAK,CAAC,KAAK,SAAS,IAAI,GAAG;AAC3C,YAAQ;AAAA,EACV;AACA,UAAQ,GAAG,0BAA0B;AAAA;AACrC,KAAG,cAAc,MAAM,MAAM,MAAM;AAEnC,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,yBACd,SACA,QACS;AACT,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AAEjC,MAAI,OAAO,GAAG,aAAa,MAAM,MAAM;AACvC,MAAI,sBAAsB,KAAK,IAAI,EAAG,QAAO;AAE7C,MAAI,KAAK,SAAS,KAAK,CAAC,KAAK,SAAS,IAAI,EAAG,SAAQ;AACrD,UAAQ,GAAG,wBAAwB;AAAA;AACnC,KAAG,cAAc,MAAM,MAAM,MAAM;AACnC,UAAQ,KAAK,iEAA6C;AAC1D,SAAO;AACT;AAKO,SAAS,iBAAiB,SAA0B;AACzD,QAAM,UAAU,QAAQ,IAAI,eAAe,QAAQ,IAAI;AACvD,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,WAAW;AACxB,MAAI;AACF,UAAM,UAAU,SAA8B,WAAW,MAAM,cAAc,CAAC;AAC9E,QAAI,SAAS,QAAQ;AACnB,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,UAAU;AAAA,IACd,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,KAAK,eAAe,EAAE,gBAAgB,EAAE;AAAA,EAC1C;AACA,aAAW,OAAO,SAAS;AACzB,QAAI,OAAO,SAAS,KAAK,GAAG,GAAG;AAC7B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,gCACd,MACA,SAAiB,SACuB;AACxC,QAAM,mBAAmB,OAAO,YAAY;AAE5C,MAAI,CAAC,iBAAiB,WAAW,IAAI,GAAG;AACtC,WAAO,EAAE,SAAS,MAAM,UAAU,MAAM;AAAA,EAC1C;AAEA,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,WAAO,EAAE,SAAS,MAAM,UAAU,MAAM;AAAA,EAC1C;AAEA,QAAM,MAAM,KAAK,SAAS,MAAM,IAAI,SAAS;AAC7C,QAAM,QAAQ,KAAK,MAAM,OAAO;AAQhC,QAAM,SAAkB,CAAC;AACzB,MAAI,eAAyB,CAAC;AAC9B,MAAI;AACJ,MAAI;AAEJ,WAAS,aAAa;AACpB,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO,KAAK;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,eAAe;AAAA,MACjB,CAAC;AACD,qBAAe,CAAC;AAChB,mBAAa;AACb,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,UAAU;AAEhB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,OAAO,SAAS,SAAU;AAC9B,UAAM,UAAU,KAAK,KAAK,MAAM;AAEhC,QAAI,SAAS;AACX,iBAAW;AACX;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAI,SAAS,MAAM,CAAC,MAAM,QAAW;AAEnC,UAAI,eAAe,QAAW;AAC5B,mBAAW;AAAA,MACb;AACA,mBAAa,MAAM,CAAC;AACpB,qBAAe,MAAM,CAAC,KAAK;AAC3B,mBAAa,KAAK,IAAI;AAAA,IACxB,OAAO;AACL,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AACA,aAAW;AAEX,QAAM,eAAyB,CAAC;AAEhC,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,KAAK;AACb,YAAM,MAAM,qBAAqB,MAAM,KAAK,MAAM;AAClD,UAAI,KAAK;AACP,cAAM,WAAqB,CAAC,GAAG,MAAM,GAAG,IAAI,MAAM,SAAS,EAAE,EAAE;AAC/D,iBAAS,KAAK,KAAK,IAAI,IAAI,EAAE;AAC7B,YAAI,IAAI,QAAQ;AACd,mBAAS,KAAK,6BAAS,IAAI,MAAM,EAAE;AAAA,QACrC;AACA,YAAI,IAAI,KAAK;AACX,mBAAS,KAAK,uBAAQ,IAAI,GAAG,EAAE;AAAA,QACjC;AACA,qBAAa,KAAK,SAAS,KAAK,GAAG,CAAC;AACpC;AAAA,MACF;AAAA,IACF;AAEA,iBAAa,KAAK,MAAM,cAAc,KAAK,GAAG,CAAC;AAAA,EACjD;AAEA,MAAI,aAAa,aAAa,KAAK,MAAM,GAAG;AAC5C,MAAI,WAAW,SAAS,KAAK,CAAC,WAAW,SAAS,GAAG,GAAG;AACtD,kBAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,eAAe;AAAA,EAC3B;AACF;AAYO,SAAS,yBACd,SACA,SACS;AACT,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AAEjC,QAAM,SAAS,SAAS,UAAU,iBAAiB,SAAS,OAAO;AACnE,QAAM,mBAAmB,OAAO,YAAY;AAC5C,MAAI,CAAC,iBAAiB,WAAW,IAAI,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,GAAG,aAAa,MAAM,MAAM;AACxC,QAAM,EAAE,SAAS,SAAS,IAAI,gCAAgC,KAAK,MAAM;AACzE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,KAAG,cAAc,MAAM,SAAS,MAAM;AACtC,WAAS,QAAQ,KAAK,2KAA8C;AACpE,SAAO;AACT;",
6
6
  "names": []
7
7
  }
package/dist/types.d.ts CHANGED
@@ -46,6 +46,7 @@ export interface UpdateOutcome {
46
46
  export interface ChangelogPayload {
47
47
  text: string;
48
48
  imageBase64: string | null;
49
+ url: string;
49
50
  }
50
51
  export type LogLevel = "info" | "warn" | "error";
51
52
  export interface Logger {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,YAAY,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,YAAY,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
@@ -1,14 +1,22 @@
1
1
  /**
2
- * upstream.ts — 版本源 / 下载源 / 哈希校验
2
+ * upstream.ts — BDS 上游版本源、多镜像下载与完整性校验
3
3
  *
4
- * 改进:
5
- * - 3 次重试 + 指数退避
6
- * - sha1 / sha256 同时校验
7
- * - 流式校验 + 边下边校验
4
+ * 核心机制:
5
+ * - 多源容灾:官方源与镜像源并行竞争与多轮指数退避重试
6
+ * - 动态 URL 模板渲染:根据操作系统架构与更新通道计算下载地址
7
+ * - 流式哈希校验:支持 SHA-1 与 SHA-256 完整性流式计算校验
8
+ * - 版本白名单兼容门禁:防止自动升级至未验证版本
8
9
  */
9
10
  import { type BdsHostOs } from "./host-platform.js";
10
11
  import type { BdsUpdaterConfig, VersionDetails, VersionInfo } from "./types.js";
11
- /** 获取最新版本号 (含 cdn_root),3 次重试 */
12
+ /**
13
+ * 获取 BDS 最新可用版本信息(支持重试与指数退避)。
14
+ *
15
+ * @param cfg BDS 更新器配置。
16
+ * @param channel 更新通道(如 "release" 或 "preview")。
17
+ * @param hostOs 目标主机操作系统类型。
18
+ * @returns 包含最新版本号与 CDN 根路径的信息对象。
19
+ */
12
20
  export declare function getVersionInfo(cfg: BdsUpdaterConfig, channel: string, hostOs?: BdsHostOs): Promise<VersionInfo>;
13
21
  /** 获取 per-version 的下载链接 + 哈希 (fallback GitHub → jsdelivr) */
14
22
  export declare function fetchVersionDetails(cfg: BdsUpdaterConfig, channel: string, version: string, hostOs?: BdsHostOs): Promise<VersionDetails>;
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGvG,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAchF,iCAAiC;AACjC,wBAAsB,cAAc,CAClC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED,6DAA6D;AAC7D,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAuB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAED,sBAAsB;AACtB,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,EACvB,MAAM,GAAE,SAAuB,GAC9B,MAAM,EAAE,CAYV;AAED,oBAAoB;AACpB,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBrH;AAED,oBAAoB;AACpB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAInF"}
1
+ {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGvG,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAchF;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAElC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED,6DAA6D;AAC7D,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAuB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAED,sBAAsB;AACtB,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,EACvB,MAAM,GAAE,SAAuB,GAC9B,MAAM,EAAE,CAYV;AAED,oBAAoB;AACpB,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBrH;AAED,oBAAoB;AACpB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAInF"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/upstream.ts"],
4
- "sourcesContent": ["/**\n * upstream.ts \u2014 \u7248\u672C\u6E90 / \u4E0B\u8F7D\u6E90 / \u54C8\u5E0C\u6821\u9A8C\n *\n * \u6539\u8FDB:\n * - 3 \u6B21\u91CD\u8BD5 + \u6307\u6570\u9000\u907F\n * - sha1 / sha256 \u540C\u65F6\u6821\u9A8C\n * - \u6D41\u5F0F\u6821\u9A8C + \u8FB9\u4E0B\u8FB9\u6821\u9A8C\n */\n\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport { bdsCdnZipSuffix, bdsDetailsPlatformKey, bdsHostOs, type BdsHostOs } from \"./host-platform.js\";\nimport { fetchJsonWithFallback } from \"./http.js\";\nimport { log } from \"./log.js\";\nimport type { BdsUpdaterConfig, VersionDetails, VersionInfo } from \"./types.js\";\nimport { toVer3 } from \"./version.js\";\n\nconst DEFAULT_VERSIONS_API = \"https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/versions.json\";\nconst DEFAULT_VERSIONS_MIRROR = \"https://cdn.jsdelivr.net/gh/Bedrock-OSS/BDS-Versions@main/versions.json\";\n\nfunction resolveTemplate(tpl: string, vars: Record<string, string>): string {\n let s = tpl;\n for (const [k, v] of Object.entries(vars)) {\n s = s.replace(new RegExp(`\\\\{${k}\\\\}`, \"g\"), v);\n }\n return s;\n}\n\n/** \u83B7\u53D6\u6700\u65B0\u7248\u672C\u53F7 (\u542B cdn_root)\uFF0C3 \u6B21\u91CD\u8BD5 */\nexport async function getVersionInfo(\n cfg: BdsUpdaterConfig,\n channel: string,\n hostOs: BdsHostOs = bdsHostOs()\n): Promise<VersionInfo> {\n const api = cfg.version_versions || process.env[\"BDS_VERSIONS_API\"] || DEFAULT_VERSIONS_API;\n const mirror = cfg.version_versions_mirror || process.env[\"BDS_VERSIONS_MIRROR\"] || DEFAULT_VERSIONS_MIRROR;\n const sources = [api, mirror].filter(Boolean);\n const versionMode = cfg.version_mode || \"bedrock-oss\";\n\n let lastErr: unknown;\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const json = await fetchJsonWithFallback<any>(sources);\n let ver: string | undefined;\n if (versionMode === \"endstone\") {\n const entry = channel === \"preview\" ? json.preview : json.release;\n ver = entry?.latest;\n } else {\n const platform = hostOs === \"windows\" ? json.windows || json.linux : json.linux || json.windows;\n ver = channel === \"preview\" ? platform?.preview : platform?.stable;\n }\n if (!ver) throw new Error(\"\u672A\u627E\u5230\u6700\u65B0\u7248\u672C\u53F7\");\n return { version: ver, cdnRoot: json.cdn_root ?? \"\" };\n } catch (e) {\n lastErr = e;\n if (attempt < 3) {\n const wait = attempt * 3000;\n log.warn(`\u7248\u672C\u53F7\u83B7\u53D6\u5931\u8D25 (${attempt}/3): ${(e as Error).message}\uFF0C${wait / 1000}s \u540E\u91CD\u8BD5...`);\n await new Promise((r) => setTimeout(r, wait));\n }\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(\"\u7248\u672C\u53F7\u83B7\u53D6\u5931\u8D25\");\n}\n\n/** \u83B7\u53D6 per-version \u7684\u4E0B\u8F7D\u94FE\u63A5 + \u54C8\u5E0C (fallback GitHub \u2192 jsdelivr) */\nexport async function fetchVersionDetails(\n cfg: BdsUpdaterConfig,\n channel: string,\n version: string,\n hostOs: BdsHostOs = bdsHostOs()\n): Promise<VersionDetails> {\n const platform = bdsDetailsPlatformKey(channel, hostOs);\n const ch = channel === \"preview\" ? \"preview\" : \"release\";\n const vars = { version, ver3: toVer3(version), platform, channel: ch };\n const detailsTpl =\n cfg.version_details || \"https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/{platform}/{version}.json\";\n const mirrorTpl =\n cfg.version_details_mirror || \"https://cdn.jsdelivr.net/gh/Bedrock-OSS/BDS-Versions@main/{platform}/{version}.json\";\n const sources = [detailsTpl, mirrorTpl].filter(Boolean).map((t) => resolveTemplate(t, vars));\n\n const json = await fetchJsonWithFallback<any>(sources);\n const mode = cfg.version_mode || \"bedrock-oss\";\n if (mode === \"endstone\") {\n const bw = hostOs === \"windows\" ? json.binary?.windows : json.binary?.linux;\n return {\n downloadUrl: bw?.url ?? \"\",\n sha1: \"\",\n sha256: bw?.sha256 ?? \"\",\n size: bw?.size_in_bytes ?? 0,\n };\n }\n return {\n downloadUrl: json.download_url ?? \"\",\n sha1: json.sha1 ?? \"\",\n sha256: \"\",\n size: json.size_in_bytes ?? 0,\n };\n}\n\n/** \u5019\u9009\u4E0B\u8F7D URL (\u6309\u4F18\u5148\u7EA7) */\nexport function buildDownloadUrls(\n cfg: BdsUpdaterConfig,\n channel: string,\n version: string,\n details: VersionDetails,\n hostOs: BdsHostOs = bdsHostOs()\n): string[] {\n const urls: string[] = [];\n if (cfg.download_mirror) {\n const mirrorVer = channel === \"preview\" ? `${version}-preview` : version;\n urls.push(resolveTemplate(cfg.download_mirror, { version: mirrorVer }));\n }\n if (details.downloadUrl) urls.push(details.downloadUrl);\n const cdnRoot = cfg.cdn_root || \"https://www.minecraft.net/bedrockdedicatedserver\";\n const suffix = bdsCdnZipSuffix(channel, version, hostOs);\n urls.push(cdnRoot + suffix);\n urls.push(`https://minecraft.azureedge.net${suffix}`);\n return [...new Set(urls)];\n}\n\n/** \u540C\u6B65 / \u5F02\u6B65\u6821\u9A8C\u6587\u4EF6\u54C8\u5E0C */\nexport async function verifyFileHash(filePath: string, expectedSha1: string, expectedSha256: string): Promise<boolean> {\n const expected = expectedSha256 || expectedSha1;\n if (!expected) return true;\n const algo: \"sha1\" | \"sha256\" = expectedSha256 ? \"sha256\" : \"sha1\";\n\n return new Promise((resolve, reject) => {\n const h = crypto.createHash(algo);\n const stream = fs.createReadStream(filePath);\n stream.on(\"data\", (chunk: Buffer | string) => {\n h.update(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n stream.on(\"end\", () => {\n const actual = h.digest(\"hex\").toLowerCase();\n resolve(actual === expected.toLowerCase());\n });\n stream.on(\"error\", reject);\n });\n}\n\n/** \u68C0\u67E5\u7248\u672C\u517C\u5BB9\u6027 (\u767D\u540D\u5355) */\nexport function isVersionCompatible(cfg: BdsUpdaterConfig, version: string): boolean {\n const allow = cfg.compatible_versions;\n if (!allow || allow.length === 0) return true;\n return allow.includes(version) || allow.includes(toVer3(version));\n}\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * upstream.ts \u2014 BDS \u4E0A\u6E38\u7248\u672C\u6E90\u3001\u591A\u955C\u50CF\u4E0B\u8F7D\u4E0E\u5B8C\u6574\u6027\u6821\u9A8C\n *\n * \u6838\u5FC3\u673A\u5236\uFF1A\n * - \u591A\u6E90\u5BB9\u707E\uFF1A\u5B98\u65B9\u6E90\u4E0E\u955C\u50CF\u6E90\u5E76\u884C\u7ADE\u4E89\u4E0E\u591A\u8F6E\u6307\u6570\u9000\u907F\u91CD\u8BD5\n * - \u52A8\u6001 URL \u6A21\u677F\u6E32\u67D3\uFF1A\u6839\u636E\u64CD\u4F5C\u7CFB\u7EDF\u67B6\u6784\u4E0E\u66F4\u65B0\u901A\u9053\u8BA1\u7B97\u4E0B\u8F7D\u5730\u5740\n * - \u6D41\u5F0F\u54C8\u5E0C\u6821\u9A8C\uFF1A\u652F\u6301 SHA-1 \u4E0E SHA-256 \u5B8C\u6574\u6027\u6D41\u5F0F\u8BA1\u7B97\u6821\u9A8C\n * - \u7248\u672C\u767D\u540D\u5355\u517C\u5BB9\u95E8\u7981\uFF1A\u9632\u6B62\u81EA\u52A8\u5347\u7EA7\u81F3\u672A\u9A8C\u8BC1\u7248\u672C\n */\n\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport { bdsCdnZipSuffix, bdsDetailsPlatformKey, bdsHostOs, type BdsHostOs } from \"./host-platform.js\";\nimport { fetchJsonWithFallback } from \"./http.js\";\nimport { log } from \"./log.js\";\nimport type { BdsUpdaterConfig, VersionDetails, VersionInfo } from \"./types.js\";\nimport { toVer3 } from \"./version.js\";\n\nconst DEFAULT_VERSIONS_API = \"https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/versions.json\";\nconst DEFAULT_VERSIONS_MIRROR = \"https://cdn.jsdelivr.net/gh/Bedrock-OSS/BDS-Versions@main/versions.json\";\n\nfunction resolveTemplate(tpl: string, vars: Record<string, string>): string {\n let s = tpl;\n for (const [k, v] of Object.entries(vars)) {\n s = s.replace(new RegExp(`\\\\{${k}\\\\}`, \"g\"), v);\n }\n return s;\n}\n\n/**\n * \u83B7\u53D6 BDS \u6700\u65B0\u53EF\u7528\u7248\u672C\u4FE1\u606F\uFF08\u652F\u6301\u91CD\u8BD5\u4E0E\u6307\u6570\u9000\u907F\uFF09\u3002\n *\n * @param cfg BDS \u66F4\u65B0\u5668\u914D\u7F6E\u3002\n * @param channel \u66F4\u65B0\u901A\u9053\uFF08\u5982 \"release\" \u6216 \"preview\"\uFF09\u3002\n * @param hostOs \u76EE\u6807\u4E3B\u673A\u64CD\u4F5C\u7CFB\u7EDF\u7C7B\u578B\u3002\n * @returns \u5305\u542B\u6700\u65B0\u7248\u672C\u53F7\u4E0E CDN \u6839\u8DEF\u5F84\u7684\u4FE1\u606F\u5BF9\u8C61\u3002\n */\nexport async function getVersionInfo(\n\n cfg: BdsUpdaterConfig,\n channel: string,\n hostOs: BdsHostOs = bdsHostOs()\n): Promise<VersionInfo> {\n const api = cfg.version_versions || process.env[\"BDS_VERSIONS_API\"] || DEFAULT_VERSIONS_API;\n const mirror = cfg.version_versions_mirror || process.env[\"BDS_VERSIONS_MIRROR\"] || DEFAULT_VERSIONS_MIRROR;\n const sources = [api, mirror].filter(Boolean);\n const versionMode = cfg.version_mode || \"bedrock-oss\";\n\n let lastErr: unknown;\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const json = await fetchJsonWithFallback<any>(sources);\n let ver: string | undefined;\n if (versionMode === \"endstone\") {\n const entry = channel === \"preview\" ? json.preview : json.release;\n ver = entry?.latest;\n } else {\n const platform = hostOs === \"windows\" ? json.windows || json.linux : json.linux || json.windows;\n ver = channel === \"preview\" ? platform?.preview : platform?.stable;\n }\n if (!ver) throw new Error(\"\u672A\u627E\u5230\u6700\u65B0\u7248\u672C\u53F7\");\n return { version: ver, cdnRoot: json.cdn_root ?? \"\" };\n } catch (e) {\n lastErr = e;\n if (attempt < 3) {\n const wait = attempt * 3000;\n log.warn(`\u7248\u672C\u53F7\u83B7\u53D6\u5931\u8D25 (${attempt}/3): ${(e as Error).message}\uFF0C${wait / 1000}s \u540E\u91CD\u8BD5...`);\n await new Promise((r) => setTimeout(r, wait));\n }\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(\"\u7248\u672C\u53F7\u83B7\u53D6\u5931\u8D25\");\n}\n\n/** \u83B7\u53D6 per-version \u7684\u4E0B\u8F7D\u94FE\u63A5 + \u54C8\u5E0C (fallback GitHub \u2192 jsdelivr) */\nexport async function fetchVersionDetails(\n cfg: BdsUpdaterConfig,\n channel: string,\n version: string,\n hostOs: BdsHostOs = bdsHostOs()\n): Promise<VersionDetails> {\n const platform = bdsDetailsPlatformKey(channel, hostOs);\n const ch = channel === \"preview\" ? \"preview\" : \"release\";\n const vars = { version, ver3: toVer3(version), platform, channel: ch };\n const detailsTpl =\n cfg.version_details || \"https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/{platform}/{version}.json\";\n const mirrorTpl =\n cfg.version_details_mirror || \"https://cdn.jsdelivr.net/gh/Bedrock-OSS/BDS-Versions@main/{platform}/{version}.json\";\n const sources = [detailsTpl, mirrorTpl].filter(Boolean).map((t) => resolveTemplate(t, vars));\n\n const json = await fetchJsonWithFallback<any>(sources);\n const mode = cfg.version_mode || \"bedrock-oss\";\n if (mode === \"endstone\") {\n const bw = hostOs === \"windows\" ? json.binary?.windows : json.binary?.linux;\n return {\n downloadUrl: bw?.url ?? \"\",\n sha1: \"\",\n sha256: bw?.sha256 ?? \"\",\n size: bw?.size_in_bytes ?? 0,\n };\n }\n return {\n downloadUrl: json.download_url ?? \"\",\n sha1: json.sha1 ?? \"\",\n sha256: \"\",\n size: json.size_in_bytes ?? 0,\n };\n}\n\n/** \u5019\u9009\u4E0B\u8F7D URL (\u6309\u4F18\u5148\u7EA7) */\nexport function buildDownloadUrls(\n cfg: BdsUpdaterConfig,\n channel: string,\n version: string,\n details: VersionDetails,\n hostOs: BdsHostOs = bdsHostOs()\n): string[] {\n const urls: string[] = [];\n if (cfg.download_mirror) {\n const mirrorVer = channel === \"preview\" ? `${version}-preview` : version;\n urls.push(resolveTemplate(cfg.download_mirror, { version: mirrorVer }));\n }\n if (details.downloadUrl) urls.push(details.downloadUrl);\n const cdnRoot = cfg.cdn_root || \"https://www.minecraft.net/bedrockdedicatedserver\";\n const suffix = bdsCdnZipSuffix(channel, version, hostOs);\n urls.push(cdnRoot + suffix);\n urls.push(`https://minecraft.azureedge.net${suffix}`);\n return [...new Set(urls)];\n}\n\n/** \u540C\u6B65 / \u5F02\u6B65\u6821\u9A8C\u6587\u4EF6\u54C8\u5E0C */\nexport async function verifyFileHash(filePath: string, expectedSha1: string, expectedSha256: string): Promise<boolean> {\n const expected = expectedSha256 || expectedSha1;\n if (!expected) return true;\n const algo: \"sha1\" | \"sha256\" = expectedSha256 ? \"sha256\" : \"sha1\";\n\n return new Promise((resolve, reject) => {\n const h = crypto.createHash(algo);\n const stream = fs.createReadStream(filePath);\n stream.on(\"data\", (chunk: Buffer | string) => {\n h.update(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n stream.on(\"end\", () => {\n const actual = h.digest(\"hex\").toLowerCase();\n resolve(actual === expected.toLowerCase());\n });\n stream.on(\"error\", reject);\n });\n}\n\n/** \u68C0\u67E5\u7248\u672C\u517C\u5BB9\u6027 (\u767D\u540D\u5355) */\nexport function isVersionCompatible(cfg: BdsUpdaterConfig, version: string): boolean {\n const allow = cfg.compatible_versions;\n if (!allow || allow.length === 0) return true;\n return allow.includes(version) || allow.includes(toVer3(version));\n}\n\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,15 @@
1
- import { type WorldPackListReadResult } from "./pack-manager.js";
1
+ /**
2
+ * world-packs.ts — 通用 Minecraft 基岩版世界行为包(BP)与资源包(RP)管理工具
3
+ *
4
+ * 核心能力:
5
+ * - 格式与命名规范化:过滤 Minecraft 颜色格式码,自动补充 `[BP]` / `[RP]` 前缀及冲突避让
6
+ * - 压缩包递归解构:支持 `.zip`、`.mcpack`、`.mcaddon` 嵌套包解压并智能识别 BP 与 RP 根目录
7
+ * - 版本递增与同步:同步升级 manifest 中的版本元数据并对齐世界启用清单版本
8
+ * - 幂等安装与回滚:按 UUID 精确匹配升级与安装计划,支持删除备份至回收站机制
9
+ */
10
+ import { type LevelDatExperimentsInfo } from "./level-dat.js";
11
+ import { type PackManifestDependency, type WorldPackListReadResult } from "./pack-manager.js";
12
+ export { enableBetaApisInLevelDat, enableExperimentsInLevelDat, KNOWN_EXPERIMENTS, readLevelDatExperiments, resolveExperimentDefinition, type KnownExperimentDefinition, type LevelDatExperimentsInfo, type LevelDatMutateResult, } from "./level-dat.js";
2
13
  export type WorldPackKind = "behavior" | "resource";
3
14
  export interface PackManifestInfo {
4
15
  name: string;
@@ -52,6 +63,13 @@ export declare function detectPackKindFromManifest(raw: {
52
63
  type?: string;
53
64
  }>;
54
65
  }): WorldPackKind | null;
66
+ /**
67
+ * 解析 manifest 中的本地化键(例如 pack.name)。
68
+ *
69
+ * 语言文件优先遵循 texts/languages.json 的声明顺序;声明缺失或不完整时,
70
+ * 再扫描 texts 下其余 .lang 文件。找不到对应键时保留 manifest 原值。
71
+ */
72
+ export declare function resolvePackLocalizedText(packDir: string, value: string): string;
55
73
  export declare function readPackManifestInfo(packDir: string): PackManifestInfo | null;
56
74
  /** 深度优先找含 manifest.json 的包根(默认 maxDepth=2,root 自身为 depth 0) */
57
75
  export declare function discoverPackRoots(root: string, opts?: {
@@ -91,9 +109,20 @@ export declare function resolvePackRoots(src: string, opts?: {
91
109
  export declare function extractArchiveToTemp(filePath: string): Promise<string>;
92
110
  /** 扫描世界内已安装 BP/RP 目录 */
93
111
  export declare function listInstalledWorldPacks(bdsRoot: string, levelName: string): InstalledWorldPack[];
94
- /** RP/BP 第三位版本 +1,写回 manifest */
112
+ /**
113
+ * 将目标包 manifest.json 中的 Patch 版本号递增(+1)并持久化写回。
114
+ *
115
+ * @param packDir 包根目录路径。
116
+ * @returns 递增后的版本三元组 `[major, minor, patch]`。
117
+ */
95
118
  export declare function bumpPackPatchVersion(packDir: string): [number, number, number];
96
- /** 写入 header.version(并同步 modules[].version 的 patch) */
119
+ /**
120
+ * 向目标包的 manifest.json 写入新的版本号,并同步更新内部 modules 的 patch 版本。
121
+ *
122
+ * @param packDir 包根目录路径。
123
+ * @param next 待写入的版本三元组。
124
+ * @returns 写入确认的版本三元组。
125
+ */
97
126
  export declare function writePackHeaderVersion(packDir: string, next: [number, number, number]): [number, number, number];
98
127
  /** 读取 BP manifest 中依赖的资源包 uuid(非 @minecraft 模块) */
99
128
  export declare function readPackDependencyUuids(packDir: string): string[];
@@ -242,4 +271,78 @@ export declare function listWorldEnableEntries(bdsRoot: string, levelName: strin
242
271
  /** 含 parseFail 信号的 enable-list 快照(doctor 用;不暴露 JSON 路径构造细节) */
243
272
  export declare function listWorldEnableListResult(bdsRoot: string, levelName: string, kind: WorldPackKind): WorldPackListReadResult;
244
273
  export declare function findInstalledPackById(packs: InstalledWorldPack[], id: string): InstalledWorldPack | null;
274
+ export interface WorldBetaApiDiagnosis {
275
+ hasBetaApis: boolean;
276
+ levelDatExists: boolean;
277
+ levelDatPath: string;
278
+ requiringPacks: Array<{
279
+ pack: InstalledWorldPack;
280
+ betaDependencies: PackManifestDependency[];
281
+ }>;
282
+ }
283
+ export declare function isBetaApiDependency(dep: PackManifestDependency): boolean;
284
+ /**
285
+ * 诊断指定世界中已启用的行为包对测试版 API(Beta APIs)的依赖与 level.dat 的匹配状况。
286
+ */
287
+ export declare function checkWorldBetaApiRequirements(bdsRoot: string, levelName: string, installedPacks?: InstalledWorldPack[]): WorldBetaApiDiagnosis;
288
+ export interface WorldExperimentsDiagnosis {
289
+ levelDatExists: boolean;
290
+ levelDatPath: string;
291
+ experimentsInfo: LevelDatExperimentsInfo | null;
292
+ betaApis: WorldBetaApiDiagnosis;
293
+ }
294
+ /**
295
+ * 诊断指定世界存档的全部实验性玩法开关及与当前已安装行为包的匹配状况。
296
+ */
297
+ export declare function checkWorldExperimentsDiagnosis(bdsRoot: string, levelName: string, installedPacks?: InstalledWorldPack[]): WorldExperimentsDiagnosis;
298
+ export interface WorldPermissionDiagnosis {
299
+ missingPermissions: Array<{
300
+ pack: InstalledWorldPack;
301
+ moduleName: string;
302
+ }>;
303
+ }
304
+ /**
305
+ * 诊断行为包依赖的原生模块(如 @minecraft/server-net, @minecraft/diagnostics 等)是否已在 BDS config 中授权。
306
+ */
307
+ export declare function checkWorldScriptPermissions(bdsRoot: string, levelName: string, installedPacks?: InstalledWorldPack[]): WorldPermissionDiagnosis;
308
+ export interface RepairWorldPacksResult {
309
+ cleanedGhostPacks: Array<{
310
+ kind: WorldPackKind;
311
+ uuid: string;
312
+ }>;
313
+ syncedVersions: Array<{
314
+ kind: WorldPackKind;
315
+ folder: string;
316
+ listVer: string;
317
+ diskVer: string;
318
+ }>;
319
+ betaApisResult?: {
320
+ attempted: boolean;
321
+ changed: boolean;
322
+ backupPath?: string | undefined;
323
+ error?: string | undefined;
324
+ } | undefined;
325
+ experimentsResult?: {
326
+ attempted: boolean;
327
+ changed: boolean;
328
+ enabled: string[];
329
+ backupPath?: string | undefined;
330
+ error?: string | undefined;
331
+ } | undefined;
332
+ fixedPermissions?: Array<{
333
+ packName: string;
334
+ moduleName: string;
335
+ }> | undefined;
336
+ }
337
+ /**
338
+ * 自愈世界资源包/行为包接线问题:
339
+ * 1. 清理清单中已不存在于磁盘的幽灵包 UUID 条目
340
+ * 2. 自动校准清单中与磁盘 manifest 不一致的版本号
341
+ * 3. 自动补齐缺失的 Script API 原生模块权限(config/default/permissions.json)
342
+ * 4. 可选:自动为 level.dat 开启 Beta APIs(若 fixBetaApis 为 true)或指定实验性功能(enableExperiments)
343
+ */
344
+ export declare function repairWorldPacksWiring(bdsRoot: string, levelName: string, opts?: {
345
+ fixBetaApis?: boolean;
346
+ enableExperiments?: string[] | "all";
347
+ }): Promise<RepairWorldPacksResult>;
245
348
  //# sourceMappingURL=world-packs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"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"}