1. 'use strict';
    
  2. 
    
  3. const fs = require('fs');
    
  4. const path = require('path');
    
  5. const paths = require('./paths');
    
  6. 
    
  7. // Make sure that including paths.js after env.js will read .env variables.
    
  8. delete require.cache[require.resolve('./paths')];
    
  9. 
    
  10. const NODE_ENV = process.env.NODE_ENV;
    
  11. if (!NODE_ENV) {
    
  12.   throw new Error(
    
  13.     'The NODE_ENV environment variable is required but was not specified.'
    
  14.   );
    
  15. }
    
  16. 
    
  17. // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
    
  18. const dotenvFiles = [
    
  19.   `${paths.dotenv}.${NODE_ENV}.local`,
    
  20.   // Don't include `.env.local` for `test` environment
    
  21.   // since normally you expect tests to produce the same
    
  22.   // results for everyone
    
  23.   NODE_ENV !== 'test' && `${paths.dotenv}.local`,
    
  24.   `${paths.dotenv}.${NODE_ENV}`,
    
  25.   paths.dotenv,
    
  26. ].filter(Boolean);
    
  27. 
    
  28. // Load environment variables from .env* files. Suppress warnings using silent
    
  29. // if this file is missing. dotenv will never modify any environment variables
    
  30. // that have already been set.  Variable expansion is supported in .env files.
    
  31. // https://github.com/motdotla/dotenv
    
  32. // https://github.com/motdotla/dotenv-expand
    
  33. dotenvFiles.forEach(dotenvFile => {
    
  34.   if (fs.existsSync(dotenvFile)) {
    
  35.     require('dotenv-expand')(
    
  36.       require('dotenv').config({
    
  37.         path: dotenvFile,
    
  38.       })
    
  39.     );
    
  40.   }
    
  41. });
    
  42. 
    
  43. // We support resolving modules according to `NODE_PATH`.
    
  44. // This lets you use absolute paths in imports inside large monorepos:
    
  45. // https://github.com/facebook/create-react-app/issues/253.
    
  46. // It works similar to `NODE_PATH` in Node itself:
    
  47. // https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
    
  48. // Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored.
    
  49. // Otherwise, we risk importing Node.js core modules into an app instead of webpack shims.
    
  50. // https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421
    
  51. // We also resolve them to make sure all tools using them work consistently.
    
  52. const appDirectory = fs.realpathSync(process.cwd());
    
  53. process.env.NODE_PATH = (process.env.NODE_PATH || '')
    
  54.   .split(path.delimiter)
    
  55.   .filter(folder => folder && !path.isAbsolute(folder))
    
  56.   .map(folder => path.resolve(appDirectory, folder))
    
  57.   .join(path.delimiter);
    
  58. 
    
  59. // Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be
    
  60. // injected into the application via DefinePlugin in webpack configuration.
    
  61. const REACT_APP = /^REACT_APP_/i;
    
  62. 
    
  63. function getClientEnvironment(publicUrl) {
    
  64.   const raw = Object.keys(process.env)
    
  65.     .filter(key => REACT_APP.test(key))
    
  66.     .reduce(
    
  67.       (env, key) => {
    
  68.         env[key] = process.env[key];
    
  69.         return env;
    
  70.       },
    
  71.       {
    
  72.         // Useful for determining whether we’re running in production mode.
    
  73.         // Most importantly, it switches React into the correct mode.
    
  74.         NODE_ENV: process.env.NODE_ENV || 'development',
    
  75.         // Useful for resolving the correct path to static assets in `public`.
    
  76.         // For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />.
    
  77.         // This should only be used as an escape hatch. Normally you would put
    
  78.         // images into the `src` and `import` them in code to get their paths.
    
  79.         PUBLIC_URL: publicUrl,
    
  80.         // We support configuring the sockjs pathname during development.
    
  81.         // These settings let a developer run multiple simultaneous projects.
    
  82.         // They are used as the connection `hostname`, `pathname` and `port`
    
  83.         // in webpackHotDevClient. They are used as the `sockHost`, `sockPath`
    
  84.         // and `sockPort` options in webpack-dev-server.
    
  85.         WDS_SOCKET_HOST: process.env.WDS_SOCKET_HOST,
    
  86.         WDS_SOCKET_PATH: process.env.WDS_SOCKET_PATH,
    
  87.         WDS_SOCKET_PORT: process.env.WDS_SOCKET_PORT,
    
  88.         // Whether or not react-refresh is enabled.
    
  89.         // It is defined here so it is available in the webpackHotDevClient.
    
  90.         FAST_REFRESH: process.env.FAST_REFRESH !== 'false',
    
  91.       }
    
  92.     );
    
  93.   // Stringify all values so we can feed into webpack DefinePlugin
    
  94.   const stringified = {
    
  95.     'process.env': Object.keys(raw).reduce((env, key) => {
    
  96.       env[key] = JSON.stringify(raw[key]);
    
  97.       return env;
    
  98.     }, {}),
    
  99.   };
    
  100. 
    
  101.   return {raw, stringified};
    
  102. }
    
  103. 
    
  104. module.exports = getClientEnvironment;