From c61100d0ceb4b71c86f01f35d7464d2d8a02b342 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Tue, 5 Apr 2016 01:12:13 -0700 Subject: [PATCH] Fix HMR on Windows Summary:Tested HMR on Windows and found 2 small issues related to paths that made it not work. Now it works nicely :) **Test plan (required)** Tested HMR in UIExplorer on Windows. Closes https://github.com/facebook/react-native/pull/6678 Differential Revision: D3138379 fb-gh-sync-id: f27cd2fa21f95954685c8c6916d820f41bc187be fbshipit-source-id: f27cd2fa21f95954685c8c6916d820f41bc187be --- babel-preset/configs/hmr.js | 6 ++++++ packager/react-packager/src/Bundler/index.js | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/babel-preset/configs/hmr.js b/babel-preset/configs/hmr.js index 9131810eb..d45d4369a 100644 --- a/babel-preset/configs/hmr.js +++ b/babel-preset/configs/hmr.js @@ -18,6 +18,12 @@ module.exports = function(options, filename) { var transform = filename ? './' + path.relative(path.dirname(filename), transformPath) // packager can't handle absolute paths : hmrTransform; + + // Fix the module path to use '/' on Windows. + if (path.sep === '\\') { + transform = transform.replace(/\\/g, '/'); + } + return { plugins: resolvePlugins([ [ diff --git a/packager/react-packager/src/Bundler/index.js b/packager/react-packager/src/Bundler/index.js index 2fd484c0b..30da6417e 100644 --- a/packager/react-packager/src/Bundler/index.js +++ b/packager/react-packager/src/Bundler/index.js @@ -189,23 +189,24 @@ class Bundler { ); } - _hmrURL(prefix, platform, extensionOverride, path) { - const matchingRoot = this._projectRoots.find(root => path.startsWith(root)); + _hmrURL(prefix, platform, extensionOverride, filePath) { + const matchingRoot = this._projectRoots.find(root => filePath.startsWith(root)); if (!matchingRoot) { - throw new Error('No matching project root for ', path); + throw new Error('No matching project root for ', filePath); } - const extensionStart = path.lastIndexOf('.'); - let resource = path.substring( + // Replaces '\' with '/' for Windows paths. + if (path.sep === '\\') { + filePath = filePath.replace(/\\/g, '/'); + } + + const extensionStart = filePath.lastIndexOf('.'); + let resource = filePath.substring( matchingRoot.length, extensionStart !== -1 ? extensionStart : undefined, ); - const extension = extensionStart !== -1 - ? path.substring(extensionStart + 1) - : null; - return ( prefix + resource + '.' + extensionOverride + '?' +