@sfmc-bds/bds-tools 0.2.0-beta.11 → 0.2.0-beta.13

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 (39) hide show
  1. package/dist/bds-manager.d.ts.map +1 -1
  2. package/dist/bds-manager.js +12 -1
  3. package/dist/bds-manager.js.map +2 -2
  4. package/dist/check-update.d.ts.map +1 -1
  5. package/dist/check-update.js +3 -2
  6. package/dist/check-update.js.map +2 -2
  7. package/dist/cli-pack-manager.js +11 -1
  8. package/dist/cli-pack-manager.js.map +2 -2
  9. package/dist/dependency-negotiator.d.ts +73 -0
  10. package/dist/dependency-negotiator.d.ts.map +1 -0
  11. package/dist/dependency-negotiator.js +151 -0
  12. package/dist/dependency-negotiator.js.map +7 -0
  13. package/dist/dependency-negotiator.test.js +120 -0
  14. package/dist/dependency-negotiator.test.js.map +7 -0
  15. package/dist/level-dat.d.ts +87 -0
  16. package/dist/level-dat.d.ts.map +1 -0
  17. package/dist/level-dat.js +326 -0
  18. package/dist/level-dat.js.map +7 -0
  19. package/dist/level-dat.test.js +125 -0
  20. package/dist/level-dat.test.js.map +7 -0
  21. package/dist/pack-manager.d.ts +18 -6
  22. package/dist/pack-manager.d.ts.map +1 -1
  23. package/dist/pack-manager.js +73 -24
  24. package/dist/pack-manager.js.map +2 -2
  25. package/dist/server-properties-i18n.d.ts +17 -0
  26. package/dist/server-properties-i18n.d.ts.map +1 -0
  27. package/dist/server-properties-i18n.js +197 -0
  28. package/dist/server-properties-i18n.js.map +7 -0
  29. package/dist/server-properties.d.ts +22 -0
  30. package/dist/server-properties.d.ts.map +1 -1
  31. package/dist/server-properties.js +126 -1
  32. package/dist/server-properties.js.map +2 -2
  33. package/dist/server-properties.test.js +127 -0
  34. package/dist/server-properties.test.js.map +7 -0
  35. package/dist/world-packs.d.ts +57 -1
  36. package/dist/world-packs.d.ts.map +1 -1
  37. package/dist/world-packs.js +159 -1
  38. package/dist/world-packs.js.map +2 -2
  39. package/package.json +6 -3
@@ -0,0 +1,151 @@
1
+ const NATIVE_BEDROCK_SCRIPT_MODULES = /* @__PURE__ */ new Set([
2
+ "@minecraft/server",
3
+ "@minecraft/server-ui",
4
+ "@minecraft/server-net",
5
+ "@minecraft/server-admin",
6
+ "@minecraft/server-gametest",
7
+ "@minecraft/server-editor",
8
+ "@minecraft/server-graphics",
9
+ "@minecraft/diagnostics",
10
+ "@minecraft/debug-utilities",
11
+ "@minecraft/common"
12
+ ]);
13
+ const BASELINE_BEDROCK_DEPENDENCIES = [
14
+ { module_name: "@minecraft/server", version: "1.18.0" },
15
+ { module_name: "@minecraft/server-net", version: "1.0.0-beta" },
16
+ { module_name: "@minecraft/server-ui", version: "1.3.0" },
17
+ { module_name: "@minecraft/server-admin", version: "1.0.0-beta" },
18
+ { module_name: "@minecraft/diagnostics", version: "1.0.0-beta" }
19
+ ];
20
+ function cleanBedrockVersion(raw) {
21
+ if (Array.isArray(raw)) return raw.join(".");
22
+ if (!raw || typeof raw !== "string") return "1.0.0";
23
+ let v = raw.trim();
24
+ if (v.toLowerCase() === "beta") return "beta";
25
+ v = v.replace(/^[>=~^<v\s]+/, "");
26
+ const spaceIdx = v.indexOf(" ");
27
+ if (spaceIdx > 0) v = v.slice(0, spaceIdx);
28
+ v = v.replace(/(-beta)\..*$/i, "$1");
29
+ return v || "1.0.0";
30
+ }
31
+ function parseBedrockVersion(raw) {
32
+ const cleaned = cleanBedrockVersion(raw);
33
+ const match = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?/.exec(cleaned);
34
+ if (!match) {
35
+ return { major: 1, minor: 0, patch: 0, prerelease: null };
36
+ }
37
+ return {
38
+ major: Number(match[1] || 0),
39
+ minor: Number(match[2] || 0),
40
+ patch: Number(match[3] || 0),
41
+ prerelease: match[4] ?? null
42
+ };
43
+ }
44
+ function compareBedrockVersion(a, b) {
45
+ const normA = cleanBedrockVersion(a);
46
+ const normB = cleanBedrockVersion(b);
47
+ const isBetaA = normA.toLowerCase() === "beta";
48
+ const isBetaB = normB.toLowerCase() === "beta";
49
+ if (isBetaA && isBetaB) return 0;
50
+ if (isBetaA) return 1;
51
+ if (isBetaB) return -1;
52
+ const pa = parseBedrockVersion(a);
53
+ const pb = parseBedrockVersion(b);
54
+ if (pa.major !== pb.major) return pa.major - pb.major;
55
+ if (pa.minor !== pb.minor) return pa.minor - pb.minor;
56
+ if (pa.patch !== pb.patch) return pa.patch - pb.patch;
57
+ if (pa.prerelease === null && pb.prerelease === null) return 0;
58
+ if (pa.prerelease === null && pb.prerelease !== null) return 1;
59
+ if (pa.prerelease !== null && pb.prerelease === null) return -1;
60
+ return (pa.prerelease ?? "").localeCompare(pb.prerelease ?? "");
61
+ }
62
+ function isGametestBetaRequired(dep) {
63
+ const mod = dep.module_name ?? "";
64
+ const ver = cleanBedrockVersion(dep.version).toLowerCase();
65
+ if (mod === "@minecraft/server-gametest" || mod === "@minecraft/server-editor") return true;
66
+ if (mod === "@minecraft/server-net" || mod === "@minecraft/server-admin") return false;
67
+ if ((mod === "@minecraft/server" || mod === "@minecraft/server-ui") && ver.includes("beta")) {
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ function negotiateBedrockDependencies(baseline = BASELINE_BEDROCK_DEPENDENCIES, moduleRequirements = []) {
73
+ const order = [];
74
+ const map = /* @__PURE__ */ new Map();
75
+ for (const b of baseline) {
76
+ if (!b.module_name) continue;
77
+ order.push(b.module_name);
78
+ map.set(b.module_name, {
79
+ version: cleanBedrockVersion(b.version),
80
+ uuid: b.uuid,
81
+ requestedBy: ["__sfmc_baseline__"]
82
+ });
83
+ }
84
+ for (const mod of moduleRequirements) {
85
+ for (const dep of mod.dependencies) {
86
+ if (!dep.module_name) continue;
87
+ const modName = dep.module_name;
88
+ const reqVer = cleanBedrockVersion(dep.version);
89
+ if (!map.has(modName)) {
90
+ order.push(modName);
91
+ map.set(modName, {
92
+ version: reqVer,
93
+ uuid: dep.uuid,
94
+ requestedBy: [mod.folderId],
95
+ promotedFrom: void 0
96
+ });
97
+ continue;
98
+ }
99
+ const existing = map.get(modName);
100
+ if (compareBedrockVersion(reqVer, existing.version) > 0) {
101
+ map.set(modName, {
102
+ version: reqVer,
103
+ uuid: dep.uuid ?? existing.uuid,
104
+ requestedBy: [mod.folderId],
105
+ promotedFrom: existing.promotedFrom ?? existing.version
106
+ });
107
+ } else if (compareBedrockVersion(reqVer, existing.version) === 0) {
108
+ if (!existing.requestedBy.includes(mod.folderId)) {
109
+ existing.requestedBy.push(mod.folderId);
110
+ }
111
+ }
112
+ }
113
+ }
114
+ const promotions = [];
115
+ const finalDeps = [];
116
+ let hasBetaApis = false;
117
+ for (const name of order) {
118
+ const entry = map.get(name);
119
+ const dep = {
120
+ module_name: name,
121
+ version: entry.version,
122
+ ...entry.uuid ? { uuid: entry.uuid } : {}
123
+ };
124
+ finalDeps.push(dep);
125
+ if (entry.promotedFrom && entry.promotedFrom !== entry.version) {
126
+ promotions.push({
127
+ moduleName: name,
128
+ from: entry.promotedFrom,
129
+ to: entry.version,
130
+ requestedBy: entry.requestedBy.filter((x) => x !== "__sfmc_baseline__")
131
+ });
132
+ }
133
+ if (isGametestBetaRequired(dep)) {
134
+ hasBetaApis = true;
135
+ }
136
+ }
137
+ return {
138
+ dependencies: finalDeps,
139
+ promotions,
140
+ hasBetaApis
141
+ };
142
+ }
143
+ export {
144
+ BASELINE_BEDROCK_DEPENDENCIES,
145
+ NATIVE_BEDROCK_SCRIPT_MODULES,
146
+ cleanBedrockVersion,
147
+ compareBedrockVersion,
148
+ isGametestBetaRequired,
149
+ negotiateBedrockDependencies
150
+ };
151
+ //# sourceMappingURL=dependency-negotiator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dependency-negotiator.ts"],
4
+ "sourcesContent": ["/**\n * dependency-negotiator.ts \u2014 Bedrock \u539F\u751F\u6A21\u5757\u4F9D\u8D56\u7248\u672C\u89E3\u6790\u4E0E\u52A8\u6001\u534F\u5546\u5668\n *\n * \u804C\u8D23\uFF1A\n * 1. Bedrock \u539F\u751F\u6A21\u5757\u7248\u672C\uFF08SemVer / Beta / Preview\uFF09\u5BF9\u6BD4\u7B97\u6CD5\uFF1B\n * 2. \u805A\u5408\u5E73\u53F0\u9ED8\u8BA4\u57FA\u51C6\u4F9D\u8D56\u4E0E\u5404\u4E1A\u52A1\u6A21\u5757\u58F0\u660E\u7684 Minecraft \u4F9D\u8D56\u9700\u6C42\uFF1B\n * 3. \u52A8\u6001\u63D0\u5347\u805A\u5408\u884C\u4E3A\u5305 manifest.json \u4E2D\u7684 dependencies\uFF1B\n * 4. \u5224\u5B9A\u534F\u5546\u540E\u662F\u5426\u5305\u542B\u9700\u8981\u5B58\u6863\u5F00\u542F\u6D4B\u8BD5\u7248\u73A9\u6CD5\uFF08Beta APIs / gametest\uFF09\u7684\u6A21\u5757\u3002\n */\n\nexport interface PackManifestDependency {\n module_name?: string | undefined;\n version?: string | number[] | undefined;\n uuid?: string | undefined;\n}\n\nexport interface ModuleDeclaredDependencies {\n folderId: string;\n dependencies: PackManifestDependency[];\n}\n\nexport interface DependencyPromotion {\n moduleName: string;\n from: string;\n to: string;\n requestedBy: string[];\n}\n\nexport interface NegotiatedDependenciesResult {\n /** \u534F\u5546\u5B8C\u6210\u540E\u7684\u6700\u7EC8 dependencies \u5217\u8868 */\n dependencies: PackManifestDependency[];\n /** \u672C\u6B21\u534F\u5546\u53D1\u751F\u7684\u7248\u672C\u63D0\u5347\u8BB0\u5F55\uFF08\u4FBF\u4E8E\u65E5\u5FD7\u5C55\u793A\uFF09 */\n promotions: DependencyPromotion[];\n /** \u662F\u5426\u5F15\u5165\u4E86\u9700\u8981 level.dat \u5F00\u542F Beta APIs (gametest = 1b) \u7684\u6A21\u5757 */\n hasBetaApis: boolean;\n}\n\n/** Bedrock \u5F15\u64CE\u539F\u751F\u5185\u7F6E\u7684 Script API \u6A21\u5757\u96C6\u5408\uFF08\u6392\u9664\u7EAF npm \u7C7B\u578B/\u6570\u636E\u5305\u5982 vanilla-data, math\uFF09 */\nexport const NATIVE_BEDROCK_SCRIPT_MODULES = new Set<string>([\n \"@minecraft/server\",\n \"@minecraft/server-ui\",\n \"@minecraft/server-net\",\n \"@minecraft/server-admin\",\n \"@minecraft/server-gametest\",\n \"@minecraft/server-editor\",\n \"@minecraft/server-graphics\",\n \"@minecraft/diagnostics\",\n \"@minecraft/debug-utilities\",\n \"@minecraft/common\",\n]);\n\n/** SFMC \u5E73\u53F0\u5408\u6210 BP \u7684\u9ED8\u8BA4\u57FA\u51C6\u4F9D\u8D56\uFF08\u7A33\u5B9A\u4FDD\u5E95\uFF09 */\nexport const BASELINE_BEDROCK_DEPENDENCIES: PackManifestDependency[] = [\n { module_name: \"@minecraft/server\", version: \"1.18.0\" },\n { module_name: \"@minecraft/server-net\", version: \"1.0.0-beta\" },\n { module_name: \"@minecraft/server-ui\", version: \"1.3.0\" },\n { module_name: \"@minecraft/server-admin\", version: \"1.0.0-beta\" },\n { module_name: \"@minecraft/diagnostics\", version: \"1.0.0-beta\" },\n];\n\n/**\n * \u6E05\u7406\u5E76\u89C4\u8303\u5316\u7248\u672C\u53F7\u5B57\u7B26\u4E32\uFF08\u53BB\u9664 npm range \u524D\u7F00\uFF0C\u5982 `^2.0.0-beta` \u2192 `2.0.0-beta`\uFF09\u3002\n */\nexport function cleanBedrockVersion(raw: string | number[] | undefined): string {\n if (Array.isArray(raw)) return raw.join(\".\");\n if (!raw || typeof raw !== \"string\") return \"1.0.0\";\n let v = raw.trim();\n if (v.toLowerCase() === \"beta\") return \"beta\";\n // \u53BB\u9664 >=, <=, ^, ~, >, <, =, v\n v = v.replace(/^[>=~^<v\\s]+/, \"\");\n // \u82E5\u5305\u542B\u7A7A\u683C\u5206\u9694\u7684\u533A\u95F4\uFF08\u5982 \">=1.0.0 <2.0.0\"\uFF09\uFF0C\u53D6\u524D\u7F00\n const spaceIdx = v.indexOf(\" \");\n if (spaceIdx > 0) v = v.slice(0, spaceIdx);\n // \u82E5\u5305\u542B npm preview \u6269\u5C55\u53D1\u5E03\u540E\u7F00\uFF08\u5982 2.10.0-beta.1.26.40-preview.30\uFF09\uFF0C\u89C4\u6574\u4E3A\u6807\u51C6 SemVer prerelease\uFF08\u5982 2.10.0-beta\uFF09\n v = v.replace(/(-beta)\\..*$/i, \"$1\");\n return v || \"1.0.0\";\n}\n\ninterface ParsedBedrockVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease: string | null;\n}\n\nfunction parseBedrockVersion(raw: string): ParsedBedrockVersion {\n const cleaned = cleanBedrockVersion(raw);\n const match = /^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:-([0-9A-Za-z.-]+))?/.exec(cleaned);\n if (!match) {\n return { major: 1, minor: 0, patch: 0, prerelease: null };\n }\n return {\n major: Number(match[1] || 0),\n minor: Number(match[2] || 0),\n patch: Number(match[3] || 0),\n prerelease: match[4] ?? null,\n };\n}\n\n/**\n * \u6BD4\u8F83\u4E24\u4E2A Bedrock \u7248\u672C\u53F7\uFF1A\n * a > b \u8FD4\u56DE\u6B63\u6570\uFF1Ba < b \u8FD4\u56DE\u8D1F\u6570\uFF1Ba === b \u8FD4\u56DE 0\u3002\n *\n * \u6838\u5FC3\u89C4\u5219\uFF1A\n * 1. \"beta\" \u4E3A\u9884\u89C8/\u6D4B\u8BD5\u8F68\u9876\u7EA7\uFF0C\u9AD8\u4E8E\u4EFB\u4F55\u7EAF\u6570\u5B57\u7A33\u5B9A\u7248\uFF1B\n * 2. \u4F18\u5148\u6BD4\u8F83 major, minor, patch \u6570\u5B57\uFF1B\n * 3. \u5728\u540C\u4E00\u5927\u7248\u672C\u6216\u4F4E\u7248\u672C\u4E0B\uFF1A\n * - \u82E5 majorA > majorB\uFF08\u4F8B\u5982 2.0.0 vs 1.3.0\uFF09\uFF0Cmajor \u9AD8\u8005\u80DC\u51FA\uFF1B\n * - \u82E5 major/minor/patch \u5747\u76F8\u540C\uFF0C\u6B63\u5F0F\u7248\u4F18\u5148\u4E8E prerelease\uFF1B\n * - \u82E5\u4E24\u8005\u5747\u4E3A prerelease\uFF0C\u6309\u5B57\u5178\u5E8F\u6BD4\u8F83\u3002\n */\nexport function compareBedrockVersion(a: string, b: string): number {\n const normA = cleanBedrockVersion(a);\n const normB = cleanBedrockVersion(b);\n const isBetaA = normA.toLowerCase() === \"beta\";\n const isBetaB = normB.toLowerCase() === \"beta\";\n if (isBetaA && isBetaB) return 0;\n if (isBetaA) return 1;\n if (isBetaB) return -1;\n\n const pa = parseBedrockVersion(a);\n const pb = parseBedrockVersion(b);\n\n if (pa.major !== pb.major) return pa.major - pb.major;\n if (pa.minor !== pb.minor) return pa.minor - pb.minor;\n if (pa.patch !== pb.patch) return pa.patch - pb.patch;\n\n if (pa.prerelease === null && pb.prerelease === null) return 0;\n // \u76F8\u540C version \u9AA8\u67B6\u4E0B\uFF1A\u6B63\u5F0F\u7248\uFF08null\uFF09 > \u6D4B\u8BD5\u7248\uFF08prerelease\uFF09\n if (pa.prerelease === null && pb.prerelease !== null) return 1;\n if (pa.prerelease !== null && pb.prerelease === null) return -1;\n\n // \u5747\u4E3A prerelease \u65F6\u6BD4\u8F83\n return (pa.prerelease ?? \"\").localeCompare(pb.prerelease ?? \"\");\n}\n\n/**\n * \u5224\u5B9A\u4E00\u4E2A\u4F9D\u8D56\u9879\u662F\u5426\u771F\u6B63\u9700\u8981\u4E16\u754C\u5B58\u6863\u5F00\u542F\u6D4B\u8BD5\u7248\u73A9\u6CD5\uFF08Beta APIs / gametest\uFF09\u3002\n * \u6CE8\u610F\uFF1A@minecraft/server-net \u4E0E @minecraft/server-admin \u867D\u5E26 -beta\uFF0C\u4F46\u5C5E\u4E8E permissions.json \u6A21\u5757\u6743\u9650\uFF0C\n * \u4E0D\u9700\u8981 level.dat \u7684 gametest \u5B9E\u9A8C\u5F00\u5173\u3002\n */\nexport function isGametestBetaRequired(dep: PackManifestDependency): boolean {\n const mod = dep.module_name ?? \"\";\n const ver = cleanBedrockVersion(dep.version).toLowerCase();\n if (mod === \"@minecraft/server-gametest\" || mod === \"@minecraft/server-editor\") return true;\n if (mod === \"@minecraft/server-net\" || mod === \"@minecraft/server-admin\") return false;\n if ((mod === \"@minecraft/server\" || mod === \"@minecraft/server-ui\") && ver.includes(\"beta\")) {\n return true;\n }\n return false;\n}\n\n/**\n * \u52A8\u6001\u534F\u5546 Bedrock \u539F\u751F\u6A21\u5757\u4F9D\u8D56\u3002\n *\n * \u7B97\u6CD5\uFF1A\n * 1. \u4EE5 baseline \u4E3A\u57FA\u51C6\u5EFA\u7ACB\u6A21\u5757\u7D22\u5F15\u8868\uFF1B\n * 2. \u904D\u5386\u6240\u6709\u5DF2\u542F\u7528\u6A21\u5757\u58F0\u660E\u7684 dependencies\uFF1B\n * 3. \u82E5\u6A21\u5757\u5BF9\u67D0\u539F\u751F\u6A21\u5757\u63D0\u51FA\u4E86\u66F4\u9AD8\u7684\u7248\u672C\u9700\u6C42\uFF0C\u52A8\u6001\u63D0\u5347\uFF08promote\uFF09\u8BE5\u4F9D\u8D56\u7684\u7248\u672C\uFF0C\u5E76\u8BB0\u5F55\u63D0\u8BAE\u6A21\u7EC4\uFF1B\n * 4. \u7EDF\u8BA1\u662F\u5426\u5F15\u5165\u4E86\u9700\u8981\u6D4B\u8BD5\u73A9\u6CD5\u7684 Beta API\u3002\n *\n * @param baseline \u57FA\u51C6\u4F9D\u8D56\u5217\u8868\uFF08\u7F3A\u7701\u4F7F\u7528 BASELINE_BEDROCK_DEPENDENCIES\uFF09\n * @param moduleRequirements \u5404\u5DF2\u542F\u7528\u6A21\u5757\u58F0\u660E\u7684\u4F9D\u8D56\u9879\u5217\u8868\n */\nexport function negotiateBedrockDependencies(\n baseline: PackManifestDependency[] = BASELINE_BEDROCK_DEPENDENCIES,\n moduleRequirements: ModuleDeclaredDependencies[] = []\n): NegotiatedDependenciesResult {\n // \u5EFA\u7ACB\u6A21\u5757\u6620\u5C04\u8868\uFF0C\u4FDD\u6301\u57FA\u51C6\u4F9D\u8D56\u7684\u539F\u6709\u987A\u5E8F\n const order: string[] = [];\n const map = new Map<\n string,\n {\n version: string;\n uuid?: string | undefined;\n requestedBy: string[];\n promotedFrom?: string | undefined;\n }\n >();\n\n for (const b of baseline) {\n if (!b.module_name) continue;\n order.push(b.module_name);\n map.set(b.module_name, {\n version: cleanBedrockVersion(b.version),\n uuid: b.uuid,\n requestedBy: [\"__sfmc_baseline__\"],\n });\n }\n\n for (const mod of moduleRequirements) {\n for (const dep of mod.dependencies) {\n if (!dep.module_name) continue;\n const modName = dep.module_name;\n const reqVer = cleanBedrockVersion(dep.version);\n\n if (!map.has(modName)) {\n order.push(modName);\n map.set(modName, {\n version: reqVer,\n uuid: dep.uuid,\n requestedBy: [mod.folderId],\n promotedFrom: undefined,\n });\n continue;\n }\n\n const existing = map.get(modName)!;\n if (compareBedrockVersion(reqVer, existing.version) > 0) {\n // \u53D1\u751F\u4E86\u7248\u672C\u63D0\u5347\n map.set(modName, {\n version: reqVer,\n uuid: dep.uuid ?? existing.uuid,\n requestedBy: [mod.folderId],\n promotedFrom: existing.promotedFrom ?? existing.version,\n });\n } else if (compareBedrockVersion(reqVer, existing.version) === 0) {\n if (!existing.requestedBy.includes(mod.folderId)) {\n existing.requestedBy.push(mod.folderId);\n }\n }\n }\n }\n\n const promotions: DependencyPromotion[] = [];\n const finalDeps: PackManifestDependency[] = [];\n let hasBetaApis = false;\n\n for (const name of order) {\n const entry = map.get(name)!;\n const dep: PackManifestDependency = {\n module_name: name,\n version: entry.version,\n ...(entry.uuid ? { uuid: entry.uuid } : {}),\n };\n finalDeps.push(dep);\n\n if (entry.promotedFrom && entry.promotedFrom !== entry.version) {\n promotions.push({\n moduleName: name,\n from: entry.promotedFrom,\n to: entry.version,\n requestedBy: entry.requestedBy.filter((x) => x !== \"__sfmc_baseline__\"),\n });\n }\n\n if (isGametestBetaRequired(dep)) {\n hasBetaApis = true;\n }\n }\n\n return {\n dependencies: finalDeps,\n promotions,\n hasBetaApis,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,120 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import {
4
+ BASELINE_BEDROCK_DEPENDENCIES,
5
+ cleanBedrockVersion,
6
+ compareBedrockVersion,
7
+ isGametestBetaRequired,
8
+ negotiateBedrockDependencies
9
+ } from "./dependency-negotiator.js";
10
+ test("cleanBedrockVersion: \u6E05\u7406 npm range \u7B26\u53F7", () => {
11
+ assert.equal(cleanBedrockVersion("^2.0.0-beta"), "2.0.0-beta");
12
+ assert.equal(cleanBedrockVersion(">=2.0.0-beta <3.0.0"), "2.0.0-beta");
13
+ assert.equal(cleanBedrockVersion("~1.3.0"), "1.3.0");
14
+ assert.equal(cleanBedrockVersion("v1.18.0"), "1.18.0");
15
+ assert.equal(cleanBedrockVersion(" 1.2.0 "), "1.2.0");
16
+ });
17
+ test("compareBedrockVersion: \u5927\u7248\u672C\u4E0E\u6B21\u7248\u672C\u6BD4\u8F83", () => {
18
+ assert.ok(compareBedrockVersion("1.18.0", "1.3.0") > 0);
19
+ assert.ok(compareBedrockVersion("1.3.0", "1.18.0") < 0);
20
+ assert.equal(compareBedrockVersion("1.3.0", "1.3.0"), 0);
21
+ });
22
+ test("compareBedrockVersion: Beta \u4E0E\u6B63\u5F0F\u7248\u6BD4\u8F83\uFF08\u8DE8\u5927\u7248\u672C\u63D0\u5347\uFF09", () => {
23
+ assert.ok(compareBedrockVersion("2.0.0-beta", "1.3.0") > 0);
24
+ assert.ok(compareBedrockVersion("2.0.0", "2.0.0-beta") > 0);
25
+ assert.ok(compareBedrockVersion("2.2.0-beta", "2.0.0-beta") > 0);
26
+ });
27
+ test("isGametestBetaRequired: \u51C6\u786E\u8BC6\u522B\u6D4B\u8BD5\u7248\u73A9\u6CD5\u9700\u6C42", () => {
28
+ assert.equal(
29
+ isGametestBetaRequired({ module_name: "@minecraft/server-ui", version: "2.0.0-beta" }),
30
+ true
31
+ );
32
+ assert.equal(
33
+ isGametestBetaRequired({ module_name: "@minecraft/server", version: "2.10.0-beta" }),
34
+ true
35
+ );
36
+ assert.equal(
37
+ isGametestBetaRequired({ module_name: "@minecraft/server-gametest", version: "1.0.0" }),
38
+ true
39
+ );
40
+ assert.equal(
41
+ isGametestBetaRequired({ module_name: "@minecraft/server-ui", version: "1.3.0" }),
42
+ false
43
+ );
44
+ assert.equal(
45
+ isGametestBetaRequired({ module_name: "@minecraft/server", version: "1.18.0" }),
46
+ false
47
+ );
48
+ assert.equal(
49
+ isGametestBetaRequired({ module_name: "@minecraft/server-net", version: "1.0.0-beta" }),
50
+ false
51
+ );
52
+ assert.equal(
53
+ isGametestBetaRequired({ module_name: "@minecraft/server-admin", version: "1.0.0-beta" }),
54
+ false
55
+ );
56
+ });
57
+ test("negotiateBedrockDependencies: \u65E0\u6A21\u7EC4\u9700\u6C42\u65F6\u4FDD\u6301\u57FA\u51C6\u4F9D\u8D56", () => {
58
+ const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, []);
59
+ assert.equal(result.dependencies.length, BASELINE_BEDROCK_DEPENDENCIES.length);
60
+ assert.equal(result.promotions.length, 0);
61
+ assert.equal(result.hasBetaApis, false);
62
+ const uiDep = result.dependencies.find((d) => d.module_name === "@minecraft/server-ui");
63
+ assert.equal(uiDep?.version, "1.3.0");
64
+ });
65
+ test("negotiateBedrockDependencies: \u5355\u6A21\u5757\u63D0\u5347 @minecraft/server-ui \u81F3 2.0.0-beta", () => {
66
+ const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, [
67
+ {
68
+ folderId: "custom-menu",
69
+ dependencies: [
70
+ { module_name: "@minecraft/server-ui", version: "2.0.0-beta" }
71
+ ]
72
+ }
73
+ ]);
74
+ const uiDep = result.dependencies.find((d) => d.module_name === "@minecraft/server-ui");
75
+ assert.equal(uiDep?.version, "2.0.0-beta");
76
+ assert.equal(result.hasBetaApis, true);
77
+ assert.equal(result.promotions.length, 1);
78
+ assert.equal(result.promotions[0].moduleName, "@minecraft/server-ui");
79
+ assert.equal(result.promotions[0].from, "1.3.0");
80
+ assert.equal(result.promotions[0].to, "2.0.0-beta");
81
+ assert.deepEqual(result.promotions[0].requestedBy, ["custom-menu"]);
82
+ });
83
+ test("negotiateBedrockDependencies: \u591A\u6A21\u5757\u4E0D\u540C\u7248\u672C\u9700\u6C42\u53D6\u6700\u9AD8\u517C\u5BB9", () => {
84
+ const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, [
85
+ {
86
+ folderId: "mod-a",
87
+ dependencies: [
88
+ { module_name: "@minecraft/server-ui", version: "2.0.0-beta" }
89
+ ]
90
+ },
91
+ {
92
+ folderId: "mod-b",
93
+ dependencies: [
94
+ { module_name: "@minecraft/server-ui", version: "2.2.0-beta" }
95
+ ]
96
+ },
97
+ {
98
+ folderId: "mod-c",
99
+ dependencies: [
100
+ { module_name: "@minecraft/server-ui", version: "1.3.0" }
101
+ ]
102
+ }
103
+ ]);
104
+ const uiDep = result.dependencies.find((d) => d.module_name === "@minecraft/server-ui");
105
+ assert.equal(uiDep?.version, "2.2.0-beta");
106
+ assert.equal(result.hasBetaApis, true);
107
+ });
108
+ test("negotiateBedrockDependencies: \u652F\u6301\u5F15\u5165\u57FA\u51C6\u5916\u65B0\u539F\u751F\u6A21\u5757", () => {
109
+ const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, [
110
+ {
111
+ folderId: "mod-gametest",
112
+ dependencies: [
113
+ { module_name: "@minecraft/server-gametest", version: "1.0.0-beta" }
114
+ ]
115
+ }
116
+ ]);
117
+ assert.ok(result.dependencies.some((d) => d.module_name === "@minecraft/server-gametest"));
118
+ assert.equal(result.hasBetaApis, true);
119
+ });
120
+ //# sourceMappingURL=dependency-negotiator.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dependency-negotiator.test.ts"],
4
+ "sourcesContent": ["import assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport {\n BASELINE_BEDROCK_DEPENDENCIES,\n cleanBedrockVersion,\n compareBedrockVersion,\n isGametestBetaRequired,\n negotiateBedrockDependencies,\n} from \"./dependency-negotiator.js\";\n\ntest(\"cleanBedrockVersion: \u6E05\u7406 npm range \u7B26\u53F7\", () => {\n assert.equal(cleanBedrockVersion(\"^2.0.0-beta\"), \"2.0.0-beta\");\n assert.equal(cleanBedrockVersion(\">=2.0.0-beta <3.0.0\"), \"2.0.0-beta\");\n assert.equal(cleanBedrockVersion(\"~1.3.0\"), \"1.3.0\");\n assert.equal(cleanBedrockVersion(\"v1.18.0\"), \"1.18.0\");\n assert.equal(cleanBedrockVersion(\" 1.2.0 \"), \"1.2.0\");\n});\n\ntest(\"compareBedrockVersion: \u5927\u7248\u672C\u4E0E\u6B21\u7248\u672C\u6BD4\u8F83\", () => {\n assert.ok(compareBedrockVersion(\"1.18.0\", \"1.3.0\") > 0);\n assert.ok(compareBedrockVersion(\"1.3.0\", \"1.18.0\") < 0);\n assert.equal(compareBedrockVersion(\"1.3.0\", \"1.3.0\"), 0);\n});\n\ntest(\"compareBedrockVersion: Beta \u4E0E\u6B63\u5F0F\u7248\u6BD4\u8F83\uFF08\u8DE8\u5927\u7248\u672C\u63D0\u5347\uFF09\", () => {\n // 2.0.0-beta \u5E94\u9AD8\u4E8E 1.3.0\n assert.ok(compareBedrockVersion(\"2.0.0-beta\", \"1.3.0\") > 0);\n // \u540C\u7248\u672C\u4E0B\u6B63\u5F0F\u7248\u9AD8\u4E8E\u6D4B\u8BD5\u7248\n assert.ok(compareBedrockVersion(\"2.0.0\", \"2.0.0-beta\") > 0);\n // \u4E24\u4E2A beta \u4E4B\u95F4\u6B21\u7248\u672C\u5BF9\u6BD4\n assert.ok(compareBedrockVersion(\"2.2.0-beta\", \"2.0.0-beta\") > 0);\n});\n\ntest(\"isGametestBetaRequired: \u51C6\u786E\u8BC6\u522B\u6D4B\u8BD5\u7248\u73A9\u6CD5\u9700\u6C42\", () => {\n // \u9700\u8981\u6D4B\u8BD5\u73A9\u6CD5\u7684\u9879\n assert.equal(\n isGametestBetaRequired({ module_name: \"@minecraft/server-ui\", version: \"2.0.0-beta\" }),\n true\n );\n assert.equal(\n isGametestBetaRequired({ module_name: \"@minecraft/server\", version: \"2.10.0-beta\" }),\n true\n );\n assert.equal(\n isGametestBetaRequired({ module_name: \"@minecraft/server-gametest\", version: \"1.0.0\" }),\n true\n );\n\n // \u4E0D\u9700\u8981\u6D4B\u8BD5\u73A9\u6CD5\u7684\u7A33\u5B9A\u7248\u6216\u7EAF\u6743\u9650\u6A21\u5757\n assert.equal(\n isGametestBetaRequired({ module_name: \"@minecraft/server-ui\", version: \"1.3.0\" }),\n false\n );\n assert.equal(\n isGametestBetaRequired({ module_name: \"@minecraft/server\", version: \"1.18.0\" }),\n false\n );\n assert.equal(\n isGametestBetaRequired({ module_name: \"@minecraft/server-net\", version: \"1.0.0-beta\" }),\n false\n );\n assert.equal(\n isGametestBetaRequired({ module_name: \"@minecraft/server-admin\", version: \"1.0.0-beta\" }),\n false\n );\n});\n\ntest(\"negotiateBedrockDependencies: \u65E0\u6A21\u7EC4\u9700\u6C42\u65F6\u4FDD\u6301\u57FA\u51C6\u4F9D\u8D56\", () => {\n const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, []);\n assert.equal(result.dependencies.length, BASELINE_BEDROCK_DEPENDENCIES.length);\n assert.equal(result.promotions.length, 0);\n assert.equal(result.hasBetaApis, false);\n\n const uiDep = result.dependencies.find((d) => d.module_name === \"@minecraft/server-ui\");\n assert.equal(uiDep?.version, \"1.3.0\");\n});\n\ntest(\"negotiateBedrockDependencies: \u5355\u6A21\u5757\u63D0\u5347 @minecraft/server-ui \u81F3 2.0.0-beta\", () => {\n const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, [\n {\n folderId: \"custom-menu\",\n dependencies: [\n { module_name: \"@minecraft/server-ui\", version: \"2.0.0-beta\" },\n ],\n },\n ]);\n\n const uiDep = result.dependencies.find((d) => d.module_name === \"@minecraft/server-ui\");\n assert.equal(uiDep?.version, \"2.0.0-beta\");\n assert.equal(result.hasBetaApis, true);\n assert.equal(result.promotions.length, 1);\n assert.equal(result.promotions[0].moduleName, \"@minecraft/server-ui\");\n assert.equal(result.promotions[0].from, \"1.3.0\");\n assert.equal(result.promotions[0].to, \"2.0.0-beta\");\n assert.deepEqual(result.promotions[0].requestedBy, [\"custom-menu\"]);\n});\n\ntest(\"negotiateBedrockDependencies: \u591A\u6A21\u5757\u4E0D\u540C\u7248\u672C\u9700\u6C42\u53D6\u6700\u9AD8\u517C\u5BB9\", () => {\n const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, [\n {\n folderId: \"mod-a\",\n dependencies: [\n { module_name: \"@minecraft/server-ui\", version: \"2.0.0-beta\" },\n ],\n },\n {\n folderId: \"mod-b\",\n dependencies: [\n { module_name: \"@minecraft/server-ui\", version: \"2.2.0-beta\" },\n ],\n },\n {\n folderId: \"mod-c\",\n dependencies: [\n { module_name: \"@minecraft/server-ui\", version: \"1.3.0\" },\n ],\n },\n ]);\n\n const uiDep = result.dependencies.find((d) => d.module_name === \"@minecraft/server-ui\");\n assert.equal(uiDep?.version, \"2.2.0-beta\");\n assert.equal(result.hasBetaApis, true);\n});\n\ntest(\"negotiateBedrockDependencies: \u652F\u6301\u5F15\u5165\u57FA\u51C6\u5916\u65B0\u539F\u751F\u6A21\u5757\", () => {\n const result = negotiateBedrockDependencies(BASELINE_BEDROCK_DEPENDENCIES, [\n {\n folderId: \"mod-gametest\",\n dependencies: [\n { module_name: \"@minecraft/server-gametest\", version: \"1.0.0-beta\" },\n ],\n },\n ]);\n\n assert.ok(result.dependencies.some((d) => d.module_name === \"@minecraft/server-gametest\"));\n assert.equal(result.hasBetaApis, true);\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * level-dat.ts — Minecraft 基岩版世界存档 level.dat 小端序 NBT 解析与实验性玩法安全修改器
3
+ *
4
+ * 基岩版 level.dat 规范:
5
+ * - Header(8 字节):
6
+ * - [0..3] uint32 LE:存储格式版本(当前版本通常为 10)
7
+ * - [4..7] uint32 LE:有效 NBT 数据字节长度(data_length)
8
+ * - Payload:未压缩的小端序(Little-Endian)标准 NBT 复合标签(TAG_Compound)
9
+ *
10
+ * 核心能力:
11
+ * - 原生无外部黑盒依赖,Buffer 级解析与精确字节位移
12
+ * - 读取世界实验性玩法的开启状态(特别是 Beta APIs / gametest)
13
+ * - 安全注入或切换实验性开关并自动备份原文件(.bak)与校准 Header data_length
14
+ */
15
+ export declare const TAG_END = 0;
16
+ export declare const TAG_BYTE = 1;
17
+ export declare const TAG_SHORT = 2;
18
+ export declare const TAG_INT = 3;
19
+ export declare const TAG_LONG = 4;
20
+ export declare const TAG_FLOAT = 5;
21
+ export declare const TAG_DOUBLE = 6;
22
+ export declare const TAG_BYTE_ARRAY = 7;
23
+ export declare const TAG_STRING = 8;
24
+ export declare const TAG_LIST = 9;
25
+ export declare const TAG_COMPOUND = 10;
26
+ export declare const TAG_INT_ARRAY = 11;
27
+ export declare const TAG_LONG_ARRAY = 12;
28
+ export interface NbtTagMeta {
29
+ type: number;
30
+ name: string;
31
+ startOffset: number;
32
+ nameOffset: number;
33
+ valueOffset: number;
34
+ endOffset: number;
35
+ value?: unknown;
36
+ }
37
+ export interface LevelDatExperimentsInfo {
38
+ experimentsEverUsed: boolean;
39
+ savedWithToggledExperiments: boolean;
40
+ experiments: Record<string, number | boolean>;
41
+ hasBetaApis: boolean;
42
+ }
43
+ export interface LevelDatMutateResult {
44
+ success: boolean;
45
+ changed: boolean;
46
+ backupPath?: string;
47
+ error?: string;
48
+ previousBetaApisState?: boolean;
49
+ }
50
+ /**
51
+ * 遍历并跳过指定类型的 NBT 载荷,返回下一个 tag 的 offset。
52
+ */
53
+ export declare function skipNbtPayload(buf: Buffer, offset: number, type: number): number;
54
+ /**
55
+ * 解析复合标签内部所有直接子标签的元数据映射。
56
+ */
57
+ export declare function parseCompoundChildren(buf: Buffer, compoundValueOffset: number): {
58
+ children: Map<string, NbtTagMeta>;
59
+ compoundEndOffset: number;
60
+ };
61
+ /**
62
+ * 解析基岩版 level.dat 的完整文件结构并定位根 Compound。
63
+ */
64
+ export declare function parseBedrockLevelDat(buf: Buffer): {
65
+ version: number;
66
+ dataLength: number;
67
+ rootCompoundName: string;
68
+ rootChildren: Map<string, NbtTagMeta>;
69
+ rootEndOffset: number;
70
+ };
71
+ /**
72
+ * 读取世界存档 level.dat 的实验性配置。若解析失败或文件不存在返回 null。
73
+ */
74
+ export declare function readLevelDatExperiments(levelDatPath: string): LevelDatExperimentsInfo | null;
75
+ /**
76
+ * 为指定 level.dat 开启 Beta APIs(gametest)。
77
+ *
78
+ * 保证:
79
+ * - 自动备份原文件至 `${levelDatPath}.bak`;
80
+ * - 自动更新 experiments 复合标签中的 gametest = 1b;
81
+ * - 自动更新 experiments_ever_used = 1b 与 saved_with_toggled_experiments = 1b;
82
+ * - 精确校准 8 字节文件头部的 dataLength;
83
+ * - 原子写操作(.tmp -> rename);
84
+ * - 若已处于开启状态,直接返回 changed: false,不破坏文件。
85
+ */
86
+ export declare function enableBetaApisInLevelDat(levelDatPath: string): Promise<LevelDatMutateResult>;
87
+ //# sourceMappingURL=level-dat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-dat.d.ts","sourceRoot":"","sources":["../src/level-dat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,2BAA2B,EAAE,OAAO,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IAC9C,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA2DhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,mBAAmB,EAAE,MAAM,GAC1B;IAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CA6ClE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;CACvB,CAwBA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAuD5F;AAkCD;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+HlG"}