The purpose of this library is to store and retrieve environment-specific configuration.
The main distinguishing feature is the way one sets the properties. In many other libraries you provide environments, which contain keys that in turn contain values:
{
development: {
a: 'v1',
b: 'v2'
},
production: {
a: 'v3',
b: 'v4'
}
}
The problem we've often seen is that people set a key in one environment, but not in the other. This is especially true when the number of keys is large, and thus one key is visually distant from the same key in another environment.
To remedy this, envprops
takes a different approach. The key goes first,
then multiple environments, with values for each:
{
a: {
development: 'v1',
production: 'v2'
},
b: {
development: 'v3',
production: 'v4'
}
}
As there are fewer environments than keys, it is harder to make the mistake of forgetting an environment than it is of forgetting a key.
var envprops = require('envprops'),
props = envprops.get('users:service'); // namespace
// params: key: {env1: value1, env2: value2}
props.setMany({
serviceVersion: {
'development,staging': '1.0.0',
'production': '2.0.0',
'production.*.az1': '4.0.0'
}
});
// params: env, key, value
props.set('production.dc1', 'serviceVersion', '3.0.0');
// NODE_ENV = 'staging' or NODE_ENV = 'development'
props.get('serviceVersion'); // 1.0.0
// NODE_ENV = 'production.dc1'
props.get('serviceVersion'); // 3.0.0
// NODE_ENV = 'production.dc2'
props.get('serviceVersion'); // 2.0.0
// NODE_ENV = 'production.dc1.az1'
props.get('serviceVersion'); // 4.0.0
// NODE_ENV = 'production.dc2.az1'
props.get('serviceVersion'); // 4.0.0
props.set('production', 'key', '$ENV:MY_KEY');
var envprops = require('envprops'),
props = envprops.get('users:service');
props.setMany(require('./config.json'));
props.get('key'); // value
To get properties that will not be kept in memory,
simply use create
instead of get
and don't provide a namespace:
var globalProps = property.create();
globalProps.get('key'); // <value>
Use the all
environment key to set a value
for all environments:
{
"key": {
"development": "v1",
"all": "v2"
}
}
This can be done by providing comma-separated list of environments:
{
"key": {
"development,staging": 1,
"production": 2
}
}
Another feature that is supported by this library is environment segments. Segmenting the environment may be useful if multiple keys make up an environment (e.g., region and data-center). Here's an example:
{
"key": {
"prod.dc1.eu": "v2",
"prod.*.eu": "v3"
}
}
NODE_ENV = prod.dc1.eu
props.get('key'); // 'v2'
NODE_ENV = prod.dc7.eu
props.get('key'); // 'v3'
var envprops = require('envprops'),
props = envprops('production');
In addition, since NODE_ENV is often used by other libraries with a different meaning and set of values, you can use NODE_ENV_APP instead to control this library.