synapsecns/sanguine

View on GitHub
packages/solidity-devops/js/utils/env.js

Summary

Maintainability
A
1 hr
Test Coverage
const { assertCondition } = require('./utils.js')

// Read environment variables into process.env
const loadEnv = () => {
  require('dotenv').config()
}

/**
 * Merge the variable names into a single name, and convert it to uppercase.
 * E.g. mergeVarNames('foo', 'bar') will return 'FOO_BAR'.
 *
 * @param  {...string} varNames - The names of the environment variables to merge
 * @returns The merged variable name
 */
const mergeVarNames = (...varNames) => {
  return varNames.map((name) => name.toUpperCase()).join('_')
}

/**
 * Tries to read the value of an environment variable. If the variable is not set, returns undefined.
 * The variable names are case-insensitive and are concatenated with underscores.
 * E.g. mergeAndTryReadEnv('foo', 'bar') will try to read the value of process.env.FOO_BAR.
 *
 * @param  {...string} varNames - The names of the environment variables to read
 * @returns The merged variable name and value of the environment variable
 */
const mergeAndTryReadEnv = (...varNames) => {
  const varName = mergeVarNames(...varNames)
  const value = process.env[varName]
  return { varName, value }
}

/**
 * Tries to read the value of an environment variable. If the variable is not set, returns undefined.
 * The variable names are case-insensitive and are concatenated with underscores.
 * E.g. tryReadEnv('foo', 'bar') will try to read the value of process.env.FOO_BAR.
 *
 * @param  {...string} varNames - The names of the environment variables to read
 * @returns The value of the environment variable, or undefined if it is not set
 */
const tryReadEnv = (...varNames) => {
  const { value } = mergeAndTryReadEnv(...varNames)
  return value
}

/**
 * Reads the value of an environment variable. If the variable is not set, logs an error message and exits the process.
 * The variable names are case-insensitive and are concatenated with underscores.
 * E.g. readEnv('foo', 'bar') will try to read the value of process.env.FOO_BAR.
 *
 * @param  {...string} varNames - The names of the environment variables to read
 * @returns {string} The value of the environment variable
 * @throws If the environment variable is not set
 */
const readEnv = (...varNames) => {
  const { varName, value } = mergeAndTryReadEnv(...varNames)
  assertCondition(
    value !== undefined,
    `Environment variable ${varName} is not set`
  )
  return value
}

module.exports = { loadEnv, mergeVarNames, tryReadEnv, readEnv }