var path = require('path') var gulp = require('gulp') var gutil = require('gulp-util') var jsonlint = require('gulp-jsonlint') var eslint = require('gulp-eslint') var EslintCLIEngine = require('eslint').CLIEngine var webpack = require('webpack') var webpackConfig = require('./webpack.config').webpack var webpackStatusConfig = require('./res/common/status/webpack.config') var gettext = require('gulp-angular-gettext') var jade = require('gulp-jade') var del = require('del') // var protractor = require('gulp-protractor') var protractor = require('./res/test/e2e/helpers/gulp-protractor-adv') var protractorConfig = './res/test/protractor.conf' var karma = require('karma').server var karmaConfig = '/res/test/karma.conf.js' var stream = require('stream') var run = require('gulp-run') gulp.task('jsonlint', function() { return gulp.src([ '.bowerrc' , '.yo-rc.json' , '*.json' ]) .pipe(jsonlint()) .pipe(jsonlint.reporter()) }) // Try to use eslint-cli directly instead of eslint-gulp // since it doesn't support cache yet gulp.task('eslint', function() { return gulp.src([ 'lib/**/*.js' , 'res/**/*.js' , '!res/bower_components/**' , '*.js' ]) // eslint() attaches the lint output to the "eslint" property // of the file object so it can be used by other modules. .pipe(eslint()) // eslint.format() outputs the lint results to the console. // Alternatively use eslint.formatEach() (see Docs). .pipe(eslint.format()) // To have the process exit with an error code (1) on // lint error, return the stream and pipe to failAfterError last. .pipe(eslint.failAfterError()) }) gulp.task('eslint-cli', function(done) { var cli = new EslintCLIEngine({ cache: true , fix: false }) var report = cli.executeOnFiles([ 'lib/**/*.js' , 'res/app/**/*.js' , 'res/auth/**/*.js' , 'res/common/**/*.js' , 'res/test/**/*.js' , 'res/web_modules/**/*.js' , '*.js' ]) var formatter = cli.getFormatter() console.log(formatter(report.results)) if (report.errorCount > 0) { done(new gutil.PluginError('eslint-cli', new Error('ESLint error'))) } else { done() } }) gulp.task('lint', ['jsonlint', 'eslint-cli']) gulp.task('test', ['lint', 'run:checkversion']) gulp.task('build', ['clean', 'webpack:build']) gulp.task('run:checkversion', function() { gutil.log('Checking STF version...') return run('./bin/stf -V').exec() }) gulp.task('karma_ci', function(done) { karma.start({ configFile: path.join(__dirname, karmaConfig) , singleRun: true }, done) }) gulp.task('karma', function(done) { karma.start({ configFile: path.join(__dirname, karmaConfig) }, done) }) if (gutil.env.multi) { protractorConfig = './res/test/protractor-multi.conf' } else if (gutil.env.appium) { protractorConfig = './res/test/protractor-appium.conf' } gulp.task('webdriver-update', protractor.webdriverUpdate) gulp.task('webdriver-standalone', protractor.webdriverStandalone) gulp.task('protractor-explorer', function(callback) { protractor.protractorExplorer({ url: require(protractorConfig).config.baseUrl }, callback) }) gulp.task('protractor', ['webdriver-update'], function(callback) { gulp.src(['./res/test/e2e/**/*.js']) .pipe(protractor.protractor({ configFile: protractorConfig , debug: gutil.env.debug , suite: gutil.env.suite })) .on('error', function(e) { console.log(e) /* eslint no-console: 0 */ }) .on('end', callback) }) // For piping strings function fromString(filename, string) { var src = new stream.Readable({objectMode: true}) src._read = function() { this.push(new gutil.File({ cwd: '' , base: '' , path: filename , contents: new Buffer(string) })) this.push(null) } return src } // For production gulp.task('webpack:build', function(callback) { var myConfig = Object.create(webpackConfig) myConfig.plugins = myConfig.plugins.concat( new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify('production') } }) ) myConfig.devtool = false webpack(myConfig, function(err, stats) { if (err) { throw new gutil.PluginError('webpack:build', err) } gutil.log('[webpack:build]', stats.toString({ colors: true })) // Save stats to a json file // Can be analyzed in http://webpack.github.io/analyse/ fromString('stats.json', JSON.stringify(stats.toJson())) .pipe(gulp.dest('./tmp/')) callback() }) }) gulp.task('webpack:others', function(callback) { var myConfig = Object.create(webpackStatusConfig) myConfig.plugins = myConfig.plugins.concat( new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify('production') } }) ) myConfig.devtool = false webpack(myConfig, function(err, stats) { if (err) { throw new gutil.PluginError('webpack:others', err) } gutil.log('[webpack:others]', stats.toString({ colors: true })) callback() }) }) gulp.task('translate', [ 'translate:extract' , 'translate:push' , 'translate:pull' , 'translate:compile' ]) gulp.task('jade', function() { return gulp.src([ './res/**/*.jade' , '!./res/bower_components/**' ]) .pipe(jade({ locals: { // So res/views/docs.jade doesn't complain markdownFile: { parseContent: function() { } } } })) .pipe(gulp.dest('./tmp/html/')) }) gulp.task('translate:extract', ['jade'], function() { return gulp.src([ './tmp/html/**/*.html' , './res/**/*.js' , '!./res/bower_components/**' , '!./res/build/**' ]) .pipe(gettext.extract('stf.pot')) .pipe(gulp.dest('./res/common/lang/po/')) }) gulp.task('translate:compile', function() { return gulp.src('./res/common/lang/po/**/*.po') .pipe(gettext.compile({ format: 'json' })) .pipe(gulp.dest('./res/common/lang/translations/')) }) gulp.task('translate:push', function() { gutil.log('Pushing translation source to Transifex...') return run('tx push -s').exec() }) gulp.task('translate:pull', function() { gutil.log('Pulling translations from Transifex...') return run('tx pull').exec() }) gulp.task('clean', function(cb) { del([ './tmp' , './res/build' , '.eslintcache' ], cb) })