From 82a082a79442cf00fea47bd2eee98f187704c0f9 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Fri, 22 May 2015 17:12:10 -0700 Subject: [PATCH] [react-packager] Introduce buildPackage API --- packager/react-packager/index.js | 35 ++++++++------ .../react-packager/src/Packager/Package.js | 9 ++-- .../src/Packager/__tests__/Package-test.js | 20 ++++++++ .../src/Server/__tests__/Server-test.js | 28 ++++++++++- packager/react-packager/src/Server/index.js | 47 +++++++++++++++---- 5 files changed, 111 insertions(+), 28 deletions(-) diff --git a/packager/react-packager/index.js b/packager/react-packager/index.js index a7b6264b7..6be111997 100644 --- a/packager/react-packager/index.js +++ b/packager/react-packager/index.js @@ -18,14 +18,17 @@ exports.middleware = function(options) { return server.processRequest.bind(server); }; -exports.buildPackageFromUrl = function(options, reqUrl) { - Activity.disable(); - // Don't start the filewatcher or the cache. - if (options.nonPersistent == null) { - options.nonPersistent = true; - } +exports.buildPackage = function(options, packageOptions) { + var server = createServer(options); + return server.buildPackage(packageOptions) + .then(function(p) { + server.end(); + return p; + }); +}; - var server = new Server(options); +exports.buildPackageFromUrl = function(options, reqUrl) { + var server = createServer(options); return server.buildPackageFromUrl(reqUrl) .then(function(p) { server.end(); @@ -34,13 +37,7 @@ exports.buildPackageFromUrl = function(options, reqUrl) { }; exports.getDependencies = function(options, main) { - Activity.disable(); - // Don't start the filewatcher or the cache. - if (options.nonPersistent == null) { - options.nonPersistent = true; - } - - var server = new Server(options); + var server = createServer(options); return server.getDependencies(main) .then(function(r) { server.end(); @@ -60,3 +57,13 @@ function useGracefulFs() { } }); } + +function createServer(options) { + Activity.disable(); + // Don't start the filewatcher or the cache. + if (options.nonPersistent == null) { + options.nonPersistent = true; + } + + return new Server(options); +} diff --git a/packager/react-packager/src/Packager/Package.js b/packager/react-packager/src/Packager/Package.js index 70f57c4ab..6b5389461 100644 --- a/packager/react-packager/src/Packager/Package.js +++ b/packager/react-packager/src/Packager/Package.js @@ -15,6 +15,8 @@ var ModuleTransport = require('../lib/ModuleTransport'); module.exports = Package; +var SOURCEMAPPING_URL = '\n\/\/@ sourceMappingURL='; + function Package(sourceMapUrl) { this._finalized = false; this._modules = []; @@ -96,12 +98,11 @@ Package.prototype.getSource = function(options) { } var source = this._getSource(); - source += '\n\/\/@ sourceMappingURL='; if (options.inlineSourceMap) { - source += this._getInlineSourceMap(); - } else { - source += this._sourceMapUrl; + source += SOURCEMAPPING_URL + this._getInlineSourceMap(); + } else if (this._sourceMapUrl) { + source += SOURCEMAPPING_URL + this._sourceMapUrl; } return source; diff --git a/packager/react-packager/src/Packager/__tests__/Package-test.js b/packager/react-packager/src/Packager/__tests__/Package-test.js index 1d8c3dd12..d43c65c0f 100644 --- a/packager/react-packager/src/Packager/__tests__/Package-test.js +++ b/packager/react-packager/src/Packager/__tests__/Package-test.js @@ -47,6 +47,26 @@ describe('Package', function() { ].join('\n')); }); + it('should be ok to leave out the source map url', function() { + var p = new Package(); + p.addModule(new ModuleTransport({ + code: 'transformed foo;', + sourceCode: 'source foo', + sourcePath: 'foo path', + })); + p.addModule(new ModuleTransport({ + code: 'transformed bar;', + sourceCode: 'source bar', + sourcePath: 'bar path', + })); + + p.finalize({}); + expect(p.getSource()).toBe([ + 'transformed foo;', + 'transformed bar;', + ].join('\n')); + }); + it('should create a package and add run module code', function() { ppackage.addModule(new ModuleTransport({ code: 'transformed foo;', diff --git a/packager/react-packager/src/Server/__tests__/Server-test.js b/packager/react-packager/src/Server/__tests__/Server-test.js index 58a1aca79..e4e7b5088 100644 --- a/packager/react-packager/src/Server/__tests__/Server-test.js +++ b/packager/react-packager/src/Server/__tests__/Server-test.js @@ -230,7 +230,7 @@ describe('processRequest', function() { }); }); - describe.only('/assets endpoint', function() { + describe('/assets endpoint', function() { var AssetServer; beforeEach(function() { AssetServer = require('../../AssetServer'); @@ -257,4 +257,30 @@ describe('processRequest', function() { }); }); + + describe('buildPackage(options)', function() { + it('Calls the packager with the correct args', function() { + server.buildPackage({ + entryFile: 'foo file' + }); + expect(Packager.prototype.package).toBeCalledWith( + 'foo file', + true, + undefined, + true + ); + }); + }); + + describe('buildPackageFromUrl(options)', function() { + it('Calls the packager with the correct args', function() { + server.buildPackageFromUrl('/path/to/foo.bundle?dev=false&runModule=false'); + expect(Packager.prototype.package).toBeCalledWith( + 'path/to/foo.js', + false, + '/path/to/foo.map', + false + ); + }); + }); }); diff --git a/packager/react-packager/src/Server/index.js b/packager/react-packager/src/Server/index.js index d4da5ae10..0ce5c5847 100644 --- a/packager/react-packager/src/Server/index.js +++ b/packager/react-packager/src/Server/index.js @@ -129,7 +129,7 @@ Server.prototype._onFileChange = function(type, filepath, root) { }; Server.prototype._rebuildPackages = function() { - var buildPackage = this._buildPackage.bind(this); + var buildPackage = this.buildPackage.bind(this); var packages = this._packages; Object.keys(packages).forEach(function(key) { var options = getOptionsFromUrl(key); @@ -171,18 +171,47 @@ Server.prototype.end = function() { ]); }; -Server.prototype._buildPackage = function(options) { +var packageOpts = declareOpts({ + sourceMapUrl: { + type: 'string', + required: false, + }, + entryFile: { + type: 'string', + required: true, + }, + dev: { + type: 'boolean', + default: true, + }, + minify: { + type: 'boolean', + default: false, + }, + runModule: { + type: 'boolean', + default: true, + }, + inlineSourceMap: { + type: 'boolean', + default: false, + }, +}); + +Server.prototype.buildPackage = function(options) { + var opts = packageOpts(options); + return this._packager.package( - options.main, - options.runModule, - options.sourceMapUrl, - options.dev + opts.entryFile, + opts.runModule, + opts.sourceMapUrl, + opts.dev ); }; Server.prototype.buildPackageFromUrl = function(reqUrl) { var options = getOptionsFromUrl(reqUrl); - return this._buildPackage(options); + return this.buildPackage(options); }; Server.prototype.getDependencies = function(main) { @@ -321,7 +350,7 @@ Server.prototype.processRequest = function(req, res, next) { var startReqEventId = Activity.startEvent('request:' + req.url); var options = getOptionsFromUrl(req.url); - var building = this._packages[req.url] || this._buildPackage(options); + var building = this._packages[req.url] || this.buildPackage(options); this._packages[req.url] = building; building.then( @@ -363,7 +392,7 @@ function getOptionsFromUrl(reqUrl) { return { sourceMapUrl: pathname.replace(/\.bundle$/, '.map'), - main: entryFile, + entryFile: entryFile, dev: getBoolOptionFromQuery(urlObj.query, 'dev', true), minify: getBoolOptionFromQuery(urlObj.query, 'minify'), runModule: getBoolOptionFromQuery(urlObj.query, 'runModule', true),