diff --git a/react-packager/src/Bundler/index.js b/react-packager/src/Bundler/index.js index 824331c4..87e97d06 100644 --- a/react-packager/src/Bundler/index.js +++ b/react-packager/src/Bundler/index.js @@ -277,6 +277,29 @@ class Bundler { }); } + bundleForHMR({ + entryFile, + platform, + }) { + return this.getDependencies(entryFile, /*isDev*/true, platform).then(response => { + const module = response.dependencies.filter(module => module.path === entryFile)[0]; + + return Promise.all([ + module.getName(), + this._transformer.loadFileAndTransform(path.resolve(entryFile)), + ]).then(([moduleName, transformedSource]) => { + return (` + __accept( + '${moduleName}', + function(global, require, module, exports) { + ${transformedSource.code} + } + ); + `); + }); + }); + } + invalidateFile(filePath) { this._transformer.invalidateFile(filePath); } diff --git a/react-packager/src/Server/index.js b/react-packager/src/Server/index.js index c2acd305..668d3878 100644 --- a/react-packager/src/Server/index.js +++ b/react-packager/src/Server/index.js @@ -112,6 +112,17 @@ const bundleOpts = declareOpts({ } }); +const hmrBundleOpts = declareOpts({ + entryFile: { + type: 'string', + required: true, + }, + platform: { + type: 'string', + required: true, + }, +}); + const dependencyOpts = declareOpts({ platform: { type: 'string', @@ -220,6 +231,17 @@ class Server { return this.buildBundle(options); } + buildBundleForHMR(options) { + return Promise.resolve().then(() => { + if (!options.platform) { + options.platform = getPlatformExtension(options.entryFile); + } + + const opts = hmrBundleOpts(options); + return this._bundler.bundleForHMR(opts); + }); + } + getDependencies(options) { return Promise.resolve().then(() => { if (!options.platform) {