78 lines
2.5 KiB
JavaScript
78 lines
2.5 KiB
JavaScript
|
"use strict";
|
||
|
const events = require("events");
|
||
|
const fs = require("fs-extra");
|
||
|
const JSZip = require("jszip");
|
||
|
const klaw = require("klaw");
|
||
|
const path = require("path");
|
||
|
const yargs = require("yargs");
|
||
|
|
||
|
|
||
|
async function main() {
|
||
|
const args = yargs
|
||
|
.scriptName("build")
|
||
|
.options({
|
||
|
'clean': { describe: "Remove previous builds", type: 'boolean', default: false },
|
||
|
'build': { describe: "Build mod", type: 'boolean', default: true },
|
||
|
'pack': { describe: "Pack into zip file", type: 'boolean', default: true },
|
||
|
'source-dir': { describe: "Path to mod source directory", nargs: 1, type: 'string', default: "src" },
|
||
|
'output-dir': { describe: "Path to output built mod", nargs: 1, type: 'string', default: "dist" },
|
||
|
})
|
||
|
.argv
|
||
|
;
|
||
|
|
||
|
let info = JSON.parse(await fs.readFile(path.join(args.sourceDir, "info.json")));
|
||
|
|
||
|
if (args.clean) {
|
||
|
let splitter = /^(.*)_(\d+\.\d+\.\d+)(\.zip)?$/
|
||
|
for (let entry of await fs.readdir(args.outputDir)) {
|
||
|
let match = splitter.exec(entry);
|
||
|
if (match) {
|
||
|
let [, name, version] = match;
|
||
|
if (name === info.name) {
|
||
|
let modPath = path.join(args.outputDir, entry);
|
||
|
console.log(`Removing ${modPath}`);
|
||
|
await fs.remove(modPath);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (args.build) {
|
||
|
await fs.ensureDir(args.outputDir);
|
||
|
let modName = `${info.name}_${info.version}`;
|
||
|
|
||
|
if (args.pack) {
|
||
|
let zip = new JSZip();
|
||
|
let walker = klaw(args.sourceDir)
|
||
|
.on('data', item => {
|
||
|
if (item.stats.isFile()) {
|
||
|
// On Windows the path created uses backslashes as the directory sepparator
|
||
|
// but the zip file needs to use forward slashes. We can't use the posix
|
||
|
// version of relative here as it doesn't work with Windows style paths.
|
||
|
let basePath = path.relative(args.sourceDir, item.path).replace(/\\/g, "/");
|
||
|
zip.file(path.posix.join(modName, basePath), fs.createReadStream(item.path));
|
||
|
}
|
||
|
});
|
||
|
await events.once(walker, 'end');
|
||
|
|
||
|
let modPath = path.join(args.outputDir, `${modName}.zip`);
|
||
|
console.log(`Writing ${modPath}`);
|
||
|
let writeStream = zip.generateNodeStream().pipe(fs.createWriteStream(modPath));
|
||
|
await events.once(writeStream, 'finish');
|
||
|
|
||
|
} else {
|
||
|
let modDir = path.join(args.outputDir, modName);
|
||
|
if (await fs.exists(modDir)) {
|
||
|
console.log(`Removing existing build ${modDir}`);
|
||
|
await fs.remove(modDir);
|
||
|
}
|
||
|
console.log(`Building ${modDir}`);
|
||
|
await fs.copy(args.sourceDir, modDir);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (module === require.main) {
|
||
|
main().catch(err => { console.log(err) });
|
||
|
}
|