Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/nadeesha/ts-prune

Find unused exports in a typescript project. πŸ›€
https://github.com/nadeesha/ts-prune

typescript utility

Last synced: 22 days ago
JSON representation

Find unused exports in a typescript project. πŸ›€

Lists

README

        

![Build](https://img.shields.io/github/workflow/status/nadeesha/ts-prune/Run%20CI%20Pipeline) ![npm](https://img.shields.io/npm/dm/ts-prune) ![GitHub issues](https://img.shields.io/github/issues-raw/nadeesha/ts-prune)

# 🚨 ts-prune is going into maintanence mode

Please use [knip](https://github.com/webpro/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](https://asciinema.org/a/liQKNmkGkedCnyHuJzzgu7uDI.svg)](https://asciinema.org/a/liQKNmkGkedCnyHuJzzgu7uDI) [![Join the chat at https://gitter.im/ts-prune/community](https://badges.gitter.im/ts-prune/community.svg)](https://gitter.im/ts-prune/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

## 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

```sh
# 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.

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

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

```sh
ts-prune -p tsconfig.dev.json
```

### Examples

- [gatsby-material-starter](https://github.com/Vagr9K/gatsby-material-starter/blob/bdeba4160319c1977c83ee90e035c7fe1bd1854c/themes/material/package.json#L147)
- [DestinyItemManager](https://github.com/DestinyItemManager/DIM/blob/aeb43dd848b5137656e6f47812189a2beb970089/package.json#L26)

### Configuration

ts-prune supports CLI and file configuration via [cosmiconfig](https://github.com/davidtheclark/cosmiconfig#usage) (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:

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

Configuration file example `.ts-prunerc`:

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

### FAQ

#### How do I get the count of unused exports?

```sh
ts-prune | wc -l
```

#### How do I ignore a specific path?

You can either,

##### 1. Use the `-i, --ignore` configuration option:

```sh
ts-prune --ignore 'src/ignore-this-path'
```

##### 2. Use `grep -v` to filter the output:

```sh
ts-prune | grep -v src/ignore-this-path
```

#### How do I ignore multiple paths?

You can either,

##### 1. Use the `-i, --ignore` configuration option:

```sh
ts-prune --ignore 'src/ignore-this-path|src/also-ignore-this-path'
```

##### 2. Use multiple `grep -v` to filter the output:

```sh
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
// ts-prune-ignore-next
export const thisNeedsIgnoring = foo;
```

##### 2. Use `grep -v` to ignore a more widely used export name

```sh
ts-prune | grep -v ignoreThisThroughoutMyCodebase
```

### Acknowledgements

- The excellent [ts-morph](https://github.com/dsherret/ts-morph) library. And [this gist](https://gist.github.com/dsherret/0bae87310ce24866ae22425af80a9864) by [@dsherret](https://github.com/dsherret).

### 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