squeaky-clean 0.1.1

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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +465 -0
  3. package/dist/cleaners/BaseCleaner.d.ts +57 -0
  4. package/dist/cleaners/BaseCleaner.d.ts.map +1 -0
  5. package/dist/cleaners/BaseCleaner.js +299 -0
  6. package/dist/cleaners/BaseCleaner.js.map +1 -0
  7. package/dist/cleaners/CleanerRegistry.d.ts +65 -0
  8. package/dist/cleaners/CleanerRegistry.d.ts.map +1 -0
  9. package/dist/cleaners/CleanerRegistry.js +112 -0
  10. package/dist/cleaners/CleanerRegistry.js.map +1 -0
  11. package/dist/cleaners/androidstudio.d.ts +16 -0
  12. package/dist/cleaners/androidstudio.d.ts.map +1 -0
  13. package/dist/cleaners/androidstudio.js +375 -0
  14. package/dist/cleaners/androidstudio.js.map +1 -0
  15. package/dist/cleaners/brew.d.ts +4 -0
  16. package/dist/cleaners/brew.d.ts.map +1 -0
  17. package/dist/cleaners/brew.js +197 -0
  18. package/dist/cleaners/brew.js.map +1 -0
  19. package/dist/cleaners/brewEnhanced.d.ts +18 -0
  20. package/dist/cleaners/brewEnhanced.d.ts.map +1 -0
  21. package/dist/cleaners/brewEnhanced.js +255 -0
  22. package/dist/cleaners/brewEnhanced.js.map +1 -0
  23. package/dist/cleaners/bun.d.ts +14 -0
  24. package/dist/cleaners/bun.d.ts.map +1 -0
  25. package/dist/cleaners/bun.js +207 -0
  26. package/dist/cleaners/bun.js.map +1 -0
  27. package/dist/cleaners/chrome.d.ts +14 -0
  28. package/dist/cleaners/chrome.d.ts.map +1 -0
  29. package/dist/cleaners/chrome.js +250 -0
  30. package/dist/cleaners/chrome.js.map +1 -0
  31. package/dist/cleaners/docker.d.ts +35 -0
  32. package/dist/cleaners/docker.d.ts.map +1 -0
  33. package/dist/cleaners/docker.js +285 -0
  34. package/dist/cleaners/docker.js.map +1 -0
  35. package/dist/cleaners/firefox.d.ts +15 -0
  36. package/dist/cleaners/firefox.d.ts.map +1 -0
  37. package/dist/cleaners/firefox.js +281 -0
  38. package/dist/cleaners/firefox.js.map +1 -0
  39. package/dist/cleaners/flutter.d.ts +18 -0
  40. package/dist/cleaners/flutter.d.ts.map +1 -0
  41. package/dist/cleaners/flutter.js +354 -0
  42. package/dist/cleaners/flutter.js.map +1 -0
  43. package/dist/cleaners/goBuild.d.ts +18 -0
  44. package/dist/cleaners/goBuild.d.ts.map +1 -0
  45. package/dist/cleaners/goBuild.js +196 -0
  46. package/dist/cleaners/goBuild.js.map +1 -0
  47. package/dist/cleaners/gradle.d.ts +14 -0
  48. package/dist/cleaners/gradle.d.ts.map +1 -0
  49. package/dist/cleaners/gradle.js +336 -0
  50. package/dist/cleaners/gradle.js.map +1 -0
  51. package/dist/cleaners/index.d.ts +51 -0
  52. package/dist/cleaners/index.d.ts.map +1 -0
  53. package/dist/cleaners/index.js +247 -0
  54. package/dist/cleaners/index.js.map +1 -0
  55. package/dist/cleaners/jetbrains.d.ts +18 -0
  56. package/dist/cleaners/jetbrains.d.ts.map +1 -0
  57. package/dist/cleaners/jetbrains.js +441 -0
  58. package/dist/cleaners/jetbrains.js.map +1 -0
  59. package/dist/cleaners/nix.d.ts +4 -0
  60. package/dist/cleaners/nix.d.ts.map +1 -0
  61. package/dist/cleaners/nix.js +227 -0
  62. package/dist/cleaners/nix.js.map +1 -0
  63. package/dist/cleaners/nodeGyp.d.ts +14 -0
  64. package/dist/cleaners/nodeGyp.d.ts.map +1 -0
  65. package/dist/cleaners/nodeGyp.js +157 -0
  66. package/dist/cleaners/nodeGyp.js.map +1 -0
  67. package/dist/cleaners/npm.d.ts +14 -0
  68. package/dist/cleaners/npm.d.ts.map +1 -0
  69. package/dist/cleaners/npm.js +198 -0
  70. package/dist/cleaners/npm.js.map +1 -0
  71. package/dist/cleaners/npmEnhanced.d.ts +19 -0
  72. package/dist/cleaners/npmEnhanced.d.ts.map +1 -0
  73. package/dist/cleaners/npmEnhanced.js +336 -0
  74. package/dist/cleaners/npmEnhanced.js.map +1 -0
  75. package/dist/cleaners/nx.d.ts +18 -0
  76. package/dist/cleaners/nx.d.ts.map +1 -0
  77. package/dist/cleaners/nx.js +308 -0
  78. package/dist/cleaners/nx.js.map +1 -0
  79. package/dist/cleaners/pip.d.ts +19 -0
  80. package/dist/cleaners/pip.d.ts.map +1 -0
  81. package/dist/cleaners/pip.js +334 -0
  82. package/dist/cleaners/pip.js.map +1 -0
  83. package/dist/cleaners/pnpm.d.ts +14 -0
  84. package/dist/cleaners/pnpm.d.ts.map +1 -0
  85. package/dist/cleaners/pnpm.js +209 -0
  86. package/dist/cleaners/pnpm.js.map +1 -0
  87. package/dist/cleaners/turbo.d.ts +18 -0
  88. package/dist/cleaners/turbo.d.ts.map +1 -0
  89. package/dist/cleaners/turbo.js +325 -0
  90. package/dist/cleaners/turbo.js.map +1 -0
  91. package/dist/cleaners/vite.d.ts +17 -0
  92. package/dist/cleaners/vite.d.ts.map +1 -0
  93. package/dist/cleaners/vite.js +274 -0
  94. package/dist/cleaners/vite.js.map +1 -0
  95. package/dist/cleaners/vscode.d.ts +14 -0
  96. package/dist/cleaners/vscode.d.ts.map +1 -0
  97. package/dist/cleaners/vscode.js +354 -0
  98. package/dist/cleaners/vscode.js.map +1 -0
  99. package/dist/cleaners/webpack.d.ts +17 -0
  100. package/dist/cleaners/webpack.d.ts.map +1 -0
  101. package/dist/cleaners/webpack.js +263 -0
  102. package/dist/cleaners/webpack.js.map +1 -0
  103. package/dist/cleaners/xcode.d.ts +14 -0
  104. package/dist/cleaners/xcode.d.ts.map +1 -0
  105. package/dist/cleaners/xcode.js +348 -0
  106. package/dist/cleaners/xcode.js.map +1 -0
  107. package/dist/cleaners/yarn.d.ts +16 -0
  108. package/dist/cleaners/yarn.d.ts.map +1 -0
  109. package/dist/cleaners/yarn.js +266 -0
  110. package/dist/cleaners/yarn.js.map +1 -0
  111. package/dist/cli.d.ts +3 -0
  112. package/dist/cli.d.ts.map +1 -0
  113. package/dist/cli.js +346 -0
  114. package/dist/cli.js.map +1 -0
  115. package/dist/commands/auto.d.ts +8 -0
  116. package/dist/commands/auto.d.ts.map +1 -0
  117. package/dist/commands/auto.js +224 -0
  118. package/dist/commands/auto.js.map +1 -0
  119. package/dist/commands/categories.d.ts +8 -0
  120. package/dist/commands/categories.d.ts.map +1 -0
  121. package/dist/commands/categories.js +133 -0
  122. package/dist/commands/categories.js.map +1 -0
  123. package/dist/commands/clean.d.ts +3 -0
  124. package/dist/commands/clean.d.ts.map +1 -0
  125. package/dist/commands/clean.js +149 -0
  126. package/dist/commands/clean.js.map +1 -0
  127. package/dist/commands/config.d.ts +14 -0
  128. package/dist/commands/config.d.ts.map +1 -0
  129. package/dist/commands/config.js +445 -0
  130. package/dist/commands/config.js.map +1 -0
  131. package/dist/commands/configDoctor.d.ts +26 -0
  132. package/dist/commands/configDoctor.d.ts.map +1 -0
  133. package/dist/commands/configDoctor.js +60 -0
  134. package/dist/commands/configDoctor.js.map +1 -0
  135. package/dist/commands/doctor.d.ts +2 -0
  136. package/dist/commands/doctor.d.ts.map +1 -0
  137. package/dist/commands/doctor.js +141 -0
  138. package/dist/commands/doctor.js.map +1 -0
  139. package/dist/commands/emojis.d.ts +2 -0
  140. package/dist/commands/emojis.d.ts.map +1 -0
  141. package/dist/commands/emojis.js +28 -0
  142. package/dist/commands/emojis.js.map +1 -0
  143. package/dist/commands/interactive.d.ts +3 -0
  144. package/dist/commands/interactive.d.ts.map +1 -0
  145. package/dist/commands/interactive.js +284 -0
  146. package/dist/commands/interactive.js.map +1 -0
  147. package/dist/commands/interactiveEnhanced.d.ts +4 -0
  148. package/dist/commands/interactiveEnhanced.d.ts.map +1 -0
  149. package/dist/commands/interactiveEnhanced.js +460 -0
  150. package/dist/commands/interactiveEnhanced.js.map +1 -0
  151. package/dist/commands/list.d.ts +2 -0
  152. package/dist/commands/list.d.ts.map +1 -0
  153. package/dist/commands/list.js +68 -0
  154. package/dist/commands/list.js.map +1 -0
  155. package/dist/commands/sizes.d.ts +2 -0
  156. package/dist/commands/sizes.d.ts.map +1 -0
  157. package/dist/commands/sizes.js +87 -0
  158. package/dist/commands/sizes.js.map +1 -0
  159. package/dist/config/index.d.ts +26 -0
  160. package/dist/config/index.d.ts.map +1 -0
  161. package/dist/config/index.js +228 -0
  162. package/dist/config/index.js.map +1 -0
  163. package/dist/config/loadConfig.d.ts +7 -0
  164. package/dist/config/loadConfig.d.ts.map +1 -0
  165. package/dist/config/loadConfig.js +103 -0
  166. package/dist/config/loadConfig.js.map +1 -0
  167. package/dist/config/migrateConfig.d.ts +56 -0
  168. package/dist/config/migrateConfig.d.ts.map +1 -0
  169. package/dist/config/migrateConfig.js +102 -0
  170. package/dist/config/migrateConfig.js.map +1 -0
  171. package/dist/plugins/discovery.d.ts +6 -0
  172. package/dist/plugins/discovery.d.ts.map +1 -0
  173. package/dist/plugins/discovery.js +64 -0
  174. package/dist/plugins/discovery.js.map +1 -0
  175. package/dist/profiles/index.d.ts +61 -0
  176. package/dist/profiles/index.d.ts.map +1 -0
  177. package/dist/profiles/index.js +361 -0
  178. package/dist/profiles/index.js.map +1 -0
  179. package/dist/types/index.d.ts +161 -0
  180. package/dist/types/index.d.ts.map +1 -0
  181. package/dist/types/index.js +3 -0
  182. package/dist/types/index.js.map +1 -0
  183. package/dist/utils/cli.d.ts +44 -0
  184. package/dist/utils/cli.d.ts.map +1 -0
  185. package/dist/utils/cli.js +407 -0
  186. package/dist/utils/cli.js.map +1 -0
  187. package/dist/utils/fs.d.ts +15 -0
  188. package/dist/utils/fs.d.ts.map +1 -0
  189. package/dist/utils/fs.js +218 -0
  190. package/dist/utils/fs.js.map +1 -0
  191. package/package.json +122 -0
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.NxCleaner = void 0;
40
+ const fs_1 = require("fs");
41
+ const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
43
+ const fs_2 = require("../utils/fs");
44
+ const execa_1 = __importDefault(require("execa"));
45
+ const cli_1 = require("../utils/cli");
46
+ class NxCleaner {
47
+ constructor() {
48
+ this.name = "nx";
49
+ this.type = "build-tool";
50
+ this.description = "NX monorepo build tool caches";
51
+ }
52
+ async getNxVersion() {
53
+ try {
54
+ const result = await (0, execa_1.default)("nx", ["--version"]);
55
+ return result.stdout.trim();
56
+ }
57
+ catch {
58
+ try {
59
+ const result = await (0, execa_1.default)("npx", ["nx", "--version"]);
60
+ return result.stdout.trim();
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ }
67
+ async findNxCaches() {
68
+ const caches = [];
69
+ const homeDir = os.homedir();
70
+ // Common project directories to search
71
+ const searchDirs = [
72
+ path.join(homeDir, "Projects"),
73
+ path.join(homeDir, "Development"),
74
+ path.join(homeDir, "dev"),
75
+ path.join(homeDir, "workspace"),
76
+ path.join(homeDir, "Documents"),
77
+ process.cwd(), // Current directory
78
+ ];
79
+ // Check for global nx cache
80
+ const globalNxCache = path.join(homeDir, ".nx", "cache");
81
+ if (await (0, fs_2.pathExists)(globalNxCache)) {
82
+ caches.push(globalNxCache);
83
+ }
84
+ // Search for project-specific nx caches
85
+ for (const searchDir of searchDirs) {
86
+ if (await (0, fs_2.pathExists)(searchDir)) {
87
+ try {
88
+ const projectCaches = await this.findNxCachesRecursively(searchDir, 3);
89
+ caches.push(...projectCaches);
90
+ }
91
+ catch (error) {
92
+ (0, cli_1.printVerbose)(`Error searching ${searchDir}: ${error}`);
93
+ }
94
+ }
95
+ }
96
+ return [...new Set(caches)]; // Remove duplicates
97
+ }
98
+ async findNxCachesRecursively(dir, maxDepth) {
99
+ if (maxDepth <= 0)
100
+ return [];
101
+ const nxCaches = [];
102
+ try {
103
+ const entries = await fs_1.promises.readdir(dir, { withFileTypes: true });
104
+ for (const entry of entries) {
105
+ if (entry.isDirectory() &&
106
+ !entry.name.startsWith(".") &&
107
+ entry.name !== "node_modules") {
108
+ const fullPath = path.join(dir, entry.name);
109
+ // Check for nx cache directories
110
+ const cacheLocations = [
111
+ path.join(fullPath, "node_modules", ".cache", "nx"),
112
+ path.join(fullPath, ".nx", "cache"),
113
+ path.join(fullPath, "tmp", "nx"),
114
+ path.join(fullPath, "dist"), // NX output directory for NX workspaces
115
+ ];
116
+ for (const cacheLocation of cacheLocations) {
117
+ if (await (0, fs_2.pathExists)(cacheLocation)) {
118
+ // For dist folders, only include if it's actually an NX workspace
119
+ if (cacheLocation.endsWith("dist")) {
120
+ const nxJsonPath = path.join(fullPath, "nx.json");
121
+ if (await (0, fs_2.pathExists)(nxJsonPath)) {
122
+ nxCaches.push(cacheLocation);
123
+ }
124
+ }
125
+ else {
126
+ nxCaches.push(cacheLocation);
127
+ }
128
+ }
129
+ }
130
+ // Recursively search subdirectories
131
+ const subCaches = await this.findNxCachesRecursively(fullPath, maxDepth - 1);
132
+ nxCaches.push(...subCaches);
133
+ }
134
+ }
135
+ }
136
+ catch {
137
+ // Ignore permission errors or other issues
138
+ }
139
+ return nxCaches;
140
+ }
141
+ async hasNxWorkspaces() {
142
+ const homeDir = os.homedir();
143
+ // Check current directory first
144
+ if (await (0, fs_2.pathExists)(path.join(process.cwd(), "nx.json"))) {
145
+ return true;
146
+ }
147
+ // Search common project directories
148
+ const searchDirs = [
149
+ path.join(homeDir, "Projects"),
150
+ path.join(homeDir, "Development"),
151
+ path.join(homeDir, "dev"),
152
+ path.join(homeDir, "workspace"),
153
+ ];
154
+ for (const searchDir of searchDirs) {
155
+ if (await (0, fs_2.pathExists)(searchDir)) {
156
+ try {
157
+ const hasNx = await this.searchForNxWorkspaces(searchDir, 2);
158
+ if (hasNx)
159
+ return true;
160
+ }
161
+ catch {
162
+ // Continue searching
163
+ }
164
+ }
165
+ }
166
+ return false;
167
+ }
168
+ async searchForNxWorkspaces(dir, maxDepth) {
169
+ if (maxDepth <= 0)
170
+ return false;
171
+ try {
172
+ const entries = await fs_1.promises.readdir(dir, { withFileTypes: true });
173
+ for (const entry of entries) {
174
+ if (entry.isDirectory() && !entry.name.startsWith(".")) {
175
+ const fullPath = path.join(dir, entry.name);
176
+ // Check for nx.json (NX workspace indicator)
177
+ const nxJsonPath = path.join(fullPath, "nx.json");
178
+ if (await (0, fs_2.pathExists)(nxJsonPath)) {
179
+ return true;
180
+ }
181
+ // Check for package.json with nx dependency
182
+ const packageJsonPath = path.join(fullPath, "package.json");
183
+ if (await this.isNxProject(packageJsonPath)) {
184
+ return true;
185
+ }
186
+ // Recursively search
187
+ if (await this.searchForNxWorkspaces(fullPath, maxDepth - 1)) {
188
+ return true;
189
+ }
190
+ }
191
+ }
192
+ }
193
+ catch {
194
+ // Ignore errors
195
+ }
196
+ return false;
197
+ }
198
+ async isNxProject(packageJsonPath) {
199
+ try {
200
+ if (!(await (0, fs_2.pathExists)(packageJsonPath)))
201
+ return false;
202
+ const content = await fs_1.promises.readFile(packageJsonPath, "utf-8");
203
+ const packageJson = JSON.parse(content);
204
+ // Check for nx in dependencies or devDependencies
205
+ const deps = {
206
+ ...packageJson.dependencies,
207
+ ...packageJson.devDependencies,
208
+ };
209
+ return "nx" in deps || "@nrwl/nx" in deps || "@nx/nx" in deps;
210
+ }
211
+ catch {
212
+ return false;
213
+ }
214
+ }
215
+ async isAvailable() {
216
+ // Check if NX is installed globally or there are NX caches/workspaces
217
+ const version = await this.getNxVersion();
218
+ const caches = await this.findNxCaches();
219
+ const hasWorkspaces = await this.hasNxWorkspaces();
220
+ return version !== null || caches.length > 0 || hasWorkspaces;
221
+ }
222
+ async getCacheInfo() {
223
+ const cachePaths = await this.findNxCaches();
224
+ let totalSize = 0;
225
+ const validPaths = [];
226
+ for (const cachePath of cachePaths) {
227
+ try {
228
+ const size = await (0, fs_2.getDirectorySize)(cachePath);
229
+ totalSize += size;
230
+ validPaths.push(cachePath);
231
+ (0, cli_1.printVerbose)(`${cli_1.symbols.folder} ${cachePath}: ${(size / (1024 * 1024)).toFixed(1)} MB`);
232
+ }
233
+ catch (error) {
234
+ (0, cli_1.printVerbose)(`Error calculating size for ${cachePath}: ${error}`);
235
+ }
236
+ }
237
+ return {
238
+ name: this.name,
239
+ type: this.type,
240
+ description: this.description,
241
+ paths: validPaths,
242
+ isInstalled: await this.isAvailable(),
243
+ size: totalSize,
244
+ };
245
+ }
246
+ async clear(dryRun = false, _criteria, cacheInfo) {
247
+ const info = cacheInfo || (await this.getCacheInfo());
248
+ if (!info.isInstalled) {
249
+ return {
250
+ name: this.name,
251
+ success: false,
252
+ error: "No NX caches found",
253
+ clearedPaths: [],
254
+ sizeBefore: 0,
255
+ sizeAfter: 0,
256
+ };
257
+ }
258
+ const sizeBefore = info.size || 0;
259
+ const clearedPaths = [];
260
+ let errors = [];
261
+ // Try to use nx reset command if available
262
+ if (!dryRun && (await this.getNxVersion())) {
263
+ try {
264
+ await (0, execa_1.default)("nx", ["reset"]);
265
+ (0, cli_1.printVerbose)(`${cli_1.symbols.soap} Executed: nx reset`);
266
+ }
267
+ catch {
268
+ try {
269
+ await (0, execa_1.default)("npx", ["nx", "reset"]);
270
+ (0, cli_1.printVerbose)(`${cli_1.symbols.soap} Executed: npx nx reset`);
271
+ }
272
+ catch (error) {
273
+ (0, cli_1.printVerbose)(`Note: nx reset failed: ${error}`);
274
+ }
275
+ }
276
+ }
277
+ // Clear cache directories manually
278
+ for (const cachePath of info.paths) {
279
+ try {
280
+ if (dryRun) {
281
+ (0, cli_1.printVerbose)(`${cli_1.symbols.soap} Would clear: ${cachePath}`);
282
+ clearedPaths.push(cachePath);
283
+ }
284
+ else {
285
+ (0, cli_1.printVerbose)(`${cli_1.symbols.soap} Clearing: ${cachePath}`);
286
+ await (0, fs_2.safeRmrf)(cachePath);
287
+ clearedPaths.push(cachePath);
288
+ }
289
+ }
290
+ catch (error) {
291
+ const errorMsg = `Failed to clear ${cachePath}: ${error}`;
292
+ errors.push(errorMsg);
293
+ (0, cli_1.printVerbose)(errorMsg);
294
+ }
295
+ }
296
+ return {
297
+ name: this.name,
298
+ success: errors.length === 0,
299
+ sizeBefore,
300
+ sizeAfter: 0, // Set to 0 as we don't want to rescan
301
+ error: errors.length > 0 ? errors.join("; ") : undefined,
302
+ clearedPaths,
303
+ };
304
+ }
305
+ }
306
+ exports.NxCleaner = NxCleaner;
307
+ exports.default = new NxCleaner();
308
+ //# sourceMappingURL=nx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nx.js","sourceRoot":"","sources":["../../src/cleaners/nx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { CleanerModule, CacheInfo, ClearResult, CacheSelectionCriteria } from "../types";
2
+ declare class PipCleaner implements CleanerModule {
3
+ name: string;
4
+ type: "package-manager";
5
+ description: string;
6
+ private getPythonVersion;
7
+ private getPipVersion;
8
+ private getPipCachePaths;
9
+ private getPipCacheDir;
10
+ private findVirtualEnvCaches;
11
+ private findPipCachesInDir;
12
+ isAvailable(): Promise<boolean>;
13
+ getCacheInfo(): Promise<CacheInfo>;
14
+ clear(dryRun?: boolean, _criteria?: CacheSelectionCriteria, cacheInfo?: CacheInfo): Promise<ClearResult>;
15
+ private runPipCachePurge;
16
+ }
17
+ declare const _default: PipCleaner;
18
+ export default _default;
19
+ //# sourceMappingURL=pip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pip.d.ts","sourceRoot":"","sources":["../../src/cleaners/pip.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAOlB,cAAM,UAAW,YAAW,aAAa;IACvC,IAAI,SAAS;IACb,IAAI,EAAG,iBAAiB,CAAU;IAClC,WAAW,SAA2D;YAExD,gBAAgB;YAgBhB,aAAa;YAgBb,gBAAgB;YAmEhB,cAAc;YAkBd,oBAAoB;YA6BpB,kBAAkB;IAyC1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAoC/B,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAyClC,KAAK,CACT,MAAM,UAAQ,EACd,SAAS,CAAC,EAAE,sBAAsB,EAClC,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,WAAW,CAAC;YAkDT,gBAAgB;CAa/B;;AAED,wBAAgC"}
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const path = __importStar(require("path"));
40
+ const os = __importStar(require("os"));
41
+ const fs_1 = require("../utils/fs");
42
+ const execa_1 = __importDefault(require("execa"));
43
+ const cli_1 = require("../utils/cli");
44
+ class PipCleaner {
45
+ constructor() {
46
+ this.name = "pip";
47
+ this.type = "package-manager";
48
+ this.description = "Python pip package manager caches and temporary files";
49
+ }
50
+ async getPythonVersion() {
51
+ // Try python3 first, then python
52
+ const pythonCommands = ["python3", "python"];
53
+ for (const cmd of pythonCommands) {
54
+ try {
55
+ const result = await (0, execa_1.default)(cmd, ["--version"]);
56
+ return result.stdout.trim() || result.stderr.trim();
57
+ }
58
+ catch {
59
+ // Continue to next command
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ async getPipVersion() {
65
+ // Try pip3 first, then pip
66
+ const pipCommands = ["pip3", "pip"];
67
+ for (const cmd of pipCommands) {
68
+ try {
69
+ const result = await (0, execa_1.default)(cmd, ["--version"]);
70
+ return result.stdout.trim();
71
+ }
72
+ catch {
73
+ // Continue to next command
74
+ }
75
+ }
76
+ return null;
77
+ }
78
+ async getPipCachePaths() {
79
+ const paths = [];
80
+ const homeDir = os.homedir();
81
+ const platform = os.platform();
82
+ // Platform-specific pip cache paths
83
+ if (platform === "darwin") {
84
+ // macOS
85
+ const macPaths = [
86
+ path.join(homeDir, "Library", "Caches", "pip"),
87
+ path.join(homeDir, ".cache", "pip"),
88
+ ];
89
+ for (const cachePath of macPaths) {
90
+ if (await (0, fs_1.pathExists)(cachePath)) {
91
+ paths.push(cachePath);
92
+ }
93
+ }
94
+ }
95
+ else if (platform === "win32") {
96
+ // Windows
97
+ const windowsPaths = [
98
+ path.join(homeDir, "AppData", "Local", "pip", "cache"),
99
+ path.join(homeDir, "AppData", "Local", "pip", "Cache"),
100
+ path.join(homeDir, "pip", "cache"),
101
+ ];
102
+ for (const cachePath of windowsPaths) {
103
+ if (await (0, fs_1.pathExists)(cachePath)) {
104
+ paths.push(cachePath);
105
+ }
106
+ }
107
+ }
108
+ else {
109
+ // Linux/Unix
110
+ const linuxPaths = [
111
+ path.join(homeDir, ".cache", "pip"),
112
+ path.join(homeDir, ".pip", "cache"),
113
+ "/tmp/pip-cache",
114
+ ];
115
+ for (const cachePath of linuxPaths) {
116
+ if (await (0, fs_1.pathExists)(cachePath)) {
117
+ paths.push(cachePath);
118
+ }
119
+ }
120
+ }
121
+ // Try to get pip cache directory from pip itself
122
+ try {
123
+ const pipCacheDir = await this.getPipCacheDir();
124
+ if (pipCacheDir && !paths.includes(pipCacheDir)) {
125
+ paths.push(pipCacheDir);
126
+ }
127
+ }
128
+ catch (error) {
129
+ (0, cli_1.printVerbose)(`Could not get pip cache directory: ${error}`);
130
+ }
131
+ // Look for virtual environment caches
132
+ try {
133
+ const venvCaches = await this.findVirtualEnvCaches();
134
+ paths.push(...venvCaches);
135
+ }
136
+ catch (error) {
137
+ (0, cli_1.printVerbose)(`Error finding virtual environment caches: ${error}`);
138
+ }
139
+ return [...new Set(paths)]; // Remove duplicates
140
+ }
141
+ async getPipCacheDir() {
142
+ const pipCommands = ["pip3", "pip"];
143
+ for (const cmd of pipCommands) {
144
+ try {
145
+ const result = await (0, execa_1.default)(cmd, ["cache", "dir"]);
146
+ const cacheDir = result.stdout.trim();
147
+ if (cacheDir && (await (0, fs_1.pathExists)(cacheDir))) {
148
+ return cacheDir;
149
+ }
150
+ }
151
+ catch {
152
+ // Command failed, try next
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ async findVirtualEnvCaches() {
158
+ const caches = [];
159
+ const homeDir = os.homedir();
160
+ // Common virtual environment directories
161
+ const venvDirs = [
162
+ path.join(homeDir, ".virtualenvs"),
163
+ path.join(homeDir, "envs"),
164
+ path.join(homeDir, "venv"),
165
+ path.join(homeDir, ".venv"),
166
+ path.join(homeDir, "anaconda3", "envs"),
167
+ path.join(homeDir, "miniconda3", "envs"),
168
+ path.join(homeDir, ".conda", "envs"),
169
+ ];
170
+ for (const venvDir of venvDirs) {
171
+ if (await (0, fs_1.pathExists)(venvDir)) {
172
+ try {
173
+ const envCaches = await this.findPipCachesInDir(venvDir);
174
+ caches.push(...envCaches);
175
+ }
176
+ catch (error) {
177
+ (0, cli_1.printVerbose)(`Error searching virtual envs in ${venvDir}: ${error}`);
178
+ }
179
+ }
180
+ }
181
+ return caches;
182
+ }
183
+ async findPipCachesInDir(dir) {
184
+ const caches = [];
185
+ try {
186
+ const platform = os.platform();
187
+ // Look for pip cache subdirectories in virtual environments
188
+ const possibleCachePaths = [];
189
+ if (platform === "win32") {
190
+ possibleCachePaths.push(path.join(dir, "Lib", "site-packages", "pip", "_internal", "cache"), path.join(dir, "pip", "cache"));
191
+ }
192
+ else {
193
+ possibleCachePaths.push(path.join(dir, "lib", "python*", "site-packages", "pip", "_internal", "cache"), path.join(dir, "pip", "cache"));
194
+ }
195
+ for (const cachePath of possibleCachePaths) {
196
+ if (await (0, fs_1.pathExists)(cachePath)) {
197
+ caches.push(cachePath);
198
+ }
199
+ }
200
+ }
201
+ catch {
202
+ // Ignore errors
203
+ }
204
+ return caches;
205
+ }
206
+ async isAvailable() {
207
+ // Check if Python is installed
208
+ const pythonVersion = await this.getPythonVersion();
209
+ if (pythonVersion) {
210
+ (0, cli_1.printVerbose)(`Found Python: ${pythonVersion}`);
211
+ return true;
212
+ }
213
+ // Check if pip is installed
214
+ const pipVersion = await this.getPipVersion();
215
+ if (pipVersion) {
216
+ (0, cli_1.printVerbose)(`Found pip: ${pipVersion}`);
217
+ return true;
218
+ }
219
+ // Check if pip cache exists
220
+ const homeDir = os.homedir();
221
+ const platform = os.platform();
222
+ let defaultCachePath;
223
+ if (platform === "darwin") {
224
+ defaultCachePath = path.join(homeDir, "Library", "Caches", "pip");
225
+ }
226
+ else if (platform === "win32") {
227
+ defaultCachePath = path.join(homeDir, "AppData", "Local", "pip", "cache");
228
+ }
229
+ else {
230
+ defaultCachePath = path.join(homeDir, ".cache", "pip");
231
+ }
232
+ if (await (0, fs_1.pathExists)(defaultCachePath)) {
233
+ (0, cli_1.printVerbose)(`Found pip cache at ${defaultCachePath}`);
234
+ return true;
235
+ }
236
+ return false;
237
+ }
238
+ async getCacheInfo() {
239
+ const isInstalled = await this.isAvailable();
240
+ if (!isInstalled) {
241
+ return {
242
+ name: this.name,
243
+ type: this.type,
244
+ description: this.description,
245
+ paths: [],
246
+ isInstalled: false,
247
+ size: 0,
248
+ };
249
+ }
250
+ const cachePaths = await this.getPipCachePaths();
251
+ let totalSize = 0;
252
+ const validPaths = [];
253
+ for (const cachePath of cachePaths) {
254
+ try {
255
+ const size = await (0, fs_1.getDirectorySize)(cachePath, true); // Use estimated size for large dirs
256
+ totalSize += size;
257
+ validPaths.push(cachePath);
258
+ (0, cli_1.printVerbose)(`${cli_1.symbols.folder} ${cachePath}: ${(size / (1024 * 1024)).toFixed(1)} MB`);
259
+ }
260
+ catch (error) {
261
+ (0, cli_1.printVerbose)(`Error calculating size for ${cachePath}: ${error}`);
262
+ }
263
+ }
264
+ return {
265
+ name: this.name,
266
+ type: this.type,
267
+ description: this.description,
268
+ paths: validPaths,
269
+ isInstalled: true,
270
+ size: totalSize,
271
+ };
272
+ }
273
+ async clear(dryRun = false, _criteria, cacheInfo) {
274
+ const info = cacheInfo || (await this.getCacheInfo());
275
+ if (!info.isInstalled) {
276
+ return {
277
+ name: this.name,
278
+ success: false,
279
+ error: "Python/pip is not available",
280
+ clearedPaths: [],
281
+ sizeBefore: 0,
282
+ sizeAfter: 0,
283
+ };
284
+ }
285
+ const sizeBefore = info.size || 0;
286
+ const clearedPaths = [];
287
+ let errors = [];
288
+ // Try pip cache purge command first
289
+ if (!dryRun) {
290
+ await this.runPipCachePurge();
291
+ }
292
+ for (const cachePath of info.paths) {
293
+ try {
294
+ if (dryRun) {
295
+ (0, cli_1.printVerbose)(`${cli_1.symbols.soap} Would clear: ${cachePath}`);
296
+ clearedPaths.push(cachePath);
297
+ }
298
+ else {
299
+ (0, cli_1.printVerbose)(`${cli_1.symbols.soap} Clearing: ${cachePath}`);
300
+ await (0, fs_1.safeRmrf)(cachePath);
301
+ clearedPaths.push(cachePath);
302
+ }
303
+ }
304
+ catch (error) {
305
+ const errorMsg = `Failed to clear ${cachePath}: ${error}`;
306
+ errors.push(errorMsg);
307
+ (0, cli_1.printVerbose)(errorMsg);
308
+ }
309
+ }
310
+ return {
311
+ name: this.name,
312
+ success: errors.length === 0,
313
+ sizeBefore,
314
+ sizeAfter: 0, // Set to 0 as we don't want to rescan
315
+ error: errors.length > 0 ? errors.join("; ") : undefined,
316
+ clearedPaths,
317
+ };
318
+ }
319
+ async runPipCachePurge() {
320
+ const pipCommands = ["pip3", "pip"];
321
+ for (const cmd of pipCommands) {
322
+ try {
323
+ await (0, execa_1.default)(cmd, ["cache", "purge"]);
324
+ (0, cli_1.printVerbose)(`${cli_1.symbols.soap} Executed: ${cmd} cache purge`);
325
+ return; // Success, don't try other commands
326
+ }
327
+ catch (error) {
328
+ (0, cli_1.printVerbose)(`Note: ${cmd} cache purge failed: ${error}`);
329
+ }
330
+ }
331
+ }
332
+ }
333
+ exports.default = new PipCleaner();
334
+ //# sourceMappingURL=pip.js.map