@fredlackey/devutils 0.0.18 → 0.1.0

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 (447) hide show
  1. package/README.md +214 -141
  2. package/package.json +8 -83
  3. package/src/api/loader.js +229 -0
  4. package/src/api/registry.json +62 -0
  5. package/src/cli.js +293 -60
  6. package/src/commands/ai/index.js +16 -0
  7. package/src/commands/ai/launch.js +112 -0
  8. package/src/commands/ai/list.js +54 -0
  9. package/src/commands/ai/resume.js +70 -0
  10. package/src/commands/ai/sessions.js +121 -0
  11. package/src/commands/ai/set.js +131 -0
  12. package/src/commands/ai/show.js +74 -0
  13. package/src/commands/ai/tools.js +46 -0
  14. package/src/commands/alias/add.js +93 -0
  15. package/src/commands/alias/helpers.js +107 -0
  16. package/src/commands/alias/index.js +14 -0
  17. package/src/commands/alias/list.js +55 -0
  18. package/src/commands/alias/remove.js +62 -0
  19. package/src/commands/alias/sync.js +109 -0
  20. package/src/commands/api/disable.js +73 -0
  21. package/src/commands/api/enable.js +148 -0
  22. package/src/commands/api/index.js +15 -0
  23. package/src/commands/api/list.js +66 -0
  24. package/src/commands/api/update.js +87 -0
  25. package/src/commands/auth/index.js +15 -0
  26. package/src/commands/auth/list.js +49 -0
  27. package/src/commands/auth/login.js +384 -0
  28. package/src/commands/auth/logout.js +111 -0
  29. package/src/commands/auth/refresh.js +184 -0
  30. package/src/commands/auth/services.js +169 -0
  31. package/src/commands/auth/status.js +104 -0
  32. package/src/commands/config/export.js +224 -0
  33. package/src/commands/config/get.js +52 -0
  34. package/src/commands/config/import.js +308 -0
  35. package/src/commands/config/index.js +17 -0
  36. package/src/commands/config/init.js +143 -0
  37. package/src/commands/config/reset.js +57 -0
  38. package/src/commands/config/set.js +93 -0
  39. package/src/commands/config/show.js +35 -0
  40. package/src/commands/help.js +338 -0
  41. package/src/commands/identity/add.js +133 -0
  42. package/src/commands/identity/index.js +17 -0
  43. package/src/commands/identity/link.js +76 -0
  44. package/src/commands/identity/list.js +48 -0
  45. package/src/commands/identity/remove.js +72 -0
  46. package/src/commands/identity/show.js +65 -0
  47. package/src/commands/identity/sync.js +172 -0
  48. package/src/commands/identity/unlink.js +57 -0
  49. package/src/commands/ignore/add.js +165 -0
  50. package/src/commands/ignore/index.js +14 -0
  51. package/src/commands/ignore/list.js +89 -0
  52. package/src/commands/ignore/markers.js +43 -0
  53. package/src/commands/ignore/remove.js +164 -0
  54. package/src/commands/ignore/show.js +169 -0
  55. package/src/commands/machine/detect.js +122 -0
  56. package/src/commands/machine/index.js +14 -0
  57. package/src/commands/machine/list.js +74 -0
  58. package/src/commands/machine/set.js +106 -0
  59. package/src/commands/machine/show.js +35 -0
  60. package/src/commands/schema.js +152 -0
  61. package/src/commands/search/collections.js +134 -0
  62. package/src/commands/search/get.js +71 -0
  63. package/src/commands/search/index-cmd.js +54 -0
  64. package/src/commands/search/index.js +21 -0
  65. package/src/commands/search/keyword.js +60 -0
  66. package/src/commands/search/qmd.js +70 -0
  67. package/src/commands/search/query.js +64 -0
  68. package/src/commands/search/semantic.js +62 -0
  69. package/src/commands/search/status.js +46 -0
  70. package/src/commands/status.js +224 -171
  71. package/src/commands/tools/check.js +79 -0
  72. package/src/commands/tools/index.js +14 -0
  73. package/src/commands/tools/install.js +110 -0
  74. package/src/commands/tools/list.js +91 -0
  75. package/src/commands/tools/search.js +60 -0
  76. package/src/commands/update.js +83 -112
  77. package/src/commands/util/add.js +151 -0
  78. package/src/commands/util/index.js +15 -0
  79. package/src/commands/util/list.js +97 -0
  80. package/src/commands/util/remove.js +76 -0
  81. package/src/commands/util/run.js +79 -0
  82. package/src/commands/util/show.js +67 -0
  83. package/src/commands/version.js +21 -88
  84. package/src/installers/_template.js +104 -0
  85. package/src/installers/git.js +150 -0
  86. package/src/installers/homebrew.js +190 -0
  87. package/src/installers/node.js +223 -0
  88. package/src/installers/registry.json +29 -0
  89. package/src/lib/config.js +125 -0
  90. package/src/lib/detect.js +74 -0
  91. package/src/lib/errors.js +114 -0
  92. package/src/lib/github.js +315 -0
  93. package/src/lib/installer.js +225 -0
  94. package/src/lib/output.js +239 -0
  95. package/src/lib/platform.js +112 -0
  96. package/src/lib/platforms/amazon-linux.js +41 -0
  97. package/src/lib/platforms/gitbash.js +46 -0
  98. package/src/lib/platforms/macos.js +45 -0
  99. package/src/lib/platforms/raspbian.js +41 -0
  100. package/src/lib/platforms/ubuntu.js +39 -0
  101. package/src/lib/platforms/windows.js +45 -0
  102. package/src/lib/prompt.js +161 -0
  103. package/src/lib/schema.js +211 -0
  104. package/src/lib/shell.js +75 -0
  105. package/src/patterns/gitignore/claude-code.txt +25 -0
  106. package/src/patterns/gitignore/docker.txt +15 -0
  107. package/src/patterns/gitignore/go.txt +24 -0
  108. package/src/patterns/gitignore/java.txt +38 -0
  109. package/src/patterns/gitignore/jetbrains.txt +26 -0
  110. package/src/patterns/gitignore/linux.txt +18 -0
  111. package/src/patterns/gitignore/macos.txt +27 -0
  112. package/src/patterns/gitignore/node.txt +51 -0
  113. package/src/patterns/gitignore/python.txt +55 -0
  114. package/src/patterns/gitignore/rust.txt +14 -0
  115. package/src/patterns/gitignore/terraform.txt +30 -0
  116. package/src/patterns/gitignore/vscode.txt +15 -0
  117. package/src/patterns/gitignore/windows.txt +25 -0
  118. package/src/utils/clone/index.js +165 -0
  119. package/src/utils/git-push/index.js +230 -0
  120. package/src/utils/git-status/index.js +116 -0
  121. package/src/utils/git-status/unix.sh +75 -0
  122. package/src/utils/registry.json +41 -0
  123. package/bin/dev.js +0 -16
  124. package/files/README.md +0 -0
  125. package/files/claude/.claude/commands/setup-context.md +0 -3
  126. package/files/monorepos/_archive/README.md +0 -36
  127. package/files/monorepos/_legacy/README.md +0 -36
  128. package/files/monorepos/ai-docs/README.md +0 -33
  129. package/files/monorepos/apps/README.md +0 -24
  130. package/files/monorepos/docs/README.md +0 -40
  131. package/files/monorepos/packages/README.md +0 -25
  132. package/files/monorepos/research/README.md +0 -29
  133. package/files/monorepos/scripts/README.md +0 -24
  134. package/src/commands/README.md +0 -41
  135. package/src/commands/configure.js +0 -199
  136. package/src/commands/identity.js +0 -1630
  137. package/src/commands/ignore.js +0 -247
  138. package/src/commands/install.js +0 -526
  139. package/src/commands/setup.js +0 -246
  140. package/src/completion.js +0 -284
  141. package/src/constants.js +0 -45
  142. package/src/ignore/claude-code.txt +0 -10
  143. package/src/ignore/docker.txt +0 -18
  144. package/src/ignore/linux.txt +0 -23
  145. package/src/ignore/macos.txt +0 -36
  146. package/src/ignore/node.txt +0 -55
  147. package/src/ignore/terraform.txt +0 -37
  148. package/src/ignore/vscode.txt +0 -18
  149. package/src/ignore/windows.txt +0 -35
  150. package/src/index.js +0 -0
  151. package/src/installs/README.md +0 -399
  152. package/src/installs/adobe-creative-cloud.js +0 -546
  153. package/src/installs/adobe-creative-cloud.md +0 -605
  154. package/src/installs/appcleaner.js +0 -321
  155. package/src/installs/appcleaner.md +0 -699
  156. package/src/installs/apt-transport-https.js +0 -390
  157. package/src/installs/apt-transport-https.md +0 -678
  158. package/src/installs/atomicparsley.js +0 -642
  159. package/src/installs/atomicparsley.md +0 -795
  160. package/src/installs/aws-cli.js +0 -797
  161. package/src/installs/aws-cli.md +0 -727
  162. package/src/installs/balena-etcher.js +0 -710
  163. package/src/installs/balena-etcher.md +0 -761
  164. package/src/installs/bambu-studio.js +0 -1143
  165. package/src/installs/bambu-studio.md +0 -780
  166. package/src/installs/bash-completion.js +0 -575
  167. package/src/installs/bash-completion.md +0 -833
  168. package/src/installs/bash.js +0 -417
  169. package/src/installs/bash.md +0 -993
  170. package/src/installs/beyond-compare.js +0 -603
  171. package/src/installs/beyond-compare.md +0 -813
  172. package/src/installs/brave-browser.js +0 -968
  173. package/src/installs/brave-browser.md +0 -650
  174. package/src/installs/build-essential.js +0 -529
  175. package/src/installs/build-essential.md +0 -977
  176. package/src/installs/ca-certificates.js +0 -618
  177. package/src/installs/ca-certificates.md +0 -937
  178. package/src/installs/caffeine.js +0 -508
  179. package/src/installs/caffeine.md +0 -839
  180. package/src/installs/camtasia.js +0 -596
  181. package/src/installs/camtasia.md +0 -762
  182. package/src/installs/chatgpt.js +0 -476
  183. package/src/installs/chatgpt.md +0 -814
  184. package/src/installs/chocolatey.js +0 -456
  185. package/src/installs/chocolatey.md +0 -661
  186. package/src/installs/chrome-canary.js +0 -419
  187. package/src/installs/chrome-canary.md +0 -641
  188. package/src/installs/chromium.js +0 -667
  189. package/src/installs/chromium.md +0 -838
  190. package/src/installs/claude-code.js +0 -576
  191. package/src/installs/claude-code.md +0 -1173
  192. package/src/installs/cloudflare-warp.js +0 -900
  193. package/src/installs/cloudflare-warp.md +0 -1047
  194. package/src/installs/comet-browser.js +0 -588
  195. package/src/installs/comet-browser.md +0 -731
  196. package/src/installs/curl.js +0 -379
  197. package/src/installs/curl.md +0 -714
  198. package/src/installs/cursor.js +0 -579
  199. package/src/installs/cursor.md +0 -970
  200. package/src/installs/dbeaver.js +0 -924
  201. package/src/installs/dbeaver.md +0 -939
  202. package/src/installs/dbschema.js +0 -692
  203. package/src/installs/dbschema.md +0 -925
  204. package/src/installs/dependencies.md +0 -453
  205. package/src/installs/development-tools.js +0 -600
  206. package/src/installs/development-tools.md +0 -977
  207. package/src/installs/docker.js +0 -1029
  208. package/src/installs/docker.md +0 -1109
  209. package/src/installs/drawio.js +0 -1019
  210. package/src/installs/drawio.md +0 -795
  211. package/src/installs/elmedia-player.js +0 -347
  212. package/src/installs/elmedia-player.md +0 -556
  213. package/src/installs/ffmpeg.js +0 -889
  214. package/src/installs/ffmpeg.md +0 -852
  215. package/src/installs/file.js +0 -464
  216. package/src/installs/file.md +0 -987
  217. package/src/installs/gemini-cli.js +0 -811
  218. package/src/installs/gemini-cli.md +0 -1153
  219. package/src/installs/git.js +0 -400
  220. package/src/installs/git.md +0 -907
  221. package/src/installs/gitego.js +0 -949
  222. package/src/installs/gitego.md +0 -1172
  223. package/src/installs/go.js +0 -931
  224. package/src/installs/go.md +0 -958
  225. package/src/installs/google-antigravity.js +0 -913
  226. package/src/installs/google-antigravity.md +0 -1075
  227. package/src/installs/google-chrome.js +0 -833
  228. package/src/installs/google-chrome.md +0 -862
  229. package/src/installs/gpg.js +0 -480
  230. package/src/installs/gpg.md +0 -1056
  231. package/src/installs/homebrew.js +0 -1028
  232. package/src/installs/homebrew.md +0 -988
  233. package/src/installs/imageoptim.js +0 -968
  234. package/src/installs/imageoptim.md +0 -1119
  235. package/src/installs/installers.json +0 -4032
  236. package/src/installs/installers.json.tmp +0 -3953
  237. package/src/installs/jq.js +0 -400
  238. package/src/installs/jq.md +0 -809
  239. package/src/installs/keyboard-maestro.js +0 -719
  240. package/src/installs/keyboard-maestro.md +0 -825
  241. package/src/installs/kiro.js +0 -864
  242. package/src/installs/kiro.md +0 -1015
  243. package/src/installs/latex.js +0 -789
  244. package/src/installs/latex.md +0 -1095
  245. package/src/installs/lftp.js +0 -356
  246. package/src/installs/lftp.md +0 -907
  247. package/src/installs/lsb-release.js +0 -346
  248. package/src/installs/lsb-release.md +0 -814
  249. package/src/installs/messenger.js +0 -847
  250. package/src/installs/messenger.md +0 -900
  251. package/src/installs/microsoft-office.js +0 -568
  252. package/src/installs/microsoft-office.md +0 -760
  253. package/src/installs/microsoft-teams.js +0 -801
  254. package/src/installs/microsoft-teams.md +0 -886
  255. package/src/installs/moom.js +0 -326
  256. package/src/installs/moom.md +0 -570
  257. package/src/installs/node.js +0 -904
  258. package/src/installs/node.md +0 -1153
  259. package/src/installs/nordpass.js +0 -716
  260. package/src/installs/nordpass.md +0 -921
  261. package/src/installs/nordvpn.js +0 -892
  262. package/src/installs/nordvpn.md +0 -1052
  263. package/src/installs/nvm.js +0 -995
  264. package/src/installs/nvm.md +0 -1057
  265. package/src/installs/ohmyzsh.js +0 -529
  266. package/src/installs/ohmyzsh.md +0 -1094
  267. package/src/installs/openssh.js +0 -804
  268. package/src/installs/openssh.md +0 -1056
  269. package/src/installs/pandoc.js +0 -662
  270. package/src/installs/pandoc.md +0 -1036
  271. package/src/installs/parallels-desktop.js +0 -431
  272. package/src/installs/parallels-desktop.md +0 -446
  273. package/src/installs/pinentry.js +0 -510
  274. package/src/installs/pinentry.md +0 -1142
  275. package/src/installs/pngyu.js +0 -869
  276. package/src/installs/pngyu.md +0 -896
  277. package/src/installs/postman.js +0 -799
  278. package/src/installs/postman.md +0 -940
  279. package/src/installs/procps.js +0 -425
  280. package/src/installs/procps.md +0 -851
  281. package/src/installs/safari-tech-preview.js +0 -374
  282. package/src/installs/safari-tech-preview.md +0 -533
  283. package/src/installs/sfnt2woff.js +0 -658
  284. package/src/installs/sfnt2woff.md +0 -795
  285. package/src/installs/shellcheck.js +0 -481
  286. package/src/installs/shellcheck.md +0 -1005
  287. package/src/installs/slack.js +0 -741
  288. package/src/installs/slack.md +0 -865
  289. package/src/installs/snagit.js +0 -585
  290. package/src/installs/snagit.md +0 -844
  291. package/src/installs/software-properties-common.js +0 -372
  292. package/src/installs/software-properties-common.md +0 -805
  293. package/src/installs/spotify.js +0 -877
  294. package/src/installs/spotify.md +0 -901
  295. package/src/installs/studio-3t.js +0 -823
  296. package/src/installs/studio-3t.md +0 -918
  297. package/src/installs/sublime-text.js +0 -804
  298. package/src/installs/sublime-text.md +0 -914
  299. package/src/installs/superwhisper.js +0 -706
  300. package/src/installs/superwhisper.md +0 -630
  301. package/src/installs/tailscale.js +0 -745
  302. package/src/installs/tailscale.md +0 -1100
  303. package/src/installs/tar.js +0 -389
  304. package/src/installs/tar.md +0 -946
  305. package/src/installs/termius.js +0 -798
  306. package/src/installs/termius.md +0 -844
  307. package/src/installs/terraform.js +0 -779
  308. package/src/installs/terraform.md +0 -899
  309. package/src/installs/tfenv.js +0 -778
  310. package/src/installs/tfenv.md +0 -1091
  311. package/src/installs/tidal.js +0 -771
  312. package/src/installs/tidal.md +0 -864
  313. package/src/installs/tmux.js +0 -346
  314. package/src/installs/tmux.md +0 -1030
  315. package/src/installs/tree.js +0 -411
  316. package/src/installs/tree.md +0 -833
  317. package/src/installs/unzip.js +0 -460
  318. package/src/installs/unzip.md +0 -879
  319. package/src/installs/vim.js +0 -421
  320. package/src/installs/vim.md +0 -1040
  321. package/src/installs/vlc.js +0 -821
  322. package/src/installs/vlc.md +0 -927
  323. package/src/installs/vscode.js +0 -843
  324. package/src/installs/vscode.md +0 -1002
  325. package/src/installs/wget.js +0 -420
  326. package/src/installs/wget.md +0 -791
  327. package/src/installs/whatsapp.js +0 -729
  328. package/src/installs/whatsapp.md +0 -854
  329. package/src/installs/winpty.js +0 -352
  330. package/src/installs/winpty.md +0 -620
  331. package/src/installs/woff2.js +0 -553
  332. package/src/installs/woff2.md +0 -977
  333. package/src/installs/wsl.js +0 -572
  334. package/src/installs/wsl.md +0 -699
  335. package/src/installs/xcode-clt.js +0 -520
  336. package/src/installs/xcode-clt.md +0 -351
  337. package/src/installs/xcode.js +0 -560
  338. package/src/installs/xcode.md +0 -573
  339. package/src/installs/yarn.js +0 -824
  340. package/src/installs/yarn.md +0 -1074
  341. package/src/installs/yq.js +0 -654
  342. package/src/installs/yq.md +0 -944
  343. package/src/installs/yt-dlp.js +0 -701
  344. package/src/installs/yt-dlp.md +0 -946
  345. package/src/installs/yum-utils.js +0 -297
  346. package/src/installs/yum-utils.md +0 -648
  347. package/src/installs/zoom.js +0 -759
  348. package/src/installs/zoom.md +0 -884
  349. package/src/installs/zsh.js +0 -455
  350. package/src/installs/zsh.md +0 -1008
  351. package/src/scripts/README.md +0 -617
  352. package/src/scripts/STATUS.md +0 -208
  353. package/src/scripts/afk.js +0 -411
  354. package/src/scripts/backup-all.js +0 -746
  355. package/src/scripts/backup-source.js +0 -727
  356. package/src/scripts/brewd.js +0 -389
  357. package/src/scripts/brewi.js +0 -520
  358. package/src/scripts/brewr.js +0 -527
  359. package/src/scripts/brews.js +0 -477
  360. package/src/scripts/brewu.js +0 -504
  361. package/src/scripts/c.js +0 -201
  362. package/src/scripts/ccurl.js +0 -341
  363. package/src/scripts/certbot-crontab-init.js +0 -504
  364. package/src/scripts/certbot-init.js +0 -657
  365. package/src/scripts/ch.js +0 -355
  366. package/src/scripts/claude-danger.js +0 -268
  367. package/src/scripts/clean-dev.js +0 -435
  368. package/src/scripts/clear-dns-cache.js +0 -541
  369. package/src/scripts/clone.js +0 -435
  370. package/src/scripts/code-all.js +0 -437
  371. package/src/scripts/count-files.js +0 -211
  372. package/src/scripts/count-folders.js +0 -211
  373. package/src/scripts/count.js +0 -264
  374. package/src/scripts/d.js +0 -219
  375. package/src/scripts/datauri.js +0 -389
  376. package/src/scripts/delete-files.js +0 -380
  377. package/src/scripts/docker-clean.js +0 -426
  378. package/src/scripts/dp.js +0 -442
  379. package/src/scripts/e.js +0 -390
  380. package/src/scripts/empty-trash.js +0 -513
  381. package/src/scripts/evm.js +0 -444
  382. package/src/scripts/fetch-github-repos.js +0 -456
  383. package/src/scripts/get-channel.js +0 -345
  384. package/src/scripts/get-course.js +0 -399
  385. package/src/scripts/get-dependencies.js +0 -306
  386. package/src/scripts/get-folder.js +0 -799
  387. package/src/scripts/get-tunes.js +0 -426
  388. package/src/scripts/get-video.js +0 -367
  389. package/src/scripts/git-backup.js +0 -577
  390. package/src/scripts/git-clone.js +0 -493
  391. package/src/scripts/git-pup.js +0 -319
  392. package/src/scripts/git-push.js +0 -396
  393. package/src/scripts/h.js +0 -622
  394. package/src/scripts/hide-desktop-icons.js +0 -499
  395. package/src/scripts/hide-hidden-files.js +0 -538
  396. package/src/scripts/install-dependencies-from.js +0 -456
  397. package/src/scripts/ips.js +0 -663
  398. package/src/scripts/iso.js +0 -370
  399. package/src/scripts/killni.js +0 -577
  400. package/src/scripts/ll.js +0 -467
  401. package/src/scripts/local-ip.js +0 -325
  402. package/src/scripts/m.js +0 -524
  403. package/src/scripts/map.js +0 -309
  404. package/src/scripts/mkd.js +0 -351
  405. package/src/scripts/ncu-update-all.js +0 -457
  406. package/src/scripts/nginx-init.js +0 -718
  407. package/src/scripts/npmi.js +0 -382
  408. package/src/scripts/o.js +0 -511
  409. package/src/scripts/org-by-date.js +0 -338
  410. package/src/scripts/p.js +0 -224
  411. package/src/scripts/packages.js +0 -330
  412. package/src/scripts/path.js +0 -225
  413. package/src/scripts/ports.js +0 -597
  414. package/src/scripts/q.js +0 -305
  415. package/src/scripts/refresh-files.js +0 -394
  416. package/src/scripts/remove-smaller-files.js +0 -516
  417. package/src/scripts/rename-files-with-date.js +0 -533
  418. package/src/scripts/resize-image.js +0 -539
  419. package/src/scripts/rm-safe.js +0 -669
  420. package/src/scripts/s.js +0 -540
  421. package/src/scripts/set-git-public.js +0 -365
  422. package/src/scripts/show-desktop-icons.js +0 -475
  423. package/src/scripts/show-hidden-files.js +0 -472
  424. package/src/scripts/tpa.js +0 -280
  425. package/src/scripts/tpo.js +0 -280
  426. package/src/scripts/u.js +0 -505
  427. package/src/scripts/vpush.js +0 -437
  428. package/src/scripts/y.js +0 -283
  429. package/src/utils/README.md +0 -95
  430. package/src/utils/common/apps.js +0 -143
  431. package/src/utils/common/display.js +0 -157
  432. package/src/utils/common/network.js +0 -185
  433. package/src/utils/common/os.js +0 -294
  434. package/src/utils/common/package-manager.js +0 -301
  435. package/src/utils/common/privileges.js +0 -138
  436. package/src/utils/common/shell.js +0 -261
  437. package/src/utils/macos/apps.js +0 -228
  438. package/src/utils/macos/brew.js +0 -315
  439. package/src/utils/ubuntu/apt.js +0 -307
  440. package/src/utils/ubuntu/desktop.js +0 -292
  441. package/src/utils/ubuntu/snap.js +0 -344
  442. package/src/utils/ubuntu/systemd.js +0 -286
  443. package/src/utils/windows/choco.js +0 -465
  444. package/src/utils/windows/env.js +0 -246
  445. package/src/utils/windows/registry.js +0 -269
  446. package/src/utils/windows/shell.js +0 -240
  447. package/src/utils/windows/winget.js +0 -489
@@ -1,618 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * @fileoverview Install CA Certificates - trusted Certificate Authority certificates.
5
- *
6
- * CA certificates (Certificate Authority certificates) are digital certificates
7
- * that establish a chain of trust for SSL/TLS connections. They are used by
8
- * web browsers, command-line tools like cURL and wget, programming languages,
9
- * and other applications to verify that secure connections to remote servers
10
- * are legitimate and not being intercepted by malicious actors.
11
- *
12
- * CA certificates are essential for:
13
- * - Secure web browsing (HTTPS)
14
- * - Package manager operations (downloading from secure repositories)
15
- * - API calls from applications
16
- * - Git operations over HTTPS
17
- * - Email encryption (TLS)
18
- * - VPN connections
19
- *
20
- * Platform-specific packages and tools:
21
- * - macOS: Homebrew ca-certificates formula (Mozilla CA bundle for CLI tools)
22
- * - Ubuntu/Debian/Raspbian: ca-certificates package via APT + update-ca-certificates
23
- * - Amazon Linux/RHEL: ca-certificates package via DNF/YUM + update-ca-trust
24
- * - Windows: Windows Certificate Store (managed via certutil)
25
- * - WSL: ca-certificates package via APT (same as Ubuntu)
26
- * - Git Bash: CA bundle bundled with Git for Windows
27
- *
28
- * @module installs/ca-certificates
29
- */
30
-
31
- const os = require('../utils/common/os');
32
- const shell = require('../utils/common/shell');
33
- const brew = require('../utils/macos/brew');
34
- const apt = require('../utils/ubuntu/apt');
35
-
36
- // -----------------------------------------------------------------------------
37
- // Helper Functions
38
- // -----------------------------------------------------------------------------
39
-
40
- /**
41
- * Checks if the ca-certificates package is installed on Debian-based systems.
42
- * Uses dpkg to query the package installation status.
43
- *
44
- * @returns {Promise<boolean>} True if ca-certificates is installed via APT
45
- */
46
- async function isDebianCaCertsInstalled() {
47
- return await apt.isPackageInstalled('ca-certificates');
48
- }
49
-
50
- /**
51
- * Checks if the certificate bundle file exists on Debian-based systems.
52
- * The bundle file at /etc/ssl/certs/ca-certificates.crt contains all
53
- * trusted CA certificates concatenated together.
54
- *
55
- * @returns {Promise<boolean>} True if the certificate bundle file exists
56
- */
57
- async function doesDebianCertBundleExist() {
58
- const result = await shell.exec('test -f /etc/ssl/certs/ca-certificates.crt');
59
- return result.code === 0;
60
- }
61
-
62
- /**
63
- * Checks if the certificate bundle file exists on RHEL-based systems.
64
- * The actual bundle file is at /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
65
- * (with a symlink at /etc/pki/tls/certs/ca-bundle.crt for compatibility).
66
- * We check the actual file location since the symlink may be missing even when
67
- * the bundle exists.
68
- *
69
- * @returns {Promise<boolean>} True if the certificate bundle file exists
70
- */
71
- async function doesRhelCertBundleExist() {
72
- // Check the actual bundle file location, not the symlink
73
- const result = await shell.exec('test -f /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem');
74
- return result.code === 0;
75
- }
76
-
77
- // -----------------------------------------------------------------------------
78
- // Platform-Specific Installation Functions
79
- // -----------------------------------------------------------------------------
80
-
81
- /**
82
- * Install CA certificates on macOS using Homebrew.
83
- *
84
- * macOS maintains CA certificates in two locations:
85
- * 1. System Keychain - Used by Safari, native macOS applications, and system services
86
- * 2. Homebrew ca-certificates - Used by Homebrew-installed tools like cURL, OpenSSL, and Python
87
- *
88
- * This function installs the Mozilla CA certificate bundle via Homebrew, which
89
- * provides certificates for command-line tools. The certificate bundle is sourced
90
- * from Mozilla (via https://curl.se/docs/caextract.html) and is regularly updated.
91
- *
92
- * Note: System applications use the macOS Keychain, not Homebrew's ca-certificates.
93
- * Use Keychain Access or the security command to manage system-wide certificates.
94
- *
95
- * @returns {Promise<void>}
96
- */
97
- async function install_macos() {
98
- // Check if Homebrew is available - it is required for macOS installation
99
- if (!brew.isInstalled()) {
100
- console.log('Homebrew is not installed. Please install Homebrew first.');
101
- console.log('Run: dev install homebrew');
102
- return;
103
- }
104
-
105
- // Check if ca-certificates is already installed via Homebrew
106
- const isBrewCaCertsInstalled = await brew.isFormulaInstalled('ca-certificates');
107
- if (isBrewCaCertsInstalled) {
108
- console.log('CA certificates are already installed via Homebrew, skipping...');
109
- return;
110
- }
111
-
112
- // Install ca-certificates using Homebrew
113
- // The --quiet flag suppresses non-essential output for cleaner automation
114
- console.log('Installing CA certificates via Homebrew...');
115
- const result = await brew.install('ca-certificates');
116
-
117
- if (!result.success) {
118
- console.log('Failed to install CA certificates via Homebrew.');
119
- console.log(result.output);
120
- return;
121
- }
122
-
123
- // Verify the installation succeeded by checking if the formula is now installed
124
- const verified = await brew.isFormulaInstalled('ca-certificates');
125
- if (!verified) {
126
- console.log('Installation may have failed: ca-certificates formula not found after install.');
127
- return;
128
- }
129
-
130
- console.log('CA certificates installed successfully via Homebrew.');
131
- console.log('');
132
- console.log('Note: Homebrew-installed tools will automatically use this certificate bundle.');
133
- console.log('System applications (Safari, Mail) use the macOS Keychain instead.');
134
- }
135
-
136
- /**
137
- * Install CA certificates on Ubuntu/Debian using APT.
138
- *
139
- * The ca-certificates package is typically pre-installed on Ubuntu and Debian
140
- * systems. This function ensures it is installed and up to date, then regenerates
141
- * the certificate bundle using update-ca-certificates.
142
- *
143
- * The update-ca-certificates command:
144
- * 1. Reads certificate configuration from /etc/ca-certificates.conf
145
- * 2. Processes certificates from /usr/share/ca-certificates/ and /usr/local/share/ca-certificates/
146
- * 3. Generates the unified bundle at /etc/ssl/certs/ca-certificates.crt
147
- * 4. Creates individual certificate symlinks in /etc/ssl/certs/
148
- *
149
- * @returns {Promise<void>}
150
- */
151
- async function install_ubuntu() {
152
- // Check if ca-certificates is already installed and certificate bundle exists
153
- const isInstalled = await isDebianCaCertsInstalled();
154
- const bundleExists = await doesDebianCertBundleExist();
155
-
156
- if (isInstalled && bundleExists) {
157
- console.log('CA certificates are already installed, skipping...');
158
- return;
159
- }
160
-
161
- // Update package lists before installing to ensure we get the latest version
162
- console.log('Updating package lists...');
163
- const updateResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get update -y');
164
- if (updateResult.code !== 0) {
165
- console.log('Warning: Failed to update package lists. Continuing with installation...');
166
- }
167
-
168
- // Install ca-certificates using APT with non-interactive mode
169
- console.log('Installing CA certificates via APT...');
170
- const installResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates');
171
-
172
- if (installResult.code !== 0) {
173
- console.log('Failed to install CA certificates via APT.');
174
- console.log(installResult.stderr || installResult.stdout);
175
- return;
176
- }
177
-
178
- // Regenerate the certificate bundle to ensure it is up to date
179
- // This command processes all certificates and creates the unified bundle
180
- console.log('Regenerating certificate bundle...');
181
- const updateCaResult = await shell.exec('sudo update-ca-certificates');
182
-
183
- if (updateCaResult.code !== 0) {
184
- console.log('Warning: Failed to regenerate certificate bundle.');
185
- console.log(updateCaResult.stderr || updateCaResult.stdout);
186
- }
187
-
188
- // Verify the installation succeeded by checking if the bundle file exists
189
- const verified = await doesDebianCertBundleExist();
190
- if (!verified) {
191
- console.log('Installation may have failed: certificate bundle not found after install.');
192
- return;
193
- }
194
-
195
- console.log('CA certificates installed successfully.');
196
- }
197
-
198
- /**
199
- * Install CA certificates on Ubuntu running in WSL.
200
- *
201
- * WSL Ubuntu installations follow the same process as native Ubuntu using APT.
202
- * The certificate store is separate from the Windows host, so certificates
203
- * added to Windows Certificate Store are not automatically available in WSL.
204
- *
205
- * @returns {Promise<void>}
206
- */
207
- async function install_ubuntu_wsl() {
208
- // WSL Ubuntu uses the same APT-based installation as native Ubuntu
209
- await install_ubuntu();
210
- }
211
-
212
- /**
213
- * Install CA certificates on Raspberry Pi OS using APT.
214
- *
215
- * Raspberry Pi OS is based on Debian, so CA certificates management follows
216
- * the same process as Ubuntu/Debian. The ca-certificates package is typically
217
- * pre-installed on Raspberry Pi OS.
218
- *
219
- * Note: The ca-certificates package is architecture-independent (it contains
220
- * only certificate data files, no compiled binaries), so there is no difference
221
- * between ARM and x86 installations.
222
- *
223
- * @returns {Promise<void>}
224
- */
225
- async function install_raspbian() {
226
- // Check if ca-certificates is already installed and certificate bundle exists
227
- const isInstalled = await isDebianCaCertsInstalled();
228
- const bundleExists = await doesDebianCertBundleExist();
229
-
230
- if (isInstalled && bundleExists) {
231
- console.log('CA certificates are already installed, skipping...');
232
- return;
233
- }
234
-
235
- // Update package lists before installing to ensure we get the latest version
236
- console.log('Updating package lists...');
237
- const updateResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get update -y');
238
- if (updateResult.code !== 0) {
239
- console.log('Warning: Failed to update package lists. Continuing with installation...');
240
- }
241
-
242
- // Install ca-certificates using APT with non-interactive mode
243
- console.log('Installing CA certificates via APT...');
244
- console.log('Note: Installation may take a few minutes on Raspberry Pi.');
245
- const installResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates');
246
-
247
- if (installResult.code !== 0) {
248
- console.log('Failed to install CA certificates via APT.');
249
- console.log(installResult.stderr || installResult.stdout);
250
- return;
251
- }
252
-
253
- // Regenerate the certificate bundle to ensure it is up to date
254
- console.log('Regenerating certificate bundle...');
255
- const updateCaResult = await shell.exec('sudo update-ca-certificates');
256
-
257
- if (updateCaResult.code !== 0) {
258
- console.log('Warning: Failed to regenerate certificate bundle.');
259
- console.log(updateCaResult.stderr || updateCaResult.stdout);
260
- }
261
-
262
- // Verify the installation succeeded by checking if the bundle file exists
263
- const verified = await doesDebianCertBundleExist();
264
- if (!verified) {
265
- console.log('Installation may have failed: certificate bundle not found after install.');
266
- return;
267
- }
268
-
269
- console.log('CA certificates installed successfully.');
270
- }
271
-
272
- /**
273
- * Install CA certificates on Amazon Linux/RHEL using DNF or YUM.
274
- *
275
- * The ca-certificates package is pre-installed on all Amazon Linux versions.
276
- * This function ensures it is installed and up to date, then regenerates
277
- * the certificate bundle using update-ca-trust.
278
- *
279
- * Note: Unlike Debian-based systems that use update-ca-certificates, Red Hat-based
280
- * systems (including Amazon Linux) use update-ca-trust to manage the certificate
281
- * trust store. The bundle is located at /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
282
- * (with a symlink at /etc/pki/tls/certs/ca-bundle.crt for compatibility).
283
- *
284
- * Amazon Linux 2023 uses dnf as the package manager, while Amazon Linux 2 uses yum.
285
- * This function automatically detects which package manager is available.
286
- *
287
- * @returns {Promise<void>}
288
- */
289
- async function install_amazon_linux() {
290
- // Check if the certificate bundle already exists
291
- const bundleExists = await doesRhelCertBundleExist();
292
-
293
- if (bundleExists) {
294
- // Verify the package is installed by checking if rpm can find it
295
- const rpmResult = await shell.exec('rpm -q ca-certificates');
296
- if (rpmResult.code === 0) {
297
- console.log('CA certificates are already installed, skipping...');
298
- return;
299
- }
300
- }
301
-
302
- // Detect the platform to determine which package manager to use
303
- // Amazon Linux 2023 uses dnf, Amazon Linux 2 uses yum
304
- const platform = os.detect();
305
- const packageManager = platform.packageManager;
306
-
307
- // Construct the install command based on available package manager
308
- const installCommand = packageManager === 'dnf'
309
- ? 'sudo dnf install -y ca-certificates'
310
- : 'sudo yum install -y ca-certificates';
311
-
312
- // Install ca-certificates
313
- console.log(`Installing CA certificates via ${packageManager}...`);
314
- const installResult = await shell.exec(installCommand);
315
-
316
- if (installResult.code !== 0) {
317
- console.log(`Failed to install CA certificates via ${packageManager}.`);
318
- console.log(installResult.stderr || installResult.stdout);
319
- return;
320
- }
321
-
322
- // Regenerate the certificate bundle using update-ca-trust
323
- // This command reads certificates from /etc/pki/ca-trust/source/anchors/
324
- // and generates the unified bundle at /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
325
- console.log('Regenerating certificate trust store...');
326
- const updateTrustResult = await shell.exec('sudo update-ca-trust');
327
-
328
- if (updateTrustResult.code !== 0) {
329
- console.log('Warning: Failed to regenerate certificate trust store.');
330
- console.log(updateTrustResult.stderr || updateTrustResult.stdout);
331
- }
332
-
333
- // Verify the installation succeeded by checking if the bundle file exists
334
- const verified = await doesRhelCertBundleExist();
335
- if (!verified) {
336
- console.log('Installation may have failed: certificate bundle not found after install.');
337
- return;
338
- }
339
-
340
- console.log('CA certificates installed successfully.');
341
- }
342
-
343
- /**
344
- * Install/update CA certificates on Windows.
345
- *
346
- * Windows handles CA certificates differently from Linux and macOS. There is no
347
- * "ca-certificates" package to install. Instead, Windows maintains a Certificate
348
- * Trust List (CTL) that is automatically updated through Windows Update.
349
- *
350
- * This function manually triggers an update of the root certificates by:
351
- * 1. Downloading the latest root certificate list from Microsoft
352
- * 2. Importing the certificates to the Trusted Root store
353
- *
354
- * Windows stores certificates in the Windows Certificate Store, accessible via:
355
- * - Certificate Manager (certmgr.msc) for current user certificates
356
- * - Certificate Manager (certlm.msc) for local machine certificates
357
- * - certutil command-line tool
358
- * - PowerShell certificate provider
359
- *
360
- * Note: This function must be run with Administrator privileges.
361
- *
362
- * @returns {Promise<void>}
363
- */
364
- async function install_windows() {
365
- // Check if certutil is available (it should be on all modern Windows versions)
366
- const hasCertutil = shell.commandExists('certutil');
367
- if (!hasCertutil) {
368
- console.log('certutil command not found. This is unexpected on Windows.');
369
- console.log('Please ensure you are running Windows 10 or later.');
370
- return;
371
- }
372
-
373
- // Check if certificates are already present in the Trusted Root store
374
- // A healthy Windows installation should have over 100 root certificates
375
- console.log('Checking current certificate store...');
376
- const countResult = await shell.exec('powershell -Command "(Get-ChildItem Cert:\\LocalMachine\\Root).Count"');
377
-
378
- if (countResult.code === 0) {
379
- const certCount = parseInt(countResult.stdout.trim(), 10);
380
- if (certCount > 100) {
381
- console.log(`Windows Certificate Store contains ${certCount} root certificates.`);
382
- console.log('CA certificates are already present, skipping...');
383
- return;
384
- }
385
- }
386
-
387
- // Download and import the latest root certificates from Microsoft
388
- // This command retrieves the Certificate Trust List from Windows Update servers
389
- console.log('Downloading latest root certificates from Microsoft...');
390
- const downloadResult = await shell.exec('certutil -generateSSTFromWU C:\\Windows\\Temp\\roots.sst');
391
-
392
- if (downloadResult.code !== 0) {
393
- console.log('Failed to download root certificates from Microsoft.');
394
- console.log('This may be due to network issues or Windows Update being blocked.');
395
- console.log(downloadResult.stderr || downloadResult.stdout);
396
- return;
397
- }
398
-
399
- // Import the certificates to the Trusted Root store
400
- console.log('Importing certificates to Trusted Root store...');
401
- const importResult = await shell.exec('certutil -addstore -f Root C:\\Windows\\Temp\\roots.sst');
402
-
403
- if (importResult.code !== 0) {
404
- console.log('Failed to import certificates to Trusted Root store.');
405
- console.log('Ensure you are running this command as Administrator.');
406
- console.log(importResult.stderr || importResult.stdout);
407
- // Clean up temporary file
408
- await shell.exec('del C:\\Windows\\Temp\\roots.sst');
409
- return;
410
- }
411
-
412
- // Clean up the temporary file
413
- await shell.exec('del C:\\Windows\\Temp\\roots.sst');
414
-
415
- console.log('CA certificates updated successfully.');
416
- console.log('');
417
- console.log('Note: Windows Update automatically maintains root CA certificates.');
418
- console.log('This manual update ensures you have the latest certificates immediately.');
419
- }
420
-
421
- /**
422
- * Install CA certificates on Git Bash (Windows).
423
- *
424
- * Git for Windows includes its own CA certificate bundle that is used by Git
425
- * and the bundled cURL. This bundle is separate from both the Windows Certificate
426
- * Store and any WSL certificate stores.
427
- *
428
- * The CA certificate bundle is located at:
429
- * - C:\Program Files\Git\mingw64\etc\ssl\certs\ca-bundle.crt (Git commands)
430
- * - C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt (cURL/OpenSSL)
431
- *
432
- * No separate installation is required. If the certificate bundle is missing or
433
- * needs to be updated, users can:
434
- * 1. Upgrade Git for Windows (which includes an updated certificate bundle)
435
- * 2. Configure Git to use the Windows SChannel backend instead
436
- *
437
- * @returns {Promise<void>}
438
- */
439
- async function install_gitbash() {
440
- // Check if the CA bundle file exists (it should be bundled with Git Bash)
441
- const bundleCheckResult = await shell.exec('test -f /mingw64/etc/ssl/certs/ca-bundle.crt');
442
-
443
- if (bundleCheckResult.code === 0) {
444
- console.log('CA certificates are already installed (bundled with Git for Windows), skipping...');
445
- return;
446
- }
447
-
448
- // If the bundle is missing, provide guidance
449
- console.log('CA certificate bundle not found at expected location.');
450
- console.log('');
451
- console.log('Git for Windows includes its own CA certificate bundle. If it is missing:');
452
- console.log('');
453
- console.log('Option 1: Reinstall or upgrade Git for Windows');
454
- console.log(' Download from: https://git-scm.com/download/win');
455
- console.log('');
456
- console.log('Option 2: Configure Git to use Windows Certificate Store');
457
- console.log(' git config --global http.sslBackend schannel');
458
- console.log('');
459
- console.log('Option 3: Manually download the Mozilla CA bundle');
460
- console.log(' curl -o /mingw64/etc/ssl/certs/ca-bundle.crt https://curl.se/ca/cacert.pem');
461
- }
462
-
463
- // -----------------------------------------------------------------------------
464
- // Eligibility Check
465
- // -----------------------------------------------------------------------------
466
-
467
- /**
468
- * Check if CA certificates are installed on the current platform.
469
- *
470
- * This function performs platform-specific checks to determine if CA certificates
471
- * are installed:
472
- * - macOS: Checks for ca-certificates Homebrew formula
473
- * - Linux (Debian-based): Checks for ca-certificates APT package and bundle file
474
- * - Linux (RHEL-based): Checks for ca-certificates RPM package and bundle file
475
- * - Windows/Git Bash: Checks for certificate store or bundle file
476
- *
477
- * @returns {Promise<boolean>} True if CA certificates are installed
478
- */
479
- async function isInstalled() {
480
- const platform = os.detect();
481
-
482
- // macOS: Check for ca-certificates via Homebrew
483
- if (platform.type === 'macos') {
484
- return await brew.isFormulaInstalled('ca-certificates');
485
- }
486
-
487
- // Ubuntu/Debian/WSL/Raspberry Pi: Check for package and bundle file
488
- if (['ubuntu', 'debian', 'wsl', 'raspbian'].includes(platform.type)) {
489
- const packageInstalled = await isDebianCaCertsInstalled();
490
- const bundleExists = await doesDebianCertBundleExist();
491
- return packageInstalled && bundleExists;
492
- }
493
-
494
- // Amazon Linux/RHEL/Fedora: Check for RPM package and bundle file
495
- if (['amazon_linux', 'rhel', 'fedora'].includes(platform.type)) {
496
- const rpmResult = await shell.exec('rpm -q ca-certificates 2>/dev/null');
497
- const bundleExists = await doesRhelCertBundleExist();
498
- return rpmResult.code === 0 && bundleExists;
499
- }
500
-
501
- // Windows: Check if certificate store has certificates
502
- if (platform.type === 'windows') {
503
- const countResult = await shell.exec('powershell -Command "(Get-ChildItem Cert:\\LocalMachine\\Root).Count"');
504
- if (countResult.code === 0) {
505
- const certCount = parseInt(countResult.stdout.trim(), 10);
506
- return certCount > 100;
507
- }
508
- return false;
509
- }
510
-
511
- // Git Bash: Check if CA bundle file exists
512
- if (platform.type === 'gitbash') {
513
- const bundleCheckResult = await shell.exec('test -f /mingw64/etc/ssl/certs/ca-bundle.crt');
514
- return bundleCheckResult.code === 0;
515
- }
516
-
517
- return false;
518
- }
519
-
520
- /**
521
- * Check if this installer is supported on the current platform.
522
- *
523
- * CA certificates can be installed on all supported platforms:
524
- * - macOS (Homebrew ca-certificates formula)
525
- * - Ubuntu/Debian (ca-certificates package via APT)
526
- * - Ubuntu on WSL (ca-certificates package via APT)
527
- * - Raspberry Pi OS (ca-certificates package via APT)
528
- * - Amazon Linux/RHEL/Fedora (ca-certificates package via DNF/YUM)
529
- * - Windows (certutil for Windows Certificate Store)
530
- * - Git Bash (bundled with Git for Windows)
531
- *
532
- * @returns {boolean} True if installation is supported on this platform
533
- */
534
- function isEligible() {
535
- const platform = os.detect();
536
- return ['macos', 'ubuntu', 'debian', 'wsl', 'raspbian', 'amazon_linux', 'fedora', 'rhel', 'windows', 'gitbash'].includes(platform.type);
537
- }
538
-
539
- // -----------------------------------------------------------------------------
540
- // Main Installation Entry Point
541
- // -----------------------------------------------------------------------------
542
-
543
- /**
544
- * Main installation entry point - detects platform and runs appropriate installer.
545
- *
546
- * This function detects the current operating system and dispatches to the
547
- * appropriate platform-specific installer function. CA certificates are
548
- * supported on all major platforms.
549
- *
550
- * Supported platforms:
551
- * - macOS (Homebrew ca-certificates formula)
552
- * - Ubuntu/Debian (ca-certificates package via APT)
553
- * - Ubuntu on WSL (ca-certificates package via APT)
554
- * - Raspberry Pi OS (ca-certificates package via APT)
555
- * - Amazon Linux/RHEL/Fedora (ca-certificates package via DNF/YUM)
556
- * - Windows (certutil for Windows Certificate Store)
557
- * - Git Bash (bundled with Git for Windows)
558
- *
559
- * @returns {Promise<void>}
560
- */
561
- async function install() {
562
- const platform = os.detect();
563
-
564
- // Map platform types to their corresponding installer functions
565
- // Multiple platform types can map to the same installer (e.g., debian and ubuntu)
566
- const installers = {
567
- 'macos': install_macos,
568
- 'ubuntu': install_ubuntu,
569
- 'debian': install_ubuntu,
570
- 'wsl': install_ubuntu_wsl,
571
- 'raspbian': install_raspbian,
572
- 'amazon_linux': install_amazon_linux,
573
- 'fedora': install_amazon_linux,
574
- 'rhel': install_amazon_linux,
575
- 'windows': install_windows,
576
- 'gitbash': install_gitbash,
577
- };
578
-
579
- // Look up the installer for the detected platform
580
- const installer = installers[platform.type];
581
-
582
- // If no installer exists for this platform, inform the user gracefully
583
- if (!installer) {
584
- console.log(`CA certificates are not available for ${platform.type}.`);
585
- return;
586
- }
587
-
588
- // Run the platform-specific installer
589
- await installer();
590
- }
591
-
592
- // -----------------------------------------------------------------------------
593
- // Module Exports
594
- // -----------------------------------------------------------------------------
595
-
596
- module.exports = {
597
- install,
598
- isInstalled,
599
- isEligible,
600
- install_macos,
601
- install_ubuntu,
602
- install_ubuntu_wsl,
603
- install_raspbian,
604
- install_amazon_linux,
605
- install_windows,
606
- install_gitbash,
607
- };
608
-
609
- // -----------------------------------------------------------------------------
610
- // Direct Execution Handler
611
- // -----------------------------------------------------------------------------
612
-
613
- if (require.main === module) {
614
- install().catch(err => {
615
- console.error(err.message);
616
- process.exit(1);
617
- });
618
- }