# brewstand

> Environment variable-overriable configuration

Latest version **1.0.6** (published 2020-10-26) · MIT license · 0 weekly downloads

## Install

```sh
npm install brewstand
pnpm add brewstand
yarn add brewstand
bun add brewstand
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.6 |
| Published | 2020-10-26 |
| First published | 2020-09-14 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 13.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | dousha99 |
| Maintainers | dousha99 |

## Links

- npm: https://www.npmjs.com/package/brewstand
- Repository: dousha@dsstudio.tech:/srv/git/brewstand
- npm.io page: https://npm.io/package/brewstand

## Recent versions

- 1.0.6 (latest) — 2020-10-26
- 1.0.5 — 2020-10-26
- 1.0.4 — 2020-09-15
- 1.0.3 — 2020-09-14
- 1.0.2 — 2020-09-14
- 1.0.1 — 2020-09-14
- 1.0.0 — 2020-09-14

## README

# Brewstand - Configuration overridden with Environment Variables

## Installation

```
$ yarn add brewstand
-- or --
$ npm install brewstand
```

## Usage

Create a `Configuration` object to load your configuration JSON file 
into your configuration interface. By default, it loads `config.json` in 
the **current working directory**.

```ts
class Configuration<ConfigurationObjectType>(path: string);
```

Then call `Configuration#getConfig()` to obtain your configuration object.

## Example

### Loading a simple configuration

```ts
// in index.ts
interface Config {
    host: string;
    port: number;
}

const config = new Configuration<Config>("./config.json").getConfig();

console.log(config.host);
console.log(config.port);
```

```json
/* in config.json */
{
    "host": "localhost",
    "port": 1234
}
```

The type of configuration entries are converted when loading the JSON file 
and reading environment variables. See **Type Conversion** for further details.

Configuration could be overridden by environment variables. 
This is particularly useful when your deployment configuration differs with 
your testing configuration.

```sh
$ node index.js
localhost
1234
$ HOST="app" PORT="50002" node index.js
app
50002
```

### Loading a nested configuration

It can handle nested configuration as well:

```ts
interface PlainTextCredential {
    username: string;
    password: string;
}

interface RedisConfig {
    host: string;
    port: number;
}

interface SqlConfig {
    host: string;
    port: number;
    cred: PlainTextCredential;
    database: string;
}

interface Config {
    redis: RedisConfig;
    sql: SqlConfig;
}

const config = new Configuration<Config>().getConfig();

console.log(config.sql.cred.username);
```

Use underscores (`_`) or dots (`.`) to address sub-keys:

```sh
$ SQL.CRED.USERNAME="testUser" node index.js
testUser
$ SQL_CRED_USERNAME="productionUser" node index.js
productionUser
```

## Type Conversion

### Number

If the key is a number, the value will be converted to a number.

If the value could not be converted to a number, the key 
will not be overridden.

### Boolean

If the key is a boolean, the value will be converted to a boolean 
following the rules below:

* Empty values are ignored
* Anything other than `true` is regarded as `false`. `yes`, `1` and other
  "should be true" values are all regarded as `false`.

### Object / Array

If the key is an object or an array, the value will be parsed as 
a JSON string.

If the parsing failed, the key will not be overridden.

## Caveats

### Use UPPER CASE LETTERS for environment variable name

Lower case variables will be ignored.

### Must provide a configuration file with correct type

The override part requires the variable to be set and correctly typed. 
Setting an undefined value will raise an error. This is due to the 
limitation of JavaScript (cannot preserve type information). 
Further version may implement specifying the type of an absent key.

---
_Source: https://npm.io/package/brewstand · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
