@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/packages.js
CHANGED
|
@@ -1,25 +1,330 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* packages - Find all package.json files with modification dates
|
|
5
|
+
*
|
|
6
|
+
* Migrated from legacy dotfiles alias.
|
|
7
|
+
* Original aliases:
|
|
8
|
+
* macOS: find ./ -type f -name "package.json" -exec stat -f "%Sm %N" -t "%Y-%m-%d %H:%M:%S" {} + | grep -v "node_modules" | sort -n
|
|
9
|
+
* Ubuntu: find ./ -type f -name "package.json" -exec stat --format="%Y %n" {} + | grep -v "node_modules" sort -n | awk '{print strftime("%Y-%m-%d %H:%M:%S", $1), $2}'
|
|
10
|
+
*
|
|
11
|
+
* This script finds all package.json files recursively in a directory,
|
|
12
|
+
* excludes those inside node_modules folders, and displays them with their
|
|
13
|
+
* modification timestamps sorted chronologically. This is useful for:
|
|
14
|
+
* - Finding when projects were last modified
|
|
15
|
+
* - Discovering nested projects in a monorepo
|
|
16
|
+
* - Auditing package.json files across a codebase
|
|
17
|
+
*
|
|
5
18
|
* @module scripts/packages
|
|
6
19
|
*/
|
|
7
20
|
|
|
21
|
+
const os = require('../utils/common/os');
|
|
22
|
+
const fs = require('fs');
|
|
23
|
+
const path = require('path');
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Recursively finds all files matching a pattern in a directory.
|
|
27
|
+
* This is a pure Node.js implementation that avoids shell commands.
|
|
28
|
+
*
|
|
29
|
+
* @param {string} dir - The directory to search in
|
|
30
|
+
* @param {string} filename - The filename to look for (e.g., 'package.json')
|
|
31
|
+
* @param {string[]} excludePaths - Array of path segments to exclude (e.g., ['node_modules'])
|
|
32
|
+
* @returns {string[]} Array of absolute file paths found
|
|
33
|
+
*/
|
|
34
|
+
function findFilesRecursive(dir, filename, excludePaths = []) {
|
|
35
|
+
const results = [];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Internal recursive function that traverses directories.
|
|
39
|
+
* @param {string} currentDir - Current directory being searched
|
|
40
|
+
*/
|
|
41
|
+
function traverse(currentDir) {
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
// Read all entries in the current directory
|
|
45
|
+
entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
46
|
+
} catch (err) {
|
|
47
|
+
// Skip directories we cannot read (permission denied, etc.)
|
|
48
|
+
// This is common when traversing large file trees
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
54
|
+
|
|
55
|
+
// Check if this path should be excluded
|
|
56
|
+
// We check if any segment of the path matches our exclude list
|
|
57
|
+
const shouldExclude = excludePaths.some(excludeSegment =>
|
|
58
|
+
fullPath.split(path.sep).includes(excludeSegment)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
if (shouldExclude) {
|
|
62
|
+
continue; // Skip this entry entirely
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (entry.isDirectory()) {
|
|
66
|
+
// Recursively search subdirectories
|
|
67
|
+
traverse(fullPath);
|
|
68
|
+
} else if (entry.isFile() && entry.name === filename) {
|
|
69
|
+
// Found a matching file
|
|
70
|
+
results.push(fullPath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
traverse(dir);
|
|
76
|
+
return results;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Gets the modification time of a file.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} filePath - Path to the file
|
|
83
|
+
* @returns {{ path: string, mtime: Date }|null} Object with path and modification time, or null if error
|
|
84
|
+
*/
|
|
85
|
+
function getFileModTime(filePath) {
|
|
86
|
+
try {
|
|
87
|
+
const stats = fs.statSync(filePath);
|
|
88
|
+
return {
|
|
89
|
+
path: filePath,
|
|
90
|
+
mtime: stats.mtime
|
|
91
|
+
};
|
|
92
|
+
} catch (err) {
|
|
93
|
+
// File might have been deleted between finding it and stat'ing it
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Formats a Date object into YYYY-MM-DD HH:MM:SS format.
|
|
100
|
+
* This matches the format used in the original shell aliases.
|
|
101
|
+
*
|
|
102
|
+
* @param {Date} date - The date to format
|
|
103
|
+
* @returns {string} Formatted date string
|
|
104
|
+
*/
|
|
105
|
+
function formatDate(date) {
|
|
106
|
+
const year = date.getFullYear();
|
|
107
|
+
// Months are 0-indexed in JavaScript, so add 1
|
|
108
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
109
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
110
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
111
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
112
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
113
|
+
|
|
114
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
115
|
+
}
|
|
116
|
+
|
|
8
117
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
118
|
+
* Pure Node.js implementation that works on any platform.
|
|
119
|
+
*
|
|
120
|
+
* This function finds all package.json files, excludes node_modules,
|
|
121
|
+
* and displays them sorted by modification time. Because file system
|
|
122
|
+
* operations are platform-agnostic in Node.js, this single implementation
|
|
123
|
+
* works identically on macOS, Linux, and Windows.
|
|
12
124
|
*
|
|
13
125
|
* @param {string[]} args - Command line arguments
|
|
14
126
|
* @param {string} [args.0] - Optional path to search (defaults to current directory)
|
|
15
127
|
* @returns {Promise<void>}
|
|
16
128
|
*/
|
|
17
|
-
async function
|
|
18
|
-
//
|
|
129
|
+
async function do_packages_nodejs(args) {
|
|
130
|
+
// Get the search directory from args, or use current working directory
|
|
131
|
+
const searchDir = args[0] ? path.resolve(args[0]) : process.cwd();
|
|
132
|
+
|
|
133
|
+
// Verify the directory exists
|
|
134
|
+
if (!fs.existsSync(searchDir)) {
|
|
135
|
+
console.error(`Error: Directory does not exist: ${searchDir}`);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Verify it's actually a directory
|
|
140
|
+
const searchDirStats = fs.statSync(searchDir);
|
|
141
|
+
if (!searchDirStats.isDirectory()) {
|
|
142
|
+
console.error(`Error: Not a directory: ${searchDir}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Find all package.json files, excluding node_modules directories
|
|
147
|
+
// This mirrors the original alias behavior: grep -v "node_modules"
|
|
148
|
+
const packageFiles = findFilesRecursive(searchDir, 'package.json', ['node_modules']);
|
|
149
|
+
|
|
150
|
+
if (packageFiles.length === 0) {
|
|
151
|
+
console.log('No package.json files found.');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Get modification times for all found files
|
|
156
|
+
const filesWithTimes = packageFiles
|
|
157
|
+
.map(getFileModTime)
|
|
158
|
+
.filter(item => item !== null); // Remove any files that couldn't be stat'd
|
|
159
|
+
|
|
160
|
+
// Sort by modification time (oldest first, like the original 'sort -n')
|
|
161
|
+
filesWithTimes.sort((a, b) => a.mtime.getTime() - b.mtime.getTime());
|
|
162
|
+
|
|
163
|
+
// Display results in the format: "YYYY-MM-DD HH:MM:SS /path/to/package.json"
|
|
164
|
+
// This matches the original shell alias output format
|
|
165
|
+
for (const file of filesWithTimes) {
|
|
166
|
+
const formattedDate = formatDate(file.mtime);
|
|
167
|
+
// Use relative path from search directory for cleaner output
|
|
168
|
+
const relativePath = path.relative(searchDir, file.path);
|
|
169
|
+
// Add ./ prefix to match original alias output
|
|
170
|
+
const displayPath = relativePath.startsWith('.') ? relativePath : `./${relativePath}`;
|
|
171
|
+
console.log(`${formattedDate} ${displayPath}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Find package.json files on macOS.
|
|
177
|
+
* Delegates to the pure Node.js implementation since no macOS-specific
|
|
178
|
+
* functionality is needed for file searching and listing.
|
|
179
|
+
*
|
|
180
|
+
* @param {string[]} args - Command line arguments
|
|
181
|
+
* @returns {Promise<void>}
|
|
182
|
+
*/
|
|
183
|
+
async function do_packages_macos(args) {
|
|
184
|
+
return do_packages_nodejs(args);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Find package.json files on Ubuntu.
|
|
189
|
+
* Delegates to the pure Node.js implementation since no Ubuntu-specific
|
|
190
|
+
* functionality is needed for file searching and listing.
|
|
191
|
+
*
|
|
192
|
+
* @param {string[]} args - Command line arguments
|
|
193
|
+
* @returns {Promise<void>}
|
|
194
|
+
*/
|
|
195
|
+
async function do_packages_ubuntu(args) {
|
|
196
|
+
return do_packages_nodejs(args);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Find package.json files on Raspberry Pi OS.
|
|
201
|
+
* Delegates to the pure Node.js implementation since no Raspbian-specific
|
|
202
|
+
* functionality is needed for file searching and listing.
|
|
203
|
+
*
|
|
204
|
+
* @param {string[]} args - Command line arguments
|
|
205
|
+
* @returns {Promise<void>}
|
|
206
|
+
*/
|
|
207
|
+
async function do_packages_raspbian(args) {
|
|
208
|
+
return do_packages_nodejs(args);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Find package.json files on Amazon Linux.
|
|
213
|
+
* Delegates to the pure Node.js implementation since no Amazon Linux-specific
|
|
214
|
+
* functionality is needed for file searching and listing.
|
|
215
|
+
*
|
|
216
|
+
* @param {string[]} args - Command line arguments
|
|
217
|
+
* @returns {Promise<void>}
|
|
218
|
+
*/
|
|
219
|
+
async function do_packages_amazon_linux(args) {
|
|
220
|
+
return do_packages_nodejs(args);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Find package.json files on Windows Command Prompt.
|
|
225
|
+
* Delegates to the pure Node.js implementation since Node.js fs module
|
|
226
|
+
* handles Windows paths and file operations transparently.
|
|
227
|
+
*
|
|
228
|
+
* @param {string[]} args - Command line arguments
|
|
229
|
+
* @returns {Promise<void>}
|
|
230
|
+
*/
|
|
231
|
+
async function do_packages_cmd(args) {
|
|
232
|
+
return do_packages_nodejs(args);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Find package.json files on Windows PowerShell.
|
|
237
|
+
* Delegates to the pure Node.js implementation since Node.js fs module
|
|
238
|
+
* handles Windows paths and file operations transparently.
|
|
239
|
+
*
|
|
240
|
+
* @param {string[]} args - Command line arguments
|
|
241
|
+
* @returns {Promise<void>}
|
|
242
|
+
*/
|
|
243
|
+
async function do_packages_powershell(args) {
|
|
244
|
+
return do_packages_nodejs(args);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Find package.json files in Git Bash.
|
|
249
|
+
* Delegates to the pure Node.js implementation since Node.js fs module
|
|
250
|
+
* works correctly in Git Bash on Windows.
|
|
251
|
+
*
|
|
252
|
+
* @param {string[]} args - Command line arguments
|
|
253
|
+
* @returns {Promise<void>}
|
|
254
|
+
*/
|
|
255
|
+
async function do_packages_gitbash(args) {
|
|
256
|
+
return do_packages_nodejs(args);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Main entry point - detects environment and executes appropriate implementation.
|
|
261
|
+
*
|
|
262
|
+
* The "packages" command finds all package.json files in a directory tree,
|
|
263
|
+
* excluding those inside node_modules directories, and displays them sorted
|
|
264
|
+
* by modification time. This helps developers quickly see:
|
|
265
|
+
* - Which projects exist in a directory
|
|
266
|
+
* - When each project was last modified
|
|
267
|
+
* - Discover nested packages in monorepos
|
|
268
|
+
*
|
|
269
|
+
* Usage:
|
|
270
|
+
* packages # Search current directory
|
|
271
|
+
* packages /path/to/dir # Search specified directory
|
|
272
|
+
*
|
|
273
|
+
* Output format:
|
|
274
|
+
* YYYY-MM-DD HH:MM:SS ./path/to/package.json
|
|
275
|
+
*
|
|
276
|
+
* @param {string[]} args - Command line arguments
|
|
277
|
+
* @param {string} [args.0] - Optional path to search
|
|
278
|
+
* @returns {Promise<void>}
|
|
279
|
+
*/
|
|
280
|
+
async function do_packages(args) {
|
|
281
|
+
const platform = os.detect();
|
|
282
|
+
|
|
283
|
+
const handlers = {
|
|
284
|
+
'macos': do_packages_macos,
|
|
285
|
+
'ubuntu': do_packages_ubuntu,
|
|
286
|
+
'debian': do_packages_ubuntu,
|
|
287
|
+
'raspbian': do_packages_raspbian,
|
|
288
|
+
'amazon_linux': do_packages_amazon_linux,
|
|
289
|
+
'rhel': do_packages_amazon_linux,
|
|
290
|
+
'fedora': do_packages_ubuntu,
|
|
291
|
+
'linux': do_packages_ubuntu,
|
|
292
|
+
'wsl': do_packages_ubuntu,
|
|
293
|
+
'cmd': do_packages_cmd,
|
|
294
|
+
'windows': do_packages_cmd,
|
|
295
|
+
'powershell': do_packages_powershell,
|
|
296
|
+
'gitbash': do_packages_gitbash
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const handler = handlers[platform.type];
|
|
300
|
+
if (!handler) {
|
|
301
|
+
console.error(`Platform '${platform.type}' is not supported for this command.`);
|
|
302
|
+
console.error('');
|
|
303
|
+
console.error('Supported platforms:');
|
|
304
|
+
console.error(' - macOS');
|
|
305
|
+
console.error(' - Ubuntu, Debian, and other Linux distributions');
|
|
306
|
+
console.error(' - Raspberry Pi OS');
|
|
307
|
+
console.error(' - Amazon Linux, RHEL, Fedora');
|
|
308
|
+
console.error(' - Windows (CMD, PowerShell, Git Bash)');
|
|
309
|
+
process.exit(1);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
await handler(args);
|
|
19
313
|
}
|
|
20
314
|
|
|
21
|
-
module.exports = {
|
|
315
|
+
module.exports = {
|
|
316
|
+
main: do_packages,
|
|
317
|
+
do_packages,
|
|
318
|
+
do_packages_nodejs,
|
|
319
|
+
do_packages_macos,
|
|
320
|
+
do_packages_ubuntu,
|
|
321
|
+
do_packages_raspbian,
|
|
322
|
+
do_packages_amazon_linux,
|
|
323
|
+
do_packages_cmd,
|
|
324
|
+
do_packages_powershell,
|
|
325
|
+
do_packages_gitbash
|
|
326
|
+
};
|
|
22
327
|
|
|
23
328
|
if (require.main === module) {
|
|
24
|
-
|
|
329
|
+
do_packages(process.argv.slice(2));
|
|
25
330
|
}
|
package/src/scripts/path.js
CHANGED
|
@@ -1,23 +1,225 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* path - Display PATH entries one per line
|
|
5
|
+
*
|
|
6
|
+
* Migrated from legacy dotfiles alias.
|
|
7
|
+
* Original: alias path='printf "%b\n" "${PATH//:/\\n}"'
|
|
8
|
+
*
|
|
9
|
+
* This script displays each directory in the system PATH environment variable
|
|
10
|
+
* on a separate line for easier reading. The PATH variable is typically a
|
|
11
|
+
* long, colon-separated (Unix) or semicolon-separated (Windows) string that
|
|
12
|
+
* is difficult to read in its raw form.
|
|
13
|
+
*
|
|
14
|
+
* This is implemented in pure Node.js because:
|
|
15
|
+
* - process.env.PATH provides the PATH variable on all platforms
|
|
16
|
+
* - path.delimiter gives us the platform-specific separator (: or ;)
|
|
17
|
+
* - Simple string splitting and output require no shell commands
|
|
18
|
+
*
|
|
5
19
|
* @module scripts/path
|
|
6
20
|
*/
|
|
7
21
|
|
|
22
|
+
const path = require('path');
|
|
23
|
+
const os = require('../utils/common/os');
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Pure Node.js implementation that works on any platform.
|
|
27
|
+
*
|
|
28
|
+
* This function handles the core logic of parsing and displaying the PATH:
|
|
29
|
+
* 1. Gets the PATH environment variable from process.env.PATH
|
|
30
|
+
* 2. Splits it using the platform-appropriate delimiter (: on Unix, ; on Windows)
|
|
31
|
+
* 3. Prints each path entry on its own line
|
|
32
|
+
*
|
|
33
|
+
* The path.delimiter constant automatically uses the correct separator for
|
|
34
|
+
* the current platform, making this truly cross-platform without any
|
|
35
|
+
* conditional logic.
|
|
36
|
+
*
|
|
37
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
38
|
+
* @returns {Promise<void>}
|
|
39
|
+
*/
|
|
40
|
+
async function do_path_nodejs(args) {
|
|
41
|
+
// Get the PATH environment variable
|
|
42
|
+
// On Unix: /usr/bin:/usr/local/bin:/home/user/bin
|
|
43
|
+
// On Windows: C:\Windows\system32;C:\Windows;C:\Program Files\node
|
|
44
|
+
const pathEnv = process.env.PATH;
|
|
45
|
+
|
|
46
|
+
// Handle edge case: PATH is not set or empty
|
|
47
|
+
if (!pathEnv) {
|
|
48
|
+
console.log('PATH environment variable is not set or empty.');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Split by the platform-specific delimiter
|
|
53
|
+
// path.delimiter is ':' on Unix/macOS and ';' on Windows
|
|
54
|
+
const pathEntries = pathEnv.split(path.delimiter);
|
|
55
|
+
|
|
56
|
+
// Print each path entry on its own line
|
|
57
|
+
// Filter out empty strings that might result from double delimiters (e.g., "::")
|
|
58
|
+
for (const entry of pathEntries) {
|
|
59
|
+
if (entry) {
|
|
60
|
+
console.log(entry);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Display PATH entries on macOS.
|
|
67
|
+
*
|
|
68
|
+
* macOS uses colon-separated paths like other Unix systems.
|
|
69
|
+
* Example PATH: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
|
70
|
+
*
|
|
71
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
72
|
+
* @returns {Promise<void>}
|
|
73
|
+
*/
|
|
74
|
+
async function do_path_macos(args) {
|
|
75
|
+
// Pure Node.js handles this perfectly - no macOS-specific code needed
|
|
76
|
+
return do_path_nodejs(args);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Display PATH entries on Ubuntu.
|
|
81
|
+
*
|
|
82
|
+
* Ubuntu uses colon-separated paths like other Unix systems.
|
|
83
|
+
* Example PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
84
|
+
*
|
|
85
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
86
|
+
* @returns {Promise<void>}
|
|
87
|
+
*/
|
|
88
|
+
async function do_path_ubuntu(args) {
|
|
89
|
+
// Pure Node.js handles this perfectly - no Ubuntu-specific code needed
|
|
90
|
+
return do_path_nodejs(args);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Display PATH entries on Raspberry Pi OS.
|
|
95
|
+
*
|
|
96
|
+
* Raspberry Pi OS (Raspbian) uses colon-separated paths like other Unix systems.
|
|
97
|
+
* Example PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
98
|
+
*
|
|
99
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
100
|
+
* @returns {Promise<void>}
|
|
101
|
+
*/
|
|
102
|
+
async function do_path_raspbian(args) {
|
|
103
|
+
// Pure Node.js handles this perfectly - no Raspbian-specific code needed
|
|
104
|
+
return do_path_nodejs(args);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Display PATH entries on Amazon Linux.
|
|
109
|
+
*
|
|
110
|
+
* Amazon Linux uses colon-separated paths like other Unix systems.
|
|
111
|
+
* Example PATH: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
|
|
112
|
+
*
|
|
113
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
114
|
+
* @returns {Promise<void>}
|
|
115
|
+
*/
|
|
116
|
+
async function do_path_amazon_linux(args) {
|
|
117
|
+
// Pure Node.js handles this perfectly - no Amazon Linux-specific code needed
|
|
118
|
+
return do_path_nodejs(args);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Display PATH entries on Windows Command Prompt.
|
|
123
|
+
*
|
|
124
|
+
* Windows uses semicolon-separated paths.
|
|
125
|
+
* Example PATH: C:\Windows\system32;C:\Windows;C:\Program Files\nodejs
|
|
126
|
+
*
|
|
127
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
128
|
+
* @returns {Promise<void>}
|
|
129
|
+
*/
|
|
130
|
+
async function do_path_cmd(args) {
|
|
131
|
+
// Pure Node.js handles this perfectly - path.delimiter is ';' on Windows
|
|
132
|
+
return do_path_nodejs(args);
|
|
133
|
+
}
|
|
134
|
+
|
|
8
135
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
136
|
+
* Display PATH entries on Windows PowerShell.
|
|
137
|
+
*
|
|
138
|
+
* Windows PowerShell uses the same PATH as Command Prompt (semicolon-separated).
|
|
139
|
+
* Example PATH: C:\Windows\system32;C:\Windows;C:\Program Files\nodejs
|
|
11
140
|
*
|
|
12
141
|
* @param {string[]} args - Command line arguments (unused)
|
|
13
142
|
* @returns {Promise<void>}
|
|
14
143
|
*/
|
|
15
|
-
async function
|
|
16
|
-
//
|
|
144
|
+
async function do_path_powershell(args) {
|
|
145
|
+
// Pure Node.js handles this perfectly - path.delimiter is ';' on Windows
|
|
146
|
+
return do_path_nodejs(args);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Display PATH entries in Git Bash.
|
|
151
|
+
*
|
|
152
|
+
* Git Bash on Windows uses Unix-style colon-separated paths internally,
|
|
153
|
+
* but process.env.PATH and path.delimiter handle this automatically.
|
|
154
|
+
* The Node.js path module correctly detects the environment.
|
|
155
|
+
*
|
|
156
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
157
|
+
* @returns {Promise<void>}
|
|
158
|
+
*/
|
|
159
|
+
async function do_path_gitbash(args) {
|
|
160
|
+
// Pure Node.js handles this perfectly - works in Git Bash environment
|
|
161
|
+
return do_path_nodejs(args);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Main entry point - detects environment and executes appropriate implementation.
|
|
166
|
+
*
|
|
167
|
+
* The "path" command displays each directory in the PATH environment variable
|
|
168
|
+
* on its own line, making it easy to see all locations where the shell searches
|
|
169
|
+
* for executable programs.
|
|
170
|
+
*
|
|
171
|
+
* This is useful for:
|
|
172
|
+
* - Debugging PATH issues (e.g., "why isn't my command found?")
|
|
173
|
+
* - Understanding the order executables are searched
|
|
174
|
+
* - Quickly viewing all directories without manual string parsing
|
|
175
|
+
*
|
|
176
|
+
* @param {string[]} args - Command line arguments (unused)
|
|
177
|
+
* @returns {Promise<void>}
|
|
178
|
+
*/
|
|
179
|
+
async function do_path(args) {
|
|
180
|
+
const platform = os.detect();
|
|
181
|
+
|
|
182
|
+
const handlers = {
|
|
183
|
+
'macos': do_path_macos,
|
|
184
|
+
'ubuntu': do_path_ubuntu,
|
|
185
|
+
'debian': do_path_ubuntu,
|
|
186
|
+
'raspbian': do_path_raspbian,
|
|
187
|
+
'amazon_linux': do_path_amazon_linux,
|
|
188
|
+
'rhel': do_path_amazon_linux,
|
|
189
|
+
'fedora': do_path_ubuntu,
|
|
190
|
+
'linux': do_path_ubuntu,
|
|
191
|
+
'wsl': do_path_ubuntu,
|
|
192
|
+
'cmd': do_path_cmd,
|
|
193
|
+
'windows': do_path_cmd,
|
|
194
|
+
'powershell': do_path_powershell,
|
|
195
|
+
'gitbash': do_path_gitbash
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const handler = handlers[platform.type];
|
|
199
|
+
if (!handler) {
|
|
200
|
+
// Even for unknown platforms, the Node.js implementation will work
|
|
201
|
+
// because path.delimiter is available on all Node.js platforms
|
|
202
|
+
console.log(`Note: Platform '${platform.type}' is not explicitly supported, using default implementation.`);
|
|
203
|
+
await do_path_nodejs(args);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
await handler(args);
|
|
17
208
|
}
|
|
18
209
|
|
|
19
|
-
module.exports = {
|
|
210
|
+
module.exports = {
|
|
211
|
+
main: do_path,
|
|
212
|
+
do_path,
|
|
213
|
+
do_path_nodejs,
|
|
214
|
+
do_path_macos,
|
|
215
|
+
do_path_ubuntu,
|
|
216
|
+
do_path_raspbian,
|
|
217
|
+
do_path_amazon_linux,
|
|
218
|
+
do_path_cmd,
|
|
219
|
+
do_path_powershell,
|
|
220
|
+
do_path_gitbash
|
|
221
|
+
};
|
|
20
222
|
|
|
21
223
|
if (require.main === module) {
|
|
22
|
-
|
|
224
|
+
do_path(process.argv.slice(2));
|
|
23
225
|
}
|