@luxuryescapes/lib-config
TypeScript icon, indicating that this package has built-in type declarations

0.0.6 • Public • Published

lib-config

Lets you define your config as ordinary code files The name of the file, maps to the name of the APP_ENV

Philosophy

The philosophy (summarised in confluence) is that ENV vars should be used only for secret config.

For other non-secret settings that vary between environments (eg. the API url, which might be test-api.com or api.com), it's easier to manage them in hard-coded config files. A single environment variable called APP_ENV determines what environment we're running in (development, test, production, etc) and the relevant config file is loaded based on that.

APP_ENV values

APP_ENV can be whatever you want. At Luxury Escapes, we typically use:

development
spec (for running automated tests - both in CI and locally
test (aka staging - but we've called it test in enough places that changing now is hard)
production

For javascript

// config/production.js (e.g. APP_ENV=production)

module.exports = {
  port: parseInt(process.env.PORT || ''),
  apiEndpoint: 'https://myprodapi.com'
}

For typescript

// config/production.ts (e.g. APP_ENV=production)

export const config = {
  port: parseInt(process.env.PORT || ''),
  apiEndpoint: 'https://myprodapi.com'
}

in your start up file you would have something like this

const config = require('@luxuryescapes/lib-config')
config.load({
  env: 'local', // optional, defaults to process.env.APP_ENV,
  schema: {
    // json schema of the config schema
    type: 'object',
    properties: {
      port: { type: 'integer' },
      apiEndpoint: { type: 'string' }
    },
    required: ['port', 'apiEndpoint'],
    additionalProperties: false
  },
  configDir: 'myconfig' // optional, default to `config`
})

then in other files you can do the following

const config = require('@luxuryescapes/lib-config')

express.listen(config.get().port)

get your test runner to load config as the first step

process.env.APP_ENV = 'spec'
const config = require('@luxuryescapes/lib-config')
config.load()

or

const config = require('@luxuryescapes/lib-config')
config.load({ env: 'spec' })

if you want to mock config for unit testing you can do something like this

const sinon = require('sinon')
const config = require('@luxuryescapes/lib-config')

beforeEach(() => {
  sinon.sandbox(config, 'get').returns({
    ...config.get(),
    myFeatureEnabled: false
  })
})

afterEach(() => {
  sinon.sandbox.restore()
})

Readme

Keywords

none

Package Sidebar

Install

npm i @luxuryescapes/lib-config

Weekly Downloads

317

Version

0.0.6

License

UNLICENSED

Unpacked Size

12.8 kB

Total Files

18

Last publish

Collaborators

  • georgia-wahib-le
  • jeanbiezus
  • deven.chen
  • emanuel.kozerski
  • elias.vieira
  • roberto-luxuryescapes
  • ethanscavia
  • jahanzeb-hussain-le
  • lukejudd-lux
  • chiamaka-ibeme-le
  • vincent-tran-le
  • welingtonlarsenlux
  • hfrankel
  • sangin.lee
  • tuanhung-pham-le
  • lukas-zimmermann-le
  • lux-alexd
  • william.idoine
  • edward.iskenderian
  • adham-oliveira
  • james-kwok-le
  • aleksandar.vuksanovic
  • nishanthi.n
  • glesage_le
  • daviaazevedo
  • william-ong
  • philippecarvalho
  • dulaj.pathirana
  • hamed.le
  • samhammond
  • paulo.silva3991
  • noahxny
  • dishang
  • ahmad.hafez
  • jordikitto_le
  • steve.dang
  • andrewjohnstone
  • brunohaveroth
  • pavel-lux
  • mary-le
  • pankaj-le
  • rubenbelem
  • gabe-miranda-lux
  • thilina-piyadasun-le
  • gabriel.costa.lux
  • icelic
  • cervantes.kenneth
  • harish-indla-le
  • eran.stiller.luxury.escapes
  • sakethgetla
  • nicholaspuglia
  • sitaraman
  • siddharth.bose
  • aarontoomey-le
  • sergio.costa.luxuryescapes
  • mzilio-lux
  • michael-reid-le
  • matthewdelaneyatluxuryescapes
  • ricardobalbinot
  • callmekev
  • semeer-acheerithodi-le
  • andrey-tryapitsin-le
  • quan.tang
  • alexander.yakovenko
  • greg-cumming-le
  • jerry.huang-le
  • dan-wanigasekera-le
  • dunedayl
  • arminmon-le
  • mattswansonlux
  • cleberricardi
  • felipefeal.lux
  • tracymu
  • chris.nguyen.lux
  • marhalpert
  • reb2020
  • zediah
  • sonyque
  • joshuacullenlux
  • shawn-cx-li
  • colins44
  • diegogadens
  • felixivanov
  • joshua.paling.le
  • operations.luxgroup
  • eddiemcleanlux
  • robert.harris.lux
  • kostya-luxuryescapes
  • alexb.pi
  • kaustuva
  • luizcarraro
  • ryan.tian
  • le_tyang
  • richardbiddle
  • henryshen-le
  • jamesly