speedwagon
v0.0.3
Published
A CLI tool that detects structural code duplication in JavaScript/TypeScript projects
Readme
speedwagon
A CLI tool that detects structural code duplication in JavaScript/TypeScript projects.
The Problem
As a codebase grows, the same patterns tend to reappear — identical type definitions, duplicate enum declarations, repeated URL strings, and more. These duplicates are hard to spot during code review and gradually make refactoring more expensive.
speedwagon statically analyzes your JS/TS source files and surfaces these duplicates so you can consolidate them before they become technical debt.
Installation
npm install -D speedwagonUsage
# Run in current directory (auto-detects all supported JS/TS files)
npx speedwagon
# Ignore certain paths
npx speedwagon --ignore 'src/**/*.spec.ts'Configuration
You can create a speedwagon.json in your project root to configure the tool.
{
"ignores": ["**/*.spec.ts", "dist/**"]
}| Option | Type | Description |
| --------- | ---------- | ------------------------------------------------ |
| ignores | string[] | Glob patterns for files to exclude from analysis |
Files matched by .gitignore are automatically excluded.
Rule options
Rules can be configured per-category in speedwagon.json. Each rule supports the following common options:
| Option | Type | Description |
| --------- | ---------- | ------------------------------------------------------ |
| ignores | string[] | Glob patterns for files to exclude from this rule only |
Complexity rules (cognitive-complex-function, cyclomatic-complex-function) also support:
| Option | Type | Default | Description |
| ----------- | -------- | ------- | ----------------------------------------- |
| threshold | number | 15 | Minimum complexity score before reporting |
Examples
Exclude test files from a specific rule:
{
"duplication": {
"duplicate-magic-numbers": {
"ignores": ["**/*.spec.ts", "**/*.test.ts"]
}
}
}Adjust the complexity threshold:
{
"complexity": {
"cognitive-complex-function": {
"threshold": 10
},
"cyclomatic-complex-function": {
"threshold": 20,
"ignores": ["src/generated/**"]
}
}
}Rules
| Rule | Description |
| --------------------------------- | --------------------------------------------------------------------- |
| duplicate-type-declaration | Detects type aliases with identical structures |
| duplicate-interface-declaration | Detects interface declarations with identical structures |
| duplicate-enum-declaration | Detects enum declarations with identical members |
| duplicate-url-string | Detects repeated URL string literals |
| duplicate-regex-literal | Detects repeated regular expression literals |
| duplicate-string-interpolation | Detects repeated template literal patterns |
| use-defined-type | Detects inline type annotations that duplicate an existing named type |
| duplicate-function | Detects functions with identical implementations |
| duplicate-magic-numbers | Detects repeated magic numbers (ignores -1, 0, 1) |
| cognitive-complex-function | Detects functions with a cognitive complexity above 15 |
| cyclomatic-complex-function | Detects functions with a cyclomatic complexity above 15 |
Requirements
- Node.js >= 20.19.0 or >= 22.12.0
License
MIT
