diff --git a/packages/neutrino/bin/build.js b/packages/neutrino/bin/build.js index 48bbb85..442fe44 100644 --- a/packages/neutrino/bin/build.js +++ b/packages/neutrino/bin/build.js @@ -8,7 +8,7 @@ module.exports = (middleware, options) => { .fork((errors) => { spinner.fail('Building project failed'); errors.forEach((err) => { - console.error(err.stack || err); + console.error(err.message || err.stack || err); err.details && console.error(err.details); }); process.exit(1); diff --git a/packages/neutrino/bin/inspect.js b/packages/neutrino/bin/inspect.js index bf63b0e..46004a2 100644 --- a/packages/neutrino/bin/inspect.js +++ b/packages/neutrino/bin/inspect.js @@ -2,6 +2,6 @@ const { inspect } = require('../src'); module.exports = (middleware, options) => inspect(middleware, options) .fork((err) => { - console.error(err.stack || err); + console.error(err.message || err.stack || err); process.exit(1); }, console.log); diff --git a/packages/neutrino/bin/start.js b/packages/neutrino/bin/start.js index 322ea83..f72fc78 100644 --- a/packages/neutrino/bin/start.js +++ b/packages/neutrino/bin/start.js @@ -8,7 +8,7 @@ module.exports = (middleware, options) => { .fork((errors) => { spinner.fail('Building project failed'); errors.forEach((err) => { - console.error(err.stack || err); + console.error(err.message || err.stack || err); err.details && console.error(err.details); }); diff --git a/packages/neutrino/bin/test.js b/packages/neutrino/bin/test.js index ec84534..1805e13 100644 --- a/packages/neutrino/bin/test.js +++ b/packages/neutrino/bin/test.js @@ -2,6 +2,6 @@ const { test } = require('../src'); module.exports = (middleware, options) => test(middleware, options) .fork((err) => { - console.error(err.stack || err); + console.error(err.message || err.stack || err); process.exit(1); }, Function.prototype); diff --git a/packages/neutrino/src/build.js b/packages/neutrino/src/build.js index ada024a..39a39a4 100644 --- a/packages/neutrino/src/build.js +++ b/packages/neutrino/src/build.js @@ -1,16 +1,10 @@ -const webpack = require('webpack'); const Future = require('fluture'); -const { webpackErrors } = require('./utils'); +const { webpackCompile, validateWebpackConfig } = require('./utils'); // build :: Object config -> Future (Array Error) Function -const build = config => Future((reject, resolve) => { - const compiler = webpack(config); - - compiler.run((err, stats) => { - const errors = webpackErrors(err, stats); - - errors.length ? reject(errors) : resolve(stats); - }); -}); +const build = config => Future + .of(config) + .chain(validateWebpackConfig) + .chain(webpackCompile); module.exports = build; diff --git a/packages/neutrino/src/devServer.js b/packages/neutrino/src/devServer.js index 23aab0d..b25b609 100644 --- a/packages/neutrino/src/devServer.js +++ b/packages/neutrino/src/devServer.js @@ -1,19 +1,19 @@ const merge = require('deepmerge'); -const webpack = require('webpack'); const DevServer = require('webpack-dev-server'); const Future = require('fluture'); +const { createWebpackCompiler, validateWebpackConfig } = require('./utils'); -// devServer :: Object webpackConfig -> Future () Function -const devServer = webpackConfig => new Future((reject, resolve) => { - const config = merge({ - devServer: { host: 'localhost', port: 5000, noInfo: true } - }, webpackConfig); - const { host, port } = config.devServer; +// devServer :: Object config -> Future () Function +const devServer = config => Future + .of(merge({ devServer: { host: 'localhost', port: 5000, noInfo: true } }, config)) + .chain(validateWebpackConfig) + .chain(createWebpackCompiler) + .chain(compiler => Future((reject, resolve) => { + const { devServer } = compiler.options; + const { host, port } = devServer; + const server = new DevServer(compiler, devServer); - const compiler = webpack(config); - const server = new DevServer(compiler, config.devServer); - - server.listen(port, host, () => resolve(compiler)); -}); + server.listen(port, host, () => resolve(compiler)); + })); module.exports = devServer; diff --git a/packages/neutrino/src/utils.js b/packages/neutrino/src/utils.js index 61794f2..2ed55d8 100644 --- a/packages/neutrino/src/utils.js +++ b/packages/neutrino/src/utils.js @@ -3,6 +3,7 @@ const { cond, curry, defaultTo, identity, map, memoize, of, partialRight, pipe, const { List } = require('immutable-ext'); const { isAbsolute, join } = require('path'); const optional = require('optional'); +const webpack = require('webpack'); // any :: List -> Future a b const any = reduce(Future.or, Future.reject('empty list')); @@ -50,9 +51,42 @@ const toArray = cond([ // webpackErrors :: (Error|Array Error err -> Object stats) -> Array Error const webpackErrors = (err, stats) => (err ? toArray(err) : stats.toJson().errors); +// createWebpackCompiler :: Object config -> Future Error Object +const createWebpackCompiler = config => Future.of(config).map(webpack); + +// createWebpackValidator :: Object config -> Future Error Object +const createWebpackValidator = config => Future.of(config).map(webpack.validate); + +// createWebpackWatcher :: Object config -> Future Error Object +const createWebpackWatcher = config => createWebpackCompiler(config) + .chain(compiler => Future((reject, resolve) => { + compiler.watch(compiler.options.watchOptions || {}, (err, stats) => { + const errors = webpackErrors(err, stats); + + errors.length ? reject(errors) : resolve(compiler); + }); + })); + +// validateWebpackConfig :: Object config -> Future Error Object +const validateWebpackConfig = config => createWebpackValidator(config) + .chain(errors => (errors.length ? + Future.reject([new webpack.WebpackOptionsValidationError(errors)]) : + Future.of(config))); + +// webpackCompile :: Object config -> Future Error Object +const webpackCompile = config => createWebpackCompiler(config) + .chain(compiler => Future((reject, resolve) => compiler.run((err, stats) => { + const errors = webpackErrors(err, stats); + + errors.length ? reject(errors) : resolve(stats); + }))); + module.exports = { any, createPaths, + createWebpackCompiler, + createWebpackValidator, + createWebpackWatcher, getNodeEnv, getPackageJson, normalizePath, @@ -60,5 +94,7 @@ module.exports = { resolveAny, resolveSafe, toArray, + validateWebpackConfig, + webpackCompile, webpackErrors }; diff --git a/packages/neutrino/src/watch.js b/packages/neutrino/src/watch.js index 2c9211f..7c4a382 100644 --- a/packages/neutrino/src/watch.js +++ b/packages/neutrino/src/watch.js @@ -1,16 +1,10 @@ -const webpack = require('webpack'); const Future = require('fluture'); -const { webpackErrors } = require('./utils'); +const { createWebpackWatcher, validateWebpackConfig } = require('./utils'); // watch :: Object config -> Future (Array Error) () -const watch = config => new Future((reject, resolve) => { - const compiler = webpack(config); - - compiler.watch(config.watchOptions || {}, (err, stats) => { - const errors = webpackErrors(err, stats); - - errors.length ? reject(errors) : resolve(compiler); - }); -}); +const watch = config => Future + .of(config) + .chain(validateWebpackConfig) + .chain(createWebpackWatcher); module.exports = watch;