@sfmc-bds/bds-tools 0.2.0-beta.8 → 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 (114) 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 +59 -66
  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 +59 -23
  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 +17 -14
  21. package/dist/fsx.d.ts.map +1 -1
  22. package/dist/fsx.js +67 -19
  23. package/dist/fsx.js.map +2 -2
  24. package/dist/host-platform.d.ts +25 -0
  25. package/dist/host-platform.d.ts.map +1 -0
  26. package/dist/host-platform.js +50 -0
  27. package/dist/host-platform.js.map +7 -0
  28. package/dist/http.d.ts +49 -11
  29. package/dist/http.d.ts.map +1 -1
  30. package/dist/http.js.map +2 -2
  31. package/dist/level-dat.d.ts +105 -0
  32. package/dist/level-dat.d.ts.map +1 -0
  33. package/dist/level-dat.js +490 -0
  34. package/dist/level-dat.js.map +7 -0
  35. package/dist/pack-manager.d.ts +41 -34
  36. package/dist/pack-manager.d.ts.map +1 -1
  37. package/dist/pack-manager.js +79 -25
  38. package/dist/pack-manager.js.map +2 -2
  39. package/dist/pack-update/bindings.d.ts +16 -0
  40. package/dist/pack-update/bindings.d.ts.map +1 -0
  41. package/dist/pack-update/bindings.js +69 -0
  42. package/dist/pack-update/bindings.js.map +7 -0
  43. package/dist/pack-update/config.d.ts +16 -0
  44. package/dist/pack-update/config.d.ts.map +1 -0
  45. package/dist/pack-update/config.js +146 -0
  46. package/dist/pack-update/config.js.map +7 -0
  47. package/dist/pack-update/deps.d.ts +28 -0
  48. package/dist/pack-update/deps.d.ts.map +1 -0
  49. package/dist/pack-update/deps.js +20 -0
  50. package/dist/pack-update/deps.js.map +7 -0
  51. package/dist/pack-update/index.d.ts +55 -0
  52. package/dist/pack-update/index.d.ts.map +1 -0
  53. package/dist/pack-update/index.js +72 -0
  54. package/dist/pack-update/index.js.map +7 -0
  55. package/dist/pack-update/providers/curseforge.d.ts +23 -0
  56. package/dist/pack-update/providers/curseforge.d.ts.map +1 -0
  57. package/dist/pack-update/providers/curseforge.js +229 -0
  58. package/dist/pack-update/providers/curseforge.js.map +7 -0
  59. package/dist/pack-update/providers/index.d.ts +16 -0
  60. package/dist/pack-update/providers/index.d.ts.map +1 -0
  61. package/dist/pack-update/providers/index.js +37 -0
  62. package/dist/pack-update/providers/index.js.map +7 -0
  63. package/dist/pack-update/service.d.ts +28 -0
  64. package/dist/pack-update/service.d.ts.map +1 -0
  65. package/dist/pack-update/service.js +570 -0
  66. package/dist/pack-update/service.js.map +7 -0
  67. package/dist/pack-update/types.d.ts +126 -0
  68. package/dist/pack-update/types.d.ts.map +1 -0
  69. package/dist/pack-update/types.js +8 -0
  70. package/dist/pack-update/types.js.map +7 -0
  71. package/dist/pack-update/version-policy.d.ts +81 -0
  72. package/dist/pack-update/version-policy.d.ts.map +1 -0
  73. package/dist/pack-update/version-policy.js +210 -0
  74. package/dist/pack-update/version-policy.js.map +7 -0
  75. package/dist/paths.d.ts +1 -1
  76. package/dist/paths.d.ts.map +1 -1
  77. package/dist/paths.js +3 -5
  78. package/dist/paths.js.map +2 -2
  79. package/dist/process-probe.d.ts +34 -0
  80. package/dist/process-probe.d.ts.map +1 -0
  81. package/dist/process-probe.js +152 -0
  82. package/dist/process-probe.js.map +7 -0
  83. package/dist/qq-events-notify.d.ts +16 -0
  84. package/dist/qq-events-notify.d.ts.map +1 -0
  85. package/dist/qq-events-notify.js +70 -0
  86. package/dist/qq-events-notify.js.map +7 -0
  87. package/dist/qqutil.d.ts +10 -5
  88. package/dist/qqutil.d.ts.map +1 -1
  89. package/dist/qqutil.js +53 -10
  90. package/dist/qqutil.js.map +2 -2
  91. package/dist/rollback.d.ts.map +1 -1
  92. package/dist/rollback.js +2 -2
  93. package/dist/rollback.js.map +2 -2
  94. package/dist/server-properties-i18n.d.ts +17 -0
  95. package/dist/server-properties-i18n.d.ts.map +1 -0
  96. package/dist/server-properties-i18n.js +201 -0
  97. package/dist/server-properties-i18n.js.map +7 -0
  98. package/dist/server-properties.d.ts +25 -0
  99. package/dist/server-properties.d.ts.map +1 -1
  100. package/dist/server-properties.js +141 -1
  101. package/dist/server-properties.js.map +2 -2
  102. package/dist/types.d.ts +1 -0
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/upstream.d.ts +18 -9
  105. package/dist/upstream.d.ts.map +1 -1
  106. package/dist/upstream.js +8 -7
  107. package/dist/upstream.js.map +2 -2
  108. package/dist/version.js +2 -2
  109. package/dist/version.js.map +2 -2
  110. package/dist/world-packs.d.ts +108 -8
  111. package/dist/world-packs.d.ts.map +1 -1
  112. package/dist/world-packs.js +245 -12
  113. package/dist/world-packs.js.map +3 -3
  114. package/package.json +24 -17
@@ -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 { 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(cfg: BdsUpdaterConfig, channel: string): 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 = json.windows || json.linux;\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): Promise<VersionDetails> {\n const platform = channel === \"preview\" ? \"windows_preview\" : \"windows\";\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 = json.binary?.windows;\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): 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 =\n channel === \"preview\"\n ? `/bin-win-preview/bedrock-server-${version}-preview.zip`\n : `/bin-win/bedrock-server-${version}.zip`;\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
  }
package/dist/version.js CHANGED
@@ -53,7 +53,7 @@ async function getCurrentVersionAsync(exePath) {
53
53
  for (const [ver, entry] of Object.entries(cache)) {
54
54
  if (entry.sha256 === actual) return ver;
55
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");
56
+ log.warn("[BDSUpdater] BDS \u53EF\u6267\u884C\u6587\u4EF6\u54C8\u5E0C\u672A\u5339\u914D\u7F13\u5B58\uFF0C\u7591\u4F3C\u88AB\u6539\u52A8\u6216\u9996\u6B21\u542F\u52A8");
57
57
  return "0.0.0.0";
58
58
  }
59
59
  function getCurrentVersionSync(exePath) {
@@ -64,7 +64,7 @@ function getCurrentVersionSync(exePath) {
64
64
  for (const [ver, entry] of Object.entries(cache)) {
65
65
  if (entry.sha256 === actual) return ver;
66
66
  }
67
- log.warn("[BDSUpdater] bedrock_server.exe \u54C8\u5E0C\u672A\u5339\u914D\u7F13\u5B58");
67
+ log.warn("[BDSUpdater] BDS \u53EF\u6267\u884C\u6587\u4EF6\u54C8\u5E0C\u672A\u5339\u914D\u7F13\u5B58");
68
68
  return "0.0.0.0";
69
69
  }
70
70
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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] BDS \u53EF\u6267\u884C\u6587\u4EF6\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] BDS \u53EF\u6267\u884C\u6587\u4EF6\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,6JAA0C;AACnD,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,2FAA+B;AACxC,SAAO;AACT;",
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,9 +63,14 @@ 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
- /** @deprecated 读 JSON 已剥离 BOM,不再抛出;保留 re-export 兼容旧 import */
57
- export { Utf8BomError } from "./fsx.js";
58
74
  /** 深度优先找含 manifest.json 的包根(默认 maxDepth=2,root 自身为 depth 0) */
59
75
  export declare function discoverPackRoots(root: string, opts?: {
60
76
  maxDepth?: number;
@@ -93,9 +109,20 @@ export declare function resolvePackRoots(src: string, opts?: {
93
109
  export declare function extractArchiveToTemp(filePath: string): Promise<string>;
94
110
  /** 扫描世界内已安装 BP/RP 目录 */
95
111
  export declare function listInstalledWorldPacks(bdsRoot: string, levelName: string): InstalledWorldPack[];
96
- /** RP/BP 第三位版本 +1,写回 manifest */
112
+ /**
113
+ * 将目标包 manifest.json 中的 Patch 版本号递增(+1)并持久化写回。
114
+ *
115
+ * @param packDir 包根目录路径。
116
+ * @returns 递增后的版本三元组 `[major, minor, patch]`。
117
+ */
97
118
  export declare function bumpPackPatchVersion(packDir: string): [number, number, number];
98
- /** 写入 header.version(并同步 modules[].version 的 patch) */
119
+ /**
120
+ * 向目标包的 manifest.json 写入新的版本号,并同步更新内部 modules 的 patch 版本。
121
+ *
122
+ * @param packDir 包根目录路径。
123
+ * @param next 待写入的版本三元组。
124
+ * @returns 写入确认的版本三元组。
125
+ */
99
126
  export declare function writePackHeaderVersion(packDir: string, next: [number, number, number]): [number, number, number];
100
127
  /** 读取 BP manifest 中依赖的资源包 uuid(非 @minecraft 模块) */
101
128
  export declare function readPackDependencyUuids(packDir: string): string[];
@@ -163,8 +190,7 @@ export type PackInstallPlan = {
163
190
  };
164
191
  /**
165
192
  * 读单目录占用事实(info 优先,否则 header)。
166
- * info/header 解析失败返回 null;BOM 已由 readJsonFile 剥离。
167
- * 其它异常上抛,由 scanDestOccupancy 决定仍占文件夹名(uuid 置空)。
193
+ * 解析失败返回 null;不抛 BOM(readJsonFile 已剥离)。
168
194
  */
169
195
  export declare function readPackDirOccupancy(dir: string): {
170
196
  uuid: string;
@@ -172,7 +198,7 @@ export declare function readPackDirOccupancy(dir: string): {
172
198
  name?: string;
173
199
  kind?: WorldPackKind;
174
200
  } | null;
175
- /** 扫描 destParent 下含 manifest 的目录占用(占用事实唯一入口:readPackDirOccupancy) */
201
+ /** 扫描 destParent 下含 manifest 的目录占用(单一事实源:readPackDirOccupancy) */
176
202
  export declare function scanDestOccupancy(destParent: string): DestOccupancy[];
177
203
  /**
178
204
  * 纯决策:装到哪、是否需确认、是否原地覆盖。
@@ -245,4 +271,78 @@ export declare function listWorldEnableEntries(bdsRoot: string, levelName: strin
245
271
  /** 含 parseFail 信号的 enable-list 快照(doctor 用;不暴露 JSON 路径构造细节) */
246
272
  export declare function listWorldEnableListResult(bdsRoot: string, levelName: string, kind: WorldPackKind): WorldPackListReadResult;
247
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>;
248
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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"}
@@ -2,16 +2,28 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { copyDirAsync, readJsonFile } from "./fsx.js";
5
+ import { enableExperimentsInLevelDat, readLevelDatExperiments } from "./level-dat.js";
5
6
  import {
6
7
  bdsWorldLevelDir,
7
8
  bdsWorldsDir,
8
9
  disablePackInWorld,
9
10
  enablePackInWorld,
11
+ ensureConfigPermission,
12
+ isGametestBetaRequired,
13
+ levelDatPath,
14
+ readPackManifestDependencies,
10
15
  readPackManifestHeader,
11
16
  readWorldPackList,
12
17
  readWorldPackListResult
13
18
  } from "./pack-manager.js";
14
19
  import { extractZipFileToDir } from "./zipx.js";
20
+ import {
21
+ enableBetaApisInLevelDat,
22
+ enableExperimentsInLevelDat as enableExperimentsInLevelDat2,
23
+ KNOWN_EXPERIMENTS,
24
+ readLevelDatExperiments as readLevelDatExperiments2,
25
+ resolveExperimentDefinition
26
+ } from "./level-dat.js";
15
27
  const ARCHIVE_EXTS = [".zip", ".mcpack", ".mcaddon"];
16
28
  function formatWorldPackFolderName(rawName, kind) {
17
29
  let s = String(rawName ?? "");
@@ -64,6 +76,50 @@ function detectPackKindFromManifest(raw) {
64
76
  if (types.some((t) => t === "script" || t === "data" || t === "javascript")) return "behavior";
65
77
  return null;
66
78
  }
79
+ function resolvePackLocalizedText(packDir, value) {
80
+ const textsDir = path.join(packDir, "texts");
81
+ if (!value || !fs.existsSync(textsDir)) return value;
82
+ const languageFiles = [];
83
+ const seen = /* @__PURE__ */ new Set();
84
+ const addLanguageFile = (fileName) => {
85
+ const normalized = path.basename(fileName);
86
+ if (!normalized.toLowerCase().endsWith(".lang") || seen.has(normalized.toLowerCase())) return;
87
+ seen.add(normalized.toLowerCase());
88
+ languageFiles.push(path.join(textsDir, normalized));
89
+ };
90
+ try {
91
+ const declared = readJsonFile(path.join(textsDir, "languages.json"));
92
+ if (Array.isArray(declared)) {
93
+ for (const locale of declared) {
94
+ if (typeof locale === "string" && locale.trim()) addLanguageFile(`${locale.trim()}.lang`);
95
+ }
96
+ }
97
+ } catch {
98
+ }
99
+ try {
100
+ for (const entry of fs.readdirSync(textsDir, { withFileTypes: true })) {
101
+ if (entry.isFile()) addLanguageFile(entry.name);
102
+ }
103
+ } catch {
104
+ return value;
105
+ }
106
+ for (const file of languageFiles) {
107
+ if (!fs.existsSync(file)) continue;
108
+ try {
109
+ const lines = fs.readFileSync(file, "utf8").replace(/^\uFEFF/, "").split(/\r?\n/);
110
+ for (const line of lines) {
111
+ const trimmed = line.trimStart();
112
+ if (!trimmed || trimmed.startsWith("#")) continue;
113
+ const separator = line.indexOf("=");
114
+ if (separator < 0 || line.slice(0, separator).trim() !== value) continue;
115
+ const localized = line.slice(separator + 1).trim();
116
+ if (localized) return localized;
117
+ }
118
+ } catch {
119
+ }
120
+ }
121
+ return value;
122
+ }
67
123
  function readPackManifestInfo(packDir) {
68
124
  const file = path.join(packDir, "manifest.json");
69
125
  if (!fs.existsSync(file)) return null;
@@ -78,17 +134,16 @@ function readPackManifestInfo(packDir) {
78
134
  const version = [Number(ver[0]), Number(ver[1]), Number(ver[2])];
79
135
  const description = raw.header?.description;
80
136
  return {
81
- name,
137
+ name: resolvePackLocalizedText(packDir, name),
82
138
  uuid,
83
139
  version,
84
140
  kind,
85
- ...typeof description === "string" ? { description } : {}
141
+ ...typeof description === "string" ? { description: resolvePackLocalizedText(packDir, description) } : {}
86
142
  };
87
143
  } catch {
88
144
  return null;
89
145
  }
90
146
  }
91
- import { Utf8BomError } from "./fsx.js";
92
147
  function discoverPackRoots(root, opts) {
93
148
  const maxDepth = opts?.maxDepth ?? 2;
94
149
  const out = [];
@@ -253,10 +308,7 @@ function listInstalledWorldPacks(bdsRoot, levelName) {
253
308
  const worldsDir = bdsWorldsDir(bdsRoot);
254
309
  const result = [];
255
310
  for (const kind of ["behavior", "resource"]) {
256
- const parent = path.join(
257
- worldRoot,
258
- kind === "behavior" ? "behavior_packs" : "resource_packs"
259
- );
311
+ const parent = path.join(worldRoot, kind === "behavior" ? "behavior_packs" : "resource_packs");
260
312
  const enabledList = readWorldPackList(worldsDir, levelName, kind);
261
313
  const enabledMap = new Map(enabledList.map((e) => [e.pack_id, e.version]));
262
314
  for (const dir of listPackDirsIn(parent)) {
@@ -526,10 +578,7 @@ async function uninstallInstalledPack(opts) {
526
578
  return { action: "deleted" };
527
579
  }
528
580
  function worldPackParentDir(bdsRoot, levelName, kind) {
529
- return path.join(
530
- bdsWorldLevelDir(bdsRoot, levelName),
531
- kind === "behavior" ? "behavior_packs" : "resource_packs"
532
- );
581
+ return path.join(bdsWorldLevelDir(bdsRoot, levelName), kind === "behavior" ? "behavior_packs" : "resource_packs");
533
582
  }
534
583
  function listWorldEnableEntries(bdsRoot, levelName, kind) {
535
584
  return listWorldEnableListResult(bdsRoot, levelName, kind).entries;
@@ -543,17 +592,196 @@ function findInstalledPackById(packs, id) {
543
592
  (p) => p.uuid.toLowerCase() === q || p.folderName.toLowerCase() === q || p.name.toLowerCase() === q || p.folderName.toLowerCase().includes(q) || p.name.toLowerCase().includes(q)
544
593
  ) ?? null;
545
594
  }
595
+ function isBetaApiDependency(dep) {
596
+ return isGametestBetaRequired(dep);
597
+ }
598
+ function checkWorldBetaApiRequirements(bdsRoot, levelName, installedPacks) {
599
+ const lPath = levelDatPath(bdsRoot, levelName);
600
+ const exists = fs.existsSync(lPath);
601
+ const expInfo = exists ? readLevelDatExperiments(lPath) : null;
602
+ const hasBetaApis = expInfo?.hasBetaApis ?? false;
603
+ const packs = installedPacks ?? listInstalledWorldPacks(bdsRoot, levelName);
604
+ const requiringPacks = [];
605
+ for (const p of packs) {
606
+ if (p.kind !== "behavior" || !p.enabled) continue;
607
+ const deps = readPackManifestDependencies(p.dir);
608
+ const betaDeps = deps.filter(isBetaApiDependency);
609
+ if (betaDeps.length > 0) {
610
+ requiringPacks.push({
611
+ pack: p,
612
+ betaDependencies: betaDeps
613
+ });
614
+ }
615
+ }
616
+ return {
617
+ hasBetaApis,
618
+ levelDatExists: exists,
619
+ levelDatPath: lPath,
620
+ requiringPacks
621
+ };
622
+ }
623
+ function checkWorldExperimentsDiagnosis(bdsRoot, levelName, installedPacks) {
624
+ const betaApis = checkWorldBetaApiRequirements(bdsRoot, levelName, installedPacks);
625
+ const info = betaApis.levelDatExists ? readLevelDatExperiments(betaApis.levelDatPath) : null;
626
+ return {
627
+ levelDatExists: betaApis.levelDatExists,
628
+ levelDatPath: betaApis.levelDatPath,
629
+ experimentsInfo: info,
630
+ betaApis
631
+ };
632
+ }
633
+ function checkWorldScriptPermissions(bdsRoot, levelName, installedPacks) {
634
+ const packs = installedPacks ?? listInstalledWorldPacks(bdsRoot, levelName);
635
+ const defaultFile = path.join(bdsRoot, "config", "default", "permissions.json");
636
+ const defaultModules = /* @__PURE__ */ new Set();
637
+ if (fs.existsSync(defaultFile)) {
638
+ try {
639
+ const raw = readJsonFile(defaultFile);
640
+ if (Array.isArray(raw.allowed_modules)) {
641
+ for (const m of raw.allowed_modules) defaultModules.add(m);
642
+ }
643
+ } catch {
644
+ }
645
+ }
646
+ const missingPermissions = [];
647
+ for (const p of packs) {
648
+ if (p.kind !== "behavior" || !p.enabled) continue;
649
+ const deps = readPackManifestDependencies(p.dir);
650
+ const privilegedDeps = deps.filter((d) => {
651
+ const m = d.module_name ?? "";
652
+ return m === "@minecraft/server-net" || m === "@minecraft/server-admin" || m === "@minecraft/diagnostics";
653
+ });
654
+ if (privilegedDeps.length === 0) continue;
655
+ const headerInfo = readPackManifestHeader(p.dir);
656
+ const uuids = Array.from(/* @__PURE__ */ new Set([p.uuid, ...headerInfo?.moduleUuid ? [headerInfo.moduleUuid] : []]));
657
+ const packAllowed = /* @__PURE__ */ new Set();
658
+ for (const u of uuids) {
659
+ const f = path.join(bdsRoot, "config", u, "permissions.json");
660
+ if (fs.existsSync(f)) {
661
+ try {
662
+ const raw = readJsonFile(f);
663
+ if (Array.isArray(raw.allowed_modules)) {
664
+ for (const m of raw.allowed_modules) packAllowed.add(m);
665
+ }
666
+ } catch {
667
+ }
668
+ }
669
+ }
670
+ for (const dep of privilegedDeps) {
671
+ const mod = dep.module_name;
672
+ if (!defaultModules.has(mod) && !packAllowed.has(mod)) {
673
+ missingPermissions.push({ pack: p, moduleName: mod });
674
+ }
675
+ }
676
+ }
677
+ return { missingPermissions };
678
+ }
679
+ async function repairWorldPacksWiring(bdsRoot, levelName, opts) {
680
+ const packs = listInstalledWorldPacks(bdsRoot, levelName);
681
+ const cleanedGhostPacks = [];
682
+ const syncedVersions = [];
683
+ for (const kind of ["behavior", "resource"]) {
684
+ const snap = listWorldEnableListResult(bdsRoot, levelName, kind);
685
+ const byUuid = new Map(packs.filter((p) => p.kind === kind).map((p) => [p.uuid, p]));
686
+ for (const e of snap.entries) {
687
+ const p = byUuid.get(e.pack_id);
688
+ if (!p) {
689
+ const entryVer = Array.isArray(e.version) && e.version.length >= 3 ? [Number(e.version[0]), Number(e.version[1]), Number(e.version[2])] : [1, 0, 0];
690
+ await disablePackInWorld({
691
+ worldsDir: bdsWorldsDir(bdsRoot),
692
+ levelName,
693
+ kind,
694
+ packUuid: e.pack_id,
695
+ version: entryVer
696
+ });
697
+ cleanedGhostPacks.push({ kind, uuid: e.pack_id });
698
+ } else {
699
+ const ev = e.version;
700
+ if (Array.isArray(ev) && ev.length >= 3 && (ev[0] !== p.version[0] || ev[1] !== p.version[1] || ev[2] !== p.version[2])) {
701
+ await enablePackInWorld({
702
+ worldsDir: bdsWorldsDir(bdsRoot),
703
+ levelName,
704
+ kind,
705
+ packUuid: p.uuid,
706
+ version: p.version
707
+ });
708
+ syncedVersions.push({
709
+ kind,
710
+ folder: p.folderName,
711
+ listVer: ev.join("."),
712
+ diskVer: p.version.join(".")
713
+ });
714
+ }
715
+ }
716
+ }
717
+ }
718
+ let betaApisResult = void 0;
719
+ let experimentsResult = void 0;
720
+ const shouldMutateExperiments = !!opts?.enableExperiments || !!opts?.fixBetaApis;
721
+ if (shouldMutateExperiments) {
722
+ const lPath = levelDatPath(bdsRoot, levelName);
723
+ const targets = opts?.enableExperiments ?? (opts?.fixBetaApis ? ["gametest"] : []);
724
+ const mutateRes = await enableExperimentsInLevelDat(lPath, targets);
725
+ experimentsResult = {
726
+ attempted: true,
727
+ changed: mutateRes.changed,
728
+ enabled: mutateRes.enabledExperiments ?? [],
729
+ ...mutateRes.backupPath ? { backupPath: mutateRes.backupPath } : {},
730
+ ...mutateRes.error ? { error: mutateRes.error } : {}
731
+ };
732
+ if (opts?.fixBetaApis) {
733
+ betaApisResult = {
734
+ attempted: true,
735
+ changed: mutateRes.changed,
736
+ ...mutateRes.backupPath ? { backupPath: mutateRes.backupPath } : {},
737
+ ...mutateRes.error ? { error: mutateRes.error } : {}
738
+ };
739
+ }
740
+ }
741
+ const permDiag = checkWorldScriptPermissions(bdsRoot, levelName, packs);
742
+ let fixedPermissions = void 0;
743
+ if (permDiag.missingPermissions.length > 0) {
744
+ fixedPermissions = [];
745
+ for (const item of permDiag.missingPermissions) {
746
+ const headerInfo = readPackManifestHeader(item.pack.dir);
747
+ await ensureConfigPermission(bdsRoot, item.pack.uuid, headerInfo?.moduleUuid);
748
+ fixedPermissions.push({
749
+ packName: item.pack.name || item.pack.folderName,
750
+ moduleName: item.moduleName
751
+ });
752
+ }
753
+ }
754
+ const result = {
755
+ cleanedGhostPacks,
756
+ syncedVersions
757
+ };
758
+ if (betaApisResult) {
759
+ result.betaApisResult = betaApisResult;
760
+ }
761
+ if (experimentsResult) {
762
+ result.experimentsResult = experimentsResult;
763
+ }
764
+ if (fixedPermissions && fixedPermissions.length > 0) {
765
+ result.fixedPermissions = fixedPermissions;
766
+ }
767
+ return result;
768
+ }
546
769
  export {
547
- Utf8BomError,
770
+ KNOWN_EXPERIMENTS,
548
771
  allocatePackFolderName,
549
772
  bumpPackPatchVersion,
550
773
  bumpSemVer3,
774
+ checkWorldBetaApiRequirements,
775
+ checkWorldExperimentsDiagnosis,
776
+ checkWorldScriptPermissions,
551
777
  choosePackInstallFolderName,
552
778
  compareSemVer3,
553
779
  decidePackInstallPlan,
554
780
  detectPackKindFromManifest,
555
781
  disableInstalledPack,
556
782
  discoverPackRoots,
783
+ enableBetaApisInLevelDat,
784
+ enableExperimentsInLevelDat2 as enableExperimentsInLevelDat,
557
785
  enableInstalledPack,
558
786
  ensureVersionGreaterThan,
559
787
  expandNestedArchivesInPlace,
@@ -561,6 +789,7 @@ export {
561
789
  findInstalledPackById,
562
790
  formatWorldPackFolderName,
563
791
  installPackDirectory,
792
+ isBetaApiDependency,
564
793
  isGenericPackFolderStem,
565
794
  isPackArchive,
566
795
  listInstalledWorldPacks,
@@ -569,9 +798,13 @@ export {
569
798
  listWorldEnableListResult,
570
799
  maxSemVer3,
571
800
  nextEnabledVersion,
801
+ readLevelDatExperiments2 as readLevelDatExperiments,
572
802
  readPackDependencyUuids,
573
803
  readPackDirOccupancy,
574
804
  readPackManifestInfo,
805
+ repairWorldPacksWiring,
806
+ resolveExperimentDefinition,
807
+ resolvePackLocalizedText,
575
808
  resolvePackRoots,
576
809
  scanDestOccupancy,
577
810
  stripWorldPackFolderPrefix,