@kibibit/nconf-jsonc
A general typescript configuration service
Unless forced to create a new service, this service will return the first created service
Usage
Create a new class to define your configuration.
The class should extend the Config
class from this repo
import { IsNumber, IsString } from 'class-validator';
import { BaseConfig, Configuration, ConfigVariable } from '@kibibit/nconf-jsonc';
@Configuration()
export class ProjectConfig extends BaseConfig {
@ConfigVariable('Server port')
@IsNumber()
PORT: number;
@ConfigVariable([
'This is the slack API to talk and report to channel "hello"'
])
@IsString()
SLACK_API_KEY: string;
}
}
Then, in your code, initialize the config service when you bootstrap your application
import express from 'express';
import { ConfigService } from '@kibibit/nconf-jsonc';
import { ProjectConfig } from './project-config.model';
export const configService = new ConfigService<ProjectConfig>(ProjectConfig);
const app = express();
app.get( '/', ( req, res ) => {
res.send( 'Hello world!' );
} );
app.listen(configService.config.PORT, () => {
console.log(
`server started at http://localhost:${ configService.config.PORT }`
);
});
Extending the Configuration Service (Recommended)
You can extend the configuration to add your own customization and functions!
import { chain } from 'lodash';
import { ConfigService, IConfigServiceOptions } from '@kibibit/nconf-jsonc';
import { WinstonLogger } from '@kibibit/nestjs-winston';
import { ExtProjectConfig } from './ext-project-config.model';
import { initializeWinston } from './winston.config';
export class ExtConfigService extends ConfigService<ExtProjectConfig> {
public logger: WinstonLogger;
constructor(passedConfig?: Partial<ExtProjectConfig>, options: IConfigServiceOptions = {}) {
super(ExtProjectConfig, passedConfig, options);
initializeWinston(this.appRoot);
this.logger = new WinstonLogger('');
}
getSlackApiObject() {
const slackApiObject = chain(this.toPlainObject())
.pickBy((value, key) => key.startsWith('SLACK_'))
.mapKeys((value, key) => key.replace(/^SLACK_/i, ''))
.mapKeys((value, key) => key.toLowerCase())
.value();
return slackApiObject;
}
}
export const configService = new ExtConfigService() as ExtConfigService;
Features
- Supports JSON\YAML files\env variables\cli flags as configuration inputs. See
yaml-config
in the examples folder - Supports shared configuration files (same file shared for multiple projects)
- initialize a configuration file with
--saveToFile
or --init
- save configuration files anywhere above your project's package.json
- forced singleton for a single installation (reuse same class)
- testable
- The ability to create json schemas automatically and add descriptions
to configuration variables
- Get meaningfull errors when configuration is wrong!
Examples
See the examples folder for a variety of usage examples
Contributors ✨
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind are welcome!
Stay in touch