New Configuration System
The Config.get Method
The legacy Config.get method has been removed and the Config.get2 method has been renamed to Config.get.
If you were still using the old method, update your code as follows:
// Version 1
const foobar = Config.get('hello.world');
const debug = Config.get<boolean>('settings.debug');
const port = Config.get('port', 3001);
const port = Config.get<number>('port', 3001);
// Version 2
const foobar = Config.get('hello.world');
const debug = Config.getOrThrow('settings.debug', 'boolean');
const port = Config.get('port', 'number', 3001);
const port = Config.get('port', 'number', 3001);
More details can be found here.
Environment Variables
Environment variables are no longer loaded by default. You must specify them explicitly.
For example, Config.get('settings.jwt.secret') will not return the environment variable SETTINGS_JWT_SECRET by default. To do this, you must specify it explicitly in a configuration file:
- YAML
- JSON
- JS
settings:
  jwt:
    secret: env(SETTINGS_JWT_SECRET)
{
  "settings": {
    "jwt": {
      "secret": "env(SETTINGS_JWT_SECRET)",
    }
  }
}
const { Env } = require('@foal/core');
module.exports = {
  settings: {
    jwt: {
      secret: Env.get('SETTINGS_JWT_SECRET')
    }
  }
}
The Config and ConfigMock services
The Config class can no longer be used as a service. You must use its static methods instead. Therefore, the ConfigMock class has also been removed.
// Before
export class Controller {
  @dependency
  config: Config;
  foo() {
    const foobar = this.config.get('foobar');
  }
}
// After
export class Controller {
  foo() {
    const foobar = Config.get('foobar');
  }
}
New features
Multiple .env files for each environment
Just like the JSON and YAML configuration files, it is now possible to have a separate .env file for each environment: .env.test, .env.production, etc.
The values provided in a .env.{environment} file override those defined in the default .env file.
Read an environment variable from .env
Environment variables defined in the .env file can be accessed through the Env.get method.
Comments and quotes in .env files
The .env files now support the use of comments and quotes.
# This a comment
HELLO="hello world"
HELLO='hello world'
JS configuration files
In addition to the JSON and YAML formats, configuration files can now also be written in JS.
const { Env } = require('@foal/core');
module.exports = {
  settings: {
    debug: false,
    jwt: {
      secret: Env.get('SETTINGS_JWT_SECRET')
    }
  }
}
Cloud PaaS providers
Since the configuration keys are no longer linked to a specific environment variable, deployment with PaaS providers is facilitated.
For example, in version 1, the URI of MongoDB had to be passed with the environment variable MONGODB_URI. If the cloud provider were giving the URI using the name MONGO_URI, things were becoming more difficult. This problem is now solved with the env(*) and Env.get features.