@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,44 +1,400 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview Install jq.
4
+ * @fileoverview Install jq - a lightweight and flexible command-line JSON processor.
5
+ *
6
+ * jq is designed to parse, filter, map, and transform structured JSON data with ease.
7
+ * Think of jq as sed or awk for JSON data - it allows you to slice, filter, and
8
+ * transform JSON with concise filter expressions. jq is essential for developers
9
+ * and DevOps engineers working with JSON-based APIs, configuration files, or any
10
+ * structured data.
11
+ *
5
12
  * @module installs/jq
6
13
  */
7
14
 
8
15
  const os = require('../utils/common/os');
16
+ const shell = require('../utils/common/shell');
17
+ const brew = require('../utils/macos/brew');
18
+ const apt = require('../utils/ubuntu/apt');
19
+ const choco = require('../utils/windows/choco');
20
+
21
+ /**
22
+ * Install jq on macOS using Homebrew.
23
+ *
24
+ * This function installs jq via Homebrew, which is the recommended method for
25
+ * macOS. Homebrew will automatically install the oniguruma dependency (a regular
26
+ * expressions library) if it is not already present.
27
+ *
28
+ * @returns {Promise<void>}
29
+ */
30
+ async function install_macos() {
31
+ // Check if Homebrew is available - it is required for macOS installation
32
+ if (!brew.isInstalled()) {
33
+ console.log('Homebrew is not installed. Please install Homebrew first.');
34
+ console.log('Run: dev install homebrew');
35
+ return;
36
+ }
37
+
38
+ // Check if jq is already installed by verifying the command exists
39
+ // Unlike cURL, jq is not pre-installed on macOS, so we can check the command directly
40
+ const isInstalled = shell.commandExists('jq');
41
+ if (isInstalled) {
42
+ console.log('jq is already installed, skipping...');
43
+ return;
44
+ }
45
+
46
+ // Install jq using Homebrew with the --quiet flag to suppress non-essential output
47
+ // This makes the command more suitable for automation scripts and CI/CD pipelines
48
+ console.log('Installing jq via Homebrew...');
49
+ const result = await brew.install('jq');
50
+
51
+ if (!result.success) {
52
+ console.log('Failed to install jq via Homebrew.');
53
+ console.log(result.output);
54
+ return;
55
+ }
56
+
57
+ // Verify the installation succeeded by checking if the command now exists
58
+ const verified = shell.commandExists('jq');
59
+ if (!verified) {
60
+ console.log('Installation may have failed: jq command not found after install.');
61
+ return;
62
+ }
63
+
64
+ console.log('jq installed successfully.');
65
+ }
66
+
67
+ /**
68
+ * Install jq on Ubuntu/Debian using APT.
69
+ *
70
+ * jq is available in the default Ubuntu and Debian repositories, so no
71
+ * additional PPAs or repositories are required. The repository version may
72
+ * be slightly older than the latest release, but is stable and recommended
73
+ * for most users.
74
+ *
75
+ * @returns {Promise<void>}
76
+ */
77
+ async function install_ubuntu() {
78
+ // Check if jq is already installed by looking for the command
79
+ const isInstalled = shell.commandExists('jq');
80
+ if (isInstalled) {
81
+ console.log('jq is already installed, skipping...');
82
+ return;
83
+ }
84
+
85
+ // Update package lists before installing to ensure we get the latest available version
86
+ console.log('Updating package lists...');
87
+ const updateResult = await apt.update();
88
+ if (!updateResult.success) {
89
+ console.log('Warning: Failed to update package lists. Continuing with installation...');
90
+ }
91
+
92
+ // Install jq using APT
93
+ // The apt.install function uses DEBIAN_FRONTEND=noninteractive and -y flag
94
+ // to ensure fully automated installation without prompts
95
+ console.log('Installing jq via APT...');
96
+ const result = await apt.install('jq');
97
+
98
+ if (!result.success) {
99
+ console.log('Failed to install jq via APT.');
100
+ console.log(result.output);
101
+ return;
102
+ }
103
+
104
+ // Verify the installation succeeded by checking if the command exists
105
+ const verified = shell.commandExists('jq');
106
+ if (!verified) {
107
+ console.log('Installation may have failed: jq command not found after install.');
108
+ return;
109
+ }
110
+
111
+ console.log('jq installed successfully.');
112
+ }
113
+
114
+ /**
115
+ * Install jq on Ubuntu running in WSL.
116
+ *
117
+ * WSL Ubuntu installations follow the same process as native Ubuntu using APT.
118
+ * This function delegates to install_ubuntu() because WSL provides a full
119
+ * Ubuntu environment with APT package management.
120
+ *
121
+ * @returns {Promise<void>}
122
+ */
123
+ async function install_ubuntu_wsl() {
124
+ // WSL Ubuntu uses the same APT-based installation as native Ubuntu
125
+ await install_ubuntu();
126
+ }
9
127
 
10
128
  /**
11
- * Install jq across supported platforms.
129
+ * Install jq on Raspberry Pi OS using APT.
130
+ *
131
+ * Raspberry Pi OS is based on Debian, so jq installation follows the same
132
+ * process as Ubuntu/Debian. The jq package is available for both 32-bit (armv7l)
133
+ * and 64-bit (aarch64) ARM architectures.
134
+ *
135
+ * @returns {Promise<void>}
136
+ */
137
+ async function install_raspbian() {
138
+ // Raspberry Pi OS uses the same APT-based installation as Ubuntu/Debian
139
+ await install_ubuntu();
140
+ }
141
+
142
+ /**
143
+ * Install jq on Amazon Linux using DNF or YUM.
144
+ *
145
+ * jq is available in the default Amazon Linux repositories. This function
146
+ * automatically detects whether to use dnf (Amazon Linux 2023) or yum
147
+ * (Amazon Linux 2) based on the available package manager.
148
+ *
149
+ * @returns {Promise<void>}
150
+ */
151
+ async function install_amazon_linux() {
152
+ // Check if jq is already installed by looking for the command
153
+ const isInstalled = shell.commandExists('jq');
154
+ if (isInstalled) {
155
+ console.log('jq is already installed, skipping...');
156
+ return;
157
+ }
158
+
159
+ // Detect the platform to determine which package manager to use
160
+ // Amazon Linux 2023 uses dnf, Amazon Linux 2 uses yum
161
+ const platform = os.detect();
162
+ const packageManager = platform.packageManager;
163
+
164
+ // Construct the install command based on available package manager
165
+ // The -y flag automatically confirms installation prompts for non-interactive execution
166
+ const installCommand = packageManager === 'dnf'
167
+ ? 'sudo dnf install -y jq'
168
+ : 'sudo yum install -y jq';
169
+
170
+ // Install jq
171
+ console.log(`Installing jq via ${packageManager}...`);
172
+ const result = await shell.exec(installCommand);
173
+
174
+ if (result.code !== 0) {
175
+ console.log(`Failed to install jq via ${packageManager}.`);
176
+ console.log(result.stderr || result.stdout);
177
+ return;
178
+ }
179
+
180
+ // Verify the installation succeeded by checking if the command exists
181
+ const verified = shell.commandExists('jq');
182
+ if (!verified) {
183
+ console.log('Installation may have failed: jq command not found after install.');
184
+ return;
185
+ }
186
+
187
+ console.log('jq installed successfully.');
188
+ }
189
+
190
+ /**
191
+ * Install jq on Windows using Chocolatey.
192
+ *
193
+ * This function installs jq via Chocolatey, which downloads the appropriate
194
+ * binary (32-bit or 64-bit) based on system architecture and adds it to the
195
+ * PATH automatically. A new terminal window may be required for PATH updates
196
+ * to take effect.
197
+ *
198
+ * @returns {Promise<void>}
199
+ */
200
+ async function install_windows() {
201
+ // Check if Chocolatey is available - it is required for Windows installation
202
+ if (!choco.isInstalled()) {
203
+ console.log('Chocolatey is not installed. Please install Chocolatey first.');
204
+ console.log('Run: dev install chocolatey');
205
+ return;
206
+ }
207
+
208
+ // Check if jq is already installed via Chocolatey
209
+ const isChocoJqInstalled = await choco.isPackageInstalled('jq');
210
+ if (isChocoJqInstalled) {
211
+ console.log('jq is already installed via Chocolatey, skipping...');
212
+ return;
213
+ }
214
+
215
+ // Also check if jq command exists (might be installed via other means like winget)
216
+ const commandExists = shell.commandExists('jq');
217
+ if (commandExists) {
218
+ console.log('jq is already installed, skipping...');
219
+ return;
220
+ }
221
+
222
+ // Install jq using Chocolatey
223
+ // The -y flag automatically confirms all prompts for fully non-interactive installation
224
+ console.log('Installing jq via Chocolatey...');
225
+ const result = await choco.install('jq');
226
+
227
+ if (!result.success) {
228
+ console.log('Failed to install jq via Chocolatey.');
229
+ console.log(result.output);
230
+ return;
231
+ }
232
+
233
+ // Verify the installation succeeded by checking if the package is now installed
234
+ const verified = await choco.isPackageInstalled('jq');
235
+ if (!verified) {
236
+ console.log('Installation may have failed: jq package not found after install.');
237
+ return;
238
+ }
239
+
240
+ console.log('jq installed successfully via Chocolatey.');
241
+ console.log('');
242
+ console.log('Note: You may need to open a new terminal window for the PATH update to take effect.');
243
+ }
244
+
245
+ /**
246
+ * Install jq on Git Bash (Windows).
247
+ *
248
+ * Git Bash does not include jq by default. This function downloads the Windows
249
+ * binary directly from the official jq GitHub releases and places it in
250
+ * /usr/local/bin, which is included in Git Bash's PATH.
251
+ *
252
+ * @returns {Promise<void>}
253
+ */
254
+ async function install_gitbash() {
255
+ // Check if jq is already available in Git Bash
256
+ const isInstalled = shell.commandExists('jq');
257
+ if (isInstalled) {
258
+ console.log('jq is already installed, skipping...');
259
+ return;
260
+ }
261
+
262
+ // Create the /usr/local/bin directory if it does not exist
263
+ // This directory is typically in Git Bash's PATH
264
+ console.log('Creating /usr/local/bin directory if needed...');
265
+ const mkdirResult = await shell.exec('mkdir -p /usr/local/bin');
266
+ if (mkdirResult.code !== 0) {
267
+ console.log('Failed to create /usr/local/bin directory.');
268
+ console.log('Try running Git Bash as Administrator.');
269
+ return;
270
+ }
271
+
272
+ // Download the jq Windows binary from the official GitHub releases
273
+ // Using version 1.8.1 as specified in the documentation
274
+ console.log('Downloading jq from GitHub releases...');
275
+ const downloadUrl = 'https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-windows-amd64.exe';
276
+ const downloadCommand = `curl -L -o /usr/local/bin/jq.exe "${downloadUrl}"`;
277
+ const downloadResult = await shell.exec(downloadCommand);
278
+
279
+ if (downloadResult.code !== 0) {
280
+ console.log('Failed to download jq binary.');
281
+ console.log(downloadResult.stderr || downloadResult.stdout);
282
+ console.log('');
283
+ console.log('If you encounter SSL certificate errors, try running:');
284
+ console.log(' curl -k -L -o /usr/local/bin/jq.exe "' + downloadUrl + '"');
285
+ return;
286
+ }
287
+
288
+ // Verify the installation succeeded by checking if the command now exists
289
+ const verified = shell.commandExists('jq');
290
+ if (!verified) {
291
+ console.log('Installation may have failed: jq command not found after install.');
292
+ console.log('');
293
+ console.log('The /usr/local/bin directory may not be in your PATH. Add it manually:');
294
+ console.log(' echo \'export PATH="/usr/local/bin:$PATH"\' >> ~/.bashrc && source ~/.bashrc');
295
+ return;
296
+ }
297
+
298
+ console.log('jq installed successfully.');
299
+ }
300
+
301
+ /**
302
+ * Check if jq is installed on the current platform.
303
+ *
304
+ * On macOS, checks if the jq formula is installed via Homebrew.
305
+ * On Windows, checks if jq is installed via Chocolatey.
306
+ * On Linux and Git Bash, checks if the jq command exists.
307
+ *
308
+ * @returns {Promise<boolean>} True if installed, false otherwise
309
+ */
310
+ async function isInstalled() {
311
+ const platform = os.detect();
312
+
313
+ if (platform.type === 'macos') {
314
+ return brew.isFormulaInstalled('jq');
315
+ }
316
+
317
+ if (platform.type === 'windows') {
318
+ return choco.isPackageInstalled('jq');
319
+ }
320
+
321
+ // Linux and Git Bash: Check if jq command exists
322
+ return shell.commandExists('jq');
323
+ }
324
+
325
+ /**
326
+ * Check if this installer is supported on the current platform.
327
+ * jq is supported on all major platforms.
328
+ * @returns {boolean} True if installation is supported on this platform
329
+ */
330
+ function isEligible() {
331
+ const platform = os.detect();
332
+ return ['macos', 'ubuntu', 'debian', 'wsl', 'raspbian', 'amazon_linux', 'fedora', 'rhel', 'windows', 'gitbash'].includes(platform.type);
333
+ }
334
+
335
+ /**
336
+ * Main installation entry point - detects platform and runs appropriate installer.
337
+ *
338
+ * This function detects the current operating system and dispatches to the
339
+ * appropriate platform-specific installer function. Supported platforms:
340
+ * - macOS (Homebrew)
341
+ * - Ubuntu/Debian (APT)
342
+ * - Ubuntu on WSL (APT)
343
+ * - Raspberry Pi OS (APT)
344
+ * - Amazon Linux/RHEL (DNF/YUM)
345
+ * - Windows (Chocolatey)
346
+ * - Git Bash (Manual download from GitHub)
12
347
  *
13
348
  * @returns {Promise<void>}
14
349
  */
15
350
  async function install() {
16
351
  const platform = os.detect();
17
352
 
18
- switch (platform.type) {
19
- case 'macos':
20
- // TODO: Implement macOS installation
21
- break;
22
- case 'debian':
23
- // TODO: Implement Debian/Ubuntu installation
24
- break;
25
- case 'rhel':
26
- // TODO: Implement RHEL/Amazon Linux installation
27
- break;
28
- case 'windows-wsl':
29
- // TODO: Implement WSL installation
30
- break;
31
- case 'windows':
32
- // TODO: Implement Windows installation
33
- break;
34
- default:
35
- console.error(`Unsupported platform: ${platform.type}`);
36
- process.exit(1);
37
- }
38
- }
39
-
40
- module.exports = { install };
353
+ // Map platform types to their corresponding installer functions
354
+ // Multiple platform types can map to the same installer (e.g., debian and ubuntu)
355
+ const installers = {
356
+ 'macos': install_macos,
357
+ 'ubuntu': install_ubuntu,
358
+ 'debian': install_ubuntu,
359
+ 'wsl': install_ubuntu_wsl,
360
+ 'raspbian': install_raspbian,
361
+ 'amazon_linux': install_amazon_linux,
362
+ 'fedora': install_amazon_linux,
363
+ 'rhel': install_amazon_linux,
364
+ 'windows': install_windows,
365
+ 'gitbash': install_gitbash,
366
+ };
367
+
368
+ // Look up the installer for the detected platform
369
+ const installer = installers[platform.type];
370
+
371
+ // If no installer exists for this platform, inform the user gracefully
372
+ // Do not throw an error - just log a message and return
373
+ if (!installer) {
374
+ console.log(`jq is not available for ${platform.type}.`);
375
+ return;
376
+ }
377
+
378
+ // Run the platform-specific installer
379
+ await installer();
380
+ }
381
+
382
+ module.exports = {
383
+ install,
384
+ isInstalled,
385
+ isEligible,
386
+ install_macos,
387
+ install_ubuntu,
388
+ install_ubuntu_wsl,
389
+ install_raspbian,
390
+ install_amazon_linux,
391
+ install_windows,
392
+ install_gitbash,
393
+ };
41
394
 
42
395
  if (require.main === module) {
43
- install();
396
+ install().catch(err => {
397
+ console.error(err.message);
398
+ process.exit(1);
399
+ });
44
400
  }