Tsdown
JetBrainsOfficialCreated by Anthony FuDistributed by JetBrains
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
tsdown is a library bundler designed for TypeScript and JavaScript projects. It leverages Rolldown and Oxc to handle bundling tasks, including generating type declarations, supporting multiple output formats, and managing dependencies. It provides a configuration-driven approach to library development, supporting various frameworks and runtime environments, and includes a migration path for users moving from tsup.
What it does
- Bundles TypeScript and JavaScript libraries into multiple formats like ESM, CJS, IIFE, and UMD.
- Generates TypeScript declaration files (.d.ts) automatically.
- Supports dependency management, including externalization and bundling options.
- Provides hooks for custom build logic and supports plugins from the Rolldown and Rollup ecosystems.
- Offers specialized configurations for component libraries using React, Vue, Solid, or Svelte.
- Includes a migration tool to assist with transitioning from tsup.
When to use it
- When building TypeScript or JavaScript libraries for distribution via npm.
- When you need to generate type declarations alongside your bundled code.
- When your project requires bundling for multiple module formats.
- When migrating an existing library project from tsup.
- When developing component libraries for frameworks like React, Vue, or Svelte.
Advantages
- Simplifies the bundling process for library authors with a clear configuration API.
- Provides built-in support for common library tasks like package exports and ESM/CJS shims.
- Offers CI-aware configuration options to validate packages before publishing.
- Supports advanced features like standalone executable bundling and CSS processing.
- Allows for flexible build configurations including monorepo and workspace support.
Usage examples
- “How do I bundle my TypeScript library for both ESM and CJS formats?”
- You can use a tsdown.config.ts file with the format option set to ['esm', 'cjs'] and dts set to true to generate declarations.
- “How can I migrate my existing tsup project to tsdown?”
- You can run the npx tsdown-migrate command to assist with the transition.
- “How do I configure tsdown to exclude React from my bundle?”
- In your configuration file, use the deps.neverBundle option to specify ['react', 'react-dom'].
- “How do I enable watch mode for development?”
- Run the command npx tsdown --watch to enable watch mode for your build process.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/jetbrains/tsdown/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip tsdown.zip -d .agents/skills
Documentation by Anthony Fu
tsdown - The Elegant Library Bundler
Blazing-fast bundler for TypeScript/JavaScript libraries powered by Rolldown and Oxc.
When to Use
Building TypeScript/JavaScript libraries for npm
Generating TypeScript declaration files (.d.ts)
Bundling for multiple formats (ESM, CJS, IIFE, UMD)
Optimizing bundles with tree shaking and minification
Migrating from tsup with minimal changes
Building React, Vue, Solid, or Svelte component libraries
Quick Start
# 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-migrateBasic Configuration
import { defineConfig } from 'tsdown'
export default defineConfig({
entry: ['./src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
clean: true,
})Core References
| Topic | Description | Reference |
|---|---|---|
| Getting Started | Installation, first bundle, CLI basics | guide-getting-started |
| Configuration File | Config file formats, multiple configs, workspace | option-config-file |
| CLI Reference | All CLI commands and options | reference-cli |
| Migrate from tsup | Migration guide and compatibility notes | guide-migrate-from-tsup |
| Plugins | Rolldown, Rollup, Unplugin support | advanced-plugins |
| Hooks | Lifecycle hooks for custom logic | advanced-hooks |
| Programmatic API | Build from Node.js scripts | advanced-programmatic |
| Rolldown Options | Pass options directly to Rolldown | advanced-rolldown-options |
| CI Environment | CI detection, 'ci-only' / 'local-only' values | advanced-ci |
Build Options
| Option | Usage | Reference |
|---|---|---|
| Entry points | entry: ['src/*.ts', '!**/*.test.ts'] | option-entry |
| Output formats | format: ['esm', 'cjs', 'iife', 'umd'] | option-output-format |
| Output directory | outDir: 'dist', outExtensions | option-output-directory |
| Type declarations | dts: true, dts: { sourcemap, compilerOptions, vue } | option-dts |
| Target environment | target: 'es2020', target: 'esnext' | option-target |
| Platform | platform: 'node', platform: 'browser' | option-platform |
| Tree shaking | treeshake: true, custom options | option-tree-shaking |
| Minification | minify: true, minify: 'dce-only' | option-minification |
| Source maps | sourcemap: true, 'inline', 'hidden' | option-sourcemap |
| Watch mode | watch: true, watch options | option-watch-mode |
| Cleaning | clean: true, clean patterns | option-cleaning |
| Log level | logLevel: 'silent', failOnWarn: false | option-log-level |
Dependency Handling
| Feature | Usage | Reference |
|---|---|---|
| Never bundle | deps: { neverBundle: ['react', /^@myorg\//] } | option-dependencies |
| Always bundle | deps: { alwaysBundle: ['dep-to-bundle'] } | option-dependencies |
| Only bundle | deps: { onlyBundle: ['cac', 'bumpp'] } - Whitelist | option-dependencies |
| Skip node_modules | deps: { skipNodeModulesBundle: true } | option-dependencies |
| Auto external | Automatic peer/dependency externalization | option-dependencies |
Output Enhancement
| Feature | Usage | Reference |
|---|---|---|
| Shims | shims: true - Add ESM/CJS compatibility | option-shims |
| CJS default | cjsDefault: true (default) / false | option-cjs-default |
| Package exports | exports: true - Auto-generate exports field | option-package-exports |
| CSS handling | [experimental] css: { ... } — full pipeline with preprocessors, Lightning CSS, PostCSS, code splitting; requires @tsdown/css | option-css |
| CSS inject | css: { inject: true } — preserve CSS imports in JS output | option-css |
| Unbundle mode | unbundle: true - Preserve directory structure | option-unbundle |
| Root directory | root: 'src' - Control output directory mapping | option-root |
| Executable | [experimental] exe: true - Bundle as standalone executable, cross-platform via @tsdown/exe | option-exe |
| Package validation | publint: true, attw: true - Validate package | option-lint |
Framework & Runtime Support
| Framework | Guide | Reference |
|---|---|---|
| React | JSX transform, React Compiler | recipe-react |
| Vue | SFC support, JSX | recipe-vue |
| Solid | SolidJS JSX transform | recipe-solid |
| Svelte | Svelte component libraries (source distribution recommended) | recipe-svelte |
| WASM | WebAssembly modules via rolldown-plugin-wasm | recipe-wasm |
Common Patterns
Basic Library Bundle
export 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,
deps: {
neverBundle: ['react', 'react-dom'],
},
inputOptions: {
jsx: { runtime: 'automatic' },
},
})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', // opt-in: fail on warnings in CI
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()],
})Library with CSS and Sass
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
target: 'chrome100',
css: {
preprocessorOptions: {
scss: {
additionalData: `@use "src/styles/variables" as *;`,
},
},
},
})Standalone Executable
export default defineConfig({
entry: ['src/cli.ts'],
exe: true,
})Cross-Platform Executable (requires @tsdown/exe)
export default defineConfig({
entry: ['src/cli.ts'],
exe: {
targets: [
{ platform: 'linux', arch: 'x64', nodeVersion: '25.7.0' },
{ platform: 'darwin', arch: 'arm64', nodeVersion: '25.7.0' },
{ platform: 'win', arch: 'x64', nodeVersion: '25.7.0' },
],
},
})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!')
},
},
})Configuration Features
Multiple Configs
Export an array for multiple build configurations:
export default defineConfig([
{
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
},
{
entry: ['src/cli.ts'],
format: ['esm'],
platform: 'node',
},
])Conditional Config
Use functions for dynamic configuration:
export default defineConfig((options) => {
const isDev = options.watch
return {
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
minify: !isDev,
sourcemap: isDev,
}
})Workspace/Monorepo
Use glob patterns to build multiple packages:
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 -d lib # Custom output directory (--out-dir)
tsdown --minify # Enable minification
tsdown --dts # Generate declarations
tsdown --exe # Bundle as standalone executable
tsdown --unbundle # Bundleless mode
# Entry options
tsdown src/index.ts # Single entry
tsdown src/*.ts # Glob patterns
tsdown src/a.ts src/b.ts # Multiple entries
# Workspace / Monorepo
tsdown -W # Enable workspace mode
tsdown -W -F my-package # Filter specific package
tsdown --filter /^pkg-/ # Filter by regex
# Development
tsdown --watch # Watch mode
tsdown --sourcemap # Generate source maps
tsdown --clean # Clean output directory
tsdown --from-vite # Reuse Vite config
tsdown --tsconfig tsconfig.build.json # Custom tsconfigBest Practices
Always generate type declarations for TypeScript libraries:
{ dts: true }Externalize dependencies to avoid bundling unnecessary code:
{ deps: { neverBundle: [/^react/, /^@myorg\//] } }Use tree shaking for optimal bundle size:
{ treeshake: true }Enable minification for production builds:
{ minify: true }Add shims for better ESM/CJS compatibility:
{ shims: true } // Adds __dirname, __filename, etc.Auto-generate package.json exports:
{ exports: true } // Creates proper exports fieldUse watch mode during development:
tsdown --watchPreserve structure for utilities with many files:
{ unbundle: true } // Keep directory structureValidate packages in CI before publishing:
{ publint: 'ci-only', attw: 'ci-only' }
Resources
Documentation: https://tsdown.dev
Rolldown: https://rolldown.rs
Migration Guide: https://tsdown.dev/guide/migrate-from-tsup
Files
- ATTRIBUTION.mdAdded by AutoGineer870 B
- LICENSE.md1.1 KiB
- README.md1.9 KiB
- SKILL.md11.7 KiB
- SYNC.md140 B
- references/README.md4.7 KiB
- references/advanced-benchmark.md265 B
- references/advanced-ci.md2.0 KiB
- references/advanced-hooks.md6.9 KiB
- references/advanced-plugins.md6.6 KiB
- references/advanced-programmatic.md5.9 KiB
- references/advanced-rolldown-options.md2.3 KiB
- references/guide-getting-started.md2.6 KiB
- references/guide-introduction.md1.5 KiB
- references/guide-migrate-from-tsup.md4.2 KiB
- references/option-cjs-default.md1.9 KiB
- references/option-cleaning.md4.8 KiB
- references/option-config-file.md5.1 KiB
- references/option-css.md5.5 KiB
- references/option-dependencies.md7.3 KiB
- references/option-dts.md4.5 KiB
- references/option-entry.md3.6 KiB
- references/option-exe.md3.3 KiB
- references/option-lint.md2.9 KiB
- references/option-log-level.md1.8 KiB
- references/option-minification.md3.5 KiB
- references/option-output-directory.md4.4 KiB
- references/option-output-format.md3.4 KiB
- references/option-package-exports.md5.2 KiB
- references/option-platform.md5.1 KiB
- references/option-root.md1.8 KiB
- references/option-shims.md5.5 KiB
- references/option-sourcemap.md5.4 KiB
- references/option-target.md4.0 KiB
- references/option-tree-shaking.md5.1 KiB
- references/option-unbundle.md5.5 KiB
- references/option-watch-mode.md4.6 KiB
- references/recipe-react.md5.9 KiB
- references/recipe-solid.md929 B
- references/recipe-svelte.md1.4 KiB
- references/recipe-vue.md6.4 KiB
- references/recipe-wasm.md2.6 KiB
- references/reference-cli.md7.3 KiB
references/option-dependencies.md
Dependencies
Control how dependencies are bundled or externalized.
Overview
tsdown intelligently handles dependencies to keep your library lightweight while ensuring all necessary code is included.
Default Behavior
Auto-Externalized
These are NOT bundled by default:
dependencies- Installed automatically with your packagepeerDependencies- User must install manually
Conditionally Bundled
These are bundled ONLY if imported:
devDependencies- Only if actually used in source codePhantom dependencies - In node_modules but not in package.json
Configuration Options
All dependency options are grouped under the deps field:
export default defineConfig({
deps: {
neverBundle: ['react', /^@myorg\//],
alwaysBundle: ['some-package'],
onlyBundle: ['cac', 'bumpp'],
skipNodeModulesBundle: true,
},
})deps.neverBundle
Mark dependencies as external (not bundled):
export default defineConfig({
entry: ['src/index.ts'],
deps: {
neverBundle: [
'react', // Single package
'react-dom',
/^@myorg\//, // Regex pattern (all @myorg/* packages)
/^lodash/, // All lodash packages
],
},
})deps.alwaysBundle
Force dependencies to be bundled:
export default defineConfig({
entry: ['src/index.ts'],
deps: {
alwaysBundle: [
'some-package', // Bundle this even if in dependencies
'vendor-lib',
],
},
})deps.onlyBundle
Whitelist of dependencies allowed to be bundled from node_modules. Throws an error if any unlisted dependency is bundled:
export default defineConfig({
entry: ['src/index.ts'],
deps: {
onlyBundle: [
'cac', // Allow bundling cac
'bumpp', // Allow bundling bumpp
/^my-utils/, // Regex patterns supported
],
},
})Behavior:
Array (
['cac', /^my-/]): Only matching dependencies can be bundled. Error for others.false: Suppress all warnings about bundled dependencies.Not set (default): Warns if any node_modules dependencies are bundled.
Note: Include all sub-dependencies in the list, not just top-level imports.
deps.skipNodeModulesBundle
Skip resolving and bundling ALL node_modules:
export default defineConfig({
entry: ['src/index.ts'],
deps: {
skipNodeModulesBundle: true,
},
})Result: No dependencies from node_modules are parsed or bundled.
Note: Cannot be used together with alwaysBundle.
Common Patterns
React Component Library
export default defineConfig({
entry: ['src/index.tsx'],
format: ['esm', 'cjs'],
deps: {
neverBundle: [
'react',
'react-dom',
/^react\//, // react/jsx-runtime, etc.
],
},
dts: true,
})Utility Library with Shared Deps
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
deps: {
alwaysBundle: ['lodash-es'],
},
dts: true,
})Monorepo Package
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
deps: {
neverBundle: [
/^@mycompany\//, // Don't bundle other workspace packages
],
},
dts: true,
})CLI Tool (Bundle Everything)
export default defineConfig({
entry: ['src/cli.ts'],
format: ['esm'],
platform: 'node',
deps: {
alwaysBundle: [/.*/],
},
shims: true,
})Library with Specific Externals
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
deps: {
neverBundle: [
'vue',
'@vue/runtime-core',
'@vue/reactivity',
],
},
dts: true,
})Declaration Files
Dependency handling for .d.ts files follows the same rules as JavaScript.
Complex Type Resolution
Use TypeScript resolver for complex third-party types:
export default defineConfig({
entry: ['src/index.ts'],
dts: {
resolver: 'tsc', // Use TypeScript resolver instead of Oxc
},
})When to use tsc resolver:
Types in
@types/*packages with non-standard naming (e.g.,@types/babel__generator)Complex type dependencies
Issues with default Oxc resolver
Trade-off: tsc is slower but more compatible.
CLI Usage
Never Bundle
tsdown --deps.never-bundle react --deps.never-bundle react-dom
tsdown --deps.never-bundle '/^@myorg\/.*/'Skip Node Modules
tsdown --deps.skip-node-modules-bundleMigration from Deprecated Options
| Deprecated Option | New Option |
|---|---|
external | deps.neverBundle |
noExternal | deps.alwaysBundle |
inlineOnly | deps.onlyBundle |
deps.onlyAllowBundle | deps.onlyBundle |
skipNodeModulesBundle | deps.skipNodeModulesBundle |
Examples by Use Case
Framework Component
// Don't bundle framework
export default defineConfig({
deps: {
neverBundle: ['vue', 'react', 'solid-js', 'svelte'],
},
})Standalone App
// Bundle everything
export default defineConfig({
deps: {
alwaysBundle: [/.*/],
},
})Shared Library
// Bundle only specific utils
export default defineConfig({
deps: {
neverBundle: [/.*/], // External by default
alwaysBundle: ['tiny-utils'], // Except this one
},
})Monorepo Package
// External workspace packages, bundle utilities
export default defineConfig({
deps: {
neverBundle: [
/^@workspace\//, // Other workspace packages
'react',
'react-dom',
],
alwaysBundle: [
'lodash-es', // Bundle utility libraries
],
},
})Troubleshooting
Dependency Bundled Unexpectedly
Check if it's in devDependencies and imported. Move to dependencies:
{
"dependencies": {
"should-be-external": "^1.0.0"
}
}Or explicitly externalize:
export default defineConfig({
deps: {
neverBundle: ['should-be-external'],
},
})Missing Dependency at Runtime
Ensure it's in dependencies or peerDependencies:
{
"dependencies": {
"needed-package": "^1.0.0"
}
}Or bundle it:
export default defineConfig({
deps: {
alwaysBundle: ['needed-package'],
},
})Type Resolution Errors
Use TypeScript resolver for complex types:
export default defineConfig({
dts: {
resolver: 'tsc',
},
})Summary
Default behavior:
dependencies&peerDependencies→ ExternaldevDependencies& phantom deps → Bundled if imported
Override (under deps):
neverBundle→ Force externalalwaysBundle→ Force bundledonlyBundle→ Whitelist bundled depsskipNodeModulesBundle→ Skip all node_modules
Declaration files:
Same bundling logic as JavaScript
Use
resolver: 'tsc'for complex types
Tips
Keep dependencies external for libraries
Bundle everything for standalone CLIs
Use regex patterns for namespaced packages
Check bundle size to verify external/bundled split
Test with fresh install to catch missing dependencies
Use tsc resolver only when needed (slower)
Related Options
External - This page
Platform - Runtime environment
Output Format - Module formats
DTS - Type declarations
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Anthony Fu
- Publisher
- JetBrains (Official)
- Distributed by
- JetBrains
- Source
- JetBrains/skills · tsdown · commit 3f53782
- Licence
- MIT License (redistribution allowed)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Anthony Fu or JetBrains.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download tsdown.zip