Reliverse Docs
LibsIntroductionCore Concepts

Configuration

Configure your Rempts CLI project with dler.config.ts

Configuration

Configure your Rempts CLI project behavior with dler.config.ts. Configuration is automatically loaded - you don't need to manually import or pass config to createCLI().

Automatic Configuration Loading

Rempts automatically loads configuration from dler.config.ts when you call createCLI():

// cli.ts - No config needed!
import { createCLI } from '@reliverse/rempts-core'

const cli = await createCLI()  // Automatically loads dler.config.ts

await cli.load({
  build: () => import('./commands/build'),
  test: () => import('./commands/test')
})

await cli.run()
// dler.config.ts - All configuration here
import { defineConfig } from '@reliverse/rempts-core'

export default defineConfig({
  name: 'my-cli',
  version: '1.0.0',
  description: 'My awesome CLI tool',
  commands: {
    directory: './cmds'
  },
  plugins: []
})

Benefits of automatic loading:

  • Single source of truth - Configuration lives in one place
  • No duplication - Don't repeat name, version, description in cli.ts
  • Consistent - Same config used by rempts CLI commands and runtime
  • Type-safe - Full TypeScript support with defineConfig

Configuration Override

You can override specific settings for runtime-specific needs:

// cli.ts - Override plugins with runtime options
import { createCLI } from '@reliverse/rempts-core'
import { configMergerPlugin } from '@reliverse/rempts-plugin-config'

const cli = await createCLI({
  plugins: [
    configMergerPlugin({ sources: ['.myrc.json'] })
  ] as const
})

await cli.run()

The override merges with the loaded config (override values win).

Configuration File

Create a dler.config.ts file in your project root:

import { defineConfig } from '@reliverse/rempts-core'

export default defineConfig({
  name: 'my-cli',
  version: '1.0.0',
  description: 'My awesome CLI tool',
  
  // Command options (REQUIRED)
  commands: {
    directory: './cmds'  // Must use cmds/ directory
  },
  
  // Build configuration
  build: {
    entry: './cli.ts',
    outdir: './dist',
    targets: ['native'],  // Default target
    compress: false,      // Default: false
    minify: false,        // Default: false
    sourcemap: true       // Default: true
  },
  
  // Plugins (REQUIRED - can be empty array)
  plugins: []
})

Configuration Options

Basic Information

export default defineConfig({
  // CLI name (defaults to package.json name)
  name: 'my-cli',
  
  // Version (defaults to package.json version)
  version: '1.0.0',
  
  // Description for help text
  description: 'A powerful CLI tool'
})

Command Configuration

export default defineConfig({
  commands: {
    // Where to find command files (REQUIRED)
    directory: './cmds',  // Must use cmds/ directory
    
    // Command manifest for lazy loading (optional)
    manifest: './commands/manifest.ts'
  }
})

Build Configuration

export default defineConfig({
  build: {
    // Entry point (default: './cli.ts')
    entry: './cli.ts',
    
    // Output directory (default: './dist')
    outdir: './dist',
    
    // Target platforms (default: ['native'])
    targets: ['native'],  // Native for current platform
    // or specific platforms:
    // targets: ['darwin-arm64', 'linux-x64', 'windows-x64'],
    
    // Compress output archives (default: false)
    compress: false,
    
    // External dependencies (not bundled)
    external: ['sqlite3', 'sharp'],
    
    // Minify output (default: false)
    minify: false,
    
    // Generate sourcemaps (default: true)
    sourcemap: true
  }
})

Development Configuration

export default defineConfig({
  dev: {
    // Watch for file changes
    watch: true,
    
    // Enable Node.js inspector
    inspect: true,
    
    // Inspector port
    port: 9229
  }
})

Type generation is automatically enabled in all Rempts projects for enhanced developer experience:

export default defineConfig({
  name: 'my-cli',
  version: '1.0.0',
})

Default Behavior:

SettingDefaultDescription
Auto-GenerationtrueAlways enabled
Commands Directory./cmdsWhere to find command files (REQUIRED)
Plugins[]Empty array (REQUIRED)

Test Configuration

export default defineConfig({
  test: {
    // Test file patterns
    pattern: ['**/*.test.ts', '**/*.spec.ts'],
    
    // Coverage reporting
    coverage: true,
    
    // Watch mode
    watch: false
  }
})

Release Configuration

export default defineConfig({
  release: {
    // Publish to npm
    npm: true,
    
    // Create GitHub release
    github: true,
    
    // Git tag format
    tagFormat: 'v${version}',
    
    // Use conventional commits
    conventionalCommits: true
  }
})

Workspace Configuration

For monorepos:

export default defineConfig({
  workspace: {
    // Package locations
    packages: ['packages/*', 'apps/*'],
    
    // Shared configuration
    shared: {
      typescript: true,
      eslint: true
    },
    
    // Version strategy
    versionStrategy: 'independent' // or 'fixed'
  }
})

Environment-Specific Config

Use environment variables or conditions:

export default defineConfig({
  name: 'my-cli',
  build: {
    minify: process.env.NODE_ENV === 'production',
    sourcemap: process.env.DEBUG === 'true',
    targets: process.env.CI 
      ? ['darwin-arm64', 'linux-x64', 'windows-x64']
      : [process.platform + '-' + process.arch]
  }
})

Extending Configuration

Share configuration across projects:

// base.config.ts
export const baseConfig = {
  build: {
    minify: true,
    compress: true
  }
}

// dler.config.ts
import { defineConfig } from '@reliverse/rempts-core'
import { baseConfig } from './base.config'

export default defineConfig({
  ...baseConfig,
  name: 'my-cli',
  build: {
    ...baseConfig.build,
    entry: './src/index.ts'
  }
})

Platform-Specific Builds

Configure different settings per platform:

const platforms = {
  'darwin-arm64': {
    external: ['fsevents']
  },
  'windows-x64': {
    external: ['node-gyp']
  }
}

export default defineConfig({
  build: {
    targets: Object.keys(platforms),
    // Platform-specific externals handled by build process
  }
})

Configuration Schema

The configuration is validated using Zod:

const configSchema = z.object({
  name: z.string().optional(),
  version: z.string().optional(),
  description: z.string().optional(),
  commands: z.object({
    manifest: z.string().optional(),
    directory: z.string().optional()
  }).optional(),
  build: z.object({
    entry: z.string().or(z.array(z.string())).optional(),
    outdir: z.string().optional(),
    targets: z.array(z.string()).optional(),
    compress: z.boolean().optional(),
    external: z.array(z.string()).optional(),
    minify: z.boolean().optional(),
    sourcemap: z.boolean().optional(),
    compile: z.boolean().optional()
  }).optional(),
  // ... more options
})

Loading Configuration

Rempts automatically looks for configuration files in this order:

  1. dler.config.ts
  2. dler.config.js
  3. dler.config.mjs

The configuration is loaded and validated before any CLI commands run.

Default Values

If no configuration file is found, these defaults are used:

{
  name: package.name,
  version: package.version,
  description: package.description,
  commands: {
    directory: './cmds'  // REQUIRED
  },
  build: {
    entry: './cli.ts',
    outdir: './dist',
    targets: ['native'],
    compress: false,
    minify: false,
    sourcemap: true
  },
  plugins: []  // REQUIRED
}

Best Practices

  1. Keep It Simple: Start with minimal configuration
  2. Use TypeScript: Get autocomplete and type checking
  3. Environment Variables: Use for deployment-specific settings
  4. Share Common Config: Extract shared settings to separate files
  5. Document Options: Add comments for team members

See Also

On this page