travetto: Config
The config module provides support for loading application config on startup. Configuration values support all valid yaml
constructs.
Resolution
Config loading follows a defined resolution path:
- Load framework module configurations. Defines general configuration that should be easily overridden.
node_modules/@travetto/<module>/config/*.yml
- Load local application configurations
config/*.yml
- Load profile specific configurations as defined by the values in
process.env.PROFILE
, process.env.ENV
or passed in as command line arguments.
process.env.PROFILE=<val1>,<val2>...
or
process.env.ENV=<val1>,<val2>...
would load
profile/<val1>.yml
profile/<val2>.yml
Additionally you can achieve the above state by invoking the app with parameters:
$ npm start <val1> <val2>
- Read startup configuration from
process.env
to allow for overriding any values. Because we are overriding ayaml
based configuration we need to compensate for the differences in usage patterns. Generally all environment variables are passed in as UPPER_SNAKE_CASE
. When reading from process.env
we will map UPPER_SNAKE_CASE
to upper.snake.case
, and will attempt to match by case-insensitive name.
Example Resolution
A more complete example setup would look like:
config/database.yml
database:
host: localhost
port: 9423
creds:
user: test
password: test
profile/prod.yml
database:
host: prod-host-db
creds:
user: admin-user
with environment variables
PROFILEI=prod
DATABASE_PORT=1234
DATABASE_CREDS_PASSWORD=<secret>
At runtime the resolved config would be:
database:
host: prod-host-db
port: 1234
creds:
user: admin-user
password: <secret>
Reading
The module provides a decorator, @Config
that allows for classes to automatically be bound with config information on post construction. The decorator will install a postConstruct
method if not already defined, that allows actually performs the binding of configuration.
The decorator takes in a namespace, of what part of the resolved configuration you want to bind to your class. Given the following class
@Config('database')
class DBConfig {
private host: string;
private port: number;
private creds = {
user: '',
password: ''
};
}
And the corresponding config file
database:
host: localhost
port: 9423
creds:
user: bob
password: bobspw
The instance of DBConfig
would be equivalent to:
{
host: 'localhost',
port: 9423,
creds : {
user: 'bob',
password: 'bobspw'
}
}