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.
Files changed (54) hide show
  1. package/README.md +259 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +337 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/core/cleaner.d.ts +10 -0
  7. package/dist/core/cleaner.d.ts.map +1 -0
  8. package/dist/core/cleaner.js +107 -0
  9. package/dist/core/cleaner.js.map +1 -0
  10. package/dist/core/deep-cleaner.d.ts +10 -0
  11. package/dist/core/deep-cleaner.d.ts.map +1 -0
  12. package/dist/core/deep-cleaner.js +228 -0
  13. package/dist/core/deep-cleaner.js.map +1 -0
  14. package/dist/core/scanner.d.ts +35 -0
  15. package/dist/core/scanner.d.ts.map +1 -0
  16. package/dist/core/scanner.js +172 -0
  17. package/dist/core/scanner.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +5 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/types/index.d.ts +183 -0
  23. package/dist/types/index.d.ts.map +1 -0
  24. package/dist/types/index.js +5 -0
  25. package/dist/types/index.js.map +1 -0
  26. package/dist/ui/progress.d.ts +20 -0
  27. package/dist/ui/progress.d.ts.map +1 -0
  28. package/dist/ui/progress.js +29 -0
  29. package/dist/ui/progress.js.map +1 -0
  30. package/dist/ui/prompts.d.ts +40 -0
  31. package/dist/ui/prompts.d.ts.map +1 -0
  32. package/dist/ui/prompts.js +106 -0
  33. package/dist/ui/prompts.js.map +1 -0
  34. package/dist/ui/spinner.d.ts +15 -0
  35. package/dist/ui/spinner.d.ts.map +1 -0
  36. package/dist/ui/spinner.js +30 -0
  37. package/dist/ui/spinner.js.map +1 -0
  38. package/dist/ui/table.d.ts +38 -0
  39. package/dist/ui/table.d.ts.map +1 -0
  40. package/dist/ui/table.js +117 -0
  41. package/dist/ui/table.js.map +1 -0
  42. package/dist/utils/formatter.d.ts +40 -0
  43. package/dist/utils/formatter.d.ts.map +1 -0
  44. package/dist/utils/formatter.js +103 -0
  45. package/dist/utils/formatter.js.map +1 -0
  46. package/dist/utils/fs-utils.d.ts +53 -0
  47. package/dist/utils/fs-utils.d.ts.map +1 -0
  48. package/dist/utils/fs-utils.js +155 -0
  49. package/dist/utils/fs-utils.js.map +1 -0
  50. package/dist/utils/logger.d.ts +26 -0
  51. package/dist/utils/logger.d.ts.map +1 -0
  52. package/dist/utils/logger.js +77 -0
  53. package/dist/utils/logger.js.map +1 -0
  54. 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
+ [![npm version](https://badge.fury.io/js/node-janitor.svg)](https://badge.fury.io/js/node-janitor)
6
+ [![CI](https://github.com/patchybean/node-janitor/actions/workflows/ci.yml/badge.svg)](https://github.com/patchybean/node-janitor/actions/workflows/ci.yml)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProgram(): Command;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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"}