@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,23 +1,382 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview Remove node_modules and reinstall dependencies.
4
+ * npmi - Remove node_modules and reinstall dependencies
5
+ *
6
+ * Migrated from legacy dotfiles alias.
7
+ * Original:
8
+ * npmi() {
9
+ * if [ ! -f "$PWD/package.json" ]; then
10
+ * echo "Not an NPM package folder."
11
+ * return 1
12
+ * fi
13
+ * if [ -e "$PWD/node_modules" ]; then
14
+ * echo "Removing old node_modules folder..."
15
+ * eval "rm -rf $PWD/node_modules"
16
+ * if [ -e "$PWD/node_modules" ]; then
17
+ * echo "... failure!"
18
+ * return 1
19
+ * else
20
+ * echo "... done."
21
+ * fi
22
+ * fi
23
+ * echo "Setting Node v18 and installing..."
24
+ * export NVM_DIR=$HOME/.nvm;
25
+ * source $NVM_DIR/nvm.sh;
26
+ * eval "nvm use 18 && npm i"
27
+ * if [ -e "$PWD/node_modules" ]; then
28
+ * echo "... done."
29
+ * else
30
+ * echo "... failure!"
31
+ * return 1
32
+ * fi
33
+ * }
34
+ *
35
+ * This script provides a clean reinstall of npm dependencies by:
36
+ * 1. Verifying the current directory contains a package.json
37
+ * 2. Removing the existing node_modules folder if present
38
+ * 3. Running npm install to reinstall all dependencies
39
+ *
40
+ * Note: The original script used nvm to set Node v18, but since this script
41
+ * runs in Node.js 22+, we skip the nvm step and use the current Node version.
42
+ * If you need a specific Node version, use nvm manually before running this.
43
+ *
5
44
  * @module scripts/npmi
6
45
  */
7
46
 
47
+ const os = require('../utils/common/os');
48
+ const fs = require('fs');
49
+ const path = require('path');
50
+ const { execSync, spawnSync } = require('child_process');
51
+
52
+ /**
53
+ * Recursively removes a directory and all its contents.
54
+ * This is a pure Node.js implementation that works on all platforms.
55
+ *
56
+ * We use fs.rmSync with recursive option (available in Node.js 14.14+).
57
+ * This is more reliable than shelling out to 'rm -rf' because:
58
+ * - Works identically on all platforms (macOS, Linux, Windows)
59
+ * - Handles permission issues with better error messages
60
+ * - No shell injection vulnerabilities
61
+ *
62
+ * @param {string} dirPath - Absolute path to the directory to remove
63
+ * @returns {boolean} True if removal succeeded or directory didn't exist
64
+ */
65
+ function removeDirectory(dirPath) {
66
+ try {
67
+ if (!fs.existsSync(dirPath)) {
68
+ // Directory doesn't exist, nothing to remove
69
+ return true;
70
+ }
71
+
72
+ // Use recursive removal - works on all platforms
73
+ fs.rmSync(dirPath, { recursive: true, force: true });
74
+
75
+ // Verify removal succeeded
76
+ return !fs.existsSync(dirPath);
77
+ } catch (error) {
78
+ console.error(`Error removing directory: ${error.message}`);
79
+ return false;
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Detects the package manager to use based on lock files in the project.
85
+ * This allows the script to work with npm, yarn, or pnpm projects.
86
+ *
87
+ * Detection order (first found wins):
88
+ * 1. pnpm-lock.yaml -> pnpm
89
+ * 2. yarn.lock -> yarn
90
+ * 3. package-lock.json or none -> npm (default)
91
+ *
92
+ * @param {string} projectDir - Path to the project directory
93
+ * @returns {string} The package manager command to use ('npm', 'yarn', or 'pnpm')
94
+ */
95
+ function detectPackageManager(projectDir) {
96
+ // Check for pnpm
97
+ if (fs.existsSync(path.join(projectDir, 'pnpm-lock.yaml'))) {
98
+ return 'pnpm';
99
+ }
100
+
101
+ // Check for yarn
102
+ if (fs.existsSync(path.join(projectDir, 'yarn.lock'))) {
103
+ return 'yarn';
104
+ }
105
+
106
+ // Default to npm (includes package-lock.json or no lock file)
107
+ return 'npm';
108
+ }
109
+
110
+ /**
111
+ * Checks if a command is available in the system PATH.
112
+ *
113
+ * @param {string} cmd - The command to check
114
+ * @returns {boolean} True if the command exists
115
+ */
116
+ function isCommandAvailable(cmd) {
117
+ try {
118
+ const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
119
+ execSync(checkCmd, { stdio: 'ignore' });
120
+ return true;
121
+ } catch {
122
+ return false;
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Pure Node.js implementation that works on any platform.
128
+ *
129
+ * This function handles the core logic of npmi:
130
+ * 1. Validate that package.json exists
131
+ * 2. Remove node_modules if it exists
132
+ * 3. Run the appropriate package manager install command
133
+ * 4. Verify that node_modules was created
134
+ *
135
+ * All file operations use Node.js native APIs (fs module).
136
+ * Only the package manager execution requires spawning a child process,
137
+ * which is unavoidable since we need to run npm/yarn/pnpm.
138
+ *
139
+ * @param {string[]} args - Command line arguments (unused)
140
+ * @returns {Promise<void>}
141
+ */
142
+ async function do_npmi_nodejs(args) {
143
+ const cwd = process.cwd();
144
+ const packageJsonPath = path.join(cwd, 'package.json');
145
+ const nodeModulesPath = path.join(cwd, 'node_modules');
146
+
147
+ // Step 1: Check if package.json exists
148
+ if (!fs.existsSync(packageJsonPath)) {
149
+ console.error('Not an NPM package folder.');
150
+ console.error('No package.json found in the current directory.');
151
+ process.exit(1);
152
+ }
153
+
154
+ // Step 2: Remove node_modules if it exists
155
+ if (fs.existsSync(nodeModulesPath)) {
156
+ console.log('Removing old node_modules folder...');
157
+
158
+ const removed = removeDirectory(nodeModulesPath);
159
+ if (!removed) {
160
+ console.error('... failure!');
161
+ console.error('Could not remove node_modules folder.');
162
+ console.error('');
163
+ console.error('Try closing any editors or processes that may have files open,');
164
+ console.error('then run the command again.');
165
+ process.exit(1);
166
+ }
167
+ console.log('... done.');
168
+ }
169
+
170
+ // Step 3: Detect package manager and install dependencies
171
+ const packageManager = detectPackageManager(cwd);
172
+
173
+ // Verify the package manager is available
174
+ if (!isCommandAvailable(packageManager)) {
175
+ console.error(`Error: ${packageManager} is not installed or not in PATH.`);
176
+ console.error('');
177
+ if (packageManager === 'pnpm') {
178
+ console.error('Install pnpm with: npm install -g pnpm');
179
+ } else if (packageManager === 'yarn') {
180
+ console.error('Install yarn with: npm install -g yarn');
181
+ } else {
182
+ console.error('npm should be installed with Node.js. Check your Node installation.');
183
+ }
184
+ process.exit(1);
185
+ }
186
+
187
+ console.log(`Installing dependencies with ${packageManager}...`);
188
+
189
+ // Run the install command
190
+ // We use spawnSync with stdio: 'inherit' to show real-time output
191
+ const installResult = spawnSync(packageManager, ['install'], {
192
+ cwd: cwd,
193
+ stdio: 'inherit',
194
+ shell: true // Required for Windows to find npm/yarn/pnpm
195
+ });
196
+
197
+ if (installResult.error) {
198
+ console.error(`... failure!`);
199
+ console.error(`Error running ${packageManager} install: ${installResult.error.message}`);
200
+ process.exit(1);
201
+ }
202
+
203
+ if (installResult.status !== 0) {
204
+ console.error(`... failure!`);
205
+ console.error(`${packageManager} install exited with code ${installResult.status}`);
206
+ process.exit(1);
207
+ }
208
+
209
+ // Step 4: Verify node_modules was created
210
+ if (fs.existsSync(nodeModulesPath)) {
211
+ console.log('... done.');
212
+ } else {
213
+ // This can happen if there are no dependencies in package.json
214
+ // which is valid, so we just note it rather than failing
215
+ console.log('... done (note: no node_modules created, package.json may have no dependencies).');
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Remove node_modules and reinstall dependencies on macOS.
221
+ *
222
+ * macOS uses the same Node.js implementation as all other platforms.
223
+ * File operations and npm/yarn/pnpm work identically.
224
+ *
225
+ * @param {string[]} args - Command line arguments (unused)
226
+ * @returns {Promise<void>}
227
+ */
228
+ async function do_npmi_macos(args) {
229
+ return do_npmi_nodejs(args);
230
+ }
231
+
232
+ /**
233
+ * Remove node_modules and reinstall dependencies on Ubuntu.
234
+ *
235
+ * Ubuntu uses the same Node.js implementation as all other platforms.
236
+ * File operations and npm/yarn/pnpm work identically.
237
+ *
238
+ * @param {string[]} args - Command line arguments (unused)
239
+ * @returns {Promise<void>}
240
+ */
241
+ async function do_npmi_ubuntu(args) {
242
+ return do_npmi_nodejs(args);
243
+ }
244
+
8
245
  /**
9
- * Removes the node_modules folder and reinstalls all dependencies
10
- * using the detected package manager (npm, yarn, or pnpm).
246
+ * Remove node_modules and reinstall dependencies on Raspberry Pi OS.
247
+ *
248
+ * Raspberry Pi OS uses the same Node.js implementation as all other platforms.
249
+ * File operations and npm/yarn/pnpm work identically.
11
250
  *
12
251
  * @param {string[]} args - Command line arguments (unused)
13
252
  * @returns {Promise<void>}
14
253
  */
15
- async function main(args) {
16
- // TODO: Implement clean reinstall
254
+ async function do_npmi_raspbian(args) {
255
+ return do_npmi_nodejs(args);
256
+ }
257
+
258
+ /**
259
+ * Remove node_modules and reinstall dependencies on Amazon Linux.
260
+ *
261
+ * Amazon Linux uses the same Node.js implementation as all other platforms.
262
+ * File operations and npm/yarn/pnpm work identically.
263
+ *
264
+ * @param {string[]} args - Command line arguments (unused)
265
+ * @returns {Promise<void>}
266
+ */
267
+ async function do_npmi_amazon_linux(args) {
268
+ return do_npmi_nodejs(args);
269
+ }
270
+
271
+ /**
272
+ * Remove node_modules and reinstall dependencies on Windows (CMD).
273
+ *
274
+ * Windows CMD uses the same Node.js implementation as all other platforms.
275
+ * The fs.rmSync function handles Windows-specific path separators and
276
+ * file locking issues automatically.
277
+ *
278
+ * @param {string[]} args - Command line arguments (unused)
279
+ * @returns {Promise<void>}
280
+ */
281
+ async function do_npmi_cmd(args) {
282
+ return do_npmi_nodejs(args);
283
+ }
284
+
285
+ /**
286
+ * Remove node_modules and reinstall dependencies on Windows (PowerShell).
287
+ *
288
+ * Windows PowerShell uses the same Node.js implementation as all other platforms.
289
+ * The fs.rmSync function handles Windows-specific path separators and
290
+ * file locking issues automatically.
291
+ *
292
+ * @param {string[]} args - Command line arguments (unused)
293
+ * @returns {Promise<void>}
294
+ */
295
+ async function do_npmi_powershell(args) {
296
+ return do_npmi_nodejs(args);
297
+ }
298
+
299
+ /**
300
+ * Remove node_modules and reinstall dependencies on Windows (Git Bash).
301
+ *
302
+ * Git Bash uses the same Node.js implementation as all other platforms.
303
+ * The fs.rmSync function handles Windows-specific path separators and
304
+ * file locking issues automatically.
305
+ *
306
+ * @param {string[]} args - Command line arguments (unused)
307
+ * @returns {Promise<void>}
308
+ */
309
+ async function do_npmi_gitbash(args) {
310
+ return do_npmi_nodejs(args);
311
+ }
312
+
313
+ /**
314
+ * Main entry point - detects environment and executes appropriate implementation.
315
+ *
316
+ * The "npmi" command provides a clean reinstall of npm dependencies:
317
+ * 1. Verifies the current directory is a Node.js project (has package.json)
318
+ * 2. Removes the node_modules folder if it exists
319
+ * 3. Detects the package manager (npm, yarn, or pnpm) from lock files
320
+ * 4. Runs the install command
321
+ * 5. Verifies dependencies were installed
322
+ *
323
+ * This is useful when:
324
+ * - You want to ensure a fresh install of all dependencies
325
+ * - You're experiencing issues with corrupted or outdated packages
326
+ * - You've made significant changes to package.json
327
+ * - You want to verify the project installs correctly from scratch
328
+ *
329
+ * @param {string[]} args - Command line arguments (unused)
330
+ * @returns {Promise<void>}
331
+ */
332
+ async function do_npmi(args) {
333
+ const platform = os.detect();
334
+
335
+ const handlers = {
336
+ 'macos': do_npmi_macos,
337
+ 'ubuntu': do_npmi_ubuntu,
338
+ 'debian': do_npmi_ubuntu,
339
+ 'raspbian': do_npmi_raspbian,
340
+ 'amazon_linux': do_npmi_amazon_linux,
341
+ 'rhel': do_npmi_amazon_linux,
342
+ 'fedora': do_npmi_ubuntu,
343
+ 'linux': do_npmi_ubuntu,
344
+ 'wsl': do_npmi_ubuntu,
345
+ 'cmd': do_npmi_cmd,
346
+ 'windows': do_npmi_cmd,
347
+ 'powershell': do_npmi_powershell,
348
+ 'gitbash': do_npmi_gitbash
349
+ };
350
+
351
+ const handler = handlers[platform.type];
352
+ if (!handler) {
353
+ console.error(`Platform '${platform.type}' is not supported for this command.`);
354
+ console.error('');
355
+ console.error('Supported platforms:');
356
+ console.error(' - macOS');
357
+ console.error(' - Ubuntu, Debian, and other Linux distributions');
358
+ console.error(' - Raspberry Pi OS');
359
+ console.error(' - Amazon Linux, RHEL, Fedora');
360
+ console.error(' - Windows (CMD, PowerShell, Git Bash)');
361
+ process.exit(1);
362
+ }
363
+
364
+ await handler(args);
17
365
  }
18
366
 
19
- module.exports = { main };
367
+ module.exports = {
368
+ main: do_npmi,
369
+ do_npmi,
370
+ do_npmi_nodejs,
371
+ do_npmi_macos,
372
+ do_npmi_ubuntu,
373
+ do_npmi_raspbian,
374
+ do_npmi_amazon_linux,
375
+ do_npmi_cmd,
376
+ do_npmi_powershell,
377
+ do_npmi_gitbash
378
+ };
20
379
 
21
380
  if (require.main === module) {
22
- main(process.argv.slice(2));
381
+ do_npmi(process.argv.slice(2));
23
382
  }