appclean 1.9.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/npm-publish.yml +61 -0
- package/DEVELOPMENT.md +84 -0
- package/GUI_IMPLEMENTATION_STATUS.md +143 -0
- package/MD_Files/INDEX.md +51 -0
- package/PHASE2_COMPLETION.md +281 -0
- package/PHASE3_COMPLETION.md +364 -0
- package/README.md +411 -91
- package/RELEASE_GUIDE.md +236 -0
- package/assets/logo.svg +34 -0
- package/dist/core/appUpdateChecker.js +12 -16
- package/dist/core/appUpdateChecker.js.map +1 -1
- package/dist/core/detector.js +14 -18
- package/dist/core/detector.js.map +1 -1
- package/dist/core/duplicateFileFinder.js +12 -19
- package/dist/core/duplicateFileFinder.js.map +1 -1
- package/dist/core/orphanedDependencyDetector.js +19 -26
- package/dist/core/orphanedDependencyDetector.js.map +1 -1
- package/dist/core/performanceOptimizer.js +6 -10
- package/dist/core/performanceOptimizer.js.map +1 -1
- package/dist/core/permissionHandler.js +21 -25
- package/dist/core/permissionHandler.js.map +1 -1
- package/dist/core/pluginSystem.js +9 -13
- package/dist/core/pluginSystem.js.map +1 -1
- package/dist/core/removalRecorder.js +12 -19
- package/dist/core/removalRecorder.js.map +1 -1
- package/dist/core/remover.js +59 -66
- package/dist/core/remover.js.map +1 -1
- package/dist/core/reportGenerator.d.ts +1 -1
- package/dist/core/reportGenerator.d.ts.map +1 -1
- package/dist/core/reportGenerator.js +27 -34
- package/dist/core/reportGenerator.js.map +1 -1
- package/dist/core/scheduledCleanup.js +23 -30
- package/dist/core/scheduledCleanup.js.map +1 -1
- package/dist/core/serviceFileDetector.js +24 -31
- package/dist/core/serviceFileDetector.js.map +1 -1
- package/dist/core/verificationModule.js +10 -14
- package/dist/core/verificationModule.js.map +1 -1
- package/dist/index.js +118 -156
- package/dist/index.js.map +1 -1
- package/dist/managers/brewManager.js +30 -37
- package/dist/managers/brewManager.js.map +1 -1
- package/dist/managers/customManager.js +23 -30
- package/dist/managers/customManager.js.map +1 -1
- package/dist/managers/linuxManager.js +29 -36
- package/dist/managers/linuxManager.js.map +1 -1
- package/dist/managers/npmManager.js +27 -34
- package/dist/managers/npmManager.js.map +1 -1
- package/dist/types/index.js +1 -2
- package/dist/ui/client/api/client.d.ts +24 -0
- package/dist/ui/client/api/client.d.ts.map +1 -0
- package/dist/ui/client/api/client.js +100 -0
- package/dist/ui/client/api/client.js.map +1 -0
- package/dist/ui/client/app.d.ts +7 -0
- package/dist/ui/client/app.d.ts.map +1 -0
- package/dist/ui/client/app.js +75 -0
- package/dist/ui/client/app.js.map +1 -0
- package/dist/ui/client/index.html +107 -0
- package/dist/ui/client/pages/appDetails.d.ts +8 -0
- package/dist/ui/client/pages/appDetails.d.ts.map +1 -0
- package/dist/ui/client/pages/appDetails.js +287 -0
- package/dist/ui/client/pages/appDetails.js.map +1 -0
- package/dist/ui/client/pages/appSearch.d.ts +2 -0
- package/dist/ui/client/pages/appSearch.d.ts.map +1 -0
- package/dist/ui/client/pages/appSearch.js +221 -0
- package/dist/ui/client/pages/appSearch.js.map +1 -0
- package/dist/ui/client/pages/dashboard.d.ts +2 -0
- package/dist/ui/client/pages/dashboard.d.ts.map +1 -0
- package/dist/ui/client/pages/dashboard.js +175 -0
- package/dist/ui/client/pages/dashboard.js.map +1 -0
- package/dist/ui/client/pages/settings.d.ts +7 -0
- package/dist/ui/client/pages/settings.d.ts.map +1 -0
- package/dist/ui/client/pages/settings.js +279 -0
- package/dist/ui/client/pages/settings.js.map +1 -0
- package/dist/ui/client/state/appStore.d.ts +38 -0
- package/dist/ui/client/state/appStore.d.ts.map +1 -0
- package/dist/ui/client/state/appStore.js +130 -0
- package/dist/ui/client/state/appStore.js.map +1 -0
- package/dist/ui/client/state/dashboardStore.d.ts +31 -0
- package/dist/ui/client/state/dashboardStore.d.ts.map +1 -0
- package/dist/ui/client/state/dashboardStore.js +76 -0
- package/dist/ui/client/state/dashboardStore.js.map +1 -0
- package/dist/ui/client/state/uiStore.d.ts +43 -0
- package/dist/ui/client/state/uiStore.d.ts.map +1 -0
- package/dist/ui/client/state/uiStore.js +109 -0
- package/dist/ui/client/state/uiStore.js.map +1 -0
- package/dist/ui/client/styles/animations.css +349 -0
- package/dist/ui/client/styles/base.css +214 -0
- package/dist/ui/client/styles/components.css +400 -0
- package/dist/ui/client/styles/layout.css +224 -0
- package/dist/ui/client/styles/variables.css +140 -0
- package/dist/ui/client/utils/events.d.ts +19 -0
- package/dist/ui/client/utils/events.d.ts.map +1 -0
- package/dist/ui/client/utils/events.js +54 -0
- package/dist/ui/client/utils/events.js.map +1 -0
- package/dist/ui/client/utils/formatting.d.ts +11 -0
- package/dist/ui/client/utils/formatting.d.ts.map +1 -0
- package/dist/ui/client/utils/formatting.js +104 -0
- package/dist/ui/client/utils/formatting.js.map +1 -0
- package/dist/ui/client/utils/router.d.ts +25 -0
- package/dist/ui/client/utils/router.d.ts.map +1 -0
- package/dist/ui/client/utils/router.js +90 -0
- package/dist/ui/client/utils/router.js.map +1 -0
- package/dist/ui/guiServer.d.ts +11 -5
- package/dist/ui/guiServer.d.ts.map +1 -1
- package/dist/ui/guiServer.js +180 -501
- package/dist/ui/guiServer.js.map +1 -1
- package/dist/ui/menu.js +18 -27
- package/dist/ui/menu.js.map +1 -1
- package/dist/ui/prompts.js +34 -47
- package/dist/ui/prompts.js.map +1 -1
- package/dist/ui/server/middleware/errorHandler.d.ts +19 -0
- package/dist/ui/server/middleware/errorHandler.d.ts.map +1 -0
- package/dist/ui/server/middleware/errorHandler.js +100 -0
- package/dist/ui/server/middleware/errorHandler.js.map +1 -0
- package/dist/ui/server/routes/apps.d.ts +8 -0
- package/dist/ui/server/routes/apps.d.ts.map +1 -0
- package/dist/ui/server/routes/apps.js +74 -0
- package/dist/ui/server/routes/apps.js.map +1 -0
- package/dist/ui/server/routes/dashboard.d.ts +4 -0
- package/dist/ui/server/routes/dashboard.d.ts.map +1 -0
- package/dist/ui/server/routes/dashboard.js +57 -0
- package/dist/ui/server/routes/dashboard.js.map +1 -0
- package/dist/ui/server/routes/settings.d.ts +6 -0
- package/dist/ui/server/routes/settings.d.ts.map +1 -0
- package/dist/ui/server/routes/settings.js +31 -0
- package/dist/ui/server/routes/settings.js.map +1 -0
- package/dist/ui/server/services/appService.d.ts +45 -0
- package/dist/ui/server/services/appService.d.ts.map +1 -0
- package/dist/ui/server/services/appService.js +114 -0
- package/dist/ui/server/services/appService.js.map +1 -0
- package/dist/ui/server/services/removalService.d.ts +24 -0
- package/dist/ui/server/services/removalService.d.ts.map +1 -0
- package/dist/ui/server/services/removalService.js +83 -0
- package/dist/ui/server/services/removalService.js.map +1 -0
- package/dist/utils/filesystem.js +32 -49
- package/dist/utils/filesystem.js.map +1 -1
- package/dist/utils/logger.js +9 -18
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/platform.js +10 -22
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/upgrade.d.ts +2 -1
- package/dist/utils/upgrade.d.ts.map +1 -1
- package/dist/utils/upgrade.js +24 -15
- package/dist/utils/upgrade.js.map +1 -1
- package/package.json +4 -2
- package/scripts/publish-npm.sh +64 -0
- package/src/core/appUpdateChecker.ts +1 -1
- package/src/core/detector.ts +6 -6
- package/src/core/duplicateFileFinder.ts +1 -1
- package/src/core/orphanedDependencyDetector.ts +2 -2
- package/src/core/performanceOptimizer.ts +1 -1
- package/src/core/permissionHandler.ts +2 -2
- package/src/core/pluginSystem.ts +1 -1
- package/src/core/removalRecorder.ts +2 -2
- package/src/core/remover.ts +11 -11
- package/src/core/reportGenerator.ts +2 -2
- package/src/core/scheduledCleanup.ts +2 -2
- package/src/core/serviceFileDetector.ts +2 -2
- package/src/core/verificationModule.ts +2 -2
- package/src/index.ts +8 -8
- package/src/managers/brewManager.ts +3 -3
- package/src/managers/customManager.ts +2 -2
- package/src/managers/linuxManager.ts +3 -3
- package/src/managers/npmManager.ts +3 -3
- package/src/ui/client/api/client.ts +168 -0
- package/src/ui/client/app.ts +125 -0
- package/src/ui/client/index.html +107 -0
- package/src/ui/client/pages/appDetails.ts +356 -0
- package/src/ui/client/pages/appSearch.ts +283 -0
- package/src/ui/client/pages/dashboard.ts +211 -0
- package/src/ui/client/pages/settings.ts +342 -0
- package/src/ui/client/state/appStore.ts +181 -0
- package/src/ui/client/state/dashboardStore.ts +123 -0
- package/src/ui/client/state/uiStore.ts +166 -0
- package/src/ui/client/styles/animations.css +349 -0
- package/src/ui/client/styles/base.css +214 -0
- package/src/ui/client/styles/components.css +400 -0
- package/src/ui/client/styles/layout.css +224 -0
- package/src/ui/client/styles/variables.css +140 -0
- package/src/ui/client/utils/events.ts +74 -0
- package/src/ui/client/utils/formatting.ts +157 -0
- package/src/ui/client/utils/router.ts +161 -0
- package/src/ui/guiServer.ts +245 -498
- package/src/ui/prompts.ts +1 -1
- package/src/ui/server/middleware/errorHandler.ts +174 -0
- package/src/ui/server/routes/apps.ts +132 -0
- package/src/ui/server/routes/dashboard.ts +93 -0
- package/src/ui/server/routes/settings.ts +63 -0
- package/src/ui/server/services/appService.ts +184 -0
- package/src/ui/server/services/removalService.ts +138 -0
- package/src/utils/upgrade.ts +19 -2
- package/tsconfig.json +3 -2
- package/INDEX.md +0 -165
- /package/{ACTION_CHECKLIST.md → MD_Files/ACTION_CHECKLIST.md} +0 -0
- /package/{APPCLEAN_SUMMARY.md → MD_Files/APPCLEAN_SUMMARY.md} +0 -0
- /package/{CHANGELOG.md → MD_Files/CHANGELOG.md} +0 -0
- /package/{CODE_OF_CONDUCT.md → MD_Files/CODE_OF_CONDUCT.md} +0 -0
- /package/{CODE_REVIEW_REPORT.md → MD_Files/CODE_REVIEW_REPORT.md} +0 -0
- /package/{COMMUNITY_POSTS.md → MD_Files/COMMUNITY_POSTS.md} +0 -0
- /package/{DEPLOYMENT_GUIDE.md → MD_Files/DEPLOYMENT_GUIDE.md} +0 -0
- /package/{DEPLOYMENT_STATUS.md → MD_Files/DEPLOYMENT_STATUS.md} +0 -0
- /package/{EXECUTIVE_REPORT.md → MD_Files/EXECUTIVE_REPORT.md} +0 -0
- /package/{GITHUB_OPTIMIZATION.md → MD_Files/GITHUB_OPTIMIZATION.md} +0 -0
- /package/{MARKETING_SUMMARY.md → MD_Files/MARKETING_SUMMARY.md} +0 -0
- /package/{NPM_PACKAGE_OPTIMIZATION.md → MD_Files/NPM_PACKAGE_OPTIMIZATION.md} +0 -0
- /package/{NPM_PUBLISH.md → MD_Files/NPM_PUBLISH.md} +0 -0
- /package/{PROJECT_SUMMARY.txt → MD_Files/PROJECT_SUMMARY.txt} +0 -0
- /package/{PUBLICATION_SUCCESS_REPORT.md → MD_Files/PUBLICATION_SUCCESS_REPORT.md} +0 -0
- /package/{QUICKSTART.md → MD_Files/QUICKSTART.md} +0 -0
- /package/{SETUP_GITHUB.md → MD_Files/SETUP_GITHUB.md} +0 -0
- /package/{TESTING_SUMMARY.md → MD_Files/TESTING_SUMMARY.md} +0 -0
- /package/{setup-github.sh → MD_Files/setup-github.sh} +0 -0
package/RELEASE_GUIDE.md
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# AppClean Release Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how to release new versions of AppClean to npm and GitHub.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Option 1: Automatic Publishing (Recommended)
|
|
8
|
+
|
|
9
|
+
Once GitHub Actions is set up, releases are published automatically:
|
|
10
|
+
|
|
11
|
+
1. **Create a git tag**:
|
|
12
|
+
```bash
|
|
13
|
+
git tag -a v2.0.1 -m "AppClean v2.0.1 - Description here"
|
|
14
|
+
git push origin v2.0.1
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
2. **GitHub Actions automatically**:
|
|
18
|
+
- Builds the project
|
|
19
|
+
- Runs tests
|
|
20
|
+
- Publishes to npm
|
|
21
|
+
- Creates a GitHub release
|
|
22
|
+
|
|
23
|
+
### Option 2: Manual Publishing via Script
|
|
24
|
+
|
|
25
|
+
Use the provided publish script to handle everything:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
./scripts/publish-npm.sh 2.0.1
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This script:
|
|
32
|
+
- Updates version in `package.json` and `src/index.ts`
|
|
33
|
+
- Builds the project
|
|
34
|
+
- Creates a git commit and tag
|
|
35
|
+
- Publishes to npm
|
|
36
|
+
- Pushes changes to GitHub
|
|
37
|
+
|
|
38
|
+
## Setup Requirements
|
|
39
|
+
|
|
40
|
+
### 1. npm Authentication
|
|
41
|
+
|
|
42
|
+
Set up npm credentials for publishing:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm login
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This creates an `.npmrc` file in your home directory with authentication tokens.
|
|
49
|
+
|
|
50
|
+
### 2. GitHub Actions (for automatic publishing)
|
|
51
|
+
|
|
52
|
+
Add NPM_TOKEN to GitHub Secrets:
|
|
53
|
+
|
|
54
|
+
1. Go to your repository settings: https://github.com/praveenkay/AppClean/settings/secrets/actions
|
|
55
|
+
2. Click "New repository secret"
|
|
56
|
+
3. Name: `NPM_TOKEN`
|
|
57
|
+
4. Value: Your npm authentication token
|
|
58
|
+
|
|
59
|
+
**To get your npm token**:
|
|
60
|
+
```bash
|
|
61
|
+
npm token create --read-only
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Or view existing tokens at: https://www.npmjs.com/settings/YOUR_USERNAME/tokens
|
|
65
|
+
|
|
66
|
+
### 3. Ensure Files are Updated
|
|
67
|
+
|
|
68
|
+
Before releasing, make sure:
|
|
69
|
+
|
|
70
|
+
- ✅ `package.json` has correct version
|
|
71
|
+
- ✅ `src/index.ts` has correct VERSION constant
|
|
72
|
+
- ✅ Built files are up-to-date (`npm run build`)
|
|
73
|
+
- ✅ All tests pass (`npm test`)
|
|
74
|
+
- ✅ Changes are committed
|
|
75
|
+
|
|
76
|
+
## Release Process
|
|
77
|
+
|
|
78
|
+
### Step 1: Update Version
|
|
79
|
+
|
|
80
|
+
Update the version in both files:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Edit package.json
|
|
84
|
+
"version": "2.0.1"
|
|
85
|
+
|
|
86
|
+
# Edit src/index.ts
|
|
87
|
+
const VERSION = '2.0.1';
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Step 2: Build and Test
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm run build
|
|
94
|
+
npm test
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Step 3: Commit Changes
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
git add package.json src/index.ts
|
|
101
|
+
git commit -m "chore: Bump version to 2.0.1"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Step 4: Create Release
|
|
105
|
+
|
|
106
|
+
#### Option A: Via Git Tag (triggers GitHub Actions)
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
git tag -a v2.0.1 -m "AppClean v2.0.1 - Bug fixes and improvements"
|
|
110
|
+
git push origin main
|
|
111
|
+
git push origin v2.0.1
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
GitHub Actions will automatically:
|
|
115
|
+
- Build the project
|
|
116
|
+
- Publish to npm
|
|
117
|
+
- Create a GitHub release
|
|
118
|
+
|
|
119
|
+
#### Option B: Via Script
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
./scripts/publish-npm.sh 2.0.1
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Automated Workflow
|
|
126
|
+
|
|
127
|
+
The GitHub Actions workflow (`.github/workflows/npm-publish.yml`) handles:
|
|
128
|
+
|
|
129
|
+
1. **On every tag push** (`v*.*.*`):
|
|
130
|
+
- Checkout code
|
|
131
|
+
- Setup Node.js 20
|
|
132
|
+
- Install dependencies
|
|
133
|
+
- Build project
|
|
134
|
+
- Run tests
|
|
135
|
+
- Publish to npm (using NPM_TOKEN)
|
|
136
|
+
- Create GitHub release
|
|
137
|
+
|
|
138
|
+
2. **On every GitHub release published**:
|
|
139
|
+
- Same steps as above
|
|
140
|
+
|
|
141
|
+
## Checking Publication
|
|
142
|
+
|
|
143
|
+
After publishing, verify:
|
|
144
|
+
|
|
145
|
+
1. **npm Registry**:
|
|
146
|
+
```bash
|
|
147
|
+
npm info appclean
|
|
148
|
+
npm view appclean versions
|
|
149
|
+
```
|
|
150
|
+
Or visit: https://www.npmjs.com/package/appclean
|
|
151
|
+
|
|
152
|
+
2. **GitHub Releases**:
|
|
153
|
+
Visit: https://github.com/praveenkay/AppClean/releases
|
|
154
|
+
|
|
155
|
+
3. **Local Installation**:
|
|
156
|
+
```bash
|
|
157
|
+
npm install -g appclean@2.0.1
|
|
158
|
+
appclean --version
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Versioning Strategy
|
|
162
|
+
|
|
163
|
+
AppClean follows [Semantic Versioning](https://semver.org/):
|
|
164
|
+
|
|
165
|
+
- **Major** (X.0.0): Breaking changes
|
|
166
|
+
- **Minor** (X.Y.0): New features, backward compatible
|
|
167
|
+
- **Patch** (X.Y.Z): Bug fixes, no new features
|
|
168
|
+
|
|
169
|
+
Examples:
|
|
170
|
+
- Bug fix: 2.0.0 → 2.0.1
|
|
171
|
+
- New feature: 2.0.1 → 2.1.0
|
|
172
|
+
- Breaking change: 2.1.0 → 3.0.0
|
|
173
|
+
|
|
174
|
+
## Troubleshooting
|
|
175
|
+
|
|
176
|
+
### "Not logged into npm"
|
|
177
|
+
|
|
178
|
+
Run: `npm login`
|
|
179
|
+
|
|
180
|
+
### GitHub Actions failing
|
|
181
|
+
|
|
182
|
+
Check:
|
|
183
|
+
1. NPM_TOKEN is set in GitHub Secrets
|
|
184
|
+
2. Token hasn't expired
|
|
185
|
+
3. Token has publish permissions
|
|
186
|
+
|
|
187
|
+
### Version mismatch errors
|
|
188
|
+
|
|
189
|
+
Ensure both files are updated:
|
|
190
|
+
- `package.json`
|
|
191
|
+
- `src/index.ts`
|
|
192
|
+
|
|
193
|
+
## Release Checklist
|
|
194
|
+
|
|
195
|
+
- [ ] Update version in `package.json`
|
|
196
|
+
- [ ] Update VERSION constant in `src/index.ts`
|
|
197
|
+
- [ ] Run `npm run build`
|
|
198
|
+
- [ ] Run `npm test`
|
|
199
|
+
- [ ] Commit changes: `git commit -m "chore: Bump version to X.Y.Z"`
|
|
200
|
+
- [ ] Create tag: `git tag -a vX.Y.Z -m "Message"`
|
|
201
|
+
- [ ] Push: `git push origin main && git push origin vX.Y.Z`
|
|
202
|
+
- [ ] Verify npm publication
|
|
203
|
+
- [ ] Verify GitHub release created
|
|
204
|
+
|
|
205
|
+
## Example: Releasing v2.0.1
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# 1. Update version files
|
|
209
|
+
echo 'Update package.json version to 2.0.1'
|
|
210
|
+
echo 'Update src/index.ts VERSION to 2.0.1'
|
|
211
|
+
|
|
212
|
+
# 2. Build and test
|
|
213
|
+
npm run build
|
|
214
|
+
npm test
|
|
215
|
+
|
|
216
|
+
# 3. Commit
|
|
217
|
+
git add package.json src/index.ts
|
|
218
|
+
git commit -m "chore: Bump version to 2.0.1"
|
|
219
|
+
|
|
220
|
+
# 4. Create release tag
|
|
221
|
+
git tag -a v2.0.1 -m "AppClean v2.0.1 - Bug fixes for GUI"
|
|
222
|
+
|
|
223
|
+
# 5. Push to trigger GitHub Actions
|
|
224
|
+
git push origin main
|
|
225
|
+
git push origin v2.0.1
|
|
226
|
+
|
|
227
|
+
# 6. Watch GitHub Actions publish automatically
|
|
228
|
+
# View at: https://github.com/praveenkay/AppClean/actions
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Support
|
|
232
|
+
|
|
233
|
+
For issues with publishing, check:
|
|
234
|
+
- GitHub Actions logs: https://github.com/praveenkay/AppClean/actions
|
|
235
|
+
- npm package page: https://www.npmjs.com/package/appclean
|
|
236
|
+
- GitHub releases: https://github.com/praveenkay/AppClean/releases
|
package/assets/logo.svg
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<svg width="240" height="240" viewBox="0 0 240 240" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- Background Circle -->
|
|
3
|
+
<circle cx="120" cy="120" r="115" fill="#0f172a" stroke="#3b82f6" stroke-width="2"/>
|
|
4
|
+
|
|
5
|
+
<!-- Briefcase Body -->
|
|
6
|
+
<rect x="55" y="70" width="130" height="90" rx="8" fill="#3b82f6"/>
|
|
7
|
+
|
|
8
|
+
<!-- Briefcase Handle -->
|
|
9
|
+
<path d="M 75 70 Q 75 40 120 40 Q 165 40 165 70" stroke="#3b82f6" stroke-width="6" fill="none" stroke-linecap="round"/>
|
|
10
|
+
|
|
11
|
+
<!-- Briefcase Shine/Highlight -->
|
|
12
|
+
<rect x="60" y="75" width="50" height="20" rx="4" fill="#60a5fa" opacity="0.6"/>
|
|
13
|
+
|
|
14
|
+
<!-- Checkmark -->
|
|
15
|
+
<g transform="translate(120, 120)">
|
|
16
|
+
<!-- Checkmark Circle Background -->
|
|
17
|
+
<circle cx="0" cy="0" r="35" fill="#10b981" opacity="0.95"/>
|
|
18
|
+
|
|
19
|
+
<!-- Checkmark -->
|
|
20
|
+
<path d="M -15 0 L -5 10 L 18 -15" stroke="#ffffff" stroke-width="5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
|
21
|
+
</g>
|
|
22
|
+
|
|
23
|
+
<!-- Decorative Circles (Success indicators) -->
|
|
24
|
+
<circle cx="60" cy="160" r="4" fill="#10b981" opacity="0.7"/>
|
|
25
|
+
<circle cx="180" cy="160" r="4" fill="#10b981" opacity="0.7"/>
|
|
26
|
+
|
|
27
|
+
<!-- Text: AppClean -->
|
|
28
|
+
<text x="120" y="200" font-family="Arial, sans-serif" font-size="18" font-weight="bold" fill="#ffffff" text-anchor="middle" letter-spacing="1">
|
|
29
|
+
AppClean
|
|
30
|
+
</text>
|
|
31
|
+
|
|
32
|
+
<!-- Glow Effect -->
|
|
33
|
+
<circle cx="120" cy="120" r="115" fill="none" stroke="#3b82f6" stroke-width="1" opacity="0.2" stroke-dasharray="5,5"/>
|
|
34
|
+
</svg>
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const child_process_1 = require("child_process");
|
|
5
|
-
const logger_1 = require("../utils/logger");
|
|
6
|
-
class AppUpdateChecker {
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { Logger } from '../utils/logger.js';
|
|
3
|
+
export class AppUpdateChecker {
|
|
7
4
|
async checkForUpdate(app) {
|
|
8
|
-
|
|
5
|
+
Logger.info(`Checking for updates: ${app.name}...`);
|
|
9
6
|
const info = {
|
|
10
7
|
appName: app.name,
|
|
11
8
|
currentVersion: app.version,
|
|
@@ -34,11 +31,11 @@ class AppUpdateChecker {
|
|
|
34
31
|
await this.checkYumUpdate(info);
|
|
35
32
|
break;
|
|
36
33
|
default:
|
|
37
|
-
|
|
34
|
+
Logger.warn(`No update checker available for ${app.installMethod}`);
|
|
38
35
|
}
|
|
39
36
|
}
|
|
40
37
|
catch (error) {
|
|
41
|
-
|
|
38
|
+
Logger.debug(`Update check failed for ${app.name}: ${error.message}`);
|
|
42
39
|
}
|
|
43
40
|
return info;
|
|
44
41
|
}
|
|
@@ -52,7 +49,7 @@ class AppUpdateChecker {
|
|
|
52
49
|
}
|
|
53
50
|
async checkNpmUpdate(info) {
|
|
54
51
|
try {
|
|
55
|
-
const output =
|
|
52
|
+
const output = execSync(`npm view ${info.appName} version 2>/dev/null`).toString().trim();
|
|
56
53
|
if (output) {
|
|
57
54
|
info.latestVersion = output;
|
|
58
55
|
info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
|
|
@@ -64,7 +61,7 @@ class AppUpdateChecker {
|
|
|
64
61
|
}
|
|
65
62
|
async checkYarnUpdate(info) {
|
|
66
63
|
try {
|
|
67
|
-
const output =
|
|
64
|
+
const output = execSync(`yarn info ${info.appName} version 2>/dev/null`).toString().trim();
|
|
68
65
|
if (output) {
|
|
69
66
|
info.latestVersion = output;
|
|
70
67
|
info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
|
|
@@ -76,7 +73,7 @@ class AppUpdateChecker {
|
|
|
76
73
|
}
|
|
77
74
|
async checkPnpmUpdate(info) {
|
|
78
75
|
try {
|
|
79
|
-
const output =
|
|
76
|
+
const output = execSync(`pnpm view ${info.appName} version 2>/dev/null`).toString().trim();
|
|
80
77
|
if (output) {
|
|
81
78
|
info.latestVersion = output;
|
|
82
79
|
info.hasUpdate = this.compareVersions(info.currentVersion, output) < 0;
|
|
@@ -88,7 +85,7 @@ class AppUpdateChecker {
|
|
|
88
85
|
}
|
|
89
86
|
async checkBrewUpdate(info) {
|
|
90
87
|
try {
|
|
91
|
-
const output =
|
|
88
|
+
const output = execSync(`brew info ${info.appName} 2>/dev/null | grep "stable"`).toString();
|
|
92
89
|
const match = output.match(/(\d+\.\d+\.\d+)/);
|
|
93
90
|
if (match) {
|
|
94
91
|
info.latestVersion = match[1];
|
|
@@ -101,7 +98,7 @@ class AppUpdateChecker {
|
|
|
101
98
|
}
|
|
102
99
|
async checkAptUpdate(info) {
|
|
103
100
|
try {
|
|
104
|
-
const output =
|
|
101
|
+
const output = execSync(`apt-cache policy ${info.appName} 2>/dev/null`).toString();
|
|
105
102
|
const match = output.match(/Candidate: (\S+)/);
|
|
106
103
|
if (match) {
|
|
107
104
|
info.latestVersion = match[1];
|
|
@@ -114,7 +111,7 @@ class AppUpdateChecker {
|
|
|
114
111
|
}
|
|
115
112
|
async checkYumUpdate(info) {
|
|
116
113
|
try {
|
|
117
|
-
const output =
|
|
114
|
+
const output = execSync(`yum info ${info.appName} 2>/dev/null`).toString();
|
|
118
115
|
const match = output.match(/Version\s+:\s+(\S+)/);
|
|
119
116
|
if (match) {
|
|
120
117
|
info.latestVersion = match[1];
|
|
@@ -155,5 +152,4 @@ class AppUpdateChecker {
|
|
|
155
152
|
return summary;
|
|
156
153
|
}
|
|
157
154
|
}
|
|
158
|
-
exports.AppUpdateChecker = AppUpdateChecker;
|
|
159
155
|
//# sourceMappingURL=appUpdateChecker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appUpdateChecker.js","sourceRoot":"","sources":["../../src/core/appUpdateChecker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"appUpdateChecker.js","sourceRoot":"","sources":["../../src/core/appUpdateChecker.ts"],"names":[],"mappings":"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"}
|
package/dist/core/detector.js
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const platform_1 = require("../utils/platform");
|
|
9
|
-
const filesystem_1 = require("../utils/filesystem");
|
|
10
|
-
class Detector {
|
|
1
|
+
import { NpmManager } from '../managers/npmManager.js';
|
|
2
|
+
import { BrewManager } from '../managers/brewManager.js';
|
|
3
|
+
import { LinuxManager } from '../managers/linuxManager.js';
|
|
4
|
+
import { CustomManager } from '../managers/customManager.js';
|
|
5
|
+
import { isMacOS, isLinux } from '../utils/platform.js';
|
|
6
|
+
import { getFileSize } from '../utils/filesystem.js';
|
|
7
|
+
export class Detector {
|
|
11
8
|
constructor() {
|
|
12
|
-
this.npmManager = new
|
|
13
|
-
this.customManager = new
|
|
14
|
-
if (
|
|
15
|
-
this.brewManager = new
|
|
9
|
+
this.npmManager = new NpmManager();
|
|
10
|
+
this.customManager = new CustomManager();
|
|
11
|
+
if (isMacOS()) {
|
|
12
|
+
this.brewManager = new BrewManager();
|
|
16
13
|
}
|
|
17
|
-
if (
|
|
18
|
-
this.linuxManager = new
|
|
14
|
+
if (isLinux()) {
|
|
15
|
+
this.linuxManager = new LinuxManager();
|
|
19
16
|
}
|
|
20
17
|
}
|
|
21
18
|
async detectAllApps() {
|
|
@@ -86,7 +83,7 @@ class Detector {
|
|
|
86
83
|
break;
|
|
87
84
|
}
|
|
88
85
|
for (const artifact of artifacts) {
|
|
89
|
-
artifact.size =
|
|
86
|
+
artifact.size = getFileSize(artifact.path);
|
|
90
87
|
}
|
|
91
88
|
return artifacts;
|
|
92
89
|
}
|
|
@@ -95,5 +92,4 @@ class Detector {
|
|
|
95
92
|
return artifacts.reduce((total, artifact) => total + artifact.size, 0);
|
|
96
93
|
}
|
|
97
94
|
}
|
|
98
|
-
exports.Detector = Detector;
|
|
99
95
|
//# sourceMappingURL=detector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,OAAO,QAAQ;IAMnB;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAEzC,IAAI,OAAO,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACvC,CAAC;QAED,IAAI,OAAO,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,GAAmB,EAAE,CAAC;QAGnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAGzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAGD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAC7B,CAAC;QAGD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAAE,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAG5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE3C,IAAI,QAAQ,GAAG,OAAO,CAAC;QAGvB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACvC,CAAC;QACJ,CAAC;QAGD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;QACnF,CAAC;QAGD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,MAAM;gBACT,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,MAAM;gBACT,QAAQ,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CACxE,CAAC;gBACF,MAAM;YACR,KAAK,MAAM;gBACT,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBACvD,MAAM;QACV,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,aAAqB;QACxD,MAAM,SAAS,GAAmB,EAAE,CAAC;QAErC,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,KAAK;gBACR,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClE,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,MAAM;YACR,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,KAAK;gBACR,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACtB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACrE,MAAM;QACV,CAAC;QAGD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,aAAqB;QAC7D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;CACF"}
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
exports.DuplicateFileFinder = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
10
|
-
const logger_1 = require("../utils/logger");
|
|
11
|
-
class DuplicateFileFinder {
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
export class DuplicateFileFinder {
|
|
12
6
|
async findDuplicates(directories) {
|
|
13
|
-
|
|
7
|
+
Logger.info('Scanning for duplicate files...');
|
|
14
8
|
const fileHashes = new Map();
|
|
15
9
|
for (const directory of directories) {
|
|
16
10
|
await this.scanDirectory(directory, fileHashes);
|
|
@@ -30,8 +24,8 @@ class DuplicateFileFinder {
|
|
|
30
24
|
}
|
|
31
25
|
async calculateHash(filePath) {
|
|
32
26
|
return new Promise((resolve, reject) => {
|
|
33
|
-
const hash =
|
|
34
|
-
const stream =
|
|
27
|
+
const hash = crypto.createHash('sha256');
|
|
28
|
+
const stream = fs.createReadStream(filePath);
|
|
35
29
|
stream.on('data', (data) => hash.update(data));
|
|
36
30
|
stream.on('end', () => resolve(hash.digest('hex')));
|
|
37
31
|
stream.on('error', reject);
|
|
@@ -39,10 +33,10 @@ class DuplicateFileFinder {
|
|
|
39
33
|
}
|
|
40
34
|
async scanDirectory(directory, fileHashes) {
|
|
41
35
|
try {
|
|
42
|
-
const entries =
|
|
36
|
+
const entries = fs.readdirSync(directory);
|
|
43
37
|
for (const entry of entries) {
|
|
44
|
-
const fullPath =
|
|
45
|
-
const stats =
|
|
38
|
+
const fullPath = path.join(directory, entry);
|
|
39
|
+
const stats = fs.statSync(fullPath);
|
|
46
40
|
if (stats.isDirectory()) {
|
|
47
41
|
await this.scanDirectory(fullPath, fileHashes);
|
|
48
42
|
}
|
|
@@ -56,7 +50,7 @@ class DuplicateFileFinder {
|
|
|
56
50
|
}
|
|
57
51
|
}
|
|
58
52
|
catch (error) {
|
|
59
|
-
|
|
53
|
+
Logger.debug(`Error scanning directory ${directory}: ${error.message}`);
|
|
60
54
|
}
|
|
61
55
|
}
|
|
62
56
|
getSummary(duplicates) {
|
|
@@ -76,5 +70,4 @@ Potential space savings: ${this.formatBytes(totalSize)}
|
|
|
76
70
|
return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
|
|
77
71
|
}
|
|
78
72
|
}
|
|
79
|
-
exports.DuplicateFileFinder = DuplicateFileFinder;
|
|
80
73
|
//# sourceMappingURL=duplicateFileFinder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicateFileFinder.js","sourceRoot":"","sources":["../../src/core/duplicateFileFinder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"duplicateFileFinder.js","sourceRoot":"","sources":["../../src/core/duplicateFileFinder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const child_process_1 = require("child_process");
|
|
8
|
-
const platform_1 = require("../utils/platform");
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const fs_1 = __importDefault(require("fs"));
|
|
11
|
-
const logger_1 = require("../utils/logger");
|
|
12
|
-
class OrphanedDependencyDetector {
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { getHomeDir } from '../utils/platform.js';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { Logger } from '../utils/logger.js';
|
|
6
|
+
export class OrphanedDependencyDetector {
|
|
13
7
|
async detectOrphanedPackages() {
|
|
14
|
-
|
|
8
|
+
Logger.info('Scanning for orphaned dependencies...');
|
|
15
9
|
try {
|
|
16
10
|
const globalPackages = this.getGlobalPackages();
|
|
17
11
|
const projectPackages = this.getProjectPackages();
|
|
@@ -36,20 +30,20 @@ class OrphanedDependencyDetector {
|
|
|
36
30
|
return orphaned.filter((p) => p.isOrphaned);
|
|
37
31
|
}
|
|
38
32
|
catch (error) {
|
|
39
|
-
|
|
33
|
+
Logger.error(`Error detecting orphaned packages: ${error.message}`);
|
|
40
34
|
return [];
|
|
41
35
|
}
|
|
42
36
|
}
|
|
43
37
|
getGlobalPackages() {
|
|
44
38
|
try {
|
|
45
|
-
const output =
|
|
39
|
+
const output = execSync('npm list -g --json 2>/dev/null || echo "{}"').toString();
|
|
46
40
|
const data = JSON.parse(output);
|
|
47
41
|
const packages = [];
|
|
48
42
|
if (data.dependencies) {
|
|
49
43
|
for (const [name, pkg] of Object.entries(data.dependencies)) {
|
|
50
44
|
const location = this.findPackageLocation(name);
|
|
51
45
|
if (location) {
|
|
52
|
-
const stats =
|
|
46
|
+
const stats = fs.statSync(location);
|
|
53
47
|
packages.push({
|
|
54
48
|
name,
|
|
55
49
|
version: pkg.version || 'unknown',
|
|
@@ -71,7 +65,7 @@ class OrphanedDependencyDetector {
|
|
|
71
65
|
getProjectPackages() {
|
|
72
66
|
const packages = new Set();
|
|
73
67
|
try {
|
|
74
|
-
const home =
|
|
68
|
+
const home = getHomeDir();
|
|
75
69
|
const searchPaths = [home, '/usr/local'];
|
|
76
70
|
for (const searchPath of searchPaths) {
|
|
77
71
|
this.findPackageJsonFiles(searchPath, packages);
|
|
@@ -85,11 +79,11 @@ class OrphanedDependencyDetector {
|
|
|
85
79
|
if (depth > 3)
|
|
86
80
|
return;
|
|
87
81
|
try {
|
|
88
|
-
const entries =
|
|
82
|
+
const entries = fs.readdirSync(dir);
|
|
89
83
|
for (const entry of entries) {
|
|
90
84
|
if (entry === 'package.json') {
|
|
91
85
|
try {
|
|
92
|
-
const content =
|
|
86
|
+
const content = fs.readFileSync(path.join(dir, entry), 'utf-8');
|
|
93
87
|
const json = JSON.parse(content);
|
|
94
88
|
if (json.dependencies) {
|
|
95
89
|
Object.keys(json.dependencies).forEach((dep) => packages.add(dep));
|
|
@@ -101,8 +95,8 @@ class OrphanedDependencyDetector {
|
|
|
101
95
|
catch {
|
|
102
96
|
}
|
|
103
97
|
}
|
|
104
|
-
const fullPath =
|
|
105
|
-
if (
|
|
98
|
+
const fullPath = path.join(dir, entry);
|
|
99
|
+
if (fs.statSync(fullPath).isDirectory() && !entry.startsWith('.')) {
|
|
106
100
|
this.findPackageJsonFiles(fullPath, packages, depth + 1);
|
|
107
101
|
}
|
|
108
102
|
}
|
|
@@ -115,7 +109,7 @@ class OrphanedDependencyDetector {
|
|
|
115
109
|
}
|
|
116
110
|
findPackageLocation(packageName) {
|
|
117
111
|
try {
|
|
118
|
-
const result =
|
|
112
|
+
const result = execSync(`npm list -g ${packageName} --json 2>/dev/null || echo "{}"`).toString();
|
|
119
113
|
const data = JSON.parse(result);
|
|
120
114
|
return data.dependencies?.[packageName]?.resolved || null;
|
|
121
115
|
}
|
|
@@ -126,10 +120,10 @@ class OrphanedDependencyDetector {
|
|
|
126
120
|
getDirectorySize(dir) {
|
|
127
121
|
try {
|
|
128
122
|
let size = 0;
|
|
129
|
-
const entries =
|
|
123
|
+
const entries = fs.readdirSync(dir);
|
|
130
124
|
for (const entry of entries) {
|
|
131
|
-
const fullPath =
|
|
132
|
-
const stats =
|
|
125
|
+
const fullPath = path.join(dir, entry);
|
|
126
|
+
const stats = fs.statSync(fullPath);
|
|
133
127
|
if (stats.isDirectory()) {
|
|
134
128
|
size += this.getDirectorySize(fullPath);
|
|
135
129
|
}
|
|
@@ -144,5 +138,4 @@ class OrphanedDependencyDetector {
|
|
|
144
138
|
}
|
|
145
139
|
}
|
|
146
140
|
}
|
|
147
|
-
exports.OrphanedDependencyDetector = OrphanedDependencyDetector;
|
|
148
141
|
//# sourceMappingURL=orphanedDependencyDetector.js.map
|