diff --git a/Gruntfile.js b/Gruntfile.js index a0ca9148dc9..f6f8ebf8778 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -2,7 +2,7 @@ var exec = require('child_process').exec; var jsxTask = require('./grunt/tasks/jsx'); -var browserifyTask = require('./grunt/tasks/browserify'); +var bundleTask = require('./grunt/tasks/bundle'); var populistTask = require('./grunt/tasks/populist'); var webdriverPhantomJSTask = require('./grunt/tasks/webdriver-phantomjs'); var webdriverJasmineTasks = require('./grunt/tasks/webdriver-jasmine'); @@ -19,7 +19,7 @@ module.exports = function(grunt) { pkg: grunt.file.readJSON('package.json'), copy: require('./grunt/config/copy'), jsx: require('./grunt/config/jsx'), - browserify: require('./grunt/config/browserify'), + bundle: require('./grunt/config/bundle'), populist: require('./grunt/config/populist'), connect: require('./grunt/config/server')(grunt), "webdriver-jasmine": require('./grunt/config/webdriver-jasmine'), @@ -52,8 +52,8 @@ module.exports = function(grunt) { // Register jsx:normal and :release tasks. grunt.registerMultiTask('jsx', jsxTask); - // Our own browserify-based tasks to build a single JS file build - grunt.registerMultiTask('browserify', browserifyTask); + // Our own bundle-based tasks to build a single JS file build + grunt.registerMultiTask('bundle', bundleTask); grunt.registerMultiTask('populist', populistTask); @@ -71,22 +71,22 @@ module.exports = function(grunt) { grunt.registerTask('version-check', versionCheckTask); - grunt.registerTask('build:basic', ['jsx:normal', 'version-check', 'browserify:basic']); - grunt.registerTask('build:addons', ['jsx:normal', 'browserify:addons']); - grunt.registerTask('build:transformer', ['jsx:normal', 'browserify:transformer']); - grunt.registerTask('build:min', ['jsx:normal', 'version-check', 'browserify:min']); - grunt.registerTask('build:addons-min', ['jsx:normal', 'browserify:addonsMin']); + grunt.registerTask('build:basic', ['jsx:normal', 'version-check', 'bundle:basic']); + grunt.registerTask('build:addons', ['jsx:normal', 'bundle:addons']); + grunt.registerTask('build:transformer', ['jsx:normal', 'bundle:transformer']); + grunt.registerTask('build:min', ['jsx:normal', 'version-check', 'bundle:min']); + grunt.registerTask('build:addons-min', ['jsx:normal', 'bundle:addonsMin']); grunt.registerTask('build:withCodeCoverageLogging', [ 'jsx:normal', 'version-check', - 'browserify:withCodeCoverageLogging' + 'bundle:withCodeCoverageLogging' ]); grunt.registerTask('build:perf', [ 'jsx:normal', 'version-check', - 'browserify:transformer', - 'browserify:basic', - 'browserify:min', + 'bundle:transformer', + 'bundle:basic', + 'bundle:min', 'download-previous-version' ]); grunt.registerTask('build:test', [ @@ -195,11 +195,11 @@ module.exports = function(grunt) { 'delete-build-modules', 'jsx:normal', 'version-check', - 'browserify:basic', - 'browserify:transformer', - 'browserify:addons', - 'browserify:min', - 'browserify:addonsMin', + 'bundle:basic', + 'bundle:transformer', + 'bundle:addons', + 'bundle:min', + 'bundle:addonsMin', 'npm-react:release', 'npm-react:pack', 'npm-react-tools:pack', diff --git a/grunt/config/browserify.js b/grunt/config/bundle.js similarity index 56% rename from grunt/config/browserify.js rename to grunt/config/bundle.js index 61481e43534..fd056515e34 100644 --- a/grunt/config/browserify.js +++ b/grunt/config/bundle.js @@ -3,11 +3,11 @@ 'use strict'; +var deamdify = require('deamdify'); var envify = require('envify/custom'); var es3ify = require('es3ify'); var grunt = require('grunt'); var UglifyJS = require('uglify-js'); -var uglifyify = require('uglifyify'); var _ = require('lodash'); var SIMPLE_TEMPLATE = @@ -55,66 +55,76 @@ function simpleBannerify(src) { '\n' + src; } -// Our basic config which we'll add to to make our other builds +function override(obj1, obj2) { + return _.merge({}, obj1, obj2, function (a, b) { + if (_.isArray(a)) { + return b; + } + }) +} + var basic = { - entries: [ - './build/modules/React.js' - ], - outfile: './build/react.js', - debug: false, - standalone: 'React', - transforms: [envify({NODE_ENV: 'development'})], - after: [es3ify.transform, simpleBannerify] + src: './build/modules/React.js', + dest: './build/react.js', + options: { + debug: false, + standalone: 'React', + transforms: [envify({NODE_ENV: 'development'})], + after: [es3ify.transform, simpleBannerify] + } }; -var min = _.merge({}, basic, { - outfile: './build/react.min.js', - debug: false, - transforms: [envify({NODE_ENV: 'production'}), uglifyify], - after: [minify, bannerify] +var min = override(basic, { + dest: './build/react.min.js', + options: { + debug: false, + transforms: [envify({NODE_ENV: 'production'})], + after: [minify, bannerify] + } }); var transformer = { - entries:[ - './vendor/browser-transforms.js' - ], - outfile: './build/JSXTransformer.js', - debug: false, - standalone: 'JSXTransformer', - after: [es3ify.transform, simpleBannerify] + src: './vendor/browser-transforms.js', + dest: './build/JSXTransformer.js', + options: { + debug: false, + standalone: 'JSXTransformer', + transforms: [deamdify], + after: [es3ify.transform, simpleBannerify] + } }; var addons = { - entries: [ - './build/modules/ReactWithAddons.js' - ], - outfile: './build/react-with-addons.js', - debug: false, - standalone: 'React', - transforms: [envify({NODE_ENV: 'development'})], - packageName: 'React (with addons)', - after: [es3ify.transform, simpleBannerify] + src: './build/modules/ReactWithAddons.js', + dest: './build/react-with-addons.js', + options: { + debug: false, + standalone: 'React', + transforms: [envify({NODE_ENV: 'development'})], + packageName: 'React (with addons)', + after: [es3ify.transform, simpleBannerify] + } }; -var addonsMin = _.merge({}, addons, { - outfile: './build/react-with-addons.min.js', - debug: false, - transforms: [envify({NODE_ENV: 'production'}), uglifyify], - after: [minify, bannerify] +var addonsMin = override(addons, { + dest: './build/react-with-addons.min.js', + options: { + debug: false, + transforms: [envify({NODE_ENV: 'production'})], + after: [minify, bannerify] + } }); -var withCodeCoverageLogging = { - entries: [ - './build/modules/React.js' - ], - outfile: './build/react.js', - debug: true, - standalone: 'React', - transforms: [ - envify({NODE_ENV: 'development'}), - require('coverify') - ] -}; +var withCodeCoverageLogging = override(basic, { + options: { + debug: true, + transforms: [ + envify({NODE_ENV: 'development'}), + require('coverify') + ], + after: [] + } +}); module.exports = { basic: basic, diff --git a/grunt/tasks/browserify.js b/grunt/tasks/browserify.js deleted file mode 100644 index e36c545e17b..00000000000 --- a/grunt/tasks/browserify.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -var browserify = require('browserify'); -var grunt = require('grunt'); - -module.exports = function() { - var config = this.data; - - // This task is async... - var done = this.async(); - - // More/better assertions - // grunt.config.requires('outfile'); - // grunt.config.requires('entries'); - config.transforms = config.transforms || []; - config.after = config.after || []; - if (typeof config.after === 'function') { - config.after = [config.after]; - } - - // create the bundle we'll work with - var entries = grunt.file.expand(config.entries); - var bundle = browserify(entries); - - // Make sure the things that need to be exposed are. - var requires = config.requires || {}; - if (requires instanceof Array) { - grunt.file.expand({ - nonull: true, // Keep IDs that don't expand to anything. - cwd: "src" - }, requires).forEach(function(name) { - bundle.require("./build/modules/" + name, { - expose: name.replace(/\.js$/i, "") - }); - }); - } else if (typeof requires === "object") { - Object.keys(requires).forEach(function(name) { - bundle.require(requires[name], { expose: name }); - }); - } - - // Extract other options - var options = { - debug: config.debug, // sourcemaps - standalone: config.standalone // global - }; - - // TODO: make sure this works, test with this too - config.transforms.forEach(function(transform) { - bundle.transform({}, transform); - }); - - // Actually bundle it up - var _this = this; - bundle.bundle(options, function(err, src) { - if (err) { - grunt.log.error(err); - done(); - } - - config.after.forEach(function(fn) { - src = fn.call(_this, src); - }); - - grunt.file.write(config.outfile, src); - done(); - }); -}; diff --git a/grunt/tasks/bundle.js b/grunt/tasks/bundle.js new file mode 100644 index 00000000000..692c55642c3 --- /dev/null +++ b/grunt/tasks/bundle.js @@ -0,0 +1,38 @@ +'use strict'; + +var cjs = require('pure-cjs'); +var grunt = require('grunt'); + +module.exports = function() { + var config = this.options({ + transforms: [], + after: [] + }); + + // This task is async... + var done = this.async(); + + // Extract options + var options = { + input: this.files[0].src[0], + output: this.files[0].dest, + map: config.debug, // sourcemaps + exports: config.standalone, // global + transform: config.transforms, + dryRun: true // we will write to disk ourselves + }; + + // Actually bundle it up + var _this = this; + + cjs.transform(options).then(function(result) { + grunt.file.write(result.options.output, config.after.reduce(function(src, fn) { + return fn.call(_this, src); + }, result.code)); + + done(); + }, function(err) { + grunt.log.error(err); + done(false); + }); +}; diff --git a/package.json b/package.json index 0860f2f5877..8d54d45edb0 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,8 @@ }, "devDependencies": { "benchmark": "~1.0.0", - "browserify": "~3.20.0", "coverify": "~1.0.4", + "deamdify": "~0.1.1", "envify": "~1.2.0", "es3ify": "~0.1.2", "es5-shim": "~2.3.0", @@ -61,6 +61,7 @@ "phantomjs": "~1.9", "platform": "~1.0.0", "populist": "~0.1.6", + "pure-cjs": "~1.9.0", "recast": "~0.5.6", "sauce-tunnel": "~1.1.0", "semver": "~2.2.1", diff --git a/vendor/browser-transforms.js b/vendor/browser-transforms.js index 26c48a7f9b7..a35db1e9cd5 100644 --- a/vendor/browser-transforms.js +++ b/vendor/browser-transforms.js @@ -20,7 +20,6 @@ var runScripts; var headEl; -var buffer = require('buffer'); var transform = require('jstransform').transform; var visitors = require('./fbtransform/visitors').transformVisitors; var docblock = require('jstransform/src/docblock'); @@ -123,7 +122,7 @@ var transformCode = function(code, source) { return ( transformed.code + '//# sourceMappingURL=data:application/json;base64,' + - buffer.Buffer(JSON.stringify(map)).toString('base64') + btoa(unescape(encodeURIComponent(JSON.stringify(map)))) ); } else { return code;