Gulpfile.js (158 lines of code) (raw):
const babel = require('gulp-babel');
const del = require('del');
const flatten = require('gulp-flatten');
const gulp = require('gulp');
const gulpUtil = require('gulp-util');
const header = require('gulp-header');
const rename = require('gulp-rename');
const source = require('vinyl-source-stream');
const webpackStream = require('webpack-stream');
const babelDefaultOptions = require('./scripts/babel/default-options');
const DEVELOPMENT_HEADER = [
'/**',
' * Flux v<%= version %>',
' */',
].join('\n') + '\n';
const PRODUCTION_HEADER = [
'/**',
' * Flux v<%= version %>',
' *',
' * Copyright (c) Facebook, Inc. and its affiliates.',
' *',
' * This source code is licensed under the BSD-style license found in the',
' * LICENSE file in the root directory of this source tree. An additional grant',
' * of patent rights can be found in the PATENTS file in the same directory.',
' */',
].join('\n') + '\n';
const paths = {
dist: './dist/',
lib: 'lib',
entry: './index.js',
entryUtils: './utils.js',
src: [
'src/**/*.js',
'!src/**/__tests__/**/*.js',
'!src/**/__mocks__/**/*.js',
],
};
const buildDist = function(opts) {
const webpackOpts = {
debug: opts.debug,
module: {
loaders: [
{test: /\.js$/, loader: 'babel'}
],
},
output: {
filename: opts.output,
libraryTarget: 'umd',
library: opts.library,
},
plugins: [
new webpackStream.webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(
opts.debug ? 'development' : 'production'
),
})
]
};
if (!opts.debug) {
webpackOpts.plugins.push(
new webpackStream.webpack.optimize.UglifyJsPlugin({
compress: {
hoist_vars: true,
screw_ie8: true,
warnings: false
}
})
);
}
return webpackStream(webpackOpts, null, function(err, stats) {
if (err) {
throw new gulpUtil.PluginError('webpack', err);
}
if (stats.compilation.errors.length) {
gulpUtil.log('webpack', '\n' + stats.toString({colors: true}));
}
});
};
gulp.task('clean', function() {
return del([paths.lib, 'Flux.js']);
});
gulp.task('lib', function() {
return gulp
.src(paths.src)
.pipe(babel(babelDefaultOptions))
.pipe(flatten())
.pipe(gulp.dest(paths.lib));
});
gulp.task('flow', function() {
return gulp
.src(paths.src)
.pipe(flatten())
.pipe(rename({extname: '.js.flow'}))
.pipe(gulp.dest(paths.lib));
});
gulp.task('dist', gulp.series('lib', function() {
const distOpts = {
debug: true,
output: 'Flux.js',
library: 'Flux',
};
return gulp
.src(paths.entry)
.pipe(buildDist(distOpts))
.pipe(header(DEVELOPMENT_HEADER, {
version: process.env.npm_package_version,
}))
.pipe(gulp.dest(paths.dist));
}));
gulp.task('dist:utils', gulp.series('lib', function() {
const distOpts = {
debug: true,
output: 'FluxUtils.js',
library: 'FluxUtils',
};
return gulp
.src(paths.entryUtils)
.pipe(buildDist(distOpts))
.pipe(header(DEVELOPMENT_HEADER, {
version: process.env.npm_package_version,
}))
.pipe(gulp.dest(paths.dist));
}));
gulp.task('dist:min', gulp.series('lib', function() {
const distOpts = {
debug: false,
output: 'Flux.min.js',
library: 'Flux',
};
return gulp
.src(paths.entry)
.pipe(buildDist(distOpts))
.pipe(header(PRODUCTION_HEADER, {
version: process.env.npm_package_version,
}))
.pipe(gulp.dest(paths.dist));
}));
gulp.task('dist:utils:min', gulp.series('lib', function() {
const distOpts = {
debug: false,
output: 'FluxUtils.min.js',
library: 'FluxUtils',
};
return gulp
.src(paths.entryUtils)
.pipe(buildDist(distOpts))
.pipe(header(PRODUCTION_HEADER, {
version: process.env.npm_package_version,
}))
.pipe(gulp.dest(paths.dist));
}));
gulp.task('build', gulp.series('lib', 'flow', 'dist', 'dist:utils'));
gulp.task('publish', gulp.series(
'clean',
'flow',
gulp.parallel('dist', 'dist:min', 'dist:utils', 'dist:utils:min'),
));
gulp.task('default', gulp.series('build'));