@fredlackey/devutils 0.0.17 → 0.0.19
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/README.md +32 -150
- package/package.json +5 -82
- package/bin/dev.js +0 -16
- package/files/README.md +0 -0
- package/files/claude/.claude/commands/setup-context.md +0 -3
- package/files/monorepos/_archive/README.md +0 -36
- package/files/monorepos/_legacy/README.md +0 -36
- package/files/monorepos/ai-docs/README.md +0 -33
- package/files/monorepos/apps/README.md +0 -24
- package/files/monorepos/docs/README.md +0 -40
- package/files/monorepos/packages/README.md +0 -25
- package/files/monorepos/research/README.md +0 -29
- package/files/monorepos/scripts/README.md +0 -24
- package/src/cli.js +0 -72
- package/src/commands/README.md +0 -41
- package/src/commands/configure.js +0 -199
- package/src/commands/identity.js +0 -1630
- package/src/commands/ignore.js +0 -247
- package/src/commands/install.js +0 -526
- package/src/commands/setup.js +0 -246
- package/src/commands/status.js +0 -223
- package/src/commands/update.js +0 -142
- package/src/commands/version.js +0 -100
- package/src/completion.js +0 -284
- package/src/constants.js +0 -45
- package/src/ignore/claude-code.txt +0 -10
- package/src/ignore/docker.txt +0 -18
- package/src/ignore/linux.txt +0 -23
- package/src/ignore/macos.txt +0 -36
- package/src/ignore/node.txt +0 -55
- package/src/ignore/terraform.txt +0 -37
- package/src/ignore/vscode.txt +0 -18
- package/src/ignore/windows.txt +0 -35
- package/src/index.js +0 -0
- package/src/installs/README.md +0 -399
- package/src/installs/adobe-creative-cloud.js +0 -546
- package/src/installs/adobe-creative-cloud.md +0 -605
- package/src/installs/appcleaner.js +0 -321
- package/src/installs/appcleaner.md +0 -699
- package/src/installs/apt-transport-https.js +0 -390
- package/src/installs/apt-transport-https.md +0 -678
- package/src/installs/atomicparsley.js +0 -642
- package/src/installs/atomicparsley.md +0 -795
- package/src/installs/aws-cli.js +0 -797
- package/src/installs/aws-cli.md +0 -727
- package/src/installs/balena-etcher.js +0 -710
- package/src/installs/balena-etcher.md +0 -761
- package/src/installs/bambu-studio.js +0 -1143
- package/src/installs/bambu-studio.md +0 -780
- package/src/installs/bash-completion.js +0 -575
- package/src/installs/bash-completion.md +0 -833
- package/src/installs/bash.js +0 -417
- package/src/installs/bash.md +0 -993
- package/src/installs/beyond-compare.js +0 -603
- package/src/installs/beyond-compare.md +0 -813
- package/src/installs/brave-browser.js +0 -968
- package/src/installs/brave-browser.md +0 -650
- package/src/installs/build-essential.js +0 -529
- package/src/installs/build-essential.md +0 -977
- package/src/installs/ca-certificates.js +0 -618
- package/src/installs/ca-certificates.md +0 -937
- package/src/installs/caffeine.js +0 -508
- package/src/installs/caffeine.md +0 -839
- package/src/installs/camtasia.js +0 -596
- package/src/installs/camtasia.md +0 -762
- package/src/installs/chatgpt.js +0 -476
- package/src/installs/chatgpt.md +0 -814
- package/src/installs/chocolatey.js +0 -456
- package/src/installs/chocolatey.md +0 -661
- package/src/installs/chrome-canary.js +0 -419
- package/src/installs/chrome-canary.md +0 -641
- package/src/installs/chromium.js +0 -667
- package/src/installs/chromium.md +0 -838
- package/src/installs/claude-code.js +0 -576
- package/src/installs/claude-code.md +0 -1173
- package/src/installs/cloudflare-warp.js +0 -900
- package/src/installs/cloudflare-warp.md +0 -1047
- package/src/installs/comet-browser.js +0 -588
- package/src/installs/comet-browser.md +0 -731
- package/src/installs/curl.js +0 -379
- package/src/installs/curl.md +0 -714
- package/src/installs/cursor.js +0 -579
- package/src/installs/cursor.md +0 -970
- package/src/installs/dbeaver.js +0 -924
- package/src/installs/dbeaver.md +0 -939
- package/src/installs/dbschema.js +0 -692
- package/src/installs/dbschema.md +0 -925
- package/src/installs/dependencies.md +0 -453
- package/src/installs/development-tools.js +0 -600
- package/src/installs/development-tools.md +0 -977
- package/src/installs/docker.js +0 -1029
- package/src/installs/docker.md +0 -1109
- package/src/installs/drawio.js +0 -1019
- package/src/installs/drawio.md +0 -795
- package/src/installs/elmedia-player.js +0 -347
- package/src/installs/elmedia-player.md +0 -556
- package/src/installs/ffmpeg.js +0 -889
- package/src/installs/ffmpeg.md +0 -852
- package/src/installs/file.js +0 -464
- package/src/installs/file.md +0 -987
- package/src/installs/gemini-cli.js +0 -811
- package/src/installs/gemini-cli.md +0 -1153
- package/src/installs/git.js +0 -400
- package/src/installs/git.md +0 -907
- package/src/installs/gitego.js +0 -949
- package/src/installs/gitego.md +0 -1172
- package/src/installs/go.js +0 -931
- package/src/installs/go.md +0 -958
- package/src/installs/google-antigravity.js +0 -913
- package/src/installs/google-antigravity.md +0 -1075
- package/src/installs/google-chrome.js +0 -833
- package/src/installs/google-chrome.md +0 -862
- package/src/installs/gpg.js +0 -480
- package/src/installs/gpg.md +0 -1056
- package/src/installs/homebrew.js +0 -1033
- package/src/installs/homebrew.md +0 -988
- package/src/installs/imageoptim.js +0 -968
- package/src/installs/imageoptim.md +0 -1119
- package/src/installs/installers.json +0 -4032
- package/src/installs/installers.json.tmp +0 -3953
- package/src/installs/jq.js +0 -400
- package/src/installs/jq.md +0 -809
- package/src/installs/keyboard-maestro.js +0 -719
- package/src/installs/keyboard-maestro.md +0 -825
- package/src/installs/kiro.js +0 -864
- package/src/installs/kiro.md +0 -1015
- package/src/installs/latex.js +0 -789
- package/src/installs/latex.md +0 -1095
- package/src/installs/lftp.js +0 -356
- package/src/installs/lftp.md +0 -907
- package/src/installs/lsb-release.js +0 -346
- package/src/installs/lsb-release.md +0 -814
- package/src/installs/messenger.js +0 -847
- package/src/installs/messenger.md +0 -900
- package/src/installs/microsoft-office.js +0 -568
- package/src/installs/microsoft-office.md +0 -760
- package/src/installs/microsoft-teams.js +0 -801
- package/src/installs/microsoft-teams.md +0 -886
- package/src/installs/moom.js +0 -326
- package/src/installs/moom.md +0 -570
- package/src/installs/node.js +0 -904
- package/src/installs/node.md +0 -1153
- package/src/installs/nordpass.js +0 -716
- package/src/installs/nordpass.md +0 -921
- package/src/installs/nordvpn.js +0 -892
- package/src/installs/nordvpn.md +0 -1052
- package/src/installs/nvm.js +0 -995
- package/src/installs/nvm.md +0 -1057
- package/src/installs/ohmyzsh.js +0 -529
- package/src/installs/ohmyzsh.md +0 -1094
- package/src/installs/openssh.js +0 -804
- package/src/installs/openssh.md +0 -1056
- package/src/installs/pandoc.js +0 -662
- package/src/installs/pandoc.md +0 -1036
- package/src/installs/parallels-desktop.js +0 -431
- package/src/installs/parallels-desktop.md +0 -446
- package/src/installs/pinentry.js +0 -510
- package/src/installs/pinentry.md +0 -1142
- package/src/installs/pngyu.js +0 -869
- package/src/installs/pngyu.md +0 -896
- package/src/installs/postman.js +0 -799
- package/src/installs/postman.md +0 -940
- package/src/installs/procps.js +0 -425
- package/src/installs/procps.md +0 -851
- package/src/installs/safari-tech-preview.js +0 -374
- package/src/installs/safari-tech-preview.md +0 -533
- package/src/installs/sfnt2woff.js +0 -658
- package/src/installs/sfnt2woff.md +0 -795
- package/src/installs/shellcheck.js +0 -481
- package/src/installs/shellcheck.md +0 -1005
- package/src/installs/slack.js +0 -741
- package/src/installs/slack.md +0 -865
- package/src/installs/snagit.js +0 -585
- package/src/installs/snagit.md +0 -844
- package/src/installs/software-properties-common.js +0 -372
- package/src/installs/software-properties-common.md +0 -805
- package/src/installs/spotify.js +0 -877
- package/src/installs/spotify.md +0 -901
- package/src/installs/studio-3t.js +0 -823
- package/src/installs/studio-3t.md +0 -918
- package/src/installs/sublime-text.js +0 -804
- package/src/installs/sublime-text.md +0 -914
- package/src/installs/superwhisper.js +0 -706
- package/src/installs/superwhisper.md +0 -630
- package/src/installs/tailscale.js +0 -745
- package/src/installs/tailscale.md +0 -1100
- package/src/installs/tar.js +0 -389
- package/src/installs/tar.md +0 -946
- package/src/installs/termius.js +0 -798
- package/src/installs/termius.md +0 -844
- package/src/installs/terraform.js +0 -779
- package/src/installs/terraform.md +0 -899
- package/src/installs/tfenv.js +0 -778
- package/src/installs/tfenv.md +0 -1091
- package/src/installs/tidal.js +0 -771
- package/src/installs/tidal.md +0 -864
- package/src/installs/tmux.js +0 -346
- package/src/installs/tmux.md +0 -1030
- package/src/installs/tree.js +0 -411
- package/src/installs/tree.md +0 -833
- package/src/installs/unzip.js +0 -460
- package/src/installs/unzip.md +0 -879
- package/src/installs/vim.js +0 -421
- package/src/installs/vim.md +0 -1040
- package/src/installs/vlc.js +0 -821
- package/src/installs/vlc.md +0 -927
- package/src/installs/vscode.js +0 -843
- package/src/installs/vscode.md +0 -1002
- package/src/installs/wget.js +0 -420
- package/src/installs/wget.md +0 -791
- package/src/installs/whatsapp.js +0 -729
- package/src/installs/whatsapp.md +0 -854
- package/src/installs/winpty.js +0 -352
- package/src/installs/winpty.md +0 -620
- package/src/installs/woff2.js +0 -553
- package/src/installs/woff2.md +0 -977
- package/src/installs/wsl.js +0 -572
- package/src/installs/wsl.md +0 -699
- package/src/installs/xcode-clt.js +0 -520
- package/src/installs/xcode-clt.md +0 -351
- package/src/installs/xcode.js +0 -560
- package/src/installs/xcode.md +0 -573
- package/src/installs/yarn.js +0 -824
- package/src/installs/yarn.md +0 -1074
- package/src/installs/yq.js +0 -654
- package/src/installs/yq.md +0 -944
- package/src/installs/yt-dlp.js +0 -701
- package/src/installs/yt-dlp.md +0 -946
- package/src/installs/yum-utils.js +0 -297
- package/src/installs/yum-utils.md +0 -648
- package/src/installs/zoom.js +0 -759
- package/src/installs/zoom.md +0 -884
- package/src/installs/zsh.js +0 -455
- package/src/installs/zsh.md +0 -1008
- package/src/scripts/README.md +0 -617
- package/src/scripts/STATUS.md +0 -208
- package/src/scripts/afk.js +0 -411
- package/src/scripts/backup-all.js +0 -746
- package/src/scripts/backup-source.js +0 -727
- package/src/scripts/brewd.js +0 -389
- package/src/scripts/brewi.js +0 -520
- package/src/scripts/brewr.js +0 -527
- package/src/scripts/brews.js +0 -477
- package/src/scripts/brewu.js +0 -504
- package/src/scripts/c.js +0 -201
- package/src/scripts/ccurl.js +0 -341
- package/src/scripts/certbot-crontab-init.js +0 -504
- package/src/scripts/certbot-init.js +0 -657
- package/src/scripts/ch.js +0 -355
- package/src/scripts/claude-danger.js +0 -268
- package/src/scripts/clean-dev.js +0 -435
- package/src/scripts/clear-dns-cache.js +0 -541
- package/src/scripts/clone.js +0 -435
- package/src/scripts/code-all.js +0 -437
- package/src/scripts/count-files.js +0 -211
- package/src/scripts/count-folders.js +0 -211
- package/src/scripts/count.js +0 -264
- package/src/scripts/d.js +0 -219
- package/src/scripts/datauri.js +0 -389
- package/src/scripts/delete-files.js +0 -380
- package/src/scripts/docker-clean.js +0 -426
- package/src/scripts/dp.js +0 -442
- package/src/scripts/e.js +0 -390
- package/src/scripts/empty-trash.js +0 -513
- package/src/scripts/evm.js +0 -444
- package/src/scripts/fetch-github-repos.js +0 -456
- package/src/scripts/get-channel.js +0 -345
- package/src/scripts/get-course.js +0 -399
- package/src/scripts/get-dependencies.js +0 -306
- package/src/scripts/get-folder.js +0 -799
- package/src/scripts/get-tunes.js +0 -426
- package/src/scripts/get-video.js +0 -367
- package/src/scripts/git-backup.js +0 -577
- package/src/scripts/git-clone.js +0 -493
- package/src/scripts/git-pup.js +0 -319
- package/src/scripts/git-push.js +0 -396
- package/src/scripts/h.js +0 -622
- package/src/scripts/hide-desktop-icons.js +0 -499
- package/src/scripts/hide-hidden-files.js +0 -538
- package/src/scripts/install-dependencies-from.js +0 -456
- package/src/scripts/ips.js +0 -663
- package/src/scripts/iso.js +0 -370
- package/src/scripts/killni.js +0 -577
- package/src/scripts/ll.js +0 -467
- package/src/scripts/local-ip.js +0 -325
- package/src/scripts/m.js +0 -524
- package/src/scripts/map.js +0 -309
- package/src/scripts/mkd.js +0 -351
- package/src/scripts/ncu-update-all.js +0 -457
- package/src/scripts/nginx-init.js +0 -718
- package/src/scripts/npmi.js +0 -382
- package/src/scripts/o.js +0 -511
- package/src/scripts/org-by-date.js +0 -338
- package/src/scripts/p.js +0 -224
- package/src/scripts/packages.js +0 -330
- package/src/scripts/path.js +0 -225
- package/src/scripts/ports.js +0 -597
- package/src/scripts/q.js +0 -305
- package/src/scripts/refresh-files.js +0 -394
- package/src/scripts/remove-smaller-files.js +0 -516
- package/src/scripts/rename-files-with-date.js +0 -533
- package/src/scripts/resize-image.js +0 -539
- package/src/scripts/rm-safe.js +0 -669
- package/src/scripts/s.js +0 -540
- package/src/scripts/set-git-public.js +0 -365
- package/src/scripts/show-desktop-icons.js +0 -475
- package/src/scripts/show-hidden-files.js +0 -472
- package/src/scripts/tpa.js +0 -280
- package/src/scripts/tpo.js +0 -280
- package/src/scripts/u.js +0 -505
- package/src/scripts/vpush.js +0 -437
- package/src/scripts/y.js +0 -283
- package/src/utils/README.md +0 -95
- package/src/utils/common/apps.js +0 -143
- package/src/utils/common/display.js +0 -157
- package/src/utils/common/network.js +0 -185
- package/src/utils/common/os.js +0 -294
- package/src/utils/common/package-manager.js +0 -301
- package/src/utils/common/privileges.js +0 -138
- package/src/utils/common/shell.js +0 -216
- package/src/utils/macos/apps.js +0 -228
- package/src/utils/macos/brew.js +0 -315
- package/src/utils/ubuntu/apt.js +0 -307
- package/src/utils/ubuntu/desktop.js +0 -292
- package/src/utils/ubuntu/snap.js +0 -344
- package/src/utils/ubuntu/systemd.js +0 -286
- package/src/utils/windows/choco.js +0 -465
- package/src/utils/windows/env.js +0 -246
- package/src/utils/windows/registry.js +0 -269
- package/src/utils/windows/shell.js +0 -240
- package/src/utils/windows/winget.js +0 -489
|
@@ -1,489 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Windows Package Manager (winget) Utilities
|
|
5
|
-
*
|
|
6
|
-
* Windows-specific utilities for interacting with winget.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const shell = require('../common/shell');
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Well-known path where winget is typically installed on Windows.
|
|
15
|
-
* This path is used as a fallback when winget is not found in PATH,
|
|
16
|
-
* which can happen when winget was just installed and the current
|
|
17
|
-
* process still has the old PATH environment variable.
|
|
18
|
-
*/
|
|
19
|
-
const WINGET_KNOWN_PATH = path.join(
|
|
20
|
-
process.env.LOCALAPPDATA || '',
|
|
21
|
-
'Microsoft',
|
|
22
|
-
'WindowsApps',
|
|
23
|
-
'winget.exe'
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* The WindowsApps directory containing Microsoft Store app aliases.
|
|
28
|
-
*/
|
|
29
|
-
const WINDOWS_APPS_DIR = path.join(
|
|
30
|
-
process.env.LOCALAPPDATA || '',
|
|
31
|
-
'Microsoft',
|
|
32
|
-
'WindowsApps'
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Adds the WindowsApps directory to the current process's PATH.
|
|
37
|
-
*
|
|
38
|
-
* This ensures that winget and other Microsoft Store apps are accessible
|
|
39
|
-
* to child processes spawned by this Node.js process. Normally this directory
|
|
40
|
-
* is in PATH, but in some environments (like fresh installations or CI) it may
|
|
41
|
-
* not be.
|
|
42
|
-
*
|
|
43
|
-
* This function is idempotent - it won't add the path if it's already present.
|
|
44
|
-
*
|
|
45
|
-
* @returns {boolean} True if PATH was modified, false if already present
|
|
46
|
-
*/
|
|
47
|
-
function addBinToPath() {
|
|
48
|
-
if (!WINDOWS_APPS_DIR) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const currentPath = process.env.PATH || '';
|
|
53
|
-
const pathSeparator = ';';
|
|
54
|
-
|
|
55
|
-
// Check if already in PATH (case-insensitive on Windows)
|
|
56
|
-
const paths = currentPath.split(pathSeparator);
|
|
57
|
-
const alreadyInPath = paths.some(p =>
|
|
58
|
-
p.toLowerCase() === WINDOWS_APPS_DIR.toLowerCase()
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
if (alreadyInPath) {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Prepend WindowsApps directory to PATH
|
|
66
|
-
process.env.PATH = `${WINDOWS_APPS_DIR}${pathSeparator}${currentPath}`;
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Checks if winget is available.
|
|
72
|
-
*
|
|
73
|
-
* First checks PATH, then falls back to checking the well-known
|
|
74
|
-
* installation path. This handles the case where winget was just
|
|
75
|
-
* installed and PATH hasn't been updated in the current process.
|
|
76
|
-
*
|
|
77
|
-
* @returns {boolean}
|
|
78
|
-
*/
|
|
79
|
-
function isInstalled() {
|
|
80
|
-
return getExecutablePath() !== null;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Gets the path to the winget executable.
|
|
85
|
-
*
|
|
86
|
-
* First checks if winget is in PATH, then falls back to the well-known
|
|
87
|
-
* installation path. This handles the case where winget was just
|
|
88
|
-
* installed and PATH hasn't been updated in the current process.
|
|
89
|
-
*
|
|
90
|
-
* @returns {string|null} The path to winget executable, or null if not found
|
|
91
|
-
*/
|
|
92
|
-
function getExecutablePath() {
|
|
93
|
-
// First check if winget is in PATH
|
|
94
|
-
if (shell.commandExists('winget')) {
|
|
95
|
-
return 'winget';
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Fall back to checking the well-known installation path
|
|
99
|
-
// This handles cases where winget was just installed and PATH
|
|
100
|
-
// hasn't been updated in the current Node.js process
|
|
101
|
-
try {
|
|
102
|
-
if (WINGET_KNOWN_PATH && fs.existsSync(WINGET_KNOWN_PATH)) {
|
|
103
|
-
return WINGET_KNOWN_PATH;
|
|
104
|
-
}
|
|
105
|
-
} catch {
|
|
106
|
-
// Ignore errors checking the path
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Returns the installed winget version
|
|
114
|
-
* @returns {Promise<string|null>}
|
|
115
|
-
*/
|
|
116
|
-
async function getVersion() {
|
|
117
|
-
const wingetPath = getExecutablePath();
|
|
118
|
-
if (!wingetPath) {
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const result = await shell.exec(`"${wingetPath}" --version`);
|
|
123
|
-
if (result.code === 0) {
|
|
124
|
-
// Output: "v1.6.2771"
|
|
125
|
-
return result.stdout.trim().replace(/^v/, '');
|
|
126
|
-
}
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Installs a package via winget
|
|
132
|
-
* @param {string} packageName - The package name or ID to install
|
|
133
|
-
* @param {Object} [options] - Installation options
|
|
134
|
-
* @param {boolean} [options.silent=true] - Silent installation
|
|
135
|
-
* @param {string} [options.version] - Specific version to install
|
|
136
|
-
* @param {string} [options.source='winget'] - Package source (winget, msstore). Defaults to 'winget'
|
|
137
|
-
* to avoid issues with msstore certificate errors and source ambiguity.
|
|
138
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
139
|
-
*/
|
|
140
|
-
async function install(packageName, options = {}) {
|
|
141
|
-
const wingetPath = getExecutablePath();
|
|
142
|
-
if (!wingetPath) {
|
|
143
|
-
return {
|
|
144
|
-
success: false,
|
|
145
|
-
output: 'winget is not available'
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
let command = `"${wingetPath}" install "${packageName}" --accept-package-agreements --accept-source-agreements`;
|
|
150
|
-
|
|
151
|
-
if (options.silent !== false) {
|
|
152
|
-
command += ' --silent';
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if (options.version) {
|
|
156
|
-
command += ` --version "${options.version}"`;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Default to 'winget' source to avoid msstore certificate errors and
|
|
160
|
-
// source ambiguity when packages exist in multiple sources
|
|
161
|
-
const source = options.source !== undefined ? options.source : 'winget';
|
|
162
|
-
if (source) {
|
|
163
|
-
command += ` --source ${source}`;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const result = await shell.exec(command);
|
|
167
|
-
return {
|
|
168
|
-
success: result.code === 0,
|
|
169
|
-
output: result.stdout || result.stderr
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Removes a package via winget
|
|
175
|
-
* @param {string} packageName - The package name or ID to remove
|
|
176
|
-
* @param {Object} [options] - Removal options
|
|
177
|
-
* @param {boolean} [options.silent=true] - Silent uninstallation
|
|
178
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
179
|
-
*/
|
|
180
|
-
async function uninstall(packageName, options = {}) {
|
|
181
|
-
const wingetPath = getExecutablePath();
|
|
182
|
-
if (!wingetPath) {
|
|
183
|
-
return {
|
|
184
|
-
success: false,
|
|
185
|
-
output: 'winget is not available'
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
let command = `"${wingetPath}" uninstall "${packageName}"`;
|
|
190
|
-
|
|
191
|
-
if (options.silent !== false) {
|
|
192
|
-
command += ' --silent';
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const result = await shell.exec(command);
|
|
196
|
-
return {
|
|
197
|
-
success: result.code === 0,
|
|
198
|
-
output: result.stdout || result.stderr
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Checks if a package is installed
|
|
204
|
-
* @param {string} packageName - The package name or ID to check
|
|
205
|
-
* @returns {Promise<boolean>}
|
|
206
|
-
*/
|
|
207
|
-
async function isPackageInstalled(packageName) {
|
|
208
|
-
const wingetPath = getExecutablePath();
|
|
209
|
-
if (!wingetPath) {
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const result = await shell.exec(`"${wingetPath}" list --exact --id "${packageName}"`);
|
|
214
|
-
// Check if the output contains the package
|
|
215
|
-
if (result.code === 0 && result.stdout.includes(packageName)) {
|
|
216
|
-
return true;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Try by name if ID didn't match
|
|
220
|
-
const nameResult = await shell.exec(`"${wingetPath}" list --exact --name "${packageName}"`);
|
|
221
|
-
return nameResult.code === 0 && nameResult.stdout.includes(packageName);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Returns the installed version of a package
|
|
226
|
-
* @param {string} packageName - The package name or ID
|
|
227
|
-
* @returns {Promise<string|null>}
|
|
228
|
-
*/
|
|
229
|
-
async function getPackageVersion(packageName) {
|
|
230
|
-
const wingetPath = getExecutablePath();
|
|
231
|
-
if (!wingetPath) {
|
|
232
|
-
return null;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const result = await shell.exec(`"${wingetPath}" list --exact --id "${packageName}"`);
|
|
236
|
-
if (result.code !== 0) {
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Parse the output to find the version
|
|
241
|
-
// Output format is a table with columns: Name, Id, Version, Available, Source
|
|
242
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
243
|
-
for (const line of lines) {
|
|
244
|
-
if (line.includes(packageName)) {
|
|
245
|
-
// Find version column (typically after the ID)
|
|
246
|
-
const parts = line.split(/\s{2,}/);
|
|
247
|
-
if (parts.length >= 3) {
|
|
248
|
-
return parts[2].trim();
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Upgrades a package
|
|
258
|
-
* @param {string} packageName - The package name or ID to upgrade
|
|
259
|
-
* @param {Object} [options] - Upgrade options
|
|
260
|
-
* @param {boolean} [options.silent=true] - Silent upgrade
|
|
261
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
262
|
-
*/
|
|
263
|
-
async function upgrade(packageName, options = {}) {
|
|
264
|
-
const wingetPath = getExecutablePath();
|
|
265
|
-
if (!wingetPath) {
|
|
266
|
-
return {
|
|
267
|
-
success: false,
|
|
268
|
-
output: 'winget is not available'
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
let command = `"${wingetPath}" upgrade "${packageName}" --accept-package-agreements --accept-source-agreements`;
|
|
273
|
-
|
|
274
|
-
if (options.silent !== false) {
|
|
275
|
-
command += ' --silent';
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
const result = await shell.exec(command);
|
|
279
|
-
return {
|
|
280
|
-
success: result.code === 0,
|
|
281
|
-
output: result.stdout || result.stderr
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Upgrades all packages
|
|
287
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
288
|
-
*/
|
|
289
|
-
async function upgradeAll() {
|
|
290
|
-
const wingetPath = getExecutablePath();
|
|
291
|
-
if (!wingetPath) {
|
|
292
|
-
return {
|
|
293
|
-
success: false,
|
|
294
|
-
output: 'winget is not available'
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const result = await shell.exec(`"${wingetPath}" upgrade --all --accept-package-agreements --accept-source-agreements`);
|
|
299
|
-
return {
|
|
300
|
-
success: result.code === 0,
|
|
301
|
-
output: result.stdout || result.stderr
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Searches the winget repository
|
|
307
|
-
* @param {string} query - The search query
|
|
308
|
-
* @returns {Promise<Array<{ name: string, id: string, version: string }>>}
|
|
309
|
-
*/
|
|
310
|
-
async function search(query) {
|
|
311
|
-
const wingetPath = getExecutablePath();
|
|
312
|
-
if (!wingetPath) {
|
|
313
|
-
return [];
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
const result = await shell.exec(`"${wingetPath}" search "${query}"`);
|
|
317
|
-
if (result.code !== 0) {
|
|
318
|
-
return [];
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const packages = [];
|
|
322
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
323
|
-
|
|
324
|
-
// Skip header lines (usually first 2)
|
|
325
|
-
let dataStarted = false;
|
|
326
|
-
for (const line of lines) {
|
|
327
|
-
// Look for separator line to know when data starts
|
|
328
|
-
if (line.includes('---')) {
|
|
329
|
-
dataStarted = true;
|
|
330
|
-
continue;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
if (!dataStarted) continue;
|
|
334
|
-
|
|
335
|
-
// Parse columns (separated by multiple spaces)
|
|
336
|
-
const parts = line.split(/\s{2,}/).filter(Boolean);
|
|
337
|
-
if (parts.length >= 2) {
|
|
338
|
-
packages.push({
|
|
339
|
-
name: parts[0].trim(),
|
|
340
|
-
id: parts[1].trim(),
|
|
341
|
-
version: parts[2] ? parts[2].trim() : ''
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
return packages;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Lists installed packages
|
|
351
|
-
* @returns {Promise<Array<{ name: string, id: string, version: string }>>}
|
|
352
|
-
*/
|
|
353
|
-
async function list() {
|
|
354
|
-
const wingetPath = getExecutablePath();
|
|
355
|
-
if (!wingetPath) {
|
|
356
|
-
return [];
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
const result = await shell.exec(`"${wingetPath}" list`);
|
|
360
|
-
if (result.code !== 0) {
|
|
361
|
-
return [];
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
const packages = [];
|
|
365
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
366
|
-
|
|
367
|
-
let dataStarted = false;
|
|
368
|
-
for (const line of lines) {
|
|
369
|
-
if (line.includes('---')) {
|
|
370
|
-
dataStarted = true;
|
|
371
|
-
continue;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
if (!dataStarted) continue;
|
|
375
|
-
|
|
376
|
-
const parts = line.split(/\s{2,}/).filter(Boolean);
|
|
377
|
-
if (parts.length >= 2) {
|
|
378
|
-
packages.push({
|
|
379
|
-
name: parts[0].trim(),
|
|
380
|
-
id: parts[1].trim(),
|
|
381
|
-
version: parts[2] ? parts[2].trim() : ''
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
return packages;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Gets information about a package
|
|
391
|
-
* @param {string} packageName - The package name or ID
|
|
392
|
-
* @returns {Promise<string|null>}
|
|
393
|
-
*/
|
|
394
|
-
async function info(packageName) {
|
|
395
|
-
const wingetPath = getExecutablePath();
|
|
396
|
-
if (!wingetPath) {
|
|
397
|
-
return null;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
const result = await shell.exec(`"${wingetPath}" show "${packageName}"`);
|
|
401
|
-
if (result.code === 0) {
|
|
402
|
-
return result.stdout;
|
|
403
|
-
}
|
|
404
|
-
return null;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* Lists packages with available upgrades
|
|
409
|
-
* @returns {Promise<Array<{ name: string, id: string, currentVersion: string, availableVersion: string }>>}
|
|
410
|
-
*/
|
|
411
|
-
async function listUpgradable() {
|
|
412
|
-
const wingetPath = getExecutablePath();
|
|
413
|
-
if (!wingetPath) {
|
|
414
|
-
return [];
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
const result = await shell.exec(`"${wingetPath}" upgrade`);
|
|
418
|
-
if (result.code !== 0) {
|
|
419
|
-
return [];
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
const packages = [];
|
|
423
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
424
|
-
|
|
425
|
-
let dataStarted = false;
|
|
426
|
-
for (const line of lines) {
|
|
427
|
-
if (line.includes('---')) {
|
|
428
|
-
dataStarted = true;
|
|
429
|
-
continue;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
if (!dataStarted) continue;
|
|
433
|
-
|
|
434
|
-
// Skip summary lines
|
|
435
|
-
if (line.includes('upgrades available') || line.includes('winget upgrade')) {
|
|
436
|
-
continue;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
const parts = line.split(/\s{2,}/).filter(Boolean);
|
|
440
|
-
if (parts.length >= 4) {
|
|
441
|
-
packages.push({
|
|
442
|
-
name: parts[0].trim(),
|
|
443
|
-
id: parts[1].trim(),
|
|
444
|
-
currentVersion: parts[2].trim(),
|
|
445
|
-
availableVersion: parts[3].trim()
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
return packages;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/**
|
|
454
|
-
* Updates winget sources
|
|
455
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
456
|
-
*/
|
|
457
|
-
async function updateSources() {
|
|
458
|
-
const wingetPath = getExecutablePath();
|
|
459
|
-
if (!wingetPath) {
|
|
460
|
-
return {
|
|
461
|
-
success: false,
|
|
462
|
-
output: 'winget is not available'
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
const result = await shell.exec(`"${wingetPath}" source update`);
|
|
467
|
-
return {
|
|
468
|
-
success: result.code === 0,
|
|
469
|
-
output: result.stdout || result.stderr
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
module.exports = {
|
|
474
|
-
isInstalled,
|
|
475
|
-
getExecutablePath,
|
|
476
|
-
addBinToPath,
|
|
477
|
-
getVersion,
|
|
478
|
-
install,
|
|
479
|
-
uninstall,
|
|
480
|
-
isPackageInstalled,
|
|
481
|
-
getPackageVersion,
|
|
482
|
-
upgrade,
|
|
483
|
-
upgradeAll,
|
|
484
|
-
search,
|
|
485
|
-
list,
|
|
486
|
-
info,
|
|
487
|
-
listUpgradable,
|
|
488
|
-
updateSources
|
|
489
|
-
};
|