diff --git a/Gruntfile.js b/Gruntfile.js index 9562542441..e2f2faa59c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -52,11 +52,17 @@ module.exports = function(grunt) { grunt.loadNpmTasks(npmTaskName); }); - grunt.registerTask('eslint', require('./grunt/tasks/eslint')); + grunt.registerTask('eslint', function() { + // Use gulp here. + spawnGulp(['eslint'], null, this.async()); + }); grunt.registerTask('lint', ['eslint']); - grunt.registerTask('flow', require('./grunt/tasks/flow')); + grunt.registerTask('flow', function() { + // Use gulp here. + spawnGulp(['flow'], null, this.async()); + }); grunt.registerTask('delete-build-modules', function() { // Use gulp here. @@ -84,7 +90,10 @@ module.exports = function(grunt) { grunt.registerTask('npm-react-addons:release', npmReactAddonsTasks.buildReleases); grunt.registerTask('npm-react-addons:pack', npmReactAddonsTasks.packReleases); - grunt.registerTask('version-check', require('./grunt/tasks/version-check')); + grunt.registerTask('version-check', function() { + // Use gulp here. + spawnGulp(['version-check'], null, this.async()); + }); grunt.registerTask('build:basic', [ 'build-modules', diff --git a/grunt/tasks/eslint.js b/grunt/tasks/eslint.js deleted file mode 100644 index 4f364a6d90..0000000000 --- a/grunt/tasks/eslint.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -var grunt = require('grunt'); - -var extension = process.platform === 'win32' ? '.cmd': ''; - -module.exports = function() { - var done = this.async(); - grunt.util.spawn({ - cmd: 'node_modules/.bin/eslint' + extension, - args: ['.'], - opts: {stdio: 'inherit'}, // allows colors to passthrough - }, function(err, result, code) { - if (err) { - grunt.log.error('Lint failed'); - } else { - grunt.log.ok('Lint passed'); - } - - done(code === 0); - }); -}; diff --git a/grunt/tasks/flow.js b/grunt/tasks/flow.js deleted file mode 100644 index 767fc4eea6..0000000000 --- a/grunt/tasks/flow.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -var grunt = require('grunt'); - -var extension = process.platform === 'win32' ? '.cmd': ''; - -module.exports = function() { - var done = this.async(); - grunt.util.spawn({ - cmd: 'node_modules/.bin/flow' + extension, - args: ['check', '.'], - opts: {stdio: 'inherit'}, - }, function(err, result, code) { - if (err) { - grunt.log.error('Flow failed'); - } else { - grunt.log.ok('Flow passed'); - } - - done(code === 0); - }); -}; diff --git a/grunt/tasks/version-check.js b/grunt/tasks/version-check.js deleted file mode 100644 index 99f55feac0..0000000000 --- a/grunt/tasks/version-check.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -var grunt = require('grunt'); - -module.exports = function() { - var pkgVersion = grunt.config.data.pkg.version; - - var addonsData = grunt.file.readJSON('./packages/react-addons/package.json'); - var versions = { - 'packages/react/package.json': - grunt.file.readJSON('./packages/react/package.json').version, - 'packages/react-dom/package.json': - grunt.file.readJSON('./packages/react-dom/package.json').version, - 'packages/react-native-renderer/package.json': - grunt.file.readJSON('./packages/react-native-renderer/package.json').version, - 'packages/react-addons/package.json (version)': addonsData.version, - // Get the "version" without the range bit - 'packages/react-addons/package.json (react dependency)': addonsData.peerDependencies.react.slice(1), - 'src/ReactVersion.js': require('../../src/ReactVersion'), - }; - - // Return true (ok) or false (failed) - return Object.keys(versions).reduce(function(prev, name) { - var version = versions[name]; - var ok = true; - if (version !== pkgVersion) { - grunt.log.error( - '%s version does not match package.json. Expected %s, saw %s.', - name, - pkgVersion, - version - ); - ok = false; - } - return prev && ok; - }, true); -}; diff --git a/gulp/tasks/eslint.js b/gulp/tasks/eslint.js new file mode 100644 index 0000000000..6d87cdfd43 --- /dev/null +++ b/gulp/tasks/eslint.js @@ -0,0 +1,49 @@ +/** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * 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. + */ + +'use strict'; + +var path = require('path'); +var spawn = require('child_process').spawn; + +var extension = process.platform === 'win32' ? '.cmd' : ''; + +module.exports = function(gulp, plugins) { + var gutil = plugins.util; + + return function(done) { + spawn( + process.execPath, + [ + path.join('node_modules', '.bin', 'eslint' + extension), + '.', + ], + { + // Allow colors to pass through + stdio: 'inherit', + } + ).on('close', function(code) { + if (code !== 0) { + gutil.log( + gutil.colors.red( + 'Lint failed' + ) + ); + process.exit(code); + } + + gutil.log( + gutil.colors.green( + 'Lint passed' + ) + ); + done(); + }); + }; +}; diff --git a/gulp/tasks/flow.js b/gulp/tasks/flow.js new file mode 100644 index 0000000000..a32d8837b6 --- /dev/null +++ b/gulp/tasks/flow.js @@ -0,0 +1,50 @@ +/** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * 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. + */ + +'use strict'; + +var path = require('path'); +var spawn = require('child_process').spawn; + +var extension = process.platform === 'win32' ? '.cmd' : ''; + +module.exports = function(gulp, plugins) { + var gutil = plugins.util; + + return function(done) { + spawn( + process.execPath, + [ + path.join('node_modules', '.bin', 'flow' + extension), + 'check', + '.', + ], + { + // Allow colors to pass through + stdio: 'inherit', + } + ).on('close', function(code) { + if (code !== 0) { + gutil.log( + gutil.colors.red( + 'Flow failed' + ) + ); + process.exit(code); + } + + gutil.log( + gutil.colors.green( + 'Flow passed' + ) + ); + done(); + }); + }; +}; diff --git a/gulp/tasks/version-check.js b/gulp/tasks/version-check.js new file mode 100644 index 0000000000..0d22595dc1 --- /dev/null +++ b/gulp/tasks/version-check.js @@ -0,0 +1,55 @@ +/** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * 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. + */ + +'use strict'; + +module.exports = function(gulp, plugins) { + var gutil = plugins.util; + + return function(done) { + var reactVersion = require('../../package.json').version; + + var addonsData = require('../../packages/react-addons/package.json'); + var versions = { + 'packages/react/package.json': + require('../../packages/react/package.json').version, + 'packages/react-dom/package.json': + require('../../packages/react-dom/package.json').version, + 'packages/react-native-renderer/package.json': + require('../../packages/react-native-renderer/package.json').version, + 'packages/react-addons/package.json (version)': addonsData.version, + 'packages/react-addons/package.json (react dependency)': + // Get the "version" without the range bit + addonsData.peerDependencies.react.slice(1), + 'src/ReactVersion.js': require('../../src/ReactVersion'), + }; + + var allVersionsMatch = true; + Object.keys(versions).forEach(function(name) { + var version = versions[name]; + if (version !== reactVersion) { + allVersionsMatch = false; + gutil.log( + gutil.colors.red( + '%s version does not match package.json. Expected %s, saw %s.' + ), + name, + reactVersion, + version + ); + } + }); + + if (!allVersionsMatch) { + process.exit(1); + } + + done(); + }; +}; diff --git a/gulpfile.js b/gulpfile.js index 103f608e20..82556ac429 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -18,6 +18,13 @@ var babelPluginModules = require('fbjs-scripts/babel-6/rewrite-modules'); var extractErrors = require('./scripts/error-codes/gulp-extract-errors'); var devExpressionWithCodes = require('./scripts/error-codes/dev-expression-with-codes'); +// Load all of the Gulp plugins. +var plugins = require('gulp-load-plugins')(); + +function getTask(name) { + return require(`./gulp/tasks/${name}`)(gulp, plugins); +} + var paths = { react: { src: [ @@ -59,6 +66,14 @@ var babelOpts = { ], }; +gulp.task('eslint', getTask('eslint')); + +gulp.task('lint', ['eslint']); + +gulp.task('flow', getTask('flow')); + +gulp.task('version-check', getTask('version-check')); + gulp.task('react:clean', function() { return del([paths.react.lib]); }); diff --git a/package.json b/package.json index 67ac99e5f8..117be7edfb 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "gulp": "^3.9.0", "gulp-babel": "^6.0.0", "gulp-flatten": "^0.2.0", + "gulp-load-plugins": "^1.2.4", "gulp-util": "^3.0.7", "gzip-js": "~0.3.2", "jest": "^12.1.1",