appclean 1.8.0 → 2.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/GUI_IMPLEMENTATION_STATUS.md +143 -0
- package/MD_Files/INDEX.md +51 -0
- package/MD_Files/PUBLICATION_SUCCESS_REPORT.md +227 -0
- package/PHASE2_COMPLETION.md +281 -0
- package/PHASE3_COMPLETION.md +364 -0
- package/README.md +446 -376
- package/assets/logo.svg +34 -0
- package/dist/core/appUpdateChecker.js +12 -16
- package/dist/core/appUpdateChecker.js.map +1 -1
- package/dist/core/detector.js +14 -18
- package/dist/core/detector.js.map +1 -1
- package/dist/core/duplicateFileFinder.js +12 -19
- package/dist/core/duplicateFileFinder.js.map +1 -1
- package/dist/core/orphanedDependencyDetector.js +19 -26
- package/dist/core/orphanedDependencyDetector.js.map +1 -1
- package/dist/core/performanceOptimizer.js +6 -10
- package/dist/core/performanceOptimizer.js.map +1 -1
- package/dist/core/permissionHandler.js +21 -25
- package/dist/core/permissionHandler.js.map +1 -1
- package/dist/core/pluginSystem.js +9 -13
- package/dist/core/pluginSystem.js.map +1 -1
- package/dist/core/removalRecorder.js +12 -19
- package/dist/core/removalRecorder.js.map +1 -1
- package/dist/core/remover.js +59 -66
- package/dist/core/remover.js.map +1 -1
- package/dist/core/reportGenerator.d.ts +1 -1
- package/dist/core/reportGenerator.d.ts.map +1 -1
- package/dist/core/reportGenerator.js +27 -34
- package/dist/core/reportGenerator.js.map +1 -1
- package/dist/core/scheduledCleanup.js +23 -30
- package/dist/core/scheduledCleanup.js.map +1 -1
- package/dist/core/serviceFileDetector.js +24 -31
- package/dist/core/serviceFileDetector.js.map +1 -1
- package/dist/core/verificationModule.js +10 -14
- package/dist/core/verificationModule.js.map +1 -1
- package/dist/index.js +190 -90
- package/dist/index.js.map +1 -1
- package/dist/managers/brewManager.d.ts.map +1 -1
- package/dist/managers/brewManager.js +35 -41
- package/dist/managers/brewManager.js.map +1 -1
- package/dist/managers/customManager.d.ts +2 -1
- package/dist/managers/customManager.d.ts.map +1 -1
- package/dist/managers/customManager.js +79 -53
- package/dist/managers/customManager.js.map +1 -1
- package/dist/managers/linuxManager.js +29 -36
- package/dist/managers/linuxManager.js.map +1 -1
- package/dist/managers/npmManager.js +27 -34
- package/dist/managers/npmManager.js.map +1 -1
- package/dist/types/index.js +1 -2
- package/dist/ui/client/api/client.d.ts +24 -0
- package/dist/ui/client/api/client.d.ts.map +1 -0
- package/dist/ui/client/api/client.js +96 -0
- package/dist/ui/client/api/client.js.map +1 -0
- package/dist/ui/client/app.d.ts +7 -0
- package/dist/ui/client/app.d.ts.map +1 -0
- package/dist/ui/client/app.js +71 -0
- package/dist/ui/client/app.js.map +1 -0
- package/dist/ui/client/index.html +107 -0
- package/dist/ui/client/pages/appDetails.d.ts +8 -0
- package/dist/ui/client/pages/appDetails.d.ts.map +1 -0
- package/dist/ui/client/pages/appDetails.js +287 -0
- package/dist/ui/client/pages/appDetails.js.map +1 -0
- package/dist/ui/client/pages/appSearch.d.ts +2 -0
- package/dist/ui/client/pages/appSearch.d.ts.map +1 -0
- package/dist/ui/client/pages/appSearch.js +210 -0
- package/dist/ui/client/pages/appSearch.js.map +1 -0
- package/dist/ui/client/pages/dashboard.d.ts +2 -0
- package/dist/ui/client/pages/dashboard.d.ts.map +1 -0
- package/dist/ui/client/pages/dashboard.js +154 -0
- package/dist/ui/client/pages/dashboard.js.map +1 -0
- package/dist/ui/client/pages/settings.d.ts +7 -0
- package/dist/ui/client/pages/settings.d.ts.map +1 -0
- package/dist/ui/client/pages/settings.js +279 -0
- package/dist/ui/client/pages/settings.js.map +1 -0
- package/dist/ui/client/state/appStore.d.ts +38 -0
- package/dist/ui/client/state/appStore.d.ts.map +1 -0
- package/dist/ui/client/state/appStore.js +121 -0
- package/dist/ui/client/state/appStore.js.map +1 -0
- package/dist/ui/client/state/dashboardStore.d.ts +31 -0
- package/dist/ui/client/state/dashboardStore.d.ts.map +1 -0
- package/dist/ui/client/state/dashboardStore.js +70 -0
- package/dist/ui/client/state/dashboardStore.js.map +1 -0
- package/dist/ui/client/state/uiStore.d.ts +43 -0
- package/dist/ui/client/state/uiStore.d.ts.map +1 -0
- package/dist/ui/client/state/uiStore.js +109 -0
- package/dist/ui/client/state/uiStore.js.map +1 -0
- package/dist/ui/client/styles/animations.css +327 -0
- package/dist/ui/client/styles/base.css +214 -0
- package/dist/ui/client/styles/components.css +400 -0
- package/dist/ui/client/styles/layout.css +224 -0
- package/dist/ui/client/styles/variables.css +140 -0
- package/dist/ui/client/utils/events.d.ts +19 -0
- package/dist/ui/client/utils/events.d.ts.map +1 -0
- package/dist/ui/client/utils/events.js +54 -0
- package/dist/ui/client/utils/events.js.map +1 -0
- package/dist/ui/client/utils/formatting.d.ts +11 -0
- package/dist/ui/client/utils/formatting.d.ts.map +1 -0
- package/dist/ui/client/utils/formatting.js +104 -0
- package/dist/ui/client/utils/formatting.js.map +1 -0
- package/dist/ui/client/utils/router.d.ts +25 -0
- package/dist/ui/client/utils/router.d.ts.map +1 -0
- package/dist/ui/client/utils/router.js +90 -0
- package/dist/ui/client/utils/router.js.map +1 -0
- package/dist/ui/guiServer.d.ts +8 -1
- package/dist/ui/guiServer.d.ts.map +1 -1
- package/dist/ui/guiServer.js +148 -110
- package/dist/ui/guiServer.js.map +1 -1
- package/dist/ui/menu.js +18 -27
- package/dist/ui/menu.js.map +1 -1
- package/dist/ui/prompts.js +34 -47
- package/dist/ui/prompts.js.map +1 -1
- package/dist/ui/server/middleware/errorHandler.d.ts +19 -0
- package/dist/ui/server/middleware/errorHandler.d.ts.map +1 -0
- package/dist/ui/server/middleware/errorHandler.js +100 -0
- package/dist/ui/server/middleware/errorHandler.js.map +1 -0
- package/dist/ui/server/routes/apps.d.ts +8 -0
- package/dist/ui/server/routes/apps.d.ts.map +1 -0
- package/dist/ui/server/routes/apps.js +74 -0
- package/dist/ui/server/routes/apps.js.map +1 -0
- package/dist/ui/server/routes/dashboard.d.ts +4 -0
- package/dist/ui/server/routes/dashboard.d.ts.map +1 -0
- package/dist/ui/server/routes/dashboard.js +57 -0
- package/dist/ui/server/routes/dashboard.js.map +1 -0
- package/dist/ui/server/routes/settings.d.ts +6 -0
- package/dist/ui/server/routes/settings.d.ts.map +1 -0
- package/dist/ui/server/routes/settings.js +31 -0
- package/dist/ui/server/routes/settings.js.map +1 -0
- package/dist/ui/server/services/appService.d.ts +45 -0
- package/dist/ui/server/services/appService.d.ts.map +1 -0
- package/dist/ui/server/services/appService.js +114 -0
- package/dist/ui/server/services/appService.js.map +1 -0
- package/dist/ui/server/services/removalService.d.ts +24 -0
- package/dist/ui/server/services/removalService.d.ts.map +1 -0
- package/dist/ui/server/services/removalService.js +83 -0
- package/dist/ui/server/services/removalService.js.map +1 -0
- package/dist/utils/filesystem.js +32 -49
- package/dist/utils/filesystem.js.map +1 -1
- package/dist/utils/logger.js +9 -18
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/platform.js +10 -22
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/upgrade.d.ts +22 -0
- package/dist/utils/upgrade.d.ts.map +1 -0
- package/dist/utils/upgrade.js +94 -0
- package/dist/utils/upgrade.js.map +1 -0
- package/package.json +4 -2
- package/src/core/appUpdateChecker.ts +1 -1
- package/src/core/detector.ts +6 -6
- package/src/core/duplicateFileFinder.ts +1 -1
- package/src/core/orphanedDependencyDetector.ts +2 -2
- package/src/core/performanceOptimizer.ts +1 -1
- package/src/core/permissionHandler.ts +2 -2
- package/src/core/pluginSystem.ts +1 -1
- package/src/core/removalRecorder.ts +2 -2
- package/src/core/remover.ts +11 -11
- package/src/core/reportGenerator.ts +2 -2
- package/src/core/scheduledCleanup.ts +2 -2
- package/src/core/serviceFileDetector.ts +2 -2
- package/src/core/verificationModule.ts +2 -2
- package/src/index.ts +133 -6
- package/src/managers/brewManager.ts +11 -9
- package/src/managers/customManager.ts +71 -30
- package/src/managers/linuxManager.ts +3 -3
- package/src/managers/npmManager.ts +3 -3
- package/src/ui/client/api/client.ts +163 -0
- package/src/ui/client/app.ts +121 -0
- package/src/ui/client/index.html +107 -0
- package/src/ui/client/pages/appDetails.ts +356 -0
- package/src/ui/client/pages/appSearch.ts +270 -0
- package/src/ui/client/pages/dashboard.ts +189 -0
- package/src/ui/client/pages/settings.ts +342 -0
- package/src/ui/client/state/appStore.ts +169 -0
- package/src/ui/client/state/dashboardStore.ts +113 -0
- package/src/ui/client/state/uiStore.ts +166 -0
- package/src/ui/client/styles/animations.css +327 -0
- package/src/ui/client/styles/base.css +214 -0
- package/src/ui/client/styles/components.css +400 -0
- package/src/ui/client/styles/layout.css +224 -0
- package/src/ui/client/styles/variables.css +140 -0
- package/src/ui/client/utils/events.ts +74 -0
- package/src/ui/client/utils/formatting.ts +157 -0
- package/src/ui/client/utils/router.ts +161 -0
- package/src/ui/guiServer.ts +206 -105
- package/src/ui/prompts.ts +1 -1
- package/src/ui/server/middleware/errorHandler.ts +174 -0
- package/src/ui/server/routes/apps.ts +132 -0
- package/src/ui/server/routes/dashboard.ts +93 -0
- package/src/ui/server/routes/settings.ts +63 -0
- package/src/ui/server/services/appService.ts +184 -0
- package/src/ui/server/services/removalService.ts +138 -0
- package/src/utils/upgrade.ts +143 -0
- package/tsconfig.json +3 -2
- package/INDEX.md +0 -165
- /package/{ACTION_CHECKLIST.md → MD_Files/ACTION_CHECKLIST.md} +0 -0
- /package/{APPCLEAN_SUMMARY.md → MD_Files/APPCLEAN_SUMMARY.md} +0 -0
- /package/{CHANGELOG.md → MD_Files/CHANGELOG.md} +0 -0
- /package/{CODE_OF_CONDUCT.md → MD_Files/CODE_OF_CONDUCT.md} +0 -0
- /package/{CODE_REVIEW_REPORT.md → MD_Files/CODE_REVIEW_REPORT.md} +0 -0
- /package/{COMMUNITY_POSTS.md → MD_Files/COMMUNITY_POSTS.md} +0 -0
- /package/{DEPLOYMENT_GUIDE.md → MD_Files/DEPLOYMENT_GUIDE.md} +0 -0
- /package/{DEPLOYMENT_STATUS.md → MD_Files/DEPLOYMENT_STATUS.md} +0 -0
- /package/{EXECUTIVE_REPORT.md → MD_Files/EXECUTIVE_REPORT.md} +0 -0
- /package/{GITHUB_OPTIMIZATION.md → MD_Files/GITHUB_OPTIMIZATION.md} +0 -0
- /package/{MARKETING_SUMMARY.md → MD_Files/MARKETING_SUMMARY.md} +0 -0
- /package/{NPM_PACKAGE_OPTIMIZATION.md → MD_Files/NPM_PACKAGE_OPTIMIZATION.md} +0 -0
- /package/{NPM_PUBLISH.md → MD_Files/NPM_PUBLISH.md} +0 -0
- /package/{PROJECT_SUMMARY.txt → MD_Files/PROJECT_SUMMARY.txt} +0 -0
- /package/{QUICKSTART.md → MD_Files/QUICKSTART.md} +0 -0
- /package/{SETUP_GITHUB.md → MD_Files/SETUP_GITHUB.md} +0 -0
- /package/{TESTING_SUMMARY.md → MD_Files/TESTING_SUMMARY.md} +0 -0
- /package/{setup-github.sh → MD_Files/setup-github.sh} +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export class Router {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.routes = [];
|
|
4
|
+
this.currentRoute = null;
|
|
5
|
+
this.onRouteChange = null;
|
|
6
|
+
this.listenToHashChanges();
|
|
7
|
+
}
|
|
8
|
+
register(path, handler, title) {
|
|
9
|
+
this.routes.push({ path, handler, title });
|
|
10
|
+
}
|
|
11
|
+
navigate(path) {
|
|
12
|
+
window.location.hash = `#/${path}`.replace('##', '#');
|
|
13
|
+
}
|
|
14
|
+
getCurrentPath() {
|
|
15
|
+
return window.location.hash.slice(2) || '';
|
|
16
|
+
}
|
|
17
|
+
listenToHashChanges() {
|
|
18
|
+
window.addEventListener('hashchange', () => {
|
|
19
|
+
this.route();
|
|
20
|
+
});
|
|
21
|
+
this.route();
|
|
22
|
+
}
|
|
23
|
+
route() {
|
|
24
|
+
const path = this.getCurrentPath();
|
|
25
|
+
const route = this.matchRoute(path);
|
|
26
|
+
if (route) {
|
|
27
|
+
const params = this.extractParams(route.path, path);
|
|
28
|
+
this.currentRoute = route;
|
|
29
|
+
if (route.title) {
|
|
30
|
+
document.title = route.title;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
route.handler(params);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error('Route handler error:', error);
|
|
37
|
+
}
|
|
38
|
+
if (this.onRouteChange) {
|
|
39
|
+
this.onRouteChange(route);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.warn(`No route found for: ${path}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
matchRoute(path) {
|
|
47
|
+
const exactMatch = this.routes.find((r) => r.path === path || r.path === `/${path}`);
|
|
48
|
+
if (exactMatch)
|
|
49
|
+
return exactMatch;
|
|
50
|
+
for (const route of this.routes) {
|
|
51
|
+
if (this.pathMatches(route.path, path)) {
|
|
52
|
+
return route;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
pathMatches(routePath, actualPath) {
|
|
58
|
+
const routeParts = routePath.split('/').filter(Boolean);
|
|
59
|
+
const actualParts = actualPath.split('/').filter(Boolean);
|
|
60
|
+
if (routeParts.length !== actualParts.length) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return routeParts.every((part, i) => {
|
|
64
|
+
return part.startsWith(':') || part === actualParts[i];
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
extractParams(routePath, actualPath) {
|
|
68
|
+
const params = {};
|
|
69
|
+
const routeParts = routePath.split('/').filter(Boolean);
|
|
70
|
+
const actualParts = actualPath.split('/').filter(Boolean);
|
|
71
|
+
routeParts.forEach((part, i) => {
|
|
72
|
+
if (part.startsWith(':')) {
|
|
73
|
+
const paramName = part.slice(1);
|
|
74
|
+
params[paramName] = decodeURIComponent(actualParts[i]);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return params;
|
|
78
|
+
}
|
|
79
|
+
onchange(callback) {
|
|
80
|
+
this.onRouteChange = callback;
|
|
81
|
+
}
|
|
82
|
+
getRoutes() {
|
|
83
|
+
return this.routes;
|
|
84
|
+
}
|
|
85
|
+
getCurrentRoute() {
|
|
86
|
+
return this.currentRoute;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export const router = new Router();
|
|
90
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/ui/client/utils/router.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/guiServer.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
export declare class GUIServer {
|
|
2
2
|
private port;
|
|
3
3
|
private server;
|
|
4
|
+
private spaHtml;
|
|
4
5
|
constructor(port?: number);
|
|
5
6
|
start(): Promise<void>;
|
|
6
7
|
stop(): Promise<void>;
|
|
8
|
+
private handleRequest;
|
|
7
9
|
private handleAPIRequest;
|
|
8
|
-
private
|
|
10
|
+
private serveStaticAsset;
|
|
11
|
+
private serveSPA;
|
|
12
|
+
private loadSPAHtml;
|
|
13
|
+
private getContentType;
|
|
14
|
+
private setCORSHeaders;
|
|
9
15
|
}
|
|
16
|
+
export default GUIServer;
|
|
10
17
|
//# sourceMappingURL=guiServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guiServer.d.ts","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"guiServer.d.ts","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":"AAoBA,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAAuB;gBAE1B,IAAI,GAAE,MAAa;IAOzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUb,aAAa;IAqC3B,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,QAAQ;IAkChB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,cAAc;CAMvB;AAGD,eAAe,SAAS,CAAC"}
|
package/dist/ui/guiServer.js
CHANGED
|
@@ -1,134 +1,172 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { createServer } from 'http';
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname } from 'path';
|
|
6
|
+
import { Logger } from '../utils/logger.js';
|
|
7
|
+
import { sendError } from './server/middleware/errorHandler.js';
|
|
8
|
+
import { handleAppRoutes } from './server/routes/apps.js';
|
|
9
|
+
import { handleDashboardRoutes } from './server/routes/dashboard.js';
|
|
10
|
+
import { handleSettingsRoutes } from './server/routes/settings.js';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
export class GUIServer {
|
|
7
14
|
constructor(port = 3000) {
|
|
8
15
|
this.port = 3000;
|
|
16
|
+
this.spaHtml = null;
|
|
9
17
|
this.port = port;
|
|
10
18
|
}
|
|
11
19
|
async start() {
|
|
12
|
-
|
|
13
|
-
this.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
res.end(this.getIndexHTML());
|
|
17
|
-
}
|
|
18
|
-
else if (req.url?.startsWith('/api/')) {
|
|
19
|
-
this.handleAPIRequest(req, res);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
23
|
-
res.end('Not Found');
|
|
24
|
-
}
|
|
20
|
+
Logger.info(`Starting AppClean GUI server on port ${this.port}...`);
|
|
21
|
+
this.loadSPAHtml();
|
|
22
|
+
this.server = createServer((req, res) => {
|
|
23
|
+
this.handleRequest(req, res);
|
|
25
24
|
});
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
this.server.listen(this.port, () => {
|
|
27
|
+
Logger.success(`✨ AppClean GUI running at http://localhost:${this.port}`);
|
|
28
|
+
Logger.info('Press Ctrl+C to stop the server');
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
28
31
|
});
|
|
29
32
|
}
|
|
30
33
|
async stop() {
|
|
31
34
|
if (this.server) {
|
|
32
35
|
this.server.close();
|
|
33
|
-
|
|
36
|
+
Logger.info('GUI server stopped');
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
async handleRequest(req, res) {
|
|
40
|
+
const url = req.url || '/';
|
|
41
|
+
const method = req.method || 'GET';
|
|
42
|
+
const pathname = url.split('?')[0];
|
|
43
|
+
this.setCORSHeaders(res);
|
|
44
|
+
if (method === 'OPTIONS') {
|
|
45
|
+
res.writeHead(200);
|
|
46
|
+
res.end();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
if (pathname.startsWith('/api/')) {
|
|
51
|
+
return this.handleAPIRequest(method, pathname, req, res);
|
|
52
|
+
}
|
|
53
|
+
if (pathname.startsWith('/static/')) {
|
|
54
|
+
return this.serveStaticAsset(pathname, res);
|
|
55
|
+
}
|
|
56
|
+
this.serveSPA(res);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
Logger.error(`Request error: ${error.message}`);
|
|
60
|
+
sendError(res, 'Internal server error', 500);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
handleAPIRequest(method, pathname, req, res) {
|
|
64
|
+
if (handleAppRoutes(method, pathname, req, res)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (handleDashboardRoutes(method, pathname, req, res)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (handleSettingsRoutes(method, pathname, req, res)) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
sendError(res, 'API endpoint not found', 404);
|
|
74
|
+
}
|
|
75
|
+
serveStaticAsset(pathname, res) {
|
|
76
|
+
const relativePath = pathname.slice(8);
|
|
77
|
+
if (relativePath.includes('..')) {
|
|
78
|
+
sendError(res, 'Access denied', 403);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const filePath = join(__dirname, 'client', relativePath);
|
|
82
|
+
if (!existsSync(filePath)) {
|
|
83
|
+
sendError(res, 'Asset not found', 404);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const content = readFileSync(filePath);
|
|
88
|
+
const contentType = this.getContentType(filePath);
|
|
89
|
+
res.writeHead(200, {
|
|
90
|
+
'Content-Type': contentType,
|
|
91
|
+
'Cache-Control': 'public, max-age=3600',
|
|
92
|
+
});
|
|
93
|
+
res.end(content);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
Logger.warn(`Failed to serve asset ${pathname}: ${error.message}`);
|
|
97
|
+
sendError(res, 'Failed to load asset', 500);
|
|
98
|
+
}
|
|
39
99
|
}
|
|
40
|
-
|
|
41
|
-
|
|
100
|
+
serveSPA(res) {
|
|
101
|
+
if (!this.spaHtml) {
|
|
102
|
+
const fallbackHtml = `
|
|
42
103
|
<!DOCTYPE html>
|
|
43
|
-
<html
|
|
104
|
+
<html>
|
|
44
105
|
<head>
|
|
45
106
|
<meta charset="UTF-8">
|
|
46
107
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
47
|
-
<title>AppClean
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
border-radius: 12px;
|
|
66
|
-
box-shadow: 0 20px 60px rgba(0,0,0,0.3);
|
|
67
|
-
max-width: 800px;
|
|
68
|
-
width: 100%;
|
|
69
|
-
padding: 40px;
|
|
70
|
-
}
|
|
71
|
-
h1 {
|
|
72
|
-
color: #333;
|
|
73
|
-
margin-bottom: 10px;
|
|
74
|
-
}
|
|
75
|
-
.version {
|
|
76
|
-
color: #666;
|
|
77
|
-
font-size: 14px;
|
|
78
|
-
margin-bottom: 30px;
|
|
79
|
-
}
|
|
80
|
-
.feature-badge {
|
|
81
|
-
display: inline-block;
|
|
82
|
-
background: #667eea;
|
|
83
|
-
color: white;
|
|
84
|
-
padding: 8px 16px;
|
|
85
|
-
border-radius: 20px;
|
|
86
|
-
font-size: 12px;
|
|
87
|
-
font-weight: 600;
|
|
88
|
-
margin-bottom: 20px;
|
|
108
|
+
<title>AppClean</title>
|
|
109
|
+
</head>
|
|
110
|
+
<body style="font-family: system-ui; padding: 20px; text-align: center;">
|
|
111
|
+
<h1>⚠️ GUI Not Ready</h1>
|
|
112
|
+
<p>The SPA assets haven't been compiled yet.</p>
|
|
113
|
+
<p>Run <code>npm run build</code> to compile the TypeScript/CSS files.</p>
|
|
114
|
+
<p>For now, use the CLI: <code>appclean --help</code></p>
|
|
115
|
+
</body>
|
|
116
|
+
</html>`;
|
|
117
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
118
|
+
res.end(fallbackHtml);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
res.writeHead(200, {
|
|
122
|
+
'Content-Type': 'text/html',
|
|
123
|
+
'Cache-Control': 'no-cache',
|
|
124
|
+
});
|
|
125
|
+
res.end(this.spaHtml);
|
|
89
126
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
127
|
+
loadSPAHtml() {
|
|
128
|
+
const htmlPath = join(__dirname, 'client', 'index.html');
|
|
129
|
+
try {
|
|
130
|
+
if (existsSync(htmlPath)) {
|
|
131
|
+
this.spaHtml = readFileSync(htmlPath, 'utf-8');
|
|
132
|
+
Logger.debug('✓ Loaded SPA HTML');
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
Logger.warn(`⚠️ SPA HTML not found at ${htmlPath}`);
|
|
136
|
+
Logger.info('Make sure to run: npm run build');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
Logger.warn(`Failed to load SPA HTML: ${error.message}`);
|
|
141
|
+
}
|
|
94
142
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
143
|
+
getContentType(filePath) {
|
|
144
|
+
const ext = filePath.toLowerCase().split('.').pop();
|
|
145
|
+
const typeMap = {
|
|
146
|
+
'js': 'application/javascript; charset=utf-8',
|
|
147
|
+
'css': 'text/css; charset=utf-8',
|
|
148
|
+
'html': 'text/html; charset=utf-8',
|
|
149
|
+
'json': 'application/json; charset=utf-8',
|
|
150
|
+
'svg': 'image/svg+xml',
|
|
151
|
+
'png': 'image/png',
|
|
152
|
+
'jpg': 'image/jpeg',
|
|
153
|
+
'jpeg': 'image/jpeg',
|
|
154
|
+
'gif': 'image/gif',
|
|
155
|
+
'ico': 'image/x-icon',
|
|
156
|
+
'webp': 'image/webp',
|
|
157
|
+
'woff': 'font/woff',
|
|
158
|
+
'woff2': 'font/woff2',
|
|
159
|
+
'ttf': 'font/ttf',
|
|
160
|
+
'eot': 'application/vnd.ms-fontobject',
|
|
161
|
+
};
|
|
162
|
+
return typeMap[ext || ''] || 'application/octet-stream';
|
|
101
163
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
<p class="version">v1.2.0 - GUI Application Feature</p>
|
|
108
|
-
<span class="feature-badge">Coming Soon</span>
|
|
109
|
-
|
|
110
|
-
<p>
|
|
111
|
-
A beautiful, intuitive graphical user interface for AppClean, bringing the power of
|
|
112
|
-
intelligent app removal to users who prefer a visual interface.
|
|
113
|
-
</p>
|
|
114
|
-
|
|
115
|
-
<div class="coming-soon">
|
|
116
|
-
<h3>🚀 Features Coming in v1.2.0</h3>
|
|
117
|
-
<ul style="margin-left: 20px; margin-top: 10px;">
|
|
118
|
-
<li>✨ Modern, responsive GUI design</li>
|
|
119
|
-
<li>🖥️ Cross-platform support (macOS, Linux, Windows)</li>
|
|
120
|
-
<li>🔍 Visual app search and discovery</li>
|
|
121
|
-
<li>📊 Beautiful artifact visualization</li>
|
|
122
|
-
<li>🗑️ Drag-and-drop app removal</li>
|
|
123
|
-
<li>📈 Real-time removal progress</li>
|
|
124
|
-
<li>📋 Interactive report viewer</li>
|
|
125
|
-
</ul>
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
</body>
|
|
129
|
-
</html>
|
|
130
|
-
`;
|
|
164
|
+
setCORSHeaders(res) {
|
|
165
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
166
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
167
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
168
|
+
res.setHeader('Access-Control-Max-Age', '3600');
|
|
131
169
|
}
|
|
132
170
|
}
|
|
133
|
-
|
|
171
|
+
export default GUIServer;
|
|
134
172
|
//# sourceMappingURL=guiServer.js.map
|
package/dist/ui/guiServer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guiServer.js","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"guiServer.js","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/menu.js
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.showMainMenu = showMainMenu;
|
|
7
|
-
exports.showAppMenu = showAppMenu;
|
|
8
|
-
exports.showHeader = showHeader;
|
|
9
|
-
exports.showHelp = showHelp;
|
|
10
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
async function showMainMenu() {
|
|
13
|
-
const { action } = await inquirer_1.default.prompt([
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export async function showMainMenu() {
|
|
4
|
+
const { action } = await inquirer.prompt([
|
|
14
5
|
{
|
|
15
6
|
type: 'list',
|
|
16
7
|
name: 'action',
|
|
@@ -25,8 +16,8 @@ async function showMainMenu() {
|
|
|
25
16
|
]);
|
|
26
17
|
return action;
|
|
27
18
|
}
|
|
28
|
-
async function showAppMenu() {
|
|
29
|
-
const { action } = await
|
|
19
|
+
export async function showAppMenu() {
|
|
20
|
+
const { action } = await inquirer.prompt([
|
|
30
21
|
{
|
|
31
22
|
type: 'list',
|
|
32
23
|
name: 'action',
|
|
@@ -40,22 +31,22 @@ async function showAppMenu() {
|
|
|
40
31
|
]);
|
|
41
32
|
return action;
|
|
42
33
|
}
|
|
43
|
-
function showHeader() {
|
|
34
|
+
export function showHeader() {
|
|
44
35
|
console.clear();
|
|
45
|
-
console.log(
|
|
36
|
+
console.log(chalk.cyan(`
|
|
46
37
|
╔═══════════════════════════════════════════════════════════╗
|
|
47
38
|
║ ║
|
|
48
|
-
║ ${
|
|
39
|
+
║ ${chalk.bold('AppClean - App Uninstaller')} ║
|
|
49
40
|
║ Remove apps and all their artifacts ║
|
|
50
41
|
║ ║
|
|
51
42
|
╚═══════════════════════════════════════════════════════════╝
|
|
52
43
|
`));
|
|
53
44
|
}
|
|
54
|
-
function showHelp() {
|
|
55
|
-
console.log(
|
|
56
|
-
${
|
|
45
|
+
export function showHelp() {
|
|
46
|
+
console.log(chalk.cyan(`
|
|
47
|
+
${chalk.bold('AppClean - Help')}
|
|
57
48
|
|
|
58
|
-
${
|
|
49
|
+
${chalk.bold('Features:')}
|
|
59
50
|
• Search and find all installed applications
|
|
60
51
|
• Identify installation method (npm, brew, apt, custom, etc)
|
|
61
52
|
• Locate all related files, configs, and caches
|
|
@@ -63,31 +54,31 @@ ${chalk_1.default.bold('Features:')}
|
|
|
63
54
|
• Create backups before deletion
|
|
64
55
|
• Cross-platform support (macOS, Linux, Windows)
|
|
65
56
|
|
|
66
|
-
${
|
|
57
|
+
${chalk.bold('Commands:')}
|
|
67
58
|
appclean Start interactive mode
|
|
68
59
|
appclean search <name> Search for an app
|
|
69
60
|
appclean remove <name> Remove an app
|
|
70
61
|
appclean list List all apps
|
|
71
62
|
appclean analyze <name> Show app artifacts
|
|
72
63
|
|
|
73
|
-
${
|
|
64
|
+
${chalk.bold('Options:')}
|
|
74
65
|
--dry-run Preview without deleting
|
|
75
66
|
--backup Create backup before removal
|
|
76
67
|
--help Show this help message
|
|
77
68
|
--version Show version
|
|
78
69
|
|
|
79
|
-
${
|
|
70
|
+
${chalk.bold('Examples:')}
|
|
80
71
|
appclean search nodejs Search for nodejs
|
|
81
72
|
appclean remove myapp --dry-run Preview removal
|
|
82
73
|
appclean list | grep npm Find npm-installed apps
|
|
83
74
|
|
|
84
|
-
${
|
|
75
|
+
${chalk.bold('Safety:')}
|
|
85
76
|
• Always previews what will be deleted
|
|
86
77
|
• Use --dry-run first to see what will happen
|
|
87
78
|
• Use --backup to create backups before deletion
|
|
88
79
|
• Double confirmation before actual removal
|
|
89
80
|
|
|
90
|
-
${
|
|
81
|
+
${chalk.bold('Website:')} https://github.com/YOUR_USERNAME/appclean
|
|
91
82
|
`));
|
|
92
83
|
}
|
|
93
84
|
//# sourceMappingURL=menu.js.map
|
package/dist/ui/menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/ui/menu.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/ui/menu.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACvC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAClD,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,UAAU,EAAE;gBACzD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;gBACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;aAClC;SACF;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACvC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC3D,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACjD,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE;aAC9C;SACF;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC;;;eAGA,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC;;;;GAIpD,CAAC,CACD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC;EACb,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;;EAE7B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;;;EAQvB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;;EAOvB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;;;;;;EAMtB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;EAKvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;;;;;;EAMrB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;GACrB,CAAC,CACD,CAAC;AACJ,CAAC"}
|