diff --git a/packages/react-scripts/config/paths.js b/packages/react-scripts/config/paths.js index e5a3e0b5374..51ffb39fc43 100644 --- a/packages/react-scripts/config/paths.js +++ b/packages/react-scripts/config/paths.js @@ -88,6 +88,7 @@ module.exports = { yarnLockFile: resolveApp('yarn.lock'), testsSetup: resolveModule(resolveApp, 'src/setupTests'), proxySetup: resolveApp('src/setupProxy.js'), + httpsSetup: resolveApp('src/setupHTTPS.js'), appNodeModules: resolveApp('node_modules'), publicUrl: getPublicUrl(resolveApp('package.json')), servedPath: getServedPath(resolveApp('package.json')), @@ -111,6 +112,7 @@ module.exports = { yarnLockFile: resolveApp('yarn.lock'), testsSetup: resolveModule(resolveApp, 'src/setupTests'), proxySetup: resolveApp('src/setupProxy.js'), + httpsSetup: resolveApp('src/setupHTTPS.js'), appNodeModules: resolveApp('node_modules'), publicUrl: getPublicUrl(resolveApp('package.json')), servedPath: getServedPath(resolveApp('package.json')), @@ -146,6 +148,7 @@ if ( yarnLockFile: resolveOwn('template/yarn.lock'), testsSetup: resolveModule(resolveOwn, 'template/src/setupTests'), proxySetup: resolveOwn('template/src/setupProxy.js'), + httpsSetup: resolveOwn('template/src/setupHTTPS.js'), appNodeModules: resolveOwn('node_modules'), publicUrl: getPublicUrl(resolveOwn('package.json')), servedPath: getServedPath(resolveOwn('package.json')), diff --git a/packages/react-scripts/config/webpackDevServer.config.js b/packages/react-scripts/config/webpackDevServer.config.js index 60a9713df33..5c0ea96c8c9 100644 --- a/packages/react-scripts/config/webpackDevServer.config.js +++ b/packages/react-scripts/config/webpackDevServer.config.js @@ -15,7 +15,9 @@ const ignoredFiles = require('react-dev-utils/ignoredFiles'); const paths = require('./paths'); const fs = require('fs'); -const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; +const hasHTTPSConfig = fs.existsSync(paths.httpsSetup); +const protocol = + process.env.HTTPS === 'true' || hasHTTPSConfig ? 'https' : 'http'; const host = process.env.HOST || '0.0.0.0'; module.exports = function(proxy, allowedHost) { @@ -80,7 +82,9 @@ module.exports = function(proxy, allowedHost) { ignored: ignoredFiles(paths.appSrc), }, // Enable HTTPS if the HTTPS environment variable is set to 'true' - https: protocol === 'https', + // Allow for advanced HTTPS configuration such as custom certificates if src/setupHTTPS.js exists + // https://github.com/facebook/create-react-app/issues/2759 + https: hasHTTPSConfig ? require(paths.httpsSetup) : protocol === 'https', host, overlay: false, historyApiFallback: { diff --git a/packages/react-scripts/scripts/start.js b/packages/react-scripts/scripts/start.js index d4726f5f67e..906cd761482 100644 --- a/packages/react-scripts/scripts/start.js +++ b/packages/react-scripts/scripts/start.js @@ -92,7 +92,10 @@ checkBrowsers(paths.appPath, isInteractive) return; } const config = configFactory('development'); - const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + const protocol = + process.env.HTTPS === 'true' || fs.existsSync(paths.httpsSetup) + ? 'https' + : 'http'; const appName = require(paths.appPackageJson).name; const useTypeScript = fs.existsSync(paths.appTsConfig); const urls = prepareUrls(protocol, HOST, port);