@idoconfig/base v1.3.4
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 "idoconfig";
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:
ExampleConfigProvider
does 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;
}
5 years ago