@idoconfig/base
TypeScript icon, indicating that this package has built-in type declarations

1.3.4 • Public • Published

Configuration

tl;dr Provide app configuration as key-value pairs from different providers. Inspired by ASP.net Core IConfiguration

Version npm npm Downloads Build Status Dependencies Dev-Dependencies

NPM


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;
}

Readme

Keywords

Package Sidebar

Install

npm i @idoconfig/base

Weekly Downloads

1

Version

1.3.4

License

MIT

Unpacked Size

36.1 kB

Total Files

35

Last publish

Collaborators

  • riker09