Dead Code Detector
Detect and eliminate dead code in TypeScript/JavaScript codebases.
Quick Start
Run the automated scanner:
node ~/.claude/skills/dead-code-detector/scripts/find-dead-code.js .
Output: Console report + dead-code-report.json with all findings.
What Gets Detected
1. Unused Exports
Exported symbols never imported elsewhere in the codebase.
// src/utils/helpers.ts
export function formatDate() { ... } // Used
export function oldFormatter() { ... } // DEAD - never imported
False positive handling: Automatically skips:
- Entry points (
index.ts,page.tsx,convex/functions) - Common type suffixes (
Props,Config,Schema) - Default exports (may be dynamically imported)
2. Unused Dependencies
Packages in package.json never imported anywhere.
{
"dependencies": {
"lodash": "^4.17.21", // DEAD - replaced by native methods
"react": "^18.0.0" // Used
}
}
False positive handling: Automatically skips:
- Dev tools: typescript, eslint, prettier, vitest, jest
- Type packages: @types/*
- Build tools: webpack, vite, rollup, postcss, tailwindcss
3. Unreachable Code Patterns
// Code after return
function foo() {
return 1;
console.log("dead"); // FLAGGED
}
// Always-false conditions
if (false) { ... } // FLAGGED
// Stale TODOs
// TODO (2021): Fix this // FLAGGED as stale
Manual Investigation Workflow
For findings that need verification:
Check if export is truly unused
rg "symbolName" --type ts
rg "from.*filename" --type ts # Check imports of file
Check for dynamic imports
rg "import\(['\"].*moduleName" --type ts
rg "require\(['\"].*moduleName" --type js
Check if dependency is used in config
rg "packageName" *.config.* package.json
Framework Considerations
Framework-specific exports that look unused but aren't:
| Framework | Safe to Keep |
|---|---|
| Next.js | generateStaticParams, generateMetadata, exports from page.tsx/layout.tsx |
| Remotion | Compositions in Root.tsx, calculateMetadata |
| Convex | All convex/ function exports (deployed via API) |
| Express | Route handlers, middleware (registered, not imported) |
Cleanup Workflow
- Run scanner on project root
- Review findings - verify each is truly dead
- Remove code - delete unused exports and functions
- Remove dependencies -
npm uninstall <package> - Run tests - ensure nothing broke
- Commit - "chore: remove dead code"
Reference
For detailed patterns and edge cases, see references/patterns.md.