appclean 2.0.0 โ 2.0.2
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/npm-publish.yml +61 -0
- package/DEVELOPMENT.md +84 -0
- package/RELEASE_GUIDE.md +236 -0
- package/dist/index.js +1 -1
- package/dist/ui/client/api/client.d.ts.map +1 -1
- package/dist/ui/client/api/client.js +5 -1
- package/dist/ui/client/api/client.js.map +1 -1
- package/dist/ui/client/app.d.ts +1 -1
- package/dist/ui/client/app.d.ts.map +1 -1
- package/dist/ui/client/app.js +10 -6
- package/dist/ui/client/app.js.map +1 -1
- package/dist/ui/client/pages/appSearch.js +12 -1
- package/dist/ui/client/pages/appSearch.js.map +1 -1
- package/dist/ui/client/pages/dashboard.d.ts.map +1 -1
- package/dist/ui/client/pages/dashboard.js +26 -5
- package/dist/ui/client/pages/dashboard.js.map +1 -1
- package/dist/ui/client/state/appStore.d.ts.map +1 -1
- package/dist/ui/client/state/appStore.js +21 -12
- package/dist/ui/client/state/appStore.js.map +1 -1
- package/dist/ui/client/state/dashboardStore.d.ts.map +1 -1
- package/dist/ui/client/state/dashboardStore.js +9 -3
- package/dist/ui/client/state/dashboardStore.js.map +1 -1
- package/dist/ui/client/styles/animations.css +22 -0
- package/dist/ui/guiServer.d.ts +3 -0
- package/dist/ui/guiServer.d.ts.map +1 -1
- package/dist/ui/guiServer.js +48 -1
- package/dist/ui/guiServer.js.map +1 -1
- package/dist/utils/upgrade.d.ts +2 -1
- package/dist/utils/upgrade.d.ts.map +1 -1
- package/dist/utils/upgrade.js +14 -1
- package/dist/utils/upgrade.js.map +1 -1
- package/package.json +1 -1
- package/scripts/publish-npm.sh +64 -0
- package/src/index.ts +1 -1
- package/src/ui/client/api/client.ts +6 -1
- package/src/ui/client/app.ts +15 -11
- package/src/ui/client/pages/appSearch.ts +14 -1
- package/src/ui/client/pages/dashboard.ts +27 -5
- package/src/ui/client/state/appStore.ts +24 -12
- package/src/ui/client/state/dashboardStore.ts +13 -3
- package/src/ui/client/styles/animations.css +22 -0
- package/src/ui/guiServer.ts +67 -1
- package/src/utils/upgrade.ts +18 -1
|
@@ -23,17 +23,20 @@ export class AppStore extends Store {
|
|
|
23
23
|
const response = await fetch('/api/apps/list');
|
|
24
24
|
if (!response.ok)
|
|
25
25
|
throw new Error('Failed to load apps');
|
|
26
|
-
const
|
|
26
|
+
const json = await response.json();
|
|
27
|
+
const data = json.data || json;
|
|
27
28
|
this.setState({
|
|
28
|
-
apps: data.apps,
|
|
29
|
-
total: data.total,
|
|
30
|
-
page: data.page,
|
|
29
|
+
apps: data.apps || [],
|
|
30
|
+
total: data.total || 0,
|
|
31
|
+
page: data.page || 1,
|
|
31
32
|
isLoading: false,
|
|
32
33
|
});
|
|
33
34
|
}
|
|
34
35
|
catch (error) {
|
|
36
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
37
|
+
console.error('Failed to load apps:', errorMsg);
|
|
35
38
|
this.setState({
|
|
36
|
-
error:
|
|
39
|
+
error: errorMsg,
|
|
37
40
|
isLoading: false,
|
|
38
41
|
});
|
|
39
42
|
}
|
|
@@ -54,16 +57,19 @@ export class AppStore extends Store {
|
|
|
54
57
|
const response = await fetch(`/api/apps/search?${params}`);
|
|
55
58
|
if (!response.ok)
|
|
56
59
|
throw new Error('Failed to search apps');
|
|
57
|
-
const
|
|
60
|
+
const json = await response.json();
|
|
61
|
+
const data = json.data || json;
|
|
58
62
|
this.setState({
|
|
59
|
-
apps: data.apps,
|
|
60
|
-
total: data.count,
|
|
63
|
+
apps: data.apps || [],
|
|
64
|
+
total: data.count || 0,
|
|
61
65
|
isLoading: false,
|
|
62
66
|
});
|
|
63
67
|
}
|
|
64
68
|
catch (error) {
|
|
69
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
70
|
+
console.error('Failed to search apps:', errorMsg);
|
|
65
71
|
this.setState({
|
|
66
|
-
error:
|
|
72
|
+
error: errorMsg,
|
|
67
73
|
isLoading: false,
|
|
68
74
|
});
|
|
69
75
|
}
|
|
@@ -99,16 +105,19 @@ export class AppStore extends Store {
|
|
|
99
105
|
const response = await fetch(`/api/apps/search?${params}`);
|
|
100
106
|
if (!response.ok)
|
|
101
107
|
throw new Error('Failed to load more apps');
|
|
102
|
-
const
|
|
108
|
+
const json = await response.json();
|
|
109
|
+
const data = json.data || json;
|
|
103
110
|
this.setState({
|
|
104
|
-
apps: [...this.state.apps, ...data.apps],
|
|
111
|
+
apps: [...this.state.apps, ...(data.apps || [])],
|
|
105
112
|
page: nextPage,
|
|
106
113
|
isLoading: false,
|
|
107
114
|
});
|
|
108
115
|
}
|
|
109
116
|
catch (error) {
|
|
117
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
118
|
+
console.error('Failed to load next page:', errorMsg);
|
|
110
119
|
this.setState({
|
|
111
|
-
error:
|
|
120
|
+
error: errorMsg,
|
|
112
121
|
isLoading: false,
|
|
113
122
|
});
|
|
114
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appStore.js","sourceRoot":"","sources":["../../../../src/ui/client/state/appStore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA4B3C,MAAM,aAAa,GAAkB;IACnC,IAAI,EAAE,EAAE;IACR,aAAa,EAAE;QACb,KAAK,EAAE,EAAE;QACT,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE,MAAM;KACf;IACD,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,OAAO,QAAS,SAAQ,KAAoB;IAChD;QACE,KAAK,CAAC,aAAa,CAAC,CAAC;IACvB,CAAC;IAGD,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAEzD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;
|
|
1
|
+
{"version":3,"file":"appStore.js","sourceRoot":"","sources":["../../../../src/ui/client/state/appStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardStore.d.ts","sourceRoot":"","sources":["../../../../src/ui/client/state/dashboardStore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AASD,qBAAa,cAAe,SAAQ,KAAK,CAAC,mBAAmB,CAAC;;IAMtD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboardStore.d.ts","sourceRoot":"","sources":["../../../../src/ui/client/state/dashboardStore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AASD,qBAAa,cAAe,SAAQ,KAAK,CAAC,mBAAmB,CAAC;;IAMtD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B1B,YAAY,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAe7C,iBAAiB,IAAI,IAAI;IAezB,UAAU,IAAI,IAAI;CAGnB;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -14,8 +14,12 @@ export class DashboardStore extends Store {
|
|
|
14
14
|
try {
|
|
15
15
|
const response = await fetch('/api/dashboard/stats');
|
|
16
16
|
if (!response.ok)
|
|
17
|
-
throw new Error(
|
|
18
|
-
const
|
|
17
|
+
throw new Error(`Failed to load dashboard stats: ${response.status}`);
|
|
18
|
+
const data = await response.json();
|
|
19
|
+
const stats = data.data || data;
|
|
20
|
+
if (!stats) {
|
|
21
|
+
throw new Error('Invalid response format from server');
|
|
22
|
+
}
|
|
19
23
|
this.setState({
|
|
20
24
|
stats,
|
|
21
25
|
isLoading: false,
|
|
@@ -23,8 +27,10 @@ export class DashboardStore extends Store {
|
|
|
23
27
|
});
|
|
24
28
|
}
|
|
25
29
|
catch (error) {
|
|
30
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
31
|
+
console.error('Failed to load dashboard stats:', errorMsg);
|
|
26
32
|
this.setState({
|
|
27
|
-
error:
|
|
33
|
+
error: errorMsg,
|
|
28
34
|
isLoading: false,
|
|
29
35
|
});
|
|
30
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardStore.js","sourceRoot":"","sources":["../../../../src/ui/client/state/dashboardStore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAyB3C,MAAM,aAAa,GAAwB;IACzC,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF,MAAM,OAAO,cAAe,SAAQ,KAA0B;IAC5D;QACE,KAAK,CAAC,aAAa,CAAC,CAAC;IACvB,CAAC;IAGD,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACrD,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"dashboardStore.js","sourceRoot":"","sources":["../../../../src/ui/client/state/dashboardStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,28 @@
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
@keyframes slideUp {
|
|
43
|
+
from {
|
|
44
|
+
opacity: 0;
|
|
45
|
+
transform: translateY(20px);
|
|
46
|
+
}
|
|
47
|
+
to {
|
|
48
|
+
opacity: 1;
|
|
49
|
+
transform: translateY(0);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@keyframes slideIn {
|
|
54
|
+
from {
|
|
55
|
+
opacity: 0;
|
|
56
|
+
transform: translateX(-10px);
|
|
57
|
+
}
|
|
58
|
+
to {
|
|
59
|
+
opacity: 1;
|
|
60
|
+
transform: translateX(0);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
42
64
|
@keyframes slideOutDown {
|
|
43
65
|
from {
|
|
44
66
|
opacity: 1;
|
package/dist/ui/guiServer.d.ts
CHANGED
|
@@ -2,9 +2,12 @@ export declare class GUIServer {
|
|
|
2
2
|
private port;
|
|
3
3
|
private server;
|
|
4
4
|
private spaHtml;
|
|
5
|
+
private browserProcess;
|
|
5
6
|
constructor(port?: number);
|
|
6
7
|
start(): Promise<void>;
|
|
7
8
|
stop(): Promise<void>;
|
|
9
|
+
private openBrowser;
|
|
10
|
+
private closeBrowser;
|
|
8
11
|
private handleRequest;
|
|
9
12
|
private handleAPIRequest;
|
|
10
13
|
private serveStaticAsset;
|
|
@@ -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":"AAqBA,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,cAAc,CAA6B;gBAEvC,IAAI,GAAE,MAAa;IAOzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAab,WAAW;YA4BX,YAAY;YA6BZ,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
|
@@ -3,6 +3,7 @@ import { readFileSync, existsSync } from 'fs';
|
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { dirname } from 'path';
|
|
6
|
+
import { execFile } from 'child_process';
|
|
6
7
|
import { Logger } from '../utils/logger.js';
|
|
7
8
|
import { sendError } from './server/middleware/errorHandler.js';
|
|
8
9
|
import { handleAppRoutes } from './server/routes/apps.js';
|
|
@@ -14,6 +15,7 @@ export class GUIServer {
|
|
|
14
15
|
constructor(port = 3000) {
|
|
15
16
|
this.port = 3000;
|
|
16
17
|
this.spaHtml = null;
|
|
18
|
+
this.browserProcess = null;
|
|
17
19
|
this.port = port;
|
|
18
20
|
}
|
|
19
21
|
async start() {
|
|
@@ -23,19 +25,64 @@ export class GUIServer {
|
|
|
23
25
|
this.handleRequest(req, res);
|
|
24
26
|
});
|
|
25
27
|
return new Promise((resolve) => {
|
|
26
|
-
this.server.listen(this.port, () => {
|
|
28
|
+
this.server.listen(this.port, async () => {
|
|
27
29
|
Logger.success(`โจ AppClean GUI running at http://localhost:${this.port}`);
|
|
28
30
|
Logger.info('Press Ctrl+C to stop the server');
|
|
31
|
+
await this.openBrowser();
|
|
29
32
|
resolve();
|
|
30
33
|
});
|
|
31
34
|
});
|
|
32
35
|
}
|
|
33
36
|
async stop() {
|
|
37
|
+
await this.closeBrowser();
|
|
34
38
|
if (this.server) {
|
|
35
39
|
this.server.close();
|
|
36
40
|
Logger.info('GUI server stopped');
|
|
37
41
|
}
|
|
38
42
|
}
|
|
43
|
+
async openBrowser() {
|
|
44
|
+
const url = `http://localhost:${this.port}`;
|
|
45
|
+
try {
|
|
46
|
+
const platform = process.platform;
|
|
47
|
+
if (platform === 'darwin') {
|
|
48
|
+
this.browserProcess = execFile('open', [url]);
|
|
49
|
+
}
|
|
50
|
+
else if (platform === 'win32') {
|
|
51
|
+
this.browserProcess = execFile('cmd', ['/c', 'start', url]);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this.browserProcess = execFile('xdg-open', [url]);
|
|
55
|
+
}
|
|
56
|
+
this.browserProcess.on('error', (error) => {
|
|
57
|
+
Logger.warn(`Could not open browser: ${error.message}`);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
Logger.warn(`Failed to open browser: ${error.message}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async closeBrowser() {
|
|
65
|
+
if (!this.browserProcess) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const platform = process.platform;
|
|
70
|
+
if (platform === 'win32') {
|
|
71
|
+
if (this.browserProcess.pid) {
|
|
72
|
+
process.kill(this.browserProcess.pid, 'SIGTERM');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
if (this.browserProcess.pid) {
|
|
77
|
+
process.kill(this.browserProcess.pid);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
this.browserProcess = null;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
Logger.debug(`Note: Could not close browser process: ${error.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
39
86
|
async handleRequest(req, res) {
|
|
40
87
|
const url = req.url || '/';
|
|
41
88
|
const method = req.method || 'GET';
|
package/dist/ui/guiServer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guiServer.js","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAmC,MAAM,MAAM,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAY,SAAS,EAAoB,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,OAAO,SAAS;
|
|
1
|
+
{"version":3,"file":"guiServer.js","sourceRoot":"","sources":["../../src/ui/guiServer.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/upgrade.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ export interface VersionInfo {
|
|
|
5
5
|
}
|
|
6
6
|
export declare class UpgradeManager {
|
|
7
7
|
private readonly packageName;
|
|
8
|
-
private
|
|
8
|
+
private currentVersion;
|
|
9
|
+
constructor();
|
|
9
10
|
getVersionInfo(): Promise<VersionInfo>;
|
|
10
11
|
private compareVersions;
|
|
11
12
|
upgrade(): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/utils/upgrade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/utils/upgrade.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,cAAc,CAAS;;IAmBzB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAmC5C,OAAO,CAAC,eAAe;IAkBjB,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAsC/D,iBAAiB,IAAI,MAAM;IAOrB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC;IAOvC,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAqBlE"}
|
package/dist/utils/upgrade.js
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import { execSync } from 'child_process';
|
|
2
2
|
import { Logger } from './logger.js';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
3
6
|
export class UpgradeManager {
|
|
4
7
|
constructor() {
|
|
5
8
|
this.packageName = 'appclean';
|
|
6
|
-
|
|
9
|
+
try {
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
const packagePath = join(__dirname, '../../package.json');
|
|
13
|
+
const packageData = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
14
|
+
this.currentVersion = packageData.version || '2.0.0';
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
Logger.debug('Failed to read version from package.json, using fallback');
|
|
18
|
+
this.currentVersion = '2.0.0';
|
|
19
|
+
}
|
|
7
20
|
}
|
|
8
21
|
async getVersionInfo() {
|
|
9
22
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/utils/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrC,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/utils/upgrade.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# AppClean NPM Publishing Script
|
|
4
|
+
# Usage: ./scripts/publish-npm.sh [version]
|
|
5
|
+
# Example: ./scripts/publish-npm.sh 2.0.1
|
|
6
|
+
|
|
7
|
+
set -e
|
|
8
|
+
|
|
9
|
+
VERSION=${1:-}
|
|
10
|
+
|
|
11
|
+
if [ -z "$VERSION" ]; then
|
|
12
|
+
echo "Usage: ./scripts/publish-npm.sh <version>"
|
|
13
|
+
echo "Example: ./scripts/publish-npm.sh 2.0.1"
|
|
14
|
+
exit 1
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# Check if npm is logged in
|
|
18
|
+
if ! npm whoami &>/dev/null; then
|
|
19
|
+
echo "โ Not logged into npm"
|
|
20
|
+
echo "Please run: npm login"
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
echo "๐ฆ Publishing AppClean v$VERSION to npm..."
|
|
25
|
+
|
|
26
|
+
# Ensure clean working directory
|
|
27
|
+
if [ -n "$(git status --porcelain)" ]; then
|
|
28
|
+
echo "โ Working directory not clean. Please commit all changes."
|
|
29
|
+
git status
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Update version in package.json and src/index.ts
|
|
34
|
+
echo "๐ Updating version to $VERSION..."
|
|
35
|
+
sed -i.bak "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/" package.json
|
|
36
|
+
sed -i.bak "s/const VERSION = '[^']*'/const VERSION = '$VERSION'/" src/index.ts
|
|
37
|
+
rm -f package.json.bak src/index.ts.bak
|
|
38
|
+
|
|
39
|
+
# Build the project
|
|
40
|
+
echo "๐จ Building project..."
|
|
41
|
+
npm run build
|
|
42
|
+
|
|
43
|
+
# Commit version changes
|
|
44
|
+
echo "๐ Committing version changes..."
|
|
45
|
+
git add package.json src/index.ts
|
|
46
|
+
git commit -m "chore: Bump version to $VERSION"
|
|
47
|
+
|
|
48
|
+
# Create git tag
|
|
49
|
+
echo "๐ท๏ธ Creating git tag v$VERSION..."
|
|
50
|
+
git tag -a "v$VERSION" -m "AppClean v$VERSION - Published to npm" || true
|
|
51
|
+
|
|
52
|
+
# Publish to npm
|
|
53
|
+
echo "๐ Publishing to npm..."
|
|
54
|
+
npm publish
|
|
55
|
+
|
|
56
|
+
# Push changes and tags to origin
|
|
57
|
+
echo "๐ค Pushing changes to origin..."
|
|
58
|
+
git push origin main
|
|
59
|
+
git push origin "v$VERSION" || true
|
|
60
|
+
|
|
61
|
+
echo ""
|
|
62
|
+
echo "โ
Successfully published AppClean v$VERSION"
|
|
63
|
+
echo "๐ View on npm: https://www.npmjs.com/package/appclean"
|
|
64
|
+
echo "๐ท๏ธ View on GitHub: https://github.com/praveenkay/AppClean/releases/tag/v$VERSION"
|
package/src/index.ts
CHANGED
|
@@ -26,7 +26,7 @@ import { Logger, formatBytes } from './utils/logger.js';
|
|
|
26
26
|
import { UpgradeManager } from './utils/upgrade.js';
|
|
27
27
|
import { InstalledApp } from './types';
|
|
28
28
|
|
|
29
|
-
const VERSION = '2.0.
|
|
29
|
+
const VERSION = '2.0.2';
|
|
30
30
|
|
|
31
31
|
async function interactiveMode(): Promise<void> {
|
|
32
32
|
showHeader();
|
|
@@ -119,7 +119,12 @@ export class ApiClient {
|
|
|
119
119
|
const contentType = response.headers.get('content-type');
|
|
120
120
|
|
|
121
121
|
if (contentType?.includes('application/json')) {
|
|
122
|
-
|
|
122
|
+
const json = await response.json();
|
|
123
|
+
// Extract data from wrapped response format: { success: true, data: T }
|
|
124
|
+
if (json && typeof json === 'object' && 'data' in json && 'success' in json) {
|
|
125
|
+
return json.data as T;
|
|
126
|
+
}
|
|
127
|
+
return json as T;
|
|
123
128
|
}
|
|
124
129
|
|
|
125
130
|
if (contentType?.includes('text/')) {
|
package/src/ui/client/app.ts
CHANGED
|
@@ -17,18 +17,18 @@ import { renderSettings } from './pages/settings.js';
|
|
|
17
17
|
/**
|
|
18
18
|
* Initialize the SPA
|
|
19
19
|
*/
|
|
20
|
-
export function initApp(): void {
|
|
20
|
+
export async function initApp(): Promise<void> {
|
|
21
21
|
console.log('๐งน AppClean GUI v1.0.0 initializing...');
|
|
22
22
|
|
|
23
|
-
// Register routes
|
|
23
|
+
// Register routes first
|
|
24
24
|
registerRoutes();
|
|
25
25
|
|
|
26
|
-
// Initialize stores
|
|
27
|
-
initializeStores();
|
|
28
|
-
|
|
29
26
|
// Setup UI listeners
|
|
30
27
|
setupUIListeners();
|
|
31
28
|
|
|
29
|
+
// Initialize stores with data
|
|
30
|
+
await initializeStores();
|
|
31
|
+
|
|
32
32
|
// Navigate to initial route
|
|
33
33
|
router.navigate('');
|
|
34
34
|
|
|
@@ -65,11 +65,13 @@ function registerRoutes(): void {
|
|
|
65
65
|
*/
|
|
66
66
|
async function initializeStores(): Promise<void> {
|
|
67
67
|
try {
|
|
68
|
-
// Load dashboard stats
|
|
68
|
+
// Load dashboard stats (required for initial render)
|
|
69
69
|
await dashboardStore.loadStats();
|
|
70
70
|
|
|
71
|
-
// Load
|
|
72
|
-
|
|
71
|
+
// Load app list in background (don't block on this)
|
|
72
|
+
appStore.loadApps().catch((error) => {
|
|
73
|
+
console.error('Failed to load apps:', error);
|
|
74
|
+
});
|
|
73
75
|
} catch (error) {
|
|
74
76
|
console.error('Failed to initialize stores:', error);
|
|
75
77
|
uiStore.showError('Failed to load application data');
|
|
@@ -87,7 +89,9 @@ function setupUIListeners(): void {
|
|
|
87
89
|
|
|
88
90
|
// Subscribe to app store changes
|
|
89
91
|
appStore.subscribe((state) => {
|
|
90
|
-
|
|
92
|
+
if (state && state.apps) {
|
|
93
|
+
console.log(`Apps loaded: ${state.apps.length}`);
|
|
94
|
+
}
|
|
91
95
|
});
|
|
92
96
|
|
|
93
97
|
// Subscribe to dashboard store changes
|
|
@@ -115,7 +119,7 @@ export { appStore, dashboardStore, uiStore, router };
|
|
|
115
119
|
|
|
116
120
|
// Initialize on DOM ready
|
|
117
121
|
if (document.readyState === 'loading') {
|
|
118
|
-
document.addEventListener('DOMContentLoaded', initApp);
|
|
122
|
+
document.addEventListener('DOMContentLoaded', () => initApp().catch(e => console.error('Init error:', e)));
|
|
119
123
|
} else {
|
|
120
|
-
initApp();
|
|
124
|
+
initApp().catch(e => console.error('Init error:', e));
|
|
121
125
|
}
|
|
@@ -40,6 +40,19 @@ export function renderAppSearch(): void {
|
|
|
40
40
|
function renderAppSearchContent(container: HTMLElement): void {
|
|
41
41
|
const state = appStore.getState();
|
|
42
42
|
|
|
43
|
+
// Ensure state has apps array
|
|
44
|
+
if (!state || !state.apps) {
|
|
45
|
+
console.error('AppStore state is invalid:', state);
|
|
46
|
+
container.innerHTML = `
|
|
47
|
+
<div class="alert alert-danger">
|
|
48
|
+
<h3>Error Loading Apps</h3>
|
|
49
|
+
<p>Failed to load application state. Please refresh the page.</p>
|
|
50
|
+
<button class="btn btn-primary btn-sm mt-4" onclick="window.location.reload()">Reload</button>
|
|
51
|
+
</div>
|
|
52
|
+
`;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
43
56
|
container.innerHTML = `
|
|
44
57
|
<div class="app-search-page">
|
|
45
58
|
<!-- Header -->
|
|
@@ -82,7 +95,7 @@ function renderAppSearchContent(container: HTMLElement): void {
|
|
|
82
95
|
<!-- Apps Grid -->
|
|
83
96
|
<div class="apps-grid">
|
|
84
97
|
${
|
|
85
|
-
state.apps.length > 0
|
|
98
|
+
(state.apps && state.apps.length > 0)
|
|
86
99
|
? `
|
|
87
100
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
88
101
|
${state.apps.map((app) => renderAppCard(app)).join('')}
|
|
@@ -25,11 +25,24 @@ export function renderDashboard(): void {
|
|
|
25
25
|
dashboardStore.refreshStats(true).then(() => {
|
|
26
26
|
const state = dashboardStore.getState();
|
|
27
27
|
const stats = state.stats;
|
|
28
|
+
const error = state.error;
|
|
29
|
+
|
|
30
|
+
if (error) {
|
|
31
|
+
container.innerHTML = `
|
|
32
|
+
<div class="alert alert-danger" style="margin: 20px;">
|
|
33
|
+
<h3 style="margin-top: 0;">โ ๏ธ Error Loading Dashboard</h3>
|
|
34
|
+
<p>${escapeHtml(error)}</p>
|
|
35
|
+
<button class="btn btn-primary btn-sm" onclick="window.location.reload()">Retry</button>
|
|
36
|
+
</div>
|
|
37
|
+
`;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
28
40
|
|
|
29
41
|
if (!stats) {
|
|
30
42
|
container.innerHTML = `
|
|
31
|
-
<div class="alert alert-
|
|
32
|
-
<
|
|
43
|
+
<div class="alert alert-warning" style="margin: 20px;">
|
|
44
|
+
<h3 style="margin-top: 0;">โณ Initializing</h3>
|
|
45
|
+
<p>Dashboard is loading. Please wait...</p>
|
|
33
46
|
</div>
|
|
34
47
|
`;
|
|
35
48
|
return;
|
|
@@ -43,6 +56,15 @@ export function renderDashboard(): void {
|
|
|
43
56
|
renderDashboardContent(container, newState.stats);
|
|
44
57
|
}
|
|
45
58
|
});
|
|
59
|
+
}).catch((error) => {
|
|
60
|
+
console.error('Dashboard error:', error);
|
|
61
|
+
container.innerHTML = `
|
|
62
|
+
<div class="alert alert-danger" style="margin: 20px;">
|
|
63
|
+
<h3 style="margin-top: 0;">โ Failed to Load Dashboard</h3>
|
|
64
|
+
<p>An unexpected error occurred. Please check the console for details.</p>
|
|
65
|
+
<button class="btn btn-primary btn-sm" onclick="window.location.reload()">Reload Page</button>
|
|
66
|
+
</div>
|
|
67
|
+
`;
|
|
46
68
|
});
|
|
47
69
|
}
|
|
48
70
|
|
|
@@ -51,7 +73,7 @@ export function renderDashboard(): void {
|
|
|
51
73
|
*/
|
|
52
74
|
function renderDashboardContent(container: HTMLElement, stats: DashboardStats): void {
|
|
53
75
|
container.innerHTML = `
|
|
54
|
-
<div class="dashboard-page">
|
|
76
|
+
<div class="dashboard-page fade-in">
|
|
55
77
|
<!-- Header -->
|
|
56
78
|
<div class="page-header mb-8">
|
|
57
79
|
<h1 class="text-3xl font-bold">๐ Dashboard</h1>
|
|
@@ -88,10 +110,10 @@ function renderDashboardContent(container: HTMLElement, stats: DashboardStats):
|
|
|
88
110
|
</div>
|
|
89
111
|
<p class="text-sm text-muted">
|
|
90
112
|
${stats.diskUsagePercent < 80
|
|
91
|
-
? '
|
|
113
|
+
? 'โ
Disk usage is healthy'
|
|
92
114
|
: stats.diskUsagePercent < 90
|
|
93
115
|
? 'โ ๏ธ Disk usage is getting high'
|
|
94
|
-
: '
|
|
116
|
+
: '๐ด Disk usage is critical'}
|
|
95
117
|
</p>
|
|
96
118
|
</div>
|
|
97
119
|
</div>
|