@f0rr0/node-config-ts v0.0.4
node-config-ts
A simple configuration manager for typescript based projects.
Table of contents
Usage
Install package
npm i node-config-tsAdd a
postinstallstep{ "scripts" : { "postinstall": "node-config-ts" } }Create a
configdirectory inside your project's root folder and add adefault.jsonfile. A typical folder structure looks as follows —root/ └── config/ └── default.jsondefault.jsonshould contain your application's configurationCreate typings
npm installA new
Config.d.tswill be generated automatically. This file could be ignored from git as it gets automatically generated based on the structure ofdefault.jsonImport and use
node-config-tsimport {config} from 'node-config-ts' console.log(config) // logs the config data from default.json
Configuration
The configs are merged in the following order of priority —
- Commandline params
- Environment variable
- User specific config file
- Deployment specific config file
- Environment specific config file
Using files
Configurations are loaded via config files that are written in JSON format for now. A typical project looks like this —
root/
└── config/
├── Config.d.ts
├── default.json
├── deployment/
│ ├── staging.example.com.json
│ ├── production.example.com.json
│ └── qa.example.com.json
├── env/
│ └── production.json
└── user/
├── ec2-user.json
├── andy.json
└── sara.jsonThere are three directories in which a project can have configurations — deployment, env and user. These directories can have multiple files inside them and based on the environment variables an appropriate config file is selected for overriding the base default.json. For example if the NODE_ENV variable is set to production the env/production.json configuration will be merged with default.json and override default values with its own. Similarly if DEPLOYMENT env variable is set to staging.example.com then deployment/staging.example.com.json is merged with the other configs. Here is a table for environment to directory mapping —
| process.env | directory |
|---|---|
| NODE_ENV | /config/env |
| DEPLOYMENT | /config/deployment |
| USER | /config/user |
Using environment variables
Whenever the value is prefixed with the letters @@ node-config-ts automatically looks for an environment variable with that name. For example —
// default.json
{
"port": "@@APP_PORT"
}In the above case automatically the value of port is set to the value that's available inside the environment variable PORT.
export APP_PORT=3000
node server.js // server started with config.port as 3000Using commandline params
The command line arguments can override all the configuration params. This is useful when you want to start a node server by passing the port externally —
node server.js --port 3000In the above case even if the default.json has a port setting of 9000 the cli argument can override it
// default.json
{
"port": 9000
}Differences with node-config
- No reserved words: With node-config you can not use a certain set of reserved words in your configuration. This is an unnecessary restriction and
node-config-tsdoesn't have it. - Simpler API: Instead of using methods such as
config.get('xxx')innode-configyou can simply use the exportedconfigobject. Warnings & Errors: node-config relies on calling the
getand thehasmethods to issue errors. This is unsafe typically when the configurations are different between your dev and production environments. Withnode-config-tsyou can trust the typescript compiler to issue an error immediately when you try to access a property that isn't defined anywhere. Consider the following case —#### default.json ```json { "port": 3000 } ``` #### user/john.json ```json { "baseURL": "/api" } ``` In the above case the final configuration *should* look something like this on `john`'s local machine — ```json { "port": 3000, "baseURL": "/api" } ``` ##### reading using node-config: ```ts import config from 'config' console.log(config.get('port')) console.log(config.get('baseURL')) // works locally but fails in production ``` This would work when `john` is running the application on his local machine. But as soon as its deployed in production the configuration property `baseURL` isn't available anymore and it results in runtime exceptions. ##### using node-config-ts: ```ts import {config} from 'node-config-ts' console.log(config.port) // proper intellisense support console.log(config.baseURL) // throws compile time error immediately on local machine. ``` Because the above object `config`, is exposed with proper typings, using invalid configurations results in typescript errors. This would happen on both — `john`'s computer and the production server.