node-janitor 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +259 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +337 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/cleaner.d.ts +10 -0
- package/dist/core/cleaner.d.ts.map +1 -0
- package/dist/core/cleaner.js +107 -0
- package/dist/core/cleaner.js.map +1 -0
- package/dist/core/deep-cleaner.d.ts +10 -0
- package/dist/core/deep-cleaner.d.ts.map +1 -0
- package/dist/core/deep-cleaner.js +228 -0
- package/dist/core/deep-cleaner.js.map +1 -0
- package/dist/core/scanner.d.ts +35 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +172 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +183 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/progress.d.ts +20 -0
- package/dist/ui/progress.d.ts.map +1 -0
- package/dist/ui/progress.js +29 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/prompts.d.ts +40 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +106 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/spinner.d.ts +15 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +30 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +38 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +117 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/utils/formatter.d.ts +40 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +103 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +53 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +155 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +77 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# ๐งน Node-Janitor
|
|
2
|
+
|
|
3
|
+
> Smart CLI tool to clean up `node_modules` folders - free up disk space automatically
|
|
4
|
+
|
|
5
|
+
[](https://badge.fury.io/js/node-janitor)
|
|
6
|
+
[](https://github.com/patchybean/node-janitor/actions/workflows/ci.yml)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
|
|
9
|
+
## โจ Features
|
|
10
|
+
|
|
11
|
+
- ๐ **Smart Scanner** - Find all `node_modules` in your system
|
|
12
|
+
- โฐ **Time-based Cleanup** - Delete folders older than X days
|
|
13
|
+
- ๐งผ **Deep Clean** - Remove unnecessary files (docs, tests, source maps)
|
|
14
|
+
- ๐๏ธ **Dry Run** - Preview before deleting
|
|
15
|
+
- ๐ฎ **Interactive Mode** - Step-by-step wizard
|
|
16
|
+
- ๐พ **Backup** - Save list before deletion
|
|
17
|
+
- ๐ **Reports** - Detailed analytics
|
|
18
|
+
- โก **Fast Mode** - Native OS commands for speed
|
|
19
|
+
- ๐ **CI/CD Ready** - Silent mode with JSON output
|
|
20
|
+
|
|
21
|
+
## ๐ฆ Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Global installation
|
|
25
|
+
npm install -g node-janitor
|
|
26
|
+
|
|
27
|
+
# Or use with npx
|
|
28
|
+
npx node-janitor
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## ๐ Quick Start
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Scan current directory
|
|
35
|
+
node-janitor
|
|
36
|
+
|
|
37
|
+
# Scan specific path
|
|
38
|
+
node-janitor --path ~/projects
|
|
39
|
+
|
|
40
|
+
# Preview what would be deleted (dry run)
|
|
41
|
+
node-janitor --path ~/projects --dry-run
|
|
42
|
+
|
|
43
|
+
# Delete folders older than 30 days
|
|
44
|
+
node-janitor --older-than 30d
|
|
45
|
+
|
|
46
|
+
# Interactive mode
|
|
47
|
+
node-janitor --interactive
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## ๐ Usage
|
|
51
|
+
|
|
52
|
+
### Basic Commands
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# Scan and show all node_modules
|
|
56
|
+
node-janitor --path ~/projects
|
|
57
|
+
|
|
58
|
+
# Limit scan depth
|
|
59
|
+
node-janitor --path ~/projects --depth 3
|
|
60
|
+
|
|
61
|
+
# Quick scan (skip size calculation)
|
|
62
|
+
node-janitor --path ~/projects --quick
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Time-based Cleanup
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Delete folders older than 30 days
|
|
69
|
+
node-janitor --older-than 30d
|
|
70
|
+
|
|
71
|
+
# Delete folders older than 3 months
|
|
72
|
+
node-janitor --older-than 3m
|
|
73
|
+
|
|
74
|
+
# Delete folders between 30-90 days old
|
|
75
|
+
node-janitor --between 30d-90d
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Size Filters
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Only delete folders larger than 500MB
|
|
82
|
+
node-janitor --min-size 500MB
|
|
83
|
+
|
|
84
|
+
# Only delete folders smaller than 10MB
|
|
85
|
+
node-janitor --max-size 10MB
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Deep Clean Mode
|
|
89
|
+
|
|
90
|
+
Remove unnecessary files from `node_modules` without deleting the entire folder:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
node-janitor --deep-clean
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Files removed:**
|
|
97
|
+
- Documentation: `*.md`, `LICENSE`, `CHANGELOG`, `docs/`
|
|
98
|
+
- Tests: `test/`, `tests/`, `__tests__/`, `spec/`
|
|
99
|
+
- Source maps: `*.map`
|
|
100
|
+
- Examples: `example/`, `examples/`
|
|
101
|
+
- Config files: `.eslintrc`, `.prettierrc`, etc.
|
|
102
|
+
|
|
103
|
+
### Safe Mode
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Preview without deleting
|
|
107
|
+
node-janitor --dry-run
|
|
108
|
+
|
|
109
|
+
# Create backup before deletion
|
|
110
|
+
node-janitor --backup
|
|
111
|
+
|
|
112
|
+
# Only delete if lockfile exists
|
|
113
|
+
node-janitor --lock-check
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Performance
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Use native OS commands (faster)
|
|
120
|
+
node-janitor --fast
|
|
121
|
+
|
|
122
|
+
# Parallel deletion
|
|
123
|
+
node-janitor --parallel 4
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Reports
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Generate report
|
|
130
|
+
node-janitor report
|
|
131
|
+
|
|
132
|
+
# Detailed report
|
|
133
|
+
node-janitor report --detailed
|
|
134
|
+
|
|
135
|
+
# JSON output
|
|
136
|
+
node-janitor report --json
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### CI/CD Integration
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Silent mode (no prompts, no colors)
|
|
143
|
+
node-janitor --silent --older-than 30d
|
|
144
|
+
|
|
145
|
+
# JSON output for automation
|
|
146
|
+
node-janitor --json
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Exclude Patterns
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Exclude specific folders
|
|
153
|
+
node-janitor --exclude "important-project,client-work"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## ๐ All Options
|
|
157
|
+
|
|
158
|
+
| Option | Description |
|
|
159
|
+
|--------|-------------|
|
|
160
|
+
| `-p, --path <path>` | Directory to scan (default: current) |
|
|
161
|
+
| `-d, --depth <n>` | Maximum scan depth |
|
|
162
|
+
| `--older-than <duration>` | Only process folders older than (30d, 3m, 1y) |
|
|
163
|
+
| `--between <range>` | Age range (30d-90d) |
|
|
164
|
+
| `--min-size <size>` | Minimum folder size (500MB) |
|
|
165
|
+
| `--max-size <size>` | Maximum folder size (10MB) |
|
|
166
|
+
| `--dry-run` | Preview only |
|
|
167
|
+
| `--deep-clean` | Remove unnecessary files |
|
|
168
|
+
| `--fast` | Use native OS commands |
|
|
169
|
+
| `--parallel <n>` | Number of parallel deletions |
|
|
170
|
+
| `--backup` | Create backup before deletion |
|
|
171
|
+
| `--lock-check` | Only delete if lockfile exists |
|
|
172
|
+
| `--quick` | Skip size calculation |
|
|
173
|
+
| `-i, --interactive` | Interactive mode |
|
|
174
|
+
| `-v, --verbose` | Verbose output |
|
|
175
|
+
| `--debug` | Debug mode |
|
|
176
|
+
| `--silent` | Silent mode (CI/CD) |
|
|
177
|
+
| `--json` | JSON output |
|
|
178
|
+
| `--exclude <patterns>` | Exclude patterns (comma-separated) |
|
|
179
|
+
|
|
180
|
+
## ๐ฏ Examples
|
|
181
|
+
|
|
182
|
+
### Clean old projects
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# Find and delete node_modules older than 90 days
|
|
186
|
+
node-janitor --path ~/projects --older-than 90d
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Deep clean to save space
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Remove docs, tests, source maps from all node_modules
|
|
193
|
+
node-janitor --path ~/projects --deep-clean
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### CI/CD cleanup
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Automated cleanup in CI
|
|
200
|
+
node-janitor --silent --older-than 60d --json
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Cautious cleanup
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# Preview first
|
|
207
|
+
node-janitor --path ~/projects --older-than 30d --dry-run
|
|
208
|
+
|
|
209
|
+
# Then execute with backup
|
|
210
|
+
node-janitor --path ~/projects --older-than 30d --backup
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## ๐ Sample Output
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
๐งน NODE JANITOR
|
|
217
|
+
|
|
218
|
+
โ Found 15 node_modules folders
|
|
219
|
+
|
|
220
|
+
โโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโ
|
|
221
|
+
โ # โ Path โ Size โ Age โ Packages โ Lock โ
|
|
222
|
+
โโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโผโโโโโโโโผโโโโโโโโโโโผโโโโโโโค
|
|
223
|
+
โ 1 โ ~/projects/old-app โ 523 MB โ 180d โ 1,234 โ npm โ
|
|
224
|
+
โ 2 โ ~/projects/test-project โ 312 MB โ 95d โ 567 โ yarn โ
|
|
225
|
+
โ 3 โ ~/projects/archived โ 245 MB โ 45d โ 890 โ npm โ
|
|
226
|
+
โโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโดโโโโโโโโดโโโโโโโโโโโดโโโโโโโ
|
|
227
|
+
|
|
228
|
+
โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโ
|
|
229
|
+
โ Total Folders โ 15 โ
|
|
230
|
+
โ Total Size โ 2.5 GB โ
|
|
231
|
+
โ Oldest โ 180 days โ
|
|
232
|
+
โ Newest โ 5 days โ
|
|
233
|
+
โโโโโโโโโโโโโโโโโดโโโโโโโโโโโ
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## ๐ง Development
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Clone repository
|
|
240
|
+
git clone https://github.com/patchybean/node-janitor.git
|
|
241
|
+
cd node-janitor
|
|
242
|
+
|
|
243
|
+
# Install dependencies
|
|
244
|
+
npm install
|
|
245
|
+
|
|
246
|
+
# Build
|
|
247
|
+
npm run build
|
|
248
|
+
|
|
249
|
+
# Run locally
|
|
250
|
+
node dist/index.js --help
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## ๐ License
|
|
254
|
+
|
|
255
|
+
MIT ยฉ Patchy Bean
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
**Made with โค๏ธ for developers who hate bloated disk space**
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC,wBAAgB,aAAa,IAAI,OAAO,CA2CvC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { scanNodeModules, calculateTotals, filterByAge } from './core/scanner.js';
|
|
4
|
+
import { cleanNodeModules } from './core/cleaner.js';
|
|
5
|
+
import { deepClean } from './core/deep-cleaner.js';
|
|
6
|
+
import { createSpinner } from './ui/spinner.js';
|
|
7
|
+
import { createFoldersTable, createSummaryTable, createBreakdownTable } from './ui/table.js';
|
|
8
|
+
import { createProgressBar, updateProgress, stopProgress } from './ui/progress.js';
|
|
9
|
+
import { promptPath, promptAge, promptConfirm, promptViewList, promptDelete, promptAction, promptSelectFolders, } from './ui/prompts.js';
|
|
10
|
+
import logger from './utils/logger.js';
|
|
11
|
+
import { formatBytes, parseDuration } from './utils/formatter.js';
|
|
12
|
+
const VERSION = '1.0.0';
|
|
13
|
+
// ASCII Art Banner
|
|
14
|
+
const BANNER = chalk.cyan(`
|
|
15
|
+
โโโโ โโโ โโโโโโโ โโโโโโโ โโโโโโโโ โโโ โโโโโโ โโโโ โโโโโโโโโโโโโโโ โโโโโโโ โโโโโโโ
|
|
16
|
+
โโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
17
|
+
โโโโโโ โโโโโโ โโโโโโ โโโโโโโโโ โโโโโโโโโโโโโโโโโ โโโโโโ โโโ โโโ โโโโโโโโโโโ
|
|
18
|
+
โโโโโโโโโโโโโ โโโโโโ โโโโโโโโโ โโ โโโโโโโโโโโโโโโโโโโโโโโโ โโโ โโโ โโโโโโโโโโโ
|
|
19
|
+
โโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโ โโโโโโ โโโโโโโโโ โโโ โโโโโโโโโโโโ โโโ
|
|
20
|
+
โโโ โโโโโ โโโโโโโ โโโโโโโ โโโโโโโโ โโโโโโ โโโ โโโโโโ โโโโโโโโ โโโ โโโโโโโ โโโ โโโ
|
|
21
|
+
`);
|
|
22
|
+
export function createProgram() {
|
|
23
|
+
const program = new Command();
|
|
24
|
+
program
|
|
25
|
+
.name('node-janitor')
|
|
26
|
+
.version(VERSION)
|
|
27
|
+
.description('๐งน Smart CLI tool to clean up node_modules folders')
|
|
28
|
+
.option('-p, --path <path>', 'Directory to scan', process.cwd())
|
|
29
|
+
.option('-d, --depth <number>', 'Maximum depth to scan', parseInt)
|
|
30
|
+
.option('--older-than <duration>', 'Only process folders older than (e.g., 30d, 3m, 1y)')
|
|
31
|
+
.option('--between <range>', 'Only process folders in age range (e.g., 30d-90d)')
|
|
32
|
+
.option('--min-size <size>', 'Only process folders larger than (e.g., 500MB)')
|
|
33
|
+
.option('--max-size <size>', 'Only process folders smaller than (e.g., 10MB)')
|
|
34
|
+
.option('--dry-run', 'Preview only, do not delete anything')
|
|
35
|
+
.option('--deep-clean', 'Remove unnecessary files from node_modules')
|
|
36
|
+
.option('--fast', 'Use native OS commands for faster deletion')
|
|
37
|
+
.option('--parallel <number>', 'Number of parallel deletions', parseInt)
|
|
38
|
+
.option('--backup', 'Create backup before deletion')
|
|
39
|
+
.option('--lock-check', 'Only delete if lockfile exists')
|
|
40
|
+
.option('--quick', 'Quick scan (skip size calculation)')
|
|
41
|
+
.option('-i, --interactive', 'Interactive mode')
|
|
42
|
+
.option('-v, --verbose', 'Verbose output')
|
|
43
|
+
.option('--debug', 'Debug mode')
|
|
44
|
+
.option('--silent', 'Silent mode (for CI/CD)')
|
|
45
|
+
.option('--json', 'Output as JSON')
|
|
46
|
+
.option('--exclude <patterns>', 'Exclude patterns (comma-separated)')
|
|
47
|
+
.action(async (options) => {
|
|
48
|
+
await mainAction(options);
|
|
49
|
+
});
|
|
50
|
+
// Report sub-command
|
|
51
|
+
program
|
|
52
|
+
.command('report')
|
|
53
|
+
.description('๐ Generate a detailed report')
|
|
54
|
+
.option('-p, --path <path>', 'Directory to scan', process.cwd())
|
|
55
|
+
.option('-d, --depth <number>', 'Maximum depth to scan', parseInt)
|
|
56
|
+
.option('--detailed', 'Show detailed breakdown')
|
|
57
|
+
.option('--json', 'Output as JSON')
|
|
58
|
+
.action(async (options) => {
|
|
59
|
+
await reportAction(options);
|
|
60
|
+
});
|
|
61
|
+
return program;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Main action handler
|
|
65
|
+
*/
|
|
66
|
+
async function mainAction(options) {
|
|
67
|
+
// Configure logger
|
|
68
|
+
logger.configure({
|
|
69
|
+
verbose: options.verbose,
|
|
70
|
+
debug: options.debug,
|
|
71
|
+
silent: options.silent,
|
|
72
|
+
});
|
|
73
|
+
// Interactive mode
|
|
74
|
+
if (options.interactive) {
|
|
75
|
+
await interactiveMode();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Show banner (unless silent/json)
|
|
79
|
+
if (!options.silent && !options.json) {
|
|
80
|
+
console.log(BANNER);
|
|
81
|
+
}
|
|
82
|
+
// Scan
|
|
83
|
+
const scanPath = options.path || process.cwd();
|
|
84
|
+
const excludePatterns = options.exclude
|
|
85
|
+
? options.exclude.split(',').map(s => s.trim())
|
|
86
|
+
: [];
|
|
87
|
+
const spinner = createSpinner(`๐ Scanning ${scanPath}...`);
|
|
88
|
+
spinner.start();
|
|
89
|
+
let folders;
|
|
90
|
+
try {
|
|
91
|
+
folders = await scanNodeModules({
|
|
92
|
+
path: scanPath,
|
|
93
|
+
depth: options.depth,
|
|
94
|
+
quick: options.quick,
|
|
95
|
+
excludePatterns,
|
|
96
|
+
});
|
|
97
|
+
spinner.succeed(`Found ${folders.length} node_modules folders`);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
spinner.fail('Scan failed');
|
|
101
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
if (folders.length === 0) {
|
|
105
|
+
logger.info('No node_modules folders found.');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Apply age filter for display
|
|
109
|
+
let displayFolders = folders;
|
|
110
|
+
if (options.olderThan) {
|
|
111
|
+
const days = parseDuration(options.olderThan);
|
|
112
|
+
displayFolders = filterByAge(folders, days);
|
|
113
|
+
}
|
|
114
|
+
// JSON output
|
|
115
|
+
if (options.json) {
|
|
116
|
+
const totals = calculateTotals(displayFolders);
|
|
117
|
+
console.log(JSON.stringify({
|
|
118
|
+
folders: displayFolders,
|
|
119
|
+
...totals,
|
|
120
|
+
}, null, 2));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Show results
|
|
124
|
+
if (displayFolders.length > 0) {
|
|
125
|
+
console.log();
|
|
126
|
+
console.log(createFoldersTable(displayFolders.slice(0, 20)));
|
|
127
|
+
if (displayFolders.length > 20) {
|
|
128
|
+
logger.info(`...and ${displayFolders.length - 20} more folders`);
|
|
129
|
+
}
|
|
130
|
+
const totals = calculateTotals(displayFolders);
|
|
131
|
+
console.log();
|
|
132
|
+
console.log(createSummaryTable(totals));
|
|
133
|
+
}
|
|
134
|
+
// Dry run
|
|
135
|
+
if (options.dryRun) {
|
|
136
|
+
logger.info('๐ Dry run mode - no files will be deleted');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Deep clean mode
|
|
140
|
+
if (options.deepClean) {
|
|
141
|
+
await performDeepClean(displayFolders, options);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Normal clean - ask for confirmation if not in silent mode
|
|
145
|
+
if (!options.silent) {
|
|
146
|
+
const totals = calculateTotals(displayFolders);
|
|
147
|
+
const confirmed = await promptConfirm(`๐๏ธ Delete ${displayFolders.length} folders (${formatBytes(totals.totalSize)})?`);
|
|
148
|
+
if (!confirmed) {
|
|
149
|
+
logger.info('Cancelled.');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Perform cleanup
|
|
154
|
+
await performClean(displayFolders, options);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Interactive mode
|
|
158
|
+
*/
|
|
159
|
+
async function interactiveMode() {
|
|
160
|
+
console.log(BANNER);
|
|
161
|
+
console.log(chalk.gray('๐ฎ Interactive Mode'));
|
|
162
|
+
console.log();
|
|
163
|
+
while (true) {
|
|
164
|
+
const action = await promptAction();
|
|
165
|
+
if (action === 'exit') {
|
|
166
|
+
logger.success('Goodbye! ๐');
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
if (action === 'scan' || action === 'clean') {
|
|
170
|
+
const scanPath = await promptPath(process.cwd());
|
|
171
|
+
const ageFilter = await promptAge();
|
|
172
|
+
const spinner = createSpinner(`๐ Scanning ${scanPath}...`);
|
|
173
|
+
spinner.start();
|
|
174
|
+
let folders = await scanNodeModules({ path: scanPath });
|
|
175
|
+
spinner.succeed(`Found ${folders.length} node_modules folders`);
|
|
176
|
+
if (ageFilter) {
|
|
177
|
+
const days = parseDuration(ageFilter);
|
|
178
|
+
folders = filterByAge(folders, days);
|
|
179
|
+
logger.info(`After age filter: ${folders.length} folders`);
|
|
180
|
+
}
|
|
181
|
+
if (folders.length === 0) {
|
|
182
|
+
logger.info('No matching folders found.');
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const totals = calculateTotals(folders);
|
|
186
|
+
console.log();
|
|
187
|
+
console.log(`๐ Found ${chalk.cyan(folders.length)} folders, total ${chalk.yellow(formatBytes(totals.totalSize))}`);
|
|
188
|
+
if (await promptViewList()) {
|
|
189
|
+
console.log();
|
|
190
|
+
console.log(createFoldersTable(folders.slice(0, 20)));
|
|
191
|
+
}
|
|
192
|
+
if (action === 'clean') {
|
|
193
|
+
const selectedFolders = await promptSelectFolders(folders);
|
|
194
|
+
if (selectedFolders.length > 0) {
|
|
195
|
+
const selectedTotals = calculateTotals(selectedFolders);
|
|
196
|
+
if (await promptDelete(selectedFolders.length, selectedTotals.totalSize)) {
|
|
197
|
+
await performClean(selectedFolders, { backup: true });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (action === 'deep-clean') {
|
|
203
|
+
const scanPath = await promptPath(process.cwd());
|
|
204
|
+
const spinner = createSpinner(`๐ Scanning ${scanPath}...`);
|
|
205
|
+
spinner.start();
|
|
206
|
+
const folders = await scanNodeModules({ path: scanPath });
|
|
207
|
+
spinner.succeed(`Found ${folders.length} node_modules folders`);
|
|
208
|
+
if (folders.length === 0) {
|
|
209
|
+
logger.info('No node_modules folders found.');
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (await promptConfirm('๐งผ Perform deep clean on all folders?')) {
|
|
213
|
+
await performDeepClean(folders, { verbose: true });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (action === 'report') {
|
|
217
|
+
const scanPath = await promptPath(process.cwd());
|
|
218
|
+
await reportAction({ path: scanPath, detailed: true });
|
|
219
|
+
}
|
|
220
|
+
console.log();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Perform cleanup operation
|
|
225
|
+
*/
|
|
226
|
+
async function performClean(folders, options) {
|
|
227
|
+
const bar = createProgressBar(folders.length, '๐งน Cleaning');
|
|
228
|
+
const result = await cleanNodeModules(folders, {
|
|
229
|
+
fast: options.fast,
|
|
230
|
+
parallel: options.parallel,
|
|
231
|
+
backup: options.backup,
|
|
232
|
+
}, (current, _total, path) => {
|
|
233
|
+
updateProgress(bar, current, path.split('/').pop() || '');
|
|
234
|
+
});
|
|
235
|
+
stopProgress(bar);
|
|
236
|
+
console.log();
|
|
237
|
+
logger.success(`Deleted ${result.deletedCount} folders`);
|
|
238
|
+
logger.success(`Freed ${formatBytes(result.freedBytes)}`);
|
|
239
|
+
if (result.backupPath) {
|
|
240
|
+
logger.info(`Backup saved to: ${result.backupPath}`);
|
|
241
|
+
}
|
|
242
|
+
if (result.errors.length > 0) {
|
|
243
|
+
logger.warn(`${result.errors.length} errors occurred:`);
|
|
244
|
+
result.errors.forEach(e => logger.error(` ${e.path}: ${e.message}`));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Perform deep clean operation
|
|
249
|
+
*/
|
|
250
|
+
async function performDeepClean(folders, options) {
|
|
251
|
+
const bar = createProgressBar(folders.length, '๐งผ Deep Cleaning');
|
|
252
|
+
let totalFreed = 0;
|
|
253
|
+
let totalFiles = 0;
|
|
254
|
+
for (let i = 0; i < folders.length; i++) {
|
|
255
|
+
const folder = folders[i];
|
|
256
|
+
updateProgress(bar, i + 1, folder.projectPath.split('/').pop() || '');
|
|
257
|
+
const result = await deepClean(folder.path, {
|
|
258
|
+
dryRun: options.dryRun,
|
|
259
|
+
verbose: options.verbose,
|
|
260
|
+
});
|
|
261
|
+
totalFreed += result.freedBytes;
|
|
262
|
+
totalFiles += result.deletedFileCount;
|
|
263
|
+
}
|
|
264
|
+
stopProgress(bar);
|
|
265
|
+
console.log();
|
|
266
|
+
logger.success(`Processed ${folders.length} folders`);
|
|
267
|
+
logger.success(`Removed ${totalFiles} files`);
|
|
268
|
+
logger.success(`Freed ${formatBytes(totalFreed)}`);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Report action handler
|
|
272
|
+
*/
|
|
273
|
+
async function reportAction(options) {
|
|
274
|
+
const scanPath = options.path || process.cwd();
|
|
275
|
+
const spinner = createSpinner(`๐ Scanning ${scanPath}...`);
|
|
276
|
+
spinner.start();
|
|
277
|
+
const folders = await scanNodeModules({ path: scanPath });
|
|
278
|
+
spinner.succeed(`Found ${folders.length} node_modules folders`);
|
|
279
|
+
if (folders.length === 0) {
|
|
280
|
+
logger.info('No node_modules folders found.');
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const totals = calculateTotals(folders);
|
|
284
|
+
// Calculate breakdown
|
|
285
|
+
const recent = folders.filter(f => f.ageDays < 30);
|
|
286
|
+
const medium = folders.filter(f => f.ageDays >= 30 && f.ageDays < 90);
|
|
287
|
+
const old = folders.filter(f => f.ageDays >= 90);
|
|
288
|
+
if (options.json) {
|
|
289
|
+
console.log(JSON.stringify({
|
|
290
|
+
timestamp: new Date().toISOString(),
|
|
291
|
+
...totals,
|
|
292
|
+
breakdown: {
|
|
293
|
+
recent: { count: recent.length, size: recent.reduce((s, f) => s + f.size, 0) },
|
|
294
|
+
medium: { count: medium.length, size: medium.reduce((s, f) => s + f.size, 0) },
|
|
295
|
+
old: { count: old.length, size: old.reduce((s, f) => s + f.size, 0) },
|
|
296
|
+
},
|
|
297
|
+
topBySize: folders.slice(0, 10),
|
|
298
|
+
topByAge: [...folders].sort((a, b) => b.ageDays - a.ageDays).slice(0, 10),
|
|
299
|
+
}, null, 2));
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
console.log();
|
|
303
|
+
logger.title('๐ Node Modules Report');
|
|
304
|
+
console.log();
|
|
305
|
+
// Summary
|
|
306
|
+
console.log(createSummaryTable(totals));
|
|
307
|
+
console.log();
|
|
308
|
+
// Breakdown by age
|
|
309
|
+
console.log(chalk.bold('๐
Breakdown by Age:'));
|
|
310
|
+
console.log(createBreakdownTable({
|
|
311
|
+
recent: { count: recent.length, size: recent.reduce((s, f) => s + f.size, 0) },
|
|
312
|
+
medium: { count: medium.length, size: medium.reduce((s, f) => s + f.size, 0) },
|
|
313
|
+
old: { count: old.length, size: old.reduce((s, f) => s + f.size, 0) },
|
|
314
|
+
}));
|
|
315
|
+
console.log();
|
|
316
|
+
// Top 10 by size
|
|
317
|
+
if (options.detailed) {
|
|
318
|
+
console.log(chalk.bold('๐ฆ Top 10 Largest:'));
|
|
319
|
+
console.log(createFoldersTable(folders.slice(0, 10)));
|
|
320
|
+
console.log();
|
|
321
|
+
// Top 10 oldest
|
|
322
|
+
console.log(chalk.bold('๐ฐ๏ธ Top 10 Oldest:'));
|
|
323
|
+
const oldestFolders = [...folders].sort((a, b) => b.ageDays - a.ageDays).slice(0, 10);
|
|
324
|
+
console.log(createFoldersTable(oldestFolders));
|
|
325
|
+
}
|
|
326
|
+
// Recommendations
|
|
327
|
+
console.log();
|
|
328
|
+
logger.title('๐ก Recommendations');
|
|
329
|
+
if (old.length > 0) {
|
|
330
|
+
const oldSize = old.reduce((s, f) => s + f.size, 0);
|
|
331
|
+
console.log(chalk.yellow(` โ Run ${chalk.cyan('node-janitor --older-than 90d')} to free ${formatBytes(oldSize)}`));
|
|
332
|
+
}
|
|
333
|
+
if (totals.totalSize > 1024 * 1024 * 1024) { // > 1GB
|
|
334
|
+
console.log(chalk.yellow(` โ Run ${chalk.cyan('node-janitor --deep-clean')} to save ~40% more space`));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NodeModulesInfo, CleanOptions, CleanResult } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Clean node_modules folders
|
|
4
|
+
*/
|
|
5
|
+
export declare function cleanNodeModules(folders: NodeModulesInfo[], options: CleanOptions, onProgress?: (current: number, total: number, path: string) => void): Promise<CleanResult>;
|
|
6
|
+
declare const _default: {
|
|
7
|
+
cleanNodeModules: typeof cleanNodeModules;
|
|
8
|
+
};
|
|
9
|
+
export default _default;
|
|
10
|
+
//# sourceMappingURL=cleaner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleaner.d.ts","sourceRoot":"","sources":["../../src/core/cleaner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAOhG;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,YAAY,EACrB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GACpE,OAAO,CAAC,WAAW,CAAC,CAoFtB;;;;AA+BD,wBAAoC"}
|