env-contract-check
Version:
Create a contract of environment varaibles for different environments.
96 lines (80 loc) • 3.21 kB
JavaScript
const debug = require('debug')('ENV-CONTRACT-CHECK');
const table = require('markdown-table');
const dot = require('dot-prop');
const isDocker = require('is-docker');
const contract = {};
let NODE_ENV_SET_BY_ECC = false;
// Check
const env = (function env() {
if (!process.env.NODE_ENV) {
debug('NODE_ENV is not set');
NODE_ENV_SET_BY_ECC = true;
if (isDocker()) process.env.NODE_ENV = 'docker';
else process.env.NODE_ENV = 'development';
console.log('NODE_ENV HAS NOT BEEN SET DEFAULTING TO', process.env.NODE_ENV);
return process.env.NODE_ENV;
}
console.log('NODE_ENV', process.env.NODE_ENV);
return process.env.NODE_ENV;
}());
module.exports.register = function register(terms) {
if (env !== process.env.NODE_ENV) {
throw new Error('NODE_ENV has been changed by the process. env-contract-check does not allow this after it has been required.');
}
function registerHandle(term) {
if (typeof term !== 'object') throw new Error('not an object');
if (!term.name) throw new Error('missing variable name of environemnt variable');
if (!term.defaults) {
debug('no term defaults object');
term.defaults = {};
}
if (contract[term.name] && term.allowReregister) throw new Error('env varaible already registered');
contract[term.name] = term;
// If not set
if (!dot.has(process.env, term.name)) {
debug(`${term.name} not set`);
// If not optional and no default
if (!term.optional && term.defaults[env] === undefined) throw new Error(`${term.name} required no default for NODE_ENV ${env}. Contract Failed!`);
// Set Default
if (term.defaults[env]) {
debug(`${term.name} default avaliable`);
dot.set(process.env, term.name, term.defaults[env]);
if (term.echo) console.log(`${term.name} ENV varaible set to default ${term.hidden ? '{HIDDEN}' : dot.get(process.env, term.name)} `);
return;
}
// Optional
if (term.echo) {
debug(`${term.name} optional no default`);
console.log(`${term.name} ENV varaible optional with not default not set`);
}
} else if (term.echo) {
debug(`${term.name} set`);
console.log(`${term.name} ENV varaible set externally ${term.hidden ? '{HIDDEN}' : dot.get(process.env, term.name)} `);
}
}
if (Array.isArray(terms)) {
debug('register array of environment varaibles');
terms.forEach(term => registerHandle(term));
} else {
debug('register single environment varaible');
registerHandle(terms);
}
};
// Called after env is set
module.exports.strict = function strict() {
if (NODE_ENV_SET_BY_ECC) {
console.error('NODE_ENV was not set. Failing due to env-contract-check strict().');
process.exit(1);
}
};
module.exports.summary = function sumamry() {
const data = Object.keys(contract).map((key) => {
const c = contract[key];
const optional = c.optional ? 'Y' : ' ';
const value = c.hidden ? '{HIDDEN}' : dot.get(process.env, c.name);
return [key, optional, value];
});
data.unshift(['Varaible', 'Optional', 'Value']);
// data.unshift(['ENV-CONTRACT-CHECK']);
console.log(`\nENV-CONTRACT-CHECK\n${table(data)}\n`);
};