turbodts

Ultra-fast .d.ts bundler designed for modern libraries.

turbodts

npm version npm downloads

A lightning-fast TypeScript declaration bundler that generates clean, optimized .d.ts files for modern TypeScript libraries.

Performance

Tool Duration Speed Improvement
turbodts (isolated declarations) ~23ms 215x faster
turbodts (standard mode) ~245ms 20x faster
dts-bundle-generator ~5,066ms baseline

Features

  • ๐Ÿš€ Blazing Fast - 20-200x faster than alternatives
  • ๐Ÿ” External Resolution - Automatically resolves types from node_modules
  • โšก Isolated Declarations - 10-50x speed boost
  • โœ‚๏ธ Code Splitting - Prevents type duplication across multiple entry points
  • ๐Ÿ—œ๏ธ Minification - Reduces declaration file size significantly
  • ๐Ÿ’Ž Clean Output - Outputs clean, readable declaration files
  • ๐Ÿ› ๏ธ Zero Config - Works out of the box with sensible defaults
  • ๐Ÿ”ง CLI & API - Use via command line or programmatically

๐Ÿš€ Quick Start

Generate declaration files from your TypeScript source:

bunx turbodts src/index.ts

This creates dist/index.d.ts with all your types bundled together.

๐Ÿ“– CLI Usage

Basic Usage

# Single entry point
bunx turbodts src/index.ts

# Multiple entry points
bunx turbodts src/index.ts src/cli.ts src/utils.ts

# Glob patterns
bunx turbodts "src/**/*.ts" "!src/**/*.test.ts"

# Custom output directory
bunx turbodts src/index.ts --outDir types

โœ‚๏ธ Code Splitting

When you have multiple entry points that share common types, splitting prevents duplication:

bunx turbodts src/index.ts src/cli.ts --splitting

Without splitting:

dist/
โ”œโ”€โ”€ index.d.ts     # 50KB (includes shared types)
โ””โ”€โ”€ cli.d.ts       # 45KB (duplicates shared types)

With splitting:

dist/
โ”œโ”€โ”€ index.d.ts     # 15KB (imports from chunk)
โ”œโ”€โ”€ cli.d.ts       # 10KB (imports from chunk)
โ””โ”€โ”€ chunk-abc123.d.ts  # 30KB (shared types)

This reduces total bundle size and ensures type consistency and readability across entry points.

๐Ÿ—œ๏ธ Minification

Reduce declaration file size with various minification strategies:

# Enable all minification
bunx turbodts src/index.ts --minify

# Granular control
bunx turbodts src/index.ts --minify-jsdoc --minify-whitespace --minify-identifiers

Minification Options

Option Description
--minify-jsdoc Removes JSDoc comments
--minify-whitespace Removes unnecessary whitespace/newlines
--minify-identifiers Shortens internal type variable names while preserving public API names
--minify Enables all above options

Example output comparison:

// Original (6.7KB for example)
interface ApiClientOptions {
	/** The base URL for API requests */
	baseUrl: string;
	/** Request timeout in milliseconds */
	timeout?: number;
}
export { ApiClientOptions };

// Minified (807B)
interface t{baseUrl:string;timeout?:number;}export{t as ApiClientOptions};

Recommended for production

bunx turbodts src/index.ts --minify-identifiers

You can minify internal type variables while preserving public API names. This approach effectively reduces declaration file size while maintaining developer experience. Minifying whitespace would make JSDoc comments ineffective, and removing JSDoc comments would degrade the developer experience since API consumers would lose important documentation about what the API does.

๐Ÿ” External Type Resolution

Control how external dependencies are handled:

# Resolve all external types (includes everything from node_modules)
bunx turbodts src/index.ts --resolve-all

# Resolve specific packages only
bunx turbodts src/index.ts --resolve "react,@types/node"

# Default behavior (externalize all dependencies)
bunx turbodts src/index.ts

โšก Isolated Declarations

Enable TypeScript's isolated declarations mode for dramatic performance improvements:

# Force enable
bunx turbodts src/index.ts --isolated-declarations

# Force disable
bunx turbodts src/index.ts --no-isolated-declarations

# Auto-detect from tsconfig.json (default behavior)
bunx turbodts src/index.ts

Performance Impact:

  • Standard mode: ~250ms
  • Isolated declarations: ~25ms (10x faster)

If your tsconfig.json has "isolatedDeclarations": true, turbodts automatically uses this mode.

๐Ÿงน Output Management

# Custom output directory structure
bunx turbodts src/index.ts --outDir lib/types

# Skip cleaning (by default it cleans the output directory)
bunx turbodts src/index.ts --clean false

๐ŸŽ›๏ธ All CLI Options

Option Description Default
--outDir, -o Output directory for declaration files dist
--splitting, -s Enable code splitting for shared types false
--minify, -m Enable all minification options false
--minify-jsdoc, -mj Remove JSDoc comments false
--minify-whitespace, -mw Remove unnecessary whitespace false
--minify-identifiers, -mi Shorten internal identifiers false
--clean, -c Clean output directory before build true
--resolve-all, -ra Resolve all external dependencies false
--resolve, -r Resolve specific dependencies (comma-separated) false
--isolated-declarations, -id Force enable isolated declarations auto-detect
--no-isolated-declarations, -nid Force disable isolated declarations auto-detect

๐ŸŽฏ Best Practices

For Library Authors

# Production build
bunx turbodts src/index.ts --minify-identifiers --splitting

# Include in package.json scripts
{
  "scripts": {
    "build:types": "bunx turbodts src/index.ts"
  }
}

For Monorepos

# Build each package separately with splitting
bunx turbodts packages/*/src/index.ts --splitting --outDir dist/types

# Or use workspace-specific builds
bunx turbodts packages/core/src/index.ts --outDir packages/core/dist

Performance Optimization

Enable isolated declarations in your tsconfig.json:

{
  "compilerOptions": {
    "declaration": true,
    "isolatedDeclarations": true
  }
}

Use code splitting for multiple entry points:

bunx turbodts src/*.ts --splitting

๐Ÿค Migration from dts-bundle-generator

turbodts is designed as a drop-in replacement:

# Before
bunx dts-bundle-generator -o dist/index.d.ts src/index.ts

# After  
bunx turbodts src/index.ts --outDir dist

Programmatic Usage

import { generateDts, logIsolatedDeclarationErrors } from 'turbodts';

async function build() {
  const result = await generateDts(['src/index.ts'], {
    splitting: true,
    isolatedDeclarations: true
  });
  
  if (result.isolatedDeclarationErrors.length > 0) {
    logIsolatedDeclarationErrors(result.isolatedDeclarationErrors, {
      shouldExit: true,
    });
  }

  for (const file of result.files) {
    await Bun.write(`dist/${file.outputPath}`, file.dts);
  }
}

build().catch(console.error);

Contributing

For guidelines on contributing, please read the contributing guide.

We welcome contributions from the community to enhance turbodts's capabilities and make it even more powerful. โค๏ธ