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,87 @@
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.sizesCommand = sizesCommand;
7
+ const cli_1 = require("../utils/cli");
8
+ const cleaners_1 = require("../cleaners");
9
+ const ora_1 = __importDefault(require("ora"));
10
+ async function sizesCommand(_options) {
11
+ try {
12
+ (0, cli_1.printInfo)(`${cli_1.symbols.soap} Cache Sizes`);
13
+ (0, cli_1.printInfo)("──────────────");
14
+ const spinner = (0, ora_1.default)("Scanning cache directories...").start();
15
+ try {
16
+ const cacheInfos = await cleaners_1.cacheManager.getAllCacheInfo();
17
+ spinner.stop();
18
+ console.log(); // Add some space
19
+ let totalSize = 0;
20
+ let foundCaches = 0;
21
+ // Group by cache type
22
+ const groupedCaches = new Map();
23
+ for (const info of cacheInfos) {
24
+ const type = info.type || "other";
25
+ if (!groupedCaches.has(type)) {
26
+ groupedCaches.set(type, []);
27
+ }
28
+ groupedCaches.get(type).push(info);
29
+ }
30
+ // Display results grouped by type
31
+ const typeEmojis = {
32
+ "package-manager": "📦",
33
+ "build-tool": "🔧",
34
+ ide: "💻",
35
+ browser: "🌐",
36
+ system: "⚙️",
37
+ other: "📁",
38
+ };
39
+ const typeNames = {
40
+ "package-manager": "Package Managers",
41
+ "build-tool": "Build Tools",
42
+ ide: "Development Environments",
43
+ browser: "Browsers",
44
+ system: "System Tools",
45
+ other: "Other",
46
+ };
47
+ for (const [type, infos] of groupedCaches) {
48
+ const emoji = typeEmojis[type] || "📁";
49
+ const typeName = typeNames[type] || type;
50
+ console.log(`${emoji} ${typeName}`);
51
+ for (const info of infos) {
52
+ if (info.size && info.size > 0) {
53
+ const sizeFormatted = (0, cli_1.formatSizeWithColor)(info.size);
54
+ (0, cli_1.printSuccess)(` ✅ ${info.name}: ${sizeFormatted}`);
55
+ totalSize += info.size;
56
+ foundCaches++;
57
+ }
58
+ else if (info.paths && info.paths.length > 0) {
59
+ (0, cli_1.printInfo)(` ⚪ ${info.name}: No cache data found`);
60
+ }
61
+ else {
62
+ (0, cli_1.printInfo)(` ❌ ${info.name}: Not available`);
63
+ }
64
+ }
65
+ console.log(); // Space between groups
66
+ }
67
+ // Summary
68
+ if (foundCaches > 0) {
69
+ const totalFormatted = (0, cli_1.formatSizeWithColor)(totalSize);
70
+ (0, cli_1.printSuccess)(`📊 Total cache size: ${totalFormatted} across ${foundCaches} cache${foundCaches > 1 ? "s" : ""}`);
71
+ (0, cli_1.printInfo)(`💡 Use 'squeaky clean --dry-run' to see what can be cleaned`);
72
+ }
73
+ else {
74
+ (0, cli_1.printInfo)("No cache data found. This might mean caches are already clean or tools aren't installed.");
75
+ }
76
+ }
77
+ catch (error) {
78
+ spinner.fail("Failed to scan cache directories");
79
+ throw error;
80
+ }
81
+ }
82
+ catch (error) {
83
+ (0, cli_1.printError)(`Sizes command error: ${error}`);
84
+ throw error;
85
+ }
86
+ }
87
+ //# sourceMappingURL=sizes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sizes.js","sourceRoot":"","sources":["../../src/commands/sizes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { UserConfig } from "../types";
2
+ export declare const defaultConfig: UserConfig;
3
+ declare class ConfigManager {
4
+ private conf;
5
+ private customConfig;
6
+ private customConfigPath;
7
+ constructor();
8
+ loadCustomConfig(configPath: string): void;
9
+ get(): UserConfig;
10
+ set(config: Partial<UserConfig>): void;
11
+ reset(): void;
12
+ getConfigPath(): string;
13
+ isToolEnabled(tool: keyof UserConfig["tools"]): boolean;
14
+ isCacheTypeEnabled(type: keyof UserConfig["enabledCaches"]): boolean;
15
+ shouldRequireConfirmation(): boolean;
16
+ shouldUseDryRunDefault(): boolean;
17
+ shouldShowSizes(): boolean;
18
+ shouldUseColors(): boolean;
19
+ isVerbose(): boolean;
20
+ getEmojiMode(): "on" | "off" | "minimal";
21
+ getCustomPaths(): string[];
22
+ getProtectedPaths(): string[];
23
+ }
24
+ export declare const config: ConfigManager;
25
+ export { ConfigManager };
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,eAAO,MAAM,aAAa,EAAE,UAwD3B,CAAC;AAEF,cAAM,aAAa;IACjB,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,gBAAgB,CAAuB;;IAkF/C,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAe1C,GAAG,IAAI,UAAU;IAQjB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAStC,KAAK,IAAI,IAAI;IASb,aAAa,IAAI,MAAM;IAQvB,aAAa,CAAC,IAAI,EAAE,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO;IAKvD,kBAAkB,CAAC,IAAI,EAAE,MAAM,UAAU,CAAC,eAAe,CAAC,GAAG,OAAO;IAKpE,yBAAyB,IAAI,OAAO;IAQpC,sBAAsB,IAAI,OAAO;IAKjC,eAAe,IAAI,OAAO;IAK1B,eAAe,IAAI,OAAO;IAK1B,SAAS,IAAI,OAAO;IAKpB,YAAY,IAAI,IAAI,GAAG,KAAK,GAAG,SAAS;IAMxC,cAAc,IAAI,MAAM,EAAE;IAK1B,iBAAiB,IAAI,MAAM,EAAE;CAI9B;AAED,eAAO,MAAM,MAAM,eAAsB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,228 @@
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.ConfigManager = exports.config = exports.defaultConfig = void 0;
7
+ const conf_1 = __importDefault(require("conf"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ exports.defaultConfig = {
11
+ enabledCaches: {
12
+ packageManagers: true,
13
+ buildTools: true,
14
+ browsers: false, // More conservative default
15
+ ides: false, // More conservative default
16
+ system: false, // More conservative default
17
+ },
18
+ tools: {
19
+ // Package managers
20
+ npm: true,
21
+ yarn: true,
22
+ pnpm: true,
23
+ bun: true,
24
+ pip: true, // Python pip caches are generally safe to clear
25
+ // Build tools
26
+ webpack: true,
27
+ vite: true,
28
+ nx: true,
29
+ turbo: true,
30
+ flutter: true, // Flutter caches are safe and can be large
31
+ // Browsers
32
+ chrome: false, // More conservative - browser caches can affect user experience
33
+ firefox: false,
34
+ // IDEs
35
+ vscode: true, // VS Code caches are generally safe to clear
36
+ xcode: true, // Xcode can accumulate huge caches
37
+ androidstudio: true, // Android Studio caches are safe and can be large
38
+ jetbrains: false, // More conservative for JetBrains IDEs
39
+ // System tools
40
+ docker: false, // More conservative - Docker cleanup affects containers
41
+ gradle: true, // Gradle caches are safe and can be large
42
+ maven: true, // Maven caches are safe and can be large
43
+ },
44
+ safety: {
45
+ requireConfirmation: true,
46
+ dryRunDefault: false,
47
+ backupBeforeClearing: false,
48
+ excludeSystemCritical: true,
49
+ },
50
+ customPaths: [],
51
+ protectedPaths: [], // New property
52
+ output: {
53
+ verbose: false,
54
+ showSizes: true,
55
+ useColors: true,
56
+ emojis: "on",
57
+ },
58
+ };
59
+ class ConfigManager {
60
+ constructor() {
61
+ this.customConfig = null;
62
+ this.customConfigPath = null;
63
+ this.conf = new conf_1.default({
64
+ projectName: "squeaky-clean",
65
+ projectVersion: "1.0.0",
66
+ defaults: exports.defaultConfig,
67
+ schema: {
68
+ enabledCaches: {
69
+ type: "object",
70
+ properties: {
71
+ packageManagers: { type: "boolean" },
72
+ buildTools: { type: "boolean" },
73
+ browsers: { type: "boolean" },
74
+ ides: { type: "boolean" },
75
+ system: { type: "boolean" },
76
+ },
77
+ },
78
+ tools: {
79
+ type: "object",
80
+ properties: {
81
+ // Package managers
82
+ npm: { type: "boolean" },
83
+ yarn: { type: "boolean" },
84
+ pnpm: { type: "boolean" },
85
+ bun: { type: "boolean" },
86
+ pip: { type: "boolean" },
87
+ // Build tools
88
+ webpack: { type: "boolean" },
89
+ vite: { type: "boolean" },
90
+ nx: { type: "boolean" },
91
+ turbo: { type: "boolean" },
92
+ flutter: { type: "boolean" },
93
+ // Browsers
94
+ chrome: { type: "boolean" },
95
+ firefox: { type: "boolean" },
96
+ // IDEs
97
+ vscode: { type: "boolean" },
98
+ xcode: { type: "boolean" },
99
+ androidstudio: { type: "boolean" },
100
+ jetbrains: { type: "boolean" },
101
+ // System tools
102
+ docker: { type: "boolean" },
103
+ gradle: { type: "boolean" },
104
+ maven: { type: "boolean" },
105
+ },
106
+ },
107
+ safety: {
108
+ type: "object",
109
+ properties: {
110
+ requireConfirmation: { type: "boolean" },
111
+ dryRunDefault: { type: "boolean" },
112
+ backupBeforeClearing: { type: "boolean" },
113
+ excludeSystemCritical: { type: "boolean" },
114
+ },
115
+ },
116
+ customPaths: {
117
+ type: "array",
118
+ items: { type: "string" },
119
+ },
120
+ protectedPaths: {
121
+ // New property
122
+ type: "array",
123
+ items: { type: "string" },
124
+ },
125
+ output: {
126
+ type: "object",
127
+ properties: {
128
+ verbose: { type: "boolean" },
129
+ showSizes: { type: "boolean" },
130
+ useColors: { type: "boolean" },
131
+ emojis: { type: "string", enum: ["on", "off", "minimal"] },
132
+ },
133
+ },
134
+ },
135
+ });
136
+ }
137
+ loadCustomConfig(configPath) {
138
+ try {
139
+ const resolvedPath = path_1.default.resolve(configPath);
140
+ if (!fs_1.default.existsSync(resolvedPath)) {
141
+ throw new Error(`Config file not found: ${resolvedPath}`);
142
+ }
143
+ const configContent = fs_1.default.readFileSync(resolvedPath, "utf-8");
144
+ this.customConfig = JSON.parse(configContent);
145
+ this.customConfigPath = resolvedPath;
146
+ }
147
+ catch (error) {
148
+ throw new Error(`Failed to load config from ${configPath}: ${error}`);
149
+ }
150
+ }
151
+ get() {
152
+ // If custom config is loaded, return it instead of the default
153
+ if (this.customConfig) {
154
+ return this.customConfig;
155
+ }
156
+ return this.conf.store;
157
+ }
158
+ set(config) {
159
+ if (this.customConfig) {
160
+ // Update custom config in memory (but don't save to file)
161
+ this.customConfig = { ...this.customConfig, ...config };
162
+ }
163
+ else {
164
+ this.conf.set(config);
165
+ }
166
+ }
167
+ reset() {
168
+ if (this.customConfig) {
169
+ this.customConfig = null;
170
+ this.customConfigPath = null;
171
+ }
172
+ else {
173
+ this.conf.clear();
174
+ }
175
+ }
176
+ getConfigPath() {
177
+ if (this.customConfigPath) {
178
+ return this.customConfigPath;
179
+ }
180
+ return this.conf.path;
181
+ }
182
+ // Specific getters for convenience
183
+ isToolEnabled(tool) {
184
+ const config = this.get();
185
+ return config.tools?.[tool] ?? exports.defaultConfig.tools[tool];
186
+ }
187
+ isCacheTypeEnabled(type) {
188
+ const config = this.get();
189
+ return config.enabledCaches?.[type] ?? exports.defaultConfig.enabledCaches[type];
190
+ }
191
+ shouldRequireConfirmation() {
192
+ const config = this.get();
193
+ return (config.safety?.requireConfirmation ??
194
+ exports.defaultConfig.safety.requireConfirmation);
195
+ }
196
+ shouldUseDryRunDefault() {
197
+ const config = this.get();
198
+ return config.safety?.dryRunDefault ?? exports.defaultConfig.safety.dryRunDefault;
199
+ }
200
+ shouldShowSizes() {
201
+ const config = this.get();
202
+ return config.output?.showSizes ?? exports.defaultConfig.output.showSizes;
203
+ }
204
+ shouldUseColors() {
205
+ const config = this.get();
206
+ return config.output?.useColors ?? exports.defaultConfig.output.useColors;
207
+ }
208
+ isVerbose() {
209
+ const config = this.get();
210
+ return config.output?.verbose ?? exports.defaultConfig.output.verbose;
211
+ }
212
+ getEmojiMode() {
213
+ const config = this.get();
214
+ const output = config.output;
215
+ return output?.emojis ?? exports.defaultConfig.output.emojis;
216
+ }
217
+ getCustomPaths() {
218
+ const config = this.get();
219
+ return config.customPaths ?? exports.defaultConfig.customPaths;
220
+ }
221
+ getProtectedPaths() {
222
+ const config = this.get();
223
+ return config.protectedPaths ?? [];
224
+ }
225
+ }
226
+ exports.ConfigManager = ConfigManager;
227
+ exports.config = new ConfigManager();
228
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type SqueakyConfig = Record<string, any>;
2
+ export declare function loadJson(filePath: string): Promise<any>;
3
+ export declare function expandEnv(str: string): string;
4
+ export declare function deepMerge<T>(base: T, next: Partial<T>): T;
5
+ export declare function resolveExtendsChain(entries: string | string[] | undefined, fromPath: string): Promise<any[]>;
6
+ export declare function loadAndValidateConfig(configPath: string): Promise<SqueakyConfig>;
7
+ //# sourceMappingURL=loadConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEhD,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAG7D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAUzD;AAmBD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,EAAE,CAAC,CAWhB;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAoCxB"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ // src/config/loadConfig.ts
3
+ // uses Ajv for schema validation
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.loadJson = loadJson;
9
+ exports.expandEnv = expandEnv;
10
+ exports.deepMerge = deepMerge;
11
+ exports.resolveExtendsChain = resolveExtendsChain;
12
+ exports.loadAndValidateConfig = loadAndValidateConfig;
13
+ const node_fs_1 = __importDefault(require("node:fs"));
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const ajv_1 = __importDefault(require("ajv"));
16
+ const ajv_formats_1 = __importDefault(require("ajv-formats"));
17
+ const ajv = new ajv_1.default({ allErrors: true, strict: true, allowUnionTypes: true });
18
+ (0, ajv_formats_1.default)(ajv);
19
+ async function loadJson(filePath) {
20
+ const raw = await node_fs_1.default.promises.readFile(filePath, "utf8");
21
+ return JSON.parse(raw);
22
+ }
23
+ function expandEnv(str) {
24
+ // Supports ${VAR} and tilde
25
+ const tilde = str.startsWith("~")
26
+ ? str.replace(/^~(?=\/|$)/, process.env.HOME || "~")
27
+ : str;
28
+ return tilde.replace(/\$\{([^}]+)\}/g, (_, key) => process.env[key] ?? "");
29
+ }
30
+ function deepMerge(base, next) {
31
+ if (Array.isArray(base) && Array.isArray(next))
32
+ return next;
33
+ if (typeof base === "object" && base && typeof next === "object" && next) {
34
+ const out = { ...base };
35
+ for (const [k, v] of Object.entries(next)) {
36
+ out[k] = k in out ? deepMerge(out[k], v) : v;
37
+ }
38
+ return out;
39
+ }
40
+ return next ?? base;
41
+ }
42
+ async function resolveMaybePackage(idOrPath, cwd) {
43
+ if (idOrPath.startsWith(".") ||
44
+ idOrPath.startsWith("/") ||
45
+ idOrPath.startsWith("~")) {
46
+ const expanded = expandEnv(idOrPath);
47
+ return node_path_1.default.isAbsolute(expanded) ? expanded : node_path_1.default.join(cwd, expanded);
48
+ }
49
+ // Try resolve from node_modules
50
+ const pkgPath = require.resolve(idOrPath, { paths: [cwd] });
51
+ return pkgPath;
52
+ }
53
+ async function resolveExtendsChain(entries, fromPath) {
54
+ if (!entries)
55
+ return [];
56
+ const cwd = node_path_1.default.dirname(fromPath);
57
+ const arr = Array.isArray(entries) ? entries : [entries];
58
+ const resolved = [];
59
+ for (const entry of arr) {
60
+ const target = await resolveMaybePackage(entry, cwd);
61
+ const json = await loadJson(target);
62
+ resolved.push({ json, source: target });
63
+ }
64
+ return resolved;
65
+ }
66
+ async function loadAndValidateConfig(configPath) {
67
+ const schemaPath = node_path_1.default.join(process.cwd(), "schemas/config.schema.json");
68
+ const schema = await loadJson(schemaPath);
69
+ const validate = ajv.compile(schema);
70
+ const root = await loadJson(configPath);
71
+ // Expand env in string leafs (shallow pass; paths/args/etc)
72
+ function expandLeaves(obj) {
73
+ if (typeof obj === "string")
74
+ return expandEnv(obj);
75
+ if (Array.isArray(obj))
76
+ return obj.map(expandLeaves);
77
+ if (obj && typeof obj === "object") {
78
+ const out = {};
79
+ for (const [k, v] of Object.entries(obj))
80
+ out[k] = expandLeaves(v);
81
+ return out;
82
+ }
83
+ return obj;
84
+ }
85
+ // Resolve extends -> merge left-to-right, then merge root last
86
+ const chain = await resolveExtendsChain(root.extends, configPath);
87
+ let merged = {};
88
+ for (const link of chain)
89
+ merged = deepMerge(merged, expandLeaves(link.json));
90
+ merged = deepMerge(merged, expandLeaves(root));
91
+ // Validate final object
92
+ const ok = validate(merged);
93
+ if (!ok) {
94
+ const errors = validate.errors
95
+ .map((e) => `${e.instancePath} ${e.message}`)
96
+ .join("\n");
97
+ const err = new Error(`Invalid config: \n${errors}`);
98
+ err.errors = validate.errors;
99
+ throw err;
100
+ }
101
+ return merged;
102
+ }
103
+ //# sourceMappingURL=loadConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export type LegacyConfig = {
2
+ tools?: Record<string, any>;
3
+ auto?: {
4
+ enabled?: boolean;
5
+ schedule?: "daily" | "weekly" | "monthly";
6
+ dayOfWeek?: string | number;
7
+ time?: string;
8
+ sizeThreshold?: string;
9
+ args?: string[];
10
+ };
11
+ output?: {
12
+ verbose?: boolean;
13
+ useColors?: boolean;
14
+ };
15
+ extends?: string | string[];
16
+ [k: string]: any;
17
+ };
18
+ export type NewConfig = {
19
+ cleaners?: Record<string, any>;
20
+ scheduler?: {
21
+ enabled?: boolean;
22
+ frequency?: "daily" | "weekly" | "monthly";
23
+ dayOfWeek?: string | number;
24
+ time?: string;
25
+ args?: string[];
26
+ };
27
+ defaults?: {
28
+ dryRun?: boolean;
29
+ followSymlinks?: boolean;
30
+ restrictToHome?: boolean;
31
+ trash?: boolean;
32
+ concurrency?: number;
33
+ recentDays?: number;
34
+ sizeScan?: {
35
+ enableCache?: boolean;
36
+ cachePath?: string;
37
+ maxParallelFs?: number;
38
+ };
39
+ };
40
+ plugins?: {
41
+ enabled?: boolean;
42
+ scopes?: string[];
43
+ prefixes?: string[];
44
+ };
45
+ profiles?: Record<string, {
46
+ description?: string;
47
+ include?: string[];
48
+ exclude?: string[];
49
+ }>;
50
+ extends?: string | string[];
51
+ [k: string]: any;
52
+ };
53
+ export declare function isLegacyShape(json: any): boolean;
54
+ export declare function legacyToNew(json: LegacyConfig): NewConfig;
55
+ export declare function writeBackupAndSave(targetPath: string, newJson: object): string;
56
+ //# sourceMappingURL=migrateConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrateConfig.d.ts","sourceRoot":"","sources":["../../src/config/migrateConfig.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC3C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE;YACT,WAAW,CAAC,EAAE,OAAO,CAAC;YACtB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,CAAC;IACF,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACxE,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CACjE,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,CA4EzD;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,MAAM,CAeR"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ // src/config/migrateConfig.ts
3
+ // Drop-in for: migrate/doctor
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.isLegacyShape = isLegacyShape;
9
+ exports.legacyToNew = legacyToNew;
10
+ exports.writeBackupAndSave = writeBackupAndSave;
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ function isLegacyShape(json) {
14
+ return !!(json && (json.tools || json.auto || json.output));
15
+ }
16
+ function legacyToNew(json) {
17
+ const out = {};
18
+ // Check if there are already new-style keys, give them precedence
19
+ const hasCleaners = json.cleaners && typeof json.cleaners === "object";
20
+ const hasScheduler = json.scheduler && typeof json.scheduler === "object";
21
+ const hasDefaults = json.defaults && typeof json.defaults === "object";
22
+ // 1) tools -> cleaners (only if cleaners doesn't already exist)
23
+ if (json.tools && typeof json.tools === "object" && !hasCleaners) {
24
+ out.cleaners = { ...json.tools };
25
+ }
26
+ else if (hasCleaners) {
27
+ out.cleaners = json.cleaners;
28
+ }
29
+ // 2) auto -> scheduler (only if scheduler doesn't already exist)
30
+ if (json.auto && typeof json.auto === "object" && !hasScheduler) {
31
+ out.scheduler = {
32
+ enabled: json.auto.enabled,
33
+ frequency: json.auto.schedule,
34
+ dayOfWeek: json.auto.dayOfWeek,
35
+ time: json.auto.time,
36
+ args: json.auto.args,
37
+ };
38
+ // If old configs used sizeThreshold, keep it as a hint flag on args
39
+ if (json.auto.sizeThreshold && out.scheduler) {
40
+ out.scheduler.args = [
41
+ ...(out.scheduler.args ?? []),
42
+ "--size-threshold",
43
+ String(json.auto.sizeThreshold),
44
+ ];
45
+ }
46
+ }
47
+ else if (hasScheduler) {
48
+ out.scheduler = json.scheduler;
49
+ }
50
+ // 3) output -> defaults (only if defaults doesn't already exist)
51
+ if (json.output && typeof json.output === "object" && !hasDefaults) {
52
+ out.defaults = {
53
+ // dryRun remains user-controlled; don't infer from verbose/useColors
54
+ // Carry nothing by default—these were UI prefs. If you prefer, you can stash them:
55
+ // keep legacy UI hints
56
+ _legacyOutput: json.output,
57
+ };
58
+ }
59
+ else if (hasDefaults) {
60
+ out.defaults = json.defaults;
61
+ }
62
+ // 4) passthrough: extends/plugins/profiles if already present
63
+ if (json.extends)
64
+ out.extends = json.extends;
65
+ if (json.plugins)
66
+ out.plugins = json.plugins;
67
+ if (json.profiles)
68
+ out.profiles = json.profiles;
69
+ // 5) bring forward unknown top-level keys as-is (non-invasive)
70
+ for (const [k, v] of Object.entries(json)) {
71
+ if ([
72
+ "tools",
73
+ "auto",
74
+ "output",
75
+ "extends",
76
+ "plugins",
77
+ "profiles",
78
+ "cleaners",
79
+ "scheduler",
80
+ "defaults",
81
+ ].includes(k))
82
+ continue;
83
+ if (!(k in out))
84
+ out[k] = v;
85
+ }
86
+ return out;
87
+ }
88
+ function writeBackupAndSave(targetPath, newJson) {
89
+ const dir = node_path_1.default.dirname(targetPath);
90
+ const base = node_path_1.default.basename(targetPath);
91
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
92
+ const backup = node_path_1.default.join(dir, `${base}.backup.${stamp}.json`);
93
+ const pretty = (o) => JSON.stringify(o, null, 2);
94
+ // Backup original if exists
95
+ if (node_fs_1.default.existsSync(targetPath)) {
96
+ const src = node_fs_1.default.readFileSync(targetPath, "utf8");
97
+ node_fs_1.default.writeFileSync(backup, src, "utf8");
98
+ }
99
+ node_fs_1.default.writeFileSync(targetPath, pretty(newJson) + "\n", "utf8");
100
+ return backup;
101
+ }
102
+ //# sourceMappingURL=migrateConfig.js.map