npm package: @nesvel/knip-config
Description: Shared Knip configuration for unused code detection in monorepos
Author: Nesvel
Latest version: 1.0.3

# @nesvel/knip-config

Shared configuration presets for [Knip](https://github.com/webpro/knip), the analyzer that finds unused files, exports, and dependencies in JavaScript/TypeScript projects.

## Features

- 🎯 **Multiple Presets**: base, library, vite, nextjs, workspace
- 📦 **One-command installation**: Copy preset to your project
- ⚙️ **Customizable**: Override any configuration as needed
- 🚀 **Production-ready**: Opinionated defaults for common setups

## Installation

```bash
pnpm add -D @nesvel/knip-config knip
# or
npm i -D @nesvel/knip-config knip
```

## Quick start

### Using Installation Script (Recommended)

Install a preset using the built-in command:

```bash
# Install base preset (simple library)
pnpm knip-install

# Or specify a preset
pnpm knip-install library
pnpm knip-install vite
pnpm knip-install nextjs
pnpm knip-install workspace
```

### Manual Installation

Copy a preset to your project root:

```bash
cp node_modules/@nesvel/knip-config/src/presets/base.json knip.json
```

## Available Presets

### `base`
Simple library with a single entry point (`src/index.ts`). Best for basic TypeScript libraries.

### `library`
Library with multiple entry points and test framework support. Includes Jest/Vitest configuration.

### `vite`
Vite/React application with proper handling of `index.html`, `main.tsx`, and Vite config.

### `nextjs`
Next.js application supporting both Pages Router and App Router.

### `workspace`
Monorepo/workspace configuration with patterns for `apps/*`, `packages/*`, and `packages/tools/*`.

## Usage

Add scripts to your `package.json`:

```json
{
  "scripts": {
    "knip": "knip",
    "knip:fix": "knip --fix",
    "knip:strict": "knip --strict",
    "knip:install": "knip-install"
  }
}
```

Run knip:

```bash
# Check for unused code
pnpm knip

# Auto-remove unused dependencies
pnpm knip --fix

# Strict mode (fails on any issue)
pnpm knip --strict
```

## Customization

After installing a preset, you can customize `knip.json` as needed:

```json
{
  "$schema": "https://unpkg.com/knip@5/schema.json",
  "entry": ["src/index.ts"],
  "project": ["src/**/*.{ts,tsx}"],
  "ignore": [
    "**/node_modules/**",
    "**/dist/**",
    "**/my-custom-ignore/**"
  ],
  "ignoreDependencies": [
    "my-special-package"
  ]
}
```

## CI/CD Integration

Add Knip to your CI pipeline:

```yaml
# .github/workflows/ci.yml
- name: Check for unused code
  run: pnpm knip --production
```

Or add it to your `package.json`:

```json
{
  "scripts": {
    "ci": "pnpm typecheck && pnpm lint && pnpm test && pnpm knip --production"
  }
}
```

## Recommendations

- ✅ Run `pnpm knip` locally before committing to keep dependencies tidy
- ✅ Use `--fix` cautiously; review changes in PRs
- ✅ Add `pnpm knip --production` to CI to catch issues early
- ✅ Start with a permissive config and tighten over time
- ✅ Use `ignoreExportsUsedInFile` for type-only exports

## Troubleshooting

### False positives

If Knip reports something as unused but it's actually used:

1. Add it to `ignore` or `ignoreDependencies` in `knip.json`
2. Check if the file/export is actually being imported correctly
3. Use `includeEntryExports: true` to mark entry point exports as used

### Config not working

Make sure:
- `knip.json` exists in your project root
- Patterns use glob syntax (e.g., `src/**/*.ts` not `src/`)
- Entry points are correctly specified

## License

MIT © Nesvel