Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sisilicon
GitHub Repository: sisilicon/worldedit-be
Path: blob/master/tools/process_manifest.mjs
1780 views
1
import fs from "fs";
2
3
function processJsonElement(element, bpElement, rpElement, options = {}) {
4
function process(key, value) {
5
if (Array.isArray(value)) {
6
bpElement[key] = [];
7
rpElement[key] = [];
8
processJsonElement(value, bpElement[key], rpElement[key], options);
9
} else if (typeof value === "object" && value !== null) {
10
bpElement[key] = {};
11
rpElement[key] = {};
12
processJsonElement(value, bpElement[key], rpElement[key], options);
13
} else {
14
if (Array.isArray(bpElement)) {
15
bpElement.push(value);
16
rpElement.push(value);
17
} else {
18
bpElement[key] = value;
19
rpElement[key] = value;
20
}
21
}
22
}
23
24
if (Array.isArray(element)) {
25
for (let i = 0; i < element.length; i++) process(i, element[i]);
26
} else if (typeof element === "object" && element !== null) {
27
for (const [key, value] of Object.entries(element)) {
28
if (key.startsWith("bp_")) {
29
const bpSpecialPrefixes = [
30
{ prefix: "bp_gametest_", condition: options.debugMode },
31
{ prefix: "bp_server_", condition: options.isServer },
32
{ prefix: "bp_editor_", condition: options.isEditor },
33
];
34
let handled = false;
35
for (const { prefix, condition } of bpSpecialPrefixes) {
36
if (key.startsWith(prefix)) {
37
if (condition) {
38
const sliceLen = prefix.length;
39
const subKey = key.slice(sliceLen);
40
const sub = bpElement[subKey];
41
if (Array.isArray(sub)) bpElement[subKey] = sub.concat(value);
42
else if (typeof sub === "object" && sub !== null) bpElement[subKey] = { ...sub, ...value };
43
}
44
handled = true;
45
break;
46
}
47
}
48
if (!handled) bpElement[key.slice(3)] = value;
49
} else if (key.startsWith("rp_")) {
50
rpElement[key.slice(3)] = value;
51
} else {
52
process(key, value);
53
}
54
}
55
}
56
}
57
58
function processManifest(debugMode, isServer, isEditor) {
59
const bp_manifest = {};
60
const rp_manifest = {};
61
62
// load base manifest
63
const manifest = JSON.parse(fs.readFileSync("mc_manifest.json", "utf8"));
64
processJsonElement(manifest, bp_manifest, rp_manifest, { isServer, isEditor, debugMode });
65
66
const version = manifest.header.version;
67
bp_manifest.header.name += " " + version;
68
rp_manifest.header.name += " " + version;
69
70
if (!bp_manifest.dependencies) bp_manifest.dependencies = [];
71
bp_manifest.dependencies.push({
72
uuid: rp_manifest.header.uuid,
73
version: rp_manifest.header.version,
74
});
75
76
if (!rp_manifest.dependencies) rp_manifest.dependencies = [];
77
rp_manifest.dependencies.push({
78
uuid: bp_manifest.header.uuid,
79
version: bp_manifest.header.version,
80
});
81
82
if (debugMode) {
83
bp_manifest.header.name += " [DEBUG]";
84
rp_manifest.header.name += " [DEBUG]";
85
}
86
87
// export behaviour and resource manifests
88
fs.mkdirSync("BP", { recursive: true });
89
fs.mkdirSync("RP", { recursive: true });
90
fs.writeFileSync("BP/manifest.json", JSON.stringify(bp_manifest, undefined, 4));
91
fs.writeFileSync("RP/manifest.json", JSON.stringify(rp_manifest, undefined, 4));
92
}
93
94
export default function (args) {
95
const debugMode = args.gametest || args.target === "debug";
96
const isServer = args.target === "server" || args.target === "server";
97
const isEditor = args.editor;
98
processManifest(debugMode, isServer, isEditor);
99
100
if (args.watch) {
101
fs.watch("mc_manifest.json", { persistent: true, recursive: false }, (eventType, filename) => {
102
if (filename === "mc_manifest.json") processManifest(debugMode, isServer, isEditor);
103
});
104
}
105
}
106
107