Function signature
packages/core/src/config.ts:173-175
export function defineConfig(config: BunliConfigInput): BunliConfig {
return bunliConfigSchema.parse(config)
}
A helper function for defining Bunli configuration with full type safety. It validates the configuration using Zod and applies all default values.
Parameters
Configuration object for the CLI application.
CLI application name (required for CLI creation, optional in config files)
CLI application version (required for CLI creation, optional in config files)
CLI application description
Commands configuration
Entry point file for command registration
Directory containing command files
Generate command analysis report
Build configuration (TypeScript compilation required)
Entry point(s) for the build
Build targets (e.g., ['node-linux-x64', 'node-darwin-arm64'])
External dependencies to exclude from bundle
Generate source maps for debugging
Development configuration
Test configuration
pattern
string | string[]
default:"['**/*.test.ts', '**/*.spec.ts']"
Test file patterns
Enable coverage reporting
Workspace configuration for monorepos
Shared workspace configuration
versionStrategy
'fixed' | 'independent'
default:"'fixed'"
Versioning strategy
Release configuration
tagFormat
string
default:"'v{{version}}'"
Git tag format
Use conventional commits for changelog
Binary distribution configuration
packageNameFormat
string
default:"'{{name}}-{{platform}}'"
Format for platform-specific package names
shimPath
string
default:"'bin/run.mjs'"
Path to the shim entry point
plugins
BunliPlugin[]
default:"[]"
Plugins to load
Help output configuration
Custom help renderer function
TUI configuration
TUI renderer options
Terminal buffer mode: 'alternate' for full-screen, 'standard' for scrollback
Return value
Validated configuration object with all defaults applied.
Examples
Basic configuration
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
description: 'My awesome CLI tool'
})
With commands configuration
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
description: 'My awesome CLI tool',
commands: {
entry: './src/cli.ts',
directory: './src/commands',
generateReport: true
}
})
With build configuration
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
build: {
entry: './src/cli.ts',
outdir: './dist',
targets: ['node-linux-x64', 'node-darwin-arm64', 'node-windows-x64'],
minify: true,
compress: true,
external: ['@bunli/core']
}
})
With plugins
import { defineConfig } from '@bunli/core'
import { completionsPlugin } from '@bunli/plugin-completions'
import { configPlugin } from '@bunli/plugin-config'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
plugins: [
completionsPlugin(),
configPlugin({
name: 'my-cli',
searchPlaces: ['.my-cli.json', '.my-clirc']
})
]
})
Development and testing
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
dev: {
watch: true,
inspect: false,
port: 3000
},
test: {
pattern: ['**/*.test.ts'],
coverage: true,
watch: false
}
})
Workspace configuration
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-monorepo',
version: '1.0.0',
workspace: {
packages: ['packages/*'],
versionStrategy: 'independent'
}
})
Release configuration
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
release: {
npm: true,
github: true,
tagFormat: 'v{{version}}',
conventionalCommits: true,
binary: {
packageNameFormat: '{{name}}-{{platform}}',
shimPath: 'bin/run.mjs'
}
},
build: {
targets: ['node-linux-x64', 'node-darwin-arm64']
}
})
Custom TUI configuration
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
tui: {
renderer: {
bufferMode: 'alternate' // Full-screen TUI
}
}
})
Custom help renderer
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0',
help: {
renderer({ cliName, version, command, commands, terminal }) {
console.log(`${cliName} v${version}`)
if (command) {
console.log(`\nCommand: ${command.name}`)
console.log(command.description)
} else {
console.log('\nCommands:')
for (const cmd of commands) {
console.log(` ${cmd.name.padEnd(20)} ${cmd.description}`)
}
}
}
}
})
Bunli supports multiple configuration file formats:
TypeScript (recommended)
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0'
})
JavaScript (ESM)
import { defineConfig } from '@bunli/core'
export default defineConfig({
name: 'my-cli',
version: '1.0.0'
})
JavaScript (CommonJS)
const { defineConfig } = require('@bunli/core')
module.exports = defineConfig({
name: 'my-cli',
version: '1.0.0'
})
Validation
The defineConfig function validates the configuration using Zod schemas. If validation fails, it throws an error with details:
// Invalid configuration
defineConfig({
name: '', // Empty string not allowed
version: '1.0.0'
})
// Error: Invalid config: { name: ['String must contain at least 1 character(s)'] }
Default values
The function automatically applies defaults for optional fields:
const config = defineConfig({
name: 'my-cli',
version: '1.0.0'
})
// Defaults applied:
// config.build.targets = []
// config.build.compress = false
// config.build.minify = false
// config.build.sourcemap = true
// config.dev.watch = true
// config.dev.inspect = false
// config.test.pattern = ['**/*.test.ts', '**/*.spec.ts']
// config.test.coverage = false
// config.test.watch = false
// config.workspace.versionStrategy = 'fixed'
// config.release.npm = true
// config.release.github = false
// config.release.tagFormat = 'v{{version}}'
// config.release.conventionalCommits = true
// config.plugins = []