From 79561342c33fbe00fd623760f8f536d2944c03fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20O=E2=80=99Shannessy?= Date: Sat, 20 Jun 2015 20:29:40 -0700 Subject: [PATCH 1/2] Build standalone react-addons packages --- Gruntfile.js | 6 ++ grunt/tasks/npm-react-addons.js | 114 +++++++++++++++++++++++++++++ grunt/tasks/version-check.js | 4 + packages/react-addons/package.json | 9 +++ 4 files changed, 133 insertions(+) create mode 100644 grunt/tasks/npm-react-addons.js create mode 100644 packages/react-addons/package.json diff --git a/Gruntfile.js b/Gruntfile.js index e01b2f5bf9..b6639d33ff 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -75,6 +75,10 @@ module.exports = function(grunt) { var npmReactDOMTasks = require('./grunt/tasks/npm-react-dom'); grunt.registerTask('npm-react-dom:pack', npmReactDOMTasks.packRelease); + var npmReactAddonsTasks = require('./grunt/tasks/npm-react-addons'); + grunt.registerTask('npm-react-addons:release', npmReactAddonsTasks.buildReleases); + grunt.registerTask('npm-react-addons:pack', npmReactAddonsTasks.packReleases); + var gemReactSourceTasks = require('./grunt/tasks/gem-react-source'); grunt.registerTask('gem-react-source:release', gemReactSourceTasks.buildRelease); grunt.registerTask('gem-react-source:pack', gemReactSourceTasks.packRelease); @@ -228,6 +232,8 @@ module.exports = function(grunt) { 'npm-react-tools:release', 'npm-react-tools:pack', 'npm-react-dom:pack', + 'npm-react-addons:release', + 'npm-react-addons:pack', 'compare_size', ]); diff --git a/grunt/tasks/npm-react-addons.js b/grunt/tasks/npm-react-addons.js new file mode 100644 index 0000000000..ae19ec3955 --- /dev/null +++ b/grunt/tasks/npm-react-addons.js @@ -0,0 +1,114 @@ +'use strict'; + +var assign = require('object-assign'); +var fs = require('fs'); +var grunt = require('grunt'); +var path = require('path'); + +var addons = { + CSSTransitionGroup: { + module: 'ReactCSSTransitionGroup', + name: 'css-transition-group', + }, + LinkedStateMixin: { + module: 'LinkedStateMixin', + name: 'linked-state-mixin', + }, + PureRenderMixin: { + module: 'ReactComponentWithPureRenderMixin', + name: 'pure-render-mixin', + }, + TransitionGroup: { + module: 'ReactTransitionGroup', + name: 'transition-group', + }, + batchedUpdates: { + module: 'ReactUpdates', + method: 'batchedUpdates', + name: 'batched-updates', + }, + cloneWithProps: { + module: 'cloneWithProps', + name: 'clone-with-props', + }, + createFragment: { + module: 'ReactFragment', + method: 'create', + name: 'create-fragment', + }, + shallowCompare: { + module: 'shallowCompare', + name: 'shallow-compare', + }, + updates: { + module: 'updates', + name: 'updates', + }, +}; + +function generateSource(info) { + var pieces = [ + "module.exports = require('react/lib/", + info.module, + "')", + ]; + if (info.method) { + pieces.push('.', info.method); + } + pieces.push(';'); + return pieces.join(''); +} + +function buildReleases() { + var pkgTemplate = grunt.file.readJSON('./packages/react-addons/package.json'); + // var done = this.async(); + Object.keys(addons).map(function(k) { + var info = addons[k]; + var pkgName = 'react-addons-' + info.name; + var destDir = 'build/packages/' + pkgName; + + var pkgData = assign({}, pkgTemplate); + pkgData.name = pkgName; + + grunt.file.mkdir(destDir); + fs.writeFileSync(path.join(destDir, 'index.js'), generateSource(info)); + fs.writeFileSync(path.join(destDir, 'package.json'), JSON.stringify(pkgData, null, 2)); + + // TODO: Make a readme. Consider using a template and sticking it in the original source directory. Also, maybe a license, patents file. + }); + // done(); +} + +function packReleases() { + var done = this.async(); + var count = 0; + + var addonKeys = Object.keys(addons); + + addonKeys.forEach(function(k) { + var info = addons[k]; + var pkgName = 'react-addons-' + info.name; + var pkgDir = 'build/packages/' + pkgName; + + var spawnCmd = { + cmd: 'npm', + args: ['pack', pkgDir], + }; + grunt.util.spawn(spawnCmd, function() { + var buildSrc = pkgName + '-' + grunt.config.data.pkg.version + '.tgz'; + var buildDest = 'build/packages/' + pkgName + '.tgz'; + fs.rename(buildSrc, buildDest, maybeDone); + }); + }); + + function maybeDone() { + if (++count === addonKeys.length) { + done(); + } + } +} + +module.exports = { + buildReleases: buildReleases, + packReleases: packReleases, +}; diff --git a/grunt/tasks/version-check.js b/grunt/tasks/version-check.js index 43d15b478a..8da961b0bd 100644 --- a/grunt/tasks/version-check.js +++ b/grunt/tasks/version-check.js @@ -10,11 +10,15 @@ var reactVersionExp = /\bReact\.version\s*=\s*['"]([^'"]+)['"];/; 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-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/React.js': reactVersionExp.exec(grunt.file.read('./src/React.js'))[1], }; diff --git a/packages/react-addons/package.json b/packages/react-addons/package.json new file mode 100644 index 0000000000..b3a80f65f1 --- /dev/null +++ b/packages/react-addons/package.json @@ -0,0 +1,9 @@ +{ + "name": "react-addons", + "version": "0.14.0-alpha3", + "main": "index.js", + "license": "BSD-3-Clause", + "peerDependencies": { + "react": "^0.14.0-alpha3" + } +} From 33d5201a94c3b4cfee22ebd75344d18c81ecb22b Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Thu, 2 Jul 2015 23:26:47 +0200 Subject: [PATCH 2/2] Finish addons packaging - Add missing object-assign dependency - Add batchedUpdates to ReactDOMClient, rename the two addons to `unstable_` - Delete react/addons/* (leaving react/addons with a slightly updated warning) - Add README.md, LICENSE, PATENTS to each addons package --- grunt/tasks/npm-react-addons.js | 21 +++++++++++-------- package.json | 1 + packages/react/addons.js | 2 +- packages/react/addons/CSSTransitionGroup.js | 1 - packages/react/addons/LinkedStateMixin.js | 1 - packages/react/addons/Perf.js | 1 - packages/react/addons/PureRenderMixin.js | 1 - packages/react/addons/TestUtils.js | 1 - packages/react/addons/TransitionGroup.js | 1 - packages/react/addons/batchedUpdates.js | 1 - packages/react/addons/cloneWithProps.js | 1 - packages/react/addons/createFragment.js | 1 - .../addons/renderSubtreeIntoContainer.js | 1 - packages/react/addons/shallowCompare.js | 1 - packages/react/addons/update.js | 1 - src/renderers/dom/ReactDOMClient.js | 7 ++++++- 16 files changed, 20 insertions(+), 23 deletions(-) delete mode 100644 packages/react/addons/CSSTransitionGroup.js delete mode 100644 packages/react/addons/LinkedStateMixin.js delete mode 100644 packages/react/addons/Perf.js delete mode 100644 packages/react/addons/PureRenderMixin.js delete mode 100644 packages/react/addons/TestUtils.js delete mode 100644 packages/react/addons/TransitionGroup.js delete mode 100644 packages/react/addons/batchedUpdates.js delete mode 100644 packages/react/addons/cloneWithProps.js delete mode 100644 packages/react/addons/createFragment.js delete mode 100644 packages/react/addons/renderSubtreeIntoContainer.js delete mode 100644 packages/react/addons/shallowCompare.js delete mode 100644 packages/react/addons/update.js diff --git a/grunt/tasks/npm-react-addons.js b/grunt/tasks/npm-react-addons.js index ae19ec3955..4a427092c2 100644 --- a/grunt/tasks/npm-react-addons.js +++ b/grunt/tasks/npm-react-addons.js @@ -22,11 +22,6 @@ var addons = { module: 'ReactTransitionGroup', name: 'transition-group', }, - batchedUpdates: { - module: 'ReactUpdates', - method: 'batchedUpdates', - name: 'batched-updates', - }, cloneWithProps: { module: 'cloneWithProps', name: 'clone-with-props', @@ -61,7 +56,9 @@ function generateSource(info) { function buildReleases() { var pkgTemplate = grunt.file.readJSON('./packages/react-addons/package.json'); - // var done = this.async(); + var license = grunt.file.read('./LICENSE'); + var patents = grunt.file.read('./PATENTS'); + Object.keys(addons).map(function(k) { var info = addons[k]; var pkgName = 'react-addons-' + info.name; @@ -73,10 +70,16 @@ function buildReleases() { grunt.file.mkdir(destDir); fs.writeFileSync(path.join(destDir, 'index.js'), generateSource(info)); fs.writeFileSync(path.join(destDir, 'package.json'), JSON.stringify(pkgData, null, 2)); - - // TODO: Make a readme. Consider using a template and sticking it in the original source directory. Also, maybe a license, patents file. + fs.writeFileSync(path.join(destDir, 'LICENSE'), license); + fs.writeFileSync(path.join(destDir, 'PATENTS'), patents); + fs.writeFileSync( + path.join(destDir, 'README.md'), + '# ' + pkgName + '\n\n' + + 'This package provides the React ' + k + ' add-on. See ' + + 'http://facebook.github.io/react/docs/addons.html for more information.\n' + ); }); - // done(); + } function packReleases() { diff --git a/package.json b/package.json index 077fb33b9b..60a3873983 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "gzip-js": "~0.3.2", "jasmine-tapreporter": "~0.2.2", "jest-cli": "^0.4.13", + "object-assign": "^3.0.0", "optimist": "^0.6.1", "phantomjs": "^1.9.17", "platform": "^1.1.0", diff --git a/packages/react/addons.js b/packages/react/addons.js index 9f5051ed16..d5d95c64df 100644 --- a/packages/react/addons.js +++ b/packages/react/addons.js @@ -2,7 +2,7 @@ var warning = require('./lib/warning'); warning( false, "require('react/addons') is deprecated. " + - "Access using require('react/addons/{addon}') instead." + "Access using require('react-addons-{addon}') instead." ); module.exports = require('./lib/ReactWithAddons'); diff --git a/packages/react/addons/CSSTransitionGroup.js b/packages/react/addons/CSSTransitionGroup.js deleted file mode 100644 index 78174a8fa8..0000000000 --- a/packages/react/addons/CSSTransitionGroup.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/ReactCSSTransitionGroup'); diff --git a/packages/react/addons/LinkedStateMixin.js b/packages/react/addons/LinkedStateMixin.js deleted file mode 100644 index 907bc2ac4a..0000000000 --- a/packages/react/addons/LinkedStateMixin.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/LinkedStateMixin'); diff --git a/packages/react/addons/Perf.js b/packages/react/addons/Perf.js deleted file mode 100644 index ab1b17c199..0000000000 --- a/packages/react/addons/Perf.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/ReactDefaultPerf'); diff --git a/packages/react/addons/PureRenderMixin.js b/packages/react/addons/PureRenderMixin.js deleted file mode 100644 index 2d3abae2d0..0000000000 --- a/packages/react/addons/PureRenderMixin.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/ReactComponentWithPureRenderMixin'); diff --git a/packages/react/addons/TestUtils.js b/packages/react/addons/TestUtils.js deleted file mode 100644 index 39d4c0e0eb..0000000000 --- a/packages/react/addons/TestUtils.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/ReactTestUtils'); diff --git a/packages/react/addons/TransitionGroup.js b/packages/react/addons/TransitionGroup.js deleted file mode 100644 index b500e83b2d..0000000000 --- a/packages/react/addons/TransitionGroup.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/ReactTransitionGroup'); diff --git a/packages/react/addons/batchedUpdates.js b/packages/react/addons/batchedUpdates.js deleted file mode 100644 index ec519c29de..0000000000 --- a/packages/react/addons/batchedUpdates.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/ReactUpdates').batchedUpdates; diff --git a/packages/react/addons/cloneWithProps.js b/packages/react/addons/cloneWithProps.js deleted file mode 100644 index 86490f60d9..0000000000 --- a/packages/react/addons/cloneWithProps.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/cloneWithProps'); diff --git a/packages/react/addons/createFragment.js b/packages/react/addons/createFragment.js deleted file mode 100644 index 2eaa3be793..0000000000 --- a/packages/react/addons/createFragment.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/ReactFragment').create; diff --git a/packages/react/addons/renderSubtreeIntoContainer.js b/packages/react/addons/renderSubtreeIntoContainer.js deleted file mode 100644 index a03c55ff58..0000000000 --- a/packages/react/addons/renderSubtreeIntoContainer.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/renderSubtreeIntoContainer'); diff --git a/packages/react/addons/shallowCompare.js b/packages/react/addons/shallowCompare.js deleted file mode 100644 index 20f10b626d..0000000000 --- a/packages/react/addons/shallowCompare.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/shallowCompare'); diff --git a/packages/react/addons/update.js b/packages/react/addons/update.js deleted file mode 100644 index 9f01db55c2..0000000000 --- a/packages/react/addons/update.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../lib/update'); diff --git a/src/renderers/dom/ReactDOMClient.js b/src/renderers/dom/ReactDOMClient.js index 42224d3677..43dd5a4600 100644 --- a/src/renderers/dom/ReactDOMClient.js +++ b/src/renderers/dom/ReactDOMClient.js @@ -20,6 +20,7 @@ var ReactInstanceHandles = require('ReactInstanceHandles'); var ReactMount = require('ReactMount'); var ReactPerf = require('ReactPerf'); var ReactReconciler = require('ReactReconciler'); +var ReactUpdates = require('ReactUpdates'); var findDOMNode = require('findDOMNode'); var renderSubtreeIntoContainer = require('renderSubtreeIntoContainer'); @@ -33,7 +34,11 @@ var React = { findDOMNode: findDOMNode, render: render, unmountComponentAtNode: ReactMount.unmountComponentAtNode, - _renderSubtreeIntoContainer: renderSubtreeIntoContainer, + + /* eslint-disable camelcase */ + unstable_batchedUpdates: ReactUpdates.batchedUpdates, + unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer, + /* eslint-enable camelcase */ }; // Inject the runtime into a devtools global hook regardless of browser.