# Usages

# Simple usage

As said in the introduction the package is split in 3 components: loaders, parsers and validators. The following example assumes that you have created a configuration file in conf/app.json.

import { fromLoadable, parsers, loaders, validators, FileLoaderOptions } from '@configuration-parsing/core'

type MyConfiguration = {
    db: string,
    currentMode: string
}

const factory =
    // We want to load the configuration from file system.
    fromLoadable<MyConfiguration, FileLoaderOptions>(loaders.file())
        // We want to parse the content with the json parser.
        .parsingWith(parsers.json())
        // We skip the validation step.
        .validatingWith(validators.empty())

// Fetch the configuration
const configuration = await factory.create({ location: 'conf/app.json' })

# Validate the configuration

In the previous example the validation step was skipped. We can validate our configuration by passing another validator. For example, we can use @configuration-parsing/validator-joi to validate the configuration with a joi schema.

import { fromLoadable, parsers, loaders, validators, FileLoaderOptions } from '@configuration-parsing/core'
import { joiConfigurationValidator } from '@configuration-parsing/validator-joi'
import Joi from 'joi'

type MyConfiguration = {
    db: string,
    currentMode: string
}

const myConfigurationSchema = Joi.object({
    db: Joi.string().required(),
    currentMode: Joi.string().required()
})

const factory =
    // We want to load the configuration from file system.
    fromLoadable<MyConfiguration, FileLoaderOptions>(loaders.file())
        // We want to parse the content with the json parser.
        .parsingWith(parsers.json())
        // We validate the configuration using a joi schema.
        .validatingWith(joiConfigurationValidator(myConfigurationSchema))

// Fetch the configuration
const configuration = await factory.create({ location: 'conf/app.json' })

# Using another parser

@configuration-parsing/core only includes a JSON parser, you can find other parsers in the @configuration-parsing namespace. You can, for example, parse a Toml configuration:

Note: You need to run npm install @configuration-parsing/parser-toml to use the toml parser.

# conf/app.toml
db = "mongodb://root:root@localhost:27017/my-db"
currentMode = "dev"
import { fromLoadable, loaders, validators, FileLoaderOptions } from '@configuration-parsing/core'
import { joiConfigurationValidator } from '@configuration-parsing/validator-joi'
import { tomlConfigurationParser } from '@configuration-parsing/parser-toml'
import Joi from 'joi'

type MyConfiguration = {
    db: string,
    currentMode: string
}

const myConfigurationSchema = Joi.object({
    db: Joi.string().required(),
    currentMode: Joi.string().required()
})

const factory =
    // We want to load the configuration from file system.
    fromLoadable<MyConfiguration, FileLoaderOptions>(loaders.file())
        // We want to parse the content with the json parser.
        .parsingWith(tomlParser())
        // We validate the configuration using a joi schema.
        .validatingWith(joiConfigurationValidator(myConfigurationSchema))

// Fetch the configuration
const configuration = await factory.create({ location: 'conf/app.toml' })

# Combine parsers

You can also combine parser to create a composite parser. It can help you when you want to use multiple configuration format.

import { parsers } from '@configuration-parsing/core'
import { yamlConfigurationParser } from '@configuration-parsing/parser-yaml'
import { tomlConfigurationParser } from '@configuration-parsing/parser-toml'

const chainParser = parsers.chain([
    parsers.json(),
    yamlConfigurationParser(),
    tomlConfigurationParser()
])

# Using process.env

Some loaders provide already parsed data such as loaders.env(). Those loaders do not use the same interface as the previously seen file loader.

import { fromParsedLoadable, loaders, validators, ProcessEnv } from '@configuration-parser/core'
import { joiConfigurationValidator } from '@configuration-parsing/validator-joi'
import Joi from 'joi'

type EnvConfig = { FOO: string }
const envConfigSchema = Joi.object({ FOO: Joi.string().required() })

const factory =
    fromParsedLoadable<EnvConfig, ProcessEnv> (loaders.env())
        .validatingWith(joiConfigurationValidator(envConfigSchema))

const configuration = await factory.create(process.env)