Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Sep 19, 2025. It is now read-only.

nadeesha/ts-prune

Repository files navigation

ts-prune

npm npm GitHub issues

Find potentially unused exports in your TypeScript project with zero configuration.

πŸ“’ Maintenance Notice

ts-prune is now in maintenance mode - For new projects, we recommend knip which carries forward the same mission with more features.

ts-prune will continue to receive:

  • βœ… Critical bug fixes
  • βœ… Security updates
  • βœ… Dependency maintenance

We will not be adding new features or accepting feature PRs. The tool remains stable and production-ready for existing users.

What is ts-prune?

ts-prune is a simple, fast tool that finds exported TypeScript/JavaScript code that isn't being used anywhere in your project. It helps you:

  • 🧹 Clean up dead code - Remove exports that serve no purpose
  • πŸ“¦ Reduce bundle size - Eliminate unused code from your builds
  • πŸ” Improve code quality - Keep your codebase lean and maintainable
  • ⚑ Zero configuration - Works out of the box with any TypeScript project

Quick Start

Installation

# npm
npm install --save-dev ts-prune

# yarn  
yarn add --dev ts-prune

# pnpm
pnpm add --save-dev ts-prune

Basic Usage

# Run in your project root
npx ts-prune

Example output:

src/components/Button.ts:15 - ButtonVariant
src/utils/helpers.ts:8 - formatCurrency  
src/types/user.ts:12 - UserRole
src/api/client.ts:45 - ApiResponse

Each line shows: file:line - exportName

Examples

Example 1: Finding Unused Exports

Given these files:

// src/utils/math.ts
export const add = (a: number, b: number) => a + b;
export const subtract = (a: number, b: number) => a - b;  // unused
export const multiply = (a: number, b: number) => a * b;  // unused

// src/app.ts  
import { add } from './utils/math';
console.log(add(2, 3));

Running ts-prune outputs:

src/utils/math.ts:2 - subtract
src/utils/math.ts:3 - multiply

Example 2: Ignoring Specific Exports

Use // ts-prune-ignore-next to ignore specific exports:

// src/api/types.ts
export interface User {
  id: string;
  name: string;
}

// ts-prune-ignore-next
export interface AdminUser extends User {  // ignored by ts-prune
  permissions: string[];
}

export interface Customer {  // will be flagged if unused
  customerId: string;
}

Example 3: Working with Different File Types

ts-prune works with various TypeScript patterns:

// Default exports
export default class MyClass {}

// Named exports  
export const myFunction = () => {};
export type MyType = string;
export interface MyInterface {}

// Re-exports
export { SomethingElse } from './other-file';
export * from './barrel-file';

Configuration

CLI Options

ts-prune [options]
Option Description Example
-p, --project Path to tsconfig.json ts-prune -p tsconfig.build.json
-i, --ignore Ignore pattern (RegExp) ts-prune -i "test|spec"
-s, --skip Skip files pattern ts-prune -s "\.test\.ts$"
-e, --error Exit with error code if unused exports found ts-prune -e
-u, --unusedInModule Skip exports marked as "used in module" ts-prune -u

Configuration File

Create .ts-prunerc (JSON), .ts-prunerc.js, or add to package.json:

{
  "ignore": "components/(Button|Input)",
  "skip": "\\.test\\.|test/",
  "project": "tsconfig.build.json"
}

Common Use Cases

1. CI/CD Integration

Add to your package.json:

{
  "scripts": {
    "deadcode": "ts-prune",
    "deadcode:ci": "ts-prune --error"
  }
}

2. Pre-commit Hook

{
  "husky": {
    "hooks": {
      "pre-commit": "ts-prune --error"
    }
  }
}

3. Count Unused Exports

ts-prune | wc -l

4. Filter Results

# Ignore test files
ts-prune | grep -v "\.test\."

# Only show specific directories  
ts-prune | grep "src/components"

# Ignore multiple patterns
ts-prune | grep -v -E "(test|spec|stories)"

Understanding the Output

ts-prune categorizes exports into different types:

  • Regular unused export: src/file.ts:10 - exportName
  • Used in module: src/file.ts:5 - localHelper (used in module)
    • Export is only used within the same file
    • Use -u flag to ignore these

Limitations

  • Dynamic imports: import('./dynamic-file') usage might not be detected
  • String-based imports: require('module-name') patterns
  • Framework magic: Some frameworks use exports through reflection
  • Configuration files: Exports in config files might appear unused

For these cases, use // ts-prune-ignore-next or configure ignore patterns.

FAQ

How accurate is ts-prune?

ts-prune is conservative and may show false positives for:

  • Dynamically imported modules
  • Framework-specific patterns (Angular services, React lazy loading)
  • Build tool configurations

Can I use this with JavaScript?

Yes! ts-prune works with .js files in TypeScript projects. Ensure your tsconfig.json includes JavaScript files:

{
  "compilerOptions": {
    "allowJs": true
  }
}

Acknowledgements

Built with the excellent ts-morph library and inspired by this approach by @dsherret.

Contributors

Nadeesha
Nadeesha Cabral
Snyk
Snyk bot
Dan
Dan Vanderkam
Josh
Josh Goldberg ✨
Vitaly
Vitaly Iegorov
Simon
Simon Jang
The
The Gitter Badger
Tim
Tim Bodeit
Tim
Tim Saunders
Torkel
Torkel Rogstad
Victor
Victor Nogueira
William
William Candillon
curtvict/
curtvict
phiresky/
phiresky
Reece
Reece Daniels
Mikhail
Mikhail Belyaev
Jacob
Jacob Bandes-Storch
Ivo
Ivo Raisr
Hugo
Hugo Duprat
Davis
Davis Ford
David
David Graham
Caleb
Caleb Peterson
Ashok
Ashok Argent-Katwala
Amir
Amir Arad