Subchapter 8.12
references/option-config-file.mdMarkdown5 KBView on GitHub
tsdown searches for config files automatically in the current directory and parent directories.
tsdown looks for these files (in order):
tsdown.config.tstsdown.config.mtstsdown.config.ctstsdown.config.jstsdown.config.mjstsdown.config.cjstsdown.config.jsontsdown.configpackage.json (in tsdown field)// tsdown.config.ts
import { defineConfig } from 'tsdown'
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
clean: true,
})// tsdown.config.js
export default {
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
}// tsdown.config.json
{
"entry": ["src/index.ts"],
"format": ["esm", "cjs"],
"dts": true
}// package.json
{
"name": "my-library",
"tsdown": {
"entry": ["src/index.ts"],
"format": ["esm", "cjs"],
"dts": true
}
}Build multiple outputs with different settings:
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.
Use a function for conditional config:
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 enabledControl how TypeScript config files are loaded:
Uses native TypeScript support if available, otherwise falls back to unrun:
tsdown # Uses auto loaderUses runtime’s native TypeScript support (Node.js 22.18.0+, Bun, Deno):
tsdown --config-loader nativeUses tsx (opens in a new tab) library for loading via its tsImport API. Note: tsx is an optional peer dependency — install it manually first.
pnpm add -D tsx
tsdown --config-loader tsxUses unrun (opens in a new tab) library for loading. Note: unrun is an optional peer dependency — install it manually first.
pnpm add -D unrun
tsdown --config-loader unrunTip: Use tsx or unrun loader if you need to load TypeScript configs without file extensions in Node.js.
Specify a custom config file location:
tsdown --config ./configs/build.config.ts
# or
tsdown -c custom-config.tsIgnore config files and use CLI options only:
tsdown --no-config src/index.ts --format esmReuse existing Vite or Vitest configurations:
# Extend vite.config.*
tsdown --from-vite
# Extend vitest.config.*
tsdown --from-vite vitestNote: Only specific options like resolve and plugins are reused. Test thoroughly as this feature is experimental.
Build multiple packages with a single config:
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.
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',
},
])export default defineConfig((options) => ({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
minify: !options.watch,
sourcemap: options.watch ? true : false,
clean: !options.watch,
}))// 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
})// packages/special/tsdown.config.ts
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm'], // Override: only ESM
platform: 'browser', // Override: browser only
})When multiple configs exist:
--configtsdown field