i-do-config
v1.2.2
Published
Provide app configuration as key-value pairs from multiple providers. Inspired by ASP.net Core
Readme
Configuration
tl;dr Provide app configuration as key-value pairs from different providers. Inspired by ASP.net Core IConfiguration
Motivation
Providing app configuration in Node projects seems surprisingly hard. There are a million ways to choose from [citation needed]. Environment variables, JSON files... Well, that's two. But even with environment variables there are at least two different approaches. The real env vars (available via process.env.ENV_VAR_NAME) and the .env file. When using the .env file you'll most likely use the dotenv package.
This package was inspired by the ASP.net (Core) IConfiguration approach. A single class instance that you can pass around via DI (or any other way) and query for values.
Example
const providers = [
new EnvVarConfigurationProvider();
new JsonConfigurationProvider();
];
const config = new Configuration(providers);
const value = config.getValue("ENV_VAR"); // Returns a single value, eg. "my-value"
const section = config.getSection("foo"); // Returns an object, eg. { "key-a": "value-a", "key-b": "value-b", ... }Note: In your application you'll probably setup the providers via dependency injection.
Dependency injection
In your inversify.config.ts file do this:
import Container from "inversify";
import { Configuration, ExampleConfigProvider, IConfiguration, IConfigurationValueProvider } from "i-do-config";
const di = new Container({ defaultScope: "Singleton" });
decorate(injectable(), Configuration);
decorate(injectable(), ExampleConfigProvider);
di.bind<IConfigurationValueProvider>("ConfigProvider").to(ExampleConfigProvider);
di.bind<IConfiguration>("Configuration").to(Configuration);Please note:
ExampleConfigProviderdoes exist in this repository. Nor elsewhere.
Tests
Written in TypeScript, done with Mocha & Chai. Here's a working VS Code launch configuration:
{
"type": "node",
"request": "launch",
"name": "Tests",
"program": "${workspaceRoot}/node_modules/mocha/bin/_mocha",
"cwd": "${workspaceRoot}",
"args": [
"-u", "tdd",
"--no-timeouts",
"-r", "ts-node/register",
"--colors",
"${workspaceRoot}/test/**/*test.ts"
],
"protocol": "inspector",
"sourceMaps": true,
"internalConsoleOptions": "openOnSessionStart"
}Provider Options
You can pass provider-specific options to provider class instances. The only (optional) default member is the name property. You may implement other behaviour as you see fit (e.g. key/value formatters).
interface IConfigurationValueProviderOptions {
name?: string;
}
