@fredlackey/devutils 0.0.1 → 0.0.3
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 +5 -5
- package/package.json +1 -1
- package/src/commands/install.js +374 -36
- package/src/installs/adobe-creative-cloud.js +527 -25
- package/src/installs/adobe-creative-cloud.md +605 -0
- package/src/installs/appcleaner.js +303 -26
- package/src/installs/appcleaner.md +699 -0
- package/src/installs/apt-transport-https.js +390 -0
- package/src/installs/apt-transport-https.md +678 -0
- package/src/installs/atomicparsley.js +624 -26
- package/src/installs/atomicparsley.md +795 -0
- package/src/installs/aws-cli.js +779 -26
- package/src/installs/aws-cli.md +727 -0
- package/src/installs/balena-etcher.js +688 -26
- package/src/installs/balena-etcher.md +761 -0
- package/src/installs/bambu-studio.js +912 -26
- package/src/installs/bambu-studio.md +780 -0
- package/src/installs/bash-completion.js +554 -23
- package/src/installs/bash-completion.md +833 -0
- package/src/installs/bash.js +399 -26
- package/src/installs/bash.md +993 -0
- package/src/installs/beyond-compare.js +585 -26
- package/src/installs/beyond-compare.md +813 -0
- package/src/installs/build-essential.js +511 -26
- package/src/installs/build-essential.md +977 -0
- package/src/installs/ca-certificates.js +618 -0
- package/src/installs/ca-certificates.md +937 -0
- package/src/installs/caffeine.js +490 -26
- package/src/installs/caffeine.md +839 -0
- package/src/installs/camtasia.js +577 -25
- package/src/installs/camtasia.md +762 -0
- package/src/installs/chatgpt.js +458 -26
- package/src/installs/chatgpt.md +814 -0
- package/src/installs/chocolatey.js +447 -0
- package/src/installs/chocolatey.md +661 -0
- package/src/installs/chrome-canary.js +472 -26
- package/src/installs/chrome-canary.md +641 -0
- package/src/installs/chromium.js +645 -26
- package/src/installs/chromium.md +838 -0
- package/src/installs/claude-code.js +558 -26
- package/src/installs/claude-code.md +1173 -0
- package/src/installs/curl.js +361 -26
- package/src/installs/curl.md +714 -0
- package/src/installs/cursor.js +561 -26
- package/src/installs/cursor.md +970 -0
- package/src/installs/dbschema.js +674 -26
- package/src/installs/dbschema.md +925 -0
- package/src/installs/dependencies.md +435 -0
- package/src/installs/development-tools.js +600 -0
- package/src/installs/development-tools.md +977 -0
- package/src/installs/docker.js +1010 -25
- package/src/installs/docker.md +1109 -0
- package/src/installs/drawio.js +1001 -26
- package/src/installs/drawio.md +795 -0
- package/src/installs/elmedia-player.js +328 -25
- package/src/installs/elmedia-player.md +556 -0
- package/src/installs/ffmpeg.js +870 -25
- package/src/installs/ffmpeg.md +852 -0
- package/src/installs/file.js +464 -0
- package/src/installs/file.md +987 -0
- package/src/installs/gemini-cli.js +793 -26
- package/src/installs/gemini-cli.md +1153 -0
- package/src/installs/git.js +382 -26
- package/src/installs/git.md +907 -0
- package/src/installs/gitego.js +931 -26
- package/src/installs/gitego.md +1172 -0
- package/src/installs/go.js +913 -26
- package/src/installs/go.md +958 -0
- package/src/installs/google-chrome.js +801 -25
- package/src/installs/google-chrome.md +862 -0
- package/src/installs/gpg.js +412 -73
- package/src/installs/gpg.md +1056 -0
- package/src/installs/homebrew.js +1015 -26
- package/src/installs/homebrew.md +988 -0
- package/src/installs/imageoptim.js +950 -26
- package/src/installs/imageoptim.md +1119 -0
- package/src/installs/installers.json +2297 -0
- package/src/installs/jq.js +382 -26
- package/src/installs/jq.md +809 -0
- package/src/installs/keyboard-maestro.js +701 -26
- package/src/installs/keyboard-maestro.md +825 -0
- package/src/installs/latex.js +771 -26
- package/src/installs/latex.md +1095 -0
- package/src/installs/lftp.js +338 -26
- package/src/installs/lftp.md +907 -0
- package/src/installs/lsb-release.js +346 -0
- package/src/installs/lsb-release.md +814 -0
- package/src/installs/messenger.js +829 -26
- package/src/installs/messenger.md +900 -0
- package/src/installs/microsoft-office.js +550 -26
- package/src/installs/microsoft-office.md +760 -0
- package/src/installs/microsoft-teams.js +782 -25
- package/src/installs/microsoft-teams.md +886 -0
- package/src/installs/node.js +886 -26
- package/src/installs/node.md +1153 -0
- package/src/installs/nordpass.js +698 -26
- package/src/installs/nordpass.md +921 -0
- package/src/installs/nvm.js +977 -26
- package/src/installs/nvm.md +1057 -0
- package/src/installs/openssh.js +734 -64
- package/src/installs/openssh.md +1056 -0
- package/src/installs/pandoc.js +644 -26
- package/src/installs/pandoc.md +1036 -0
- package/src/installs/pinentry.js +492 -26
- package/src/installs/pinentry.md +1142 -0
- package/src/installs/pngyu.js +851 -26
- package/src/installs/pngyu.md +896 -0
- package/src/installs/postman.js +781 -26
- package/src/installs/postman.md +940 -0
- package/src/installs/procps.js +425 -0
- package/src/installs/procps.md +851 -0
- package/src/installs/safari-tech-preview.js +355 -25
- package/src/installs/safari-tech-preview.md +533 -0
- package/src/installs/sfnt2woff.js +640 -26
- package/src/installs/sfnt2woff.md +795 -0
- package/src/installs/shellcheck.js +463 -26
- package/src/installs/shellcheck.md +1005 -0
- package/src/installs/slack.js +722 -25
- package/src/installs/slack.md +865 -0
- package/src/installs/snagit.js +566 -25
- package/src/installs/snagit.md +844 -0
- package/src/installs/software-properties-common.js +372 -0
- package/src/installs/software-properties-common.md +805 -0
- package/src/installs/spotify.js +858 -25
- package/src/installs/spotify.md +901 -0
- package/src/installs/studio-3t.js +803 -26
- package/src/installs/studio-3t.md +918 -0
- package/src/installs/sublime-text.js +780 -25
- package/src/installs/sublime-text.md +914 -0
- package/src/installs/superwhisper.js +687 -25
- package/src/installs/superwhisper.md +630 -0
- package/src/installs/tailscale.js +727 -26
- package/src/installs/tailscale.md +1100 -0
- package/src/installs/tar.js +389 -0
- package/src/installs/tar.md +946 -0
- package/src/installs/termius.js +780 -26
- package/src/installs/termius.md +844 -0
- package/src/installs/terraform.js +761 -26
- package/src/installs/terraform.md +899 -0
- package/src/installs/tidal.js +752 -25
- package/src/installs/tidal.md +864 -0
- package/src/installs/tmux.js +328 -26
- package/src/installs/tmux.md +1030 -0
- package/src/installs/tree.js +393 -26
- package/src/installs/tree.md +833 -0
- package/src/installs/unzip.js +460 -0
- package/src/installs/unzip.md +879 -0
- package/src/installs/vim.js +403 -26
- package/src/installs/vim.md +1040 -0
- package/src/installs/vlc.js +803 -26
- package/src/installs/vlc.md +927 -0
- package/src/installs/vscode.js +825 -26
- package/src/installs/vscode.md +1002 -0
- package/src/installs/wget.js +415 -0
- package/src/installs/wget.md +791 -0
- package/src/installs/whatsapp.js +710 -25
- package/src/installs/whatsapp.md +854 -0
- package/src/installs/winpty.js +352 -0
- package/src/installs/winpty.md +620 -0
- package/src/installs/woff2.js +535 -26
- package/src/installs/woff2.md +977 -0
- package/src/installs/wsl.js +572 -0
- package/src/installs/wsl.md +699 -0
- package/src/installs/xcode-clt.js +520 -0
- package/src/installs/xcode-clt.md +351 -0
- package/src/installs/xcode.js +542 -26
- package/src/installs/xcode.md +573 -0
- package/src/installs/yarn.js +806 -26
- package/src/installs/yarn.md +1074 -0
- package/src/installs/yq.js +636 -26
- package/src/installs/yq.md +944 -0
- package/src/installs/yt-dlp.js +683 -26
- package/src/installs/yt-dlp.md +946 -0
- package/src/installs/yum-utils.js +297 -0
- package/src/installs/yum-utils.md +648 -0
- package/src/installs/zoom.js +740 -25
- package/src/installs/zoom.md +884 -0
- package/src/scripts/README.md +567 -45
- package/src/scripts/STATUS.md +208 -0
- package/src/scripts/afk.js +395 -7
- package/src/scripts/backup-all.js +731 -9
- package/src/scripts/backup-source.js +711 -8
- package/src/scripts/brewd.js +373 -7
- package/src/scripts/brewi.js +505 -9
- package/src/scripts/brewr.js +512 -9
- package/src/scripts/brews.js +462 -9
- package/src/scripts/brewu.js +488 -7
- package/src/scripts/c.js +185 -7
- package/src/scripts/ccurl.js +325 -8
- package/src/scripts/certbot-crontab-init.js +488 -8
- package/src/scripts/certbot-init.js +641 -9
- package/src/scripts/ch.js +339 -7
- package/src/scripts/claude-danger.js +253 -8
- package/src/scripts/clean-dev.js +419 -8
- package/src/scripts/clear-dns-cache.js +525 -7
- package/src/scripts/clone.js +417 -7
- package/src/scripts/code-all.js +420 -7
- package/src/scripts/count-files.js +195 -8
- package/src/scripts/count-folders.js +195 -8
- package/src/scripts/count.js +248 -8
- package/src/scripts/d.js +203 -7
- package/src/scripts/datauri.js +373 -8
- package/src/scripts/delete-files.js +363 -7
- package/src/scripts/docker-clean.js +410 -8
- package/src/scripts/dp.js +426 -7
- package/src/scripts/e.js +375 -9
- package/src/scripts/empty-trash.js +497 -7
- package/src/scripts/evm.js +428 -9
- package/src/scripts/fetch-github-repos.js +441 -10
- package/src/scripts/get-channel.js +329 -8
- package/src/scripts/get-course.js +384 -11
- package/src/scripts/get-dependencies.js +290 -9
- package/src/scripts/get-folder.js +783 -10
- package/src/scripts/get-tunes.js +411 -10
- package/src/scripts/get-video.js +352 -9
- package/src/scripts/git-backup.js +561 -9
- package/src/scripts/git-clone.js +477 -9
- package/src/scripts/git-pup.js +303 -7
- package/src/scripts/git-push.js +380 -8
- package/src/scripts/h.js +607 -9
- package/src/scripts/hide-desktop-icons.js +483 -7
- package/src/scripts/hide-hidden-files.js +522 -7
- package/src/scripts/install-dependencies-from.js +440 -9
- package/src/scripts/ips.js +647 -10
- package/src/scripts/iso.js +354 -8
- package/src/scripts/killni.js +561 -7
- package/src/scripts/ll.js +451 -8
- package/src/scripts/local-ip.js +310 -8
- package/src/scripts/m.js +508 -8
- package/src/scripts/map.js +293 -8
- package/src/scripts/mkd.js +287 -7
- package/src/scripts/ncu-update-all.js +441 -8
- package/src/scripts/nginx-init.js +702 -12
- package/src/scripts/npmi.js +366 -7
- package/src/scripts/o.js +495 -8
- package/src/scripts/org-by-date.js +321 -7
- package/src/scripts/p.js +208 -7
- package/src/scripts/packages.js +313 -8
- package/src/scripts/path.js +209 -7
- package/src/scripts/ports.js +582 -8
- package/src/scripts/q.js +290 -8
- package/src/scripts/refresh-files.js +378 -10
- package/src/scripts/remove-smaller-files.js +500 -8
- package/src/scripts/rename-files-with-date.js +517 -9
- package/src/scripts/resize-image.js +523 -9
- package/src/scripts/rm-safe.js +653 -8
- package/src/scripts/s.js +525 -9
- package/src/scripts/set-git-public.js +349 -7
- package/src/scripts/show-desktop-icons.js +459 -7
- package/src/scripts/show-hidden-files.js +456 -7
- package/src/scripts/tpa.js +265 -8
- package/src/scripts/tpo.js +264 -7
- package/src/scripts/u.js +489 -7
- package/src/scripts/vpush.js +422 -8
- package/src/scripts/y.js +267 -7
- package/src/utils/common/os.js +94 -2
- package/src/utils/ubuntu/apt.js +13 -7
- package/src/utils/windows/choco.js +82 -26
- package/src/utils/windows/winget.js +89 -27
package/src/scripts/code-all.js
CHANGED
|
@@ -1,24 +1,437 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* code-all - Open all subdirectories in VS Code
|
|
5
|
+
*
|
|
6
|
+
* Migrated from legacy dotfiles alias.
|
|
7
|
+
* Original: alias code-all="find . -type d -depth 1 -exec code {} \;"
|
|
8
|
+
*
|
|
9
|
+
* This script opens each immediate subdirectory of the specified directory
|
|
10
|
+
* (or current directory) as a separate VS Code window. This is useful when
|
|
11
|
+
* you have a folder containing multiple projects and want to open them all
|
|
12
|
+
* at once.
|
|
13
|
+
*
|
|
14
|
+
* Example usage:
|
|
15
|
+
* code-all # Opens all subdirs of current directory
|
|
16
|
+
* code-all ~/Source # Opens all subdirs of ~/Source
|
|
17
|
+
*
|
|
5
18
|
* @module scripts/code-all
|
|
6
19
|
*/
|
|
7
20
|
|
|
21
|
+
const os = require('../utils/common/os');
|
|
22
|
+
const fs = require('fs');
|
|
23
|
+
const path = require('path');
|
|
24
|
+
const { execSync, spawn } = require('child_process');
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Helper function to check if a command exists on the system.
|
|
28
|
+
* Used to verify VS Code CLI is available before attempting to use it.
|
|
29
|
+
*
|
|
30
|
+
* @param {string} cmd - The command name to check
|
|
31
|
+
* @returns {boolean} True if the command exists, false otherwise
|
|
32
|
+
*/
|
|
33
|
+
function isCommandAvailable(cmd) {
|
|
34
|
+
try {
|
|
35
|
+
// Use 'which' on Unix-like systems, 'where' on Windows
|
|
36
|
+
const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
|
|
37
|
+
execSync(checkCmd, { stdio: 'ignore' });
|
|
38
|
+
return true;
|
|
39
|
+
} catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Get all immediate subdirectories of a given path.
|
|
46
|
+
* Uses pure Node.js file system APIs for cross-platform compatibility.
|
|
47
|
+
*
|
|
48
|
+
* @param {string} targetPath - The directory to scan for subdirectories
|
|
49
|
+
* @returns {string[]} Array of absolute paths to subdirectories
|
|
50
|
+
*/
|
|
51
|
+
function getSubdirectories(targetPath) {
|
|
52
|
+
const absolutePath = path.resolve(targetPath);
|
|
53
|
+
|
|
54
|
+
// Verify the path exists and is a directory
|
|
55
|
+
if (!fs.existsSync(absolutePath)) {
|
|
56
|
+
console.error(`Error: Path does not exist: ${absolutePath}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const stats = fs.statSync(absolutePath);
|
|
61
|
+
if (!stats.isDirectory()) {
|
|
62
|
+
console.error(`Error: Path is not a directory: ${absolutePath}`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Read directory contents and filter to only directories
|
|
67
|
+
const entries = fs.readdirSync(absolutePath, { withFileTypes: true });
|
|
68
|
+
const subdirs = entries
|
|
69
|
+
.filter(entry => entry.isDirectory())
|
|
70
|
+
.filter(entry => !entry.name.startsWith('.')) // Skip hidden directories
|
|
71
|
+
.map(entry => path.join(absolutePath, entry.name))
|
|
72
|
+
.sort(); // Sort alphabetically for consistent ordering
|
|
73
|
+
|
|
74
|
+
return subdirs;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Open a directory in VS Code.
|
|
79
|
+
* Uses spawn with 'detached' to allow VS Code windows to stay open after script exits.
|
|
80
|
+
*
|
|
81
|
+
* @param {string} dirPath - Absolute path to the directory to open
|
|
82
|
+
* @param {string} codeCommand - The VS Code command to use ('code', 'code-insiders', etc.)
|
|
83
|
+
* @returns {void}
|
|
84
|
+
*/
|
|
85
|
+
function openInVSCode(dirPath, codeCommand) {
|
|
86
|
+
// Spawn VS Code in detached mode so it stays open after script exits
|
|
87
|
+
// Using stdio: 'ignore' and unref() to fully detach the process
|
|
88
|
+
const child = spawn(codeCommand, [dirPath], {
|
|
89
|
+
detached: true,
|
|
90
|
+
stdio: 'ignore',
|
|
91
|
+
shell: process.platform === 'win32' // Use shell on Windows for better PATH resolution
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Unref allows the parent process to exit while VS Code stays running
|
|
95
|
+
child.unref();
|
|
96
|
+
}
|
|
97
|
+
|
|
8
98
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
99
|
+
* Pure Node.js implementation for opening subdirectories in VS Code.
|
|
100
|
+
*
|
|
101
|
+
* This function uses:
|
|
102
|
+
* - fs.readdirSync() to list directories (pure Node.js)
|
|
103
|
+
* - spawn() to launch VS Code (requires 'code' command in PATH)
|
|
104
|
+
*
|
|
105
|
+
* The 'code' command must be installed and available in PATH. On most platforms,
|
|
106
|
+
* VS Code adds this automatically during installation, but on macOS you may need
|
|
107
|
+
* to run "Shell Command: Install 'code' command in PATH" from the Command Palette.
|
|
11
108
|
*
|
|
12
109
|
* @param {string[]} args - Command line arguments
|
|
13
110
|
* @param {string} [args.0] - Optional path (defaults to current directory)
|
|
111
|
+
* @param {string} codeCommand - The VS Code command to use
|
|
112
|
+
* @returns {Promise<void>}
|
|
113
|
+
*/
|
|
114
|
+
async function do_code_all_nodejs(args, codeCommand = 'code') {
|
|
115
|
+
// Determine target directory: use provided arg or current directory
|
|
116
|
+
const targetPath = args[0] || process.cwd();
|
|
117
|
+
|
|
118
|
+
// Get all subdirectories
|
|
119
|
+
const subdirs = getSubdirectories(targetPath);
|
|
120
|
+
|
|
121
|
+
if (subdirs.length === 0) {
|
|
122
|
+
console.log(`No subdirectories found in: ${path.resolve(targetPath)}`);
|
|
123
|
+
console.log('');
|
|
124
|
+
console.log('This command opens each immediate subdirectory as a VS Code window.');
|
|
125
|
+
console.log('Make sure the target directory contains subdirectories (not just files).');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
console.log(`Opening ${subdirs.length} subdirectories in VS Code...`);
|
|
130
|
+
console.log('');
|
|
131
|
+
|
|
132
|
+
// Open each subdirectory in VS Code
|
|
133
|
+
for (const dir of subdirs) {
|
|
134
|
+
const dirName = path.basename(dir);
|
|
135
|
+
console.log(` Opening: ${dirName}`);
|
|
136
|
+
openInVSCode(dir, codeCommand);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
console.log('');
|
|
140
|
+
console.log('Done! All directories have been opened in VS Code.');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Open all subdirectories in VS Code on macOS.
|
|
145
|
+
*
|
|
146
|
+
* On macOS, VS Code installs the 'code' command via the Command Palette:
|
|
147
|
+
* "Shell Command: Install 'code' command in PATH"
|
|
148
|
+
*
|
|
149
|
+
* If VS Code is not in PATH, this function provides helpful instructions.
|
|
150
|
+
*
|
|
151
|
+
* @param {string[]} args - Command line arguments
|
|
152
|
+
* @returns {Promise<void>}
|
|
153
|
+
*/
|
|
154
|
+
async function do_code_all_macos(args) {
|
|
155
|
+
// Check for VS Code command availability
|
|
156
|
+
// Try 'code' first, then 'code-insiders' for Insiders edition
|
|
157
|
+
let codeCommand = null;
|
|
158
|
+
|
|
159
|
+
if (isCommandAvailable('code')) {
|
|
160
|
+
codeCommand = 'code';
|
|
161
|
+
} else if (isCommandAvailable('code-insiders')) {
|
|
162
|
+
codeCommand = 'code-insiders';
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (!codeCommand) {
|
|
166
|
+
console.error('Error: VS Code command not found in PATH.');
|
|
167
|
+
console.error('');
|
|
168
|
+
console.error('To fix this:');
|
|
169
|
+
console.error('1. Open VS Code');
|
|
170
|
+
console.error('2. Press Cmd+Shift+P to open Command Palette');
|
|
171
|
+
console.error('3. Type "Shell Command: Install \'code\' command in PATH"');
|
|
172
|
+
console.error('4. Press Enter');
|
|
173
|
+
console.error('');
|
|
174
|
+
console.error('Alternatively, install VS Code via Homebrew:');
|
|
175
|
+
console.error(' brew install --cask visual-studio-code');
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return do_code_all_nodejs(args, codeCommand);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Open all subdirectories in VS Code on Ubuntu.
|
|
184
|
+
*
|
|
185
|
+
* On Ubuntu, VS Code can be installed via:
|
|
186
|
+
* - Snap: sudo snap install code --classic
|
|
187
|
+
* - APT: From Microsoft's repository
|
|
188
|
+
* - DEB package: Downloaded from code.visualstudio.com
|
|
189
|
+
*
|
|
190
|
+
* @param {string[]} args - Command line arguments
|
|
14
191
|
* @returns {Promise<void>}
|
|
15
192
|
*/
|
|
16
|
-
async function
|
|
17
|
-
|
|
193
|
+
async function do_code_all_ubuntu(args) {
|
|
194
|
+
let codeCommand = null;
|
|
195
|
+
|
|
196
|
+
if (isCommandAvailable('code')) {
|
|
197
|
+
codeCommand = 'code';
|
|
198
|
+
} else if (isCommandAvailable('code-insiders')) {
|
|
199
|
+
codeCommand = 'code-insiders';
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (!codeCommand) {
|
|
203
|
+
console.error('Error: VS Code command not found in PATH.');
|
|
204
|
+
console.error('');
|
|
205
|
+
console.error('Install VS Code using one of these methods:');
|
|
206
|
+
console.error('');
|
|
207
|
+
console.error(' Via Snap (recommended):');
|
|
208
|
+
console.error(' sudo snap install code --classic');
|
|
209
|
+
console.error('');
|
|
210
|
+
console.error(' Via APT:');
|
|
211
|
+
console.error(' wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg');
|
|
212
|
+
console.error(' sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg');
|
|
213
|
+
console.error(' echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list');
|
|
214
|
+
console.error(' sudo apt update && sudo apt install code');
|
|
215
|
+
process.exit(1);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return do_code_all_nodejs(args, codeCommand);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Open all subdirectories in VS Code on Raspberry Pi OS.
|
|
223
|
+
*
|
|
224
|
+
* VS Code has ARM builds that work on Raspberry Pi 4 and newer.
|
|
225
|
+
* Installation is similar to Ubuntu/Debian.
|
|
226
|
+
*
|
|
227
|
+
* @param {string[]} args - Command line arguments
|
|
228
|
+
* @returns {Promise<void>}
|
|
229
|
+
*/
|
|
230
|
+
async function do_code_all_raspbian(args) {
|
|
231
|
+
let codeCommand = null;
|
|
232
|
+
|
|
233
|
+
if (isCommandAvailable('code')) {
|
|
234
|
+
codeCommand = 'code';
|
|
235
|
+
} else if (isCommandAvailable('code-insiders')) {
|
|
236
|
+
codeCommand = 'code-insiders';
|
|
237
|
+
} else if (isCommandAvailable('code-oss')) {
|
|
238
|
+
// Raspberry Pi OS sometimes has the open-source version
|
|
239
|
+
codeCommand = 'code-oss';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!codeCommand) {
|
|
243
|
+
console.error('Error: VS Code command not found in PATH.');
|
|
244
|
+
console.error('');
|
|
245
|
+
console.error('Install VS Code on Raspberry Pi:');
|
|
246
|
+
console.error('');
|
|
247
|
+
console.error(' Via APT (Raspberry Pi 4/5 - 64-bit):');
|
|
248
|
+
console.error(' sudo apt update');
|
|
249
|
+
console.error(' sudo apt install code');
|
|
250
|
+
console.error('');
|
|
251
|
+
console.error(' Or download from: https://code.visualstudio.com/download');
|
|
252
|
+
console.error(' (Choose the ARM64 .deb package)');
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return do_code_all_nodejs(args, codeCommand);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Open all subdirectories in VS Code on Amazon Linux.
|
|
261
|
+
*
|
|
262
|
+
* Amazon Linux is typically used for servers, but VS Code can be installed
|
|
263
|
+
* if a desktop environment is present.
|
|
264
|
+
*
|
|
265
|
+
* @param {string[]} args - Command line arguments
|
|
266
|
+
* @returns {Promise<void>}
|
|
267
|
+
*/
|
|
268
|
+
async function do_code_all_amazon_linux(args) {
|
|
269
|
+
// Check if desktop environment is available
|
|
270
|
+
const hasDesktop = os.isDesktopAvailable();
|
|
271
|
+
|
|
272
|
+
if (!hasDesktop) {
|
|
273
|
+
console.error('Error: No desktop environment detected.');
|
|
274
|
+
console.error('');
|
|
275
|
+
console.error('VS Code requires a graphical environment.');
|
|
276
|
+
console.error('Amazon Linux is typically used for servers without a desktop.');
|
|
277
|
+
console.error('');
|
|
278
|
+
console.error('Consider using VS Code Remote-SSH instead:');
|
|
279
|
+
console.error('1. Install VS Code on your local machine');
|
|
280
|
+
console.error('2. Install the "Remote - SSH" extension');
|
|
281
|
+
console.error('3. Connect to this server remotely');
|
|
282
|
+
process.exit(1);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
let codeCommand = null;
|
|
286
|
+
|
|
287
|
+
if (isCommandAvailable('code')) {
|
|
288
|
+
codeCommand = 'code';
|
|
289
|
+
} else if (isCommandAvailable('code-insiders')) {
|
|
290
|
+
codeCommand = 'code-insiders';
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (!codeCommand) {
|
|
294
|
+
console.error('Error: VS Code command not found in PATH.');
|
|
295
|
+
console.error('');
|
|
296
|
+
console.error('Download VS Code from: https://code.visualstudio.com/download');
|
|
297
|
+
console.error('Choose the RPM package for Amazon Linux.');
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return do_code_all_nodejs(args, codeCommand);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Open all subdirectories in VS Code on Windows (Command Prompt).
|
|
306
|
+
*
|
|
307
|
+
* On Windows, VS Code installer typically adds 'code' to the PATH.
|
|
308
|
+
* If not found, user may need to restart their terminal or reinstall.
|
|
309
|
+
*
|
|
310
|
+
* @param {string[]} args - Command line arguments
|
|
311
|
+
* @returns {Promise<void>}
|
|
312
|
+
*/
|
|
313
|
+
async function do_code_all_cmd(args) {
|
|
314
|
+
let codeCommand = null;
|
|
315
|
+
|
|
316
|
+
// On Windows, use 'where' to check for command availability
|
|
317
|
+
if (isCommandAvailable('code')) {
|
|
318
|
+
codeCommand = 'code';
|
|
319
|
+
} else if (isCommandAvailable('code-insiders')) {
|
|
320
|
+
codeCommand = 'code-insiders';
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (!codeCommand) {
|
|
324
|
+
console.error('Error: VS Code command not found in PATH.');
|
|
325
|
+
console.error('');
|
|
326
|
+
console.error('Possible solutions:');
|
|
327
|
+
console.error('');
|
|
328
|
+
console.error('1. If VS Code is installed, restart your terminal to refresh PATH');
|
|
329
|
+
console.error('');
|
|
330
|
+
console.error('2. Install VS Code via winget:');
|
|
331
|
+
console.error(' winget install Microsoft.VisualStudioCode');
|
|
332
|
+
console.error('');
|
|
333
|
+
console.error('3. Install via Chocolatey:');
|
|
334
|
+
console.error(' choco install vscode');
|
|
335
|
+
console.error('');
|
|
336
|
+
console.error('4. Download from: https://code.visualstudio.com/download');
|
|
337
|
+
console.error(' Make sure to check "Add to PATH" during installation');
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return do_code_all_nodejs(args, codeCommand);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Open all subdirectories in VS Code on Windows (PowerShell).
|
|
346
|
+
*
|
|
347
|
+
* PowerShell uses the same mechanism as CMD for running VS Code.
|
|
348
|
+
*
|
|
349
|
+
* @param {string[]} args - Command line arguments
|
|
350
|
+
* @returns {Promise<void>}
|
|
351
|
+
*/
|
|
352
|
+
async function do_code_all_powershell(args) {
|
|
353
|
+
// PowerShell uses the same PATH as CMD, so same detection works
|
|
354
|
+
return do_code_all_cmd(args);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Open all subdirectories in VS Code on Git Bash.
|
|
359
|
+
*
|
|
360
|
+
* Git Bash on Windows can access the Windows 'code' command.
|
|
361
|
+
*
|
|
362
|
+
* @param {string[]} args - Command line arguments
|
|
363
|
+
* @returns {Promise<void>}
|
|
364
|
+
*/
|
|
365
|
+
async function do_code_all_gitbash(args) {
|
|
366
|
+
// Git Bash runs on Windows and can access Windows PATH
|
|
367
|
+
return do_code_all_cmd(args);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Main entry point - detects environment and executes appropriate implementation.
|
|
372
|
+
*
|
|
373
|
+
* Opens each immediate subdirectory of the target directory (or current directory
|
|
374
|
+
* if not specified) in a separate VS Code window. This is useful for quickly
|
|
375
|
+
* opening multiple projects at once.
|
|
376
|
+
*
|
|
377
|
+
* The script:
|
|
378
|
+
* 1. Validates the target directory exists
|
|
379
|
+
* 2. Finds all immediate subdirectories (excluding hidden ones)
|
|
380
|
+
* 3. Opens each one in VS Code as a separate window
|
|
381
|
+
*
|
|
382
|
+
* @param {string[]} args - Command line arguments
|
|
383
|
+
* @param {string} [args.0] - Optional path (defaults to current directory)
|
|
384
|
+
* @returns {Promise<void>}
|
|
385
|
+
*/
|
|
386
|
+
async function do_code_all(args) {
|
|
387
|
+
const platform = os.detect();
|
|
388
|
+
|
|
389
|
+
const handlers = {
|
|
390
|
+
'macos': do_code_all_macos,
|
|
391
|
+
'ubuntu': do_code_all_ubuntu,
|
|
392
|
+
'debian': do_code_all_ubuntu,
|
|
393
|
+
'raspbian': do_code_all_raspbian,
|
|
394
|
+
'amazon_linux': do_code_all_amazon_linux,
|
|
395
|
+
'rhel': do_code_all_amazon_linux,
|
|
396
|
+
'fedora': do_code_all_ubuntu,
|
|
397
|
+
'linux': do_code_all_ubuntu,
|
|
398
|
+
'wsl': do_code_all_ubuntu,
|
|
399
|
+
'cmd': do_code_all_cmd,
|
|
400
|
+
'windows': do_code_all_cmd,
|
|
401
|
+
'powershell': do_code_all_powershell,
|
|
402
|
+
'gitbash': do_code_all_gitbash
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
const handler = handlers[platform.type];
|
|
406
|
+
if (!handler) {
|
|
407
|
+
console.error(`Platform '${platform.type}' is not supported for this command.`);
|
|
408
|
+
console.error('');
|
|
409
|
+
console.error('Supported platforms:');
|
|
410
|
+
console.error(' - macOS');
|
|
411
|
+
console.error(' - Ubuntu, Debian, and other Linux distributions');
|
|
412
|
+
console.error(' - Raspberry Pi OS');
|
|
413
|
+
console.error(' - Amazon Linux, RHEL, Fedora');
|
|
414
|
+
console.error(' - Windows (CMD, PowerShell, Git Bash)');
|
|
415
|
+
console.error(' - Windows Subsystem for Linux (WSL)');
|
|
416
|
+
process.exit(1);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
await handler(args);
|
|
18
420
|
}
|
|
19
421
|
|
|
20
|
-
module.exports = {
|
|
422
|
+
module.exports = {
|
|
423
|
+
main: do_code_all,
|
|
424
|
+
do_code_all,
|
|
425
|
+
do_code_all_nodejs,
|
|
426
|
+
do_code_all_macos,
|
|
427
|
+
do_code_all_ubuntu,
|
|
428
|
+
do_code_all_raspbian,
|
|
429
|
+
do_code_all_amazon_linux,
|
|
430
|
+
do_code_all_cmd,
|
|
431
|
+
do_code_all_powershell,
|
|
432
|
+
do_code_all_gitbash
|
|
433
|
+
};
|
|
21
434
|
|
|
22
435
|
if (require.main === module) {
|
|
23
|
-
|
|
436
|
+
do_code_all(process.argv.slice(2));
|
|
24
437
|
}
|
|
@@ -1,24 +1,211 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* count-files - Count only files (not directories) in the current or specified directory
|
|
5
|
+
*
|
|
6
|
+
* Migrated from legacy dotfiles alias.
|
|
7
|
+
* Original: alias count-files="find . -maxdepth 1 -type f | wc -l"
|
|
8
|
+
*
|
|
9
|
+
* This script counts only regular files in a directory, excluding subdirectories.
|
|
10
|
+
* It reads the directory contents and filters for files only, then prints the count.
|
|
11
|
+
* Unlike the original shell alias, this uses pure Node.js for cross-platform support.
|
|
12
|
+
*
|
|
5
13
|
* @module scripts/count-files
|
|
6
14
|
*/
|
|
7
15
|
|
|
16
|
+
const os = require('../utils/common/os');
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Pure Node.js implementation that works on any platform.
|
|
22
|
+
* Counts the number of files (not directories) in the specified directory.
|
|
23
|
+
*
|
|
24
|
+
* This approach uses fs.readdirSync with the { withFileTypes: true } option,
|
|
25
|
+
* which returns Dirent objects that include file type information. This is
|
|
26
|
+
* more efficient than calling stat() on each entry individually.
|
|
27
|
+
*
|
|
28
|
+
* @param {string[]} args - Command line arguments
|
|
29
|
+
* @param {string} [args[0]] - Optional path to count (defaults to current directory)
|
|
30
|
+
* @returns {Promise<void>}
|
|
31
|
+
*/
|
|
32
|
+
async function do_count_files_nodejs(args) {
|
|
33
|
+
// Get the target directory from arguments, defaulting to current directory
|
|
34
|
+
const targetDir = args[0] || '.';
|
|
35
|
+
|
|
36
|
+
// Resolve to absolute path for clearer error messages
|
|
37
|
+
const absolutePath = path.resolve(targetDir);
|
|
38
|
+
|
|
39
|
+
// Check if the path exists
|
|
40
|
+
if (!fs.existsSync(absolutePath)) {
|
|
41
|
+
console.error(`Error: Directory not found: ${absolutePath}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Check if the path is a directory
|
|
46
|
+
const stats = fs.statSync(absolutePath);
|
|
47
|
+
if (!stats.isDirectory()) {
|
|
48
|
+
console.error(`Error: Not a directory: ${absolutePath}`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
// Read directory contents with file type information included
|
|
54
|
+
// The { withFileTypes: true } option returns Dirent objects instead of strings
|
|
55
|
+
const entries = fs.readdirSync(absolutePath, { withFileTypes: true });
|
|
56
|
+
|
|
57
|
+
// Filter for files only (not directories, symlinks to directories, etc.)
|
|
58
|
+
// dirent.isFile() returns true only for regular files
|
|
59
|
+
const files = entries.filter(dirent => dirent.isFile());
|
|
60
|
+
|
|
61
|
+
// Print the count (matching original alias output: just the number)
|
|
62
|
+
console.log(files.length);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
// Handle permission errors or other filesystem issues
|
|
65
|
+
console.error(`Error reading directory: ${error.message}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Count files on macOS.
|
|
72
|
+
* Uses the pure Node.js implementation since file counting works identically
|
|
73
|
+
* across all platforms using the fs module.
|
|
74
|
+
*
|
|
75
|
+
* @param {string[]} args - Command line arguments
|
|
76
|
+
* @returns {Promise<void>}
|
|
77
|
+
*/
|
|
78
|
+
async function do_count_files_macos(args) {
|
|
79
|
+
return do_count_files_nodejs(args);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Count files on Ubuntu.
|
|
84
|
+
* Uses the pure Node.js implementation since file counting works identically
|
|
85
|
+
* across all platforms using the fs module.
|
|
86
|
+
*
|
|
87
|
+
* @param {string[]} args - Command line arguments
|
|
88
|
+
* @returns {Promise<void>}
|
|
89
|
+
*/
|
|
90
|
+
async function do_count_files_ubuntu(args) {
|
|
91
|
+
return do_count_files_nodejs(args);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Count files on Raspberry Pi OS.
|
|
96
|
+
* Uses the pure Node.js implementation since file counting works identically
|
|
97
|
+
* across all platforms using the fs module.
|
|
98
|
+
*
|
|
99
|
+
* @param {string[]} args - Command line arguments
|
|
100
|
+
* @returns {Promise<void>}
|
|
101
|
+
*/
|
|
102
|
+
async function do_count_files_raspbian(args) {
|
|
103
|
+
return do_count_files_nodejs(args);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Count files on Amazon Linux.
|
|
108
|
+
* Uses the pure Node.js implementation since file counting works identically
|
|
109
|
+
* across all platforms using the fs module.
|
|
110
|
+
*
|
|
111
|
+
* @param {string[]} args - Command line arguments
|
|
112
|
+
* @returns {Promise<void>}
|
|
113
|
+
*/
|
|
114
|
+
async function do_count_files_amazon_linux(args) {
|
|
115
|
+
return do_count_files_nodejs(args);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Count files in Windows Command Prompt.
|
|
120
|
+
* Uses the pure Node.js implementation since file counting works identically
|
|
121
|
+
* across all platforms using the fs module.
|
|
122
|
+
*
|
|
123
|
+
* @param {string[]} args - Command line arguments
|
|
124
|
+
* @returns {Promise<void>}
|
|
125
|
+
*/
|
|
126
|
+
async function do_count_files_cmd(args) {
|
|
127
|
+
return do_count_files_nodejs(args);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Count files in Windows PowerShell.
|
|
132
|
+
* Uses the pure Node.js implementation since file counting works identically
|
|
133
|
+
* across all platforms using the fs module.
|
|
134
|
+
*
|
|
135
|
+
* @param {string[]} args - Command line arguments
|
|
136
|
+
* @returns {Promise<void>}
|
|
137
|
+
*/
|
|
138
|
+
async function do_count_files_powershell(args) {
|
|
139
|
+
return do_count_files_nodejs(args);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Count files in Git Bash on Windows.
|
|
144
|
+
* Uses the pure Node.js implementation since file counting works identically
|
|
145
|
+
* across all platforms using the fs module.
|
|
146
|
+
*
|
|
147
|
+
* @param {string[]} args - Command line arguments
|
|
148
|
+
* @returns {Promise<void>}
|
|
149
|
+
*/
|
|
150
|
+
async function do_count_files_gitbash(args) {
|
|
151
|
+
return do_count_files_nodejs(args);
|
|
152
|
+
}
|
|
153
|
+
|
|
8
154
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
155
|
+
* Main entry point - detects environment and executes appropriate implementation.
|
|
156
|
+
*
|
|
157
|
+
* Counts the number of regular files (not directories) in the current or specified
|
|
158
|
+
* directory. This is useful for quickly checking how many files exist in a folder
|
|
159
|
+
* without counting subdirectories.
|
|
160
|
+
*
|
|
161
|
+
* Usage:
|
|
162
|
+
* count-files # Count files in current directory
|
|
163
|
+
* count-files /path # Count files in specified directory
|
|
11
164
|
*
|
|
12
165
|
* @param {string[]} args - Command line arguments
|
|
13
|
-
* @param {string} [args.0] - Optional path to count (defaults to current directory)
|
|
14
166
|
* @returns {Promise<void>}
|
|
15
167
|
*/
|
|
16
|
-
async function
|
|
17
|
-
|
|
168
|
+
async function do_count_files(args) {
|
|
169
|
+
const platform = os.detect();
|
|
170
|
+
|
|
171
|
+
const handlers = {
|
|
172
|
+
'macos': do_count_files_macos,
|
|
173
|
+
'ubuntu': do_count_files_ubuntu,
|
|
174
|
+
'debian': do_count_files_ubuntu,
|
|
175
|
+
'raspbian': do_count_files_raspbian,
|
|
176
|
+
'amazon_linux': do_count_files_amazon_linux,
|
|
177
|
+
'rhel': do_count_files_amazon_linux,
|
|
178
|
+
'fedora': do_count_files_ubuntu,
|
|
179
|
+
'linux': do_count_files_ubuntu,
|
|
180
|
+
'wsl': do_count_files_ubuntu,
|
|
181
|
+
'cmd': do_count_files_cmd,
|
|
182
|
+
'windows': do_count_files_cmd,
|
|
183
|
+
'powershell': do_count_files_powershell,
|
|
184
|
+
'gitbash': do_count_files_gitbash
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const handler = handlers[platform.type];
|
|
188
|
+
if (!handler) {
|
|
189
|
+
console.error(`Platform '${platform.type}' is not supported for this command.`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
await handler(args);
|
|
18
194
|
}
|
|
19
195
|
|
|
20
|
-
module.exports = {
|
|
196
|
+
module.exports = {
|
|
197
|
+
main: do_count_files,
|
|
198
|
+
do_count_files,
|
|
199
|
+
do_count_files_nodejs,
|
|
200
|
+
do_count_files_macos,
|
|
201
|
+
do_count_files_ubuntu,
|
|
202
|
+
do_count_files_raspbian,
|
|
203
|
+
do_count_files_amazon_linux,
|
|
204
|
+
do_count_files_cmd,
|
|
205
|
+
do_count_files_powershell,
|
|
206
|
+
do_count_files_gitbash
|
|
207
|
+
};
|
|
21
208
|
|
|
22
209
|
if (require.main === module) {
|
|
23
|
-
|
|
210
|
+
do_count_files(process.argv.slice(2));
|
|
24
211
|
}
|