2018-05-08 21:56:06 +00:00
|
|
|
|
// @flow
|
2018-08-16 20:38:13 +00:00
|
|
|
|
const {spawnSync, execFileSync} = require("child_process");
|
2018-02-18 16:13:29 +00:00
|
|
|
|
const fs = require("fs");
|
2018-08-16 20:38:13 +00:00
|
|
|
|
const stringify = require("json-stable-stringify");
|
2018-02-18 16:13:29 +00:00
|
|
|
|
const path = require("path");
|
2018-08-16 20:38:13 +00:00
|
|
|
|
|
2018-02-18 16:13:29 +00:00
|
|
|
|
const paths = require("./paths");
|
2018-02-17 21:28:47 +00:00
|
|
|
|
|
2018-08-16 20:38:13 +00:00
|
|
|
|
/*:: import type {GitState} from "../src/app/version"; */
|
|
|
|
|
|
2018-02-17 21:28:47 +00:00
|
|
|
|
// Make sure that including paths.js after env.js will read .env variables.
|
2018-02-18 16:13:29 +00:00
|
|
|
|
delete require.cache[require.resolve("./paths")];
|
2018-02-17 21:28:47 +00:00
|
|
|
|
|
|
|
|
|
const NODE_ENV = process.env.NODE_ENV;
|
|
|
|
|
if (!NODE_ENV) {
|
|
|
|
|
throw new Error(
|
2018-02-18 16:13:29 +00:00
|
|
|
|
"The NODE_ENV environment variable is required but was not specified."
|
2018-02-17 21:28:47 +00:00
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
|
|
|
|
|
var dotenvFiles = [
|
|
|
|
|
`${paths.dotenv}.${NODE_ENV}.local`,
|
|
|
|
|
`${paths.dotenv}.${NODE_ENV}`,
|
|
|
|
|
// Don't include `.env.local` for `test` environment
|
|
|
|
|
// since normally you expect tests to produce the same
|
|
|
|
|
// results for everyone
|
2018-05-08 21:56:06 +00:00
|
|
|
|
...(NODE_ENV !== "test" ? [`${paths.dotenv}.local`] : []),
|
2018-02-17 21:28:47 +00:00
|
|
|
|
paths.dotenv,
|
2018-05-08 21:56:06 +00:00
|
|
|
|
];
|
2018-02-17 21:28:47 +00:00
|
|
|
|
|
|
|
|
|
// 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. Variable expansion is supported in .env files.
|
|
|
|
|
// https://github.com/motdotla/dotenv
|
|
|
|
|
// https://github.com/motdotla/dotenv-expand
|
2018-02-18 16:13:29 +00:00
|
|
|
|
dotenvFiles.forEach((dotenvFile) => {
|
2018-02-17 21:28:47 +00:00
|
|
|
|
if (fs.existsSync(dotenvFile)) {
|
2018-02-18 16:13:29 +00:00
|
|
|
|
require("dotenv-expand")(
|
|
|
|
|
require("dotenv").config({
|
2018-02-17 21:28:47 +00:00
|
|
|
|
path: dotenvFile,
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// We support resolving modules according to `NODE_PATH`.
|
|
|
|
|
// This lets you use absolute paths in imports inside large monorepos:
|
|
|
|
|
// https://github.com/facebookincubator/create-react-app/issues/253.
|
|
|
|
|
// It works similar to `NODE_PATH` in Node itself:
|
|
|
|
|
// 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.
|
|
|
|
|
// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims.
|
|
|
|
|
// https://github.com/facebookincubator/create-react-app/issues/1023#issuecomment-265344421
|
|
|
|
|
// We also resolve them to make sure all tools using them work consistently.
|
|
|
|
|
const appDirectory = fs.realpathSync(process.cwd());
|
2018-02-18 16:13:29 +00:00
|
|
|
|
process.env.NODE_PATH = (process.env.NODE_PATH || "")
|
2018-02-17 21:28:47 +00:00
|
|
|
|
.split(path.delimiter)
|
2018-02-18 16:13:29 +00:00
|
|
|
|
.filter((folder) => folder && !path.isAbsolute(folder))
|
|
|
|
|
.map((folder) => path.resolve(appDirectory, folder))
|
2018-02-17 21:28:47 +00:00
|
|
|
|
.join(path.delimiter);
|
|
|
|
|
|
2018-08-16 20:38:13 +00:00
|
|
|
|
// Get the state of the SourceCred Git repository. This requires that
|
|
|
|
|
// Git be installed. If this fails for you, please install Git.
|
|
|
|
|
//
|
|
|
|
|
// If the dependency on Git becomes a problem, we can consider making
|
|
|
|
|
// this optional. However, note that this computation is performed at
|
|
|
|
|
// build time, so end users of SourceCred as a library or application
|
|
|
|
|
// should not need this dependency.
|
|
|
|
|
function getGitState() /*: GitState */ {
|
|
|
|
|
const env = {
|
|
|
|
|
LANG: "C",
|
|
|
|
|
LC_ALL: "C",
|
|
|
|
|
TZ: "UTC",
|
|
|
|
|
GIT_CONFIG_NOSYSTEM: "1",
|
|
|
|
|
GIT_ATTR_NOSYSTEM: "1",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const diffIndex = spawnSync(
|
|
|
|
|
"git",
|
|
|
|
|
["-C", __dirname, "diff-index", "--quiet", "HEAD", "--"],
|
|
|
|
|
{env}
|
|
|
|
|
);
|
|
|
|
|
const dirty = diffIndex.status !== 0;
|
|
|
|
|
if (diffIndex.status !== 0 && diffIndex.status !== 1) {
|
|
|
|
|
throw new Error(diffIndex.status + ": " + diffIndex.stderr.toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const commitHash = execFileSync(
|
|
|
|
|
"git",
|
|
|
|
|
["-C", __dirname, "rev-parse", "--short=12", "--verify", "HEAD"],
|
|
|
|
|
{env}
|
|
|
|
|
)
|
|
|
|
|
.toString()
|
|
|
|
|
.trim();
|
|
|
|
|
|
|
|
|
|
const commitTimestamp = execFileSync(
|
|
|
|
|
"git",
|
|
|
|
|
[
|
|
|
|
|
"-C",
|
|
|
|
|
__dirname,
|
|
|
|
|
"show",
|
|
|
|
|
"--no-patch",
|
|
|
|
|
"--format=%cd",
|
|
|
|
|
"--date=format:%Y%m%d-%H%M",
|
|
|
|
|
commitHash,
|
|
|
|
|
],
|
|
|
|
|
{env}
|
|
|
|
|
)
|
|
|
|
|
.toString()
|
|
|
|
|
.trim();
|
|
|
|
|
|
|
|
|
|
return {commitHash, commitTimestamp, dirty};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const SOURCECRED_GIT_STATE = stringify(getGitState());
|
|
|
|
|
process.env.SOURCECRED_GIT_STATE = SOURCECRED_GIT_STATE;
|
|
|
|
|
|
2018-08-29 22:06:12 +00:00
|
|
|
|
const SOURCECRED_FEEDBACK_URL =
|
|
|
|
|
process.env.SOURCECRED_FEEDBACK_URL != null
|
|
|
|
|
? process.env.SOURCECRED_FEEDBACK_URL
|
|
|
|
|
: "https://discuss.sourcecred.io/c/cred-feedback/";
|
|
|
|
|
process.env.SOURCECRED_FEEDBACK_URL = SOURCECRED_FEEDBACK_URL;
|
|
|
|
|
|
2018-08-16 18:19:09 +00:00
|
|
|
|
function getClientEnvironment() {
|
2018-08-16 18:27:37 +00:00
|
|
|
|
const raw = {};
|
|
|
|
|
// Useful for determining whether we’re running in production mode.
|
|
|
|
|
// Most importantly, it switches React into the correct mode.
|
|
|
|
|
raw.NODE_ENV = process.env.NODE_ENV || "development";
|
2018-08-16 20:38:13 +00:00
|
|
|
|
// Used by `src/app/version.js`.
|
|
|
|
|
raw.SOURCECRED_GIT_STATE = SOURCECRED_GIT_STATE;
|
2018-08-29 22:06:12 +00:00
|
|
|
|
// Used by `src/app/credExplorer/App.js`.
|
|
|
|
|
raw.SOURCECRED_FEEDBACK_URL = SOURCECRED_FEEDBACK_URL;
|
2018-08-16 18:27:37 +00:00
|
|
|
|
|
|
|
|
|
// Stringify all values so we can feed into Webpack's DefinePlugin.
|
|
|
|
|
const stringified = {"process.env": {}};
|
2018-08-31 23:34:18 +00:00
|
|
|
|
const individuallyStringified = {};
|
2018-08-16 18:27:37 +00:00
|
|
|
|
for (const key of Object.keys(raw)) {
|
2018-08-31 23:34:18 +00:00
|
|
|
|
const value = JSON.stringify(raw[key]);
|
|
|
|
|
stringified["process.env"][key] = value;
|
|
|
|
|
individuallyStringified["process.env." + key] = value;
|
2018-08-16 18:27:37 +00:00
|
|
|
|
}
|
2018-02-17 21:28:47 +00:00
|
|
|
|
|
2018-08-31 23:34:18 +00:00
|
|
|
|
return {raw, stringified, individuallyStringified};
|
2018-02-17 21:28:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = getClientEnvironment;
|