npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@jungvonmatt/config-loader

v0.6.1

Published

Load config from files & environment & ask for missing values

Readme

@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

| Option | Type | Default | Description | | --------------- | ------------------------------------------------------------------------------ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | string | Required | Name of the configuration (used for file searching) | | defaultConfig | Partial<T> | {} | Default configuration values | | overrides | Partial<T> | {} | Configuration overrides (highest priority) | | required | Array<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. | | envMap | Record<string, keyof T> | {} | Map environment variable names to config keys | | dotenv | boolean | true | Whether to load .env files | | envName | string \| false | process.env.NODE_ENV | Environment name for .env.{envName} file | | cwd | string | process.cwd() | Working directory for file searching | | configFile | string | undefined | Path to a specific config file to load | | prompt | Array<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. | | prompts | PromptOptions[] \| ((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