fable-compiler-netcore
Version:
F# to JavaScript compiler
73 lines (72 loc) • 2.76 kB
JavaScript
;
var path = require("path");
var chokidar = require("chokidar");
var fableLib = require("./lib");
var bundle_1 = require("./bundle");
function tooClose(opts, filename, prev) {
var d = new Date();
return opts.watching !== "BUILDING" &&
prev != null &&
filename == prev[0] &&
new Date().getTime() - prev[1].getTime() < 2000;
}
/** Watches for file changes. Requires chokidar */
function watch(opts, buildResult, fableProc, parallelProc, continuation) {
if (opts.watching) {
if (buildResult === "NEEDS_FULL_REBUILD") {
fableLib.stdoutLog("Triggering full rebuild...");
fableProc.stdin.write("[SIGFAIL]\n");
}
else {
// Reset opts.watching
opts.watching = "WATCHING";
}
return;
}
var next = null, prev = null;
fableProc.stdin.setEncoding("utf-8");
var dirs = null;
if (typeof opts.watch === "string") {
dirs = [fableLib.pathJoin(opts.workingDir, opts.watch)];
}
else if (Array.isArray(opts.watch) && opts.watch.length > 0) {
dirs = opts.watch.map(function (dir) { return fableLib.pathJoin(opts.workingDir, dir); });
}
else {
dirs = opts.projFile.map(function (dir) { return path.dirname(fableLib.pathJoin(opts.workingDir, dir)); });
}
fableLib.stdoutLog("Watching " + dirs.join('\n\t'));
fableLib.stdoutLog("Press Enter to terminate process.");
opts.watching = "WATCHING";
var ready = false;
var watcher = chokidar
.watch(dirs, { ignored: /node_modules/, persistent: true })
.on("ready", function () { ready = true; })
.on("all", function (ev, filePath) {
if (ready) {
if (fableLib.isFSharpFile(filePath)) {
prev = next;
next = [filePath, new Date()];
if (!tooClose(opts, filePath, prev)) {
fableLib.stdoutLog(ev + ": " + filePath + " at " + next[1].toLocaleTimeString());
opts.watching = "BUILDING";
fableProc.stdin.write(filePath + "\n");
}
}
}
});
process.stdin.on('data', function (buf) {
var data = buf.toString();
if (data.length > 0 && data[data.length - 1] == '\n') {
if (parallelProc) {
parallelProc.kill();
}
fableProc.stdin.write("[SIGTERM]\n");
watcher.close();
bundle_1.clearBundleCache(); // Clean bundle cache just in case
fableLib.stdoutLog("Process terminated.");
fableLib.finish(0, continuation);
}
});
}
exports.watch = watch;