envprops

Environment-specific property configuration library.

Usage no npm install needed!

<script type="module">
  import envprops from 'https://cdn.skypack.dev/envprops';
</script>

README

envprops Build Status NPM version

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.

Usage:

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

Using environment variables as the value

props.set('production', 'key', '$ENV:MY_KEY');

Using an external file:

var envprops = require('envprops'),
  props = envprops.get('users:service');

props.setMany(require('./config.json'));

props.get('key'); // value

Using local properties

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>

Setting a default value:

Use the all environment key to set a value for all environments:

{
  "key": {
    "development": "v1",
    "all": "v2"
  }
}

Configuring multiple environment at once

This can be done by providing comma-separated list of environments:

{
  "key": {
    "development,staging": 1,
    "production": 2
  }
}

Environment segments and globs

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'

Provide your own environment

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.

Contributors:

License

MIT