node-janitor 1.0.1 → 1.2.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 +118 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +119 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/schedule.d.ts +60 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +139 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/watch.d.ts +57 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +138 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/core/config.d.ts +21 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +103 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/fast-scanner.d.ts +16 -0
- package/dist/core/fast-scanner.d.ts.map +1 -0
- package/dist/core/fast-scanner.js +150 -0
- package/dist/core/fast-scanner.js.map +1 -0
- package/dist/core/scanner.d.ts +6 -0
- package/dist/core/scanner.d.ts.map +1 -1
- package/dist/core/scanner.js +40 -0
- package/dist/core/scanner.js.map +1 -1
- package/dist/tui/live-view.d.ts +13 -0
- package/dist/tui/live-view.d.ts.map +1 -0
- package/dist/tui/live-view.js +243 -0
- package/dist/tui/live-view.js.map +1 -0
- package/dist/utils/git-utils.d.ts +40 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +122 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/i18n.d.ts +60 -0
- package/dist/utils/i18n.d.ts.map +1 -0
- package/dist/utils/i18n.js +302 -0
- package/dist/utils/i18n.js.map +1 -0
- package/package.json +7 -1
package/dist/core/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EACH,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,UAAU,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,MAAM,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface LiveViewOptions {
|
|
2
|
+
path: string;
|
|
3
|
+
depth?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Start the interactive live TUI mode
|
|
7
|
+
*/
|
|
8
|
+
export declare function startLiveView(options: LiveViewOptions): Promise<void>;
|
|
9
|
+
declare const _default: {
|
|
10
|
+
startLiveView: typeof startLiveView;
|
|
11
|
+
};
|
|
12
|
+
export default _default;
|
|
13
|
+
//# sourceMappingURL=live-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-view.d.ts","sourceRoot":"","sources":["../../src/tui/live-view.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0P3E;;;;AAED,wBAEE"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import blessed from 'blessed';
|
|
2
|
+
import { scanNodeModules, calculateTotals } from '../core/scanner.js';
|
|
3
|
+
import { cleanNodeModules } from '../core/cleaner.js';
|
|
4
|
+
import { formatBytes } from '../utils/formatter.js';
|
|
5
|
+
/**
|
|
6
|
+
* Start the interactive live TUI mode
|
|
7
|
+
*/
|
|
8
|
+
export async function startLiveView(options) {
|
|
9
|
+
const screen = blessed.screen({
|
|
10
|
+
smartCSR: true,
|
|
11
|
+
title: 'Node Janitor - Interactive Mode',
|
|
12
|
+
fullUnicode: true,
|
|
13
|
+
});
|
|
14
|
+
let folders = [];
|
|
15
|
+
let currentIndex = 0;
|
|
16
|
+
let isScanning = true;
|
|
17
|
+
let isDeleting = false;
|
|
18
|
+
let totalSize = 0;
|
|
19
|
+
let sortBy = 'size';
|
|
20
|
+
// Header box
|
|
21
|
+
const header = blessed.box({
|
|
22
|
+
top: 0,
|
|
23
|
+
left: 0,
|
|
24
|
+
width: '100%',
|
|
25
|
+
height: 3,
|
|
26
|
+
content: ' 🧹 NODE JANITOR - Interactive Mode',
|
|
27
|
+
tags: true,
|
|
28
|
+
style: {
|
|
29
|
+
fg: 'white',
|
|
30
|
+
bg: 'blue',
|
|
31
|
+
bold: true,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
// Status bar (below header)
|
|
35
|
+
const statusBar = blessed.box({
|
|
36
|
+
top: 3,
|
|
37
|
+
left: 0,
|
|
38
|
+
width: '100%',
|
|
39
|
+
height: 1,
|
|
40
|
+
content: ' Scanning...',
|
|
41
|
+
tags: true,
|
|
42
|
+
style: {
|
|
43
|
+
fg: 'black',
|
|
44
|
+
bg: 'cyan',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
// Main list
|
|
48
|
+
const list = blessed.list({
|
|
49
|
+
top: 4,
|
|
50
|
+
left: 0,
|
|
51
|
+
width: '100%',
|
|
52
|
+
height: '100%-7',
|
|
53
|
+
items: [' Scanning...'],
|
|
54
|
+
tags: true,
|
|
55
|
+
keys: true,
|
|
56
|
+
vi: true,
|
|
57
|
+
mouse: true,
|
|
58
|
+
scrollable: true,
|
|
59
|
+
alwaysScroll: true,
|
|
60
|
+
scrollbar: {
|
|
61
|
+
ch: '█',
|
|
62
|
+
style: {
|
|
63
|
+
bg: 'blue',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
style: {
|
|
67
|
+
fg: 'white',
|
|
68
|
+
bg: 'black',
|
|
69
|
+
selected: {
|
|
70
|
+
fg: 'black',
|
|
71
|
+
bg: 'white',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
// Help bar (bottom)
|
|
76
|
+
const helpBar = blessed.box({
|
|
77
|
+
bottom: 0,
|
|
78
|
+
left: 0,
|
|
79
|
+
width: '100%',
|
|
80
|
+
height: 3,
|
|
81
|
+
content: ' {cyan-fg}↑/↓{/} Navigate {cyan-fg}SPACE{/} Select {cyan-fg}A{/} Select All {cyan-fg}S{/} Sort {cyan-fg}D{/} Delete {cyan-fg}Q/ESC{/} Exit',
|
|
82
|
+
tags: true,
|
|
83
|
+
style: {
|
|
84
|
+
fg: 'white',
|
|
85
|
+
bg: 'gray',
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
// Append elements
|
|
89
|
+
screen.append(header);
|
|
90
|
+
screen.append(statusBar);
|
|
91
|
+
screen.append(list);
|
|
92
|
+
screen.append(helpBar);
|
|
93
|
+
// Update the display
|
|
94
|
+
function updateDisplay() {
|
|
95
|
+
// Update header with path
|
|
96
|
+
header.setContent(` 🧹 NODE JANITOR - Interactive Mode | ${options.path}`);
|
|
97
|
+
// Update status
|
|
98
|
+
const selectedCount = folders.filter(f => f.selected).length;
|
|
99
|
+
const selectedSize = folders
|
|
100
|
+
.filter(f => f.selected)
|
|
101
|
+
.reduce((sum, f) => sum + f.folder.size, 0);
|
|
102
|
+
let status = '';
|
|
103
|
+
if (isScanning) {
|
|
104
|
+
status = ` 🔍 Scanning... Found: ${folders.length} folders | Total: ${formatBytes(totalSize)}`;
|
|
105
|
+
}
|
|
106
|
+
else if (isDeleting) {
|
|
107
|
+
status = ' 🗑️ Deleting selected folders...';
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
status = ` 📊 Found: ${folders.length} folders | Total: ${formatBytes(totalSize)}`;
|
|
111
|
+
if (selectedCount > 0) {
|
|
112
|
+
status += ` | Selected: ${selectedCount} (${formatBytes(selectedSize)})`;
|
|
113
|
+
}
|
|
114
|
+
status += ` | Sort: ${sortBy}`;
|
|
115
|
+
}
|
|
116
|
+
statusBar.setContent(status);
|
|
117
|
+
// Update list items
|
|
118
|
+
const items = folders.map((item, index) => {
|
|
119
|
+
const checkbox = item.selected ? '■' : '□';
|
|
120
|
+
const pointer = index === currentIndex ? '>' : ' ';
|
|
121
|
+
// Color by age
|
|
122
|
+
let ageColor = 'green';
|
|
123
|
+
if (item.folder.ageDays >= 90) {
|
|
124
|
+
ageColor = 'red';
|
|
125
|
+
}
|
|
126
|
+
else if (item.folder.ageDays >= 30) {
|
|
127
|
+
ageColor = 'yellow';
|
|
128
|
+
}
|
|
129
|
+
// Truncate path if needed
|
|
130
|
+
const maxPathLen = screen.width - 40;
|
|
131
|
+
let pathDisplay = item.folder.projectPath;
|
|
132
|
+
if (pathDisplay.length > maxPathLen) {
|
|
133
|
+
pathDisplay = '...' + pathDisplay.slice(-maxPathLen + 3);
|
|
134
|
+
}
|
|
135
|
+
return ` ${pointer} ${checkbox} ${pathDisplay.padEnd(maxPathLen)} {white-fg}${formatBytes(item.folder.size).padStart(10)}{/} {${ageColor}-fg}${String(item.folder.ageDays).padStart(4)}d{/}`;
|
|
136
|
+
});
|
|
137
|
+
if (items.length === 0) {
|
|
138
|
+
list.setItems([' No node_modules folders found']);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
list.setItems(items);
|
|
142
|
+
list.select(currentIndex);
|
|
143
|
+
}
|
|
144
|
+
screen.render();
|
|
145
|
+
}
|
|
146
|
+
// Sort folders
|
|
147
|
+
function sortFolders() {
|
|
148
|
+
folders.sort((a, b) => {
|
|
149
|
+
if (sortBy === 'size') {
|
|
150
|
+
return b.folder.size - a.folder.size;
|
|
151
|
+
}
|
|
152
|
+
return b.folder.ageDays - a.folder.ageDays;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Key bindings
|
|
156
|
+
list.on('keypress', (_ch, key) => {
|
|
157
|
+
if (isDeleting)
|
|
158
|
+
return;
|
|
159
|
+
if (key.name === 'up' || key.name === 'k') {
|
|
160
|
+
currentIndex = Math.max(0, currentIndex - 1);
|
|
161
|
+
updateDisplay();
|
|
162
|
+
}
|
|
163
|
+
else if (key.name === 'down' || key.name === 'j') {
|
|
164
|
+
currentIndex = Math.min(folders.length - 1, currentIndex + 1);
|
|
165
|
+
updateDisplay();
|
|
166
|
+
}
|
|
167
|
+
else if (key.name === 'space') {
|
|
168
|
+
if (folders[currentIndex]) {
|
|
169
|
+
folders[currentIndex].selected = !folders[currentIndex].selected;
|
|
170
|
+
updateDisplay();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
screen.key(['a'], () => {
|
|
175
|
+
if (isDeleting || isScanning)
|
|
176
|
+
return;
|
|
177
|
+
const allSelected = folders.every(f => f.selected);
|
|
178
|
+
folders.forEach(f => f.selected = !allSelected);
|
|
179
|
+
updateDisplay();
|
|
180
|
+
});
|
|
181
|
+
screen.key(['s'], () => {
|
|
182
|
+
if (isDeleting || isScanning)
|
|
183
|
+
return;
|
|
184
|
+
sortBy = sortBy === 'size' ? 'age' : 'size';
|
|
185
|
+
sortFolders();
|
|
186
|
+
updateDisplay();
|
|
187
|
+
});
|
|
188
|
+
screen.key(['d'], async () => {
|
|
189
|
+
if (isDeleting || isScanning)
|
|
190
|
+
return;
|
|
191
|
+
const selected = folders.filter(f => f.selected);
|
|
192
|
+
if (selected.length === 0)
|
|
193
|
+
return;
|
|
194
|
+
isDeleting = true;
|
|
195
|
+
updateDisplay();
|
|
196
|
+
try {
|
|
197
|
+
const foldersToDelete = selected.map(s => s.folder);
|
|
198
|
+
const result = await cleanNodeModules(foldersToDelete, { fast: true });
|
|
199
|
+
// Remove deleted folders from list
|
|
200
|
+
folders = folders.filter(f => !f.selected);
|
|
201
|
+
totalSize = folders.reduce((sum, f) => sum + f.folder.size, 0);
|
|
202
|
+
currentIndex = Math.min(currentIndex, folders.length - 1);
|
|
203
|
+
// Show result
|
|
204
|
+
statusBar.setContent(` ✅ Deleted ${result.deletedCount} folders, freed ${formatBytes(result.freedBytes)}`);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
statusBar.setContent(` ❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
208
|
+
}
|
|
209
|
+
isDeleting = false;
|
|
210
|
+
updateDisplay();
|
|
211
|
+
});
|
|
212
|
+
screen.key(['escape', 'q', 'C-c'], () => {
|
|
213
|
+
screen.destroy();
|
|
214
|
+
process.exit(0);
|
|
215
|
+
});
|
|
216
|
+
list.focus();
|
|
217
|
+
updateDisplay();
|
|
218
|
+
// Start scanning
|
|
219
|
+
try {
|
|
220
|
+
const scannedFolders = await scanNodeModules({
|
|
221
|
+
path: options.path,
|
|
222
|
+
depth: options.depth,
|
|
223
|
+
quick: false,
|
|
224
|
+
});
|
|
225
|
+
folders = scannedFolders.map(folder => ({
|
|
226
|
+
folder,
|
|
227
|
+
selected: false,
|
|
228
|
+
}));
|
|
229
|
+
totalSize = calculateTotals(scannedFolders).totalSize;
|
|
230
|
+
sortFolders();
|
|
231
|
+
isScanning = false;
|
|
232
|
+
updateDisplay();
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
isScanning = false;
|
|
236
|
+
statusBar.setContent(` ❌ Scan error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
237
|
+
screen.render();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
export default {
|
|
241
|
+
startLiveView,
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=live-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-view.js","sourceRoot":"","sources":["../../src/tui/live-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { GitStatus } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check if a directory is inside a git repository
|
|
4
|
+
*/
|
|
5
|
+
export declare function isGitRepo(dir: string): Promise<boolean>;
|
|
6
|
+
/**
|
|
7
|
+
* Get the root of the git repository
|
|
8
|
+
*/
|
|
9
|
+
export declare function getGitRoot(dir: string): Promise<string | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Check if there are uncommitted changes in the repository
|
|
12
|
+
*/
|
|
13
|
+
export declare function isDirty(dir: string): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Get the current branch name
|
|
16
|
+
*/
|
|
17
|
+
export declare function getCurrentBranch(dir: string): Promise<string | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if the current branch is merged into main/master
|
|
20
|
+
*/
|
|
21
|
+
export declare function isMergedToMain(dir: string): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Get full git status for a project directory
|
|
24
|
+
*/
|
|
25
|
+
export declare function getGitStatus(projectPath: string): Promise<GitStatus | undefined>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if node_modules is in gitignore
|
|
28
|
+
*/
|
|
29
|
+
export declare function isNodeModulesIgnored(projectPath: string): Promise<boolean>;
|
|
30
|
+
declare const _default: {
|
|
31
|
+
isGitRepo: typeof isGitRepo;
|
|
32
|
+
getGitRoot: typeof getGitRoot;
|
|
33
|
+
isDirty: typeof isDirty;
|
|
34
|
+
getCurrentBranch: typeof getCurrentBranch;
|
|
35
|
+
isMergedToMain: typeof isMergedToMain;
|
|
36
|
+
getGitStatus: typeof getGitStatus;
|
|
37
|
+
isNodeModulesIgnored: typeof isNodeModulesIgnored;
|
|
38
|
+
};
|
|
39
|
+
export default _default;
|
|
40
|
+
//# sourceMappingURL=git-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO1E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BlE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAgBtF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYhF;;;;;;;;;;AAED,wBAQE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
/**
|
|
6
|
+
* Check if a directory is inside a git repository
|
|
7
|
+
*/
|
|
8
|
+
export async function isGitRepo(dir) {
|
|
9
|
+
try {
|
|
10
|
+
await execAsync('git rev-parse --is-inside-work-tree', { cwd: dir });
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the root of the git repository
|
|
19
|
+
*/
|
|
20
|
+
export async function getGitRoot(dir) {
|
|
21
|
+
try {
|
|
22
|
+
const { stdout } = await execAsync('git rev-parse --show-toplevel', { cwd: dir });
|
|
23
|
+
return stdout.trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if there are uncommitted changes in the repository
|
|
31
|
+
*/
|
|
32
|
+
export async function isDirty(dir) {
|
|
33
|
+
try {
|
|
34
|
+
const { stdout } = await execAsync('git status --porcelain', { cwd: dir });
|
|
35
|
+
return stdout.trim().length > 0;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get the current branch name
|
|
43
|
+
*/
|
|
44
|
+
export async function getCurrentBranch(dir) {
|
|
45
|
+
try {
|
|
46
|
+
const { stdout } = await execAsync('git rev-parse --abbrev-ref HEAD', { cwd: dir });
|
|
47
|
+
return stdout.trim();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if the current branch is merged into main/master
|
|
55
|
+
*/
|
|
56
|
+
export async function isMergedToMain(dir) {
|
|
57
|
+
try {
|
|
58
|
+
const branch = await getCurrentBranch(dir);
|
|
59
|
+
if (!branch || branch === 'main' || branch === 'master') {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
// Try to check if merged into main or master
|
|
63
|
+
const mainBranches = ['main', 'master'];
|
|
64
|
+
for (const mainBranch of mainBranches) {
|
|
65
|
+
try {
|
|
66
|
+
const { stdout } = await execAsync(`git branch --merged ${mainBranch} 2>/dev/null | grep -E "^\\s*${branch}$"`, { cwd: dir });
|
|
67
|
+
if (stdout.trim()) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get full git status for a project directory
|
|
83
|
+
*/
|
|
84
|
+
export async function getGitStatus(projectPath) {
|
|
85
|
+
const isRepo = await isGitRepo(projectPath);
|
|
86
|
+
if (!isRepo) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
const [dirty, branch] = await Promise.all([
|
|
90
|
+
isDirty(projectPath),
|
|
91
|
+
getCurrentBranch(projectPath),
|
|
92
|
+
]);
|
|
93
|
+
return {
|
|
94
|
+
isGitRepo: true,
|
|
95
|
+
isDirty: dirty,
|
|
96
|
+
branch: branch || undefined,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if node_modules is in gitignore
|
|
101
|
+
*/
|
|
102
|
+
export async function isNodeModulesIgnored(projectPath) {
|
|
103
|
+
try {
|
|
104
|
+
const nodeModulesPath = path.join(projectPath, 'node_modules');
|
|
105
|
+
const { stdout } = await execAsync(`git check-ignore -q "${nodeModulesPath}" && echo "ignored" || echo "tracked"`, { cwd: projectPath });
|
|
106
|
+
return stdout.trim() === 'ignored';
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// If git command fails, assume it's ignored (safe default)
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export default {
|
|
114
|
+
isGitRepo,
|
|
115
|
+
getGitRoot,
|
|
116
|
+
isDirty,
|
|
117
|
+
getCurrentBranch,
|
|
118
|
+
isMergedToMain,
|
|
119
|
+
getGitStatus,
|
|
120
|
+
isNodeModulesIgnored,
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=git-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization (i18n) support for node-janitor
|
|
3
|
+
*/
|
|
4
|
+
export type Language = 'en' | 'vi' | 'zh' | 'ja' | 'ko' | 'es' | 'fr' | 'de';
|
|
5
|
+
export interface Translations {
|
|
6
|
+
found: string;
|
|
7
|
+
folders: string;
|
|
8
|
+
scanning: string;
|
|
9
|
+
noFolders: string;
|
|
10
|
+
cancelled: string;
|
|
11
|
+
goodbye: string;
|
|
12
|
+
deleting: string;
|
|
13
|
+
deleted: string;
|
|
14
|
+
freed: string;
|
|
15
|
+
cleaning: string;
|
|
16
|
+
deepCleaning: string;
|
|
17
|
+
processed: string;
|
|
18
|
+
removed: string;
|
|
19
|
+
files: string;
|
|
20
|
+
scanPath: string;
|
|
21
|
+
ageFilter: string;
|
|
22
|
+
confirmDelete: string;
|
|
23
|
+
viewList: string;
|
|
24
|
+
selectAction: string;
|
|
25
|
+
report: string;
|
|
26
|
+
totalFolders: string;
|
|
27
|
+
totalSize: string;
|
|
28
|
+
oldest: string;
|
|
29
|
+
newest: string;
|
|
30
|
+
breakdown: string;
|
|
31
|
+
recommendations: string;
|
|
32
|
+
scanFailed: string;
|
|
33
|
+
errors: string;
|
|
34
|
+
dryRunMode: string;
|
|
35
|
+
backupSaved: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Set the current language
|
|
39
|
+
*/
|
|
40
|
+
export declare function setLanguage(lang: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get a translated string
|
|
43
|
+
*/
|
|
44
|
+
export declare function t(key: keyof Translations): string;
|
|
45
|
+
/**
|
|
46
|
+
* Get all available languages
|
|
47
|
+
*/
|
|
48
|
+
export declare function getAvailableLanguages(): Language[];
|
|
49
|
+
/**
|
|
50
|
+
* Get current language
|
|
51
|
+
*/
|
|
52
|
+
export declare function getCurrentLanguage(): Language;
|
|
53
|
+
declare const _default: {
|
|
54
|
+
setLanguage: typeof setLanguage;
|
|
55
|
+
t: typeof t;
|
|
56
|
+
getAvailableLanguages: typeof getAvailableLanguages;
|
|
57
|
+
getCurrentLanguage: typeof getCurrentLanguage;
|
|
58
|
+
};
|
|
59
|
+
export default _default;
|
|
60
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7E,MAAM,WAAW,YAAY;IAEzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAGhB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IAGd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IAGrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IAGxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IAGf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AA+SD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU9C;AAED;;GAEG;AACH,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,YAAY,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,EAAE,CAElD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,CAE7C;;;;;;;AAED,wBAKE"}
|