@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,465 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Chocolatey Package Manager Utilities
|
|
5
|
-
*
|
|
6
|
-
* Windows-specific utilities for interacting with Chocolatey.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const shell = require('../common/shell');
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Well-known path where Chocolatey is typically installed on Windows.
|
|
14
|
-
* This path is used as a fallback when choco is not found in PATH,
|
|
15
|
-
* which can happen when Chocolatey was just installed and the current
|
|
16
|
-
* process still has the old PATH environment variable.
|
|
17
|
-
*/
|
|
18
|
-
const CHOCO_KNOWN_PATH = 'C:\\ProgramData\\chocolatey\\bin\\choco.exe';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Well-known directory where Chocolatey installs command binaries.
|
|
22
|
-
* All Chocolatey-installed commands get shims placed here.
|
|
23
|
-
*/
|
|
24
|
-
const CHOCO_BIN_DIR = 'C:\\ProgramData\\chocolatey\\bin';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Adds Chocolatey's bin directory to the current process's PATH.
|
|
28
|
-
*
|
|
29
|
-
* This is necessary after installing Chocolatey because the PATH environment
|
|
30
|
-
* variable in the current Node.js process won't be updated until a new terminal
|
|
31
|
-
* is opened. By manually adding the bin directory, subsequent child processes
|
|
32
|
-
* spawned by this process will be able to find Chocolatey-installed commands.
|
|
33
|
-
*
|
|
34
|
-
* This function is idempotent - it won't add the path if it's already present.
|
|
35
|
-
*
|
|
36
|
-
* @returns {boolean} True if PATH was modified, false if already present
|
|
37
|
-
*/
|
|
38
|
-
function addBinToPath() {
|
|
39
|
-
const currentPath = process.env.PATH || '';
|
|
40
|
-
const pathSeparator = ';';
|
|
41
|
-
|
|
42
|
-
// Check if already in PATH (case-insensitive on Windows)
|
|
43
|
-
const paths = currentPath.split(pathSeparator);
|
|
44
|
-
const alreadyInPath = paths.some(p =>
|
|
45
|
-
p.toLowerCase() === CHOCO_BIN_DIR.toLowerCase()
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
if (alreadyInPath) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Prepend Chocolatey bin directory to PATH
|
|
53
|
-
process.env.PATH = `${CHOCO_BIN_DIR}${pathSeparator}${currentPath}`;
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Checks if Chocolatey is installed.
|
|
59
|
-
*
|
|
60
|
-
* First checks PATH, then falls back to checking the well-known
|
|
61
|
-
* installation path. This handles the case where Chocolatey was just
|
|
62
|
-
* installed and PATH hasn't been updated in the current process.
|
|
63
|
-
*
|
|
64
|
-
* @returns {boolean}
|
|
65
|
-
*/
|
|
66
|
-
function isInstalled() {
|
|
67
|
-
return getExecutablePath() !== null;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Gets the path to the Chocolatey executable.
|
|
72
|
-
*
|
|
73
|
-
* First checks if choco is in PATH, then falls back to the well-known
|
|
74
|
-
* installation path. This handles the case where Chocolatey was just
|
|
75
|
-
* installed and PATH hasn't been updated in the current process.
|
|
76
|
-
*
|
|
77
|
-
* @returns {string|null} The path to choco executable, or null if not found
|
|
78
|
-
*/
|
|
79
|
-
function getExecutablePath() {
|
|
80
|
-
// First check if choco is in PATH
|
|
81
|
-
if (shell.commandExists('choco')) {
|
|
82
|
-
return 'choco';
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Fall back to checking the well-known installation path
|
|
86
|
-
// This handles cases where Chocolatey was just installed and PATH
|
|
87
|
-
// hasn't been updated in the current Node.js process
|
|
88
|
-
try {
|
|
89
|
-
if (fs.existsSync(CHOCO_KNOWN_PATH)) {
|
|
90
|
-
return CHOCO_KNOWN_PATH;
|
|
91
|
-
}
|
|
92
|
-
} catch {
|
|
93
|
-
// Ignore errors checking the path
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Checks if a command binary exists in Chocolatey's bin directory.
|
|
101
|
-
*
|
|
102
|
-
* This is useful for verifying installations when the PATH hasn't been
|
|
103
|
-
* updated yet. Chocolatey creates shims (small .exe files) in its bin
|
|
104
|
-
* directory for all installed commands.
|
|
105
|
-
*
|
|
106
|
-
* @param {string} commandName - The command name (without .exe extension)
|
|
107
|
-
* @returns {boolean} True if the binary exists in Chocolatey's bin directory
|
|
108
|
-
*/
|
|
109
|
-
function commandBinaryExists(commandName) {
|
|
110
|
-
const path = require('path');
|
|
111
|
-
const binaryPath = path.join(CHOCO_BIN_DIR, `${commandName}.exe`);
|
|
112
|
-
|
|
113
|
-
try {
|
|
114
|
-
return fs.existsSync(binaryPath);
|
|
115
|
-
} catch {
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Gets the full path to a command's binary in Chocolatey's bin directory.
|
|
122
|
-
*
|
|
123
|
-
* @param {string} commandName - The command name (without .exe extension)
|
|
124
|
-
* @returns {string|null} Full path to the binary, or null if not found
|
|
125
|
-
*/
|
|
126
|
-
function getCommandBinaryPath(commandName) {
|
|
127
|
-
const path = require('path');
|
|
128
|
-
const binaryPath = path.join(CHOCO_BIN_DIR, `${commandName}.exe`);
|
|
129
|
-
|
|
130
|
-
try {
|
|
131
|
-
if (fs.existsSync(binaryPath)) {
|
|
132
|
-
return binaryPath;
|
|
133
|
-
}
|
|
134
|
-
} catch {
|
|
135
|
-
// Ignore errors
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Returns the installed Chocolatey version
|
|
143
|
-
* @returns {Promise<string|null>}
|
|
144
|
-
*/
|
|
145
|
-
async function getVersion() {
|
|
146
|
-
const chocoPath = getExecutablePath();
|
|
147
|
-
if (!chocoPath) {
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const result = await shell.exec(`"${chocoPath}" --version`);
|
|
152
|
-
if (result.code === 0) {
|
|
153
|
-
return result.stdout.trim();
|
|
154
|
-
}
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Installs a Chocolatey package
|
|
160
|
-
* @param {string} packageName - The package name to install
|
|
161
|
-
* @param {Object} [options] - Installation options
|
|
162
|
-
* @param {boolean} [options.force=false] - Force reinstall if already installed
|
|
163
|
-
* @param {string} [options.version] - Specific version to install
|
|
164
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
165
|
-
*/
|
|
166
|
-
async function install(packageName, options = {}) {
|
|
167
|
-
const chocoPath = getExecutablePath();
|
|
168
|
-
if (!chocoPath) {
|
|
169
|
-
return {
|
|
170
|
-
success: false,
|
|
171
|
-
output: 'Chocolatey is not installed'
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
let command = `"${chocoPath}" install ${packageName} -y`;
|
|
176
|
-
|
|
177
|
-
if (options.force) {
|
|
178
|
-
command += ' --force';
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (options.version) {
|
|
182
|
-
command += ` --version=${options.version}`;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const result = await shell.exec(command);
|
|
186
|
-
return {
|
|
187
|
-
success: result.code === 0,
|
|
188
|
-
output: result.stdout || result.stderr
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Removes a Chocolatey package
|
|
194
|
-
* @param {string} packageName - The package name to remove
|
|
195
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
196
|
-
*/
|
|
197
|
-
async function uninstall(packageName) {
|
|
198
|
-
const chocoPath = getExecutablePath();
|
|
199
|
-
if (!chocoPath) {
|
|
200
|
-
return {
|
|
201
|
-
success: false,
|
|
202
|
-
output: 'Chocolatey is not installed'
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const result = await shell.exec(`"${chocoPath}" uninstall ${packageName} -y`);
|
|
207
|
-
return {
|
|
208
|
-
success: result.code === 0,
|
|
209
|
-
output: result.stdout || result.stderr
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Checks if a package is installed via Chocolatey
|
|
215
|
-
* @param {string} packageName - The package name to check
|
|
216
|
-
* @returns {Promise<boolean>}
|
|
217
|
-
*/
|
|
218
|
-
async function isPackageInstalled(packageName) {
|
|
219
|
-
const chocoPath = getExecutablePath();
|
|
220
|
-
if (!chocoPath) {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
const result = await shell.exec(`"${chocoPath}" list --local-only --exact ${packageName}`);
|
|
225
|
-
// Output contains the package name if installed
|
|
226
|
-
return result.code === 0 && result.stdout.toLowerCase().includes(packageName.toLowerCase());
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Returns the installed version of a package
|
|
231
|
-
* @param {string} packageName - The package name
|
|
232
|
-
* @returns {Promise<string|null>}
|
|
233
|
-
*/
|
|
234
|
-
async function getPackageVersion(packageName) {
|
|
235
|
-
const chocoPath = getExecutablePath();
|
|
236
|
-
if (!chocoPath) {
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const result = await shell.exec(`"${chocoPath}" list --local-only --exact ${packageName}`);
|
|
241
|
-
if (result.code !== 0) {
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Output format: "packageName version"
|
|
246
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
247
|
-
for (const line of lines) {
|
|
248
|
-
const parts = line.trim().split(/\s+/);
|
|
249
|
-
if (parts[0] && parts[0].toLowerCase() === packageName.toLowerCase()) {
|
|
250
|
-
return parts[1] || null;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return null;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Upgrades a package or all packages
|
|
259
|
-
* @param {string} [packageName] - The package to upgrade (all if omitted)
|
|
260
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
261
|
-
*/
|
|
262
|
-
async function upgrade(packageName) {
|
|
263
|
-
const chocoPath = getExecutablePath();
|
|
264
|
-
if (!chocoPath) {
|
|
265
|
-
return {
|
|
266
|
-
success: false,
|
|
267
|
-
output: 'Chocolatey is not installed'
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const target = packageName || 'all';
|
|
272
|
-
const result = await shell.exec(`"${chocoPath}" upgrade ${target} -y`);
|
|
273
|
-
return {
|
|
274
|
-
success: result.code === 0,
|
|
275
|
-
output: result.stdout || result.stderr
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Searches the Chocolatey repository
|
|
281
|
-
* @param {string} query - The search query
|
|
282
|
-
* @returns {Promise<Array<{ name: string, version: string }>>}
|
|
283
|
-
*/
|
|
284
|
-
async function search(query) {
|
|
285
|
-
const chocoPath = getExecutablePath();
|
|
286
|
-
if (!chocoPath) {
|
|
287
|
-
return [];
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
const result = await shell.exec(`"${chocoPath}" search "${query}"`);
|
|
291
|
-
if (result.code !== 0) {
|
|
292
|
-
return [];
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
const packages = [];
|
|
296
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
297
|
-
|
|
298
|
-
for (const line of lines) {
|
|
299
|
-
// Skip header and summary lines
|
|
300
|
-
if (line.includes('packages found') || line.includes('Chocolatey')) {
|
|
301
|
-
continue;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const parts = line.trim().split(/\s+/);
|
|
305
|
-
if (parts.length >= 2 && !parts[0].includes('=')) {
|
|
306
|
-
packages.push({
|
|
307
|
-
name: parts[0],
|
|
308
|
-
version: parts[1]
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
return packages;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Gets information about a package
|
|
318
|
-
* @param {string} packageName - The package name
|
|
319
|
-
* @returns {Promise<string|null>}
|
|
320
|
-
*/
|
|
321
|
-
async function info(packageName) {
|
|
322
|
-
const chocoPath = getExecutablePath();
|
|
323
|
-
if (!chocoPath) {
|
|
324
|
-
return null;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
const result = await shell.exec(`"${chocoPath}" info ${packageName}`);
|
|
328
|
-
if (result.code === 0) {
|
|
329
|
-
return result.stdout;
|
|
330
|
-
}
|
|
331
|
-
return null;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Lists all locally installed packages
|
|
336
|
-
* @returns {Promise<Array<{ name: string, version: string }>>}
|
|
337
|
-
*/
|
|
338
|
-
async function listInstalled() {
|
|
339
|
-
const chocoPath = getExecutablePath();
|
|
340
|
-
if (!chocoPath) {
|
|
341
|
-
return [];
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const result = await shell.exec(`"${chocoPath}" list --local-only`);
|
|
345
|
-
if (result.code !== 0) {
|
|
346
|
-
return [];
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
const packages = [];
|
|
350
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
351
|
-
|
|
352
|
-
for (const line of lines) {
|
|
353
|
-
// Skip summary line
|
|
354
|
-
if (line.includes('packages installed')) {
|
|
355
|
-
continue;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
const parts = line.trim().split(/\s+/);
|
|
359
|
-
if (parts.length >= 2) {
|
|
360
|
-
packages.push({
|
|
361
|
-
name: parts[0],
|
|
362
|
-
version: parts[1]
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
return packages;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* Lists outdated packages
|
|
372
|
-
* @returns {Promise<Array<{ name: string, currentVersion: string, availableVersion: string }>>}
|
|
373
|
-
*/
|
|
374
|
-
async function listOutdated() {
|
|
375
|
-
const chocoPath = getExecutablePath();
|
|
376
|
-
if (!chocoPath) {
|
|
377
|
-
return [];
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
const result = await shell.exec(`"${chocoPath}" outdated`);
|
|
381
|
-
if (result.code !== 0) {
|
|
382
|
-
return [];
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
const packages = [];
|
|
386
|
-
const lines = result.stdout.split('\n').filter(Boolean);
|
|
387
|
-
|
|
388
|
-
for (const line of lines) {
|
|
389
|
-
// Lines with outdated packages have format: "name|currentVer|availableVer|pinned"
|
|
390
|
-
if (line.includes('|')) {
|
|
391
|
-
const parts = line.split('|');
|
|
392
|
-
if (parts.length >= 3) {
|
|
393
|
-
packages.push({
|
|
394
|
-
name: parts[0].trim(),
|
|
395
|
-
currentVersion: parts[1].trim(),
|
|
396
|
-
availableVersion: parts[2].trim()
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
return packages;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
/**
|
|
406
|
-
* Pins a package to prevent upgrades
|
|
407
|
-
* @param {string} packageName - The package name
|
|
408
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
409
|
-
*/
|
|
410
|
-
async function pin(packageName) {
|
|
411
|
-
const chocoPath = getExecutablePath();
|
|
412
|
-
if (!chocoPath) {
|
|
413
|
-
return {
|
|
414
|
-
success: false,
|
|
415
|
-
output: 'Chocolatey is not installed'
|
|
416
|
-
};
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
const result = await shell.exec(`"${chocoPath}" pin add -n="${packageName}"`);
|
|
420
|
-
return {
|
|
421
|
-
success: result.code === 0,
|
|
422
|
-
output: result.stdout || result.stderr
|
|
423
|
-
};
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
/**
|
|
427
|
-
* Unpins a package to allow upgrades
|
|
428
|
-
* @param {string} packageName - The package name
|
|
429
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
430
|
-
*/
|
|
431
|
-
async function unpin(packageName) {
|
|
432
|
-
const chocoPath = getExecutablePath();
|
|
433
|
-
if (!chocoPath) {
|
|
434
|
-
return {
|
|
435
|
-
success: false,
|
|
436
|
-
output: 'Chocolatey is not installed'
|
|
437
|
-
};
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const result = await shell.exec(`"${chocoPath}" pin remove -n="${packageName}"`);
|
|
441
|
-
return {
|
|
442
|
-
success: result.code === 0,
|
|
443
|
-
output: result.stdout || result.stderr
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
module.exports = {
|
|
448
|
-
isInstalled,
|
|
449
|
-
getExecutablePath,
|
|
450
|
-
addBinToPath,
|
|
451
|
-
commandBinaryExists,
|
|
452
|
-
getCommandBinaryPath,
|
|
453
|
-
getVersion,
|
|
454
|
-
install,
|
|
455
|
-
uninstall,
|
|
456
|
-
isPackageInstalled,
|
|
457
|
-
getPackageVersion,
|
|
458
|
-
upgrade,
|
|
459
|
-
search,
|
|
460
|
-
info,
|
|
461
|
-
listInstalled,
|
|
462
|
-
listOutdated,
|
|
463
|
-
pin,
|
|
464
|
-
unpin
|
|
465
|
-
};
|
package/src/utils/windows/env.js
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Windows Environment Variables Utilities
|
|
5
|
-
*
|
|
6
|
-
* Windows-specific utilities for managing environment variables.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const shell = require('../common/shell');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Returns the system PATH as an array
|
|
14
|
-
* @returns {string[]}
|
|
15
|
-
*/
|
|
16
|
-
function getPath() {
|
|
17
|
-
const pathEnv = process.env.PATH || process.env.Path || '';
|
|
18
|
-
return pathEnv.split(';').filter(Boolean);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Adds a directory to the user PATH
|
|
23
|
-
* Note: Changes take effect in new processes, not the current one
|
|
24
|
-
* @param {string} directory - The directory to add to PATH
|
|
25
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
26
|
-
*/
|
|
27
|
-
async function addToPath(directory) {
|
|
28
|
-
// Normalize the path
|
|
29
|
-
const normalizedDir = path.resolve(directory);
|
|
30
|
-
|
|
31
|
-
// Check if already in PATH
|
|
32
|
-
const currentPath = getPath();
|
|
33
|
-
if (currentPath.some((p) => path.resolve(p).toLowerCase() === normalizedDir.toLowerCase())) {
|
|
34
|
-
return {
|
|
35
|
-
success: true,
|
|
36
|
-
output: 'Directory is already in PATH'
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Use PowerShell to modify user PATH
|
|
41
|
-
const command = `
|
|
42
|
-
$currentPath = [Environment]::GetEnvironmentVariable('Path', 'User')
|
|
43
|
-
$newPath = "$currentPath;${normalizedDir}"
|
|
44
|
-
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
|
45
|
-
`.replace(/\n/g, ' ');
|
|
46
|
-
|
|
47
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
48
|
-
return {
|
|
49
|
-
success: result.code === 0,
|
|
50
|
-
output: result.code === 0
|
|
51
|
-
? `Added ${normalizedDir} to user PATH. Restart your terminal for changes to take effect.`
|
|
52
|
-
: result.stderr
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Removes a directory from the user PATH
|
|
58
|
-
* @param {string} directory - The directory to remove from PATH
|
|
59
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
60
|
-
*/
|
|
61
|
-
async function removeFromPath(directory) {
|
|
62
|
-
const normalizedDir = path.resolve(directory);
|
|
63
|
-
|
|
64
|
-
// Use PowerShell to modify user PATH
|
|
65
|
-
const command = `
|
|
66
|
-
$currentPath = [Environment]::GetEnvironmentVariable('Path', 'User')
|
|
67
|
-
$paths = $currentPath -split ';' | Where-Object { $_.Trim() -ne '' -and [System.IO.Path]::GetFullPath($_).ToLower() -ne '${normalizedDir.toLowerCase().replace(/\\/g, '\\\\')}' }
|
|
68
|
-
$newPath = $paths -join ';'
|
|
69
|
-
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
|
70
|
-
`.replace(/\n/g, ' ');
|
|
71
|
-
|
|
72
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
73
|
-
return {
|
|
74
|
-
success: result.code === 0,
|
|
75
|
-
output: result.code === 0
|
|
76
|
-
? `Removed ${normalizedDir} from user PATH. Restart your terminal for changes to take effect.`
|
|
77
|
-
: result.stderr
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Gets an environment variable value
|
|
83
|
-
* @param {string} varName - The variable name
|
|
84
|
-
* @param {'User'|'Machine'|'Process'} [scope='Process'] - The scope to check
|
|
85
|
-
* @returns {Promise<string|null>}
|
|
86
|
-
*/
|
|
87
|
-
async function get(varName, scope = 'Process') {
|
|
88
|
-
if (scope === 'Process') {
|
|
89
|
-
return process.env[varName] || null;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const command = `[Environment]::GetEnvironmentVariable('${varName}', '${scope}')`;
|
|
93
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
94
|
-
|
|
95
|
-
if (result.code === 0 && result.stdout.trim()) {
|
|
96
|
-
return result.stdout.trim();
|
|
97
|
-
}
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Sets a user environment variable
|
|
103
|
-
* @param {string} varName - The variable name
|
|
104
|
-
* @param {string} value - The value to set
|
|
105
|
-
* @param {'User'|'Machine'} [scope='User'] - The scope (Machine requires admin)
|
|
106
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
107
|
-
*/
|
|
108
|
-
async function set(varName, value, scope = 'User') {
|
|
109
|
-
const command = `[Environment]::SetEnvironmentVariable('${varName}', '${value}', '${scope}')`;
|
|
110
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
success: result.code === 0,
|
|
114
|
-
output: result.code === 0
|
|
115
|
-
? `Set ${varName}=${value} in ${scope} scope. Restart your terminal for changes to take effect.`
|
|
116
|
-
: result.stderr
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Removes a user environment variable
|
|
122
|
-
* @param {string} varName - The variable name
|
|
123
|
-
* @param {'User'|'Machine'} [scope='User'] - The scope
|
|
124
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
125
|
-
*/
|
|
126
|
-
async function remove(varName, scope = 'User') {
|
|
127
|
-
const command = `[Environment]::SetEnvironmentVariable('${varName}', $null, '${scope}')`;
|
|
128
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
129
|
-
|
|
130
|
-
return {
|
|
131
|
-
success: result.code === 0,
|
|
132
|
-
output: result.code === 0
|
|
133
|
-
? `Removed ${varName} from ${scope} scope. Restart your terminal for changes to take effect.`
|
|
134
|
-
: result.stderr
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Gets all user environment variables
|
|
140
|
-
* @returns {Promise<Object<string, string>>}
|
|
141
|
-
*/
|
|
142
|
-
async function getUserVariables() {
|
|
143
|
-
const command = '[Environment]::GetEnvironmentVariables("User") | ConvertTo-Json';
|
|
144
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
145
|
-
|
|
146
|
-
if (result.code === 0 && result.stdout.trim()) {
|
|
147
|
-
try {
|
|
148
|
-
return JSON.parse(result.stdout);
|
|
149
|
-
} catch {
|
|
150
|
-
return {};
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return {};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Gets all machine (system) environment variables
|
|
158
|
-
* @returns {Promise<Object<string, string>>}
|
|
159
|
-
*/
|
|
160
|
-
async function getMachineVariables() {
|
|
161
|
-
const command = '[Environment]::GetEnvironmentVariables("Machine") | ConvertTo-Json';
|
|
162
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
163
|
-
|
|
164
|
-
if (result.code === 0 && result.stdout.trim()) {
|
|
165
|
-
try {
|
|
166
|
-
return JSON.parse(result.stdout);
|
|
167
|
-
} catch {
|
|
168
|
-
return {};
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return {};
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Expands environment variables in a string
|
|
176
|
-
* @param {string} str - The string containing variables like %VAR%
|
|
177
|
-
* @returns {string}
|
|
178
|
-
*/
|
|
179
|
-
function expand(str) {
|
|
180
|
-
return str.replace(/%([^%]+)%/g, (_, varName) => {
|
|
181
|
-
return process.env[varName] || `%${varName}%`;
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Broadcasts a WM_SETTINGCHANGE message to notify other applications
|
|
187
|
-
* of environment variable changes
|
|
188
|
-
* @returns {Promise<{ success: boolean, output: string }>}
|
|
189
|
-
*/
|
|
190
|
-
async function broadcastChange() {
|
|
191
|
-
const command = `
|
|
192
|
-
Add-Type -TypeDefinition @"
|
|
193
|
-
using System;
|
|
194
|
-
using System.Runtime.InteropServices;
|
|
195
|
-
public class Win32 {
|
|
196
|
-
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
|
197
|
-
public static extern IntPtr SendMessageTimeout(
|
|
198
|
-
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
|
|
199
|
-
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
|
|
200
|
-
}
|
|
201
|
-
"@
|
|
202
|
-
$HWND_BROADCAST = [IntPtr]0xffff
|
|
203
|
-
$WM_SETTINGCHANGE = 0x1a
|
|
204
|
-
$result = [UIntPtr]::Zero
|
|
205
|
-
[Win32]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref]$result)
|
|
206
|
-
`.replace(/\n/g, ' ');
|
|
207
|
-
|
|
208
|
-
const result = await shell.exec(`powershell -NoProfile -Command "${command}"`);
|
|
209
|
-
return {
|
|
210
|
-
success: result.code === 0,
|
|
211
|
-
output: result.code === 0
|
|
212
|
-
? 'Broadcasted environment change notification'
|
|
213
|
-
: result.stderr
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Refreshes the current process's environment from the registry
|
|
219
|
-
* Note: This only affects the current Node.js process
|
|
220
|
-
* @returns {Promise<void>}
|
|
221
|
-
*/
|
|
222
|
-
async function refresh() {
|
|
223
|
-
// Get updated PATH from both User and Machine scopes
|
|
224
|
-
const userPath = await get('Path', 'User');
|
|
225
|
-
const machinePath = await get('Path', 'Machine');
|
|
226
|
-
|
|
227
|
-
if (userPath || machinePath) {
|
|
228
|
-
const combined = [machinePath, userPath].filter(Boolean).join(';');
|
|
229
|
-
process.env.PATH = combined;
|
|
230
|
-
process.env.Path = combined;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
module.exports = {
|
|
235
|
-
getPath,
|
|
236
|
-
addToPath,
|
|
237
|
-
removeFromPath,
|
|
238
|
-
get,
|
|
239
|
-
set,
|
|
240
|
-
remove,
|
|
241
|
-
getUserVariables,
|
|
242
|
-
getMachineVariables,
|
|
243
|
-
expand,
|
|
244
|
-
broadcastChange,
|
|
245
|
-
refresh
|
|
246
|
-
};
|