Security News
ESLint is Now Language-Agnostic: Linting JSON, Markdown, and Beyond
ESLint has added JSON and Markdown linting support with new officially-supported plugins, expanding its versatility beyond JavaScript.
The c12 npm package is a configuration loader and manager that helps in loading, merging, and managing configurations from various sources such as files, environment variables, and more. It is designed to be flexible and easy to use, making it suitable for a wide range of applications.
Loading Configuration from Files
This feature allows you to load configuration from files. The `loadConfig` function reads configuration files based on the provided options such as the name of the application and the current working directory.
const { loadConfig } = require('c12');
async function loadConfigExample() {
const config = await loadConfig({
name: 'myapp',
cwd: process.cwd(),
rcFile: true
});
console.log(config);
}
loadConfigExample();
Merging Configurations
This feature allows you to merge configurations from different sources. The `loadConfig` function can take default configurations and override configurations, merging them into a single configuration object.
const { loadConfig } = require('c12');
async function mergeConfigExample() {
const config = await loadConfig({
name: 'myapp',
defaults: { key1: 'default1' },
overrides: { key2: 'override2' }
});
console.log(config);
}
mergeConfigExample();
Loading Configuration from Environment Variables
This feature allows you to load configuration from environment variables. The `loadConfig` function can be configured to read environment variables with a specific prefix and include them in the configuration object.
const { loadConfig } = require('c12');
async function envConfigExample() {
process.env.MYAPP_KEY = 'valueFromEnv';
const config = await loadConfig({
name: 'myapp',
envPrefix: 'MYAPP_'
});
console.log(config);
}
envConfigExample();
The 'config' package is a popular configuration management tool for Node.js applications. It allows you to define configurations for different environments and load them based on the current environment. Compared to c12, 'config' is more opinionated and structured, making it easier to manage complex configurations but less flexible in terms of merging and loading from multiple sources.
The 'dotenv' package loads environment variables from a .env file into process.env. It is simpler and more focused compared to c12, which offers more comprehensive configuration management capabilities including merging configurations from multiple sources.
The 'rc' package is a non-opinionated configuration loader that reads configuration from various sources like files, environment variables, and command-line arguments. It is similar to c12 in terms of flexibility but lacks some of the advanced features like merging configurations and handling defaults and overrides.
Smart Configuration Loader.
.env
support with dotenvpackage.json
fileInstall package:
# npm
npm install c12
# yarn
yarn add c12
# pnpm
pnpm install c12
Import:
// ESM
import { loadConfig } from "c12";
// CommonJS
const { loadConfig } = require("c12");
Load configuration:
// Get loaded config
const { config } = await loadConfig({});
// Get resolved config and extended layers
const { config, configFile, layers } = await loadConfig({});
c12 merged config sources with unjs/defu by below order:
package.json
cwd
Resolve configuration from this working directory. The default is process.cwd()
name
Configuration base name. The default is config
.
configName
Configuration file name without extension. Default is generated from name
(name=foo => foo.config
).
Set to false
to avoid loading the config file.
rcFile
RC Config file name. Default is generated from name
(name=foo => .foorc
).
Set to false
to disable loading RC config.
globalRC
Load RC config from the workspace directory and the user's home directory. Only enabled when rcFile
is provided. Set to false
to disable this functionality.
dotenv
Loads .env
file if enabled. It is disabled by default.
packageJson
Loads config from nearest package.json
file. It is disabled by default.
If true
value is passed, c12 uses name
field from package.json
.
You can also pass either a string or an array of strings as a value to use those fields.
defaults
Specify default configuration. It has the lowest priority and is applied after extending config.
defaultConfig
Specify default configuration. It is applied before extending config.
overrides
Specify override configuration. It has the highest priority and is applied before extending config.
jiti
Custom unjs/jiti instance used to import configuration files.
jitiOptions
Custom unjs/jiti options to import configuration files.
envName
Environment name used for environment specific configuration.
The default is process.env.NODE_ENV
. You can set envName
to false
or an empty string to disable the feature.
If resolved config contains a extends
key, it will be used to extend the configuration.
Extending can be nested and each layer can extend from one base or more.
The final config is merged result of extended options and user options with unjs/defu.
Each item in extends is a string that can be either an absolute or relative path to the current config file pointing to a config file for extending or the directory containing the config file.
If it starts with either github:
, gitlab:
, bitbucket:
, or https:
, c12 automatically clones it.
For custom merging strategies, you can directly access each layer with layers
property.
Example:
// config.ts
export default {
colors: {
primary: "user_primary",
},
extends: ["./theme"],
};
// config.dev.ts
export default {
dev: true,
};
// theme/config.ts
export default {
extends: "../base",
colors: {
primary: "theme_primary",
secondary: "theme_secondary",
},
};
// base/config.ts
export default {
colors: {
primary: 'base_primary'
text: 'base_text'
}
}
The loaded configuration would look like this:
{
dev: true,
colors: {
primary: 'user_primary',
secondary: 'theme_secondary',
text: 'base_text'
}
}
Layers:
[
{ config: /* theme config */, configFile: /* path/to/theme/config.ts */, cwd: /* path/to/theme */ },
{ config: /* base config */, configFile: /* path/to/base/config.ts */, cwd: /* path/to/base */ },
{ config: /* dev config */, configFile: /* path/to/config.dev.ts */, cwd: /* path/ */ },
]
Users can define environment-specific configuration using these config keys:
$test: {...}
$development: {...}
$production: {...}
$env: { [env]: {...} }
c12 tries to match envName
and override environment config if specified.
Note: Environment will be applied when extending each configuration layer. This way layers can provide environment-specific configuration.
Example:
{
// Default configuration
logLevel: 'info',
// Environment overrides
$test: { logLevel: 'silent' },
$development: { logLevel: 'warning' },
$production: { logLevel: 'error' },
$env: {
staging: { logLevel: 'debug' }
}
}
corepack enable
(use npm i -g corepack
for Node.js < 16.10)pnpm install
pnpm dev
Made with 💛 Published under MIT License.
v1.3.0
rm
instead of rmdir
for recursive remove (#69)FAQs
Smart Config Loader
The npm package c12 receives a total of 888,066 weekly downloads. As such, c12 popularity was classified as popular.
We found that c12 demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
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.
Security News
ESLint has added JSON and Markdown linting support with new officially-supported plugins, expanding its versatility beyond JavaScript.
Security News
Members Hub is conducting large-scale campaigns to artificially boost Discord server metrics, undermining community trust and platform integrity.
Security News
NIST has failed to meet its self-imposed deadline of clearing the NVD's backlog by the end of the fiscal year. Meanwhile, CVE's awaiting analysis have increased by 33% since June.