appclean 1.8.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/.github/workflows/publish.yml +41 -0
- package/.github/workflows/test.yml +37 -0
- package/ACTION_CHECKLIST.md +342 -0
- package/APPCLEAN_SUMMARY.md +309 -0
- package/CHANGELOG.md +205 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CODE_REVIEW_REPORT.md +447 -0
- package/COMMUNITY_POSTS.md +307 -0
- package/CONTRIBUTING.md +121 -0
- package/DEPLOYMENT_GUIDE.md +345 -0
- package/DEPLOYMENT_STATUS.md +182 -0
- package/EXECUTIVE_REPORT.md +393 -0
- package/GITHUB_OPTIMIZATION.md +383 -0
- package/INDEX.md +165 -0
- package/LICENSE +21 -0
- package/MARKETING_SUMMARY.md +352 -0
- package/NPM_PACKAGE_OPTIMIZATION.md +281 -0
- package/NPM_PUBLISH.md +116 -0
- package/PROJECT_SUMMARY.txt +249 -0
- package/QUICKSTART.md +219 -0
- package/README.md +548 -0
- package/SECURITY.md +104 -0
- package/SETUP_GITHUB.md +237 -0
- package/TESTING_SUMMARY.md +379 -0
- package/dist/core/appUpdateChecker.d.ts +23 -0
- package/dist/core/appUpdateChecker.d.ts.map +1 -0
- package/dist/core/appUpdateChecker.js +159 -0
- package/dist/core/appUpdateChecker.js.map +1 -0
- package/dist/core/detector.d.ts +13 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +99 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/duplicateFileFinder.d.ts +14 -0
- package/dist/core/duplicateFileFinder.d.ts.map +1 -0
- package/dist/core/duplicateFileFinder.js +80 -0
- package/dist/core/duplicateFileFinder.js.map +1 -0
- package/dist/core/orphanedDependencyDetector.d.ts +19 -0
- package/dist/core/orphanedDependencyDetector.d.ts.map +1 -0
- package/dist/core/orphanedDependencyDetector.js +148 -0
- package/dist/core/orphanedDependencyDetector.js.map +1 -0
- package/dist/core/performanceOptimizer.d.ts +37 -0
- package/dist/core/performanceOptimizer.d.ts.map +1 -0
- package/dist/core/performanceOptimizer.js +128 -0
- package/dist/core/performanceOptimizer.js.map +1 -0
- package/dist/core/permissionHandler.d.ts +9 -0
- package/dist/core/permissionHandler.d.ts.map +1 -0
- package/dist/core/permissionHandler.js +89 -0
- package/dist/core/permissionHandler.js.map +1 -0
- package/dist/core/pluginSystem.d.ts +39 -0
- package/dist/core/pluginSystem.d.ts.map +1 -0
- package/dist/core/pluginSystem.js +120 -0
- package/dist/core/pluginSystem.js.map +1 -0
- package/dist/core/removalRecorder.d.ts +32 -0
- package/dist/core/removalRecorder.d.ts.map +1 -0
- package/dist/core/removalRecorder.js +79 -0
- package/dist/core/removalRecorder.js.map +1 -0
- package/dist/core/remover.d.ts +15 -0
- package/dist/core/remover.d.ts.map +1 -0
- package/dist/core/remover.js +225 -0
- package/dist/core/remover.js.map +1 -0
- package/dist/core/reportGenerator.d.ts +9 -0
- package/dist/core/reportGenerator.d.ts.map +1 -0
- package/dist/core/reportGenerator.js +328 -0
- package/dist/core/reportGenerator.js.map +1 -0
- package/dist/core/scheduledCleanup.d.ts +38 -0
- package/dist/core/scheduledCleanup.d.ts.map +1 -0
- package/dist/core/scheduledCleanup.js +127 -0
- package/dist/core/scheduledCleanup.js.map +1 -0
- package/dist/core/serviceFileDetector.d.ts +18 -0
- package/dist/core/serviceFileDetector.d.ts.map +1 -0
- package/dist/core/serviceFileDetector.js +136 -0
- package/dist/core/serviceFileDetector.js.map +1 -0
- package/dist/core/verificationModule.d.ts +14 -0
- package/dist/core/verificationModule.d.ts.map +1 -0
- package/dist/core/verificationModule.js +102 -0
- package/dist/core/verificationModule.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +333 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/brewManager.d.ts +10 -0
- package/dist/managers/brewManager.d.ts.map +1 -0
- package/dist/managers/brewManager.js +130 -0
- package/dist/managers/brewManager.js.map +1 -0
- package/dist/managers/customManager.d.ts +8 -0
- package/dist/managers/customManager.d.ts.map +1 -0
- package/dist/managers/customManager.js +139 -0
- package/dist/managers/customManager.js.map +1 -0
- package/dist/managers/linuxManager.d.ts +10 -0
- package/dist/managers/linuxManager.d.ts.map +1 -0
- package/dist/managers/linuxManager.js +191 -0
- package/dist/managers/linuxManager.js.map +1 -0
- package/dist/managers/npmManager.d.ts +10 -0
- package/dist/managers/npmManager.d.ts.map +1 -0
- package/dist/managers/npmManager.js +119 -0
- package/dist/managers/npmManager.js.map +1 -0
- package/dist/types/index.d.ts +44 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/guiServer.d.ts +10 -0
- package/dist/ui/guiServer.d.ts.map +1 -0
- package/dist/ui/guiServer.js +134 -0
- package/dist/ui/guiServer.js.map +1 -0
- package/dist/ui/menu.d.ts +6 -0
- package/dist/ui/menu.d.ts.map +1 -0
- package/dist/ui/menu.js +93 -0
- package/dist/ui/menu.js.map +1 -0
- package/dist/ui/prompts.d.ts +13 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +161 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/utils/filesystem.d.ts +13 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +152 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/platform.d.ts +9 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +75 -0
- package/dist/utils/platform.js.map +1 -0
- package/jest.config.js +20 -0
- package/logo.svg +60 -0
- package/package.json +55 -0
- package/setup-github.sh +125 -0
- package/src/core/appUpdateChecker.ts +220 -0
- package/src/core/detector.ts +133 -0
- package/src/core/duplicateFileFinder.ts +113 -0
- package/src/core/orphanedDependencyDetector.ts +195 -0
- package/src/core/performanceOptimizer.ts +209 -0
- package/src/core/permissionHandler.ts +121 -0
- package/src/core/pluginSystem.ts +194 -0
- package/src/core/removalRecorder.ts +146 -0
- package/src/core/remover.ts +280 -0
- package/src/core/reportGenerator.ts +354 -0
- package/src/core/scheduledCleanup.ts +204 -0
- package/src/core/serviceFileDetector.ts +181 -0
- package/src/core/verificationModule.ts +140 -0
- package/src/index.ts +449 -0
- package/src/managers/brewManager.ts +149 -0
- package/src/managers/customManager.ts +167 -0
- package/src/managers/linuxManager.ts +210 -0
- package/src/managers/npmManager.ts +137 -0
- package/src/types/index.ts +59 -0
- package/src/ui/guiServer.ts +155 -0
- package/src/ui/menu.ts +100 -0
- package/src/ui/prompts.ts +177 -0
- package/src/utils/filesystem.ts +145 -0
- package/src/utils/logger.ts +48 -0
- package/src/utils/platform.ts +75 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppUpdateChecker = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
class AppUpdateChecker {
|
|
7
|
+
async checkForUpdate(app) {
|
|
8
|
+
logger_1.Logger.info(`Checking for updates: ${app.name}...`);
|
|
9
|
+
const info = {
|
|
10
|
+
appName: app.name,
|
|
11
|
+
currentVersion: app.version,
|
|
12
|
+
latestVersion: app.version,
|
|
13
|
+
hasUpdate: false,
|
|
14
|
+
};
|
|
15
|
+
try {
|
|
16
|
+
switch (app.installMethod) {
|
|
17
|
+
case 'npm':
|
|
18
|
+
await this.checkNpmUpdate(info);
|
|
19
|
+
break;
|
|
20
|
+
case 'yarn':
|
|
21
|
+
await this.checkYarnUpdate(info);
|
|
22
|
+
break;
|
|
23
|
+
case 'pnpm':
|
|
24
|
+
await this.checkPnpmUpdate(info);
|
|
25
|
+
break;
|
|
26
|
+
case 'brew':
|
|
27
|
+
await this.checkBrewUpdate(info);
|
|
28
|
+
break;
|
|
29
|
+
case 'apt':
|
|
30
|
+
await this.checkAptUpdate(info);
|
|
31
|
+
break;
|
|
32
|
+
case 'yum':
|
|
33
|
+
case 'dnf':
|
|
34
|
+
await this.checkYumUpdate(info);
|
|
35
|
+
break;
|
|
36
|
+
default:
|
|
37
|
+
logger_1.Logger.warn(`No update checker available for ${app.installMethod}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
logger_1.Logger.debug(`Update check failed for ${app.name}: ${error.message}`);
|
|
42
|
+
}
|
|
43
|
+
return info;
|
|
44
|
+
}
|
|
45
|
+
async checkForUpdates(apps) {
|
|
46
|
+
const updates = [];
|
|
47
|
+
for (const app of apps) {
|
|
48
|
+
const update = await this.checkForUpdate(app);
|
|
49
|
+
updates.push(update);
|
|
50
|
+
}
|
|
51
|
+
return updates;
|
|
52
|
+
}
|
|
53
|
+
async checkNpmUpdate(info) {
|
|
54
|
+
try {
|
|
55
|
+
const output = (0, child_process_1.execSync)(`npm view ${info.appName} version 2>/dev/null`).toString().trim();
|
|
56
|
+
if (output) {
|
|
57
|
+
info.latestVersion = output;
|
|
58
|
+
info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
|
|
59
|
+
info.installCommand = `npm install -g ${info.appName}@latest`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async checkYarnUpdate(info) {
|
|
66
|
+
try {
|
|
67
|
+
const output = (0, child_process_1.execSync)(`yarn info ${info.appName} version 2>/dev/null`).toString().trim();
|
|
68
|
+
if (output) {
|
|
69
|
+
info.latestVersion = output;
|
|
70
|
+
info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
|
|
71
|
+
info.installCommand = `yarn global upgrade ${info.appName}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async checkPnpmUpdate(info) {
|
|
78
|
+
try {
|
|
79
|
+
const output = (0, child_process_1.execSync)(`pnpm view ${info.appName} version 2>/dev/null`).toString().trim();
|
|
80
|
+
if (output) {
|
|
81
|
+
info.latestVersion = output;
|
|
82
|
+
info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
|
|
83
|
+
info.installCommand = `pnpm add -g ${info.appName}@latest`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async checkBrewUpdate(info) {
|
|
90
|
+
try {
|
|
91
|
+
const output = (0, child_process_1.execSync)(`brew info ${info.appName} 2>/dev/null | grep "stable"`).toString();
|
|
92
|
+
const match = output.match(/(\d+\.\d+\.\d+)/);
|
|
93
|
+
if (match) {
|
|
94
|
+
info.latestVersion = match[1];
|
|
95
|
+
info.hasUpdate = this.compareVersions(info.currentVersion, match[1]) < 0;
|
|
96
|
+
info.installCommand = `brew upgrade ${info.appName}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async checkAptUpdate(info) {
|
|
103
|
+
try {
|
|
104
|
+
const output = (0, child_process_1.execSync)(`apt-cache policy ${info.appName} 2>/dev/null`).toString();
|
|
105
|
+
const match = output.match(/Candidate: (\S+)/);
|
|
106
|
+
if (match) {
|
|
107
|
+
info.latestVersion = match[1];
|
|
108
|
+
info.hasUpdate = this.compareVersions(info.currentVersion, match[1]) < 0;
|
|
109
|
+
info.installCommand = `sudo apt update && sudo apt upgrade ${info.appName}`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async checkYumUpdate(info) {
|
|
116
|
+
try {
|
|
117
|
+
const output = (0, child_process_1.execSync)(`yum info ${info.appName} 2>/dev/null`).toString();
|
|
118
|
+
const match = output.match(/Version\s+:\s+(\S+)/);
|
|
119
|
+
if (match) {
|
|
120
|
+
info.latestVersion = match[1];
|
|
121
|
+
info.hasUpdate = this.compareVersions(info.currentVersion, match[1]) < 0;
|
|
122
|
+
info.installCommand = `sudo yum update ${info.appName}`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
compareVersions(v1, v2) {
|
|
129
|
+
const parts1 = v1.split('.').map((p) => parseInt(p, 10));
|
|
130
|
+
const parts2 = v2.split('.').map((p) => parseInt(p, 10));
|
|
131
|
+
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
132
|
+
const p1 = parts1[i] || 0;
|
|
133
|
+
const p2 = parts2[i] || 0;
|
|
134
|
+
if (p1 < p2)
|
|
135
|
+
return -1;
|
|
136
|
+
if (p1 > p2)
|
|
137
|
+
return 1;
|
|
138
|
+
}
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
getUpdateSummary(updates) {
|
|
142
|
+
const available = updates.filter((u) => u.hasUpdate);
|
|
143
|
+
if (available.length === 0) {
|
|
144
|
+
return 'All applications are up to date!';
|
|
145
|
+
}
|
|
146
|
+
let summary = `Found ${available.length} update(s) available:\n\n`;
|
|
147
|
+
available.forEach((update) => {
|
|
148
|
+
summary += `📦 ${update.appName}\n`;
|
|
149
|
+
summary += ` Current: ${update.currentVersion} → Latest: ${update.latestVersion}\n`;
|
|
150
|
+
if (update.installCommand) {
|
|
151
|
+
summary += ` Install: ${update.installCommand}\n`;
|
|
152
|
+
}
|
|
153
|
+
summary += '\n';
|
|
154
|
+
});
|
|
155
|
+
return summary;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
exports.AppUpdateChecker = AppUpdateChecker;
|
|
159
|
+
//# sourceMappingURL=appUpdateChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appUpdateChecker.js","sourceRoot":"","sources":["../../src/core/appUpdateChecker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { InstalledApp, ArtifactPath, SearchOptions } from '../types';
|
|
2
|
+
export declare class Detector {
|
|
3
|
+
private npmManager;
|
|
4
|
+
private brewManager?;
|
|
5
|
+
private linuxManager?;
|
|
6
|
+
private customManager;
|
|
7
|
+
constructor();
|
|
8
|
+
detectAllApps(): Promise<InstalledApp[]>;
|
|
9
|
+
searchApps(options: SearchOptions): Promise<InstalledApp[]>;
|
|
10
|
+
findArtifacts(appName: string, installMethod: string): Promise<ArtifactPath[]>;
|
|
11
|
+
estimateSpaceFreed(appName: string, installMethod: string): Promise<number>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGrE,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,aAAa,CAAgB;;IAe/B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAgCxC,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqC3D,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgC9E,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAIlF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Detector = void 0;
|
|
4
|
+
const npmManager_1 = require("../managers/npmManager");
|
|
5
|
+
const brewManager_1 = require("../managers/brewManager");
|
|
6
|
+
const linuxManager_1 = require("../managers/linuxManager");
|
|
7
|
+
const customManager_1 = require("../managers/customManager");
|
|
8
|
+
const platform_1 = require("../utils/platform");
|
|
9
|
+
const filesystem_1 = require("../utils/filesystem");
|
|
10
|
+
class Detector {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.npmManager = new npmManager_1.NpmManager();
|
|
13
|
+
this.customManager = new customManager_1.CustomManager();
|
|
14
|
+
if ((0, platform_1.isMacOS)()) {
|
|
15
|
+
this.brewManager = new brewManager_1.BrewManager();
|
|
16
|
+
}
|
|
17
|
+
if ((0, platform_1.isLinux)()) {
|
|
18
|
+
this.linuxManager = new linuxManager_1.LinuxManager();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async detectAllApps() {
|
|
22
|
+
const allApps = [];
|
|
23
|
+
const npmApps = await this.npmManager.getInstalledPackages();
|
|
24
|
+
allApps.push(...npmApps);
|
|
25
|
+
if (this.brewManager) {
|
|
26
|
+
const brewApps = await this.brewManager.getInstalledPackages();
|
|
27
|
+
allApps.push(...brewApps);
|
|
28
|
+
}
|
|
29
|
+
if (this.linuxManager) {
|
|
30
|
+
const linuxApps = await this.linuxManager.getInstalledPackages();
|
|
31
|
+
allApps.push(...linuxApps);
|
|
32
|
+
}
|
|
33
|
+
const customApps = await this.customManager.findCustomInstalledApps();
|
|
34
|
+
allApps.push(...customApps);
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
return allApps.filter((app) => {
|
|
37
|
+
if (seen.has(app.name))
|
|
38
|
+
return false;
|
|
39
|
+
seen.add(app.name);
|
|
40
|
+
return true;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async searchApps(options) {
|
|
44
|
+
const allApps = await this.detectAllApps();
|
|
45
|
+
let filtered = allApps;
|
|
46
|
+
if (options.query) {
|
|
47
|
+
const query = options.query.toLowerCase();
|
|
48
|
+
filtered = filtered.filter((app) => app.name.toLowerCase().includes(query));
|
|
49
|
+
}
|
|
50
|
+
if (options.installMethod) {
|
|
51
|
+
filtered = filtered.filter((app) => app.installMethod === options.installMethod);
|
|
52
|
+
}
|
|
53
|
+
switch (options.sortBy) {
|
|
54
|
+
case 'name':
|
|
55
|
+
filtered.sort((a, b) => a.name.localeCompare(b.name));
|
|
56
|
+
break;
|
|
57
|
+
case 'date':
|
|
58
|
+
filtered.sort((a, b) => (b.installedDate?.getTime() || 0) - (a.installedDate?.getTime() || 0));
|
|
59
|
+
break;
|
|
60
|
+
case 'size':
|
|
61
|
+
filtered.sort((a, b) => (b.size || 0) - (a.size || 0));
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
return filtered;
|
|
65
|
+
}
|
|
66
|
+
async findArtifacts(appName, installMethod) {
|
|
67
|
+
const artifacts = [];
|
|
68
|
+
switch (installMethod) {
|
|
69
|
+
case 'npm':
|
|
70
|
+
artifacts.push(...(await this.npmManager.findArtifacts(appName)));
|
|
71
|
+
break;
|
|
72
|
+
case 'brew':
|
|
73
|
+
if (this.brewManager) {
|
|
74
|
+
artifacts.push(...(await this.brewManager.findArtifacts(appName)));
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
case 'apt':
|
|
78
|
+
case 'yum':
|
|
79
|
+
case 'dnf':
|
|
80
|
+
if (this.linuxManager) {
|
|
81
|
+
artifacts.push(...(await this.linuxManager.findArtifacts(appName)));
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case 'custom':
|
|
85
|
+
artifacts.push(...(await this.customManager.findArtifacts(appName)));
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
for (const artifact of artifacts) {
|
|
89
|
+
artifact.size = (0, filesystem_1.getFileSize)(artifact.path);
|
|
90
|
+
}
|
|
91
|
+
return artifacts;
|
|
92
|
+
}
|
|
93
|
+
async estimateSpaceFreed(appName, installMethod) {
|
|
94
|
+
const artifacts = await this.findArtifacts(appName, installMethod);
|
|
95
|
+
return artifacts.reduce((total, artifact) => total + artifact.size, 0);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.Detector = Detector;
|
|
99
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface DuplicateFile {
|
|
2
|
+
hash: string;
|
|
3
|
+
size: number;
|
|
4
|
+
paths: string[];
|
|
5
|
+
potentialSavings: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class DuplicateFileFinder {
|
|
8
|
+
findDuplicates(directories: string[]): Promise<DuplicateFile[]>;
|
|
9
|
+
private calculateHash;
|
|
10
|
+
private scanDirectory;
|
|
11
|
+
getSummary(duplicates: DuplicateFile[]): string;
|
|
12
|
+
private formatBytes;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=duplicateFileFinder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicateFileFinder.d.ts","sourceRoot":"","sources":["../../src/core/duplicateFileFinder.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,mBAAmB;IAIxB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YA4BvD,aAAa;YAcb,aAAa;IA+B3B,UAAU,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM;IAU/C,OAAO,CAAC,WAAW;CAOpB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DuplicateFileFinder = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
class DuplicateFileFinder {
|
|
12
|
+
async findDuplicates(directories) {
|
|
13
|
+
logger_1.Logger.info('Scanning for duplicate files...');
|
|
14
|
+
const fileHashes = new Map();
|
|
15
|
+
for (const directory of directories) {
|
|
16
|
+
await this.scanDirectory(directory, fileHashes);
|
|
17
|
+
}
|
|
18
|
+
const duplicates = [];
|
|
19
|
+
for (const [hash, data] of fileHashes.entries()) {
|
|
20
|
+
if (data.paths.length > 1) {
|
|
21
|
+
duplicates.push({
|
|
22
|
+
hash,
|
|
23
|
+
size: data.size,
|
|
24
|
+
paths: data.paths,
|
|
25
|
+
potentialSavings: data.size * (data.paths.length - 1),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return duplicates.sort((a, b) => b.potentialSavings - a.potentialSavings);
|
|
30
|
+
}
|
|
31
|
+
async calculateHash(filePath) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const hash = crypto_1.default.createHash('sha256');
|
|
34
|
+
const stream = fs_1.default.createReadStream(filePath);
|
|
35
|
+
stream.on('data', (data) => hash.update(data));
|
|
36
|
+
stream.on('end', () => resolve(hash.digest('hex')));
|
|
37
|
+
stream.on('error', reject);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async scanDirectory(directory, fileHashes) {
|
|
41
|
+
try {
|
|
42
|
+
const entries = fs_1.default.readdirSync(directory);
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
const fullPath = path_1.default.join(directory, entry);
|
|
45
|
+
const stats = fs_1.default.statSync(fullPath);
|
|
46
|
+
if (stats.isDirectory()) {
|
|
47
|
+
await this.scanDirectory(fullPath, fileHashes);
|
|
48
|
+
}
|
|
49
|
+
else if (stats.isFile()) {
|
|
50
|
+
const hash = await this.calculateHash(fullPath);
|
|
51
|
+
if (!fileHashes.has(hash)) {
|
|
52
|
+
fileHashes.set(hash, { size: stats.size, paths: [] });
|
|
53
|
+
}
|
|
54
|
+
fileHashes.get(hash).paths.push(fullPath);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger_1.Logger.debug(`Error scanning directory ${directory}: ${error.message}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
getSummary(duplicates) {
|
|
63
|
+
const totalSize = duplicates.reduce((sum, d) => sum + d.potentialSavings, 0);
|
|
64
|
+
const totalFiles = duplicates.reduce((sum, d) => sum + (d.paths.length - 1), 0);
|
|
65
|
+
return `
|
|
66
|
+
Found ${duplicates.length} duplicate groups with ${totalFiles} duplicate files
|
|
67
|
+
Potential space savings: ${this.formatBytes(totalSize)}
|
|
68
|
+
`;
|
|
69
|
+
}
|
|
70
|
+
formatBytes(bytes) {
|
|
71
|
+
if (bytes === 0)
|
|
72
|
+
return '0 B';
|
|
73
|
+
const k = 1024;
|
|
74
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
75
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
76
|
+
return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.DuplicateFileFinder = DuplicateFileFinder;
|
|
80
|
+
//# sourceMappingURL=duplicateFileFinder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicateFileFinder.js","sourceRoot":"","sources":["../../src/core/duplicateFileFinder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface OrphanedPackage {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
location: string;
|
|
5
|
+
size: number;
|
|
6
|
+
lastModified: Date;
|
|
7
|
+
isOrphaned: boolean;
|
|
8
|
+
dependedBy: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class OrphanedDependencyDetector {
|
|
11
|
+
detectOrphanedPackages(): Promise<OrphanedPackage[]>;
|
|
12
|
+
private getGlobalPackages;
|
|
13
|
+
private getProjectPackages;
|
|
14
|
+
private findPackageJsonFiles;
|
|
15
|
+
private checkDependencies;
|
|
16
|
+
private findPackageLocation;
|
|
17
|
+
private getDirectorySize;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=orphanedDependencyDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphanedDependencyDetector.d.ts","sourceRoot":"","sources":["../../src/core/orphanedDependencyDetector.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,0BAA0B;IAI/B,sBAAsB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAqC1D,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,oBAAoB;IAoC5B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,gBAAgB;CAqBzB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OrphanedDependencyDetector = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const platform_1 = require("../utils/platform");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
class OrphanedDependencyDetector {
|
|
13
|
+
async detectOrphanedPackages() {
|
|
14
|
+
logger_1.Logger.info('Scanning for orphaned dependencies...');
|
|
15
|
+
try {
|
|
16
|
+
const globalPackages = this.getGlobalPackages();
|
|
17
|
+
const projectPackages = this.getProjectPackages();
|
|
18
|
+
const orphaned = [];
|
|
19
|
+
for (const pkg of globalPackages) {
|
|
20
|
+
const dependedBy = this.checkDependencies(pkg.name, projectPackages);
|
|
21
|
+
if (dependedBy.length === 0) {
|
|
22
|
+
orphaned.push({
|
|
23
|
+
...pkg,
|
|
24
|
+
isOrphaned: true,
|
|
25
|
+
dependedBy: [],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
orphaned.push({
|
|
30
|
+
...pkg,
|
|
31
|
+
isOrphaned: false,
|
|
32
|
+
dependedBy,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return orphaned.filter((p) => p.isOrphaned);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
logger_1.Logger.error(`Error detecting orphaned packages: ${error.message}`);
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
getGlobalPackages() {
|
|
44
|
+
try {
|
|
45
|
+
const output = (0, child_process_1.execSync)('npm list -g --json 2>/dev/null || echo "{}"').toString();
|
|
46
|
+
const data = JSON.parse(output);
|
|
47
|
+
const packages = [];
|
|
48
|
+
if (data.dependencies) {
|
|
49
|
+
for (const [name, pkg] of Object.entries(data.dependencies)) {
|
|
50
|
+
const location = this.findPackageLocation(name);
|
|
51
|
+
if (location) {
|
|
52
|
+
const stats = fs_1.default.statSync(location);
|
|
53
|
+
packages.push({
|
|
54
|
+
name,
|
|
55
|
+
version: pkg.version || 'unknown',
|
|
56
|
+
location,
|
|
57
|
+
size: this.getDirectorySize(location),
|
|
58
|
+
lastModified: stats.mtime,
|
|
59
|
+
isOrphaned: false,
|
|
60
|
+
dependedBy: [],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return packages;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
getProjectPackages() {
|
|
72
|
+
const packages = new Set();
|
|
73
|
+
try {
|
|
74
|
+
const home = (0, platform_1.getHomeDir)();
|
|
75
|
+
const searchPaths = [home, '/usr/local'];
|
|
76
|
+
for (const searchPath of searchPaths) {
|
|
77
|
+
this.findPackageJsonFiles(searchPath, packages);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
}
|
|
82
|
+
return packages;
|
|
83
|
+
}
|
|
84
|
+
findPackageJsonFiles(dir, packages, depth = 0) {
|
|
85
|
+
if (depth > 3)
|
|
86
|
+
return;
|
|
87
|
+
try {
|
|
88
|
+
const entries = fs_1.default.readdirSync(dir);
|
|
89
|
+
for (const entry of entries) {
|
|
90
|
+
if (entry === 'package.json') {
|
|
91
|
+
try {
|
|
92
|
+
const content = fs_1.default.readFileSync(path_1.default.join(dir, entry), 'utf-8');
|
|
93
|
+
const json = JSON.parse(content);
|
|
94
|
+
if (json.dependencies) {
|
|
95
|
+
Object.keys(json.dependencies).forEach((dep) => packages.add(dep));
|
|
96
|
+
}
|
|
97
|
+
if (json.devDependencies) {
|
|
98
|
+
Object.keys(json.devDependencies).forEach((dep) => packages.add(dep));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const fullPath = path_1.default.join(dir, entry);
|
|
105
|
+
if (fs_1.default.statSync(fullPath).isDirectory() && !entry.startsWith('.')) {
|
|
106
|
+
this.findPackageJsonFiles(fullPath, packages, depth + 1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
checkDependencies(packageName, projectPackages) {
|
|
114
|
+
return Array.from(projectPackages).filter((p) => p === packageName);
|
|
115
|
+
}
|
|
116
|
+
findPackageLocation(packageName) {
|
|
117
|
+
try {
|
|
118
|
+
const result = (0, child_process_1.execSync)(`npm list -g ${packageName} --json 2>/dev/null || echo "{}"`).toString();
|
|
119
|
+
const data = JSON.parse(result);
|
|
120
|
+
return data.dependencies?.[packageName]?.resolved || null;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
getDirectorySize(dir) {
|
|
127
|
+
try {
|
|
128
|
+
let size = 0;
|
|
129
|
+
const entries = fs_1.default.readdirSync(dir);
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const fullPath = path_1.default.join(dir, entry);
|
|
132
|
+
const stats = fs_1.default.statSync(fullPath);
|
|
133
|
+
if (stats.isDirectory()) {
|
|
134
|
+
size += this.getDirectorySize(fullPath);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
size += stats.size;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return size;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.OrphanedDependencyDetector = OrphanedDependencyDetector;
|
|
148
|
+
//# sourceMappingURL=orphanedDependencyDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphanedDependencyDetector.js","sourceRoot":"","sources":["../../src/core/orphanedDependencyDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface ScanMetrics {
|
|
2
|
+
startTime: Date;
|
|
3
|
+
endTime?: Date;
|
|
4
|
+
filesScanned: number;
|
|
5
|
+
directoriesScanned: number;
|
|
6
|
+
totalSize: number;
|
|
7
|
+
duration?: number;
|
|
8
|
+
averageFileSize: number;
|
|
9
|
+
scanSpeed: number;
|
|
10
|
+
}
|
|
11
|
+
export interface OptimizationSettings {
|
|
12
|
+
parallelScanThreads: number;
|
|
13
|
+
cacheResults: boolean;
|
|
14
|
+
skipSymlinks: boolean;
|
|
15
|
+
maxDirectoryDepth: number;
|
|
16
|
+
excludePatterns: string[];
|
|
17
|
+
indexSystemDirectories: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class PerformanceOptimizer {
|
|
20
|
+
private metrics;
|
|
21
|
+
private cache;
|
|
22
|
+
private settings;
|
|
23
|
+
constructor(settings?: Partial<OptimizationSettings>);
|
|
24
|
+
startMetrics(scanId: string): ScanMetrics;
|
|
25
|
+
endMetrics(scanId: string): ScanMetrics | null;
|
|
26
|
+
getMetrics(scanId: string): ScanMetrics | null;
|
|
27
|
+
updateMetrics(scanId: string, data: Partial<ScanMetrics>): void;
|
|
28
|
+
cacheResult(key: string, value: any, ttl?: number): void;
|
|
29
|
+
getCachedResult(key: string): any | null;
|
|
30
|
+
clearCache(): void;
|
|
31
|
+
updateSettings(settings: Partial<OptimizationSettings>): void;
|
|
32
|
+
getSettings(): OptimizationSettings;
|
|
33
|
+
shouldScanPath(path: string, depth: number): boolean;
|
|
34
|
+
getRecommendations(metrics: ScanMetrics): string[];
|
|
35
|
+
private formatBytes;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=performanceOptimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performanceOptimizer.d.ts","sourceRoot":"","sources":["../../src/core/performanceOptimizer.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,QAAQ,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAepD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW;IAkBzC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAyB9C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO9C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAU/D,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAaxD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAgBxC,UAAU,IAAI,IAAI;IAQlB,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAQ7D,WAAW,IAAI,oBAAoB;IAOnC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAmBpD,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE;IAsBlD,OAAO,CAAC,WAAW;CAOpB"}
|