1.0.2 • Published 7 months ago

mono-config v1.0.2

Weekly downloads
-
License
ISC
Repository
github
Last release
7 months ago

mono-config

The mono-config package provides a simple way to share and manage configuration across your monorepo. We wrap the commonly used config package to provide additional functionality, specifically for monorepos.

Installation

npm install mono-config

Usage

Config

First, import the config object from mono-config:

import { config } from "mono-config";

There are two main ways to use this config object to access your configuration values:

Without validation

You can get the configuration value by providing the path for your configurations:

const value = config.get("settings.db.host");

With validation

The config object allows you to ensure configuration values are meet certain criteria using Zod schemas.

First, define your schema:

import { z } from "zod";

const firstAppSchema = z.object({
  name: z.string(),
  db: z.object({
    host: z.string(),
    port: z.number(),
    user: z.string(),
    password: z.string(),
  }),
});

Now, you can get and validate your configuration values:

const firstAppConfig = config.get("first_app", firstAppSchema);

If the value of the first_app configuration does not meet the schema, an error with a detailed explanation will be thrown.

ConfigManager

This class will help ou manage your configurations accross microservices in your monorepo. Import the ConfigManager class from mono-config:

import { ConfigManager } from "mono-config";

Let's assume your monorepo configuration looks like this:

{
  "first_app": {
    "name": "First App",
    "port": 3000,
    "db": {
      "host": "localhost",
      "port": 5432,
      "user": "user",
      "password": "password"
    }
  },
  "second_app": {
    "name": "Second App",
    "port": 3001
  }
}

Create the corresponding Zod schema for each configuration (property / microservice) you want to validate and manage:

const firstAppSchema = z.object({
  name: z.string(),
  port: z.number(),
  db: z.object({
    host: z.string(),
    port: z.number(),
    user: z.string(),
    password: z.string(),
  }),
});

const secondAppSchema = z.object({
  name: z.string(),
  port: z.number(),
});

Then, create a ConfigManagerMap to associate each schema with it's configuration path:

const cmm = {
  firstApp: {
    path: "first_app", // The key in the config JSON
    schema: firstAppSchema, // The schema to validate the configuration (optional)
  },
  secondApp: {
    path: "second_app",
    schema: secondAppSchema,
  },
} as const; // This is important to ensure the type safety

Next, create a new instance of ConfigManager:

const configManager = new ConfigManager(cmm);

Tada :tada:, you can now access your configurations using the configManager object!

const firstAppName = configManager.get("firstApp").name; // Strongly typed!

ConfigManager Optional Options

This is the list of optional options you can pass to the ConfigManager constructor:

OptionDescriptionDefault
exitOnValidationErrorIf set to true, the process will exit if a configuration does not meet the schemafalse

Raw Configuration

You can still access the raw configuration object by importing the raw object from mono-config:

import { raw } from "mono-config";
1.0.2

7 months ago

1.0.1

7 months ago

1.0.0

7 months ago