Skip to content
This repository has been archived by the owner on Dec 17, 2023. It is now read-only.

nadeesha/ts-prune

Repository files navigation

Build npm GitHub issues

🚨 ts-prune is going into maintanence mode

Please use knip which carries on the spirit.

More details

I started ts-prune to find a sustainable way to detect unused exports in Typescript code. Due to the absence of native APIs that enable this, the best way forward was to consolidate a few hacks together that did this semi-elegantly for most usecases.

However, due to the popularity of ts-prune, it has absorbed more use cases, and complexity has bloated to the point that I'm no longer comfortable to add more features or do any other changes to the core system.

The most important thing for ts-prune is to be backwards compatible and reliable for existing use cases.

What will happen

  • Critical bug fixes
  • Patching vulnerabilities in third party code

What will not happen

  • Entertaining feature requests
  • Accepting PRs for net new features of refactors

Notes for the future

  • This is a feature Typescript should support natively, and each "hack" has a bunch of trade-offs.
  • Due to the sheer fragmentation of TS/JS ecosystem between frameworks, package managers etc a non-native solution will result in complexity bloat.
  • At this point, the maintainer has two choices
    1. Aggresively defend against feature requests, changes and anger the open-source community
    2. Accept complexity bloat, and dedicate time and energy for compaction

ts-prune

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

asciicast Join the chat at https://gitter.im/ts-prune/community

Getting Started

ts-prune exposes a cli that reads your tsconfig file and prints out all the unused exports in your source files.

Installing

Install ts-prune with yarn or npm

# npm
npm install ts-prune --save-dev
# yarn
yarn add -D ts-prune

Usage

You can install it in your project and alias it to a npm script in package.json.

{
  "scripts": {
    "find-deadcode": "ts-prune"
  }
}

If you want to run against different Typescript configuration than tsconfig.json:

ts-prune -p tsconfig.dev.json

Examples

Configuration

ts-prune supports CLI and file configuration via cosmiconfig (all file formats are supported).

Configuration options

  • -p, --project - tsconfig.json path(tsconfig.json by default)
  • -i, --ignore - errors ignore RegExp pattern
  • -e, --error - return error code if unused exports are found
  • -s, --skip - skip these files when determining whether code is used. (For example, .test.ts? will stop ts-prune from considering an export in test file usages)
  • -u, --unusedInModule - skip files that are used in module (marked as used in module)

CLI configuration options:

ts-prune -p my-tsconfig.json -i my-component-ignore-patterns?

Configuration file example .ts-prunerc:

{
  "ignore": "my-component-ignore-patterns?"
}

FAQ

How do I get the count of unused exports?

ts-prune | wc -l

How do I ignore a specific path?

You can either,

1. Use the -i, --ignore configuration option:
ts-prune --ignore 'src/ignore-this-path'
2. Use grep -v to filter the output:
ts-prune | grep -v src/ignore-this-path

How do I ignore multiple paths?

You can either,

1. Use the -i, --ignore configuration option:
ts-prune --ignore 'src/ignore-this-path|src/also-ignore-this-path'
2. Use multiple grep -v to filter the output:
ts-prune | grep -v src/ignore-this-path | grep -v src/also-ignore-this-path

How do I ignore a specific identifier?

You can either,

1. Prefix the export with // ts-prune-ignore-next
// ts-prune-ignore-next
export const thisNeedsIgnoring = foo;
2. Use grep -v to ignore a more widely used export name
ts-prune | grep -v ignoreThisThroughoutMyCodebase

Acknowledgements

Contributors

Nadeesha
Nadeesha Cabral
Snyk
Snyk bot
Dan
Dan Vanderkam
Josh
Josh Goldberg ✨
Vitaly
Vitaly Iegorov
Amir
Amir Arad
Ashok
Ashok Argent-Katwala
Caleb
Caleb Peterson
David
David Graham
Davis
Davis Ford
Hugo
Hugo Duprat
Ivo
Ivo Raisr
Jacob
Jacob Bandes-Storch
Kristján
Kristján Oddsson
Mikhail
Mikhail Belyaev
Reece
Reece Daniels
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