An open API service indexing awesome lists of open source software.

https://github.com/1111mp/lib-configuration-resolver

Find and load configuration for your library 🌈
https://github.com/1111mp/lib-configuration-resolver

lib-configuration-resolver

Last synced: over 1 year ago
JSON representation

Find and load configuration for your library 🌈

Awesome Lists containing this project

README

          


NPM Version
Package License
NPM Downloads
stars

# lib-configuration-resolver

`lib-configuration-resolver` searches for and loads configuration for your library. Inspired by [Vite](https://vitejs.dev/) but supports more file formats.

By default, `lib-configuration-resolver` will check the current working directory for the following:

- JSON `*.json`
- YAML `*.{yml|yaml}`
- JavaScript `*.{js|mjs|cjs}`
- TypeScript `*.{ts|mts|cts}`

For example, if your module's name is `"resolver.config"`, `lib-configuration-resolver` will try to load configuration data from these files:

- `resolver.config.json`
- `resolver.config.yml`, `resolver.config.yaml`
- `resolver.config.js`, `resolver.config.mjs`, `resolver.config.cjs`
- `resolver.config.ts`, `resolver.config.mts`, `resolver.config.cts`

Alternatively you can change the search directory by passing `root`.

## Installation

```
npm install lib-configuration-resolver
```

## Quick Start

#### Basic usage

Use the `configResolver` api to automatically parse configuration files:

```ts
// resolver.config.ts
export default {
name: "lib-configuration-resolver",
desc: "This is a template for testing lib-configuration-resolver",
entry: ["index.ts"],
minify: true,
plugins: [() => {}]
}
```

```ts
import { configResolver } from "lib-configuration-resolver"

interface Config {
name: string
desc: string
entry: string[]
minify: boolean
plugins: VoidFunction[]
}

configResolver("resolver.config.ts").then(config => {
// config: Config | null
console.log(config)
/**
* config: {
configFile: '/lib-configuration-resolver/resolver.config.ts',
config: {
name: 'lib-configuration-resolver',
desc: 'This is a template for testing lib-configuration-resolver',
entry: [ 'index.ts' ],
minify: true,
plugins: [ [Function (anonymous)] ]
},
dependencies: [ 'src/__tests__/configurations/resolver.config.ts' ]
}
*/
})
```

Or just provide file name:

```ts
const config = await configResolver("resolver.config")
// config: Config | null
console.log(config)
/**
* config: {
configFile: '/lib-configuration-resolver/resolver.config.ts',
config: {
name: 'lib-configuration-resolver',
desc: 'This is a template for testing lib-configuration-resolver',
entry: [ 'index.ts' ],
minify: true,
plugins: [ [Function (anonymous)] ]
},
dependencies: [ 'src/__tests__/configurations/resolver.config.ts' ]
}
*/

if (config === null) {
// no config file found.
}
```

It will try to search for the following files:

```
[
`resolver.config.json`,
`resolver.config.yml`,
`resolver.config.yaml`,
`resolver.config.js`,
`resolver.config.mjs`
`resolver.config.cjs`,
`resolver.config.ts`,
`resolver.config.mts`,
`resolver.config.cts`
]
```

#### With `defineConfig` helper

You can use the defineConfig helper to export your configuration:

```ts
// resolver.config.ts
import { defineConfig } from "lib-configuration-resolver"

interface Config {
name: string
desc: string
entry: string[]
minify: boolean
plugins: VoidFunction[]
}

export default defineConfig(({ mode }) => {
console.log(mode)
// production or development
// the value of process.env.NODE_ENV

return {
name: "lib-configuration-resolver",
desc: "This is a template for testing lib-configuration-resolver",
entry: ["index.ts"],
minify: true,
plugins: [() => {}]
}
})
```

```ts
import { configResolver } from "lib-configuration-resolver"

const config = await configResolver("resolver.config")
// config: Config
console.log(config)
/**
* config: {
configFile: '/lib-configuration-resolver/resolver.config.ts',
config: {
name: 'lib-configuration-resolver',
desc: 'This is a template for testing lib-configuration-resolver',
entry: [ 'index.ts' ],
minify: true,
plugins: [ [Function (anonymous)] ]
},
dependencies: [ 'src/__tests__/configurations/resolver.config.ts' ]
}
*/
```

#### Change search directory

Change the directory where configuration files are searched by passing `root`:

```ts
import { resolve } from "node:path"
import { configResolver } from "lib-configuration-resolver"

const config = await configResolver("resolver.config", {
root: resolve(process.cwd(), "src", "__tests__", "configurations")
})
// config: Config
console.log(config)
/**
* config: {
configFile: '/lib-configuration-resolver/src/__tests__/configurations/resolver.config.ts',
config: {
name: 'lib-configuration-resolver',
desc: 'This is a template for testing lib-configuration-resolver',
entry: [ 'index.ts' ],
minify: true,
plugins: [ [Function (anonymous)] ]
},
dependencies: [ 'src/__tests__/configurations/resolver.config.ts' ]
}
*/
```

## API

#### `configResolver`

```ts
type Config = {
[key: string]: any
}

interface InlineConfig extends Config {
/**
* Project root directory. Can be an absolute path, or a path relative from
* the location of the config file itself.
* @default process.cwd()
*/
root?: string
/**
* Explicitly set a mode to run in. This will override the default mode.
*/
mode?: string
}

type ConfigResult = {
configFile: string
config: T
dependencies: string[]
}

declare function configResolver(
name: string,
inlineConfig?: InlineConfig,
defaultMode: string = "development"
): Promise | null>
```

#### `defineConfig`

```ts
interface ConfigEnv {
mode: string
}

type ConfigFnObject = (env: ConfigEnv) => T
type ConfigFnPromise = (env: ConfigEnv) => Promise
type ConfigFn = (env: ConfigEnv) => T | Promise
type ConfigExport = T | Promise | ConfigFnObject | ConfigFnPromise | ConfigFn

declare function defineConfig(config: ConfigExport): ConfigExport
```