Build standalone react-addons packages

This commit is contained in:
Paul O’Shannessy 2015-06-20 20:29:40 -07:00
parent bbadc15ac1
commit 79561342c3
4 changed files with 133 additions and 0 deletions

View File

@ -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',
]);

View File

@ -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,
};

View File

@ -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],
};

View File

@ -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"
}
}