@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.
- package/LICENSE +663 -0
- package/README.md +1 -1
- package/dist/bds-manager.d.ts +16 -6
- package/dist/bds-manager.d.ts.map +1 -1
- package/dist/bds-manager.js +59 -66
- package/dist/bds-manager.js.map +2 -2
- package/dist/changelog.d.ts +11 -7
- package/dist/changelog.d.ts.map +1 -1
- package/dist/changelog.js +60 -34
- package/dist/changelog.js.map +2 -2
- package/dist/check-update.d.ts.map +1 -1
- package/dist/check-update.js +59 -23
- package/dist/check-update.js.map +2 -2
- package/dist/cli-pack-manager.js +11 -1
- package/dist/cli-pack-manager.js.map +2 -2
- package/dist/dependency-negotiator.d.ts +73 -0
- package/dist/dependency-negotiator.d.ts.map +1 -0
- package/dist/dependency-negotiator.js +151 -0
- package/dist/dependency-negotiator.js.map +7 -0
- package/dist/fsx.d.ts +17 -14
- package/dist/fsx.d.ts.map +1 -1
- package/dist/fsx.js +67 -19
- package/dist/fsx.js.map +2 -2
- package/dist/host-platform.d.ts +25 -0
- package/dist/host-platform.d.ts.map +1 -0
- package/dist/host-platform.js +50 -0
- package/dist/host-platform.js.map +7 -0
- package/dist/http.d.ts +49 -11
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js.map +2 -2
- package/dist/level-dat.d.ts +105 -0
- package/dist/level-dat.d.ts.map +1 -0
- package/dist/level-dat.js +490 -0
- package/dist/level-dat.js.map +7 -0
- package/dist/pack-manager.d.ts +41 -34
- package/dist/pack-manager.d.ts.map +1 -1
- package/dist/pack-manager.js +79 -25
- package/dist/pack-manager.js.map +2 -2
- package/dist/pack-update/bindings.d.ts +16 -0
- package/dist/pack-update/bindings.d.ts.map +1 -0
- package/dist/pack-update/bindings.js +69 -0
- package/dist/pack-update/bindings.js.map +7 -0
- package/dist/pack-update/config.d.ts +16 -0
- package/dist/pack-update/config.d.ts.map +1 -0
- package/dist/pack-update/config.js +146 -0
- package/dist/pack-update/config.js.map +7 -0
- package/dist/pack-update/deps.d.ts +28 -0
- package/dist/pack-update/deps.d.ts.map +1 -0
- package/dist/pack-update/deps.js +20 -0
- package/dist/pack-update/deps.js.map +7 -0
- package/dist/pack-update/index.d.ts +55 -0
- package/dist/pack-update/index.d.ts.map +1 -0
- package/dist/pack-update/index.js +72 -0
- package/dist/pack-update/index.js.map +7 -0
- package/dist/pack-update/providers/curseforge.d.ts +23 -0
- package/dist/pack-update/providers/curseforge.d.ts.map +1 -0
- package/dist/pack-update/providers/curseforge.js +229 -0
- package/dist/pack-update/providers/curseforge.js.map +7 -0
- package/dist/pack-update/providers/index.d.ts +16 -0
- package/dist/pack-update/providers/index.d.ts.map +1 -0
- package/dist/pack-update/providers/index.js +37 -0
- package/dist/pack-update/providers/index.js.map +7 -0
- package/dist/pack-update/service.d.ts +28 -0
- package/dist/pack-update/service.d.ts.map +1 -0
- package/dist/pack-update/service.js +570 -0
- package/dist/pack-update/service.js.map +7 -0
- package/dist/pack-update/types.d.ts +126 -0
- package/dist/pack-update/types.d.ts.map +1 -0
- package/dist/pack-update/types.js +8 -0
- package/dist/pack-update/types.js.map +7 -0
- package/dist/pack-update/version-policy.d.ts +81 -0
- package/dist/pack-update/version-policy.d.ts.map +1 -0
- package/dist/pack-update/version-policy.js +210 -0
- package/dist/pack-update/version-policy.js.map +7 -0
- package/dist/paths.d.ts +1 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +3 -5
- package/dist/paths.js.map +2 -2
- package/dist/process-probe.d.ts +34 -0
- package/dist/process-probe.d.ts.map +1 -0
- package/dist/process-probe.js +152 -0
- package/dist/process-probe.js.map +7 -0
- package/dist/qq-events-notify.d.ts +16 -0
- package/dist/qq-events-notify.d.ts.map +1 -0
- package/dist/qq-events-notify.js +70 -0
- package/dist/qq-events-notify.js.map +7 -0
- package/dist/qqutil.d.ts +10 -5
- package/dist/qqutil.d.ts.map +1 -1
- package/dist/qqutil.js +53 -10
- package/dist/qqutil.js.map +2 -2
- package/dist/rollback.d.ts.map +1 -1
- package/dist/rollback.js +2 -2
- package/dist/rollback.js.map +2 -2
- package/dist/server-properties-i18n.d.ts +17 -0
- package/dist/server-properties-i18n.d.ts.map +1 -0
- package/dist/server-properties-i18n.js +201 -0
- package/dist/server-properties-i18n.js.map +7 -0
- package/dist/server-properties.d.ts +25 -0
- package/dist/server-properties.d.ts.map +1 -1
- package/dist/server-properties.js +141 -1
- package/dist/server-properties.js.map +2 -2
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/upstream.d.ts +18 -9
- package/dist/upstream.d.ts.map +1 -1
- package/dist/upstream.js +8 -7
- package/dist/upstream.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +2 -2
- package/dist/world-packs.d.ts +108 -8
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +245 -12
- package/dist/world-packs.js.map +3 -3
- package/package.json +24 -17
package/dist/upstream.js.map
CHANGED
|
@@ -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
|
|
5
|
-
"mappings": "
|
|
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]
|
|
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]
|
|
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 {
|
package/dist/version.js.map
CHANGED
|
@@ -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]
|
|
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,
|
|
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
|
}
|
package/dist/world-packs.d.ts
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"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"}
|
package/dist/world-packs.js
CHANGED
|
@@ -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
|
-
|
|
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,
|