@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.
Files changed (259) hide show
  1. package/README.md +5 -5
  2. package/package.json +1 -1
  3. package/src/commands/install.js +374 -36
  4. package/src/installs/adobe-creative-cloud.js +527 -25
  5. package/src/installs/adobe-creative-cloud.md +605 -0
  6. package/src/installs/appcleaner.js +303 -26
  7. package/src/installs/appcleaner.md +699 -0
  8. package/src/installs/apt-transport-https.js +390 -0
  9. package/src/installs/apt-transport-https.md +678 -0
  10. package/src/installs/atomicparsley.js +624 -26
  11. package/src/installs/atomicparsley.md +795 -0
  12. package/src/installs/aws-cli.js +779 -26
  13. package/src/installs/aws-cli.md +727 -0
  14. package/src/installs/balena-etcher.js +688 -26
  15. package/src/installs/balena-etcher.md +761 -0
  16. package/src/installs/bambu-studio.js +912 -26
  17. package/src/installs/bambu-studio.md +780 -0
  18. package/src/installs/bash-completion.js +554 -23
  19. package/src/installs/bash-completion.md +833 -0
  20. package/src/installs/bash.js +399 -26
  21. package/src/installs/bash.md +993 -0
  22. package/src/installs/beyond-compare.js +585 -26
  23. package/src/installs/beyond-compare.md +813 -0
  24. package/src/installs/build-essential.js +511 -26
  25. package/src/installs/build-essential.md +977 -0
  26. package/src/installs/ca-certificates.js +618 -0
  27. package/src/installs/ca-certificates.md +937 -0
  28. package/src/installs/caffeine.js +490 -26
  29. package/src/installs/caffeine.md +839 -0
  30. package/src/installs/camtasia.js +577 -25
  31. package/src/installs/camtasia.md +762 -0
  32. package/src/installs/chatgpt.js +458 -26
  33. package/src/installs/chatgpt.md +814 -0
  34. package/src/installs/chocolatey.js +447 -0
  35. package/src/installs/chocolatey.md +661 -0
  36. package/src/installs/chrome-canary.js +472 -26
  37. package/src/installs/chrome-canary.md +641 -0
  38. package/src/installs/chromium.js +645 -26
  39. package/src/installs/chromium.md +838 -0
  40. package/src/installs/claude-code.js +558 -26
  41. package/src/installs/claude-code.md +1173 -0
  42. package/src/installs/curl.js +361 -26
  43. package/src/installs/curl.md +714 -0
  44. package/src/installs/cursor.js +561 -26
  45. package/src/installs/cursor.md +970 -0
  46. package/src/installs/dbschema.js +674 -26
  47. package/src/installs/dbschema.md +925 -0
  48. package/src/installs/dependencies.md +435 -0
  49. package/src/installs/development-tools.js +600 -0
  50. package/src/installs/development-tools.md +977 -0
  51. package/src/installs/docker.js +1010 -25
  52. package/src/installs/docker.md +1109 -0
  53. package/src/installs/drawio.js +1001 -26
  54. package/src/installs/drawio.md +795 -0
  55. package/src/installs/elmedia-player.js +328 -25
  56. package/src/installs/elmedia-player.md +556 -0
  57. package/src/installs/ffmpeg.js +870 -25
  58. package/src/installs/ffmpeg.md +852 -0
  59. package/src/installs/file.js +464 -0
  60. package/src/installs/file.md +987 -0
  61. package/src/installs/gemini-cli.js +793 -26
  62. package/src/installs/gemini-cli.md +1153 -0
  63. package/src/installs/git.js +382 -26
  64. package/src/installs/git.md +907 -0
  65. package/src/installs/gitego.js +931 -26
  66. package/src/installs/gitego.md +1172 -0
  67. package/src/installs/go.js +913 -26
  68. package/src/installs/go.md +958 -0
  69. package/src/installs/google-chrome.js +801 -25
  70. package/src/installs/google-chrome.md +862 -0
  71. package/src/installs/gpg.js +412 -73
  72. package/src/installs/gpg.md +1056 -0
  73. package/src/installs/homebrew.js +1015 -26
  74. package/src/installs/homebrew.md +988 -0
  75. package/src/installs/imageoptim.js +950 -26
  76. package/src/installs/imageoptim.md +1119 -0
  77. package/src/installs/installers.json +2297 -0
  78. package/src/installs/jq.js +382 -26
  79. package/src/installs/jq.md +809 -0
  80. package/src/installs/keyboard-maestro.js +701 -26
  81. package/src/installs/keyboard-maestro.md +825 -0
  82. package/src/installs/latex.js +771 -26
  83. package/src/installs/latex.md +1095 -0
  84. package/src/installs/lftp.js +338 -26
  85. package/src/installs/lftp.md +907 -0
  86. package/src/installs/lsb-release.js +346 -0
  87. package/src/installs/lsb-release.md +814 -0
  88. package/src/installs/messenger.js +829 -26
  89. package/src/installs/messenger.md +900 -0
  90. package/src/installs/microsoft-office.js +550 -26
  91. package/src/installs/microsoft-office.md +760 -0
  92. package/src/installs/microsoft-teams.js +782 -25
  93. package/src/installs/microsoft-teams.md +886 -0
  94. package/src/installs/node.js +886 -26
  95. package/src/installs/node.md +1153 -0
  96. package/src/installs/nordpass.js +698 -26
  97. package/src/installs/nordpass.md +921 -0
  98. package/src/installs/nvm.js +977 -26
  99. package/src/installs/nvm.md +1057 -0
  100. package/src/installs/openssh.js +734 -64
  101. package/src/installs/openssh.md +1056 -0
  102. package/src/installs/pandoc.js +644 -26
  103. package/src/installs/pandoc.md +1036 -0
  104. package/src/installs/pinentry.js +492 -26
  105. package/src/installs/pinentry.md +1142 -0
  106. package/src/installs/pngyu.js +851 -26
  107. package/src/installs/pngyu.md +896 -0
  108. package/src/installs/postman.js +781 -26
  109. package/src/installs/postman.md +940 -0
  110. package/src/installs/procps.js +425 -0
  111. package/src/installs/procps.md +851 -0
  112. package/src/installs/safari-tech-preview.js +355 -25
  113. package/src/installs/safari-tech-preview.md +533 -0
  114. package/src/installs/sfnt2woff.js +640 -26
  115. package/src/installs/sfnt2woff.md +795 -0
  116. package/src/installs/shellcheck.js +463 -26
  117. package/src/installs/shellcheck.md +1005 -0
  118. package/src/installs/slack.js +722 -25
  119. package/src/installs/slack.md +865 -0
  120. package/src/installs/snagit.js +566 -25
  121. package/src/installs/snagit.md +844 -0
  122. package/src/installs/software-properties-common.js +372 -0
  123. package/src/installs/software-properties-common.md +805 -0
  124. package/src/installs/spotify.js +858 -25
  125. package/src/installs/spotify.md +901 -0
  126. package/src/installs/studio-3t.js +803 -26
  127. package/src/installs/studio-3t.md +918 -0
  128. package/src/installs/sublime-text.js +780 -25
  129. package/src/installs/sublime-text.md +914 -0
  130. package/src/installs/superwhisper.js +687 -25
  131. package/src/installs/superwhisper.md +630 -0
  132. package/src/installs/tailscale.js +727 -26
  133. package/src/installs/tailscale.md +1100 -0
  134. package/src/installs/tar.js +389 -0
  135. package/src/installs/tar.md +946 -0
  136. package/src/installs/termius.js +780 -26
  137. package/src/installs/termius.md +844 -0
  138. package/src/installs/terraform.js +761 -26
  139. package/src/installs/terraform.md +899 -0
  140. package/src/installs/tidal.js +752 -25
  141. package/src/installs/tidal.md +864 -0
  142. package/src/installs/tmux.js +328 -26
  143. package/src/installs/tmux.md +1030 -0
  144. package/src/installs/tree.js +393 -26
  145. package/src/installs/tree.md +833 -0
  146. package/src/installs/unzip.js +460 -0
  147. package/src/installs/unzip.md +879 -0
  148. package/src/installs/vim.js +403 -26
  149. package/src/installs/vim.md +1040 -0
  150. package/src/installs/vlc.js +803 -26
  151. package/src/installs/vlc.md +927 -0
  152. package/src/installs/vscode.js +825 -26
  153. package/src/installs/vscode.md +1002 -0
  154. package/src/installs/wget.js +415 -0
  155. package/src/installs/wget.md +791 -0
  156. package/src/installs/whatsapp.js +710 -25
  157. package/src/installs/whatsapp.md +854 -0
  158. package/src/installs/winpty.js +352 -0
  159. package/src/installs/winpty.md +620 -0
  160. package/src/installs/woff2.js +535 -26
  161. package/src/installs/woff2.md +977 -0
  162. package/src/installs/wsl.js +572 -0
  163. package/src/installs/wsl.md +699 -0
  164. package/src/installs/xcode-clt.js +520 -0
  165. package/src/installs/xcode-clt.md +351 -0
  166. package/src/installs/xcode.js +542 -26
  167. package/src/installs/xcode.md +573 -0
  168. package/src/installs/yarn.js +806 -26
  169. package/src/installs/yarn.md +1074 -0
  170. package/src/installs/yq.js +636 -26
  171. package/src/installs/yq.md +944 -0
  172. package/src/installs/yt-dlp.js +683 -26
  173. package/src/installs/yt-dlp.md +946 -0
  174. package/src/installs/yum-utils.js +297 -0
  175. package/src/installs/yum-utils.md +648 -0
  176. package/src/installs/zoom.js +740 -25
  177. package/src/installs/zoom.md +884 -0
  178. package/src/scripts/README.md +567 -45
  179. package/src/scripts/STATUS.md +208 -0
  180. package/src/scripts/afk.js +395 -7
  181. package/src/scripts/backup-all.js +731 -9
  182. package/src/scripts/backup-source.js +711 -8
  183. package/src/scripts/brewd.js +373 -7
  184. package/src/scripts/brewi.js +505 -9
  185. package/src/scripts/brewr.js +512 -9
  186. package/src/scripts/brews.js +462 -9
  187. package/src/scripts/brewu.js +488 -7
  188. package/src/scripts/c.js +185 -7
  189. package/src/scripts/ccurl.js +325 -8
  190. package/src/scripts/certbot-crontab-init.js +488 -8
  191. package/src/scripts/certbot-init.js +641 -9
  192. package/src/scripts/ch.js +339 -7
  193. package/src/scripts/claude-danger.js +253 -8
  194. package/src/scripts/clean-dev.js +419 -8
  195. package/src/scripts/clear-dns-cache.js +525 -7
  196. package/src/scripts/clone.js +417 -7
  197. package/src/scripts/code-all.js +420 -7
  198. package/src/scripts/count-files.js +195 -8
  199. package/src/scripts/count-folders.js +195 -8
  200. package/src/scripts/count.js +248 -8
  201. package/src/scripts/d.js +203 -7
  202. package/src/scripts/datauri.js +373 -8
  203. package/src/scripts/delete-files.js +363 -7
  204. package/src/scripts/docker-clean.js +410 -8
  205. package/src/scripts/dp.js +426 -7
  206. package/src/scripts/e.js +375 -9
  207. package/src/scripts/empty-trash.js +497 -7
  208. package/src/scripts/evm.js +428 -9
  209. package/src/scripts/fetch-github-repos.js +441 -10
  210. package/src/scripts/get-channel.js +329 -8
  211. package/src/scripts/get-course.js +384 -11
  212. package/src/scripts/get-dependencies.js +290 -9
  213. package/src/scripts/get-folder.js +783 -10
  214. package/src/scripts/get-tunes.js +411 -10
  215. package/src/scripts/get-video.js +352 -9
  216. package/src/scripts/git-backup.js +561 -9
  217. package/src/scripts/git-clone.js +477 -9
  218. package/src/scripts/git-pup.js +303 -7
  219. package/src/scripts/git-push.js +380 -8
  220. package/src/scripts/h.js +607 -9
  221. package/src/scripts/hide-desktop-icons.js +483 -7
  222. package/src/scripts/hide-hidden-files.js +522 -7
  223. package/src/scripts/install-dependencies-from.js +440 -9
  224. package/src/scripts/ips.js +647 -10
  225. package/src/scripts/iso.js +354 -8
  226. package/src/scripts/killni.js +561 -7
  227. package/src/scripts/ll.js +451 -8
  228. package/src/scripts/local-ip.js +310 -8
  229. package/src/scripts/m.js +508 -8
  230. package/src/scripts/map.js +293 -8
  231. package/src/scripts/mkd.js +287 -7
  232. package/src/scripts/ncu-update-all.js +441 -8
  233. package/src/scripts/nginx-init.js +702 -12
  234. package/src/scripts/npmi.js +366 -7
  235. package/src/scripts/o.js +495 -8
  236. package/src/scripts/org-by-date.js +321 -7
  237. package/src/scripts/p.js +208 -7
  238. package/src/scripts/packages.js +313 -8
  239. package/src/scripts/path.js +209 -7
  240. package/src/scripts/ports.js +582 -8
  241. package/src/scripts/q.js +290 -8
  242. package/src/scripts/refresh-files.js +378 -10
  243. package/src/scripts/remove-smaller-files.js +500 -8
  244. package/src/scripts/rename-files-with-date.js +517 -9
  245. package/src/scripts/resize-image.js +523 -9
  246. package/src/scripts/rm-safe.js +653 -8
  247. package/src/scripts/s.js +525 -9
  248. package/src/scripts/set-git-public.js +349 -7
  249. package/src/scripts/show-desktop-icons.js +459 -7
  250. package/src/scripts/show-hidden-files.js +456 -7
  251. package/src/scripts/tpa.js +265 -8
  252. package/src/scripts/tpo.js +264 -7
  253. package/src/scripts/u.js +489 -7
  254. package/src/scripts/vpush.js +422 -8
  255. package/src/scripts/y.js +267 -7
  256. package/src/utils/common/os.js +94 -2
  257. package/src/utils/ubuntu/apt.js +13 -7
  258. package/src/utils/windows/choco.js +82 -26
  259. package/src/utils/windows/winget.js +89 -27
@@ -1,24 +1,380 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview Delete files matching a pattern.
4
+ * delete-files - Delete files matching a pattern from the current directory
5
+ *
6
+ * Migrated from legacy dotfiles alias.
7
+ * Original:
8
+ * delete-files() {
9
+ * local q="${1:-*.DS_Store}"
10
+ * find . -type f -name "$q" -ls -delete
11
+ * }
12
+ *
13
+ * This script recursively searches the current directory for files matching
14
+ * the specified glob pattern and deletes them. By default, it removes .DS_Store
15
+ * files, which are macOS metadata files that often clutter repositories.
16
+ *
17
+ * Usage:
18
+ * delete-files # Delete all .DS_Store files (default)
19
+ * delete-files "*.log" # Delete all .log files
20
+ * delete-files "*.tmp" # Delete all .tmp files
21
+ * delete-files ".thumbs.db" # Delete specific filename
22
+ *
5
23
  * @module scripts/delete-files
6
24
  */
7
25
 
26
+ const os = require('../utils/common/os');
27
+ const fs = require('fs');
28
+ const path = require('path');
29
+
30
+ /**
31
+ * Converts a simple glob pattern to a regular expression.
32
+ *
33
+ * This handles basic glob patterns commonly used in file matching:
34
+ * - * matches any characters (except path separators)
35
+ * - ? matches a single character
36
+ * - Other special regex characters are escaped
37
+ *
38
+ * @param {string} pattern - The glob pattern (e.g., "*.log", "test?.txt")
39
+ * @returns {RegExp} A regular expression that matches the pattern
40
+ *
41
+ * @example
42
+ * const regex = globToRegex("*.log");
43
+ * regex.test("debug.log"); // true
44
+ * regex.test("file.txt"); // false
45
+ */
46
+ function globToRegex(pattern) {
47
+ // Escape special regex characters, then convert glob wildcards to regex
48
+ const escaped = pattern
49
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex special chars
50
+ .replace(/\*/g, '.*') // * becomes .*
51
+ .replace(/\?/g, '.'); // ? becomes .
52
+ return new RegExp(`^${escaped}$`);
53
+ }
54
+
55
+ /**
56
+ * Recursively finds all files in a directory that match a given pattern.
57
+ *
58
+ * This function walks the directory tree starting from the given directory
59
+ * and collects all files whose names match the specified glob pattern.
60
+ * It handles errors gracefully (e.g., permission denied) and continues
61
+ * processing other directories.
62
+ *
63
+ * @param {string} dir - The directory to search in (absolute path)
64
+ * @param {RegExp} pattern - The regex pattern to match filenames against
65
+ * @returns {string[]} Array of absolute paths to matching files
66
+ */
67
+ function findMatchingFiles(dir, pattern) {
68
+ const matches = [];
69
+
70
+ /**
71
+ * Inner recursive function that walks the directory tree.
72
+ * @param {string} currentDir - The current directory being processed
73
+ */
74
+ function walkDir(currentDir) {
75
+ let entries;
76
+
77
+ try {
78
+ // Read directory contents with file type information
79
+ // withFileTypes is more efficient than calling stat() for each entry
80
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
81
+ } catch (error) {
82
+ // Handle permission errors or other read failures gracefully
83
+ // Common reasons: permission denied, directory deleted during scan
84
+ if (error.code !== 'ENOENT' && error.code !== 'EACCES') {
85
+ console.error(`Warning: Could not read directory ${currentDir}: ${error.message}`);
86
+ }
87
+ return;
88
+ }
89
+
90
+ for (const entry of entries) {
91
+ const fullPath = path.join(currentDir, entry.name);
92
+
93
+ if (entry.isDirectory()) {
94
+ // Recursively search subdirectories
95
+ // Skip common directories that should not be searched
96
+ // (e.g., node_modules, .git) to improve performance
97
+ if (entry.name !== 'node_modules' && entry.name !== '.git') {
98
+ walkDir(fullPath);
99
+ }
100
+ } else if (entry.isFile()) {
101
+ // Check if the filename matches the pattern
102
+ if (pattern.test(entry.name)) {
103
+ matches.push(fullPath);
104
+ }
105
+ }
106
+ // Note: Symlinks, sockets, and other special files are ignored
107
+ }
108
+ }
109
+
110
+ walkDir(dir);
111
+ return matches;
112
+ }
113
+
114
+ /**
115
+ * Formats file size for human-readable output.
116
+ *
117
+ * Converts bytes to a human-readable string with appropriate units
118
+ * (B, KB, MB, GB). This mimics the size display from `ls -l`.
119
+ *
120
+ * @param {number} bytes - The size in bytes
121
+ * @returns {string} Human-readable size string
122
+ *
123
+ * @example
124
+ * formatSize(1024); // "1.0 KB"
125
+ * formatSize(1048576); // "1.0 MB"
126
+ */
127
+ function formatSize(bytes) {
128
+ if (bytes < 1024) return `${bytes} B`;
129
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
130
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
131
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
132
+ }
133
+
8
134
  /**
9
- * Finds and deletes files matching the specified pattern.
10
- * Defaults to removing .DS_Store files if no pattern is provided.
135
+ * Pure Node.js implementation that works on any platform.
136
+ *
137
+ * This function uses only Node.js built-in modules (fs, path) to:
138
+ * 1. Parse the glob pattern from arguments
139
+ * 2. Recursively find matching files
140
+ * 3. Display what will be deleted (like find -ls)
141
+ * 4. Delete each matching file
142
+ *
143
+ * This approach is preferred over shelling out to `find` because:
144
+ * - It works identically on all platforms (macOS, Linux, Windows)
145
+ * - Node.js fs operations are fast and reliable
146
+ * - We avoid shell escaping and quoting issues with special characters
147
+ * - Better error handling and reporting
11
148
  *
12
149
  * @param {string[]} args - Command line arguments
13
150
  * @param {string} [args.0] - Glob pattern to match (defaults to "*.DS_Store")
14
151
  * @returns {Promise<void>}
15
152
  */
16
- async function main(args) {
17
- // TODO: Implement pattern-based file deletion
153
+ async function do_delete_files_nodejs(args) {
154
+ // Get the pattern from arguments, default to *.DS_Store (the original behavior)
155
+ // The original bash function used: local q="${1:-*.DS_Store}"
156
+ const pattern = args[0] || '*.DS_Store';
157
+
158
+ // Start from the current working directory (like the original: find .)
159
+ const startDir = process.cwd();
160
+
161
+ // Convert the glob pattern to a regular expression for matching
162
+ const regex = globToRegex(pattern);
163
+
164
+ console.log(`Searching for files matching "${pattern}" in ${startDir}...`);
165
+ console.log('');
166
+
167
+ // Find all files matching the pattern
168
+ const matchingFiles = findMatchingFiles(startDir, regex);
169
+
170
+ // Check if any files were found
171
+ if (matchingFiles.length === 0) {
172
+ console.log(`No files matching "${pattern}" found.`);
173
+ return;
174
+ }
175
+
176
+ console.log(`Found ${matchingFiles.length} file(s) to delete:`);
177
+ console.log('');
178
+
179
+ // Track statistics
180
+ let deletedCount = 0;
181
+ let failedCount = 0;
182
+ let totalBytes = 0;
183
+
184
+ // Process each matching file
185
+ for (const filePath of matchingFiles) {
186
+ try {
187
+ // Get file stats for display (like find -ls shows file details)
188
+ const stats = fs.statSync(filePath);
189
+ const size = formatSize(stats.size);
190
+ totalBytes += stats.size;
191
+
192
+ // Display the file being deleted (mimics find -ls output)
193
+ // Show relative path for cleaner output
194
+ const relativePath = path.relative(startDir, filePath);
195
+ console.log(` ${size.padStart(10)} ${relativePath}`);
196
+
197
+ // Delete the file
198
+ fs.unlinkSync(filePath);
199
+ deletedCount++;
200
+ } catch (error) {
201
+ // Handle deletion failures (permission denied, file locked, etc.)
202
+ const relativePath = path.relative(startDir, filePath);
203
+ console.error(` Error deleting ${relativePath}: ${error.message}`);
204
+ failedCount++;
205
+ }
206
+ }
207
+
208
+ // Print summary
209
+ console.log('');
210
+ console.log('---');
211
+ console.log(`Deleted: ${deletedCount} file(s) (${formatSize(totalBytes)})`);
212
+ if (failedCount > 0) {
213
+ console.log(`Failed: ${failedCount} file(s)`);
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Deletes files matching a pattern on macOS.
219
+ *
220
+ * Uses the pure Node.js implementation since file operations work
221
+ * identically on macOS. No platform-specific code is needed.
222
+ *
223
+ * @param {string[]} args - Command line arguments
224
+ * @returns {Promise<void>}
225
+ */
226
+ async function do_delete_files_macos(args) {
227
+ return do_delete_files_nodejs(args);
228
+ }
229
+
230
+ /**
231
+ * Deletes files matching a pattern on Ubuntu.
232
+ *
233
+ * Uses the pure Node.js implementation since file operations work
234
+ * identically on Linux. No platform-specific code is needed.
235
+ *
236
+ * @param {string[]} args - Command line arguments
237
+ * @returns {Promise<void>}
238
+ */
239
+ async function do_delete_files_ubuntu(args) {
240
+ return do_delete_files_nodejs(args);
241
+ }
242
+
243
+ /**
244
+ * Deletes files matching a pattern on Raspberry Pi OS.
245
+ *
246
+ * Uses the pure Node.js implementation since file operations work
247
+ * identically on Linux. No platform-specific code is needed.
248
+ *
249
+ * @param {string[]} args - Command line arguments
250
+ * @returns {Promise<void>}
251
+ */
252
+ async function do_delete_files_raspbian(args) {
253
+ return do_delete_files_nodejs(args);
254
+ }
255
+
256
+ /**
257
+ * Deletes files matching a pattern on Amazon Linux.
258
+ *
259
+ * Uses the pure Node.js implementation since file operations work
260
+ * identically on Linux. No platform-specific code is needed.
261
+ *
262
+ * @param {string[]} args - Command line arguments
263
+ * @returns {Promise<void>}
264
+ */
265
+ async function do_delete_files_amazon_linux(args) {
266
+ return do_delete_files_nodejs(args);
267
+ }
268
+
269
+ /**
270
+ * Deletes files matching a pattern on Windows (Command Prompt).
271
+ *
272
+ * Uses the pure Node.js implementation since file operations work
273
+ * identically on Windows. No platform-specific code is needed.
274
+ *
275
+ * Note: On Windows, .DS_Store files are less common (they're macOS-specific),
276
+ * but users may want to clean them up after receiving files from Mac users.
277
+ *
278
+ * @param {string[]} args - Command line arguments
279
+ * @returns {Promise<void>}
280
+ */
281
+ async function do_delete_files_cmd(args) {
282
+ return do_delete_files_nodejs(args);
283
+ }
284
+
285
+ /**
286
+ * Deletes files matching a pattern on Windows (PowerShell).
287
+ *
288
+ * Uses the pure Node.js implementation since file operations work
289
+ * identically on Windows. No platform-specific code is needed.
290
+ *
291
+ * @param {string[]} args - Command line arguments
292
+ * @returns {Promise<void>}
293
+ */
294
+ async function do_delete_files_powershell(args) {
295
+ return do_delete_files_nodejs(args);
296
+ }
297
+
298
+ /**
299
+ * Deletes files matching a pattern in Git Bash on Windows.
300
+ *
301
+ * Uses the pure Node.js implementation since file operations work
302
+ * identically regardless of the shell being used. No platform-specific
303
+ * code is needed.
304
+ *
305
+ * @param {string[]} args - Command line arguments
306
+ * @returns {Promise<void>}
307
+ */
308
+ async function do_delete_files_gitbash(args) {
309
+ return do_delete_files_nodejs(args);
310
+ }
311
+
312
+ /**
313
+ * Main entry point - detects environment and executes appropriate implementation.
314
+ *
315
+ * The "delete-files" command recursively finds and deletes files matching a
316
+ * glob pattern. This is commonly used to clean up unwanted files like:
317
+ * - .DS_Store (macOS metadata files)
318
+ * - *.log (log files)
319
+ * - *.tmp (temporary files)
320
+ * - Thumbs.db (Windows thumbnail cache)
321
+ *
322
+ * The command is idempotent - running it multiple times produces the same
323
+ * result (no files matching the pattern exist). If no files match, it
324
+ * simply reports that no files were found.
325
+ *
326
+ * @param {string[]} args - Command line arguments
327
+ * @param {string} [args.0] - Glob pattern (defaults to "*.DS_Store")
328
+ * @returns {Promise<void>}
329
+ */
330
+ async function do_delete_files(args) {
331
+ const platform = os.detect();
332
+
333
+ const handlers = {
334
+ 'macos': do_delete_files_macos,
335
+ 'ubuntu': do_delete_files_ubuntu,
336
+ 'debian': do_delete_files_ubuntu,
337
+ 'raspbian': do_delete_files_raspbian,
338
+ 'amazon_linux': do_delete_files_amazon_linux,
339
+ 'rhel': do_delete_files_amazon_linux,
340
+ 'fedora': do_delete_files_ubuntu,
341
+ 'linux': do_delete_files_ubuntu,
342
+ 'wsl': do_delete_files_ubuntu,
343
+ 'cmd': do_delete_files_cmd,
344
+ 'windows': do_delete_files_cmd,
345
+ 'powershell': do_delete_files_powershell,
346
+ 'gitbash': do_delete_files_gitbash
347
+ };
348
+
349
+ const handler = handlers[platform.type];
350
+ if (!handler) {
351
+ console.error(`Platform '${platform.type}' is not supported for this command.`);
352
+ console.error('');
353
+ console.error('Supported platforms:');
354
+ console.error(' - macOS');
355
+ console.error(' - Ubuntu, Debian, and other Linux distributions');
356
+ console.error(' - Raspberry Pi OS');
357
+ console.error(' - Amazon Linux, RHEL, Fedora');
358
+ console.error(' - Windows (CMD, PowerShell, Git Bash)');
359
+ process.exit(1);
360
+ }
361
+
362
+ await handler(args);
18
363
  }
19
364
 
20
- module.exports = { main };
365
+ module.exports = {
366
+ main: do_delete_files,
367
+ do_delete_files,
368
+ do_delete_files_nodejs,
369
+ do_delete_files_macos,
370
+ do_delete_files_ubuntu,
371
+ do_delete_files_raspbian,
372
+ do_delete_files_amazon_linux,
373
+ do_delete_files_cmd,
374
+ do_delete_files_powershell,
375
+ do_delete_files_gitbash
376
+ };
21
377
 
22
378
  if (require.main === module) {
23
- main(process.argv.slice(2));
379
+ do_delete_files(process.argv.slice(2));
24
380
  }