From db4ed32339cc3c559212f77d8a86848bae032db8 Mon Sep 17 00:00:00 2001 From: Joe Farro Date: Sun, 6 Jan 2019 03:01:03 -0500 Subject: [PATCH] Support webpack config factory (CRA v2.1.2) (#346) * react-app-rewired support react-scripts more than 2.1.2 version * Fix for CRA 2.1.2 #343, builds on #344 * See about using node 6 and 8 in CI --- .travis.yml | 3 ++- packages/react-app-rewired/package.json | 3 ++- packages/react-app-rewired/scripts/build.js | 21 ++++++++++++----- packages/react-app-rewired/scripts/start.js | 25 ++++++++++++++------- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index 67f9971..44dec88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: node_js node_js: - - "7" + - "6" + - "8" cache: yarn: true \ No newline at end of file diff --git a/packages/react-app-rewired/package.json b/packages/react-app-rewired/package.json index 46d11e7..50d2725 100644 --- a/packages/react-app-rewired/package.json +++ b/packages/react-app-rewired/package.json @@ -11,7 +11,8 @@ }, "dependencies": { "cross-spawn": "^5.1.0", - "dotenv": "^4.0.0" + "dotenv": "^4.0.0", + "semver": "^5.6.0" }, "repository": { "type": "git", diff --git a/packages/react-app-rewired/scripts/build.js b/packages/react-app-rewired/scripts/build.js index b9e43fa..723d98f 100644 --- a/packages/react-app-rewired/scripts/build.js +++ b/packages/react-app-rewired/scripts/build.js @@ -1,13 +1,22 @@ process.env.NODE_ENV = 'production'; -const paths = require('./utils/paths'); +const semver = require('semver'); + +const { scriptVersion } = require('./utils/paths'); const overrides = require('../config-overrides'); -const webpackConfigPath = paths.scriptVersion + "/config/webpack.config.prod"; +const scriptPkg = require(`${scriptVersion}/package.json`); + +// CRA 2.1.2 switched to using a webpack config factory +// https://github.com/facebook/create-react-app/pull/5722 +// https://github.com/facebook/create-react-app/releases/tag/v2.1.2 +const isWebpackFactory = semver.gte(scriptPkg && scriptPkg.version, '2.1.2'); -// load original config +const webpackConfigPath = `${scriptVersion}/config/webpack.config${!isWebpackFactory ? '.prod' : ''}`; const webpackConfig = require(webpackConfigPath); + // override config in memory -require.cache[require.resolve(webpackConfigPath)].exports = - overrides.webpack(webpackConfig, process.env.NODE_ENV); +require.cache[require.resolve(webpackConfigPath)].exports = isWebpackFactory + ? (env) => overrides.webpack(webpackConfig(env), env) + : overrides.webpack(webpackConfig, process.env.NODE_ENV); // run original script -require(paths.scriptVersion + '/scripts/build'); +require(`${scriptVersion}/scripts/build`); diff --git a/packages/react-app-rewired/scripts/start.js b/packages/react-app-rewired/scripts/start.js index fea8b38..ea4ebf1 100644 --- a/packages/react-app-rewired/scripts/start.js +++ b/packages/react-app-rewired/scripts/start.js @@ -1,19 +1,28 @@ -process.env.NODE_ENV = process.env.NODE_ENV || "development"; +process.env.NODE_ENV = process.env.NODE_ENV || 'development'; -const paths = require("./utils/paths"); +const semver = require('semver'); + +const { scriptVersion } = require('./utils/paths'); const overrides = require('../config-overrides'); -const webpackConfigPath = paths.scriptVersion + "/config/webpack.config.dev"; -const devServerConfigPath = paths.scriptVersion + "/config/webpackDevServer.config.js"; +const scriptPkg = require(`${scriptVersion}/package.json`); + +// CRA 2.1.2 switched to using a webpack config factory +// https://github.com/facebook/create-react-app/pull/5722 +// https://github.com/facebook/create-react-app/releases/tag/v2.1.2 +const isWebpackFactory = semver.gte(scriptPkg && scriptPkg.version, '2.1.2'); -// load original configs +const webpackConfigPath = `${scriptVersion}/config/webpack.config${!isWebpackFactory ? '.dev' : ''}`; +const devServerConfigPath = `${scriptVersion}/config/webpackDevServer.config.js`; const webpackConfig = require(webpackConfigPath); const devServerConfig = require(devServerConfigPath); + // override config in memory -require.cache[require.resolve(webpackConfigPath)].exports = - overrides.webpack(webpackConfig, process.env.NODE_ENV); +require.cache[require.resolve(webpackConfigPath)].exports = isWebpackFactory + ? (env) => overrides.webpack(webpackConfig(env), env) + : overrides.webpack(webpackConfig, process.env.NODE_ENV); require.cache[require.resolve(devServerConfigPath)].exports = overrides.devServer(devServerConfig, process.env.NODE_ENV); // run original script -require(paths.scriptVersion + "/scripts/start"); \ No newline at end of file +require(`${scriptVersion}/scripts/start`);