Blazing-fast bundler for TypeScript/JavaScript libraries powered by Rolldown and Oxc. - Building TypeScript/JavaScript libraries for npm - Generating TypeScript declaration files (.d.ts)
# Install pnpm add -D tsdown # Basic usage npx tsdown # With config file npx tsdown --config tsdown.config.ts # Watch mode npx tsdown --watch # Migrate from tsup npx tsdown-migrate `## Basic Configuration` import { defineConfig } from 'tsdown' export default defineConfig({ entry: ['./src/index.ts'], format: ['esm', 'cjs'], dts: true, clean: true, })
'ci-only' / 'local-only' valuesentry: ['src/*.ts', '!**/*.test.ts']format: ['esm', 'cjs', 'iife', 'umd']outDir: 'dist', outExtensionsdts: true, dts: { sourcemap, compilerOptions, vue }target: 'es2020', target: 'esnext'platform: 'node', platform: 'browser'treeshake: true, custom optionsminify: true, minify: 'dce-only'sourcemap: true, 'inline', 'hidden'watch: true, watch optionsclean: true, clean patternslogLevel: 'silent', failOnWarn: 'ci-only'external: ['react', /^@myorg\//]noExternal: ['dep-to-bundle']shims: true - Add ESM/CJS compatibilitycjsDefault: true (default) / falseexports: true - Auto-generate exports fieldunbundle: true - Preserve directory structurepublint: true, attw: true - Validate packagerolldown-plugin-wasmexport default defineConfig({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, clean: true, }) `### Multiple Entry Points` export default defineConfig({ entry: { index: 'src/index.ts', utils: 'src/utils.ts', cli: 'src/cli.ts', }, format: ['esm', 'cjs'], dts: true, }) `### Browser Library (IIFE/UMD)` export default defineConfig({ entry: ['src/index.ts'], format: ['iife'], globalName: 'MyLib', platform: 'browser', minify: true, }) `### React Component Library` export default defineConfig({ entry: ['src/index.tsx'], format: ['esm', 'cjs'], dts: true, external: ['react', 'react-dom'], plugins: [ // React Fast Refresh support ], }) `### Preserve Directory Structure` export default defineConfig({ entry: ['src/**/*.ts', '!**/*.test.ts'], unbundle: true, // Preserve file structure format: ['esm'], dts: true, }) `### CI-Aware Configuration` export default defineConfig({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, failOnWarn: 'ci-only', publint: 'ci-only', attw: 'ci-only', }) `### WASM Support` import { wasm } from 'rolldown-plugin-wasm' import { defineConfig } from 'tsdown' export default defineConfig({ entry: ['src/index.ts'], plugins: [wasm()], }) `### Advanced with Hooks` export default defineConfig({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, hooks: { 'build:before': async (context) => { console.log('Building...') }, 'build:done': async (context) => { console.log('Build complete!') }, }, })
export default defineConfig([ { entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, }, { entry: ['src/cli.ts'], format: ['esm'], platform: 'node', }, ])
export default defineConfig((options) => { const isDev = options.watch return { entry: ['src/index.ts'], format: ['esm', 'cjs'], minify: !isDev, sourcemap: isDev, } })
export default defineConfig({ workspace: 'packages/*', entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, }) `## CLI Quick Reference` # Basic commands tsdown # Build once tsdown --watch # Watch mode tsdown --config custom.ts # Custom config npx tsdown-migrate # Migrate from tsup # Output options tsdown --format esm,cjs # Multiple formats tsdown --outDir lib # Custom output directory tsdown --minify # Enable minification tsdown --dts # Generate declarations # Entry options tsdown src/index.ts # Single entry tsdown src/*.ts # Glob patterns tsdown src/a.ts src/b.ts # Multiple entries # Development tsdown --watch # Watch mode tsdown --sourcemap # Generate source maps tsdown --clean # Clean output directory
{ dts: true }{ external: [/^react/, /^@myorg\//] }{ treeshake: true }{ minify: true }{ shims: true } // Adds __dirname, __filename, etc.{ exports: true } // Creates proper exports fieldtsdown --watch{ unbundle: true } // Keep directory structure{ publint: 'ci-only', attw: 'ci-only' }