pathfinder/demo/client/build/rustdoc-webpack-plugin/index.js

47 lines
1.8 KiB
JavaScript

const {spawn} = require('child_process');
const process = require('process');
class RustdocPlugin {
constructor(options) {
this.options = Object.assign({directories: [], flags: {}}, options);
}
apply(compiler) {
let rustdocFlags = [];
for (let key in this.options.flags) {
if (this.options.flags.hasOwnProperty(key))
rustdocFlags.push("--" + key + "=" + this.options.flags[key]);
}
rustdocFlags = rustdocFlags.join(" ");
compiler.plugin('after-compile', (compilation, done) => {
let directoriesLeft = this.options.directories.length;
for (const directory of this.options.directories) {
console.log("Building documentation for `" + directory + "`...");
const cargo = spawn("cargo", ["doc", "--no-deps"], {
cwd: directory,
env: Object.assign({RUSTDOCFLAGS: rustdocFlags}, process.env),
});
cargo.stdout.setEncoding('utf8');
cargo.stderr.setEncoding('utf8');
cargo.stdout.on('data', data => console.log(data));
cargo.stderr.on('data', data => console.log(data));
cargo.on('close', code => {
if (code !== 0) {
const message = "Failed to build documentation for `" + directory + "`!";
console.error(message);
throw new Error(message);
}
console.log("Built documentation for `" + directory + "`.");
directoriesLeft--;
if (directoriesLeft === 0)
done();
});
}
});
}
}
module.exports = RustdocPlugin;