diff --git a/readme.md b/readme.md index 51a3711e..86464a6c 100644 --- a/readme.md +++ b/readme.md @@ -85,7 +85,8 @@ When `watch: true` is set, the build object is not a promise, but has the follow ```js { // handler re-run on each build completion - handler (({ code, map, assets }) => { ... }) + // watch errors are reported on "err" + handler (({ err, code, map, assets }) => { ... }) // handler re-run on each rebuild start rebuild (() => {}) // close the watcher diff --git a/src/cli.js b/src/cli.js index a2ca0688..1a5da204 100755 --- a/src/cli.js +++ b/src/cli.js @@ -164,6 +164,7 @@ switch (args._[0]) { errTooManyArguments("build"); let startTime = Date.now(); + let ps; const ncc = require("./index.js")( eval("require.resolve")(resolve(args._[1] || ".")), { @@ -175,7 +176,14 @@ switch (args._[0]) { } ); - async function handler ({ code, map, assets }) { + async function handler ({ err, code, map, assets }) { + // handle watch errors + if (err) { + console.error(err); + console.log('Watching for changes...'); + return; + } + outDir = outDir || resolve("dist"); mkdirp.sync(outDir); // remove all existing ".js" files in the out directory @@ -210,7 +218,7 @@ switch (args._[0]) { } if (run) { - const ps = require("child_process").fork(outDir + "/index.js", { + ps = require("child_process").fork(outDir + "/index.js", { execArgv: map ? ["-r", resolve(__dirname, "sourcemap-register")] : [] @@ -221,6 +229,8 @@ switch (args._[0]) { if (args["--watch"]) { ncc.handler(handler); ncc.rebuild(() => { + if (ps) + ps.kill(); startTime = Date.now(); console.log('File change, rebuilding...'); }); diff --git a/src/index.js b/src/index.js index 04085398..565eafe4 100644 --- a/src/index.js +++ b/src/index.js @@ -226,9 +226,8 @@ module.exports = ( return new Promise((resolve, reject) => { compiler.run((err, stats) => { if (err) return reject(err); - if (stats.hasErrors()) { + if (stats.hasErrors()) return reject(new Error(stats.toString())); - } resolve(); }); }) @@ -238,14 +237,15 @@ module.exports = ( let cachedResult; watcher = compiler.watch({}, (err, stats) => { if (err) return reject(err); - if (stats.hasErrors()) { - return reject(new Error(stats.toString())); - } + if (err) + return watchHandler({ err }); + if (stats.hasErrors()) + return watchHandler({ err: stats.toString() }); const { code, map, assets } = finalizeHandler(); // clear output file system mfs.data = {}; if (watchHandler) - watchHandler({ code, map, assets }); + watchHandler({ code, map, assets, err: null }); else cachedResult = { code, map, assets}; });