Shared JavaScript configuration for Node.js and web apps
Marshall is heavily inspired by convict. If you only need configuration management for a Node.js app, convict is the way to go.
- Use in any JavaScript environment
- Default values
- Environment variable overrides
- Command-line argument overrides
- Built-in documentation
- Strict validation by default
Warning: if your server config contains sensitive data, don't share it with your web application, since your secrets will be built into your application bundle.
npm install marshall
An example config.js
:
const marshall = require('marshall');
// Configuration schema
const config = marshall({
env: {
doc: 'The application environment',
format: ['production', 'development'],
default: 'development',
env: 'NODE_ENV',
arg: 'node-env',
},
port: {
doc: 'The port to bind',
format: 'port',
default: 8743,
env: 'PORT',
arg: 'port',
},
cacheDuration: {
doc: 'Length of time to cache static assets',
format: 'nat',
default: 5184000000, // 60 days
env: 'CACHE_DURATION',
arg: 'cache-duration',
},
api: {
doc: 'The API the application communicates with',
format: 'url',
default: 'https://api.company.com',
env: 'API',
arg: 'api',
},
});
module.exports = config;
const config = require('./config.js');
// Log a single configuration
console.log('Environment: ' + config.get('env'));
// Log all configurations
console.log('All config: ' + config.get());
// Log the current configuration details in a user-friendly format
console.log(config.doc());
// Log the current configuration details using the environment variable name as the key
console.log(config.env());
// Make use of a configuration
$.get(config.get('api') + '/users')
.done(function(allUsers) {
console.log(allUsers);
});
Use environment variables or command line arguments to override default settings.
API=https://api.mycompany.com node my-app.js
or
node my-app.js -- api=https://api.mycompany.com
or both
DEBUG=true node my-app.js --node-env=test
Validation is provided by validator.
Built-in validations:
Boolean
- value must betypeof Boolean
Number
- value must betypeof Number
String
- value must betypeof String
port
- value must be a number between 0 and 65535nat
- value must be a natural numberurl
- value must be a URLalpha
- value must contain only alphabetical charactersbool
- value must betrue
orfalse
date
- value must be a dateemail
- value must be an email addressfloat
- value must be a floating point numberip
- value must be an IP addressphone
- value must be a phone number (configurable locale)number
- value must be a number
To keep better organization of releases this project follows the Semantic Versioning 2.0.0 guidelines.
Want to contribute? Follow these recommendations.