]> git.wincent.com - hextrapolate.git/blob - gulpfile.babel.js
15bcf7e33a9803b840c5ee97b3aaed45099318eb
[hextrapolate.git] / gulpfile.babel.js
1 // Copyright 2003-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-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('lint', () => (
50   gulp.src('src/**/*.js')
51     .pipe(eslint())
52     .pipe(eslint.format())
53 ));
54
55 gulp.task('typecheck', () => {
56   return gulp.src('src/**/*.js', {read: false})
57     .pipe(gutil.noop());
58
59   // TODO: enable this once Flow groks ES2015/ES2016 features.
60   return gulp.src('src/**/*.js')
61     .pipe(wrap(flow()))
62 });
63
64 gulp.task('test', () => (
65   gulp.src(
66     [
67       'src/**/__mocks__/*.js',
68       'src/**/__tests__/*-test.js',
69     ],
70     {read: false}
71   )
72     .pipe(wrap(mocha({
73       opts: 'mocha/mocha.opts',
74       reporter: watching ? 'mocha/watch-reporter' : 'list',
75     })))
76 ));
77
78 gulp.task('watch', () => {
79   watching = true;
80   gulp.watch('src/**/*.{css,js}', ['build', 'lint', 'test', 'typecheck']);
81 });
82
83 gulp.task('webpack:build', callback => {
84   webpack(productionConfig, (err, stats) => {
85     if (err) {
86       ringBell();
87       throw new gutil.PluginError('webpack:build', err);
88     }
89     if (stats.compilation.errors) {
90       ringBell();
91     }
92     if (!watching) {
93       gutil.log('[webpack:build]', stats.toString({
94         colors: true
95       }));
96     }
97     callback();
98   });
99 });
100
101 gulp.task('webpack-dev-server', callback => {
102   const myConfig = {
103     ...config,
104     debug: true,
105   };
106
107   new WebpackDevServer(webpack(myConfig), {
108     publicPath: config.output.publicPath,
109     hot: true,
110     historyApiFallback: true,
111     stats: {
112       colors: true,
113     },
114   }).listen(3000, 'localhost', err => {
115     if (err) {
116       ringBell();
117       throw new gutil.PluginError('webpack-dev-server', err);
118     }
119     gutil.log('[webpack-dev-server]', 'http://localhost:3000');
120   });
121 });