YAML config files made simple for TypeScript and JavaScript using ESM.
Version 3.x
- The path is now passed to the
load()
method instead of the constructor - The
load()
method has now one argument: the path - The library was re-implemented using TypeScript and exports types
- The library can still be used using JavaScript
The DBs host and password are loaded either from a secrets file or from environment variables.
config/development.yml
db:
main
port: 5432
host: ${DB_HOST}
password: ${MAIN_DB_PASS}
myKey: myValue
anArray
- itemOne
- itemTwo
secrets.development.yml
DB_HOST: l.dns.porn
MAIN_DB_PASS: soSecureICantBelieveIt
The config loader decides based on the environment which config file to load. The following default environments are available (alternative names):
- development (dev)
- testing (test)
- integration (int)
- production (prod)
The environment can either be set by passing it as parameter to the application (e.g. --develpment
) or by defining it in the RAINBOW_ENV
or NODE_ENV
environment variable.
Based on the configured environment the config file is loaded. If the development
environment is active, the loader tries to load the config/development.yml
file.
It is based on the example config above.
import RainbowConfig from '@rainbow-config/RainbowConfig';
import { URL } from 'url';
import path from 'path';
const config = new RainbowConfig();
// you may add custom environments
config.addEnvironment('extra-env');
// you may load the config from a custom directory, default is config
config.setConfigDir('conf');
// get the directory where the config filder is located in
const rootdir = path.join(path.dirname(new URL(import.meta.url).pathname, '../');
// load the config file (the secrets dir parameter is optional)
await config.load(rootdir, secretsDir);
// get the full config object
const allKeys = config.get();
// get the db password
const dbPassword = config.get('db.main.password');
// prints: soSecureICantBelieveIt
console.log(dbPassword);
The constructor accepts optionaly the environment name asparameter 1
const config = new RainbowConfig();
You may optionally add an environment. You may also specify an alternative name that maps to the environment name i.e. int for integration.
The follwoing envormnents are available (alternative names):
- development (dev)
- testing (test)
- integration (int)
- production (prod)
config.addEnvironment('extra-env', 'alternative-name-for-extra-env');
You may change the directory the config files are located in. This defaults to config
.
config.setConfigDir('conf');
In order to load the config, you have to call the load
method. This will load the config from the ${rootPath}/config
directory.
This will load the config file an fill all variables that are either set in the environment or the secrets file. If a variable is not
found in an env variable, it is assumed, that it shall be loaded from the secrets file, which is located in the rootPath
passed to the
load(rootPath: string)
method. The secrets file has the name secrets.${environment}.yaml
. If the secretsDir is passed to the load method,
that directory will be used to load the secrets.
const rootdir = path.join(path.dirname(new URL(import.meta.url).pathname, '../');
await config.load(rootdir);
Get the complete config object.
const configData = config.get(undefined);
Get the a partial config object
const configData = config.get(`db.main`);
Get the a specific key
const configData = config.get(`db.main.password`);