From 16fc8d24f4c25bb944e6fd796d326683330eb9d0 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Fri, 31 Mar 2017 13:46:09 +0100 Subject: [PATCH] removed gulp and grunt and moved tasks to standalone node script --- Gruntfile.js | 202 ---------------- circle.yml | 1 - grunt/config/browserify.js | 275 ---------------------- grunt/config/compare_size.js | 17 -- grunt/config/npm.js | 3 - grunt/data/header-template-extended.txt | 11 - grunt/data/header-template-short.txt | 3 - grunt/tasks/browserify.js | 69 ------ grunt/tasks/jest.js | 51 ----- grunt/tasks/npm-react-dom.js | 67 ------ grunt/tasks/npm-react-native.js | 52 ----- grunt/tasks/npm-react-noop.js | 52 ----- grunt/tasks/npm-react-test.js | 52 ----- grunt/tasks/npm-react.js | 73 ------ grunt/tasks/npm.js | 100 -------- grunt/tasks/release.js | 115 ---------- gulp/tasks/eslint.js | 48 ---- gulp/tasks/flow.js | 49 ---- gulp/tasks/version-check.js | 52 ----- gulpfile.js | 291 ------------------------ package.json | 18 +- scripts/tasks/eslint.js | 33 +++ scripts/tasks/flow.js | 33 +++ scripts/tasks/version-check.js | 39 ++++ 24 files changed, 110 insertions(+), 1596 deletions(-) delete mode 100644 Gruntfile.js delete mode 100644 grunt/config/browserify.js delete mode 100644 grunt/config/compare_size.js delete mode 100644 grunt/config/npm.js delete mode 100644 grunt/data/header-template-extended.txt delete mode 100644 grunt/data/header-template-short.txt delete mode 100644 grunt/tasks/browserify.js delete mode 100644 grunt/tasks/jest.js delete mode 100644 grunt/tasks/npm-react-dom.js delete mode 100644 grunt/tasks/npm-react-native.js delete mode 100644 grunt/tasks/npm-react-noop.js delete mode 100644 grunt/tasks/npm-react-test.js delete mode 100644 grunt/tasks/npm-react.js delete mode 100644 grunt/tasks/npm.js delete mode 100644 grunt/tasks/release.js delete mode 100644 gulp/tasks/eslint.js delete mode 100644 gulp/tasks/flow.js delete mode 100644 gulp/tasks/version-check.js delete mode 100644 gulpfile.js create mode 100644 scripts/tasks/eslint.js create mode 100644 scripts/tasks/flow.js create mode 100644 scripts/tasks/version-check.js diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 58c832e29c..0000000000 --- a/Gruntfile.js +++ /dev/null @@ -1,202 +0,0 @@ -'use strict'; - -var path = require('path'); - -var GULP_EXE = 'gulp'; -if (process.platform === 'win32') { - GULP_EXE += '.cmd'; -} - -module.exports = function(grunt) { - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - browserify: require('./grunt/config/browserify'), - npm: require('./grunt/config/npm'), - clean: [ - './build', - './*.gem', - './docs/_site', - './examples/shared/*.js', - '.module-cache', - ], - 'compare_size': require('./grunt/config/compare_size'), - }); - - function spawnGulp(args, opts, done) { - - grunt.util.spawn({ - // This could be more flexible (require.resolve & lookup bin in package) - // but if it breaks we'll fix it then. - cmd: path.join('node_modules', '.bin', GULP_EXE), - args: args, - opts: Object.assign({stdio: 'inherit'}, opts), - }, function(err, result, code) { - if (err) { - grunt.fail.fatal('Something went wrong running gulp: ', result); - } - done(code === 0); - }); - } - - Object.keys(grunt.file.readJSON('package.json').devDependencies) - .filter(function(npmTaskName) { - return npmTaskName.indexOf('grunt-') === 0; - }) - .filter(function(npmTaskName) { - return npmTaskName !== 'grunt-cli'; - }) - .forEach(function(npmTaskName) { - grunt.loadNpmTasks(npmTaskName); - }); - - grunt.registerTask('eslint', function() { - // Use gulp here. - spawnGulp(['eslint'], null, this.async()); - }); - - grunt.registerTask('lint', ['eslint']); - - grunt.registerTask('flow', function() { - // Use gulp here. - spawnGulp(['flow'], null, this.async()); - }); - - grunt.registerTask('delete-build-modules', function() { - // Use gulp here. - spawnGulp(['react:clean'], null, this.async()); - }); - - // Our own browserify-based tasks to build a single JS file build. - grunt.registerMultiTask('browserify', require('./grunt/tasks/browserify')); - - grunt.registerMultiTask('npm', require('./grunt/tasks/npm')); - - var npmReactTasks = require('./grunt/tasks/npm-react'); - grunt.registerTask('npm-react:release', npmReactTasks.buildRelease); - grunt.registerTask('npm-react:pack', npmReactTasks.packRelease); - - var npmReactDOMTasks = require('./grunt/tasks/npm-react-dom'); - grunt.registerTask('npm-react-dom:release', npmReactDOMTasks.buildRelease); - grunt.registerTask('npm-react-dom:pack', npmReactDOMTasks.packRelease); - - var npmReactNativeTasks = require('./grunt/tasks/npm-react-native'); - grunt.registerTask('npm-react-native:release', npmReactNativeTasks.buildRelease); - grunt.registerTask('npm-react-native:pack', npmReactNativeTasks.packRelease); - - var npmReactTestRendererTasks = require('./grunt/tasks/npm-react-test'); - grunt.registerTask('npm-react-test:release', npmReactTestRendererTasks.buildRelease); - grunt.registerTask('npm-react-test:pack', npmReactTestRendererTasks.packRelease); - - var npmReactNoopRendererTasks = require('./grunt/tasks/npm-react-noop'); - grunt.registerTask('npm-react-noop:release', npmReactNoopRendererTasks.buildRelease); - grunt.registerTask('npm-react-noop:pack', npmReactNoopRendererTasks.packRelease); - - grunt.registerTask('version-check', function() { - // Use gulp here. - spawnGulp(['version-check'], null, this.async()); - }); - - grunt.registerTask('build:basic', [ - 'build-modules', - 'version-check', - 'browserify:basic', - ]); - grunt.registerTask('build:min', [ - 'build-modules', - 'version-check', - 'browserify:min', - ]); - grunt.registerTask('build:dom', [ - 'build-modules', - 'version-check', - 'browserify:dom', - ]); - grunt.registerTask('build:dom-min', [ - 'build-modules', - 'version-check', - 'browserify:domMin', - ]); - grunt.registerTask('build:dom-server', [ - 'build-modules', - 'version-check', - 'browserify:domServer', - ]); - grunt.registerTask('build:dom-server-min', [ - 'build-modules', - 'version-check', - 'browserify:domServerMin', - ]); - grunt.registerTask('build:dom-fiber', [ - 'build-modules', - 'version-check', - 'browserify:domFiber', - ]); - grunt.registerTask('build:dom-fiber-min', [ - 'build-modules', - 'version-check', - 'browserify:domFiberMin', - ]); - grunt.registerTask('build:npm-react', [ - 'version-check', - 'build-modules', - 'npm-react:release', - ]); - - var jestTasks = require('./grunt/tasks/jest'); - grunt.registerTask('jest:normal', jestTasks.normal); - grunt.registerTask('jest:coverage', jestTasks.coverage); - - grunt.registerTask('test', ['jest:normal']); - grunt.registerTask('npm:test', ['build', 'npm:pack']); - - // Optimized build task that does all of our builds. The subtasks will be run - // in order so we can take advantage of that and only run build-modules once. - grunt.registerTask('build', [ - 'delete-build-modules', - 'build-modules', - 'version-check', - 'browserify:basic', - 'browserify:min', - 'browserify:dom', - 'browserify:domMin', - 'browserify:domServer', - 'browserify:domServerMin', - 'browserify:domFiber', - 'browserify:domFiberMin', - 'npm-react:release', - 'npm-react:pack', - 'npm-react-dom:release', - 'npm-react-dom:pack', - 'npm-react-native:release', - 'npm-react-native:pack', - 'npm-react-test:release', - 'npm-react-test:pack', - 'npm-react-noop:release', - 'npm-react-noop:pack', - 'compare_size', - ]); - - // Automate the release! - var releaseTasks = require('./grunt/tasks/release'); - grunt.registerTask('release:setup', releaseTasks.setup); - grunt.registerTask('release:bower', releaseTasks.bower); - grunt.registerTask('release:docs', releaseTasks.docs); - grunt.registerTask('release:msg', releaseTasks.msg); - - grunt.registerTask('release', [ - 'release:setup', - 'clean', - 'build', - 'release:bower', - 'release:docs', - 'release:msg', - ]); - - grunt.registerTask('build-modules', function() { - spawnGulp(['react:modules'], null, this.async()); - }); - - // The default task - build - to keep setup easy. - grunt.registerTask('default', ['build']); -}; diff --git a/circle.yml b/circle.yml index ef3dca1987..aa79370486 100644 --- a/circle.yml +++ b/circle.yml @@ -33,7 +33,6 @@ dependencies: # - npm ls --depth=0 cache_directories: - docs/vendor/bundle - - .grunt # Show size comparisons between builds - ~/react-gh-pages # docs checkout - ~/.yarn - ~/.yarn-cache diff --git a/grunt/config/browserify.js b/grunt/config/browserify.js deleted file mode 100644 index 4cbdef2b25..0000000000 --- a/grunt/config/browserify.js +++ /dev/null @@ -1,275 +0,0 @@ -/*eslint-disable no-multi-str */ - -'use strict'; - -var envify = require('loose-envify/custom'); -var grunt = require('grunt'); -var UglifyJS = require('uglify-js'); -var uglifyify = require('uglifyify'); -var derequire = require('derequire'); -var aliasify = require('aliasify'); -var collapser = require('bundle-collapser/plugin'); - -var envifyDev = envify({NODE_ENV: process.env.NODE_ENV || 'development'}); -var envifyProd = envify({NODE_ENV: process.env.NODE_ENV || 'production'}); - -var shimSharedModules = aliasify.configure({ - 'aliases': { - 'react/lib/React': 'react/lib/ReactUMDShim', - 'react/lib/ReactCurrentOwner': 'react/lib/ReactCurrentOwnerUMDShim', - 'react/lib/ReactComponentTreeHook': 'react/lib/ReactComponentTreeHookUMDShim', - }, -}); - -var SIMPLE_TEMPLATE = - grunt.file.read('./grunt/data/header-template-short.txt'); - -var LICENSE_TEMPLATE = - grunt.file.read('./grunt/data/header-template-extended.txt'); - -function minify(src) { - return UglifyJS.minify(src, { - fromString: true, - output: { - comments(node, comment) { - // Preserve license headers in dependencies like object-assign. - if (comment.type === 'comment2') { - return /@license/i.test(comment.value); - } - return false; - }, - }, - }).code; -} - -// TODO: move this out to another build step maybe. -function bannerify(src) { - var version = grunt.config.data.pkg.version; - var packageName = this.data.packageName || this.data.standalone; - return ( - grunt.template.process( - LICENSE_TEMPLATE, - {data: {package: packageName, version: version}} - ) + - src - ); -} - -function simpleBannerify(src) { - var version = grunt.config.data.pkg.version; - var packageName = this.data.packageName || this.data.standalone; - return ( - grunt.template.process( - SIMPLE_TEMPLATE, - {data: {package: packageName, version: version}} - ) + - src - ); -} - -// What is happening here??? -// I'm glad you asked. It became really hard to make our bundle splitting work. -// Everything is fine in node and when bundling with those packages, but when -// using our pre-packaged files, the splitting didn't work. Specifically due to -// the UMD wrappers defining their own require and creating their own encapsulated -// "registry" scope, we couldn't require across the boundaries. Webpack tries to -// be smart and looks for top-level requires (even when aliasing to a bundle), -// but since we didn't have those, we couldn't require 'react' from 'react-dom'. -// But we are already shimming in some modules that look for a global React -// variable. So we replace the UMD wrapper that browserify creates with out own, -// in 2 steps. -// 1. We swap out the browserify UMD with a plain function call. This ensures -// that the internal wrapper doesn't interact with the external state. By the -// time we're in the internal wrapper it doesn't matter what the external wrapper -// detected. Browserify insulates its CommonJS system inside closures so can just -// call that function and return it. -// 2. We put our own UMD wrapper around that fixed internal function, ensuring -// React is in scope. This outer wrapper is essentially the same UMD wrapper -// browserify would create, just handling the scope issue. -// Is this insane? Yes. -// Does it work? Yes. -// Should it go away ASAP? Yes. -function wrapperify(src) { - /* eslint-disable max-len*/ - var toReplace = - `function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.${this.data.standalone} = f()}}`; - /* eslint-enable max-len */ - if (src.indexOf(toReplace) === -1) { - throw new Error('wrapperify failed to find code to replace'); - } - src = src.replace( - toReplace, - `function(f){return f()}` - ); - return ` -;(function(f) { - // CommonJS - if (typeof exports === "object" && typeof module !== "undefined") { - module.exports = f(require('react')); - - // RequireJS - } else if (typeof define === "function" && define.amd) { - define(['react'], f); - - //