From 94447f80f53ba4bf61a861e11cf8916957d6ae2d Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 11:48:09 -0400 Subject: [PATCH 01/17] Use require-dir to register the gulp tasks --- gulpfile.js | 3 +++ package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index 103f608e208f..99393a88a45a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -13,11 +13,14 @@ var gulp = require('gulp'); var babel = require('gulp-babel'); var flatten = require('gulp-flatten'); var del = require('del'); +var requireDir = require('require-dir'); 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'); +requireDir('./gulp/tasks'); + var paths = { react: { src: [ diff --git a/package.json b/package.json index 67ac99e5f847..d02a47b4901a 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "loose-envify": "^1.1.0", "object-assign": "^4.1.0", "platform": "^1.1.0", + "require-dir": "^0.3.0", "run-sequence": "^1.1.4", "through2": "^2.0.0", "tmp": "~0.0.28", From 7a02349c6e4473d2d93b329042c109fe5a6ab7d7 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 11:48:26 -0400 Subject: [PATCH 02/17] Convert `lint` task to gulp --- Gruntfile.js | 4 ---- grunt/tasks/eslint.js | 22 ---------------------- gulp/tasks/eslint.js | 39 +++++++++++++++++++++++++++++++++++++++ gulpfile.js | 2 ++ 4 files changed, 41 insertions(+), 26 deletions(-) delete mode 100644 grunt/tasks/eslint.js create mode 100644 gulp/tasks/eslint.js diff --git a/Gruntfile.js b/Gruntfile.js index 9562542441e2..a93818066743 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -52,10 +52,6 @@ module.exports = function(grunt) { grunt.loadNpmTasks(npmTaskName); }); - grunt.registerTask('eslint', require('./grunt/tasks/eslint')); - - grunt.registerTask('lint', ['eslint']); - grunt.registerTask('flow', require('./grunt/tasks/flow')); grunt.registerTask('delete-build-modules', function() { diff --git a/grunt/tasks/eslint.js b/grunt/tasks/eslint.js deleted file mode 100644 index 4f364a6d9075..000000000000 --- 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/gulp/tasks/eslint.js b/gulp/tasks/eslint.js new file mode 100644 index 000000000000..f0d089b3e9a5 --- /dev/null +++ b/gulp/tasks/eslint.js @@ -0,0 +1,39 @@ +/** + * 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 gulp = require('gulp'); +var gutil = require('gulp-util'); +var path = require('path'); +var spawn = require('child_process').spawn; + +var extension = process.platform === 'win32' ? '.cmd' : ''; + +gulp.task('eslint', function(cb) { + 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('Lint failed'); + process.exit(code); + } + + gutil.log('Lint passed'); + cb(); + }); +}); diff --git a/gulpfile.js b/gulpfile.js index 99393a88a45a..6b60df90e9db 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -81,3 +81,5 @@ gulp.task('react:extract-errors', function() { }); gulp.task('default', ['react:modules']); + +gulp.task('lint', ['eslint']); From a87ee0682605c1e798ee98e8853df3ec0894d7a9 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 11:52:55 -0400 Subject: [PATCH 03/17] Store `lint` task in relevant file --- gulp/tasks/eslint.js | 2 ++ gulpfile.js | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gulp/tasks/eslint.js b/gulp/tasks/eslint.js index f0d089b3e9a5..5b3fc067ecfb 100644 --- a/gulp/tasks/eslint.js +++ b/gulp/tasks/eslint.js @@ -37,3 +37,5 @@ gulp.task('eslint', function(cb) { cb(); }); }); + +gulp.task('lint', ['eslint']); diff --git a/gulpfile.js b/gulpfile.js index 6b60df90e9db..99393a88a45a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -81,5 +81,3 @@ gulp.task('react:extract-errors', function() { }); gulp.task('default', ['react:modules']); - -gulp.task('lint', ['eslint']); From 8325746b84e48d1c655e40fd2fde41e45f85f5ff Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 11:54:28 -0400 Subject: [PATCH 04/17] Clarify that tasks are imported from subdirectory --- gulpfile.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index 99393a88a45a..88ab17761024 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -19,6 +19,8 @@ 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'); +// Import Gulp tasks from the `tasks` directory. +// Use `gulp --tasks` to list all available tasks. requireDir('./gulp/tasks'); var paths = { From 3bf5215b4bb0e93140c315070bae28cd91b16cb8 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 11:55:08 -0400 Subject: [PATCH 05/17] Convert `flow` task to gulp --- Gruntfile.js | 2 -- grunt/tasks/flow.js | 22 ---------------------- gulp/tasks/flow.js | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 24 deletions(-) delete mode 100644 grunt/tasks/flow.js create mode 100644 gulp/tasks/flow.js diff --git a/Gruntfile.js b/Gruntfile.js index a93818066743..a3a95e78f204 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -52,8 +52,6 @@ module.exports = function(grunt) { grunt.loadNpmTasks(npmTaskName); }); - grunt.registerTask('flow', require('./grunt/tasks/flow')); - grunt.registerTask('delete-build-modules', function() { // Use gulp here. spawnGulp(['react:clean'], null, this.async()); diff --git a/grunt/tasks/flow.js b/grunt/tasks/flow.js deleted file mode 100644 index 767fc4eea65b..000000000000 --- 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/gulp/tasks/flow.js b/gulp/tasks/flow.js new file mode 100644 index 000000000000..057dff81169c --- /dev/null +++ b/gulp/tasks/flow.js @@ -0,0 +1,40 @@ +/** + * 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 gulp = require('gulp'); +var gutil = require('gulp-util'); +var path = require('path'); +var spawn = require('child_process').spawn; + +var extension = process.platform === 'win32' ? '.cmd' : ''; + +gulp.task('flow', function(cb) { + 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('Flow failed'); + process.exit(code); + } + + gutil.log('Flow passed'); + cb(); + }); +}); From 7d40bab5052c2bb92e6a812f90b02a3887d43f1e Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 12:05:44 -0400 Subject: [PATCH 06/17] Use the more idiomatic `done` callback --- gulp/tasks/eslint.js | 4 ++-- gulp/tasks/flow.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gulp/tasks/eslint.js b/gulp/tasks/eslint.js index 5b3fc067ecfb..d9eabe548090 100644 --- a/gulp/tasks/eslint.js +++ b/gulp/tasks/eslint.js @@ -16,7 +16,7 @@ var spawn = require('child_process').spawn; var extension = process.platform === 'win32' ? '.cmd' : ''; -gulp.task('eslint', function(cb) { +gulp.task('eslint', function(done) { spawn( process.execPath, [ @@ -34,7 +34,7 @@ gulp.task('eslint', function(cb) { } gutil.log('Lint passed'); - cb(); + done(); }); }); diff --git a/gulp/tasks/flow.js b/gulp/tasks/flow.js index 057dff81169c..cd3056e54bad 100644 --- a/gulp/tasks/flow.js +++ b/gulp/tasks/flow.js @@ -16,7 +16,7 @@ var spawn = require('child_process').spawn; var extension = process.platform === 'win32' ? '.cmd' : ''; -gulp.task('flow', function(cb) { +gulp.task('flow', function(done) { spawn( process.execPath, [ @@ -35,6 +35,6 @@ gulp.task('flow', function(cb) { } gutil.log('Flow passed'); - cb(); + done(); }); }); From 53ae338efe941f3523ce2ff0558e3cc008a5b3df Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 12:26:19 -0400 Subject: [PATCH 07/17] Allow gulp + grunt combo in Travis A temporary measure to keep CI passing while using a combo of Gulp and Grunt tasks. --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8ecb5b86618f..66538e181e04 100644 --- a/.travis.yml +++ b/.travis.yml @@ -82,6 +82,8 @@ script: ./node_modules/.bin/grunt jest:normal git checkout -- src/renderers/dom/shared/ReactDOMFeatureFlags.js ./node_modules/.bin/gulp react:extract-errors + elif [ "$TEST_TYPE" = gulp_* ] + ./node_modules/.bin/gulp ${TEST_TYPE:5} else ./node_modules/.bin/grunt $TEST_TYPE fi @@ -89,8 +91,8 @@ env: matrix: - TEST_TYPE=build - TEST_TYPE=test - - TEST_TYPE=lint - - TEST_TYPE=flow + - TEST_TYPE=gulp_lint + - TEST_TYPE=gulp_flow - TEST_TYPE=build_website global: # SERVER From b0b48d2856c231c8113739f2fcdd48dff7814434 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 12:30:31 -0400 Subject: [PATCH 08/17] Fix bash conditional syntax --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 66538e181e04..4a295ed971ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -82,7 +82,7 @@ script: ./node_modules/.bin/grunt jest:normal git checkout -- src/renderers/dom/shared/ReactDOMFeatureFlags.js ./node_modules/.bin/gulp react:extract-errors - elif [ "$TEST_TYPE" = gulp_* ] + elif [ "$TEST_TYPE" = gulp_* ]; then ./node_modules/.bin/gulp ${TEST_TYPE:5} else ./node_modules/.bin/grunt $TEST_TYPE From 3d80375c36c15eab1bcf726c7f89807ddf04371a Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 12:36:31 -0400 Subject: [PATCH 09/17] Fix the conditional check for Gulp tasks --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4a295ed971ac..535d95938327 100644 --- a/.travis.yml +++ b/.travis.yml @@ -82,7 +82,7 @@ script: ./node_modules/.bin/grunt jest:normal git checkout -- src/renderers/dom/shared/ReactDOMFeatureFlags.js ./node_modules/.bin/gulp react:extract-errors - elif [ "$TEST_TYPE" = gulp_* ]; then + elif [[ "$TEST_TYPE" = gulp_* ]]; then ./node_modules/.bin/gulp ${TEST_TYPE:5} else ./node_modules/.bin/grunt $TEST_TYPE From 11599fd9be006fede6e97d976d99e1602bd7b5a6 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 12:52:14 -0400 Subject: [PATCH 10/17] Add gulp `version-check` task Leaving the Grunt one in place, since it is consumed by Grunt tasks that have yet to be ported. --- gulp/tasks/version-check.js | 54 +++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 gulp/tasks/version-check.js diff --git a/gulp/tasks/version-check.js b/gulp/tasks/version-check.js new file mode 100644 index 000000000000..58d14cf73c27 --- /dev/null +++ b/gulp/tasks/version-check.js @@ -0,0 +1,54 @@ +/** + * 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 gulp = require('gulp'); +var gutil = require('gulp-util'); + +gulp.task('version-check', 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(); +}); From c9d7020277dd82f3d74de618c29b62b31807377b Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 13:02:34 -0400 Subject: [PATCH 11/17] Make grunt use gulp's version-check task --- Gruntfile.js | 4 +++- grunt/tasks/version-check.js | 37 ------------------------------------ 2 files changed, 3 insertions(+), 38 deletions(-) delete mode 100644 grunt/tasks/version-check.js diff --git a/Gruntfile.js b/Gruntfile.js index a3a95e78f204..4f8e2a425d9b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -78,7 +78,9 @@ 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() { + spawnGulp(['version-check'], null, this.async()); + }); grunt.registerTask('build:basic', [ 'build-modules', diff --git a/grunt/tasks/version-check.js b/grunt/tasks/version-check.js deleted file mode 100644 index 99f55feac010..000000000000 --- 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); -}; From fdc3de28f7a8df5643904652783682e5354630ae Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 13:31:21 -0400 Subject: [PATCH 12/17] Convert `build:react-dom` task to gulp --- Gruntfile.js | 4 +- grunt/tasks/react-dom.js | 30 ------------- gulp/data/header-template-extended.txt | 11 +++++ gulp/data/header-template-short.txt | 3 ++ gulp/tasks/react-dom.js | 59 ++++++++++++++++++++++++++ package.json | 1 + 6 files changed, 77 insertions(+), 31 deletions(-) delete mode 100644 grunt/tasks/react-dom.js create mode 100644 gulp/data/header-template-extended.txt create mode 100644 gulp/data/header-template-short.txt create mode 100644 gulp/tasks/react-dom.js diff --git a/Gruntfile.js b/Gruntfile.js index 4f8e2a425d9b..de1c186672cb 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -105,7 +105,9 @@ module.exports = function(grunt) { 'build-modules', 'npm-react:release', ]); - grunt.registerTask('build:react-dom', require('./grunt/tasks/react-dom')); + grunt.registerTask('build:react-dom', function() { + spawnGulp(['build:react-dom'], null, this.async()); + }); var jestTasks = require('./grunt/tasks/jest'); grunt.registerTask('jest:normal', jestTasks.normal); diff --git a/grunt/tasks/react-dom.js b/grunt/tasks/react-dom.js deleted file mode 100644 index 77a68d0656ac..000000000000 --- a/grunt/tasks/react-dom.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -var grunt = require('grunt'); -var UglifyJS = require('uglify-js'); - -var LICENSE_TEMPLATE = - grunt.file.read('./grunt/data/header-template-extended.txt'); - -function build(name, filename) { - var srcFile = `vendor/${filename}.js`; - var destFile = `build/${filename}.js`; - var destFileMin = `build/${filename}.min.js`; - var templateData = { - package: name, - version: grunt.config.data.pkg.version, - }; - var header = grunt.template.process( - LICENSE_TEMPLATE, - {data: templateData} - ); - var src = grunt.file.read(srcFile); - var srcMin = UglifyJS.minify(src, {fromString: true}).code; - grunt.file.write(destFile, header + src); - grunt.file.write(destFileMin, header + srcMin); -} - -module.exports = function() { - build('ReactDOM', 'react-dom'); - build('ReactDOMServer', 'react-dom-server'); -}; diff --git a/gulp/data/header-template-extended.txt b/gulp/data/header-template-extended.txt new file mode 100644 index 000000000000..83bcca41ccee --- /dev/null +++ b/gulp/data/header-template-extended.txt @@ -0,0 +1,11 @@ +/** + * <%= package %> v<%= version %> + * + * 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. + * + */ diff --git a/gulp/data/header-template-short.txt b/gulp/data/header-template-short.txt new file mode 100644 index 000000000000..64ee588691aa --- /dev/null +++ b/gulp/data/header-template-short.txt @@ -0,0 +1,3 @@ +/** + * <%= package %> v<%= version %> + */ diff --git a/gulp/tasks/react-dom.js b/gulp/tasks/react-dom.js new file mode 100644 index 000000000000..291eecc3c774 --- /dev/null +++ b/gulp/tasks/react-dom.js @@ -0,0 +1,59 @@ +/** + * 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 gulp = require('gulp'); +var gutil = require('gulp-util'); +var fs = require('fs'); +var merge = require('merge2'); +var through = require('through2'); +var UglifyJS = require('uglify-js'); + +var packageJson = require('../../package.json'); + +function build(name, filename) { + var LICENSE_TEMPLATE = + fs.readFileSync('./gulp/data/header-template-extended.txt', 'utf8'); + var header = LICENSE_TEMPLATE + .replace('<%= package %>', name) + .replace('<%= version %>', packageJson.version); + + var srcFile = `vendor/${filename}.js`; + var src = fs.readFileSync(srcFile, 'utf8'); + var srcMin = UglifyJS.minify(src, { + fromString: true + }).code; + + var destFile = new gutil.File({ + path: `${filename}.js`, + contents: new Buffer(header + src) + }); + var destFileMin = new gutil.File({ + path: `${filename}.min.js`, + contents: new Buffer(header + srcMin) + }); + + var out = through.obj(); + out.push(destFile); + out.push(destFileMin); + + return out + .pipe(gulp.dest('build')); +} + +gulp.task('build:react-dom', function() { + var reactDom = build('ReactDOM', 'react-dom'); + var reactDomServer = build('ReactDOMServer', 'react-dom-server'); + + merge([ + reactDom, + reactDomServer + ]); +}); diff --git a/package.json b/package.json index d02a47b4901a..b171ea7b5f46 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "gzip-js": "~0.3.2", "jest": "^12.1.1", "loose-envify": "^1.1.0", + "merge2": "^1.0.2", "object-assign": "^4.1.0", "platform": "^1.1.0", "require-dir": "^0.3.0", From 3a1992202a9e14f6b04e7c8f4bb0be79a9f0271a Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 13:34:33 -0400 Subject: [PATCH 13/17] Fix linting issues in `react-dom` task --- gulp/tasks/react-dom.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gulp/tasks/react-dom.js b/gulp/tasks/react-dom.js index 291eecc3c774..4155ef73c327 100644 --- a/gulp/tasks/react-dom.js +++ b/gulp/tasks/react-dom.js @@ -28,16 +28,16 @@ function build(name, filename) { var srcFile = `vendor/${filename}.js`; var src = fs.readFileSync(srcFile, 'utf8'); var srcMin = UglifyJS.minify(src, { - fromString: true + fromString: true, }).code; var destFile = new gutil.File({ path: `${filename}.js`, - contents: new Buffer(header + src) + contents: new Buffer(header + src), }); var destFileMin = new gutil.File({ path: `${filename}.min.js`, - contents: new Buffer(header + srcMin) + contents: new Buffer(header + srcMin), }); var out = through.obj(); @@ -54,6 +54,6 @@ gulp.task('build:react-dom', function() { merge([ reactDom, - reactDomServer + reactDomServer, ]); }); From 2fd26f1a4d3b9b82a26625f9fe0847df8024fbc3 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 13:36:31 -0400 Subject: [PATCH 14/17] Add back removed grunt tasks using gulp Added the previously removed grunt tasks and just have them call the gulp tasks. This keeps things backwards-compatible, while still allowing for the gulp migration. Also reverted the changes to Travis CI, so hopefully there should be no issues there. --- .travis.yml | 6 ++---- Gruntfile.js | 10 ++++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 535d95938327..8ecb5b86618f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -82,8 +82,6 @@ script: ./node_modules/.bin/grunt jest:normal git checkout -- src/renderers/dom/shared/ReactDOMFeatureFlags.js ./node_modules/.bin/gulp react:extract-errors - elif [[ "$TEST_TYPE" = gulp_* ]]; then - ./node_modules/.bin/gulp ${TEST_TYPE:5} else ./node_modules/.bin/grunt $TEST_TYPE fi @@ -91,8 +89,8 @@ env: matrix: - TEST_TYPE=build - TEST_TYPE=test - - TEST_TYPE=gulp_lint - - TEST_TYPE=gulp_flow + - TEST_TYPE=lint + - TEST_TYPE=flow - TEST_TYPE=build_website global: # SERVER diff --git a/Gruntfile.js b/Gruntfile.js index de1c186672cb..65622edd0b8b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -52,6 +52,16 @@ module.exports = function(grunt) { grunt.loadNpmTasks(npmTaskName); }); + grunt.registerTask('eslint', function() { + spawnGulp(['eslint'], null, this.async()); + }); + + grunt.registerTask('lint', ['eslint']); + + grunt.registerTask('flow', function() { + spawnGulp(['flow'], null, this.async()); + }); + grunt.registerTask('delete-build-modules', function() { // Use gulp here. spawnGulp(['react:clean'], null, this.async()); From 5d88636f5d091ff2c6460f3906def42a78de2c5f Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 13:45:51 -0400 Subject: [PATCH 15/17] Add some color to `eslint` and `flow` output --- gulp/tasks/eslint.js | 12 ++++++++++-- gulp/tasks/flow.js | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/gulp/tasks/eslint.js b/gulp/tasks/eslint.js index d9eabe548090..9fbd1458050e 100644 --- a/gulp/tasks/eslint.js +++ b/gulp/tasks/eslint.js @@ -29,11 +29,19 @@ gulp.task('eslint', function(done) { } ).on('close', function(code) { if (code !== 0) { - gutil.log('Lint failed'); + gutil.log( + gutil.colors.red( + 'Lint failed' + ) + ); process.exit(code); } - gutil.log('Lint passed'); + gutil.log( + gutil.colors.green( + 'Lint passed' + ) + ); done(); }); }); diff --git a/gulp/tasks/flow.js b/gulp/tasks/flow.js index cd3056e54bad..4ec839916c76 100644 --- a/gulp/tasks/flow.js +++ b/gulp/tasks/flow.js @@ -30,11 +30,19 @@ gulp.task('flow', function(done) { } ).on('close', function(code) { if (code !== 0) { - gutil.log('Flow failed'); + gutil.log( + gutil.colors.red( + 'Flow failed' + ) + ); process.exit(code); } - gutil.log('Flow passed'); + gutil.log( + gutil.colors.green( + 'Flow passed' + ) + ); done(); }); }); From fc9b7906e5a131d058e8bc1a5dedff0ec5a3d72a Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 14:20:27 -0400 Subject: [PATCH 16/17] Add helper functions for creating file headers --- gulp/helpers.js | 32 ++++++++++++++++++++++++++++++++ gulp/tasks/react-dom.js | 8 ++------ 2 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 gulp/helpers.js diff --git a/gulp/helpers.js b/gulp/helpers.js new file mode 100644 index 000000000000..23a47bdf80e8 --- /dev/null +++ b/gulp/helpers.js @@ -0,0 +1,32 @@ +/** + * 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 fs = require('fs'); + +function buildHeader(name, version, templateFile) { + var TEMPLATE = fs.readFileSync(templateFile, 'utf8'); + return TEMPLATE + .replace('<%= package %>', name) + .replace('<%= version %>', version); +} + +function buildSimpleHeader(name, version) { + return buildHeader(name, version, './gulp/data/header-template-short.txt'); +} + +function buildLicenseHeader(name, version) { + return buildHeader(name, version, './gulp/data/header-template-extended.txt'); +} + +module.exports = { + buildSimpleHeader, + buildLicenseHeader +}; diff --git a/gulp/tasks/react-dom.js b/gulp/tasks/react-dom.js index 4155ef73c327..b348c7b60c2c 100644 --- a/gulp/tasks/react-dom.js +++ b/gulp/tasks/react-dom.js @@ -15,16 +15,12 @@ var fs = require('fs'); var merge = require('merge2'); var through = require('through2'); var UglifyJS = require('uglify-js'); +var helpers = require('../helpers'); var packageJson = require('../../package.json'); function build(name, filename) { - var LICENSE_TEMPLATE = - fs.readFileSync('./gulp/data/header-template-extended.txt', 'utf8'); - var header = LICENSE_TEMPLATE - .replace('<%= package %>', name) - .replace('<%= version %>', packageJson.version); - + var header = helpers.buildLicenseHeader(name, packageJson.version); var srcFile = `vendor/${filename}.js`; var src = fs.readFileSync(srcFile, 'utf8'); var srcMin = UglifyJS.minify(src, { From 457c77c5856dbf985b6f23040546852920c107eb Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 2 Jul 2016 14:31:47 -0400 Subject: [PATCH 17/17] Fix listing issues in gulp helpers --- gulp/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulp/helpers.js b/gulp/helpers.js index 23a47bdf80e8..dd3550e1c322 100644 --- a/gulp/helpers.js +++ b/gulp/helpers.js @@ -28,5 +28,5 @@ function buildLicenseHeader(name, version) { module.exports = { buildSimpleHeader, - buildLicenseHeader + buildLicenseHeader, };