appclean 1.8.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 (154) hide show
  1. package/.github/workflows/publish.yml +41 -0
  2. package/.github/workflows/test.yml +37 -0
  3. package/ACTION_CHECKLIST.md +342 -0
  4. package/APPCLEAN_SUMMARY.md +309 -0
  5. package/CHANGELOG.md +205 -0
  6. package/CODE_OF_CONDUCT.md +49 -0
  7. package/CODE_REVIEW_REPORT.md +447 -0
  8. package/COMMUNITY_POSTS.md +307 -0
  9. package/CONTRIBUTING.md +121 -0
  10. package/DEPLOYMENT_GUIDE.md +345 -0
  11. package/DEPLOYMENT_STATUS.md +182 -0
  12. package/EXECUTIVE_REPORT.md +393 -0
  13. package/GITHUB_OPTIMIZATION.md +383 -0
  14. package/INDEX.md +165 -0
  15. package/LICENSE +21 -0
  16. package/MARKETING_SUMMARY.md +352 -0
  17. package/NPM_PACKAGE_OPTIMIZATION.md +281 -0
  18. package/NPM_PUBLISH.md +116 -0
  19. package/PROJECT_SUMMARY.txt +249 -0
  20. package/QUICKSTART.md +219 -0
  21. package/README.md +548 -0
  22. package/SECURITY.md +104 -0
  23. package/SETUP_GITHUB.md +237 -0
  24. package/TESTING_SUMMARY.md +379 -0
  25. package/dist/core/appUpdateChecker.d.ts +23 -0
  26. package/dist/core/appUpdateChecker.d.ts.map +1 -0
  27. package/dist/core/appUpdateChecker.js +159 -0
  28. package/dist/core/appUpdateChecker.js.map +1 -0
  29. package/dist/core/detector.d.ts +13 -0
  30. package/dist/core/detector.d.ts.map +1 -0
  31. package/dist/core/detector.js +99 -0
  32. package/dist/core/detector.js.map +1 -0
  33. package/dist/core/duplicateFileFinder.d.ts +14 -0
  34. package/dist/core/duplicateFileFinder.d.ts.map +1 -0
  35. package/dist/core/duplicateFileFinder.js +80 -0
  36. package/dist/core/duplicateFileFinder.js.map +1 -0
  37. package/dist/core/orphanedDependencyDetector.d.ts +19 -0
  38. package/dist/core/orphanedDependencyDetector.d.ts.map +1 -0
  39. package/dist/core/orphanedDependencyDetector.js +148 -0
  40. package/dist/core/orphanedDependencyDetector.js.map +1 -0
  41. package/dist/core/performanceOptimizer.d.ts +37 -0
  42. package/dist/core/performanceOptimizer.d.ts.map +1 -0
  43. package/dist/core/performanceOptimizer.js +128 -0
  44. package/dist/core/performanceOptimizer.js.map +1 -0
  45. package/dist/core/permissionHandler.d.ts +9 -0
  46. package/dist/core/permissionHandler.d.ts.map +1 -0
  47. package/dist/core/permissionHandler.js +89 -0
  48. package/dist/core/permissionHandler.js.map +1 -0
  49. package/dist/core/pluginSystem.d.ts +39 -0
  50. package/dist/core/pluginSystem.d.ts.map +1 -0
  51. package/dist/core/pluginSystem.js +120 -0
  52. package/dist/core/pluginSystem.js.map +1 -0
  53. package/dist/core/removalRecorder.d.ts +32 -0
  54. package/dist/core/removalRecorder.d.ts.map +1 -0
  55. package/dist/core/removalRecorder.js +79 -0
  56. package/dist/core/removalRecorder.js.map +1 -0
  57. package/dist/core/remover.d.ts +15 -0
  58. package/dist/core/remover.d.ts.map +1 -0
  59. package/dist/core/remover.js +225 -0
  60. package/dist/core/remover.js.map +1 -0
  61. package/dist/core/reportGenerator.d.ts +9 -0
  62. package/dist/core/reportGenerator.d.ts.map +1 -0
  63. package/dist/core/reportGenerator.js +328 -0
  64. package/dist/core/reportGenerator.js.map +1 -0
  65. package/dist/core/scheduledCleanup.d.ts +38 -0
  66. package/dist/core/scheduledCleanup.d.ts.map +1 -0
  67. package/dist/core/scheduledCleanup.js +127 -0
  68. package/dist/core/scheduledCleanup.js.map +1 -0
  69. package/dist/core/serviceFileDetector.d.ts +18 -0
  70. package/dist/core/serviceFileDetector.d.ts.map +1 -0
  71. package/dist/core/serviceFileDetector.js +136 -0
  72. package/dist/core/serviceFileDetector.js.map +1 -0
  73. package/dist/core/verificationModule.d.ts +14 -0
  74. package/dist/core/verificationModule.d.ts.map +1 -0
  75. package/dist/core/verificationModule.js +102 -0
  76. package/dist/core/verificationModule.js.map +1 -0
  77. package/dist/index.d.ts +3 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +333 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/managers/brewManager.d.ts +10 -0
  82. package/dist/managers/brewManager.d.ts.map +1 -0
  83. package/dist/managers/brewManager.js +130 -0
  84. package/dist/managers/brewManager.js.map +1 -0
  85. package/dist/managers/customManager.d.ts +8 -0
  86. package/dist/managers/customManager.d.ts.map +1 -0
  87. package/dist/managers/customManager.js +139 -0
  88. package/dist/managers/customManager.js.map +1 -0
  89. package/dist/managers/linuxManager.d.ts +10 -0
  90. package/dist/managers/linuxManager.d.ts.map +1 -0
  91. package/dist/managers/linuxManager.js +191 -0
  92. package/dist/managers/linuxManager.js.map +1 -0
  93. package/dist/managers/npmManager.d.ts +10 -0
  94. package/dist/managers/npmManager.d.ts.map +1 -0
  95. package/dist/managers/npmManager.js +119 -0
  96. package/dist/managers/npmManager.js.map +1 -0
  97. package/dist/types/index.d.ts +44 -0
  98. package/dist/types/index.d.ts.map +1 -0
  99. package/dist/types/index.js +3 -0
  100. package/dist/types/index.js.map +1 -0
  101. package/dist/ui/guiServer.d.ts +10 -0
  102. package/dist/ui/guiServer.d.ts.map +1 -0
  103. package/dist/ui/guiServer.js +134 -0
  104. package/dist/ui/guiServer.js.map +1 -0
  105. package/dist/ui/menu.d.ts +6 -0
  106. package/dist/ui/menu.d.ts.map +1 -0
  107. package/dist/ui/menu.js +93 -0
  108. package/dist/ui/menu.js.map +1 -0
  109. package/dist/ui/prompts.d.ts +13 -0
  110. package/dist/ui/prompts.d.ts.map +1 -0
  111. package/dist/ui/prompts.js +161 -0
  112. package/dist/ui/prompts.js.map +1 -0
  113. package/dist/utils/filesystem.d.ts +13 -0
  114. package/dist/utils/filesystem.d.ts.map +1 -0
  115. package/dist/utils/filesystem.js +152 -0
  116. package/dist/utils/filesystem.js.map +1 -0
  117. package/dist/utils/logger.d.ts +12 -0
  118. package/dist/utils/logger.d.ts.map +1 -0
  119. package/dist/utils/logger.js +49 -0
  120. package/dist/utils/logger.js.map +1 -0
  121. package/dist/utils/platform.d.ts +9 -0
  122. package/dist/utils/platform.d.ts.map +1 -0
  123. package/dist/utils/platform.js +75 -0
  124. package/dist/utils/platform.js.map +1 -0
  125. package/jest.config.js +20 -0
  126. package/logo.svg +60 -0
  127. package/package.json +55 -0
  128. package/setup-github.sh +125 -0
  129. package/src/core/appUpdateChecker.ts +220 -0
  130. package/src/core/detector.ts +133 -0
  131. package/src/core/duplicateFileFinder.ts +113 -0
  132. package/src/core/orphanedDependencyDetector.ts +195 -0
  133. package/src/core/performanceOptimizer.ts +209 -0
  134. package/src/core/permissionHandler.ts +121 -0
  135. package/src/core/pluginSystem.ts +194 -0
  136. package/src/core/removalRecorder.ts +146 -0
  137. package/src/core/remover.ts +280 -0
  138. package/src/core/reportGenerator.ts +354 -0
  139. package/src/core/scheduledCleanup.ts +204 -0
  140. package/src/core/serviceFileDetector.ts +181 -0
  141. package/src/core/verificationModule.ts +140 -0
  142. package/src/index.ts +449 -0
  143. package/src/managers/brewManager.ts +149 -0
  144. package/src/managers/customManager.ts +167 -0
  145. package/src/managers/linuxManager.ts +210 -0
  146. package/src/managers/npmManager.ts +137 -0
  147. package/src/types/index.ts +59 -0
  148. package/src/ui/guiServer.ts +155 -0
  149. package/src/ui/menu.ts +100 -0
  150. package/src/ui/prompts.ts +177 -0
  151. package/src/utils/filesystem.ts +145 -0
  152. package/src/utils/logger.ts +48 -0
  153. package/src/utils/platform.ts +75 -0
  154. package/tsconfig.json +20 -0
@@ -0,0 +1,93 @@
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.showMainMenu = showMainMenu;
7
+ exports.showAppMenu = showAppMenu;
8
+ exports.showHeader = showHeader;
9
+ exports.showHelp = showHelp;
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ async function showMainMenu() {
13
+ const { action } = await inquirer_1.default.prompt([
14
+ {
15
+ type: 'list',
16
+ name: 'action',
17
+ message: 'What would you like to do?',
18
+ choices: [
19
+ { name: '🔍 Search for an app', value: 'search' },
20
+ { name: '📋 List all installed apps', value: 'list-all' },
21
+ { name: '❓ Help', value: 'help' },
22
+ { name: '❌ Exit', value: 'exit' },
23
+ ],
24
+ },
25
+ ]);
26
+ return action;
27
+ }
28
+ async function showAppMenu() {
29
+ const { action } = await inquirer_1.default.prompt([
30
+ {
31
+ type: 'list',
32
+ name: 'action',
33
+ message: 'What would you like to do?',
34
+ choices: [
35
+ { name: '📊 View details and artifacts', value: 'details' },
36
+ { name: '🗑️ Remove this app', value: 'remove' },
37
+ { name: '⬅️ Back to search', value: 'back' },
38
+ ],
39
+ },
40
+ ]);
41
+ return action;
42
+ }
43
+ function showHeader() {
44
+ console.clear();
45
+ console.log(chalk_1.default.cyan(`
46
+ ╔═══════════════════════════════════════════════════════════╗
47
+ ║ ║
48
+ ║ ${chalk_1.default.bold('AppClean - App Uninstaller')} ║
49
+ ║ Remove apps and all their artifacts ║
50
+ ║ ║
51
+ ╚═══════════════════════════════════════════════════════════╝
52
+ `));
53
+ }
54
+ function showHelp() {
55
+ console.log(chalk_1.default.cyan(`
56
+ ${chalk_1.default.bold('AppClean - Help')}
57
+
58
+ ${chalk_1.default.bold('Features:')}
59
+ • Search and find all installed applications
60
+ • Identify installation method (npm, brew, apt, custom, etc)
61
+ • Locate all related files, configs, and caches
62
+ • Safely remove apps with dry-run preview
63
+ • Create backups before deletion
64
+ • Cross-platform support (macOS, Linux, Windows)
65
+
66
+ ${chalk_1.default.bold('Commands:')}
67
+ appclean Start interactive mode
68
+ appclean search <name> Search for an app
69
+ appclean remove <name> Remove an app
70
+ appclean list List all apps
71
+ appclean analyze <name> Show app artifacts
72
+
73
+ ${chalk_1.default.bold('Options:')}
74
+ --dry-run Preview without deleting
75
+ --backup Create backup before removal
76
+ --help Show this help message
77
+ --version Show version
78
+
79
+ ${chalk_1.default.bold('Examples:')}
80
+ appclean search nodejs Search for nodejs
81
+ appclean remove myapp --dry-run Preview removal
82
+ appclean list | grep npm Find npm-installed apps
83
+
84
+ ${chalk_1.default.bold('Safety:')}
85
+ • Always previews what will be deleted
86
+ • Use --dry-run first to see what will happen
87
+ • Use --backup to create backups before deletion
88
+ • Double confirmation before actual removal
89
+
90
+ ${chalk_1.default.bold('Website:')} https://github.com/YOUR_USERNAME/appclean
91
+ `));
92
+ }
93
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/ui/menu.ts"],"names":[],"mappings":";;;;;AAUA,oCAgBC;AAED,kCAeC;AAED,gCAYC;AAED,4BAwCC;AAnGD,wDAAgC;AAChC,kDAA0B;AASnB,KAAK,UAAU,YAAY;IAChC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACvC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAClD,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,UAAU,EAAE;gBACzD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;gBACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;aAClC;SACF;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,WAAW;IAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACvC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC3D,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACjD,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE;aAC9C;SACF;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC;;;eAGA,eAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC;;;;GAIpD,CAAC,CACD,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC;EACb,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;;EAE7B,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;;;EAQvB,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;;EAOvB,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;;;;;;EAMtB,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;EAKvB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;;;;;;EAMrB,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;GACrB,CAAC,CACD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { InstalledApp, ArtifactPath } from '../types';
2
+ export declare function promptSearchQuery(): Promise<string>;
3
+ export declare function promptSelectApp(apps: InstalledApp[]): Promise<InstalledApp | null>;
4
+ export declare function promptConfirmRemoval(appName: string): Promise<boolean>;
5
+ export declare function promptRemovalOptions(): Promise<{
6
+ dryRun: boolean;
7
+ createBackup: boolean;
8
+ }>;
9
+ export declare function promptInstallMethodFilter(): Promise<string | null>;
10
+ export declare function promptSortBy(): Promise<'name' | 'date' | 'size'>;
11
+ export declare function displayAppDetails(app: InstalledApp, artifacts: ArtifactPath[]): void;
12
+ export declare function promptFinalConfirmation(appName: string): Promise<boolean>;
13
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAItD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAUzD;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0BxF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5E;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CAyBD;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAetE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,CAkCpF;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa/E"}
@@ -0,0 +1,161 @@
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.promptSearchQuery = promptSearchQuery;
7
+ exports.promptSelectApp = promptSelectApp;
8
+ exports.promptConfirmRemoval = promptConfirmRemoval;
9
+ exports.promptRemovalOptions = promptRemovalOptions;
10
+ exports.promptInstallMethodFilter = promptInstallMethodFilter;
11
+ exports.promptSortBy = promptSortBy;
12
+ exports.displayAppDetails = displayAppDetails;
13
+ exports.promptFinalConfirmation = promptFinalConfirmation;
14
+ const inquirer_1 = __importDefault(require("inquirer"));
15
+ const logger_1 = require("../utils/logger");
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ async function promptSearchQuery() {
18
+ const { query } = await inquirer_1.default.prompt([
19
+ {
20
+ type: 'input',
21
+ name: 'query',
22
+ message: 'Search for an app (partial name):',
23
+ default: '',
24
+ },
25
+ ]);
26
+ return query;
27
+ }
28
+ async function promptSelectApp(apps) {
29
+ if (apps.length === 0) {
30
+ logger_1.Logger.warn('No apps found');
31
+ return null;
32
+ }
33
+ const choices = apps.map((app) => ({
34
+ name: `${app.name} (${app.installMethod}) - v${app.version}`,
35
+ value: app,
36
+ }));
37
+ const { app } = await inquirer_1.default.prompt([
38
+ {
39
+ type: 'list',
40
+ name: 'app',
41
+ message: 'Select an app to remove:',
42
+ choices: [
43
+ ...choices,
44
+ new inquirer_1.default.Separator(),
45
+ { name: 'Cancel', value: null },
46
+ ],
47
+ pageSize: 10,
48
+ },
49
+ ]);
50
+ return app;
51
+ }
52
+ async function promptConfirmRemoval(appName) {
53
+ const { confirmed } = await inquirer_1.default.prompt([
54
+ {
55
+ type: 'confirm',
56
+ name: 'confirmed',
57
+ message: chalk_1.default.yellow(`Are you sure you want to remove ${appName}?`),
58
+ default: false,
59
+ },
60
+ ]);
61
+ return confirmed;
62
+ }
63
+ async function promptRemovalOptions() {
64
+ const { options } = await inquirer_1.default.prompt([
65
+ {
66
+ type: 'checkbox',
67
+ name: 'options',
68
+ message: 'Removal options:',
69
+ choices: [
70
+ {
71
+ name: 'Dry run (preview without removing)',
72
+ value: 'dryRun',
73
+ checked: true,
74
+ },
75
+ {
76
+ name: 'Create backup before removal',
77
+ value: 'backup',
78
+ checked: false,
79
+ },
80
+ ],
81
+ },
82
+ ]);
83
+ return {
84
+ dryRun: options.includes('dryRun'),
85
+ createBackup: options.includes('backup'),
86
+ };
87
+ }
88
+ async function promptInstallMethodFilter() {
89
+ const { method } = await inquirer_1.default.prompt([
90
+ {
91
+ type: 'list',
92
+ name: 'method',
93
+ message: 'Filter by installation method:',
94
+ choices: [
95
+ { name: 'All', value: null },
96
+ { name: 'npm', value: 'npm' },
97
+ { name: 'yarn', value: 'yarn' },
98
+ { name: 'pnpm', value: 'pnpm' },
99
+ { name: 'Homebrew', value: 'brew' },
100
+ { name: 'apt', value: 'apt' },
101
+ { name: 'yum', value: 'yum' },
102
+ { name: 'dnf', value: 'dnf' },
103
+ { name: 'Custom', value: 'custom' },
104
+ ],
105
+ },
106
+ ]);
107
+ return method;
108
+ }
109
+ async function promptSortBy() {
110
+ const { sortBy } = await inquirer_1.default.prompt([
111
+ {
112
+ type: 'list',
113
+ name: 'sortBy',
114
+ message: 'Sort results by:',
115
+ choices: [
116
+ { name: 'Name', value: 'name' },
117
+ { name: 'Installation Date', value: 'date' },
118
+ { name: 'Size', value: 'size' },
119
+ ],
120
+ },
121
+ ]);
122
+ return sortBy;
123
+ }
124
+ function displayAppDetails(app, artifacts) {
125
+ logger_1.Logger.space();
126
+ logger_1.Logger.info(`App: ${chalk_1.default.cyan(app.name)}`);
127
+ logger_1.Logger.info(`Method: ${chalk_1.default.yellow(app.installMethod)}`);
128
+ logger_1.Logger.info(`Version: ${app.version}`);
129
+ logger_1.Logger.info(`Location: ${app.mainPath}`);
130
+ logger_1.Logger.space();
131
+ logger_1.Logger.info('Associated files and directories:');
132
+ logger_1.Logger.space();
133
+ let totalSize = 0;
134
+ for (const artifact of artifacts) {
135
+ const size = artifact.size || 0;
136
+ totalSize += size;
137
+ const icon = artifact.type === 'binary'
138
+ ? '⚙️'
139
+ : artifact.type === 'config'
140
+ ? '⚙️'
141
+ : artifact.type === 'cache'
142
+ ? '📦'
143
+ : '📁';
144
+ console.log(` ${icon} [${artifact.type.padEnd(7)}] ${(0, logger_1.formatBytes)(size).padEnd(10)} ${artifact.path}`);
145
+ }
146
+ logger_1.Logger.space();
147
+ logger_1.Logger.info(`Total space to be freed: ${chalk_1.default.green((0, logger_1.formatBytes)(totalSize))}`);
148
+ logger_1.Logger.space();
149
+ }
150
+ async function promptFinalConfirmation(appName) {
151
+ const { confirmed } = await inquirer_1.default.prompt([
152
+ {
153
+ type: 'confirm',
154
+ name: 'confirmed',
155
+ message: chalk_1.default.red(`This action cannot be undone. Remove ${appName} and all its files?`),
156
+ default: false,
157
+ },
158
+ ]);
159
+ return confirmed;
160
+ }
161
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function getFileSize(filePath: string): number;
2
+ export declare function getDirectorySize(dirPath: string): number;
3
+ export declare function pathExists(filePath: string): boolean;
4
+ export declare function isDirectory(filePath: string): boolean;
5
+ export declare function isFile(filePath: string): boolean;
6
+ export declare function listDirectory(dirPath: string): string[];
7
+ export declare function listDirectoryDeep(dirPath: string, maxDepth?: number, currentDepth?: number): string[];
8
+ export declare function deleteFile(filePath: string): boolean;
9
+ export declare function deleteDirectory(dirPath: string): boolean;
10
+ export declare function readFile(filePath: string): string | null;
11
+ export declare function writeFile(filePath: string, content: string): boolean;
12
+ export declare function getModificationTime(filePath: string): Date | null;
13
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUpD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkBxD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMhD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAMvD;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAU,EACpB,YAAY,GAAE,MAAU,GACvB,MAAM,EAAE,CA8BV;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOxD;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxD;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAWpE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAMjE"}
@@ -0,0 +1,152 @@
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.getFileSize = getFileSize;
7
+ exports.getDirectorySize = getDirectorySize;
8
+ exports.pathExists = pathExists;
9
+ exports.isDirectory = isDirectory;
10
+ exports.isFile = isFile;
11
+ exports.listDirectory = listDirectory;
12
+ exports.listDirectoryDeep = listDirectoryDeep;
13
+ exports.deleteFile = deleteFile;
14
+ exports.deleteDirectory = deleteDirectory;
15
+ exports.readFile = readFile;
16
+ exports.writeFile = writeFile;
17
+ exports.getModificationTime = getModificationTime;
18
+ const fs_1 = __importDefault(require("fs"));
19
+ const path_1 = __importDefault(require("path"));
20
+ function getFileSize(filePath) {
21
+ try {
22
+ const stats = fs_1.default.statSync(filePath);
23
+ if (stats.isDirectory()) {
24
+ return getDirectorySize(filePath);
25
+ }
26
+ return stats.size;
27
+ }
28
+ catch {
29
+ return 0;
30
+ }
31
+ }
32
+ function getDirectorySize(dirPath) {
33
+ try {
34
+ let size = 0;
35
+ const files = fs_1.default.readdirSync(dirPath, { withFileTypes: true });
36
+ for (const file of files) {
37
+ const fullPath = path_1.default.join(dirPath, file.name);
38
+ if (file.isDirectory()) {
39
+ size += getDirectorySize(fullPath);
40
+ }
41
+ else {
42
+ const stats = fs_1.default.statSync(fullPath);
43
+ size += stats.size;
44
+ }
45
+ }
46
+ return size;
47
+ }
48
+ catch {
49
+ return 0;
50
+ }
51
+ }
52
+ function pathExists(filePath) {
53
+ return fs_1.default.existsSync(filePath);
54
+ }
55
+ function isDirectory(filePath) {
56
+ try {
57
+ return fs_1.default.statSync(filePath).isDirectory();
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ function isFile(filePath) {
64
+ try {
65
+ return fs_1.default.statSync(filePath).isFile();
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ function listDirectory(dirPath) {
72
+ try {
73
+ return fs_1.default.readdirSync(dirPath);
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ }
79
+ function listDirectoryDeep(dirPath, maxDepth = 5, currentDepth = 0) {
80
+ const files = [];
81
+ if (currentDepth >= maxDepth)
82
+ return files;
83
+ try {
84
+ const entries = fs_1.default.readdirSync(dirPath, { withFileTypes: true });
85
+ for (const entry of entries) {
86
+ const fullPath = path_1.default.join(dirPath, entry.name);
87
+ try {
88
+ if (entry.isSymbolicLink())
89
+ continue;
90
+ files.push(fullPath);
91
+ if (entry.isDirectory() && currentDepth < maxDepth - 1) {
92
+ files.push(...listDirectoryDeep(fullPath, maxDepth, currentDepth + 1));
93
+ }
94
+ }
95
+ catch {
96
+ continue;
97
+ }
98
+ }
99
+ }
100
+ catch {
101
+ return files;
102
+ }
103
+ return files;
104
+ }
105
+ function deleteFile(filePath) {
106
+ try {
107
+ fs_1.default.unlinkSync(filePath);
108
+ return true;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ function deleteDirectory(dirPath) {
115
+ try {
116
+ fs_1.default.rmSync(dirPath, { recursive: true, force: true });
117
+ return true;
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }
123
+ function readFile(filePath) {
124
+ try {
125
+ return fs_1.default.readFileSync(filePath, 'utf-8');
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ function writeFile(filePath, content) {
132
+ try {
133
+ const dir = path_1.default.dirname(filePath);
134
+ if (!fs_1.default.existsSync(dir)) {
135
+ fs_1.default.mkdirSync(dir, { recursive: true });
136
+ }
137
+ fs_1.default.writeFileSync(filePath, content, 'utf-8');
138
+ return true;
139
+ }
140
+ catch {
141
+ return false;
142
+ }
143
+ }
144
+ function getModificationTime(filePath) {
145
+ try {
146
+ return fs_1.default.statSync(filePath).mtime;
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }
152
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare class Logger {
2
+ static info(message: string): void;
3
+ static success(message: string): void;
4
+ static warn(message: string): void;
5
+ static error(message: string): void;
6
+ static debug(message: string): void;
7
+ static table(data: any[]): void;
8
+ static space(): void;
9
+ }
10
+ export declare function formatBytes(bytes: number): string;
11
+ export declare function formatDate(date: Date | undefined): string;
12
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACjB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMnC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI/B,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,49 @@
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.Logger = void 0;
7
+ exports.formatBytes = formatBytes;
8
+ exports.formatDate = formatDate;
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ class Logger {
11
+ static info(message) {
12
+ console.log(chalk_1.default.blue('ℹ'), message);
13
+ }
14
+ static success(message) {
15
+ console.log(chalk_1.default.green('✓'), message);
16
+ }
17
+ static warn(message) {
18
+ console.log(chalk_1.default.yellow('⚠'), message);
19
+ }
20
+ static error(message) {
21
+ console.log(chalk_1.default.red('✗'), message);
22
+ }
23
+ static debug(message) {
24
+ if (process.env.DEBUG) {
25
+ console.log(chalk_1.default.gray('🐛'), message);
26
+ }
27
+ }
28
+ static table(data) {
29
+ console.table(data);
30
+ }
31
+ static space() {
32
+ console.log('');
33
+ }
34
+ }
35
+ exports.Logger = Logger;
36
+ function formatBytes(bytes) {
37
+ if (bytes === 0)
38
+ return '0 B';
39
+ const k = 1024;
40
+ const sizes = ['B', 'KB', 'MB', 'GB'];
41
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
42
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
43
+ }
44
+ function formatDate(date) {
45
+ if (!date)
46
+ return 'Unknown';
47
+ return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
48
+ }
49
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAkCA,kCAQC;AAED,gCAGC;AA/CD,kDAA0B;AAE1B,MAAa,MAAM;IACjB,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAW;QACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK;QACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AA9BD,wBA8BC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9B,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,UAAU,CAAC,IAAsB;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,IAAI,CAAC,kBAAkB,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Platform } from '../types';
2
+ export declare function getPlatform(): Platform;
3
+ export declare function isMacOS(): boolean;
4
+ export declare function isLinux(): boolean;
5
+ export declare function isWindows(): boolean;
6
+ export declare function getHomeDir(): string;
7
+ export declare function getConfigDir(): string;
8
+ export declare function getCommonPaths(subpath: string): string[];
9
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAcrC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAmCxD"}
@@ -0,0 +1,75 @@
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.getPlatform = getPlatform;
7
+ exports.isMacOS = isMacOS;
8
+ exports.isLinux = isLinux;
9
+ exports.isWindows = isWindows;
10
+ exports.getHomeDir = getHomeDir;
11
+ exports.getConfigDir = getConfigDir;
12
+ exports.getCommonPaths = getCommonPaths;
13
+ const os_1 = __importDefault(require("os"));
14
+ function getPlatform() {
15
+ return os_1.default.platform();
16
+ }
17
+ function isMacOS() {
18
+ return getPlatform() === 'darwin';
19
+ }
20
+ function isLinux() {
21
+ return getPlatform() === 'linux';
22
+ }
23
+ function isWindows() {
24
+ return getPlatform() === 'win32';
25
+ }
26
+ function getHomeDir() {
27
+ return os_1.default.homedir();
28
+ }
29
+ function getConfigDir() {
30
+ const platform = getPlatform();
31
+ const home = getHomeDir();
32
+ switch (platform) {
33
+ case 'darwin':
34
+ return home;
35
+ case 'linux':
36
+ return home;
37
+ case 'win32':
38
+ return process.env.APPDATA || home;
39
+ default:
40
+ return home;
41
+ }
42
+ }
43
+ function getCommonPaths(subpath) {
44
+ const platform = getPlatform();
45
+ const home = getHomeDir();
46
+ const paths = [];
47
+ switch (platform) {
48
+ case 'darwin':
49
+ paths.push(`${home}/.config/${subpath}`);
50
+ paths.push(`${home}/Library/Application Support/${subpath}`);
51
+ paths.push(`${home}/Library/Preferences/${subpath}`);
52
+ paths.push(`${home}/Library/Caches/${subpath}`);
53
+ paths.push(`${home}/Library/Logs/${subpath}`);
54
+ paths.push(`${home}/.${subpath}`);
55
+ break;
56
+ case 'linux':
57
+ paths.push(`${home}/.config/${subpath}`);
58
+ paths.push(`${home}/.local/share/${subpath}`);
59
+ paths.push(`${home}/.cache/${subpath}`);
60
+ paths.push(`${home}/.${subpath}`);
61
+ paths.push(`/var/log/${subpath}`);
62
+ paths.push(`/usr/local/etc/${subpath}`);
63
+ paths.push(`/etc/${subpath}`);
64
+ break;
65
+ case 'win32':
66
+ const appData = process.env.APPDATA || `${home}\\AppData\\Roaming`;
67
+ const localAppData = process.env.LOCALAPPDATA || `${home}\\AppData\\Local`;
68
+ paths.push(`${appData}\\${subpath}`);
69
+ paths.push(`${localAppData}\\${subpath}`);
70
+ paths.push(`${home}\\.${subpath}`);
71
+ break;
72
+ }
73
+ return paths;
74
+ }
75
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"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"}
package/jest.config.js ADDED
@@ -0,0 +1,20 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ roots: ['<rootDir>/src'],
5
+ testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
6
+ moduleFileExtensions: ['ts', 'js', 'json'],
7
+ collectCoverageFrom: [
8
+ 'src/**/*.ts',
9
+ '!src/**/*.d.ts',
10
+ '!src/index.ts',
11
+ ],
12
+ coverageThreshold: {
13
+ global: {
14
+ branches: 50,
15
+ functions: 50,
16
+ lines: 50,
17
+ statements: 50,
18
+ },
19
+ },
20
+ };