Socket
Book a DemoInstallSign in
Socket

@jungvonmatt/config-loader

Package Overview
Dependencies
Maintainers
5
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@jungvonmatt/config-loader

Load config from files & environment & ask for missing values

0.6.1
latest
Source
npmnpm
Version published
Weekly downloads
884
21.93%
Maintainers
5
Weekly downloads
 
Created
Source

@jungvonmatt/config-loader

npm version build status coverage sonarcloud status

Load configuration from files, environment variables, and interactively prompt for missing values

A flexible configuration loader that extends c12 with additional features for environment variable mapping and interactive user prompts. Built on top of the unjs ecosystem for modern Node.js applications.

Features

  • 🔍 Multiple config sources: Load from package.json, rc files, config files, and more
  • 🌍 Environment variable support: Automatic dotenv loading and environment variable mapping
  • 💬 Interactive prompts: Ask users for missing required configuration values
  • 🔄 Config merging: Smart merging of configuration from multiple sources with overrides
  • 📁 Flexible file formats: Support for JSON, YAML, JS, TS, and more
  • 🛡️ TypeScript support: Full TypeScript support with type safety
  • 🔗 Config extension: Built-in support for extending configurations from other files or remote sources

Installation

# ✨ Auto-detect (supports npm, yarn, pnpm, deno and bun)
npx nypm install @jungvonmatt/config-loader

Usage

ESM (Node.js, Bun, Deno)

import { loadConfig } from "@jungvonmatt/config-loader";

Basic Example

import { loadConfig } from "@jungvonmatt/config-loader";

const { config } = await loadConfig({
  name: "myapp",
  defaultConfig: {
    port: 3000,
    host: "localhost",
  },
});

console.log(config.port); // 3000

With Required Fields and Prompts

import { loadConfig } from "@jungvonmatt/config-loader";

const { config } = await loadConfig({
  name: "myapp",
  required: ["apiKey", "databaseUrl"],
  prompts: [
    {
      name: "apiKey",
      type: "password",
      message: "Enter your API key:",
    },
    {
      name: "databaseUrl",
      type: "input",
      message: "Enter database URL:",
    },
  ],
});

Environment Variable Mapping

const { config } = await loadConfig({
  name: "myapp",
  envMap: {
    DATABASE_URL: "databaseUrl",
    API_KEY: "apiKey",
    PORT: "port",
  },
  defaultConfig: {
    port: 3000,
  },
});

Extending Configurations

// config.ts
export default {
  extends: "./base.config.ts",
  port: 8080,
  database: {
    url: "postgresql://localhost/mydb"
  }
};

// base.config.ts
export default {
  port: 3000,
  host: "localhost",
  database: {
    url: "postgresql://localhost/default"
  }
};

Configuration Files

The loader searches for configuration in the following locations (in order):

  • package.json (in a myapp property)
  • .myapprc.json
  • .myapprc.yaml / .myapprc.yml
  • .myapprc.js / .myapprc.ts / .myapprc.mjs / .myapprc.cjs
  • .config/.myapprc.*
  • myapp.config.js / myapp.config.ts / myapp.config.mjs / myapp.config.cjs

Where myapp is the name you provide in the options.

Example Config Files

.myapprc.json

{
  "port": 8080,
  "database": {
    "url": "postgresql://localhost/mydb"
  }
}

myapp.config.js

export default {
  port: process.env.PORT || 3000,
  database: {
    url: process.env.DATABASE_URL,
  },
};

Environment Variables

Automatic Environment Loading

Environment variables are automatically loaded from .env files:

  • .env.{NODE_ENV} (e.g., .env.production)
  • .env

Configuration Override Pattern

Any configuration can be overridden using environment variables with the pattern:

{NAME}_CONFIG_{PATH}

For example, with name: "myapp":

  • MYAPP_CONFIG_PORT=8080 sets config.port = 8080
  • MYAPP_CONFIG_DATABASE_URL=... sets config.databaseUrl = ...

API

loadConfig<T>(options: LoadConfigOptions<T>): Promise<ResolvedConfig<T>>

Options

OptionTypeDefaultDescription
namestringRequiredName of the configuration (used for file searching)
defaultConfigPartial<T>{}Default configuration values
overridesPartial<T>{}Configuration overrides (highest priority)
requiredArray<keyof T> | ((config: T) => Array<keyof T> | Promise<Array<keyof T>>)[]Array of required configuration keys or a function that returns them. The function receives the current config as an argument.
envMapRecord<string, keyof T>{}Map environment variable names to config keys
dotenvbooleantrueWhether to load .env files
envNamestring | falseprocess.env.NODE_ENVEnvironment name for .env.{envName} file
cwdstringprocess.cwd()Working directory for file searching
configFilestringundefinedPath to a specific config file to load
promptArray<keyof T> | ((config: T) => Array<keyof T> | Promise<Array<keyof T>>)[]Array of configuration keys to prompt for, even if they exist in the config. Can be a function that returns the keys. Keys will be sorted based on the order in prompts if provided.
promptsPromptOptions[] | ((config: T) => PromptOptions[])[]Interactive prompts for missing values. See enquirer for syntax details. The order of prompts determines the order of fields in the prompt sequence.

Returns

interface ResolvedConfig<T> {
  config: T; // The merged configuration object
  filepath: string | undefined; // Path to the config file that was loaded
  missing: string[]; // Array of missing required fields
  layers: Array<{
    type: "module" | "file" | "env" | "overrides" | "default" | "prompt";
    filepath: string | undefined;
    config: Partial<T> | undefined;
    cwd: string | undefined;
  }>; // Array of configuration layers in order of application
}

Prompt Options

Prompts use enquirer under the hood:

interface PromptOptions {
  name: string; // Configuration key name
  type: string; // Prompt type: 'input', 'password', 'select', etc.
  message: string; // Prompt message
  choices?: string[]; // For select/multiselect prompts
  initial?: any; // Default value
  // ... other enquirer options
}

License

Published under the MIT license. Made by Jung von Matt TECH 💚

🤖 auto updated with automd

FAQs

Package last updated on 04 Sep 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

About

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc

U.S. Patent No. 12,346,443 & 12,314,394. Other pending.