Platform agnostic configuration management library, with environmental variables and validation, like convict but simpler, cross env and using zod schemas.
Install package:
# npm
npm install figue zod
# yarn
yarn install figue zod
# pnpm
pnpm install figue zod
Import:
// ESM
import { defineConfig } from 'figue';
// CommonJS
const { defineConfig } = require('figue');
import { defineConfig } from 'figue';
import { z } from 'zod';
const { config } = defineConfig(
{
env: {
doc: 'Application current environment',
default: 'development',
schema: z.enum(['development', 'production', 'test']),
env: 'NODE_ENV',
},
port: {
doc: 'Application port to listen',
schema: z.coerce.number().int().positive(),
default: 3000,
env: 'PORT',
},
db: {
host: {
doc: 'Database server url',
schema: z.string().url(),
default: 'localhost',
env: 'APP_DB_HOST',
},
username: {
doc: 'Database server username',
schema: z.string(),
default: 'pg',
env: 'APP_DB_USERNAME',
},
password: {
doc: 'Database server password',
schema: z.string(),
default: '',
env: 'APP_DB_PASSWORD',
},
},
},
{
envSource: process.env,
},
);
console.log(config);
// {
// env: "development",
// port: 3000,
// db: {
// url: "https://localhost",
// username: "pg",
// password: "",
// },
// }
Use the envSource
key of the second argument of defineConfig
to specify the source of the environment variables:
const { config } = defineConfig(
{
/* ... */
},
{
envSource: process.env,
},
);
In some case you don't have access to a process.env
variable, like with vite
, just simply load what stores your env variables :
const { config } = defineConfig(
{
/* ... */
},
{
envSource: import.meta.env,
},
);
You can even specify you custom environment storage as long as it's a simple flat object map, for example:
const { config } = defineConfig(
{
env: {
doc: 'Application current environment',
default: 'development',
schema: z.enum(['development', 'production', 'test']),
env: 'NODE_ENV',
},
/* ... */
},
{
envSource: {
NODE_ENV: 'development',
PORT: '3000',
APP_DB_HOST: 'localhost',
APP_DB_USERNAME: 'pg',
APP_DB_PASSWORD: '',
},
},
);
If, for some reason, you have multiple sources of environment variables, you can use the envSources
key of the second argument of defineConfig
to specify an array of sources:
const { config } = defineConfig(
{
/* ... */
},
{
envSource: [import.meta.env, myEnvs],
},
);
Convict is meant to be used in node based environnement, it needs to have access to global variables that may may not be present in some environnement (like process
, global
), and it also imports fs
.
Figue is the french for fig -> con-fig.
- Clone this repository
- Install dependencies using
pnpm install
- Run interactive tests using
pnpm dev
Coded with ❤️ by Corentin Thomasset.
This project is under the MIT license.