Deft
Ask AI

Search

Search skills, authors and topics

rolldown / tsdown

tsdown

Bundle TypeScript and JavaScript libraries with tsdown, including declarations and multi-format builds.

Install

npx skills add https://github.com/rolldown/tsdown --skill tsdown

tsdown - The Elegant Library Bundler

Blazing-fast bundler for TypeScript/JavaScript libraries powered by Rolldown and Oxc.

Runtime Requirement

tsdown requires Node.js 22.18.0 or higher to run (build-time only). However, the bundled output can target much lower Node.js versions via the target [blocked] option, so libraries built with tsdown are not locked to Node.js 22+ at runtime.

If your package needs to support Node.js 18 / 20:

  • Build with Node.js 22+ in CI (e.g. set target: 'node18' or target: 'node20').
  • Test the built output (or the packed tarball) on the lower Node.js versions you intend to support — e.g. using a matrix job that runs the published package's tests on Node.js 18 / 20 / 22.

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

bash
# Installpnpm add -D tsdown
# Basic usagenpx tsdown
# With config filenpx tsdown --config tsdown.config.ts
# Watch modenpx tsdown --watch
# Migrate from tsupnpx tsdown-migrate

Basic Configuration

ts
import { defineConfig } from 'tsdown'
export default defineConfig({  entry: ['./src/index.ts'],  format: ['esm', 'cjs'],  dts: true,  clean: true,})

Core References

TopicDescriptionReference
Getting StartedInstallation, first bundle, CLI basicsguide-getting-started [blocked]
Configuration FileConfig file formats, multiple configs, workspaceoption-config-file [blocked]
CLI ReferenceAll CLI commands and optionsreference-cli [blocked]
Migrate from tsupMigration guide and compatibility notesguide-migrate-from-tsup [blocked]
PluginsRolldown, Rollup, Unplugin supportadvanced-plugins [blocked]
HooksLifecycle hooks for custom logicadvanced-hooks [blocked]
Programmatic APIBuild from Node.js scripts, in-memory builds (write: false)advanced-programmatic [blocked]
Rolldown OptionsPass options directly to Rolldownadvanced-rolldown-options [blocked]
CI EnvironmentCI detection, 'ci-only' / 'local-only' valuesadvanced-ci [blocked]

For comprehensive migration assistance with complete option mappings, install the dedicated tsdown-migrate skill: npx skills add rolldown/tsdown --skill tsdown-migrate

Build Options

OptionUsageReference
Entry pointsentry: ['src/*.ts', '!**/*.test.ts']option-entry [blocked]
Output formatsformat: ['esm', 'cjs', 'iife', 'umd']option-output-format [blocked]
Output directoryoutDir: 'dist', outExtensionsoption-output-directory [blocked]
Type declarationsdts: true, dts: { sourcemap, compilerOptions, vue }option-dts [blocked]
Target environmenttarget: 'es2020', target: 'esnext'option-target [blocked]
Platformplatform: 'node', platform: 'browser'option-platform [blocked]
Tree shakingtreeshake: true, custom optionsoption-tree-shaking [blocked]
Minificationminify: true, minify: 'dce-only'option-minification [blocked]
Source mapssourcemap: true, 'inline', 'hidden'option-sourcemap [blocked]
Watch modewatch: true, watch optionsoption-watch-mode [blocked]
Cleaningclean: true, clean patternsoption-cleaning [blocked]
Log levellogLevel: 'silent', failOnWarn: false, suppressWarnings: [...]option-log-level [blocked]

Dependency Handling

FeatureUsageReference
Never bundledeps: { neverBundle: ['react', /^@myorg\//] }option-dependencies [blocked]
Always bundledeps: { alwaysBundle: ['dep-to-bundle'] }option-dependencies [blocked]
Only bundledeps: { onlyBundle: ['cac', 'bumpp'] } - Whitelistoption-dependencies [blocked]
Only importdeps: { onlyImport: ['cac'] } - Whitelist runtime imports in outputoption-dependencies [blocked]
Externalize alldeps: { neverBundle: true }option-dependencies [blocked]
Resolve subpathsdeps: { resolveDepSubpath: true } - Resolve external subpath imports (default false)option-dependencies [blocked]
Auto externalAutomatic dependency/peer/optional externalizationoption-dependencies [blocked]

Output Enhancement

FeatureUsageReference
Shimsshims: true - Add ESM/CJS compatibilityoption-shims [blocked]
CJS defaultcjsDefault: true (default) / falseoption-cjs-default [blocked]
Package exportsexports: true - Generate exports fieldoption-package-exports [blocked]
CSS handling[experimental] css: { ... } — full pipeline with preprocessors, Lightning CSS, PostCSS, CSS modules, code splitting; requires @tsdown/cssoption-css [blocked]
CSS modulescss: { modules: { localsConvention: 'camelCase' } } — scoped class names for .module.css filesoption-css [blocked]
CSS injectcss: { inject: true } — preserve CSS imports in JS outputoption-css [blocked]
Copy filescopy: 'public' or copy: { from, to, flatten, rename } - Copy static assets to outputoption-copy [blocked]
Unbundle modeunbundle: true - Preserve directory structureoption-unbundle [blocked]
Root directoryroot: 'src' - Control output directory mappingoption-root [blocked]
Executable[experimental] exe: true - Bundle as standalone executable, cross-platform via @tsdown/exeoption-exe [blocked]
Package validationpublint: true, attw: true - Validate packageoption-lint [blocked]

Framework & Runtime Support

FrameworkGuideReference
ReactJSX transform, React Compilerrecipe-react [blocked]
VueSFC support, JSXrecipe-vue [blocked]
SolidSolidJS JSX transformrecipe-solid [blocked]
SvelteSvelte component libraries (source distribution recommended)recipe-svelte [blocked]
WASMWebAssembly modules via rolldown-plugin-wasmrecipe-wasm [blocked]

Common Patterns

Basic Library Bundle

ts
export default defineConfig({  entry: ['src/index.ts'],  format: ['esm', 'cjs'],  dts: true,  clean: true,})

Multiple Entry Points

ts
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)

ts
export default defineConfig({  entry: ['src/index.ts'],  format: ['iife'],  globalName: 'MyLib',  platform: 'browser',  minify: true,})

React Component Library

ts
export default defineConfig({  entry: ['src/index.tsx'],  format: ['esm', 'cjs'],  dts: true,  deps: {    neverBundle: ['react', 'react-dom'],  },  inputOptions: {    jsx: { runtime: 'automatic' },  },})

Preserve Directory Structure

ts
export default defineConfig({  entry: ['src/**/*.ts', '!**/*.test.ts'],  unbundle: true, // Preserve file structure  format: ['esm'],  dts: true,})

CI-Aware Configuration

ts
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

ts
import { wasm } from 'rolldown-plugin-wasm'import { defineConfig } from 'tsdown'
export default defineConfig({  entry: ['src/index.ts'],  plugins: [wasm()],})

Library with CSS and Sass

ts
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

ts
export default defineConfig({  entry: ['src/cli.ts'],  exe: true,})

Cross-Platform Executable (requires @tsdown/exe)

ts
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

ts
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:

ts
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:

ts
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:

ts
export default defineConfig({  workspace: 'packages/*',  entry: ['src/index.ts'],  format: ['esm', 'cjs'],  dts: true,})

CLI Quick Reference

bash
# Basic commandstsdown                          # Build oncetsdown --watch                  # Watch modetsdown --config custom.ts       # Custom confignpx tsdown-migrate              # Migrate from tsup
# Output optionstsdown --format esm,cjs        # Multiple formatstsdown -d lib                  # Custom output directory (--out-dir)tsdown --minify                # Enable minificationtsdown --dts                   # Generate declarationstsdown --exe                   # Bundle as standalone executabletsdown --unbundle              # Bundleless modetsdown --copy public           # Copy static files to output
# Entry optionstsdown src/index.ts            # Single entrytsdown src/*.ts                # Glob patternstsdown src/a.ts src/b.ts       # Multiple entries
# Workspace / Monorepotsdown -W                      # Enable workspace modetsdown -W -F my-package        # Filter specific packagetsdown --filter /^pkg-/        # Filter by regextsdown -W --concurrency 4      # Limit parallel Rolldown builds
# Developmenttsdown --watch                 # Watch modetsdown --sourcemap             # Generate source mapstsdown --clean                 # Clean output directorytsdown --from-vite             # Reuse Vite configtsdown --tsconfig tsconfig.build.json  # Custom tsconfig

Best Practices

  1. Always generate type declarations for TypeScript libraries:

    ts
    { dts: true }
  2. Externalize dependencies to avoid bundling unnecessary code:

    ts
    { deps: { neverBundle: [/^react/, /^@myorg\//] } }
  3. Use tree shaking for optimal bundle size:

    ts
    { treeshake: true }
  4. Enable minification for production builds:

    ts
    { minify: true }
  5. Add shims for better ESM/CJS compatibility:

    ts
    { shims: true }  // Adds __dirname, __filename, etc.
  6. Auto-generate package.json exports:

    ts
    { exports: true }  // Creates proper exports field
  7. Use watch mode during development:

    bash
    tsdown --watch
  8. Preserve structure for utilities with many files:

    ts
    { unbundle: true }  // Keep directory structure
  9. Validate packages in CI before publishing:

    ts
    { publint: 'ci-only', attw: 'ci-only' }

Resources