@fredlackey/devutils 0.0.18 → 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 -1028
- 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 -261
- 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,185 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Network Connectivity Utilities
|
|
5
|
-
*
|
|
6
|
-
* Platform-agnostic utilities for checking network connectivity.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const dns = require('dns');
|
|
10
|
-
const https = require('https');
|
|
11
|
-
const http = require('http');
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Checks if the machine has internet connectivity
|
|
15
|
-
* @param {number} [timeout=5000] - Timeout in milliseconds
|
|
16
|
-
* @returns {Promise<boolean>}
|
|
17
|
-
*/
|
|
18
|
-
async function isOnline(timeout = 5000) {
|
|
19
|
-
// Try multiple reliable hosts in case one is blocked
|
|
20
|
-
const hosts = [
|
|
21
|
-
'dns.google',
|
|
22
|
-
'cloudflare.com',
|
|
23
|
-
'1.1.1.1'
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
for (const host of hosts) {
|
|
27
|
-
const reachable = await canReach(host, timeout);
|
|
28
|
-
if (reachable) {
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Tests if a specific hostname is reachable
|
|
38
|
-
* @param {string} hostname - The hostname to check
|
|
39
|
-
* @param {number} [timeout=5000] - Timeout in milliseconds
|
|
40
|
-
* @returns {Promise<boolean>}
|
|
41
|
-
*/
|
|
42
|
-
async function canReach(hostname, timeout = 5000) {
|
|
43
|
-
return new Promise((resolve) => {
|
|
44
|
-
// First try DNS lookup
|
|
45
|
-
const timer = setTimeout(() => {
|
|
46
|
-
resolve(false);
|
|
47
|
-
}, timeout);
|
|
48
|
-
|
|
49
|
-
dns.lookup(hostname, (err) => {
|
|
50
|
-
clearTimeout(timer);
|
|
51
|
-
if (err) {
|
|
52
|
-
resolve(false);
|
|
53
|
-
} else {
|
|
54
|
-
resolve(true);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Tests if a URL is reachable via HTTP(S) request
|
|
62
|
-
* @param {string} url - The URL to check
|
|
63
|
-
* @param {number} [timeout=5000] - Timeout in milliseconds
|
|
64
|
-
* @returns {Promise<boolean>}
|
|
65
|
-
*/
|
|
66
|
-
async function canFetch(url, timeout = 5000) {
|
|
67
|
-
return new Promise((resolve) => {
|
|
68
|
-
const timer = setTimeout(() => {
|
|
69
|
-
resolve(false);
|
|
70
|
-
}, timeout);
|
|
71
|
-
|
|
72
|
-
const protocol = url.startsWith('https') ? https : http;
|
|
73
|
-
|
|
74
|
-
const req = protocol.get(url, { timeout }, (res) => {
|
|
75
|
-
clearTimeout(timer);
|
|
76
|
-
// Consider 2xx and 3xx as success
|
|
77
|
-
resolve(res.statusCode >= 200 && res.statusCode < 400);
|
|
78
|
-
res.destroy();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
req.on('error', () => {
|
|
82
|
-
clearTimeout(timer);
|
|
83
|
-
resolve(false);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
req.on('timeout', () => {
|
|
87
|
-
clearTimeout(timer);
|
|
88
|
-
req.destroy();
|
|
89
|
-
resolve(false);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Gets the public IP address of the machine
|
|
96
|
-
* @param {number} [timeout=5000] - Timeout in milliseconds
|
|
97
|
-
* @returns {Promise<string|null>}
|
|
98
|
-
*/
|
|
99
|
-
async function getPublicIP(timeout = 5000) {
|
|
100
|
-
const services = [
|
|
101
|
-
'https://api.ipify.org',
|
|
102
|
-
'https://icanhazip.com',
|
|
103
|
-
'https://ifconfig.me/ip'
|
|
104
|
-
];
|
|
105
|
-
|
|
106
|
-
for (const service of services) {
|
|
107
|
-
try {
|
|
108
|
-
const ip = await fetchText(service, timeout);
|
|
109
|
-
if (ip && isValidIP(ip.trim())) {
|
|
110
|
-
return ip.trim();
|
|
111
|
-
}
|
|
112
|
-
} catch {
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Fetches text content from a URL
|
|
122
|
-
* @param {string} url - The URL to fetch
|
|
123
|
-
* @param {number} [timeout=5000] - Timeout in milliseconds
|
|
124
|
-
* @returns {Promise<string>}
|
|
125
|
-
*/
|
|
126
|
-
async function fetchText(url, timeout = 5000) {
|
|
127
|
-
return new Promise((resolve, reject) => {
|
|
128
|
-
const timer = setTimeout(() => {
|
|
129
|
-
reject(new Error('Timeout'));
|
|
130
|
-
}, timeout);
|
|
131
|
-
|
|
132
|
-
const protocol = url.startsWith('https') ? https : http;
|
|
133
|
-
|
|
134
|
-
const req = protocol.get(url, { timeout }, (res) => {
|
|
135
|
-
let data = '';
|
|
136
|
-
res.on('data', (chunk) => {
|
|
137
|
-
data += chunk;
|
|
138
|
-
});
|
|
139
|
-
res.on('end', () => {
|
|
140
|
-
clearTimeout(timer);
|
|
141
|
-
resolve(data);
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
req.on('error', (err) => {
|
|
146
|
-
clearTimeout(timer);
|
|
147
|
-
reject(err);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
req.on('timeout', () => {
|
|
151
|
-
clearTimeout(timer);
|
|
152
|
-
req.destroy();
|
|
153
|
-
reject(new Error('Timeout'));
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Validates an IP address format
|
|
160
|
-
* @param {string} ip - The IP to validate
|
|
161
|
-
* @returns {boolean}
|
|
162
|
-
*/
|
|
163
|
-
function isValidIP(ip) {
|
|
164
|
-
// IPv4 regex
|
|
165
|
-
const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
166
|
-
// IPv6 regex (simplified)
|
|
167
|
-
const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;
|
|
168
|
-
|
|
169
|
-
if (ipv4Regex.test(ip)) {
|
|
170
|
-
const parts = ip.split('.');
|
|
171
|
-
return parts.every((part) => {
|
|
172
|
-
const num = parseInt(part, 10);
|
|
173
|
-
return num >= 0 && num <= 255;
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return ipv6Regex.test(ip);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
module.exports = {
|
|
181
|
-
isOnline,
|
|
182
|
-
canReach,
|
|
183
|
-
canFetch,
|
|
184
|
-
getPublicIP
|
|
185
|
-
};
|
package/src/utils/common/os.js
DELETED
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Operating System Detection Utilities
|
|
5
|
-
*
|
|
6
|
-
* Platform-agnostic utilities for detecting the current operating system,
|
|
7
|
-
* architecture, and distribution. Uses Node.js APIs that work identically
|
|
8
|
-
* on all platforms.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const os = require('os');
|
|
12
|
-
const fs = require('fs');
|
|
13
|
-
const path = require('path');
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Detects the current operating system and returns platform details
|
|
17
|
-
* @returns {{ type: string, packageManager: string|null, distro: string|null }}
|
|
18
|
-
*/
|
|
19
|
-
function detect() {
|
|
20
|
-
const platform = process.platform;
|
|
21
|
-
const result = {
|
|
22
|
-
type: 'unknown',
|
|
23
|
-
packageManager: null,
|
|
24
|
-
distro: null
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
if (platform === 'darwin') {
|
|
28
|
-
result.type = 'macos';
|
|
29
|
-
result.packageManager = 'brew';
|
|
30
|
-
result.distro = 'macos';
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (platform === 'win32') {
|
|
35
|
-
// Check for WSL
|
|
36
|
-
if (process.env.WSL_DISTRO_NAME) {
|
|
37
|
-
result.type = 'wsl';
|
|
38
|
-
result.packageManager = 'apt';
|
|
39
|
-
result.distro = process.env.WSL_DISTRO_NAME.toLowerCase();
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
result.type = 'windows';
|
|
43
|
-
result.packageManager = 'winget';
|
|
44
|
-
result.distro = 'windows';
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (platform === 'linux') {
|
|
49
|
-
// Check for WSL first
|
|
50
|
-
if (process.env.WSL_DISTRO_NAME) {
|
|
51
|
-
result.type = 'wsl';
|
|
52
|
-
result.packageManager = 'apt';
|
|
53
|
-
result.distro = process.env.WSL_DISTRO_NAME.toLowerCase();
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Try to detect Linux distribution
|
|
58
|
-
const distro = getDistro();
|
|
59
|
-
result.distro = distro;
|
|
60
|
-
|
|
61
|
-
// Debian-based (Ubuntu, Debian, Raspberry Pi OS)
|
|
62
|
-
if (fs.existsSync('/etc/debian_version')) {
|
|
63
|
-
if (distro === 'raspbian' || distro === 'raspberry') {
|
|
64
|
-
result.type = 'raspbian';
|
|
65
|
-
} else if (distro === 'ubuntu') {
|
|
66
|
-
result.type = 'ubuntu';
|
|
67
|
-
} else {
|
|
68
|
-
result.type = 'debian';
|
|
69
|
-
}
|
|
70
|
-
result.packageManager = 'apt';
|
|
71
|
-
return result;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// RHEL-based (Amazon Linux, CentOS, Fedora, RHEL)
|
|
75
|
-
// Check for /etc/redhat-release OR /etc/system-release (Amazon Linux 2023 uses system-release)
|
|
76
|
-
if (fs.existsSync('/etc/redhat-release') || fs.existsSync('/etc/system-release')) {
|
|
77
|
-
if (distro === 'amzn' || distro === 'amazon') {
|
|
78
|
-
result.type = 'amazon_linux';
|
|
79
|
-
} else if (distro === 'fedora') {
|
|
80
|
-
result.type = 'fedora';
|
|
81
|
-
} else {
|
|
82
|
-
result.type = 'rhel';
|
|
83
|
-
}
|
|
84
|
-
// Use dnf if available, otherwise yum
|
|
85
|
-
result.packageManager = fs.existsSync('/usr/bin/dnf') ? 'dnf' : 'yum';
|
|
86
|
-
return result;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Fallback for unknown Linux
|
|
90
|
-
result.type = 'linux';
|
|
91
|
-
return result;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return result;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Checks if running on Windows (native, not WSL)
|
|
99
|
-
* @returns {boolean}
|
|
100
|
-
*/
|
|
101
|
-
function isWindows() {
|
|
102
|
-
return process.platform === 'win32' && !process.env.WSL_DISTRO_NAME;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Checks if running on macOS
|
|
107
|
-
* @returns {boolean}
|
|
108
|
-
*/
|
|
109
|
-
function isMacOS() {
|
|
110
|
-
return process.platform === 'darwin';
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Checks if running on any Linux distribution
|
|
115
|
-
* @returns {boolean}
|
|
116
|
-
*/
|
|
117
|
-
function isLinux() {
|
|
118
|
-
return process.platform === 'linux';
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Checks if running inside Windows Subsystem for Linux
|
|
123
|
-
* @returns {boolean}
|
|
124
|
-
*/
|
|
125
|
-
function isWSL() {
|
|
126
|
-
return !!process.env.WSL_DISTRO_NAME;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Returns the CPU architecture
|
|
131
|
-
* @returns {string} - 'x64', 'arm64', 'ia32', etc.
|
|
132
|
-
*/
|
|
133
|
-
function getArch() {
|
|
134
|
-
return process.arch;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* For Linux, returns the specific distribution name
|
|
139
|
-
* @returns {string|null} - Distribution name (ubuntu, debian, fedora, etc.) or null
|
|
140
|
-
*/
|
|
141
|
-
function getDistro() {
|
|
142
|
-
if (process.platform !== 'linux') {
|
|
143
|
-
return null;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Try /etc/os-release first (most modern Linux distros)
|
|
147
|
-
const osReleasePath = '/etc/os-release';
|
|
148
|
-
if (fs.existsSync(osReleasePath)) {
|
|
149
|
-
try {
|
|
150
|
-
const content = fs.readFileSync(osReleasePath, 'utf8');
|
|
151
|
-
const idMatch = content.match(/^ID=["']?([^"'\n]+)["']?/m);
|
|
152
|
-
if (idMatch) {
|
|
153
|
-
return idMatch[1].toLowerCase();
|
|
154
|
-
}
|
|
155
|
-
} catch (err) {
|
|
156
|
-
// Fall through to other methods
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Try /etc/lsb-release (Ubuntu and some others)
|
|
161
|
-
const lsbReleasePath = '/etc/lsb-release';
|
|
162
|
-
if (fs.existsSync(lsbReleasePath)) {
|
|
163
|
-
try {
|
|
164
|
-
const content = fs.readFileSync(lsbReleasePath, 'utf8');
|
|
165
|
-
const idMatch = content.match(/^DISTRIB_ID=["']?([^"'\n]+)["']?/m);
|
|
166
|
-
if (idMatch) {
|
|
167
|
-
return idMatch[1].toLowerCase();
|
|
168
|
-
}
|
|
169
|
-
} catch (err) {
|
|
170
|
-
// Fall through
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Returns the home directory path
|
|
179
|
-
* @returns {string}
|
|
180
|
-
*/
|
|
181
|
-
function getHomeDir() {
|
|
182
|
-
return os.homedir();
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Returns the temporary directory path
|
|
187
|
-
* @returns {string}
|
|
188
|
-
*/
|
|
189
|
-
function getTempDir() {
|
|
190
|
-
return os.tmpdir();
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Checks if a graphical desktop environment is available on the current system.
|
|
195
|
-
*
|
|
196
|
-
* This function determines whether GUI applications can be displayed:
|
|
197
|
-
* - macOS: Always returns true (Aqua/Quartz desktop is always available)
|
|
198
|
-
* - Windows (native): Always returns true (Windows Desktop is always available)
|
|
199
|
-
* - Git Bash: Always returns true (runs on Windows which has a desktop)
|
|
200
|
-
* - Linux: Checks for X11, Wayland, or installed desktop environment packages
|
|
201
|
-
* - WSL: Checks for WSLg or X server availability via DISPLAY/WAYLAND_DISPLAY
|
|
202
|
-
*
|
|
203
|
-
* Use this function before installing GUI applications to ensure the system
|
|
204
|
-
* can actually display them. Headless servers and containers typically
|
|
205
|
-
* return false.
|
|
206
|
-
*
|
|
207
|
-
* @returns {boolean} True if a desktop environment is available, false otherwise
|
|
208
|
-
*
|
|
209
|
-
* @example
|
|
210
|
-
* const os = require('../utils/common/os');
|
|
211
|
-
* if (!os.isDesktopAvailable()) {
|
|
212
|
-
* console.log('This tool requires a desktop environment.');
|
|
213
|
-
* return;
|
|
214
|
-
* }
|
|
215
|
-
*/
|
|
216
|
-
function isDesktopAvailable() {
|
|
217
|
-
const platform = detect();
|
|
218
|
-
|
|
219
|
-
// macOS always has a desktop environment (Aqua/Quartz)
|
|
220
|
-
if (platform.type === 'macos') {
|
|
221
|
-
return true;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Windows (native) always has a desktop environment
|
|
225
|
-
if (platform.type === 'windows') {
|
|
226
|
-
return true;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Git Bash runs on Windows, which has a desktop
|
|
230
|
-
if (platform.type === 'gitbash') {
|
|
231
|
-
return true;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// For Linux-based systems (including WSL), check for display availability
|
|
235
|
-
// This covers ubuntu, debian, raspbian, amazon_linux, rhel, fedora, wsl
|
|
236
|
-
if (platform.type === 'wsl' ||
|
|
237
|
-
platform.type === 'ubuntu' ||
|
|
238
|
-
platform.type === 'debian' ||
|
|
239
|
-
platform.type === 'raspbian' ||
|
|
240
|
-
platform.type === 'amazon_linux' ||
|
|
241
|
-
platform.type === 'rhel' ||
|
|
242
|
-
platform.type === 'fedora' ||
|
|
243
|
-
platform.type === 'linux') {
|
|
244
|
-
|
|
245
|
-
// Check for Wayland display (modern Linux desktops)
|
|
246
|
-
if (process.env.WAYLAND_DISPLAY) {
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Check for X11 display
|
|
251
|
-
if (process.env.DISPLAY) {
|
|
252
|
-
return true;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Check XDG session type (set by display managers)
|
|
256
|
-
const sessionType = process.env.XDG_SESSION_TYPE;
|
|
257
|
-
if (sessionType === 'x11' || sessionType === 'wayland') {
|
|
258
|
-
return true;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Check for desktop environment indicators
|
|
262
|
-
if (process.env.XDG_CURRENT_DESKTOP || process.env.DESKTOP_SESSION) {
|
|
263
|
-
return true;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// For WSL specifically, check for WSLg availability
|
|
267
|
-
// WSLg sets WAYLAND_DISPLAY or DISPLAY when available
|
|
268
|
-
if (platform.type === 'wsl') {
|
|
269
|
-
// WSLg creates /mnt/wslg directory when GUI support is available
|
|
270
|
-
if (fs.existsSync('/mnt/wslg')) {
|
|
271
|
-
return true;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// No desktop environment detected
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Unknown platform - assume no desktop available
|
|
280
|
-
return false;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
module.exports = {
|
|
284
|
-
detect,
|
|
285
|
-
isWindows,
|
|
286
|
-
isMacOS,
|
|
287
|
-
isLinux,
|
|
288
|
-
isWSL,
|
|
289
|
-
getArch,
|
|
290
|
-
getDistro,
|
|
291
|
-
getHomeDir,
|
|
292
|
-
getTempDir,
|
|
293
|
-
isDesktopAvailable
|
|
294
|
-
};
|