Files
2026-08-14 15:56:39 -04:00

102 lines
4.2 KiB
JavaScript

import { spawn } from "node:child_process";
import path from "node:path";
import {
optionValue,
pipelineDirectory,
projectPath,
projectRoot,
readJson,
resolveProject,
} from "./lib/recipe.mjs";
const argv = process.argv.slice(2);
const command = argv.shift() ?? "help";
function run(script, argumentsList = []) {
return new Promise((resolve, reject) => {
const child = spawn(process.execPath, [path.join(pipelineDirectory, script), ...argumentsList], {
cwd: projectRoot,
stdio: "inherit",
windowsHide: true,
});
child.once("error", reject);
child.once("exit", (code) => code === 0 ? resolve() : reject(new Error(script + " exited with " + code)));
});
}
function help() {
console.log(`RuneWaker instance pipeline
Usage:
node scripts/runewaker-pipeline/cli.mjs discover
node scripts/runewaker-pipeline/cli.mjs scaffold --id <dungeon_config id> [--wdb file.wdb]
node scripts/runewaker-pipeline/cli.mjs inspect-wdb --wdb <file.wdb>
node scripts/runewaker-pipeline/cli.mjs environment --recipe <environment.json>
node scripts/runewaker-pipeline/cli.mjs refresh --recipe <population.json> [--update-recipe]
node scripts/runewaker-pipeline/cli.mjs actors --recipe <population.json>
node scripts/runewaker-pipeline/cli.mjs population --recipe <population.json>
node scripts/runewaker-pipeline/cli.mjs mechanics --recipe <population.json>
node scripts/runewaker-pipeline/cli.mjs offline --recipe <population.json>
node scripts/runewaker-pipeline/cli.mjs build --recipe <population.json>
node scripts/runewaker-pipeline/cli.mjs validate --recipe <population.json>
node scripts/runewaker-pipeline/cli.mjs prepare-all
node scripts/runewaker-pipeline/cli.mjs build-all [--resume] [--only slug,...]
node scripts/runewaker-pipeline/cli.mjs register-all
node scripts/runewaker-pipeline/cli.mjs refresh-all [--server .\\HEALERMAN_RW]
refresh and refresh-all are the only commands that connect to the temporary SQL extraction instance.
offline, population, mechanics, validate, and the shipped game consume packaged files only.`);
}
async function populationRecipe() {
const value = optionValue(argv, "--recipe");
if (!value) throw new Error(command + " requires --recipe <population recipe>.");
const file = resolveProject(value);
return { file, recipe: await readJson(file) };
}
if (command === "help" || command === "--help" || command === "-h") {
help();
} else if (command === "discover") {
await run("discover-instances.mjs", argv);
} else if (command === "scaffold") {
await run("scaffold-instance.mjs", argv);
} else if (command === "inspect-wdb") {
await run("inspect-wdb.mjs", argv);
} else if (command === "environment") {
await run("build-environment.mjs", argv);
} else if (command === "refresh") {
await run("refresh-population.mjs", argv);
} else if (command === "actors") {
await run("build-population.mjs", [...argv, "--actors-only"]);
} else if (command === "population") {
await run("build-population.mjs", argv);
} else if (command === "mechanics") {
await run("extract-mechanics.mjs", argv);
} else if (command === "validate") {
await run("validate-instance.mjs", argv);
} else if (command === "prepare-all") {
await run("prepare-all-instances.mjs", argv);
} else if (command === "build-all") {
await run("build-all-instances.mjs", argv);
} else if (command === "register-all") {
await run("generate-runtime-registry.mjs", argv);
} else if (command === "refresh-all") {
await run("refresh-all-instances.mjs", argv);
} else if (command === "offline") {
await run("build-population.mjs", argv);
await run("extract-mechanics.mjs", argv);
} else if (command === "build") {
const { recipe } = await populationRecipe();
if (!recipe.files?.environmentRecipe) {
throw new Error("Composite build requires files.environmentRecipe in " + projectPath(resolveProject(optionValue(argv, "--recipe"))) + ".");
}
await run("build-environment.mjs", ["--recipe", recipe.files.environmentRecipe]);
await run("build-population.mjs", [...argv, "--actors"]);
await run("extract-mechanics.mjs", argv);
await run("validate-instance.mjs", argv);
} else {
help();
throw new Error("Unknown RuneWaker pipeline command: " + command);
}