Skip to content

Root Directory ​

The root option specifies the root directory of your input files, similar to TypeScript's rootDir. It determines how the output directory structure is computed from your entry files.

Default Behavior ​

By default, root is automatically computed as the common base directory of all entry files. For example, if your entries are src/a.ts and src/b.ts, the root will be src/.

How to Configure ​

ts
import { defineConfig } from 'tsdown'

export default defineConfig({
  entry: ['src/index.ts', 'src/utils/helper.ts'],
  root: 'src',
})

Or via CLI:

bash
tsdown --root src

How It Works ​

The root option affects two behaviors:

  1. Entry name resolution: When using array entries, file paths relative to root determine the output filenames.
  2. Unbundle mode: In unbundle mode, root is used as the preserveModulesRoot, controlling the output directory structure.

Example ​

Given the following project structure:

project/
  src/
    index.ts
    utils/
      helper.ts

Without root (default behavior) ​

ts
export default defineConfig({
  entry: ['src/index.ts', 'src/utils/helper.ts'],
})

The common base directory is src/, so the output will be:

dist/
  index.js
  utils/
    helper.js

With explicit root ​

ts
export default defineConfig({
  entry: ['src/index.ts', 'src/utils/helper.ts'],
  root: '.',
})

Now the root is the project directory, so the output preserves the src/ prefix:

dist/
  src/
    index.js
    utils/
      helper.js

When to Use ​

  • When the auto-computed common base directory doesn't produce the desired output structure.
  • When you want output paths to include or exclude certain directory prefixes.
  • When using unbundle mode and need fine-grained control over the output directory mapping.

Released under the MIT License.