env-o-loader v1.0.7
Env-o-Loader
This is a helper to make easier loading enviroment-oriented settings.
Genesis
This code was born inside B2WAds code base, and it made sense to release this as open source.
Use
Simply import the module and call it as a function:
const loader = require("env-o-loader")
const settings = loader(require("config/my-app"))The configuration object must have a defaults key at least, and should have a
key for each environment you intent to work with.
Environments as primitive values
Let’s take the following JSON settings file:
{
"defaults": "some default value",
"test": "test environment",
"production": "env:MY_VAR"
}Env-o-Loader will select the environment according to the NODE_ENV envvar
content, defaults to development.
- If
NODE_ENVistest, Env-o-Loader returns"test environment"; - If
NODE_ENVisproduction, Env-o-Loader returns the content of theMY_VARenvvar; - If
NODE_ENVis something else, Env-o-Loader returns"some default value".
You also can supply the environment you want as second parameter:
loader(require("./config"), "sandbox")Environments as object
The object environment advantage is that the defaults value fullfills the
undefined keys.
For example:
{
"defaults": {
"x": 3,
"y": 4
},
"development": {
"z": 5
}
}Under development environment, Env-o-Loader returns the following object:
{ x: 3, y: 4, z: 5 }Nested keys
You can use nested keys. For example, the sample above can be written as:
{
"defaults": {
"x": 3,
"y": 4
},
"development.z": 5
}With the same result.
Nested keys can be multilevel:
{
"defaults": {},
"development": {
"foo.bar.a": true,
"foo.bar.b": false,
"foo.baaz": null
}
}Leading to:
{
foo: {
bar: { a: true, b: false },
baaz: null,
},
}And can be compound with unnested one:
{
"defaults": {},
"development": {
"foo": { "baaz": null },
"foo.bar": { "a": true },
"foo.bar.b": false
}
}Data from envvar
Using the env: prefix, Env-o-Loader loads the content from an envvar.
To load objects from envvar, use querystring format:
{
"defaults": {},
"production": "env:SETTINGS"
}env SETTINGS="x=3&y=4&foo[]=bar&foo[]=baaz"Nested objects can be got like:
env SETTINGS="v[x]=3&v[y]=4"Other types
If you must load settings from JSON or envvar, Env-o-Loader supports more types than those formats, serialised as string.
- Date: use ISO 8601:
2010-10-10for October 10, 2010. - Time: use ISO 8601:
2010-10-10T12:30:00Zfor October 10, 2010, 12:30 UTC. - Duration: use ISO 8601:
P3Y6M4DT12H30M5Sfor 3 year, 6 months, four days, 12 hours, 30 minutes, and 5 seconds. - Regular expressions: write the regex inside a string. For example:
"/\\w(cde)?/i"means/\w(cde)?/i.
Extras only in querystring:
nullstring resolves tonulltruestring resolves totruefalsestring resolves tofalse- anything parseable to number resolves to number
To force string, you must prefix the value with raw::
raw:nullresolves to"null"raw:2010-10-10resolves to"2010-10-10"raw:PT12Hresolves to"PT12H"raw:42resolves to"42"raw:env:HOMEresolves to"env:HOME"raw:raw:resolves to"raw:"
Loading files
Env-o-Loader can load files by its names. The supported types are JSON and YAML.
The JSON file string must ends with .json, and the YAML file string
must ends with .yaml or .yml.
Examples:
loader("./config/data.json")loader("../../settings.yaml")
License
This code is licensed under the 3-Clause BSD License.