]> git.wincent.com - hextrapolate.git/blob - gulpfile.babel.js
bbc055c862eb3d77eaadd6c6641c087817601629
[hextrapolate.git] / gulpfile.babel.js
1 // Copyright 2015-present Greg Hurrell. All rights reserved.
2 // Licensed under the terms of the MIT license.
3
4 import WebpackDevServer from 'webpack-dev-server';
5 import config from './webpack.config.js';
6 import eslint from 'gulp-eslint';
7 import flow from 'gulp-flowtype';
8 import gulp from 'gulp';
9 import gutil from 'gulp-util';
10 import mocha from 'gulp-spawn-mocha';
11 import productionConfig from './webpack.production.config.js';
12 import webpack from 'webpack';
13
14 let watching = false;
15
16 /**
17  * Ring the terminal bell.
18  */
19 function ringBell() {
20   process.stderr.write('\x07');
21 }
22
23 /**
24  * Wrap a stream in an error-handler (until Gulp 4, needed to prevent "watch"
25  * task from dying on error).
26  */
27 function wrap(stream) {
28   stream.on('error', error => {
29     gutil.log(gutil.colors.red(error.message));
30     gutil.log(error.stack);
31     if (watching) {
32       gutil.log(gutil.colors.yellow('[aborting]'));
33       stream.end();
34     } else {
35       gutil.log(gutil.colors.yellow('[exiting]'));
36       process.exit(1);
37     }
38     ringBell();
39   });
40   return stream;
41 }
42
43 gulp.task('default', ['webpack-dev-server']);
44
45 gulp.task('build', ['webpack:build']);
46
47 gulp.task('flow', ['typecheck']);
48
49 gulp.task('js', ['build', 'lint', 'test', 'typecheck']);
50
51 gulp.task('lint', () => (
52   gulp.src('src/**/*.js')
53     .pipe(eslint())
54     .pipe(eslint.format())
55 ));
56
57 gulp.task('typecheck', () => {
58   return gulp.src('src/**/*.js', {read: false})
59     .pipe(gutil.noop());
60
61   // TODO: enable this once Flow groks ES2015/ES2016 features.
62   return gulp.src('src/**/*.js')
63     .pipe(wrap(flow()))
64 });
65
66 gulp.task('test', () => (
67   gulp.src(
68     [
69       'src/**/__mocks__/*.js',
70       'src/**/__tests__/*-test.js',
71     ],
72     {read: false}
73   )
74     .pipe(wrap(mocha({
75       opts: 'mocha/mocha.opts',
76       reporter: watching ? 'mocha/watch-reporter' : 'list',
77     })))
78 ));
79
80 gulp.task('watch', () => {
81   watching = true;
82   gulp.watch('src/**/*.js', ['js']);
83 });
84
85 gulp.task('webpack:build', callback => {
86   webpack(productionConfig, (err, stats) => {
87     if (err) {
88       ringBell();
89       throw new gutil.PluginError('webpack:build', err);
90     }
91     if (stats.compilation.errors) {
92       ringBell();
93     }
94     if (!watching) {
95       gutil.log('[webpack:build]', stats.toString({
96         colors: true
97       }));
98     }
99     callback();
100   });
101 });
102
103 gulp.task('webpack-dev-server', callback => {
104   const myConfig = {
105     ...config,
106     debug: true,
107   };
108
109   new WebpackDevServer(webpack(myConfig), {
110     publicPath: config.output.publicPath,
111     hot: true,
112     historyApiFallback: true,
113     stats: {
114       colors: true,
115     },
116   }).listen(3000, 'localhost', err => {
117     if (err) {
118       ringBell();
119       throw new gutil.PluginError('webpack-dev-server', err);
120     }
121     gutil.log('[webpack-dev-server]', 'http://localhost:3000');
122   });
123 });