@keg-hub/parse-config
Version:
Utils to allow loading non-javascript files into a node environment
118 lines (108 loc) • 4.73 kB
Markdown
# Parse-Config
* Helper package for parsing / loading config files with `.yml` and `.env` extensions
* Includes simple template system for dynamically setting config values
## Install
* With `yarn` => `yarn add @keg-hub/parse-config`
* With `npm` => `npm install @keg-hub/parse-config`
## Usage
* Require the package in your code as needed
```js
// Import the entire package
const PConf = require('@keg-hub/parse-config')
const ymlObj = await PConf.yml.load(...)
const envObj = await PConf.env.load(...)
const templateStr = await PConf.template.fill(...)
// Import just sections from the package
const { yml, env, template } = require('@keg-hub/parse-config')
const ymlObj = await yml.load(...)
const envObj = await env.load(...)
const templateStr = await template.fill(...)
// Import just specific methods from the package
const { loadYml, loadEnv, fillTemplate } = require('@keg-hub/parse-config')
const ymlObj = await loadYml(...)
const envObj = await loadEnv(...)
const templateStr = await fillTemplate(...)
// Load configs based on environment from both .env and .yaml files
const { loadConfigs } = require('@keg-hub/parse-config')
const configObj = await loadConfigs(...)
```
## Loading Config Files
* The `loadConfigs` method can be used to automatically load config files
* The config file names are generated from the passed in options
* All found files are loaded, and merged together as a single config object
### Priority
* Priority is based on the **name** and **location** of the loaded file
* The `.env`, then `defaults.env` files are always loaded first when `noEnv` === `false`, regardless of their location
* Files loaded last, override previously loaded config values
* For `values` files, both `yml` and `yaml` extentions are searched for
* Because `yaml` is technically the correct extension, it will override the `yml` counterpart
**File Name**
* Given the following config options
* `env` === `staging`
* `ymlName` === `values`
* `name` === `app`
* `noEnv` === `false`
* `noYml` === `false`
* `ymlPath` === `env`
* Files will be loaded in the following order,
* First `.yml` files, then `.yaml` files, and finally `.env` files. See below example
* `.env` then `defaults.env` ==> Always comes first when `noEnv` === `false`
* `values.yml` then `values.yaml`
* `staging.yml` then `staging.yaml`
* `app.yml` then `app.yaml`
* `values_staging.yml` then `values_staging.yaml`
* `values_app.yml` then `values_app.yaml`
* `values_staging_app.yml` then `values_staging_app.yaml`
* `values.staging.yml` then `values.staging.yaml`
* `values.app.yml` then `values.app.yaml`
* `values.staging.app.yml` then `values.staging.app.yaml`
* `values-staging.yml` then `values-staging.yaml`
* `values-app.yml` then `values-app.yaml`
* `values-staging-app.yml` then `values-staging-app.yaml`
* `.env.staging`
* `.env.app`
* `.env_app_staging`
* `.env.app.staging`
* `.env.app-staging`
* `staging.env`
* `app.env`
* `app_staging.env`
* `app.staging.env`
* `app-staging.env`
**Locations**
* After the file names are generated, they are appended to the generated locations
* Some locations are predefined, but custom locations can also be passed via the `locations` array config option
* Custom locations are **ALWAYS** checked after the default locations
* This allows for any files loaded from the custom locations to override the defaults
### loadConfigs - Config Options
```js
const { loadConfigs } = require('@keg-hub/parse-config')
const configObj = await loadConfigs({
// Environment prefix of the config files to be loaded ( i.e. `production.env` )
env: `local`,
// App prefix of the config files to be loaded ( i.e. `my-app.production.env` )
name: ``,
// Should errors be thrown when a file exists but can't be loaded
error: true
// Skip loading .env files
noEnv: false,
// Skip loading .yaml files
noYml: false,
// The reference name of the values files to be loaded ( i.e. `values.local.yml` )
ymlName: `values`,
// Object path to return from loaded yml files
ymlPath: `env`,
// Format type the config should be returned as ( object | string )
format: `object`,
// Run template replace on the loaded config files
fill: true,
// Template data to fill config file with ( Requires the `fill` options value is `true` )
data: {...},
// RegEx patten when running template replace
pattern: /{{([^}]*)}}/g
// Extra file path and directories to search for config files
locations: [...]
// How found configs should be merged. Must be one of overwrite | join | unique.
mergeStrategy: `overwrite`
})
```