From a605e437c90beb7f3186c57457ca9a8552e73cda Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Wed, 19 Apr 2017 19:38:00 +0200 Subject: [PATCH] fix: Make hot reload work on files containing only import statements If a file only has import statements, the parser would crash when hot module reloading was enabled because firstNonImportDeclarationNode would be undefined. This makes those files work by adding the hot module block at the end of the file in those cases. --- src/index.js | 6 +++++- .../actual.js | 1 + .../bar.css | 1 + .../expected.js | 7 +++++++ .../options.json | 11 +++++++++++ 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/actual.js create mode 100644 test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/bar.css create mode 100644 test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/expected.js create mode 100644 test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/options.json diff --git a/src/index.js b/src/index.js index 153261d..9b4e840 100644 --- a/src/index.js +++ b/src/index.js @@ -97,7 +97,11 @@ export default ({ const hotAcceptStatement = t.ifStatement(test, consequent); - firstNonImportDeclarationNode.insertBefore(hotAcceptStatement); + if (firstNonImportDeclarationNode) { + firstNonImportDeclarationNode.insertBefore(hotAcceptStatement); + } else { + programPath.pushContainer('body', hotAcceptStatement); + } }; const getTargetResourcePath = (path: Object, stats:Object) => { diff --git a/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/actual.js b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/actual.js new file mode 100644 index 0000000..e9b384c --- /dev/null +++ b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/actual.js @@ -0,0 +1 @@ +import './bar.css'; diff --git a/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/bar.css b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/bar.css new file mode 100644 index 0000000..5512dae --- /dev/null +++ b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/bar.css @@ -0,0 +1 @@ +.a {} diff --git a/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/expected.js b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/expected.js new file mode 100644 index 0000000..1f95db4 --- /dev/null +++ b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/expected.js @@ -0,0 +1,7 @@ +import './bar.css'; + +if (module.hot) { + module.hot.accept('./bar.css', function () { + require('./bar.css'); + }); +} diff --git a/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/options.json b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/options.json new file mode 100644 index 0000000..a1ca807 --- /dev/null +++ b/test/fixtures/react-css-modules/adds module hot accept for CSS imports when file only contains import statements/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + [ + "../../../../src", + { + "generateScopedName": "[name]__[local]", + "webpackHotModuleReloading": true + } + ] + ] +}