Changeset View
Changeset View
Standalone View
Standalone View
web/cashtab/config/env.js
Show All 11 Lines | if (!NODE_ENV) { | ||||
throw new Error( | throw new Error( | ||||
'The NODE_ENV environment variable is required but was not specified.', | 'The NODE_ENV environment variable is required but was not specified.', | ||||
); | ); | ||||
} | } | ||||
// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use | // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use | ||||
const dotenvFiles = [ | const dotenvFiles = [ | ||||
`${paths.dotenv}.${NODE_ENV}.local`, | `${paths.dotenv}.${NODE_ENV}.local`, | ||||
`${paths.dotenv}.${NODE_ENV}`, | |||||
// Don't include `.env.local` for `test` environment | // Don't include `.env.local` for `test` environment | ||||
// since normally you expect tests to produce the same | // since normally you expect tests to produce the same | ||||
// results for everyone | // results for everyone | ||||
NODE_ENV !== 'test' && `${paths.dotenv}.local`, | NODE_ENV !== 'test' && `${paths.dotenv}.local`, | ||||
`${paths.dotenv}.${NODE_ENV}`, | |||||
paths.dotenv, | paths.dotenv, | ||||
].filter(Boolean); | ].filter(Boolean); | ||||
// Load environment variables from .env* files. Suppress warnings using silent | // Load environment variables from .env* files. Suppress warnings using silent | ||||
// if this file is missing. dotenv will never modify any environment variables | // if this file is missing. dotenv will never modify any environment variables | ||||
// that have already been set. Variable expansion is supported in .env files. | // that have already been set. Variable expansion is supported in .env files. | ||||
// https://github.com/motdotla/dotenv | // https://github.com/motdotla/dotenv | ||||
// https://github.com/motdotla/dotenv-expand | // https://github.com/motdotla/dotenv-expand | ||||
dotenvFiles.forEach(dotenvFile => { | dotenvFiles.forEach(dotenvFile => { | ||||
if (fs.existsSync(dotenvFile)) { | if (fs.existsSync(dotenvFile)) { | ||||
require('dotenv-expand')( | require('dotenv-expand')( | ||||
require('dotenv').config({ | require('dotenv').config({ | ||||
path: dotenvFile, | path: dotenvFile, | ||||
}), | }), | ||||
); | ); | ||||
} | } | ||||
}); | }); | ||||
// We support resolving modules according to `NODE_PATH`. | // We support resolving modules according to `NODE_PATH`. | ||||
// This lets you use absolute paths in imports inside large monorepos: | // This lets you use absolute paths in imports inside large monorepos: | ||||
// https://github.com/facebook/create-react-app/issues/253. | // https://github.com/facebook/create-react-app/issues/253. | ||||
// It works similar to `NODE_PATH` in Node itself: | // It works similar to `NODE_PATH` in Node itself: | ||||
// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders | // https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders | ||||
// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. | // Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. | ||||
// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. | // Otherwise, we risk importing Node.js core modules into an app instead of webpack shims. | ||||
// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421 | // https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421 | ||||
// We also resolve them to make sure all tools using them work consistently. | // We also resolve them to make sure all tools using them work consistently. | ||||
const appDirectory = fs.realpathSync(process.cwd()); | const appDirectory = fs.realpathSync(process.cwd()); | ||||
process.env.NODE_PATH = (process.env.NODE_PATH || '') | process.env.NODE_PATH = (process.env.NODE_PATH || '') | ||||
.split(path.delimiter) | .split(path.delimiter) | ||||
.filter(folder => folder && !path.isAbsolute(folder)) | .filter(folder => folder && !path.isAbsolute(folder)) | ||||
.map(folder => path.resolve(appDirectory, folder)) | .map(folder => path.resolve(appDirectory, folder)) | ||||
.join(path.delimiter); | .join(path.delimiter); | ||||
// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be | // Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be | ||||
// injected into the application via DefinePlugin in Webpack configuration. | // injected into the application via DefinePlugin in webpack configuration. | ||||
const REACT_APP = /^REACT_APP_/i; | const REACT_APP = /^REACT_APP_/i; | ||||
function getClientEnvironment(publicUrl) { | function getClientEnvironment(publicUrl) { | ||||
const raw = Object.keys(process.env) | const raw = Object.keys(process.env) | ||||
.filter(key => REACT_APP.test(key)) | .filter(key => REACT_APP.test(key)) | ||||
.reduce( | .reduce( | ||||
(env, key) => { | (env, key) => { | ||||
env[key] = process.env[key]; | env[key] = process.env[key]; | ||||
return env; | return env; | ||||
}, | }, | ||||
{ | { | ||||
// Useful for determining whether we’re running in production mode. | // Useful for determining whether we’re running in production mode. | ||||
// Most importantly, it switches React into the correct mode. | // Most importantly, it switches React into the correct mode. | ||||
NODE_ENV: process.env.NODE_ENV || 'development', | NODE_ENV: process.env.NODE_ENV || 'development', | ||||
// Useful for resolving the correct path to static assets in `public`. | // Useful for resolving the correct path to static assets in `public`. | ||||
// For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />. | // For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />. | ||||
// This should only be used as an escape hatch. Normally you would put | // This should only be used as an escape hatch. Normally you would put | ||||
// images into the `src` and `import` them in code to get their paths. | // images into the `src` and `import` them in code to get their paths. | ||||
PUBLIC_URL: publicUrl, | PUBLIC_URL: publicUrl, | ||||
// We support configuring the sockjs pathname during development. | |||||
// These settings let a developer run multiple simultaneous projects. | |||||
// They are used as the connection `hostname`, `pathname` and `port` | |||||
// in webpackHotDevClient. They are used as the `sockHost`, `sockPath` | |||||
// and `sockPort` options in webpack-dev-server. | |||||
WDS_SOCKET_HOST: process.env.WDS_SOCKET_HOST, | |||||
WDS_SOCKET_PATH: process.env.WDS_SOCKET_PATH, | |||||
WDS_SOCKET_PORT: process.env.WDS_SOCKET_PORT, | |||||
// Whether or not react-refresh is enabled. | |||||
// It is defined here so it is available in the webpackHotDevClient. | |||||
FAST_REFRESH: process.env.FAST_REFRESH !== 'false', | |||||
}, | }, | ||||
); | ); | ||||
// Stringify all values so we can feed into Webpack DefinePlugin | // Stringify all values so we can feed into webpack DefinePlugin | ||||
const stringified = { | const stringified = { | ||||
'process.env': Object.keys(raw).reduce((env, key) => { | 'process.env': Object.keys(raw).reduce((env, key) => { | ||||
env[key] = JSON.stringify(raw[key]); | env[key] = JSON.stringify(raw[key]); | ||||
return env; | return env; | ||||
}, {}), | }, {}), | ||||
}; | }; | ||||
return { raw, stringified }; | return { raw, stringified }; | ||||
} | } | ||||
module.exports = getClientEnvironment; | module.exports = getClientEnvironment; |