Build standalone react-addons packages
Paul O’Shannessy committed
Jun 20, 2015 at 20:29 UTC
79561342c33fbe00fd623760f8f536d2944c03fc
4 files changed
+133
Gruntfile.js
+6
@@ -75,6 +75,10 @@ module.exports = function(grunt) {
75
var npmReactDOMTasks = require('./grunt/tasks/npm-react-dom');
76
grunt.registerTask('npm-react-dom:pack', npmReactDOMTasks.packRelease);
77
78
+ var npmReactAddonsTasks = require('./grunt/tasks/npm-react-addons');
79
+ grunt.registerTask('npm-react-addons:release', npmReactAddonsTasks.buildReleases);
80
+ grunt.registerTask('npm-react-addons:pack', npmReactAddonsTasks.packReleases);
81
+
82
var gemReactSourceTasks = require('./grunt/tasks/gem-react-source');
83
grunt.registerTask('gem-react-source:release', gemReactSourceTasks.buildRelease);
84
grunt.registerTask('gem-react-source:pack', gemReactSourceTasks.packRelease);
@@ -228,6 +232,8 @@ module.exports = function(grunt) {
232
'npm-react-tools:release',
233
'npm-react-tools:pack',
234
'npm-react-dom:pack',
235
+ 'npm-react-addons:release',
236
+ 'npm-react-addons:pack',
237
'compare_size',
238
]);
239
grunt/tasks/npm-react-addons.js
new
+114
@@ -0,0 +1,114 @@
1
+'use strict';
2
+
3
+var assign = require('object-assign');
4
+var fs = require('fs');
5
+var grunt = require('grunt');
6
+var path = require('path');
7
+
8
+var addons = {
9
+ CSSTransitionGroup: {
10
+ module: 'ReactCSSTransitionGroup',
11
+ name: 'css-transition-group',
12
+ },
13
+ LinkedStateMixin: {
14
+ module: 'LinkedStateMixin',
15
+ name: 'linked-state-mixin',
16
+ },
17
+ PureRenderMixin: {
18
+ module: 'ReactComponentWithPureRenderMixin',
19
+ name: 'pure-render-mixin',
20
+ },
21
+ TransitionGroup: {
22
+ module: 'ReactTransitionGroup',
23
+ name: 'transition-group',
24
+ },
25
+ batchedUpdates: {
26
+ module: 'ReactUpdates',
27
+ method: 'batchedUpdates',
28
+ name: 'batched-updates',
29
+ },
30
+ cloneWithProps: {
31
+ module: 'cloneWithProps',
32
+ name: 'clone-with-props',
33
+ },
34
+ createFragment: {
35
+ module: 'ReactFragment',
36
+ method: 'create',
37
+ name: 'create-fragment',
38
+ },
39
+ shallowCompare: {
40
+ module: 'shallowCompare',
41
+ name: 'shallow-compare',
42
+ },
43
+ updates: {
44
+ module: 'updates',
45
+ name: 'updates',
46
+ },
47
+};
48
+
49
+function generateSource(info) {
50
+ var pieces = [
51
+ "module.exports = require('react/lib/",
52
+ info.module,
53
+ "')",
54
+ ];
55
+ if (info.method) {
56
+ pieces.push('.', info.method);
57
+ }
58
+ pieces.push(';');
59
+ return pieces.join('');
60
+}
61
+
62
+function buildReleases() {
63
+ var pkgTemplate = grunt.file.readJSON('./packages/react-addons/package.json');
64
+ // var done = this.async();
65
+ Object.keys(addons).map(function(k) {
66
+ var info = addons[k];
67
+ var pkgName = 'react-addons-' + info.name;
68
+ var destDir = 'build/packages/' + pkgName;
69
+
70
+ var pkgData = assign({}, pkgTemplate);
71
+ pkgData.name = pkgName;
72
+
73
+ grunt.file.mkdir(destDir);
74
+ fs.writeFileSync(path.join(destDir, 'index.js'), generateSource(info));
75
+ fs.writeFileSync(path.join(destDir, 'package.json'), JSON.stringify(pkgData, null, 2));
76
+
77
+ // TODO: Make a readme. Consider using a template and sticking it in the original source directory. Also, maybe a license, patents file.
78
+ });
79
+ // done();
80
+}
81
+
82
+function packReleases() {
83
+ var done = this.async();
84
+ var count = 0;
85
+
86
+ var addonKeys = Object.keys(addons);
87
+
88
+ addonKeys.forEach(function(k) {
89
+ var info = addons[k];
90
+ var pkgName = 'react-addons-' + info.name;
91
+ var pkgDir = 'build/packages/' + pkgName;
92
+
93
+ var spawnCmd = {
94
+ cmd: 'npm',
95
+ args: ['pack', pkgDir],
96
+ };
97
+ grunt.util.spawn(spawnCmd, function() {
98
+ var buildSrc = pkgName + '-' + grunt.config.data.pkg.version + '.tgz';
99
+ var buildDest = 'build/packages/' + pkgName + '.tgz';
100
+ fs.rename(buildSrc, buildDest, maybeDone);
101
+ });
102
+ });
103
+
104
+ function maybeDone() {
105
+ if (++count === addonKeys.length) {
106
+ done();
107
+ }
108
+ }
109
+}
110
+
111
+module.exports = {
112
+ buildReleases: buildReleases,
113
+ packReleases: packReleases,
114
+};
grunt/tasks/version-check.js
+4
@@ -10,11 +10,15 @@ var reactVersionExp = /\bReact\.version\s*=\s*['"]([^'"]+)['"];/;
10
module.exports = function() {
11
var pkgVersion = grunt.config.data.pkg.version;
12
13
+ var addonsData = grunt.file.readJSON('./packages/react-addons/package.json');
14
var versions = {
15
'packages/react/package.json':
16
grunt.file.readJSON('./packages/react/package.json').version,
17
'packages/react-dom/package.json':
18
grunt.file.readJSON('./packages/react-dom/package.json').version,
19
+ 'packages/react-addons/package.json (version)': addonsData.version,
20
+ // Get the "version" without the range bit
21
+ 'packages/react-addons/package.json (react dependency)': addonsData.peerDependencies.react.slice(1),
22
'src/React.js': reactVersionExp.exec(grunt.file.read('./src/React.js'))[1],
23
};
24
packages/react-addons/package.json
new
+9
@@ -0,0 +1,9 @@
1
+{
2
+ "name": "react-addons",
3
+ "version": "0.14.0-alpha3",
4
+ "main": "index.js",
5
+ "license": "BSD-3-Clause",
6
+ "peerDependencies": {
7
+ "react": "^0.14.0-alpha3"
8
+ }
9
+}