pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
221 lines (193 loc) • 5.39 kB
JavaScript
/* eslint no-console: 0, arrow-body-style: 0 */
const gulp = require('gulp');
const path = require('path');
const babel = require('gulp-babel');
const clean = require('gulp-clean');
const gulpWebpack = require('webpack-stream');
const webpackConfig = require('./webpack.config');
const webpackConfigTitanium = require('./webpack.config.titanium');
const eslint = require('gulp-eslint');
const uglify = require('gulp-terser');
const rename = require('gulp-rename');
const exec = require('child_process').exec;
const Karma = require('karma').Server;
const mocha = require('gulp-mocha');
const runSequence = require('gulp4-run-sequence');
const gulpIstanbul = require('gulp-istanbul');
const sourcemaps = require('gulp-sourcemaps');
const packageJSON = require('./package.json');
const gzip = require('gulp-gzip');
const unzip = require('gulp-unzip');
// increase mocha timeout from default of 2000 to allow long running async tests to complete
const mochaTimeout = 5000;
gulp.on('error', process.exit.bind(process, 1));
gulp.task('clean', () => {
return gulp
.src(['lib', 'dist', 'coverage', 'upload'], { read: false, allowEmpty: true })
.pipe(clean());
});
gulp.task('babel', () => {
return gulp
.src('src/**/*.js')
.pipe(sourcemaps.init())
.pipe(babel())
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('lib'));
});
gulp.task('unzip_titanium_sdk', () => {
return gulp.src('resources/titanium.zip').pipe(unzip()).pipe(gulp.dest('resources/'));
});
gulp.task('compile_web', () => {
return gulp.src('src/web/index.js').pipe(gulpWebpack(webpackConfig)).pipe(gulp.dest('dist/web'));
});
gulp.task('compile_titanium', () => {
return gulp
.src('src/titanium/index.js')
.pipe(gulpWebpack(webpackConfigTitanium))
.pipe(gulp.dest('dist/titanium'));
});
gulp.task('create_version', () => {
return gulp
.src('dist/web/pubnub.js')
.pipe(rename(`pubnub.${packageJSON.version}.js`))
.pipe(gulp.dest('upload/normal'));
});
gulp.task('create_version_gzip', () => {
return gulp
.src('upload/normal/*.js')
.pipe(gzip({ append: false }))
.pipe(gulp.dest('upload/gzip'));
});
gulp.task('uglify_web', () => {
return gulp
.src('dist/web/pubnub.js')
.pipe(uglify({ mangle: true, compress: true }))
.pipe(rename('pubnub.min.js'))
.pipe(gulp.dest('dist/web'))
.pipe(rename(`pubnub.${packageJSON.version}.min.js`))
.pipe(gulp.dest('upload/normal'));
});
gulp.task('uglify_titanium', () => {
return gulp
.src('dist/titanium/pubnub.js')
.pipe(uglify({ mangle: true, compress: true }))
.pipe(rename('pubnub.min.js'))
.pipe(gulp.dest('dist/titanium'));
});
gulp.task('lint_code', () => {
return gulp
.src(['src/**/*.js'])
.pipe(eslint())
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
gulp.task('lint_tests', () => {
return gulp
.src(['test/**/*.js', '!test/dist/*.js'])
.pipe(eslint())
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
gulp.task('lint', gulp.series('lint_code', 'lint_tests'));
gulp.task('flow', (cb) => {
return exec('./node_modules/.bin/flow --show-all-errors', (err, stdout, stderr) => {
console.log(stdout);
console.log(stderr);
cb(err);
});
});
gulp.task('validate', gulp.series('lint', 'flow'));
gulp.task('pre-test', () => {
return gulp
.src(['lib/**/*.js'])
.pipe(
gulpIstanbul({
includeAllSources: true,
})
)
.pipe(gulpIstanbul.hookRequire());
});
gulp.task('test_web', (done) => {
new Karma(
{
configFile: path.join(__dirname, '/karma/web.config.js'),
client: {
mocha: {
timeout: mochaTimeout,
},
},
},
done
).start();
});
gulp.task('test_node', () => {
return gulp
.src(['test/**/*.test.js', '!test/dist/*.js', '!test/feature/*.js'], { read: false })
.pipe(mocha({ config: '.mocharc.yml' }))
.pipe(gulpIstanbul.writeReports({ reporters: ['json', 'lcov', 'text'] }));
});
gulp.task('test_titanium', gulp.series('unzip_titanium_sdk'), (done) => {
new Karma(
{
configFile: path.join(__dirname, '/karma/titanium.config.js'),
client: {
mocha: {
timeout: mochaTimeout,
},
},
},
done
).start();
});
gulp.task('test_react-native', () => {
return gulp
.src('test/dist/react-native.test.js', { read: false })
.pipe(
mocha({
reporter: 'spec',
timeout: mochaTimeout,
require: ['@babel/register'],
noConfig: true,
})
)
.pipe(gulpIstanbul.writeReports({ reporters: ['json', 'lcov', 'text'] }));
});
gulp.task('test_release', () => {
return gulp.src('test/release/**/*.test.js', { read: false }).pipe(
mocha({
reporter: 'spec',
timeout: mochaTimeout,
require: ['@babel/register'],
noConfig: true,
})
);
});
gulp.task('test', (done) => {
runSequence(
'pre-test',
'test_node',
'test_web',
'test_titanium',
'test_react-native',
'test_release',
'validate',
() => {
done();
}
);
});
gulp.task('webpack', (done) => {
runSequence('compile_web', 'compile_titanium', done);
});
gulp.task('compile', (done) => {
runSequence(
'clean',
'babel',
'webpack',
'uglify_web',
'uglify_titanium',
'create_version',
'create_version_gzip',
done
);
});