@netlify/build
Version:
Netlify build module
43 lines (42 loc) • 1.9 kB
JavaScript
import { env } from 'process';
import { includeKeys } from 'filter-obj';
// If plugins modify `process.env`, this is propagated in other plugins and in
// `build.command`. Since those are different processes, we figure out when they
// do this and communicate the new `process.env` to other processes.
export const getNewEnvChanges = function (envBefore, netlifyConfig, netlifyConfigCopy) {
const processEnvChanges = diffEnv(envBefore, env);
const netlifyConfigEnvChanges = diffEnv(netlifyConfig.build.environment, netlifyConfigCopy.build.environment);
return { ...processEnvChanges, ...netlifyConfigEnvChanges };
};
const diffEnv = function (envBefore, envAfter) {
const envChanges = includeKeys(envAfter, (name, value) => value !== envBefore[name]);
const deletedEnv = includeKeys(envBefore, (name) => envAfter[name] === undefined);
const deletedEnvA = Object.fromEntries(Object.entries(deletedEnv).map(setToNull));
return { ...envChanges, ...deletedEnvA };
};
// `undefined` is not JSON-serializable (which is used in process IPC), so we
// convert it to `null`
// Note: `process.env[name] = undefined` actually does
// `process.env[name] = 'undefined'` in Node.js.
const setToNull = function ([name]) {
return [name, null];
};
// Set `process.env` changes from a previous different plugin.
// Can also merge with a `currentEnv` plain object instead of `process.env`.
export const setEnvChanges = function (envChanges, currentEnv = env) {
Object.entries(envChanges).forEach(([name, value]) => {
setEnvChange(name, value, currentEnv);
});
return { ...currentEnv };
};
const setEnvChange = function (name, value, currentEnv) {
if (currentEnv[name] === value) {
return;
}
if (value === null) {
// `currentEnv` is a mutable variable
delete currentEnv[name];
return;
}
currentEnv[name] = value;
};