Varium is a library and syntax for managing environment variables in a sane way. You should use it if you want to:
- declare all used environment variables in one place
- specify which types they have
- validate that they are of the right type
- cast environment variables to the right type when used
- require certain variables
- default to a value for other variables
- abort CI if variables are missing or fail validation
- warn developers if they use an undeclared environment variable
npm install varium --save
Requires node v6.5 or above.
Create a file called env.manifest
in the project root. It should contain all
environment variables used in the project. For example:
API_BASE_URL : String
API_SECRET : String
# This is a comment
# The following is an optional variable (the above were required):
NUMBER_OF_ITEMS : Int |
FLAG : Bool | False # Variables can also have default values. Here it is False
COMPLEX_VALUE : Json | [{ "object": 42 }] # Use json for advanced data structures
QUOTED_STRING : String | "Quote the string if it contains # or \\escaped chars"
Then create the file which all your other files imports to obtain the config.
For example config/index.js
. This needs to at least contain:
const varium = require('varium');
module.exports = varium();
Import this file in the rest of your project to read environment variables:
const config = require('../config');
const url = config.API_BASE_URL;
// An error will be thrown if you try to load an undeclared variable:
const wrong = config.API_BASE_ULR;
// -> Error('Varium: Undeclared env var "API_BASE_ULR.\nMaybe you meant API_BASE_URL?"')
To prevent other developers or your future self from using process.env
directly, use the no-process-env
eslint rule.
Your environment now needs to contain the required variables. If you use a
library to load .env
files (such as node-forman or dotenv), the .env
could
contain this:
API_BASE_URL=https://example.com/
API_SECRET=1337
NUMBER_OF_ITEMS=3
To abort builds during CI when environment variables are missing, just run the config file during th build step. For example, on heroku the following would be enough:
{
"scripts": {
"heroku-postbuild": "node ./config"
}
}
For a complete syntax and api reference (for example how to add your own custom types), see the docs.