|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- # c12
-
- [![npm version][npm-version-src]][npm-version-href]
- [![npm downloads][npm-downloads-src]][npm-downloads-href]
- [![Github Actions][github-actions-src]][github-actions-href]
- [![Codecov][codecov-src]][codecov-href]
-
- > Smart Configuration Loader
-
- ## Features
-
- - JSON, CJS, Typescript, and ESM config loader with [unjs/jiti](https://github.com/unjs/jiti)
- - RC config support with [unjs/rc9](https://github.com/unjs/rc9)
- - Multiple sources merged with [unjs/defu](https://github.com/unjs/defu)
- - `.env` support with [dotenv](https://www.npmjs.com/package/dotenv)
- - Support reading config from the nearest `package.json` file
- - Support extending nested configurations from multiple local or git sources
-
- ## Usage
-
- Install package:
-
- ```sh
- # npm
- npm install c12
-
- # yarn
- yarn add c12
-
- # pnpm
- pnpm install c12
- ```
-
- Import:
-
- ```js
- // ESM
- import { loadConfig } from "c12";
-
- // CommonJS
- const { loadConfig } = require("c12");
- ```
-
- Load configuration:
-
- ```js
- // Get loaded config
- const { config } = await loadConfig({});
-
- // Get resolved config and extended layers
- const { config, configFile, layers } = await loadConfig({});
- ```
-
- ## Loading priority
-
- c12 merged config sources with [unjs/defu](https://github.com/unjs/defu) by below order:
-
- 1. Config overrides passed by options
- 2. Config file in CWD
- 3. RC file in CWD
- 4. Global RC file in user's home directory
- 5. Config from `package.json`
- 6. Default config passed by options
- 7. Extended config layers
-
- ## Options
-
- ### `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](https://github.com/unjs/jiti) instance used to import configuration files.
-
- ### `jitiOptions`
-
- Custom [unjs/jiti](https://github.com/unjs/jiti) options to import configuration files.
-
- ### `envName`
-
- Environment name used for [environment specific configuration](#environment-specific-configuration).
-
- The default is `process.env.NODE_ENV`. You can set `envName` to `false` or an empty string to disable the feature.
-
- ## Extending configuration
-
- 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](https://github.com/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:**
-
- ```js
- // config.ts
- export default {
- colors: {
- primary: "user_primary",
- },
- extends: ["./theme"],
- };
- ```
-
- ```js
- // config.dev.ts
- export default {
- dev: true,
- };
- ```
-
- ```js
- // theme/config.ts
- export default {
- extends: "../base",
- colors: {
- primary: "theme_primary",
- secondary: "theme_secondary",
- },
- };
- ```
-
- ```js
- // base/config.ts
- export default {
- colors: {
- primary: 'base_primary'
- text: 'base_text'
- }
- }
- ```
-
- The loaded configuration would look like this:
-
- ```js
- {
- dev: true,
- colors: {
- primary: 'user_primary',
- secondary: 'theme_secondary',
- text: 'base_text'
- }
- }
- ```
-
- Layers:
-
- ```js
- [
- { 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/ */ },
- ]
- ```
-
- ## Environment-specific configuration
-
- Users can define environment-specific configuration using these config keys:
-
- - `$test: {...}`
- - `$development: {...}`
- - `$production: {...}`
- - `$env: { [env]: {...} }`
-
- c12 tries to match [`envName`](#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:**
-
- ```js
- {
- // Default configuration
- logLevel: 'info',
-
- // Environment overrides
- $test: { logLevel: 'silent' },
- $development: { logLevel: 'warning' },
- $production: { logLevel: 'error' },
- $env: {
- staging: { logLevel: 'debug' }
- }
- }
- ```
-
- ## 💻 Development
-
- - Clone this repository
- - Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable` (use `npm i -g corepack` for Node.js < 16.10)
- - Install dependencies using `pnpm install`
- - Run interactive tests using `pnpm dev`
-
- ## License
-
- Made with 💛 Published under [MIT License](./LICENSE).
-
- <!-- Badges -->
-
- [npm-version-src]: https://img.shields.io/npm/v/c12?style=flat-square
- [npm-version-href]: https://npmjs.com/package/c12
- [npm-downloads-src]: https://img.shields.io/npm/dm/c12?style=flat-square
- [npm-downloads-href]: https://npmjs.com/package/c12
- [github-actions-src]: https://img.shields.io/github/actions/workflow/status/unjs/c12/ci.yml?branch=main&style=flat-square
- [github-actions-href]: https://github.com/unjs/c12/actions?query=workflow%3Aci
- [codecov-src]: https://img.shields.io/codecov/c/gh/unjs/c12/main?style=flat-square
- [codecov-href]: https://codecov.io/gh/unjs/c12
|