squeaky-clean 0.1.11 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/cleaners/BaseCleaner.d.ts +57 -0
  2. package/dist/cleaners/BaseCleaner.d.ts.map +1 -0
  3. package/dist/cleaners/BaseCleaner.js +299 -0
  4. package/dist/cleaners/BaseCleaner.js.map +1 -0
  5. package/dist/cleaners/CleanerRegistry.d.ts +65 -0
  6. package/dist/cleaners/CleanerRegistry.d.ts.map +1 -0
  7. package/dist/cleaners/CleanerRegistry.js +112 -0
  8. package/dist/cleaners/CleanerRegistry.js.map +1 -0
  9. package/dist/cleaners/androidstudio.d.ts +16 -0
  10. package/dist/cleaners/androidstudio.d.ts.map +1 -0
  11. package/dist/cleaners/androidstudio.js +375 -0
  12. package/dist/cleaners/androidstudio.js.map +1 -0
  13. package/dist/cleaners/brew.d.ts +4 -0
  14. package/dist/cleaners/brew.d.ts.map +1 -0
  15. package/dist/cleaners/brew.js +197 -0
  16. package/dist/cleaners/brew.js.map +1 -0
  17. package/dist/cleaners/brewEnhanced.d.ts +18 -0
  18. package/dist/cleaners/brewEnhanced.d.ts.map +1 -0
  19. package/dist/cleaners/brewEnhanced.js +255 -0
  20. package/dist/cleaners/brewEnhanced.js.map +1 -0
  21. package/dist/cleaners/bun.d.ts +14 -0
  22. package/dist/cleaners/bun.d.ts.map +1 -0
  23. package/dist/cleaners/bun.js +207 -0
  24. package/dist/cleaners/bun.js.map +1 -0
  25. package/dist/cleaners/cargo.d.ts +15 -0
  26. package/dist/cleaners/cargo.d.ts.map +1 -0
  27. package/dist/cleaners/cargo.js +193 -0
  28. package/dist/cleaners/cargo.js.map +1 -0
  29. package/dist/cleaners/chrome.d.ts +14 -0
  30. package/dist/cleaners/chrome.d.ts.map +1 -0
  31. package/dist/cleaners/chrome.js +250 -0
  32. package/dist/cleaners/chrome.js.map +1 -0
  33. package/dist/cleaners/cocoapods.d.ts +16 -0
  34. package/dist/cleaners/cocoapods.d.ts.map +1 -0
  35. package/dist/cleaners/cocoapods.js +180 -0
  36. package/dist/cleaners/cocoapods.js.map +1 -0
  37. package/dist/cleaners/cursor.d.ts +15 -0
  38. package/dist/cleaners/cursor.d.ts.map +1 -0
  39. package/dist/cleaners/cursor.js +377 -0
  40. package/dist/cleaners/cursor.js.map +1 -0
  41. package/dist/cleaners/docker.d.ts +35 -0
  42. package/dist/cleaners/docker.d.ts.map +1 -0
  43. package/dist/cleaners/docker.js +288 -0
  44. package/dist/cleaners/docker.js.map +1 -0
  45. package/dist/cleaners/firefox.d.ts +15 -0
  46. package/dist/cleaners/firefox.d.ts.map +1 -0
  47. package/dist/cleaners/firefox.js +281 -0
  48. package/dist/cleaners/firefox.js.map +1 -0
  49. package/dist/cleaners/flutter.d.ts +18 -0
  50. package/dist/cleaners/flutter.d.ts.map +1 -0
  51. package/dist/cleaners/flutter.js +354 -0
  52. package/dist/cleaners/flutter.js.map +1 -0
  53. package/dist/cleaners/goBuild.d.ts +18 -0
  54. package/dist/cleaners/goBuild.d.ts.map +1 -0
  55. package/dist/cleaners/goBuild.js +196 -0
  56. package/dist/cleaners/goBuild.js.map +1 -0
  57. package/dist/cleaners/gradle.d.ts +14 -0
  58. package/dist/cleaners/gradle.d.ts.map +1 -0
  59. package/dist/cleaners/gradle.js +336 -0
  60. package/dist/cleaners/gradle.js.map +1 -0
  61. package/dist/cleaners/index.d.ts +51 -0
  62. package/dist/cleaners/index.d.ts.map +1 -0
  63. package/dist/cleaners/index.js +267 -0
  64. package/dist/cleaners/index.js.map +1 -0
  65. package/dist/cleaners/jetbrains.d.ts +18 -0
  66. package/dist/cleaners/jetbrains.d.ts.map +1 -0
  67. package/dist/cleaners/jetbrains.js +441 -0
  68. package/dist/cleaners/jetbrains.js.map +1 -0
  69. package/dist/cleaners/maven.d.ts +15 -0
  70. package/dist/cleaners/maven.d.ts.map +1 -0
  71. package/dist/cleaners/maven.js +182 -0
  72. package/dist/cleaners/maven.js.map +1 -0
  73. package/dist/cleaners/nix.d.ts +4 -0
  74. package/dist/cleaners/nix.d.ts.map +1 -0
  75. package/dist/cleaners/nix.js +227 -0
  76. package/dist/cleaners/nix.js.map +1 -0
  77. package/dist/cleaners/nodeGyp.d.ts +14 -0
  78. package/dist/cleaners/nodeGyp.d.ts.map +1 -0
  79. package/dist/cleaners/nodeGyp.js +157 -0
  80. package/dist/cleaners/nodeGyp.js.map +1 -0
  81. package/dist/cleaners/npm.d.ts +14 -0
  82. package/dist/cleaners/npm.d.ts.map +1 -0
  83. package/dist/cleaners/npm.js +203 -0
  84. package/dist/cleaners/npm.js.map +1 -0
  85. package/dist/cleaners/npmEnhanced.d.ts +19 -0
  86. package/dist/cleaners/npmEnhanced.d.ts.map +1 -0
  87. package/dist/cleaners/npmEnhanced.js +336 -0
  88. package/dist/cleaners/npmEnhanced.js.map +1 -0
  89. package/dist/cleaners/nuget.d.ts +16 -0
  90. package/dist/cleaners/nuget.d.ts.map +1 -0
  91. package/dist/cleaners/nuget.js +197 -0
  92. package/dist/cleaners/nuget.js.map +1 -0
  93. package/dist/cleaners/nx.d.ts +18 -0
  94. package/dist/cleaners/nx.d.ts.map +1 -0
  95. package/dist/cleaners/nx.js +308 -0
  96. package/dist/cleaners/nx.js.map +1 -0
  97. package/dist/cleaners/pip.d.ts +19 -0
  98. package/dist/cleaners/pip.d.ts.map +1 -0
  99. package/dist/cleaners/pip.js +334 -0
  100. package/dist/cleaners/pip.js.map +1 -0
  101. package/dist/cleaners/pipenv.d.ts +16 -0
  102. package/dist/cleaners/pipenv.d.ts.map +1 -0
  103. package/dist/cleaners/pipenv.js +184 -0
  104. package/dist/cleaners/pipenv.js.map +1 -0
  105. package/dist/cleaners/playwright.d.ts +15 -0
  106. package/dist/cleaners/playwright.d.ts.map +1 -0
  107. package/dist/cleaners/playwright.js +221 -0
  108. package/dist/cleaners/playwright.js.map +1 -0
  109. package/dist/cleaners/pnpm.d.ts +14 -0
  110. package/dist/cleaners/pnpm.d.ts.map +1 -0
  111. package/dist/cleaners/pnpm.js +214 -0
  112. package/dist/cleaners/pnpm.js.map +1 -0
  113. package/dist/cleaners/poetry.d.ts +16 -0
  114. package/dist/cleaners/poetry.d.ts.map +1 -0
  115. package/dist/cleaners/poetry.js +184 -0
  116. package/dist/cleaners/poetry.js.map +1 -0
  117. package/dist/cleaners/swiftpm.d.ts +16 -0
  118. package/dist/cleaners/swiftpm.d.ts.map +1 -0
  119. package/dist/cleaners/swiftpm.js +179 -0
  120. package/dist/cleaners/swiftpm.js.map +1 -0
  121. package/dist/cleaners/turbo.d.ts +18 -0
  122. package/dist/cleaners/turbo.d.ts.map +1 -0
  123. package/dist/cleaners/turbo.js +325 -0
  124. package/dist/cleaners/turbo.js.map +1 -0
  125. package/dist/cleaners/universalBinary.d.ts +20 -0
  126. package/dist/cleaners/universalBinary.d.ts.map +1 -0
  127. package/dist/cleaners/universalBinary.js +318 -0
  128. package/dist/cleaners/universalBinary.js.map +1 -0
  129. package/dist/cleaners/vite.d.ts +17 -0
  130. package/dist/cleaners/vite.d.ts.map +1 -0
  131. package/dist/cleaners/vite.js +274 -0
  132. package/dist/cleaners/vite.js.map +1 -0
  133. package/dist/cleaners/vscode.d.ts +15 -0
  134. package/dist/cleaners/vscode.d.ts.map +1 -0
  135. package/dist/cleaners/vscode.js +411 -0
  136. package/dist/cleaners/vscode.js.map +1 -0
  137. package/dist/cleaners/webpack.d.ts +17 -0
  138. package/dist/cleaners/webpack.d.ts.map +1 -0
  139. package/dist/cleaners/webpack.js +263 -0
  140. package/dist/cleaners/webpack.js.map +1 -0
  141. package/dist/cleaners/windsurf.d.ts +15 -0
  142. package/dist/cleaners/windsurf.d.ts.map +1 -0
  143. package/dist/cleaners/windsurf.js +366 -0
  144. package/dist/cleaners/windsurf.js.map +1 -0
  145. package/dist/cleaners/xcode.d.ts +14 -0
  146. package/dist/cleaners/xcode.d.ts.map +1 -0
  147. package/dist/cleaners/xcode.js +348 -0
  148. package/dist/cleaners/xcode.js.map +1 -0
  149. package/dist/cleaners/yarn.d.ts +16 -0
  150. package/dist/cleaners/yarn.d.ts.map +1 -0
  151. package/dist/cleaners/yarn.js +271 -0
  152. package/dist/cleaners/yarn.js.map +1 -0
  153. package/dist/cleaners/zed.d.ts +15 -0
  154. package/dist/cleaners/zed.d.ts.map +1 -0
  155. package/dist/cleaners/zed.js +383 -0
  156. package/dist/cleaners/zed.js.map +1 -0
  157. package/dist/cli.d.ts +3 -0
  158. package/dist/cli.d.ts.map +1 -0
  159. package/dist/cli.js +373 -0
  160. package/dist/cli.js.map +1 -0
  161. package/dist/commands/auto.d.ts +8 -0
  162. package/dist/commands/auto.d.ts.map +1 -0
  163. package/dist/commands/auto.js +251 -0
  164. package/dist/commands/auto.js.map +1 -0
  165. package/dist/commands/categories.d.ts +8 -0
  166. package/dist/commands/categories.d.ts.map +1 -0
  167. package/dist/commands/categories.js +133 -0
  168. package/dist/commands/categories.js.map +1 -0
  169. package/dist/commands/clean.d.ts +3 -0
  170. package/dist/commands/clean.d.ts.map +1 -0
  171. package/dist/commands/clean.js +149 -0
  172. package/dist/commands/clean.js.map +1 -0
  173. package/dist/commands/config.d.ts +14 -0
  174. package/dist/commands/config.d.ts.map +1 -0
  175. package/dist/commands/config.js +458 -0
  176. package/dist/commands/config.js.map +1 -0
  177. package/dist/commands/configDoctor.d.ts +26 -0
  178. package/dist/commands/configDoctor.d.ts.map +1 -0
  179. package/dist/commands/configDoctor.js +60 -0
  180. package/dist/commands/configDoctor.js.map +1 -0
  181. package/dist/commands/doctor.d.ts +2 -0
  182. package/dist/commands/doctor.d.ts.map +1 -0
  183. package/dist/commands/doctor.js +141 -0
  184. package/dist/commands/doctor.js.map +1 -0
  185. package/dist/commands/emojis.d.ts +2 -0
  186. package/dist/commands/emojis.d.ts.map +1 -0
  187. package/dist/commands/emojis.js +28 -0
  188. package/dist/commands/emojis.js.map +1 -0
  189. package/dist/commands/interactive.d.ts +3 -0
  190. package/dist/commands/interactive.d.ts.map +1 -0
  191. package/dist/commands/interactive.js +284 -0
  192. package/dist/commands/interactive.js.map +1 -0
  193. package/dist/commands/interactiveEnhanced.d.ts +4 -0
  194. package/dist/commands/interactiveEnhanced.d.ts.map +1 -0
  195. package/dist/commands/interactiveEnhanced.js +460 -0
  196. package/dist/commands/interactiveEnhanced.js.map +1 -0
  197. package/dist/commands/list.d.ts +2 -0
  198. package/dist/commands/list.d.ts.map +1 -0
  199. package/dist/commands/list.js +68 -0
  200. package/dist/commands/list.js.map +1 -0
  201. package/dist/commands/sizes.d.ts +2 -0
  202. package/dist/commands/sizes.d.ts.map +1 -0
  203. package/dist/commands/sizes.js +87 -0
  204. package/dist/commands/sizes.js.map +1 -0
  205. package/dist/commands/ub.d.ts +10 -0
  206. package/dist/commands/ub.d.ts.map +1 -0
  207. package/dist/commands/ub.js +170 -0
  208. package/dist/commands/ub.js.map +1 -0
  209. package/dist/config/configSchema.d.ts +93 -0
  210. package/dist/config/configSchema.d.ts.map +1 -0
  211. package/dist/config/configSchema.js +88 -0
  212. package/dist/config/configSchema.js.map +1 -0
  213. package/dist/config/index.d.ts +35 -0
  214. package/dist/config/index.d.ts.map +1 -0
  215. package/dist/config/index.js +258 -0
  216. package/dist/config/index.js.map +1 -0
  217. package/dist/config/loadConfig.d.ts +7 -0
  218. package/dist/config/loadConfig.d.ts.map +1 -0
  219. package/dist/config/loadConfig.js +95 -0
  220. package/dist/config/loadConfig.js.map +1 -0
  221. package/dist/config/migrateConfig.d.ts +56 -0
  222. package/dist/config/migrateConfig.d.ts.map +1 -0
  223. package/dist/config/migrateConfig.js +102 -0
  224. package/dist/config/migrateConfig.js.map +1 -0
  225. package/dist/plugins/discovery.d.ts +6 -0
  226. package/dist/plugins/discovery.d.ts.map +1 -0
  227. package/dist/plugins/discovery.js +64 -0
  228. package/dist/plugins/discovery.js.map +1 -0
  229. package/dist/profiles/index.d.ts +61 -0
  230. package/dist/profiles/index.d.ts.map +1 -0
  231. package/dist/profiles/index.js +406 -0
  232. package/dist/profiles/index.js.map +1 -0
  233. package/dist/types/index.d.ts +176 -0
  234. package/dist/types/index.d.ts.map +1 -0
  235. package/dist/types/index.js +3 -0
  236. package/dist/types/index.js.map +1 -0
  237. package/dist/utils/cache.d.ts +58 -0
  238. package/dist/utils/cache.d.ts.map +1 -0
  239. package/dist/utils/cache.js +101 -0
  240. package/dist/utils/cache.js.map +1 -0
  241. package/dist/utils/cli.d.ts +45 -0
  242. package/dist/utils/cli.d.ts.map +1 -0
  243. package/dist/utils/cli.js +412 -0
  244. package/dist/utils/cli.js.map +1 -0
  245. package/dist/utils/fs.d.ts +32 -0
  246. package/dist/utils/fs.d.ts.map +1 -0
  247. package/dist/utils/fs.js +250 -0
  248. package/dist/utils/fs.js.map +1 -0
  249. package/package.json +7 -7
@@ -0,0 +1,32 @@
1
+ export declare function pathExists(filePath: string): Promise<boolean>;
2
+ export declare function getDirectorySize(dirPath: string, skipLargeDirectories?: boolean): Promise<number>;
3
+ export declare function getEstimatedDirectorySize(dirPath: string): Promise<number>;
4
+ export declare function safeRmrf(targetPath: string): Promise<void>;
5
+ export declare function createDirectoryIfNotExists(dirPath: string): Promise<void>;
6
+ export declare function isWritable(dirPath: string): Promise<boolean>;
7
+ export declare function getDiskSpace(dirPath: string): Promise<{
8
+ free: number;
9
+ total: number;
10
+ } | null>;
11
+ export declare function getFileModificationTime(filePath: string): Promise<Date | null>;
12
+ export declare function sanitizePath(inputPath: string): string;
13
+ export declare function getCacheSize(dirPath: string): Promise<number>;
14
+ export declare function clearPaths(paths: string[]): Promise<void>;
15
+ /**
16
+ * Get directory size with caching (2-minute TTL)
17
+ * Use this for repeated size calculations on the same paths
18
+ */
19
+ export declare function getCachedDirectorySize(dirPath: string, skipLargeDirectories?: boolean): Promise<number>;
20
+ /**
21
+ * Get estimated directory size with caching (2-minute TTL)
22
+ */
23
+ export declare function getCachedEstimatedDirectorySize(dirPath: string): Promise<number>;
24
+ /**
25
+ * Invalidate size cache for a path (call after clearing)
26
+ */
27
+ export declare function invalidateSizeCache(dirPath: string): void;
28
+ /**
29
+ * Invalidate all size caches matching a prefix
30
+ */
31
+ export declare function invalidateSizeCachePrefix(prefix: string): void;
32
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAYD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,oBAAoB,GAAE,OAAe,GACpC,OAAO,CAAC,MAAM,CAAC,CAcjB;AA2DD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhE;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAWjD;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAOtB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOtD;AAGD,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAGD,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,oBAAoB,GAAE,OAAe,GACpC,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGzD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG9D"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.pathExists = pathExists;
7
+ exports.getDirectorySize = getDirectorySize;
8
+ exports.getEstimatedDirectorySize = getEstimatedDirectorySize;
9
+ exports.safeRmrf = safeRmrf;
10
+ exports.createDirectoryIfNotExists = createDirectoryIfNotExists;
11
+ exports.isWritable = isWritable;
12
+ exports.getDiskSpace = getDiskSpace;
13
+ exports.getFileModificationTime = getFileModificationTime;
14
+ exports.sanitizePath = sanitizePath;
15
+ exports.getCacheSize = getCacheSize;
16
+ exports.clearPaths = clearPaths;
17
+ exports.getCachedDirectorySize = getCachedDirectorySize;
18
+ exports.getCachedEstimatedDirectorySize = getCachedEstimatedDirectorySize;
19
+ exports.invalidateSizeCache = invalidateSizeCache;
20
+ exports.invalidateSizeCachePrefix = invalidateSizeCachePrefix;
21
+ const fs_1 = require("fs");
22
+ const path_1 = __importDefault(require("path"));
23
+ const rimraf_1 = require("rimraf");
24
+ const cache_1 = require("./cache");
25
+ async function pathExists(filePath) {
26
+ try {
27
+ await fs_1.promises.access(filePath);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ // Timeout wrapper for directory size calculation
35
+ const withTimeout = (promise, timeoutMs) => {
36
+ return Promise.race([
37
+ promise,
38
+ new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), timeoutMs)),
39
+ ]);
40
+ };
41
+ async function getDirectorySize(dirPath, skipLargeDirectories = false) {
42
+ // Wrap the actual calculation with an 8-second timeout to prevent hangs
43
+ try {
44
+ return await withTimeout(calculateDirectorySize(dirPath, skipLargeDirectories), 8000);
45
+ }
46
+ catch (error) {
47
+ if (error instanceof Error && error.message === "Timeout") {
48
+ // Use estimated size for directories that take too long
49
+ return getEstimatedDirectorySize(dirPath);
50
+ }
51
+ return 0;
52
+ }
53
+ }
54
+ async function calculateDirectorySize(dirPath, skipLargeDirectories = false) {
55
+ try {
56
+ const stats = await fs_1.promises.stat(dirPath);
57
+ if (!stats.isDirectory()) {
58
+ return stats.size;
59
+ }
60
+ // For very large cache directories, return estimated size instead of calculating exact size
61
+ if (skipLargeDirectories) {
62
+ return getEstimatedDirectorySize(dirPath);
63
+ }
64
+ let totalSize = 0;
65
+ const stack = [dirPath];
66
+ let processedCount = 0;
67
+ const maxItems = 10000; // Limit total items processed to prevent memory issues
68
+ while (stack.length > 0 && processedCount < maxItems) {
69
+ const currentDir = stack.pop();
70
+ try {
71
+ const items = await fs_1.promises.readdir(currentDir);
72
+ for (const item of items) {
73
+ if (processedCount >= maxItems)
74
+ break;
75
+ const itemPath = path_1.default.join(currentDir, item);
76
+ try {
77
+ const itemStats = await fs_1.promises.stat(itemPath);
78
+ if (itemStats.isDirectory()) {
79
+ stack.push(itemPath);
80
+ }
81
+ else {
82
+ totalSize += itemStats.size;
83
+ }
84
+ processedCount++;
85
+ }
86
+ catch {
87
+ // Skip items we can't access (permissions, etc.)
88
+ }
89
+ }
90
+ }
91
+ catch {
92
+ // Skip directories we can't access
93
+ }
94
+ }
95
+ return totalSize;
96
+ }
97
+ catch {
98
+ return 0;
99
+ }
100
+ }
101
+ // Fast estimation for large directories to avoid memory issues
102
+ async function getEstimatedDirectorySize(dirPath) {
103
+ try {
104
+ const stats = await fs_1.promises.stat(dirPath);
105
+ if (!stats.isDirectory()) {
106
+ return stats.size;
107
+ }
108
+ // Sample a few items to estimate average size
109
+ const items = await fs_1.promises.readdir(dirPath);
110
+ const sampleSize = Math.min(100, items.length);
111
+ if (sampleSize === 0)
112
+ return 0;
113
+ let sampleTotalSize = 0;
114
+ let sampleFileCount = 0;
115
+ for (let i = 0; i < sampleSize; i++) {
116
+ const itemPath = path_1.default.join(dirPath, items[i]);
117
+ try {
118
+ const itemStats = await fs_1.promises.stat(itemPath);
119
+ if (!itemStats.isDirectory()) {
120
+ sampleTotalSize += itemStats.size;
121
+ sampleFileCount++;
122
+ }
123
+ }
124
+ catch {
125
+ // Skip items we can't access
126
+ }
127
+ }
128
+ if (sampleFileCount === 0)
129
+ return 0;
130
+ const averageFileSize = sampleTotalSize / sampleFileCount;
131
+ const totalFiles = items.length;
132
+ return Math.round(averageFileSize * totalFiles);
133
+ }
134
+ catch {
135
+ return 0;
136
+ }
137
+ }
138
+ async function safeRmrf(targetPath) {
139
+ try {
140
+ if (!(await pathExists(targetPath))) {
141
+ return;
142
+ }
143
+ // Safety checks
144
+ const normalizedPath = path_1.default.resolve(targetPath);
145
+ const isInHomeOrTemp = normalizedPath.includes(path_1.default.join(require("os").homedir())) ||
146
+ normalizedPath.includes(require("os").tmpdir()) ||
147
+ normalizedPath.includes("node_modules") ||
148
+ normalizedPath.includes("cache") ||
149
+ normalizedPath.includes("temp");
150
+ if (!isInHomeOrTemp) {
151
+ throw new Error(`Refusing to delete path outside safe directories: ${normalizedPath}`);
152
+ }
153
+ // Use rimraf for cross-platform reliable deletion
154
+ await (0, rimraf_1.rimraf)(normalizedPath, {
155
+ maxRetries: 3,
156
+ retryDelay: 100,
157
+ });
158
+ }
159
+ catch (error) {
160
+ throw new Error(`Failed to delete ${targetPath}: ${error instanceof Error ? error.message : error}`);
161
+ }
162
+ }
163
+ async function createDirectoryIfNotExists(dirPath) {
164
+ try {
165
+ await fs_1.promises.mkdir(dirPath, { recursive: true });
166
+ }
167
+ catch (error) {
168
+ if (error.code !== "EEXIST") {
169
+ throw error;
170
+ }
171
+ }
172
+ }
173
+ async function isWritable(dirPath) {
174
+ try {
175
+ await fs_1.promises.access(dirPath, fs_1.promises.constants.W_OK);
176
+ return true;
177
+ }
178
+ catch {
179
+ return false;
180
+ }
181
+ }
182
+ async function getDiskSpace(dirPath) {
183
+ try {
184
+ const stats = await fs_1.promises.statfs(dirPath);
185
+ return {
186
+ free: stats.bavail * stats.bsize,
187
+ total: stats.blocks * stats.bsize,
188
+ };
189
+ }
190
+ catch {
191
+ // statfs not available on all platforms
192
+ return null;
193
+ }
194
+ }
195
+ async function getFileModificationTime(filePath) {
196
+ try {
197
+ const stats = await fs_1.promises.stat(filePath);
198
+ return stats.mtime;
199
+ }
200
+ catch {
201
+ return null;
202
+ }
203
+ }
204
+ function sanitizePath(inputPath) {
205
+ if (!inputPath)
206
+ return ".";
207
+ // Normalize path separators to forward slashes and remove invalid characters
208
+ return path_1.default
209
+ .normalize(inputPath)
210
+ .replace(/\\/g, "/")
211
+ .replace(/[<>:"|?*]/g, "");
212
+ }
213
+ // Alias for cache size calculation
214
+ async function getCacheSize(dirPath) {
215
+ return getDirectorySize(dirPath, false);
216
+ }
217
+ // Clear multiple paths
218
+ async function clearPaths(paths) {
219
+ for (const p of paths) {
220
+ await safeRmrf(p);
221
+ }
222
+ }
223
+ /**
224
+ * Get directory size with caching (2-minute TTL)
225
+ * Use this for repeated size calculations on the same paths
226
+ */
227
+ async function getCachedDirectorySize(dirPath, skipLargeDirectories = false) {
228
+ return cache_1.cacheManager.getCachedSize(dirPath, () => getDirectorySize(dirPath, skipLargeDirectories), 120000);
229
+ }
230
+ /**
231
+ * Get estimated directory size with caching (2-minute TTL)
232
+ */
233
+ async function getCachedEstimatedDirectorySize(dirPath) {
234
+ return cache_1.cacheManager.getCachedSize(`estimated:${dirPath}`, () => getEstimatedDirectorySize(dirPath), 120000);
235
+ }
236
+ /**
237
+ * Invalidate size cache for a path (call after clearing)
238
+ */
239
+ function invalidateSizeCache(dirPath) {
240
+ cache_1.cacheManager.invalidateSize(dirPath);
241
+ cache_1.cacheManager.invalidateSize(`estimated:${dirPath}`);
242
+ }
243
+ /**
244
+ * Invalidate all size caches matching a prefix
245
+ */
246
+ function invalidateSizeCachePrefix(prefix) {
247
+ cache_1.cacheManager.invalidateSizePrefix(prefix);
248
+ cache_1.cacheManager.invalidateSizePrefix(`estimated:${prefix}`);
249
+ }
250
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "squeaky-clean",
3
- "version": "0.1.11",
3
+ "version": "0.3.0",
4
4
  "description": "✨ Easy, customizable and expandable development cache cleaner CLI with interactive configuration! Smart, safe, and configurable cache management for 25+ development tools.",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -15,11 +15,11 @@
15
15
  "test": "vitest",
16
16
  "test:watch": "vitest --watch",
17
17
  "test:coverage": "vitest run --coverage",
18
- "lint": "eslint src --ext .ts,.tsx",
19
- "lint:fix": "eslint src --ext .ts,.tsx --fix",
20
- "format": "prettier --write src/**/*.{ts,tsx,json}",
21
- "clean": "rimraf dist",
22
- "prepublishOnly": "npm run clean && npm run build",
18
+ "lint": "eslint src",
19
+ "lint:fix": "eslint src --fix",
20
+ "format": "prettier --write \"src/**/*.{ts,tsx,json}\"",
21
+ "clean": "rimraf dist .tsbuildinfo",
22
+ "prepublishOnly": "npm run clean && tsc --build --force",
23
23
  "release": "npm run test && npm run build && npm publish",
24
24
  "release:patch": "npm run version:patch && npm run test && npm run build && npm publish",
25
25
  "release:minor": "npm run version:minor && npm run test && npm run build && npm publish",
@@ -80,7 +80,7 @@
80
80
  },
81
81
  "homepage": "https://github.com/chendrizzy/squeaky-clean#readme",
82
82
  "engines": {
83
- "node": ">=16.0.0"
83
+ "node": ">=18.0.0"
84
84
  },
85
85
  "files": [
86
86
  "dist",