@dydxfoundation/governance
Version:
dYdX governance smart contracts
130 lines (129 loc) • 4.78 kB
JavaScript
;
/**
* Utilities for parsing environment variables, with types.
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseSchema = exports.parseBN = exports.parseInteger = exports.parseNumber = exports.parseBoolean = exports.parseString = void 0;
const bignumber_js_1 = require("bignumber.js");
const lodash_1 = __importDefault(require("lodash"));
const hre_1 = require("../hre");
const errors_1 = require("../lib/errors");
const types_1 = require("../types");
function defaultIsValid(options) {
if (!options) {
return false;
}
return typeof options.default !== 'undefined';
}
function parseString(options) {
return (varName) => {
const value = process.env[varName];
if (!value) {
if (defaultIsValid(options)) {
return options.default;
}
throw new errors_1.ConfigError(`Missing required env var '${varName}' (string)`);
}
return value;
};
}
exports.parseString = parseString;
function parseBoolean(options) {
return (varName) => {
const rawValue = process.env[varName];
if (!rawValue) {
if (defaultIsValid(options)) {
return options.default;
}
throw new errors_1.ConfigError(`Missing required env var '${varName}' (number)`);
}
if (rawValue === 'true') {
return true;
}
if (rawValue === 'false') {
return false;
}
throw new errors_1.ConfigError(`Invalid boolean for env var '${varName}'`);
};
}
exports.parseBoolean = parseBoolean;
function parseNumber(options) {
return (varName) => {
const rawValue = process.env[varName];
if (!rawValue) {
if (defaultIsValid(options)) {
return options.default;
}
throw new errors_1.ConfigError(`Missing required env var '${varName}' (number)`);
}
const value = Number(rawValue);
if (Number.isNaN(value)) {
throw new errors_1.ConfigError(`Invalid number for env var '${varName}'`);
}
return value;
};
}
exports.parseNumber = parseNumber;
function parseInteger(options) {
return (varName) => {
const rawValue = process.env[varName];
if (!rawValue) {
if (defaultIsValid(options)) {
if (options.default !== null && !Number.isInteger(options.default)) {
throw new errors_1.ConfigError(`Expected integer default value for env var '${varName}'`);
}
return options.default;
}
throw new errors_1.ConfigError(`Missing required env var '${varName}' (integer)`);
}
const value = Number(rawValue);
if (!Number.isInteger(value)) {
throw new errors_1.ConfigError(`Invalid integer for env var '${varName}'`);
}
return value;
};
}
exports.parseInteger = parseInteger;
function parseBN(options) {
return (varName) => {
const rawValue = process.env[varName];
if (!rawValue) {
if (defaultIsValid(options)) {
return options.default === null ? null : new bignumber_js_1.BigNumber(options.default);
}
throw new errors_1.ConfigError(`Missing required env var '${varName}' (BigNumber)`);
}
const value = new bignumber_js_1.BigNumber(rawValue);
if (value.isNaN()) {
throw new errors_1.ConfigError(`Invalid BigNumber for env var '${varName}'`);
}
return value;
};
}
exports.parseBN = parseBN;
/**
* Process the schema and parse environment variables.
*
* Use type inference to presserve type information including which values may or may not be null.
*/
function parseSchema(schema, { prefix } = {}) {
const config = lodash_1.default.mapValues(schema, (parseFn, varName) => {
const fullVarName = prefix ? `${prefix}_${varName}` : varName;
return parseFn(fullVarName);
});
// Include helper functions.
return {
...config,
isMainnet: () => (0, hre_1.getNetworkName)() === types_1.NetworkName.mainnet,
isRopsten: () => (0, hre_1.getNetworkName)() === types_1.NetworkName.ropsten,
isKovan: () => (0, hre_1.getNetworkName)() === types_1.NetworkName.kovan,
isHardhat: () => (0, hre_1.getNetworkName)() === types_1.NetworkName.hardhat,
isTestnet: () => {
return [types_1.NetworkName.ropsten, types_1.NetworkName.kovan].includes((0, hre_1.getNetworkName)());
},
};
}
exports.parseSchema = parseSchema;