Browse Source

Validate webpack configuration before running compiler

v6-dev
Eli Perelman 8 years ago
parent
commit
3eaac54223
  1. 2
      packages/neutrino/bin/build.js
  2. 2
      packages/neutrino/bin/inspect.js
  3. 2
      packages/neutrino/bin/start.js
  4. 2
      packages/neutrino/bin/test.js
  5. 16
      packages/neutrino/src/build.js
  6. 24
      packages/neutrino/src/devServer.js
  7. 36
      packages/neutrino/src/utils.js
  8. 16
      packages/neutrino/src/watch.js

2
packages/neutrino/bin/build.js

@ -8,7 +8,7 @@ module.exports = (middleware, options) => {
.fork((errors) => { .fork((errors) => {
spinner.fail('Building project failed'); spinner.fail('Building project failed');
errors.forEach((err) => { errors.forEach((err) => {
console.error(err.stack || err); console.error(err.message || err.stack || err);
err.details && console.error(err.details); err.details && console.error(err.details);
}); });
process.exit(1); process.exit(1);

2
packages/neutrino/bin/inspect.js

@ -2,6 +2,6 @@ const { inspect } = require('../src');
module.exports = (middleware, options) => inspect(middleware, options) module.exports = (middleware, options) => inspect(middleware, options)
.fork((err) => { .fork((err) => {
console.error(err.stack || err); console.error(err.message || err.stack || err);
process.exit(1); process.exit(1);
}, console.log); }, console.log);

2
packages/neutrino/bin/start.js

@ -8,7 +8,7 @@ module.exports = (middleware, options) => {
.fork((errors) => { .fork((errors) => {
spinner.fail('Building project failed'); spinner.fail('Building project failed');
errors.forEach((err) => { errors.forEach((err) => {
console.error(err.stack || err); console.error(err.message || err.stack || err);
err.details && console.error(err.details); err.details && console.error(err.details);
}); });

2
packages/neutrino/bin/test.js

@ -2,6 +2,6 @@ const { test } = require('../src');
module.exports = (middleware, options) => test(middleware, options) module.exports = (middleware, options) => test(middleware, options)
.fork((err) => { .fork((err) => {
console.error(err.stack || err); console.error(err.message || err.stack || err);
process.exit(1); process.exit(1);
}, Function.prototype); }, Function.prototype);

16
packages/neutrino/src/build.js

@ -1,16 +1,10 @@
const webpack = require('webpack');
const Future = require('fluture'); const Future = require('fluture');
const { webpackErrors } = require('./utils'); const { webpackCompile, validateWebpackConfig } = require('./utils');
// build :: Object config -> Future (Array Error) Function // build :: Object config -> Future (Array Error) Function
const build = config => Future((reject, resolve) => { const build = config => Future
const compiler = webpack(config); .of(config)
.chain(validateWebpackConfig)
compiler.run((err, stats) => { .chain(webpackCompile);
const errors = webpackErrors(err, stats);
errors.length ? reject(errors) : resolve(stats);
});
});
module.exports = build; module.exports = build;

24
packages/neutrino/src/devServer.js

@ -1,19 +1,19 @@
const merge = require('deepmerge'); const merge = require('deepmerge');
const webpack = require('webpack');
const DevServer = require('webpack-dev-server'); const DevServer = require('webpack-dev-server');
const Future = require('fluture'); const Future = require('fluture');
const { createWebpackCompiler, validateWebpackConfig } = require('./utils');
// devServer :: Object webpackConfig -> Future () Function // devServer :: Object config -> Future () Function
const devServer = webpackConfig => new Future((reject, resolve) => { const devServer = config => Future
const config = merge({ .of(merge({ devServer: { host: 'localhost', port: 5000, noInfo: true } }, config))
devServer: { host: 'localhost', port: 5000, noInfo: true } .chain(validateWebpackConfig)
}, webpackConfig); .chain(createWebpackCompiler)
const { host, port } = config.devServer; .chain(compiler => Future((reject, resolve) => {
const { devServer } = compiler.options;
const { host, port } = devServer;
const server = new DevServer(compiler, devServer);
const compiler = webpack(config); server.listen(port, host, () => resolve(compiler));
const server = new DevServer(compiler, config.devServer); }));
server.listen(port, host, () => resolve(compiler));
});
module.exports = devServer; module.exports = devServer;

36
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 { List } = require('immutable-ext');
const { isAbsolute, join } = require('path'); const { isAbsolute, join } = require('path');
const optional = require('optional'); const optional = require('optional');
const webpack = require('webpack');
// any :: List -> Future a b // any :: List -> Future a b
const any = reduce(Future.or, Future.reject('empty list')); 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 // webpackErrors :: (Error|Array Error err -> Object stats) -> Array Error
const webpackErrors = (err, stats) => (err ? toArray(err) : stats.toJson().errors); 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 = { module.exports = {
any, any,
createPaths, createPaths,
createWebpackCompiler,
createWebpackValidator,
createWebpackWatcher,
getNodeEnv, getNodeEnv,
getPackageJson, getPackageJson,
normalizePath, normalizePath,
@ -60,5 +94,7 @@ module.exports = {
resolveAny, resolveAny,
resolveSafe, resolveSafe,
toArray, toArray,
validateWebpackConfig,
webpackCompile,
webpackErrors webpackErrors
}; };

16
packages/neutrino/src/watch.js

@ -1,16 +1,10 @@
const webpack = require('webpack');
const Future = require('fluture'); const Future = require('fluture');
const { webpackErrors } = require('./utils'); const { createWebpackWatcher, validateWebpackConfig } = require('./utils');
// watch :: Object config -> Future (Array Error) () // watch :: Object config -> Future (Array Error) ()
const watch = config => new Future((reject, resolve) => { const watch = config => Future
const compiler = webpack(config); .of(config)
.chain(validateWebpackConfig)
compiler.watch(config.watchOptions || {}, (err, stats) => { .chain(createWebpackWatcher);
const errors = webpackErrors(err, stats);
errors.length ? reject(errors) : resolve(compiler);
});
});
module.exports = watch; module.exports = watch;

Loading…
Cancel
Save