UNPKG

fable-compiler-netcore

Version:
73 lines (72 loc) 2.76 kB
"use strict"; 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;