UNPKG

@dydxfoundation/governance

Version:
130 lines (129 loc) 4.78 kB
"use strict"; /** * 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;