A dead simple module for storing and managing your environment variables in a simple and easy to read yaml file
Words: 567 - (3 min read)
Managing your environment variable in your different environments can be a pain. The idea behind envz
is that this process is made super simple and easy to understand leading to less mistakes.
# with npm
npm install envz
# or with Yarn
yarn add envz
Repo: https://github.com/mrvautin/envz
Usage
You should use envz
as early on in the entry point of your app as possible. Eg: app.js
or index.js
file which loads your app.
Rather than override process.env.x
object, envz
will return a new object to use throughout your app.
const { envz } = require('envz');
Create a env.yaml
or any other named file and load it:
const env = envz('env.yaml');
env YAML file structure
The idea is that the process.env
will be merged with loaded yaml
file.
env
uses a cascading (sequential order) configuration method which is easier to understand looking at an example.
base:
PORT: 1234
config:
default: test
development:
PORT: 3000
DATABASE: dev
config:
token: 12345
secret: fwdsdgl
production:
PORT: 80
DATABASE: prod
config:
token: 67890
key: puwndklf
truthy: true
allowed:
- card
- phone
The idea here is that the values in base
are loaded, anything in development
overrides that and finally production
overrides that depending on the NODE_ENV
set.
For example, when a NODE_ENV
of development
is set the following env
object is returned:
PORT: 3000,
config: {
default: 'test',
token: 12345,
secret: 'fwdsdgl'
},
DATABASE: 'dev'
...
Eg: Where the PORT
of 3000 from development
overrides the base
setting of 1234. If the NODE_ENV
is set to production
, then the PORT
will be set to 80.
The idea behind base
(or whatever you want to call it) is that you don't need to redefine defaults over and over for each environment.
Options
You can set the environment manually rather than using NODE_ENV
by adding an environment
object. Eg:
const env = envz('env.yaml', { environment: 'production' });
By default the values set in process.env
overrides what is set in your yaml file. You can change this so that the yaml file is king by adding the following flag:
const env = envz('env.yaml', { yamlFileOverride: true });
Save / Update config
Sometimes you may want to store changes back to your envz
config. You can easily do this by importing save
:
const { save } = require('envz');
The save
method takes an object with two values:
envfile
: The yaml file you are wanting to updatedata
: The object you want to update back to the file. See tests and example below.
// In this case we will be adding to the `base` config but you can easily
// replace `base` with `production` or whatever environment.
const saveObj = await save({
envfile: 'test.yaml',
data: {
base: {
config: {
default: 'default-key'
}
}
}
});
This will result in the test.yaml
being updated:
base:
PORT: 1234
config:
default: default-key
...