Files
agent-skills/skills/tsdown/references/option-config-file.md
Jason Woltje f5792c40be feat: Complete fleet — 94 skills across 10+ domains
Pulled ALL skills from 15 source repositories:
- anthropics/skills: 16 (docs, design, MCP, testing)
- obra/superpowers: 14 (TDD, debugging, agents, planning)
- coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth)
- better-auth/skills: 5 (auth patterns)
- vercel-labs/agent-skills: 5 (React, design, Vercel)
- antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo)
- Plus 13 individual skills from various repos

Mosaic Stack is not limited to coding — the Orchestrator and
subagents serve coding, business, design, marketing, writing,
logistics, analysis, and more.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:27:42 -06:00

282 lines
5.1 KiB
Markdown

# Configuration File
Centralize and manage build settings with a configuration file.
## Overview
tsdown searches for config files automatically in the current directory and parent directories.
## Supported File Names
tsdown looks for these files (in order):
- `tsdown.config.ts`
- `tsdown.config.mts`
- `tsdown.config.cts`
- `tsdown.config.js`
- `tsdown.config.mjs`
- `tsdown.config.cjs`
- `tsdown.config.json`
- `tsdown.config`
- `package.json` (in `tsdown` field)
## Basic Configuration
### TypeScript Config
```ts
// tsdown.config.ts
import { defineConfig } from 'tsdown'
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
clean: true,
})
```
### JavaScript Config
```js
// tsdown.config.js
export default {
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
}
```
### JSON Config
```json
// tsdown.config.json
{
"entry": ["src/index.ts"],
"format": ["esm", "cjs"],
"dts": true
}
```
### Package.json Config
```json
// package.json
{
"name": "my-library",
"tsdown": {
"entry": ["src/index.ts"],
"format": ["esm", "cjs"],
"dts": true
}
}
```
## Multiple Configurations
Build multiple outputs with different settings:
```ts
export default defineConfig([
{
entry: 'src/index.ts',
format: ['esm', 'cjs'],
platform: 'node',
dts: true,
},
{
entry: 'src/browser.ts',
format: ['iife'],
platform: 'browser',
globalName: 'MyLib',
minify: true,
},
])
```
Each configuration runs as a separate build.
## Dynamic Configuration
Use a function for conditional config:
```ts
export default defineConfig((options) => {
const isDev = options.watch
return {
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
minify: !isDev,
sourcemap: isDev,
clean: !isDev,
}
})
```
Available options:
- `watch` - Whether watch mode is enabled
- Other CLI flags passed to config
## Config Loaders
Control how TypeScript config files are loaded:
### Auto Loader (Default)
Uses native TypeScript support if available, otherwise falls back to `unrun`:
```bash
tsdown # Uses auto loader
```
### Native Loader
Uses runtime's native TypeScript support (Node.js 23+, Bun, Deno):
```bash
tsdown --config-loader native
```
### Unrun Loader
Uses [unrun](https://gugustinette.github.io/unrun/) library for loading:
```bash
tsdown --config-loader unrun
```
**Tip:** Use `unrun` loader if you need to load TypeScript configs without file extensions in Node.js.
## Custom Config Path
Specify a custom config file location:
```bash
tsdown --config ./configs/build.config.ts
# or
tsdown -c custom-config.ts
```
## Disable Config File
Ignore config files and use CLI options only:
```bash
tsdown --no-config src/index.ts --format esm
```
## Extend Vite/Vitest Config (Experimental)
Reuse existing Vite or Vitest configurations:
```bash
# Extend vite.config.*
tsdown --from-vite
# Extend vitest.config.*
tsdown --from-vite vitest
```
**Note:** Only specific options like `resolve` and `plugins` are reused. Test thoroughly as this feature is experimental.
## Workspace / Monorepo
Build multiple packages with a single config:
```ts
export default defineConfig({
workspace: 'packages/*',
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
})
```
Each package directory matching the glob pattern will be built with the same configuration.
## Common Patterns
### Library with Multiple Builds
```ts
export default defineConfig([
// Node.js build
{
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
platform: 'node',
dts: true,
},
// Browser build
{
entry: ['src/browser.ts'],
format: ['iife'],
platform: 'browser',
globalName: 'MyLib',
},
])
```
### Development vs Production
```ts
export default defineConfig((options) => ({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
minify: !options.watch,
sourcemap: options.watch ? true : false,
clean: !options.watch,
}))
```
### Monorepo Root Config
```ts
// Root tsdown.config.ts
export default defineConfig({
workspace: 'packages/*',
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
clean: true,
// Shared config for all packages
})
```
### Per-Package Override
```ts
// packages/special/tsdown.config.ts
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm'], // Override: only ESM
platform: 'browser', // Override: browser only
})
```
## Config Precedence
When multiple configs exist:
1. CLI options (highest priority)
2. Config file specified with `--config`
3. Auto-discovered config files
4. Package.json `tsdown` field
5. Default values
## Tips
1. **Use TypeScript config** for type checking and autocomplete
2. **Use defineConfig** helper for better DX
3. **Export arrays** for multiple build configurations
4. **Use functions** for dynamic/conditional configs
5. **Keep configs simple** - prefer convention over configuration
6. **Use workspace** for monorepo builds
7. **Test experimental features** thoroughly before production use
## Related Options
- [Entry](option-entry.md) - Configure entry points
- [Output Format](option-output-format.md) - Output formats
- [Watch Mode](option-watch-mode.md) - Watch mode configuration