appclean 1.9.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.
Files changed (212) hide show
  1. package/.github/workflows/npm-publish.yml +61 -0
  2. package/DEVELOPMENT.md +84 -0
  3. package/GUI_IMPLEMENTATION_STATUS.md +143 -0
  4. package/MD_Files/INDEX.md +51 -0
  5. package/PHASE2_COMPLETION.md +281 -0
  6. package/PHASE3_COMPLETION.md +364 -0
  7. package/README.md +411 -91
  8. package/RELEASE_GUIDE.md +236 -0
  9. package/assets/logo.svg +34 -0
  10. package/dist/core/appUpdateChecker.js +12 -16
  11. package/dist/core/appUpdateChecker.js.map +1 -1
  12. package/dist/core/detector.js +14 -18
  13. package/dist/core/detector.js.map +1 -1
  14. package/dist/core/duplicateFileFinder.js +12 -19
  15. package/dist/core/duplicateFileFinder.js.map +1 -1
  16. package/dist/core/orphanedDependencyDetector.js +19 -26
  17. package/dist/core/orphanedDependencyDetector.js.map +1 -1
  18. package/dist/core/performanceOptimizer.js +6 -10
  19. package/dist/core/performanceOptimizer.js.map +1 -1
  20. package/dist/core/permissionHandler.js +21 -25
  21. package/dist/core/permissionHandler.js.map +1 -1
  22. package/dist/core/pluginSystem.js +9 -13
  23. package/dist/core/pluginSystem.js.map +1 -1
  24. package/dist/core/removalRecorder.js +12 -19
  25. package/dist/core/removalRecorder.js.map +1 -1
  26. package/dist/core/remover.js +59 -66
  27. package/dist/core/remover.js.map +1 -1
  28. package/dist/core/reportGenerator.d.ts +1 -1
  29. package/dist/core/reportGenerator.d.ts.map +1 -1
  30. package/dist/core/reportGenerator.js +27 -34
  31. package/dist/core/reportGenerator.js.map +1 -1
  32. package/dist/core/scheduledCleanup.js +23 -30
  33. package/dist/core/scheduledCleanup.js.map +1 -1
  34. package/dist/core/serviceFileDetector.js +24 -31
  35. package/dist/core/serviceFileDetector.js.map +1 -1
  36. package/dist/core/verificationModule.js +10 -14
  37. package/dist/core/verificationModule.js.map +1 -1
  38. package/dist/index.js +118 -156
  39. package/dist/index.js.map +1 -1
  40. package/dist/managers/brewManager.js +30 -37
  41. package/dist/managers/brewManager.js.map +1 -1
  42. package/dist/managers/customManager.js +23 -30
  43. package/dist/managers/customManager.js.map +1 -1
  44. package/dist/managers/linuxManager.js +29 -36
  45. package/dist/managers/linuxManager.js.map +1 -1
  46. package/dist/managers/npmManager.js +27 -34
  47. package/dist/managers/npmManager.js.map +1 -1
  48. package/dist/types/index.js +1 -2
  49. package/dist/ui/client/api/client.d.ts +24 -0
  50. package/dist/ui/client/api/client.d.ts.map +1 -0
  51. package/dist/ui/client/api/client.js +100 -0
  52. package/dist/ui/client/api/client.js.map +1 -0
  53. package/dist/ui/client/app.d.ts +7 -0
  54. package/dist/ui/client/app.d.ts.map +1 -0
  55. package/dist/ui/client/app.js +75 -0
  56. package/dist/ui/client/app.js.map +1 -0
  57. package/dist/ui/client/index.html +107 -0
  58. package/dist/ui/client/pages/appDetails.d.ts +8 -0
  59. package/dist/ui/client/pages/appDetails.d.ts.map +1 -0
  60. package/dist/ui/client/pages/appDetails.js +287 -0
  61. package/dist/ui/client/pages/appDetails.js.map +1 -0
  62. package/dist/ui/client/pages/appSearch.d.ts +2 -0
  63. package/dist/ui/client/pages/appSearch.d.ts.map +1 -0
  64. package/dist/ui/client/pages/appSearch.js +221 -0
  65. package/dist/ui/client/pages/appSearch.js.map +1 -0
  66. package/dist/ui/client/pages/dashboard.d.ts +2 -0
  67. package/dist/ui/client/pages/dashboard.d.ts.map +1 -0
  68. package/dist/ui/client/pages/dashboard.js +175 -0
  69. package/dist/ui/client/pages/dashboard.js.map +1 -0
  70. package/dist/ui/client/pages/settings.d.ts +7 -0
  71. package/dist/ui/client/pages/settings.d.ts.map +1 -0
  72. package/dist/ui/client/pages/settings.js +279 -0
  73. package/dist/ui/client/pages/settings.js.map +1 -0
  74. package/dist/ui/client/state/appStore.d.ts +38 -0
  75. package/dist/ui/client/state/appStore.d.ts.map +1 -0
  76. package/dist/ui/client/state/appStore.js +130 -0
  77. package/dist/ui/client/state/appStore.js.map +1 -0
  78. package/dist/ui/client/state/dashboardStore.d.ts +31 -0
  79. package/dist/ui/client/state/dashboardStore.d.ts.map +1 -0
  80. package/dist/ui/client/state/dashboardStore.js +76 -0
  81. package/dist/ui/client/state/dashboardStore.js.map +1 -0
  82. package/dist/ui/client/state/uiStore.d.ts +43 -0
  83. package/dist/ui/client/state/uiStore.d.ts.map +1 -0
  84. package/dist/ui/client/state/uiStore.js +109 -0
  85. package/dist/ui/client/state/uiStore.js.map +1 -0
  86. package/dist/ui/client/styles/animations.css +349 -0
  87. package/dist/ui/client/styles/base.css +214 -0
  88. package/dist/ui/client/styles/components.css +400 -0
  89. package/dist/ui/client/styles/layout.css +224 -0
  90. package/dist/ui/client/styles/variables.css +140 -0
  91. package/dist/ui/client/utils/events.d.ts +19 -0
  92. package/dist/ui/client/utils/events.d.ts.map +1 -0
  93. package/dist/ui/client/utils/events.js +54 -0
  94. package/dist/ui/client/utils/events.js.map +1 -0
  95. package/dist/ui/client/utils/formatting.d.ts +11 -0
  96. package/dist/ui/client/utils/formatting.d.ts.map +1 -0
  97. package/dist/ui/client/utils/formatting.js +104 -0
  98. package/dist/ui/client/utils/formatting.js.map +1 -0
  99. package/dist/ui/client/utils/router.d.ts +25 -0
  100. package/dist/ui/client/utils/router.d.ts.map +1 -0
  101. package/dist/ui/client/utils/router.js +90 -0
  102. package/dist/ui/client/utils/router.js.map +1 -0
  103. package/dist/ui/guiServer.d.ts +11 -5
  104. package/dist/ui/guiServer.d.ts.map +1 -1
  105. package/dist/ui/guiServer.js +180 -501
  106. package/dist/ui/guiServer.js.map +1 -1
  107. package/dist/ui/menu.js +18 -27
  108. package/dist/ui/menu.js.map +1 -1
  109. package/dist/ui/prompts.js +34 -47
  110. package/dist/ui/prompts.js.map +1 -1
  111. package/dist/ui/server/middleware/errorHandler.d.ts +19 -0
  112. package/dist/ui/server/middleware/errorHandler.d.ts.map +1 -0
  113. package/dist/ui/server/middleware/errorHandler.js +100 -0
  114. package/dist/ui/server/middleware/errorHandler.js.map +1 -0
  115. package/dist/ui/server/routes/apps.d.ts +8 -0
  116. package/dist/ui/server/routes/apps.d.ts.map +1 -0
  117. package/dist/ui/server/routes/apps.js +74 -0
  118. package/dist/ui/server/routes/apps.js.map +1 -0
  119. package/dist/ui/server/routes/dashboard.d.ts +4 -0
  120. package/dist/ui/server/routes/dashboard.d.ts.map +1 -0
  121. package/dist/ui/server/routes/dashboard.js +57 -0
  122. package/dist/ui/server/routes/dashboard.js.map +1 -0
  123. package/dist/ui/server/routes/settings.d.ts +6 -0
  124. package/dist/ui/server/routes/settings.d.ts.map +1 -0
  125. package/dist/ui/server/routes/settings.js +31 -0
  126. package/dist/ui/server/routes/settings.js.map +1 -0
  127. package/dist/ui/server/services/appService.d.ts +45 -0
  128. package/dist/ui/server/services/appService.d.ts.map +1 -0
  129. package/dist/ui/server/services/appService.js +114 -0
  130. package/dist/ui/server/services/appService.js.map +1 -0
  131. package/dist/ui/server/services/removalService.d.ts +24 -0
  132. package/dist/ui/server/services/removalService.d.ts.map +1 -0
  133. package/dist/ui/server/services/removalService.js +83 -0
  134. package/dist/ui/server/services/removalService.js.map +1 -0
  135. package/dist/utils/filesystem.js +32 -49
  136. package/dist/utils/filesystem.js.map +1 -1
  137. package/dist/utils/logger.js +9 -18
  138. package/dist/utils/logger.js.map +1 -1
  139. package/dist/utils/platform.js +10 -22
  140. package/dist/utils/platform.js.map +1 -1
  141. package/dist/utils/upgrade.d.ts +2 -1
  142. package/dist/utils/upgrade.d.ts.map +1 -1
  143. package/dist/utils/upgrade.js +24 -15
  144. package/dist/utils/upgrade.js.map +1 -1
  145. package/package.json +4 -2
  146. package/scripts/publish-npm.sh +64 -0
  147. package/src/core/appUpdateChecker.ts +1 -1
  148. package/src/core/detector.ts +6 -6
  149. package/src/core/duplicateFileFinder.ts +1 -1
  150. package/src/core/orphanedDependencyDetector.ts +2 -2
  151. package/src/core/performanceOptimizer.ts +1 -1
  152. package/src/core/permissionHandler.ts +2 -2
  153. package/src/core/pluginSystem.ts +1 -1
  154. package/src/core/removalRecorder.ts +2 -2
  155. package/src/core/remover.ts +11 -11
  156. package/src/core/reportGenerator.ts +2 -2
  157. package/src/core/scheduledCleanup.ts +2 -2
  158. package/src/core/serviceFileDetector.ts +2 -2
  159. package/src/core/verificationModule.ts +2 -2
  160. package/src/index.ts +8 -8
  161. package/src/managers/brewManager.ts +3 -3
  162. package/src/managers/customManager.ts +2 -2
  163. package/src/managers/linuxManager.ts +3 -3
  164. package/src/managers/npmManager.ts +3 -3
  165. package/src/ui/client/api/client.ts +168 -0
  166. package/src/ui/client/app.ts +125 -0
  167. package/src/ui/client/index.html +107 -0
  168. package/src/ui/client/pages/appDetails.ts +356 -0
  169. package/src/ui/client/pages/appSearch.ts +283 -0
  170. package/src/ui/client/pages/dashboard.ts +211 -0
  171. package/src/ui/client/pages/settings.ts +342 -0
  172. package/src/ui/client/state/appStore.ts +181 -0
  173. package/src/ui/client/state/dashboardStore.ts +123 -0
  174. package/src/ui/client/state/uiStore.ts +166 -0
  175. package/src/ui/client/styles/animations.css +349 -0
  176. package/src/ui/client/styles/base.css +214 -0
  177. package/src/ui/client/styles/components.css +400 -0
  178. package/src/ui/client/styles/layout.css +224 -0
  179. package/src/ui/client/styles/variables.css +140 -0
  180. package/src/ui/client/utils/events.ts +74 -0
  181. package/src/ui/client/utils/formatting.ts +157 -0
  182. package/src/ui/client/utils/router.ts +161 -0
  183. package/src/ui/guiServer.ts +245 -498
  184. package/src/ui/prompts.ts +1 -1
  185. package/src/ui/server/middleware/errorHandler.ts +174 -0
  186. package/src/ui/server/routes/apps.ts +132 -0
  187. package/src/ui/server/routes/dashboard.ts +93 -0
  188. package/src/ui/server/routes/settings.ts +63 -0
  189. package/src/ui/server/services/appService.ts +184 -0
  190. package/src/ui/server/services/removalService.ts +138 -0
  191. package/src/utils/upgrade.ts +19 -2
  192. package/tsconfig.json +3 -2
  193. package/INDEX.md +0 -165
  194. /package/{ACTION_CHECKLIST.md → MD_Files/ACTION_CHECKLIST.md} +0 -0
  195. /package/{APPCLEAN_SUMMARY.md → MD_Files/APPCLEAN_SUMMARY.md} +0 -0
  196. /package/{CHANGELOG.md → MD_Files/CHANGELOG.md} +0 -0
  197. /package/{CODE_OF_CONDUCT.md → MD_Files/CODE_OF_CONDUCT.md} +0 -0
  198. /package/{CODE_REVIEW_REPORT.md → MD_Files/CODE_REVIEW_REPORT.md} +0 -0
  199. /package/{COMMUNITY_POSTS.md → MD_Files/COMMUNITY_POSTS.md} +0 -0
  200. /package/{DEPLOYMENT_GUIDE.md → MD_Files/DEPLOYMENT_GUIDE.md} +0 -0
  201. /package/{DEPLOYMENT_STATUS.md → MD_Files/DEPLOYMENT_STATUS.md} +0 -0
  202. /package/{EXECUTIVE_REPORT.md → MD_Files/EXECUTIVE_REPORT.md} +0 -0
  203. /package/{GITHUB_OPTIMIZATION.md → MD_Files/GITHUB_OPTIMIZATION.md} +0 -0
  204. /package/{MARKETING_SUMMARY.md → MD_Files/MARKETING_SUMMARY.md} +0 -0
  205. /package/{NPM_PACKAGE_OPTIMIZATION.md → MD_Files/NPM_PACKAGE_OPTIMIZATION.md} +0 -0
  206. /package/{NPM_PUBLISH.md → MD_Files/NPM_PUBLISH.md} +0 -0
  207. /package/{PROJECT_SUMMARY.txt → MD_Files/PROJECT_SUMMARY.txt} +0 -0
  208. /package/{PUBLICATION_SUCCESS_REPORT.md → MD_Files/PUBLICATION_SUCCESS_REPORT.md} +0 -0
  209. /package/{QUICKSTART.md → MD_Files/QUICKSTART.md} +0 -0
  210. /package/{SETUP_GITHUB.md → MD_Files/SETUP_GITHUB.md} +0 -0
  211. /package/{TESTING_SUMMARY.md → MD_Files/TESTING_SUMMARY.md} +0 -0
  212. /package/{setup-github.sh → MD_Files/setup-github.sh} +0 -0
@@ -0,0 +1,287 @@
1
+ import { apiClient } from '../api/client.js';
2
+ import { dashboardStore } from '../state/dashboardStore.js';
3
+ import { uiStore } from '../state/uiStore.js';
4
+ import { formatBytes, formatInstallMethod, getMethodBadgeColor } from '../utils/formatting.js';
5
+ export async function renderAppDetails(appName) {
6
+ const container = document.getElementById('page-container');
7
+ if (!container)
8
+ return;
9
+ container.innerHTML = `
10
+ <div class="loading-state" style="text-align: center; padding: 60px 20px;">
11
+ <div class="spinner-lg spinner"></div>
12
+ <p class="text-center text-muted mt-4">Analyzing ${escapeHtml(appName)}...</p>
13
+ </div>
14
+ `;
15
+ try {
16
+ const analysis = await apiClient.get(`/api/apps/${encodeURIComponent(appName)}/analysis`);
17
+ renderAppDetailsContent(container, analysis, appName);
18
+ }
19
+ catch (error) {
20
+ container.innerHTML = `
21
+ <div class="alert alert-danger">
22
+ <span>Failed to load app details: ${escapeHtml(error.message)}</span>
23
+ </div>
24
+ <button class="btn btn-secondary mt-4" onclick="window.location.hash = '#/apps'">
25
+ ← Back to Apps
26
+ </button>
27
+ `;
28
+ }
29
+ }
30
+ function renderAppDetailsContent(container, analysis, appName) {
31
+ const { app, artifacts, totalSize, breakdown } = analysis;
32
+ container.innerHTML = `
33
+ <div class="app-details-page">
34
+ <!-- Header -->
35
+ <div class="flex-between items-start mb-8">
36
+ <div class="flex-1">
37
+ <button class="btn btn-ghost mb-4" onclick="window.location.hash = '#/apps'">
38
+ ← Back to Apps
39
+ </button>
40
+ <h1 class="text-3xl font-bold">${escapeHtml(app.name)}</h1>
41
+ <div class="flex gap-2 items-center mt-3">
42
+ <span class="badge ${getMethodBadgeColor(app.installMethod)}">
43
+ ${formatInstallMethod(app.installMethod)}
44
+ </span>
45
+ <span class="text-muted">v${escapeHtml(app.version || 'unknown')}</span>
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+ <!-- Stats -->
51
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-8">
52
+ ${renderStatCard('Total Size', formatBytes(totalSize))}
53
+ ${renderStatCard('Files & Dirs', artifacts.length.toString())}
54
+ ${renderStatCard('Install Method', formatInstallMethod(app.installMethod))}
55
+ </div>
56
+
57
+ <!-- Size Breakdown -->
58
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
59
+ <div class="card">
60
+ <div class="card-header">
61
+ <h2 class="text-lg font-bold">📊 Size Breakdown</h2>
62
+ </div>
63
+ <div class="card-body">
64
+ ${renderBreakdownChart(breakdown)}
65
+ </div>
66
+ </div>
67
+
68
+ <div class="card">
69
+ <div class="card-header">
70
+ <h2 class="text-lg font-bold">📈 By Category</h2>
71
+ </div>
72
+ <div class="card-body">
73
+ ${renderBreakdownTable(breakdown)}
74
+ </div>
75
+ </div>
76
+ </div>
77
+
78
+ <!-- Artifacts Table -->
79
+ <div class="card mb-8">
80
+ <div class="card-header">
81
+ <h2 class="text-lg font-bold">📂 Artifacts (${artifacts.length})</h2>
82
+ </div>
83
+ <div class="card-body overflow-x-auto">
84
+ ${renderArtifactsTable(artifacts)}
85
+ </div>
86
+ </div>
87
+
88
+ <!-- Action Buttons -->
89
+ <div class="flex gap-3">
90
+ <button class="btn btn-primary btn-lg flex-1" id="preview-btn">
91
+ 👁️ Preview Removal
92
+ </button>
93
+ <button class="btn btn-danger btn-lg flex-1" id="remove-btn">
94
+ 🗑️ Remove App
95
+ </button>
96
+ <button class="btn btn-secondary btn-lg" onclick="window.location.hash = '#/apps'">
97
+ Cancel
98
+ </button>
99
+ </div>
100
+
101
+ <!-- Preview Section (hidden) -->
102
+ <div id="preview-section" style="display: none; margin-top: 30px;">
103
+ <div class="alert alert-warning mb-4">
104
+ <span>This is a preview. No files will be deleted.</span>
105
+ </div>
106
+ <div class="card">
107
+ <div class="card-header">
108
+ <h3 class="text-lg font-bold">Files to Remove</h3>
109
+ </div>
110
+ <div class="card-body overflow-x-auto" id="preview-content">
111
+ </div>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ `;
116
+ setupAppDetailsListeners(appName, totalSize, artifacts);
117
+ window.scrollTo(0, 0);
118
+ }
119
+ function renderStatCard(label, value) {
120
+ return `
121
+ <div class="card">
122
+ <div class="card-body text-center">
123
+ <p class="text-muted text-sm mb-1">${escapeHtml(label)}</p>
124
+ <p class="text-2xl font-bold">${escapeHtml(value)}</p>
125
+ </div>
126
+ </div>
127
+ `;
128
+ }
129
+ function renderBreakdownChart(breakdown) {
130
+ const total = Object.values(breakdown).reduce((a, b) => a + b, 0);
131
+ if (total === 0)
132
+ return '<p class="text-muted">No size data available</p>';
133
+ const colors = {
134
+ binaries: '#3b82f6',
135
+ configs: '#10b981',
136
+ caches: '#f59e0b',
137
+ data: '#8b5cf6',
138
+ logs: '#ec4899',
139
+ other: '#6b7280',
140
+ };
141
+ let percent = 0;
142
+ const stops = Object.entries(breakdown)
143
+ .filter(([_, size]) => size > 0)
144
+ .map(([category, size]) => {
145
+ const categoryPercent = (size / total) * 100;
146
+ const start = percent;
147
+ percent += categoryPercent;
148
+ return `${colors[category] || '#666'} ${start}% ${percent}%`;
149
+ })
150
+ .join(',');
151
+ return `
152
+ <div style="
153
+ width: 200px;
154
+ height: 200px;
155
+ border-radius: 50%;
156
+ background: conic-gradient(${stops});
157
+ margin: 0 auto;
158
+ "></div>
159
+ `;
160
+ }
161
+ function renderBreakdownTable(breakdown) {
162
+ const categories = [
163
+ { key: 'binaries', label: 'Binaries' },
164
+ { key: 'configs', label: 'Configs' },
165
+ { key: 'caches', label: 'Caches' },
166
+ { key: 'data', label: 'Data' },
167
+ { key: 'logs', label: 'Logs' },
168
+ { key: 'other', label: 'Other' },
169
+ ];
170
+ return `
171
+ <table style="width: 100%; font-size: 14px;">
172
+ <tbody>
173
+ ${categories
174
+ .map(({ key, label }) => `
175
+ <tr style="border-bottom: 1px solid var(--border-color); padding: 8px 0;">
176
+ <td style="padding: 8px 0;">${label}</td>
177
+ <td style="text-align: right; font-weight: 600;">${formatBytes(breakdown[key] || 0)}</td>
178
+ </tr>
179
+ `)
180
+ .join('')}
181
+ </tbody>
182
+ </table>
183
+ `;
184
+ }
185
+ function renderArtifactsTable(artifacts) {
186
+ if (artifacts.length === 0) {
187
+ return '<p class="text-muted">No artifacts found</p>';
188
+ }
189
+ return `
190
+ <table style="width: 100%; font-size: 13px;">
191
+ <thead style="border-bottom: 2px solid var(--border-color);">
192
+ <tr>
193
+ <th style="text-align: left; padding: 8px; font-weight: 600;">Path</th>
194
+ <th style="text-align: right; padding: 8px; font-weight: 600; width: 100px;">Size</th>
195
+ </tr>
196
+ </thead>
197
+ <tbody>
198
+ ${artifacts
199
+ .slice(0, 20)
200
+ .map((artifact) => `
201
+ <tr style="border-bottom: 1px solid var(--border-color); padding: 8px 0;">
202
+ <td style="padding: 8px; word-break: break-all;">
203
+ <code style="font-size: 12px; color: var(--text-muted);">
204
+ ${escapeHtml(artifact.path)}
205
+ </code>
206
+ </td>
207
+ <td style="text-align: right; padding: 8px; white-space: nowrap;">
208
+ ${formatBytes(artifact.size || 0)}
209
+ </td>
210
+ </tr>
211
+ `)
212
+ .join('')}
213
+ </tbody>
214
+ </table>
215
+ ${artifacts.length > 20 ? `<p class="text-muted text-sm mt-4">... and ${artifacts.length - 20} more files</p>` : ''}
216
+ `;
217
+ }
218
+ function setupAppDetailsListeners(appName, totalSize, artifacts) {
219
+ const previewBtn = document.getElementById('preview-btn');
220
+ const removeBtn = document.getElementById('remove-btn');
221
+ const previewSection = document.getElementById('preview-section');
222
+ const previewContent = document.getElementById('preview-content');
223
+ if (previewBtn) {
224
+ previewBtn.addEventListener('click', async () => {
225
+ if (previewSection?.style.display === 'none') {
226
+ previewSection.style.display = 'block';
227
+ previewBtn.textContent = '👁️ Hide Preview';
228
+ if (previewContent) {
229
+ previewContent.innerHTML = `
230
+ <p class="text-sm text-muted mb-4">
231
+ This will remove <strong>${artifacts.length} files and directories</strong>,
232
+ freeing <strong>${formatBytes(totalSize)}</strong> of disk space.
233
+ </p>
234
+ ${renderArtifactsTable(artifacts)}
235
+ `;
236
+ }
237
+ }
238
+ else {
239
+ previewSection.style.display = 'none';
240
+ previewBtn.textContent = '👁️ Preview Removal';
241
+ }
242
+ });
243
+ }
244
+ if (removeBtn) {
245
+ removeBtn.addEventListener('click', async () => {
246
+ const confirmed = confirm(`Are you sure you want to remove "${appName}"?\n\nThis will delete ${artifacts.length} files and free ${formatBytes(totalSize)}.`);
247
+ if (!confirmed)
248
+ return;
249
+ uiStore.setProcessing(true);
250
+ removeBtn.disabled = true;
251
+ try {
252
+ const result = await apiClient.post(`/api/apps/${encodeURIComponent(appName)}/remove`, {
253
+ dryRun: false,
254
+ createBackup: true,
255
+ });
256
+ uiStore.showSuccess(`Successfully removed ${appName}!`);
257
+ dashboardStore.addRemovalRecord({
258
+ appName,
259
+ timestamp: Date.now(),
260
+ freedSpace: result.freedSpace,
261
+ filesRemoved: result.removedFiles,
262
+ });
263
+ setTimeout(() => {
264
+ window.location.hash = '#/';
265
+ }, 2000);
266
+ }
267
+ catch (error) {
268
+ uiStore.showError(`Failed to remove app: ${error.message}`);
269
+ removeBtn.disabled = false;
270
+ }
271
+ finally {
272
+ uiStore.setProcessing(false);
273
+ }
274
+ });
275
+ }
276
+ }
277
+ function escapeHtml(text) {
278
+ const map = {
279
+ '&': '&amp;',
280
+ '<': '&lt;',
281
+ '>': '&gt;',
282
+ '"': '&quot;',
283
+ "'": '&#039;',
284
+ };
285
+ return String(text).replace(/[&<>"']/g, (m) => map[m]);
286
+ }
287
+ //# sourceMappingURL=appDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appDetails.js","sourceRoot":"","sources":["../../../../src/ui/client/pages/appDetails.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function renderAppSearch(): void;
2
+ //# sourceMappingURL=appSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appSearch.d.ts","sourceRoot":"","sources":["../../../../src/ui/client/pages/appSearch.ts"],"names":[],"mappings":"AAWA,wBAAgB,eAAe,IAAI,IAAI,CAuBtC"}
@@ -0,0 +1,221 @@
1
+ import { appStore } from '../state/appStore.js';
2
+ import { formatBytes, getMethodBadgeColor, formatInstallMethod, debounce } from '../utils/formatting.js';
3
+ export function renderAppSearch() {
4
+ const container = document.getElementById('page-container');
5
+ if (!container)
6
+ return;
7
+ container.innerHTML = `
8
+ <div class="loading-state" style="text-align: center; padding: 60px 20px;">
9
+ <div class="spinner-lg spinner"></div>
10
+ <p class="text-center text-muted mt-4">Loading apps...</p>
11
+ </div>
12
+ `;
13
+ appStore.loadApps().then(() => {
14
+ renderAppSearchContent(container);
15
+ appStore.subscribe((state) => {
16
+ if (!state.isLoading) {
17
+ renderAppSearchContent(container);
18
+ }
19
+ });
20
+ });
21
+ }
22
+ function renderAppSearchContent(container) {
23
+ const state = appStore.getState();
24
+ if (!state || !state.apps) {
25
+ console.error('AppStore state is invalid:', state);
26
+ container.innerHTML = `
27
+ <div class="alert alert-danger">
28
+ <h3>Error Loading Apps</h3>
29
+ <p>Failed to load application state. Please refresh the page.</p>
30
+ <button class="btn btn-primary btn-sm mt-4" onclick="window.location.reload()">Reload</button>
31
+ </div>
32
+ `;
33
+ return;
34
+ }
35
+ container.innerHTML = `
36
+ <div class="app-search-page">
37
+ <!-- Header -->
38
+ <div class="page-header mb-8">
39
+ <h1 class="text-3xl font-bold">📦 Applications</h1>
40
+ <p class="text-secondary mt-2">Search and manage installed apps</p>
41
+ </div>
42
+
43
+ <!-- Search and Filters -->
44
+ <div class="card mb-6">
45
+ <div class="card-body">
46
+ <!-- Search Input -->
47
+ <div class="form-group">
48
+ <input
49
+ type="text"
50
+ id="search-input"
51
+ class="form-input"
52
+ placeholder="Search apps by name..."
53
+ value="${escapeHtml(state.searchOptions.query)}"
54
+ autocomplete="off"
55
+ >
56
+ </div>
57
+
58
+ <!-- Filters Row -->
59
+ <div class="flex flex-wrap gap-2 items-center">
60
+ <span class="text-sm font-medium text-muted">Method:</span>
61
+ ${renderMethodFilter(state.searchOptions.installMethod || '')}
62
+
63
+ <span class="text-sm font-medium text-muted ml-4">Sort:</span>
64
+ ${renderSortFilter(state.searchOptions.sortBy || 'name')}
65
+ </div>
66
+
67
+ <!-- Results Count -->
68
+ <p class="text-sm text-muted mt-4">
69
+ ${state.isLoading ? 'Loading...' : `${state.total} app${state.total !== 1 ? 's' : ''} found`}
70
+ </p>
71
+ </div>
72
+ </div>
73
+
74
+ <!-- Apps Grid -->
75
+ <div class="apps-grid">
76
+ ${(state.apps && state.apps.length > 0)
77
+ ? `
78
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
79
+ ${state.apps.map((app) => renderAppCard(app)).join('')}
80
+ </div>
81
+ `
82
+ : `
83
+ <div class="card">
84
+ <div class="card-body text-center py-12">
85
+ <p class="text-2xl mb-2">🔍</p>
86
+ <p class="text-lg font-medium">No apps found</p>
87
+ <p class="text-muted mt-2">
88
+ ${state.searchOptions.query ? 'Try a different search query' : 'No applications detected'}
89
+ </p>
90
+ </div>
91
+ </div>
92
+ `}
93
+ </div>
94
+
95
+ <!-- Load More Button -->
96
+ ${state.apps.length < state.total
97
+ ? `
98
+ <div class="text-center mt-8">
99
+ <button class="btn btn-secondary" id="load-more-btn">
100
+ Load More (${state.apps.length} of ${state.total})
101
+ </button>
102
+ </div>
103
+ `
104
+ : ''}
105
+ </div>
106
+ `;
107
+ setupSearchListeners();
108
+ setupLoadMoreListener();
109
+ window.scrollTo(0, 0);
110
+ }
111
+ function renderAppCard(app) {
112
+ return `
113
+ <div class="card app-card hover-lift cursor-pointer" onclick="window.location.hash = '#/apps/${encodeURIComponent(app.name)}'">
114
+ <div class="card-body">
115
+ <div class="flex-between mb-2">
116
+ <h3 class="text-lg font-bold">${escapeHtml(app.name)}</h3>
117
+ <span class="badge ${getMethodBadgeColor(app.installMethod)}">
118
+ ${formatInstallMethod(app.installMethod)}
119
+ </span>
120
+ </div>
121
+
122
+ <p class="text-sm text-muted mb-3">
123
+ ${app.version ? `v${escapeHtml(app.version)}` : 'Version unknown'}
124
+ </p>
125
+
126
+ <div class="flex-between pt-3 border-t border-color">
127
+ <span class="text-sm text-muted">
128
+ ${app.size ? formatBytes(app.size) : 'Size unknown'}
129
+ </span>
130
+ <button
131
+ class="btn btn-sm btn-ghost-primary"
132
+ onclick="
133
+ event.stopPropagation();
134
+ window.location.hash = '#/apps/${encodeURIComponent(app.name)}';
135
+ "
136
+ >
137
+ Details →
138
+ </button>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ `;
143
+ }
144
+ function renderMethodFilter(selected) {
145
+ const methods = ['', 'npm', 'yarn', 'pnpm', 'brew', 'apt', 'yum', 'dnf', 'custom'];
146
+ const labels = {
147
+ '': 'All',
148
+ 'npm': 'npm',
149
+ 'yarn': 'Yarn',
150
+ 'pnpm': 'pnpm',
151
+ 'brew': 'Homebrew',
152
+ 'apt': 'apt',
153
+ 'yum': 'yum',
154
+ 'dnf': 'dnf',
155
+ 'custom': 'Custom',
156
+ };
157
+ return methods
158
+ .map((method) => `
159
+ <button
160
+ class="btn btn-sm ${method === selected ? 'btn-primary' : 'btn-ghost'} method-filter"
161
+ data-method="${method}"
162
+ >
163
+ ${labels[method]}
164
+ </button>
165
+ `)
166
+ .join('');
167
+ }
168
+ function renderSortFilter(selected) {
169
+ return `
170
+ <select id="sort-select" class="form-input" style="width: auto;">
171
+ <option value="name" ${selected === 'name' ? 'selected' : ''}>Name (A-Z)</option>
172
+ <option value="size" ${selected === 'size' ? 'selected' : ''}>Size (Largest)</option>
173
+ <option value="date" ${selected === 'date' ? 'selected' : ''}>Date (Newest)</option>
174
+ </select>
175
+ `;
176
+ }
177
+ function setupSearchListeners() {
178
+ const searchInput = document.getElementById('search-input');
179
+ const methodButtons = document.querySelectorAll('.method-filter');
180
+ const sortSelect = document.getElementById('sort-select');
181
+ const debouncedSearch = debounce((query) => {
182
+ appStore.setSearchQuery(query);
183
+ }, 300);
184
+ if (searchInput) {
185
+ searchInput.addEventListener('input', (e) => {
186
+ const query = e.target.value;
187
+ debouncedSearch(query);
188
+ });
189
+ }
190
+ methodButtons.forEach((btn) => {
191
+ btn.addEventListener('click', () => {
192
+ const method = btn.getAttribute('data-method');
193
+ appStore.setInstallMethodFilter(method || undefined);
194
+ });
195
+ });
196
+ if (sortSelect) {
197
+ sortSelect.addEventListener('change', (e) => {
198
+ const sort = e.target.value;
199
+ appStore.setSortBy(sort);
200
+ });
201
+ }
202
+ }
203
+ function setupLoadMoreListener() {
204
+ const loadMoreBtn = document.getElementById('load-more-btn');
205
+ if (loadMoreBtn) {
206
+ loadMoreBtn.addEventListener('click', () => {
207
+ appStore.loadNextPage();
208
+ });
209
+ }
210
+ }
211
+ function escapeHtml(text) {
212
+ const map = {
213
+ '&': '&amp;',
214
+ '<': '&lt;',
215
+ '>': '&gt;',
216
+ '"': '&quot;',
217
+ "'": '&#039;',
218
+ };
219
+ return text.replace(/[&<>"']/g, (m) => map[m]);
220
+ }
221
+ //# sourceMappingURL=appSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appSearch.js","sourceRoot":"","sources":["../../../../src/ui/client/pages/appSearch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAA+B,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAKzG,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC5D,IAAI,CAAC,SAAS;QAAE,OAAO;IAGvB,SAAS,CAAC,SAAS,GAAG;;;;;GAKrB,CAAC;IAGF,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAC5B,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAGlC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAKD,SAAS,sBAAsB,CAAC,SAAsB;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAGlC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,SAAS,CAAC,SAAS,GAAG;;;;;;KAMrB,CAAC;QACF,OAAO;IACT,CAAC;IAED,SAAS,CAAC,SAAS,GAAG;;;;;;;;;;;;;;;;;;uBAkBD,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;;;;;;;;cAQ9C,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,IAAI,EAAE,CAAC;;;cAG3D,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,IAAI,MAAM,CAAC;;;;;cAKtD,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ;;;;;;;UAQ9F,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC;;cAEA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;SAEzD;QACG,CAAC,CAAC;;;;;;kBAMI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,0BAA0B;;;;SAKjG;;;;QAKA,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK;QAC7B,CAAC,CAAC;;;yBAGa,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,KAAK,CAAC,KAAK;;;OAGrD;QACG,CAAC,CAAC,EACN;;GAEH,CAAC;IAGF,oBAAoB,EAAE,CAAC;IACvB,qBAAqB,EAAE,CAAC;IAGxB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC;AAKD,SAAS,aAAa,CAAC,GAAiB;IACtC,OAAO;mGAC0F,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;;0CAGrF,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;+BAC/B,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC;cACvD,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC;;;;;YAKxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB;;;;;cAK7D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc;;;;;;+CAMhB,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;;;;;;;GAQxE,CAAC;AACJ,CAAC;AAKD,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,OAAO,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnF,MAAM,MAAM,GAA2B;QACrC,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,QAAQ;KACnB,CAAC;IAEF,OAAO,OAAO;SACX,GAAG,CACF,CAAC,MAAM,EAAE,EAAE,CAAC;;0BAEQ,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;qBACtD,MAAM;;QAEnB,MAAM,CAAC,MAAM,CAAC;;GAEnB,CACE;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAKD,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO;;6BAEoB,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;6BACrC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;6BACrC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;GAE/D,CAAC;AACJ,CAAC;AAKD,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAqB,CAAC;IAChF,MAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAsB,CAAC;IAG/E,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,KAAa,EAAE,EAAE;QACjD,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,EAAE,GAAG,CAAC,CAAC;IAER,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC;YACnD,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAGD,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACjC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,QAAQ,CAAC,sBAAsB,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAGH,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1C,MAAM,IAAI,GAAI,CAAC,CAAC,MAA4B,CAAC,KAAY,CAAC;YAC1D,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAKD,SAAS,qBAAqB;IAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC7D,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACzC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAKD,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,GAAG,GAA2B;QAClC,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,QAAQ;KACd,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function renderDashboard(): void;
2
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../../src/ui/client/pages/dashboard.ts"],"names":[],"mappings":"AAWA,wBAAgB,eAAe,IAAI,IAAI,CAyDtC"}