From fd86bdd17c626ab26502661a03bd95e9021ec16f Mon Sep 17 00:00:00 2001
From: Valerii Sorokobatko <valeriy.sorokobatko@gmail.com>
Date: Mon, 6 Mar 2017 23:24:52 +0200
Subject: [PATCH 1/5] support different env configs.

---
 packages/react-scripts/config/loadEnv.js      | 53 +++++++++++++++++++
 packages/react-scripts/config/paths.js        | 24 +++++++++
 .../react-scripts/fixtures/kitchensink/.env   |  4 +-
 .../fixtures/kitchensink/.env.development     |  2 +
 .../fixtures/kitchensink/.env.local           |  2 +
 .../fixtures/kitchensink/.env.production      |  2 +
 .../kitchensink/integration/env.test.js       | 13 +++--
 .../src/features/env/FileEnvVariables.js      |  7 ++-
 packages/react-scripts/scripts/build.js       |  6 +--
 packages/react-scripts/scripts/start.js       |  6 +--
 packages/react-scripts/scripts/test.js        |  6 +--
 packages/react-scripts/template/.env          |  1 +
 packages/react-scripts/template/README.md     | 15 ++++++
 packages/react-scripts/template/gitignore     |  7 ++-
 14 files changed, 125 insertions(+), 23 deletions(-)
 create mode 100644 packages/react-scripts/config/loadEnv.js
 create mode 100644 packages/react-scripts/fixtures/kitchensink/.env.development
 create mode 100644 packages/react-scripts/fixtures/kitchensink/.env.local
 create mode 100644 packages/react-scripts/fixtures/kitchensink/.env.production
 create mode 100644 packages/react-scripts/template/.env

diff --git a/packages/react-scripts/config/loadEnv.js b/packages/react-scripts/config/loadEnv.js
new file mode 100644
index 000000000..ff38e86e6
--- /dev/null
+++ b/packages/react-scripts/config/loadEnv.js
@@ -0,0 +1,53 @@
+// @remove-on-eject-begin
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+// @remove-on-eject-end
+'use strict';
+
+// Load environment variables from .env* files. Suppress warnings using silent
+// if this file is missing. dotenv will never modify any environment variables
+// that have already been set.
+// https://github.com/motdotla/dotenv
+// Used .env* files - https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
+var fs = require('fs');
+var paths = require('./paths');
+
+var sequence = {
+  'development': [
+    paths.dotenvDevelopmentLocal,
+    paths.dotenvDevelopment,
+    paths.dotenvLocal,
+    paths.dotenv
+  ],
+  'test': [
+    paths.dotenvTestLocal,
+    paths.dotenvTest,
+    paths.dotenvLocal,
+    paths.dotenv
+  ],
+  'production': [
+    paths.dotenvProductionLocal,
+    paths.dotenvProduction,
+    paths.dotenvLocal,
+    paths.dotenv
+  ]
+};
+
+var envConfigs = sequence[process.env.NODE_ENV];
+
+if (envConfigs) {
+  envConfigs.forEach(envConfig => {
+    if (fs.existsSync(envConfig)) {
+      require('dotenv').config({
+        silent: true,
+        path: envConfig
+      });
+    }
+  });
+}
diff --git a/packages/react-scripts/config/paths.js b/packages/react-scripts/config/paths.js
index 763977560..187bce0bb 100644
--- a/packages/react-scripts/config/paths.js
+++ b/packages/react-scripts/config/paths.js
@@ -74,6 +74,14 @@ function getServedPath(appPackageJson) {
 
 // config after eject: we're in ./config/
 module.exports = {
+  dotenv: resolveApp('.env'),
+  dotenvLocal: resolveApp('.env.local'),
+  dotenvDevelopment: resolveApp('.env.development'),
+  dotenvDevelopmentLocal: resolveApp('.env.development.local'),
+  dotenvTest: resolveApp('.env.test'),
+  dotenvTestLocal: resolveApp('.env.test.local'),
+  dotenvProduction: resolveApp('.env.production'),
+  dotenvProductionLocal: resolveApp('.env.production.local'),
   appBuild: resolveApp('build'),
   appPublic: resolveApp('public'),
   appHtml: resolveApp('public/index.html'),
@@ -96,6 +104,14 @@ function resolveOwn(relativePath) {
 // config before eject: we're in ./node_modules/react-scripts/config/
 module.exports = {
   appPath: resolveApp('.'),
+  dotenv: resolveApp('.env'),
+  dotenvLocal: resolveApp('.env.local'),
+  dotenvDevelopment: resolveApp('.env.development'),
+  dotenvDevelopmentLocal: resolveApp('.env.development.local'),
+  dotenvTest: resolveApp('.env.test'),
+  dotenvTestLocal: resolveApp('.env.test.local'),
+  dotenvProduction: resolveApp('.env.production'),
+  dotenvProductionLocal: resolveApp('.env.production.local'),
   appBuild: resolveApp('build'),
   appPublic: resolveApp('public'),
   appHtml: resolveApp('public/index.html'),
@@ -125,6 +141,14 @@ if (
 ) {
   module.exports = {
     appPath: resolveApp('.'),
+    dotenv: resolveOwn('template/.env'),
+    dotenvLocal: resolveOwn('template/.env.local'),
+    dotenvDevelopment: resolveOwn('template/.env.development'),
+    dotenvDevelopmentLocal: resolveOwn('template/.env.development.local'),
+    dotenvTest: resolveOwn('template/.env.test'),
+    dotenvTestLocal: resolveOwn('template/.env.test.local'),
+    dotenvProduction: resolveOwn('template/.env.production'),
+    dotenvProductionLocal: resolveOwn('template/.env.production.local'),
     appBuild: resolveOwn('../../build'),
     appPublic: resolveOwn('template/public'),
     appHtml: resolveOwn('template/public/index.html'),
diff --git a/packages/react-scripts/fixtures/kitchensink/.env b/packages/react-scripts/fixtures/kitchensink/.env
index 3e6e8a5a3..3e2f7b14a 100644
--- a/packages/react-scripts/fixtures/kitchensink/.env
+++ b/packages/react-scripts/fixtures/kitchensink/.env
@@ -1 +1,3 @@
-REACT_APP_FILE_ENV_MESSAGE=fromtheenvfile
+REACT_APP_X = x-from-original-env
+REACT_APP_ORIGINAL_1 = from-original-env-1
+REACT_APP_ORIGINAL_2 = from-original-env-2
diff --git a/packages/react-scripts/fixtures/kitchensink/.env.development b/packages/react-scripts/fixtures/kitchensink/.env.development
new file mode 100644
index 000000000..cc10be5e6
--- /dev/null
+++ b/packages/react-scripts/fixtures/kitchensink/.env.development
@@ -0,0 +1,2 @@
+REACT_APP_X = x-from-development-env
+REACT_APP_DEVELOPMENT = development
diff --git a/packages/react-scripts/fixtures/kitchensink/.env.local b/packages/react-scripts/fixtures/kitchensink/.env.local
new file mode 100644
index 000000000..b248646bd
--- /dev/null
+++ b/packages/react-scripts/fixtures/kitchensink/.env.local
@@ -0,0 +1,2 @@
+REACT_APP_X = x-from-original-local-env
+REACT_APP_ORIGINAL_2 = override-from-original-local-env-2
diff --git a/packages/react-scripts/fixtures/kitchensink/.env.production b/packages/react-scripts/fixtures/kitchensink/.env.production
new file mode 100644
index 000000000..ec8bdcb54
--- /dev/null
+++ b/packages/react-scripts/fixtures/kitchensink/.env.production
@@ -0,0 +1,2 @@
+REACT_APP_X = x-from-production-env
+REACT_APP_PRODUCTION = production
diff --git a/packages/react-scripts/fixtures/kitchensink/integration/env.test.js b/packages/react-scripts/fixtures/kitchensink/integration/env.test.js
index b90d12ab1..b901c8f4d 100644
--- a/packages/react-scripts/fixtures/kitchensink/integration/env.test.js
+++ b/packages/react-scripts/fixtures/kitchensink/integration/env.test.js
@@ -15,9 +15,16 @@ describe('Integration', () => {
     it('file env variables', async () => {
       const doc = await initDOM('file-env-variables');
 
-      expect(
-        doc.getElementById('feature-file-env-variables').textContent
-      ).to.equal('fromtheenvfile.');
+      expect(doc.getElementById('feature-file-env-original-1').textContent).to.equal('from-original-env-1');
+      expect(doc.getElementById('feature-file-env-original-2').textContent).to.equal('override-from-original-local-env-2');
+
+      if (process.env.NODE_ENV === 'production') {
+        expect(doc.getElementById('feature-file-env').textContent).to.equal('production')
+        expect(doc.getElementById('feature-file-env-x').textContent).to.equal('x-from-production-env')
+      } else {
+        expect(doc.getElementById('feature-file-env').textContent).to.equal('development')
+        expect(doc.getElementById('feature-file-env-x').textContent).to.equal('x-from-development-env')
+      }
     });
 
     it('NODE_PATH', async () => {
diff --git a/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js b/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js
index a8a1e98fe..9181fa27a 100644
--- a/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js
+++ b/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js
@@ -10,7 +10,10 @@
 import React from 'react';
 
 export default () => (
-  <span id="feature-file-env-variables">
-    {process.env.REACT_APP_FILE_ENV_MESSAGE}.
+  <span>
+    <span id="feature-file-env-original-1">{process.env.REACT_APP_ORIGINAL_1}</span>
+    <span id="feature-file-env-original-2">{process.env.REACT_APP_ORIGINAL_2}</span>
+    <span id="feature-file-env">{process.env.REACT_APP_DEVELOPMENT}{process.env.REACT_APP_PRODUCTION}</span>
+    <span id="feature-file-env-x">{process.env.REACT_APP_X}</span>
   </span>
 );
diff --git a/packages/react-scripts/scripts/build.js b/packages/react-scripts/scripts/build.js
index fe4ec959d..f7bfee795 100644
--- a/packages/react-scripts/scripts/build.js
+++ b/packages/react-scripts/scripts/build.js
@@ -20,11 +20,7 @@ process.on('unhandledRejection', err => {
   throw err;
 });
 
-// Load environment variables from .env file. Suppress warnings using silent
-// if this file is missing. dotenv will never modify any environment variables
-// that have already been set.
-// https://github.com/motdotla/dotenv
-require('dotenv').config({ silent: true });
+require('../config/loadEnv');
 
 const chalk = require('chalk');
 const fs = require('fs-extra');
diff --git a/packages/react-scripts/scripts/start.js b/packages/react-scripts/scripts/start.js
index 12cce8ed3..6872ec4b1 100644
--- a/packages/react-scripts/scripts/start.js
+++ b/packages/react-scripts/scripts/start.js
@@ -19,11 +19,7 @@ process.on('unhandledRejection', err => {
 
 process.env.NODE_ENV = 'development';
 
-// Load environment variables from .env file. Suppress warnings using silent
-// if this file is missing. dotenv will never modify any environment variables
-// that have already been set.
-// https://github.com/motdotla/dotenv
-require('dotenv').config({ silent: true });
+require('../config/loadEnv');
 
 const fs = require('fs');
 const chalk = require('chalk');
diff --git a/packages/react-scripts/scripts/test.js b/packages/react-scripts/scripts/test.js
index 5c395999d..a12f53271 100644
--- a/packages/react-scripts/scripts/test.js
+++ b/packages/react-scripts/scripts/test.js
@@ -20,11 +20,7 @@ process.on('unhandledRejection', err => {
   throw err;
 });
 
-// Load environment variables from .env file. Suppress warnings using silent
-// if this file is missing. dotenv will never modify any environment variables
-// that have already been set.
-// https://github.com/motdotla/dotenv
-require('dotenv').config({ silent: true });
+require('../config/loadEnv');
 
 const jest = require('jest');
 const argv = process.argv.slice(2);
diff --git a/packages/react-scripts/template/.env b/packages/react-scripts/template/.env
new file mode 100644
index 000000000..3810be81a
--- /dev/null
+++ b/packages/react-scripts/template/.env
@@ -0,0 +1 @@
+REACT_APP_X = 1
diff --git a/packages/react-scripts/template/README.md b/packages/react-scripts/template/README.md
index 933e9b0cd..c5bbfed5a 100644
--- a/packages/react-scripts/template/README.md
+++ b/packages/react-scripts/template/README.md
@@ -752,6 +752,21 @@ To define permanent environment variables, create a file called `.env` in the ro
 REACT_APP_SECRET_CODE=abcdef
 ```
 
+What .env* files are used?
+
+* `.env` - Default
+* `.env.development`, `.env.test`, `.env.production` - Environment-specific settings.
+* `.env.local` - Local overrides. This file is loaded for all environments except test.
+* `.env.development.local`, `.env.test.local`, `.env.production.local` - Local overrides of environment-specific settings.
+
+Files priority (file is skipped if does not exist):
+
+* npm test - `.env.test.local`, `env.test`, `.env.local`, `.env`
+* npm run build - `.env.production.local`, `env.production`, `.env.local`, `.env`
+* npm start - `.env.development.local`, `env.development`, `.env.local`, `.env`
+
+Priority from left to right.
+
 These variables will act as the defaults if the machine does not explicitly set them.<br>
 Please refer to the [dotenv documentation](https://github.com/motdotla/dotenv) for more details.
 
diff --git a/packages/react-scripts/template/gitignore b/packages/react-scripts/template/gitignore
index 927d17bb9..d30f40ef4 100644
--- a/packages/react-scripts/template/gitignore
+++ b/packages/react-scripts/template/gitignore
@@ -11,8 +11,11 @@
 
 # misc
 .DS_Store
-.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
 npm-debug.log*
 yarn-debug.log*
 yarn-error.log*
-
-- 
GitLab


From dbdbfb137f159855eecf05fe6dde194db9d5073f Mon Sep 17 00:00:00 2001
From: Valerii Sorokobatko <valeriy.sorokobatko@gmail.com>
Date: Thu, 9 Mar 2017 11:05:52 +0200
Subject: [PATCH 2/5] fomrat code

---
 packages/react-scripts/config/loadEnv.js      | 16 ++++++-------
 .../kitchensink/integration/env.test.js       | 24 ++++++++++++++-----
 .../src/features/env/FileEnvVariables.js      | 12 +++++++---
 3 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/packages/react-scripts/config/loadEnv.js b/packages/react-scripts/config/loadEnv.js
index ff38e86e6..a6f8aad05 100644
--- a/packages/react-scripts/config/loadEnv.js
+++ b/packages/react-scripts/config/loadEnv.js
@@ -19,24 +19,24 @@ var fs = require('fs');
 var paths = require('./paths');
 
 var sequence = {
-  'development': [
+  development: [
     paths.dotenvDevelopmentLocal,
     paths.dotenvDevelopment,
     paths.dotenvLocal,
-    paths.dotenv
+    paths.dotenv,
   ],
-  'test': [
+  test: [
     paths.dotenvTestLocal,
     paths.dotenvTest,
     paths.dotenvLocal,
-    paths.dotenv
+    paths.dotenv,
   ],
-  'production': [
+  production: [
     paths.dotenvProductionLocal,
     paths.dotenvProduction,
     paths.dotenvLocal,
-    paths.dotenv
-  ]
+    paths.dotenv,
+  ],
 };
 
 var envConfigs = sequence[process.env.NODE_ENV];
@@ -46,7 +46,7 @@ if (envConfigs) {
     if (fs.existsSync(envConfig)) {
       require('dotenv').config({
         silent: true,
-        path: envConfig
+        path: envConfig,
       });
     }
   });
diff --git a/packages/react-scripts/fixtures/kitchensink/integration/env.test.js b/packages/react-scripts/fixtures/kitchensink/integration/env.test.js
index b901c8f4d..89d19fcf4 100644
--- a/packages/react-scripts/fixtures/kitchensink/integration/env.test.js
+++ b/packages/react-scripts/fixtures/kitchensink/integration/env.test.js
@@ -15,15 +15,27 @@ describe('Integration', () => {
     it('file env variables', async () => {
       const doc = await initDOM('file-env-variables');
 
-      expect(doc.getElementById('feature-file-env-original-1').textContent).to.equal('from-original-env-1');
-      expect(doc.getElementById('feature-file-env-original-2').textContent).to.equal('override-from-original-local-env-2');
+      expect(
+        doc.getElementById('feature-file-env-original-1').textContent
+      ).to.equal('from-original-env-1');
+      expect(
+        doc.getElementById('feature-file-env-original-2').textContent
+      ).to.equal('override-from-original-local-env-2');
 
       if (process.env.NODE_ENV === 'production') {
-        expect(doc.getElementById('feature-file-env').textContent).to.equal('production')
-        expect(doc.getElementById('feature-file-env-x').textContent).to.equal('x-from-production-env')
+        expect(doc.getElementById('feature-file-env').textContent).to.equal(
+          'production'
+        );
+        expect(doc.getElementById('feature-file-env-x').textContent).to.equal(
+          'x-from-production-env'
+        );
       } else {
-        expect(doc.getElementById('feature-file-env').textContent).to.equal('development')
-        expect(doc.getElementById('feature-file-env-x').textContent).to.equal('x-from-development-env')
+        expect(doc.getElementById('feature-file-env').textContent).to.equal(
+          'development'
+        );
+        expect(doc.getElementById('feature-file-env-x').textContent).to.equal(
+          'x-from-development-env'
+        );
       }
     });
 
diff --git a/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js b/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js
index 9181fa27a..55ae368e4 100644
--- a/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js
+++ b/packages/react-scripts/fixtures/kitchensink/src/features/env/FileEnvVariables.js
@@ -11,9 +11,15 @@ import React from 'react';
 
 export default () => (
   <span>
-    <span id="feature-file-env-original-1">{process.env.REACT_APP_ORIGINAL_1}</span>
-    <span id="feature-file-env-original-2">{process.env.REACT_APP_ORIGINAL_2}</span>
-    <span id="feature-file-env">{process.env.REACT_APP_DEVELOPMENT}{process.env.REACT_APP_PRODUCTION}</span>
+    <span id="feature-file-env-original-1">
+      {process.env.REACT_APP_ORIGINAL_1}
+    </span>
+    <span id="feature-file-env-original-2">
+      {process.env.REACT_APP_ORIGINAL_2}
+    </span>
+    <span id="feature-file-env">
+      {process.env.REACT_APP_DEVELOPMENT}{process.env.REACT_APP_PRODUCTION}
+    </span>
     <span id="feature-file-env-x">{process.env.REACT_APP_X}</span>
   </span>
 );
-- 
GitLab


From 20a0972935cec54a40986bb8417903bab8390b42 Mon Sep 17 00:00:00 2001
From: Dan Abramov <dan.abramov@gmail.com>
Date: Thu, 11 May 2017 18:31:27 +0100
Subject: [PATCH 3/5] Hide doc

---
 packages/react-scripts/template/README.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/packages/react-scripts/template/README.md b/packages/react-scripts/template/README.md
index c5bbfed5a..cc66b9526 100644
--- a/packages/react-scripts/template/README.md
+++ b/packages/react-scripts/template/README.md
@@ -752,6 +752,8 @@ To define permanent environment variables, create a file called `.env` in the ro
 REACT_APP_SECRET_CODE=abcdef
 ```
 
+<!--
+TODO: uncomment (and tweak) the doc for 0.10
 What .env* files are used?
 
 * `.env` - Default
@@ -766,6 +768,7 @@ Files priority (file is skipped if does not exist):
 * npm start - `.env.development.local`, `env.development`, `.env.local`, `.env`
 
 Priority from left to right.
+-->
 
 These variables will act as the defaults if the machine does not explicitly set them.<br>
 Please refer to the [dotenv documentation](https://github.com/motdotla/dotenv) for more details.
-- 
GitLab


From 98a1ee166db2262f130fbe8abc157496af06e8a0 Mon Sep 17 00:00:00 2001
From: Dan Abramov <gaearon@fb.com>
Date: Thu, 11 May 2017 18:58:24 +0100
Subject: [PATCH 4/5] Slightly rework the PR

* Remove .env in default template
* Use just one entry in the paths
* Unify env.js and loadEnv.js
---
 packages/react-scripts/config/env.js     | 30 ++++++++++++++
 packages/react-scripts/config/loadEnv.js | 53 ------------------------
 packages/react-scripts/config/paths.js   |  7 ----
 packages/react-scripts/scripts/build.js  |  3 +-
 packages/react-scripts/scripts/start.js  |  3 +-
 packages/react-scripts/scripts/test.js   |  3 +-
 packages/react-scripts/template/.env     |  1 -
 7 files changed, 36 insertions(+), 64 deletions(-)
 delete mode 100644 packages/react-scripts/config/loadEnv.js
 delete mode 100644 packages/react-scripts/template/.env

diff --git a/packages/react-scripts/config/env.js b/packages/react-scripts/config/env.js
index c018467a9..0097f3cf3 100644
--- a/packages/react-scripts/config/env.js
+++ b/packages/react-scripts/config/env.js
@@ -10,6 +10,36 @@
 // @remove-on-eject-end
 'use strict';
 
+var fs = require('fs');
+var paths = require('./paths');
+
+var NODE_ENV = process.env.NODE_ENV;
+if (!NODE_ENV) {
+  throw new Error(
+    'The NODE_ENV environment variable is required but was not specified.'
+  );
+}
+
+// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
+var dotenvFiles = [
+  paths.dotenv + '.' + NODE_ENV + '.local',
+  paths.dotenv + '.' + NODE_ENV,
+  paths.dotenv + '.local',
+  paths.dotenv,
+];
+// Load environment variables from .env* files. Suppress warnings using silent
+// if this file is missing. dotenv will never modify any environment variables
+// that have already been set.
+// https://github.com/motdotla/dotenv
+dotenvFiles.forEach(dotenvFile => {
+  if (fs.existsSync(dotenvFile)) {
+    require('dotenv').config({
+      silent: true,
+      path: dotenvFile,
+    });
+  }
+});
+
 // Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be
 // injected into the application via DefinePlugin in Webpack configuration.
 const REACT_APP = /^REACT_APP_/i;
diff --git a/packages/react-scripts/config/loadEnv.js b/packages/react-scripts/config/loadEnv.js
deleted file mode 100644
index a6f8aad05..000000000
--- a/packages/react-scripts/config/loadEnv.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// @remove-on-eject-begin
-/**
- * Copyright (c) 2015-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- */
-// @remove-on-eject-end
-'use strict';
-
-// Load environment variables from .env* files. Suppress warnings using silent
-// if this file is missing. dotenv will never modify any environment variables
-// that have already been set.
-// https://github.com/motdotla/dotenv
-// Used .env* files - https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
-var fs = require('fs');
-var paths = require('./paths');
-
-var sequence = {
-  development: [
-    paths.dotenvDevelopmentLocal,
-    paths.dotenvDevelopment,
-    paths.dotenvLocal,
-    paths.dotenv,
-  ],
-  test: [
-    paths.dotenvTestLocal,
-    paths.dotenvTest,
-    paths.dotenvLocal,
-    paths.dotenv,
-  ],
-  production: [
-    paths.dotenvProductionLocal,
-    paths.dotenvProduction,
-    paths.dotenvLocal,
-    paths.dotenv,
-  ],
-};
-
-var envConfigs = sequence[process.env.NODE_ENV];
-
-if (envConfigs) {
-  envConfigs.forEach(envConfig => {
-    if (fs.existsSync(envConfig)) {
-      require('dotenv').config({
-        silent: true,
-        path: envConfig,
-      });
-    }
-  });
-}
diff --git a/packages/react-scripts/config/paths.js b/packages/react-scripts/config/paths.js
index 187bce0bb..440f359e4 100644
--- a/packages/react-scripts/config/paths.js
+++ b/packages/react-scripts/config/paths.js
@@ -75,13 +75,6 @@ function getServedPath(appPackageJson) {
 // config after eject: we're in ./config/
 module.exports = {
   dotenv: resolveApp('.env'),
-  dotenvLocal: resolveApp('.env.local'),
-  dotenvDevelopment: resolveApp('.env.development'),
-  dotenvDevelopmentLocal: resolveApp('.env.development.local'),
-  dotenvTest: resolveApp('.env.test'),
-  dotenvTestLocal: resolveApp('.env.test.local'),
-  dotenvProduction: resolveApp('.env.production'),
-  dotenvProductionLocal: resolveApp('.env.production.local'),
   appBuild: resolveApp('build'),
   appPublic: resolveApp('public'),
   appHtml: resolveApp('public/index.html'),
diff --git a/packages/react-scripts/scripts/build.js b/packages/react-scripts/scripts/build.js
index f7bfee795..da9004f9e 100644
--- a/packages/react-scripts/scripts/build.js
+++ b/packages/react-scripts/scripts/build.js
@@ -20,7 +20,8 @@ process.on('unhandledRejection', err => {
   throw err;
 });
 
-require('../config/loadEnv');
+// Ensure environment variables are read.
+require('../config/env');
 
 const chalk = require('chalk');
 const fs = require('fs-extra');
diff --git a/packages/react-scripts/scripts/start.js b/packages/react-scripts/scripts/start.js
index 6872ec4b1..b44fc44c9 100644
--- a/packages/react-scripts/scripts/start.js
+++ b/packages/react-scripts/scripts/start.js
@@ -19,7 +19,8 @@ process.on('unhandledRejection', err => {
 
 process.env.NODE_ENV = 'development';
 
-require('../config/loadEnv');
+// Ensure environment variables are read.
+require('../config/env');
 
 const fs = require('fs');
 const chalk = require('chalk');
diff --git a/packages/react-scripts/scripts/test.js b/packages/react-scripts/scripts/test.js
index a12f53271..ef333e6c0 100644
--- a/packages/react-scripts/scripts/test.js
+++ b/packages/react-scripts/scripts/test.js
@@ -20,7 +20,8 @@ process.on('unhandledRejection', err => {
   throw err;
 });
 
-require('../config/loadEnv');
+// Ensure environment variables are read.
+require('../config/env');
 
 const jest = require('jest');
 const argv = process.argv.slice(2);
diff --git a/packages/react-scripts/template/.env b/packages/react-scripts/template/.env
deleted file mode 100644
index 3810be81a..000000000
--- a/packages/react-scripts/template/.env
+++ /dev/null
@@ -1 +0,0 @@
-REACT_APP_X = 1
-- 
GitLab


From c4ed039de034f4792e5e75a2452f985627473780 Mon Sep 17 00:00:00 2001
From: Dan Abramov <dan.abramov@gmail.com>
Date: Thu, 11 May 2017 19:02:57 +0100
Subject: [PATCH 5/5] Oops, forgot these folks

---
 packages/react-scripts/config/paths.js | 18 ++----------------
 1 file changed, 2 insertions(+), 16 deletions(-)

diff --git a/packages/react-scripts/config/paths.js b/packages/react-scripts/config/paths.js
index 440f359e4..915b1a838 100644
--- a/packages/react-scripts/config/paths.js
+++ b/packages/react-scripts/config/paths.js
@@ -96,15 +96,8 @@ function resolveOwn(relativePath) {
 
 // config before eject: we're in ./node_modules/react-scripts/config/
 module.exports = {
-  appPath: resolveApp('.'),
   dotenv: resolveApp('.env'),
-  dotenvLocal: resolveApp('.env.local'),
-  dotenvDevelopment: resolveApp('.env.development'),
-  dotenvDevelopmentLocal: resolveApp('.env.development.local'),
-  dotenvTest: resolveApp('.env.test'),
-  dotenvTestLocal: resolveApp('.env.test.local'),
-  dotenvProduction: resolveApp('.env.production'),
-  dotenvProductionLocal: resolveApp('.env.production.local'),
+  appPath: resolveApp('.'),
   appBuild: resolveApp('build'),
   appPublic: resolveApp('public'),
   appHtml: resolveApp('public/index.html'),
@@ -133,15 +126,8 @@ if (
   __dirname.indexOf(path.join('packages', 'react-scripts', 'config')) !== -1
 ) {
   module.exports = {
-    appPath: resolveApp('.'),
     dotenv: resolveOwn('template/.env'),
-    dotenvLocal: resolveOwn('template/.env.local'),
-    dotenvDevelopment: resolveOwn('template/.env.development'),
-    dotenvDevelopmentLocal: resolveOwn('template/.env.development.local'),
-    dotenvTest: resolveOwn('template/.env.test'),
-    dotenvTestLocal: resolveOwn('template/.env.test.local'),
-    dotenvProduction: resolveOwn('template/.env.production'),
-    dotenvProductionLocal: resolveOwn('template/.env.production.local'),
+    appPath: resolveApp('.'),
     appBuild: resolveOwn('../../build'),
     appPublic: resolveOwn('template/public'),
     appHtml: resolveOwn('template/public/index.html'),
-- 
GitLab