@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,568 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview Install Microsoft Office 365.
4
+ * @fileoverview Install Microsoft Office 365 (Microsoft 365).
5
5
  * @module installs/microsoft-office
6
+ *
7
+ * Microsoft Office 365 (now branded as Microsoft 365) is a subscription-based
8
+ * productivity suite that includes Word, Excel, PowerPoint, Outlook, OneNote,
9
+ * and OneDrive for document creation, collaboration, and communication.
10
+ *
11
+ * IMPORTANT PLATFORM LIMITATION:
12
+ * Microsoft Office 365 is officially supported ONLY on macOS and Windows.
13
+ * There is NO native Linux support from Microsoft, which affects Ubuntu, Debian,
14
+ * Raspberry Pi OS, Amazon Linux, and other Linux distributions.
15
+ *
16
+ * For unsupported platforms, this installer will display a simple message
17
+ * and return gracefully without error.
6
18
  */
7
19
 
8
20
  const os = require('../utils/common/os');
21
+ const shell = require('../utils/common/shell');
22
+ const brew = require('../utils/macos/brew');
23
+ const macosApps = require('../utils/macos/apps');
24
+ const choco = require('../utils/windows/choco');
25
+ const windowsShell = require('../utils/windows/shell');
26
+ const fs = require('fs');
27
+
28
+ /**
29
+ * Whether this installer requires a desktop environment to function.
30
+ * Microsoft Office is a GUI productivity suite.
31
+ */
32
+ const REQUIRES_DESKTOP = true;
33
+
34
+ /**
35
+ * Application names to check for on macOS after installation.
36
+ * Microsoft Office installs multiple applications to /Applications/.
37
+ */
38
+ const MACOS_OFFICE_APPS = [
39
+ 'Microsoft Word.app',
40
+ 'Microsoft Excel.app',
41
+ 'Microsoft PowerPoint.app',
42
+ 'Microsoft Outlook.app',
43
+ 'Microsoft OneNote.app'
44
+ ];
45
+
46
+ /**
47
+ * The Homebrew cask name for Microsoft Office suite.
48
+ */
49
+ const HOMEBREW_CASK_NAME = 'microsoft-office';
50
+
51
+ /**
52
+ * The Chocolatey package name for Microsoft 365 Apps.
53
+ */
54
+ const CHOCO_PACKAGE_NAME = 'office365proplus';
55
+
56
+ /**
57
+ * Windows installation path where Microsoft Office may be installed.
58
+ * This is the primary executable used to verify installation.
59
+ */
60
+ const WINDOWS_OFFICE_PATH = 'C:\\Program Files\\Microsoft Office\\root\\Office16\\WINWORD.EXE';
61
+
62
+ /**
63
+ * Check if Microsoft Office is installed on macOS.
64
+ *
65
+ * Microsoft Office installs multiple applications (Word, Excel, PowerPoint, etc.)
66
+ * to /Applications/. We check for the presence of Microsoft Word as the primary
67
+ * indicator since all Office apps are installed together via the cask.
68
+ *
69
+ * @returns {boolean} True if Microsoft Office is installed, false otherwise
70
+ */
71
+ function isInstalledMacOS() {
72
+ // Check for Microsoft Word as the primary indicator
73
+ // The macosApps.isAppInstalled function checks /Applications/ and ~/Applications/
74
+ return macosApps.isAppInstalled('Microsoft Word');
75
+ }
76
+
77
+ /**
78
+ * Check if Microsoft Office is installed on Windows.
79
+ *
80
+ * Checks the standard installation path for Microsoft Office. This provides
81
+ * a reliable and fast way to verify installation without relying on slower
82
+ * package manager list commands.
83
+ *
84
+ * @returns {Promise<boolean>} True if Microsoft Office is installed, false otherwise
85
+ */
86
+ async function isInstalledWindows() {
87
+ // Check if the Word executable exists in the standard location
88
+ const result = await windowsShell.execPowerShell(`Test-Path '${WINDOWS_OFFICE_PATH}'`);
89
+ if (result.success && result.stdout.trim().toLowerCase() === 'true') {
90
+ return true;
91
+ }
92
+
93
+ // Fallback: check via Chocolatey if the path check fails
94
+ // (in case of non-standard installation location)
95
+ const isPackageInstalled = await choco.isPackageInstalled(CHOCO_PACKAGE_NAME);
96
+ return isPackageInstalled;
97
+ }
98
+
99
+ /**
100
+ * Install Microsoft Office 365 on macOS using Homebrew.
101
+ *
102
+ * Prerequisites:
103
+ * - macOS 13 (Ventura) or later (Microsoft 365 supports current and two previous releases)
104
+ * - Homebrew package manager installed
105
+ * - At least 10 GB free disk space
106
+ * - Administrator privileges (may prompt for password)
107
+ *
108
+ * The installation uses the Homebrew cask 'microsoft-office' which downloads
109
+ * and installs the complete Microsoft Office suite including Word, Excel,
110
+ * PowerPoint, Outlook, OneNote, and OneDrive.
111
+ *
112
+ * NOTE: After installation, the user must sign in with their Microsoft account
113
+ * to activate the license. This sign-in step requires user interaction and
114
+ * cannot be automated.
115
+ *
116
+ * @returns {Promise<void>}
117
+ * @throws {Error} If Homebrew is not installed or installation fails
118
+ */
119
+ async function install_macos() {
120
+ console.log('Checking if Microsoft Office is already installed...');
121
+
122
+ // Check if already installed using direct app check
123
+ if (isInstalledMacOS()) {
124
+ console.log('Microsoft Office is already installed, skipping installation.');
125
+ return;
126
+ }
127
+
128
+ // Verify Homebrew is available before attempting installation
129
+ if (!brew.isInstalled()) {
130
+ throw new Error(
131
+ 'Homebrew is not installed. Please install Homebrew first using:\n' +
132
+ ' dev install homebrew\n' +
133
+ 'Then retry installing Microsoft Office.'
134
+ );
135
+ }
136
+
137
+ console.log('Installing Microsoft Office via Homebrew...');
138
+ console.log('This may take several minutes due to the large download size.');
139
+
140
+ // Install the cask - this installs the complete Office suite
141
+ // Note: This may prompt for administrator password for system components
142
+ const result = await brew.installCask(HOMEBREW_CASK_NAME);
143
+
144
+ if (!result.success) {
145
+ throw new Error(
146
+ `Failed to install Microsoft Office via Homebrew.\n` +
147
+ `Output: ${result.output}\n\n` +
148
+ `Troubleshooting:\n` +
149
+ ` 1. Run 'brew update && brew cleanup' and retry\n` +
150
+ ` 2. If installation conflicts exist, remove individual Office apps first:\n` +
151
+ ` brew uninstall --cask microsoft-word microsoft-excel microsoft-powerpoint microsoft-outlook microsoft-onenote 2>/dev/null || true\n` +
152
+ ` 3. Ensure you have at least 10 GB free disk space\n` +
153
+ ` 4. Check macOS version - Microsoft Office requires macOS 13 (Ventura) or later`
154
+ );
155
+ }
156
+
157
+ // Verify the installation succeeded by checking if Word exists
158
+ if (!isInstalledMacOS()) {
159
+ throw new Error(
160
+ 'Installation appeared to complete but Microsoft Office was not found.\n' +
161
+ 'Expected applications in /Applications/ (e.g., Microsoft Word.app)\n\n' +
162
+ 'Please try reinstalling manually: brew reinstall --cask microsoft-office'
163
+ );
164
+ }
165
+
166
+ console.log('Microsoft Office installed successfully.');
167
+ console.log('');
168
+ console.log('Installed applications:');
169
+ console.log(' - Microsoft Word');
170
+ console.log(' - Microsoft Excel');
171
+ console.log(' - Microsoft PowerPoint');
172
+ console.log(' - Microsoft Outlook');
173
+ console.log(' - Microsoft OneNote');
174
+ console.log(' - OneDrive');
175
+ console.log('');
176
+ console.log('IMPORTANT: Please launch any Office application and sign in with your');
177
+ console.log('Microsoft account to activate your Microsoft 365 subscription.');
178
+ }
179
+
180
+ /**
181
+ * Install Microsoft Office 365 on Ubuntu/Debian.
182
+ *
183
+ * IMPORTANT: Microsoft Office 365 is NOT officially supported on Ubuntu or Debian.
184
+ * Microsoft does not provide native Linux packages, and there is no APT or Snap package.
185
+ *
186
+ * @returns {Promise<void>}
187
+ */
188
+ async function install_ubuntu() {
189
+ console.log('Microsoft Office 365 is not available for Ubuntu/Debian.');
190
+ }
191
+
192
+ /**
193
+ * Install Microsoft Office 365 on Raspberry Pi OS.
194
+ *
195
+ * IMPORTANT: Microsoft Office 365 is NOT supported on Raspberry Pi OS.
196
+ * Microsoft Office is designed for x86/x64 architectures (Intel/AMD processors),
197
+ * not ARM architecture. Even with Wine, Office would not function properly due
198
+ * to the ARM architecture.
199
+ *
200
+ * @returns {Promise<void>}
201
+ */
202
+ async function install_raspbian() {
203
+ console.log('Microsoft Office 365 is not available for Raspberry Pi OS.');
204
+ }
205
+
206
+ /**
207
+ * Install Microsoft Office 365 on Amazon Linux/RHEL.
208
+ *
209
+ * IMPORTANT: Microsoft Office 365 is NOT officially supported on Amazon Linux or RHEL.
210
+ * Microsoft does not provide packages for any Linux distribution.
211
+ *
212
+ * @returns {Promise<void>}
213
+ */
214
+ async function install_amazon_linux() {
215
+ console.log('Microsoft Office 365 is not available for Amazon Linux/RHEL.');
216
+ }
217
+
218
+ /**
219
+ * Install Microsoft Office 365 on Windows using Chocolatey.
220
+ *
221
+ * Prerequisites:
222
+ * - Windows 10 version 1903 or later (64-bit), or Windows 11
223
+ * - Chocolatey package manager installed
224
+ * - At least 4 GB RAM and 10 GB free disk space
225
+ * - Administrator privileges
226
+ * - Valid Microsoft 365 subscription (required after installation for activation)
227
+ *
228
+ * The installation uses the Chocolatey package 'office365proplus' which downloads
229
+ * and installs Microsoft 365 Apps including Word, Excel, PowerPoint, Outlook,
230
+ * OneNote, Access, and Publisher.
231
+ *
232
+ * NOTE: After installation, the user must sign in with their Microsoft account.
233
+ * This sign-in step cannot be automated without enterprise deployment tools.
234
+ *
235
+ * @returns {Promise<void>}
236
+ * @throws {Error} If Chocolatey is not installed or installation fails
237
+ */
238
+ async function install_windows() {
239
+ console.log('Checking if Microsoft Office is already installed...');
240
+
241
+ // Check if already installed
242
+ const alreadyInstalled = await isInstalledWindows();
243
+ if (alreadyInstalled) {
244
+ console.log('Microsoft Office is already installed, skipping installation.');
245
+ return;
246
+ }
247
+
248
+ // Verify Chocolatey is available
249
+ if (!choco.isInstalled()) {
250
+ throw new Error(
251
+ 'Chocolatey is not installed.\n\n' +
252
+ 'To install Chocolatey, open an Administrator PowerShell and run:\n' +
253
+ ' Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(\'https://community.chocolatey.org/install.ps1\'))\n\n' +
254
+ 'Then retry installing Microsoft Office.'
255
+ );
256
+ }
257
+
258
+ console.log('Installing Microsoft Office via Chocolatey...');
259
+ console.log('This may take several minutes due to the large download size.');
260
+
261
+ // Install using Chocolatey with auto-confirm flag
262
+ const result = await choco.install(CHOCO_PACKAGE_NAME);
263
+
264
+ if (!result.success) {
265
+ throw new Error(
266
+ `Failed to install Microsoft Office via Chocolatey.\n` +
267
+ `Output: ${result.output}\n\n` +
268
+ `Troubleshooting:\n` +
269
+ ` 1. Ensure you are running as Administrator\n` +
270
+ ` 2. If a previous installation exists, remove it first using:\n` +
271
+ ` choco uninstall office365proplus -y\n` +
272
+ ` 3. Ensure you have at least 10 GB free disk space\n` +
273
+ ` 4. Check for conflicting Office installations in Control Panel`
274
+ );
275
+ }
276
+
277
+ // Verify installation succeeded
278
+ const verified = await isInstalledWindows();
279
+ if (!verified) {
280
+ throw new Error(
281
+ 'Installation appeared to complete but Microsoft Office was not found.\n' +
282
+ `Expected: ${WINDOWS_OFFICE_PATH}\n\n` +
283
+ 'A system restart may be required. Please restart your computer and check\n' +
284
+ 'if Microsoft Office appears in the Start menu.'
285
+ );
286
+ }
287
+
288
+ console.log('Microsoft Office installed successfully.');
289
+ console.log('');
290
+ console.log('Installed applications:');
291
+ console.log(' - Microsoft Word');
292
+ console.log(' - Microsoft Excel');
293
+ console.log(' - Microsoft PowerPoint');
294
+ console.log(' - Microsoft Outlook');
295
+ console.log(' - Microsoft OneNote');
296
+ console.log(' - Microsoft Access');
297
+ console.log(' - Microsoft Publisher');
298
+ console.log('');
299
+ console.log('IMPORTANT: Please launch any Office application and sign in with your');
300
+ console.log('Microsoft account to activate your Microsoft 365 subscription.');
301
+ }
302
+
303
+ /**
304
+ * Install Microsoft Office 365 from Ubuntu running in WSL (Windows Subsystem for Linux).
305
+ *
306
+ * IMPORTANT: Microsoft Office 365 cannot be installed or run inside WSL because WSL
307
+ * runs a Linux environment and Microsoft does not support Office on Linux.
308
+ *
309
+ * This function installs Microsoft Office on the Windows HOST instead, which is the
310
+ * recommended approach. After installation, Office applications can be launched from
311
+ * WSL using Windows interop, and files can be accessed via /mnt/c/.
312
+ *
313
+ * @returns {Promise<void>}
314
+ * @throws {Error} If Chocolatey is not available on Windows host or installation fails
315
+ */
316
+ async function install_ubuntu_wsl() {
317
+ console.log('Detected Ubuntu running in WSL (Windows Subsystem for Linux).');
318
+ console.log('');
319
+ console.log('Microsoft Office 365 cannot run inside WSL because WSL runs a Linux');
320
+ console.log('environment and Microsoft does not support Office on Linux.');
321
+ console.log('');
322
+ console.log('Installing Microsoft Office on the Windows HOST instead...');
323
+ console.log('');
324
+
325
+ // Check if already installed on Windows host via PowerShell interop
326
+ console.log('Checking if Microsoft Office is already installed on Windows host...');
327
+
328
+ const checkResult = await shell.exec(
329
+ `powershell.exe -NoProfile -Command "Test-Path '${WINDOWS_OFFICE_PATH.replace(/\\/g, '\\\\')}'"`
330
+ );
331
+
332
+ if (checkResult.code === 0 && checkResult.stdout.trim().toLowerCase() === 'true') {
333
+ console.log('Microsoft Office is already installed on the Windows host, skipping installation.');
334
+ console.log('');
335
+ console.log('You can launch Office applications from WSL using:');
336
+ console.log(' "/mnt/c/Program Files/Microsoft Office/root/Office16/WINWORD.EXE" &');
337
+ console.log(' "/mnt/c/Program Files/Microsoft Office/root/Office16/EXCEL.EXE" &');
338
+ console.log(' "/mnt/c/Program Files/Microsoft Office/root/Office16/POWERPNT.EXE" &');
339
+ return;
340
+ }
341
+
342
+ // Install via PowerShell interop using Chocolatey on the Windows host
343
+ console.log('Installing Microsoft Office on Windows host via Chocolatey...');
344
+ console.log('This may take several minutes due to the large download size.');
345
+
346
+ const installResult = await shell.exec(
347
+ `powershell.exe -NoProfile -Command "choco install ${CHOCO_PACKAGE_NAME} -y"`
348
+ );
349
+
350
+ if (installResult.code !== 0) {
351
+ throw new Error(
352
+ `Failed to install Microsoft Office on the Windows host.\n` +
353
+ `Output: ${installResult.stdout || installResult.stderr}\n\n` +
354
+ `Troubleshooting:\n` +
355
+ ` 1. Ensure Chocolatey is installed on Windows\n` +
356
+ ` 2. Open a Windows PowerShell as Administrator and run:\n` +
357
+ ` choco install office365proplus -y\n` +
358
+ ` 3. Check if you have administrator privileges`
359
+ );
360
+ }
361
+
362
+ // Verify installation succeeded
363
+ const verifyResult = await shell.exec(
364
+ `powershell.exe -NoProfile -Command "Test-Path '${WINDOWS_OFFICE_PATH.replace(/\\/g, '\\\\')}'"`
365
+ );
366
+
367
+ if (verifyResult.code !== 0 || verifyResult.stdout.trim().toLowerCase() !== 'true') {
368
+ throw new Error(
369
+ 'Installation appeared to complete but Microsoft Office was not found on the Windows host.\n\n' +
370
+ 'A system restart may be required. Please restart Windows and check\n' +
371
+ 'if Microsoft Office appears in the Start menu.\n\n' +
372
+ 'To install manually from Windows PowerShell (as Administrator):\n' +
373
+ ' choco install office365proplus -y'
374
+ );
375
+ }
376
+
377
+ console.log('Microsoft Office installed successfully on the Windows host.');
378
+ console.log('');
379
+ console.log('You can launch Office applications from WSL using:');
380
+ console.log(' "/mnt/c/Program Files/Microsoft Office/root/Office16/WINWORD.EXE" &');
381
+ console.log(' "/mnt/c/Program Files/Microsoft Office/root/Office16/EXCEL.EXE" &');
382
+ console.log(' "/mnt/c/Program Files/Microsoft Office/root/Office16/POWERPNT.EXE" &');
383
+ console.log('');
384
+ console.log('IMPORTANT: Please launch any Office application from Windows and sign in');
385
+ console.log('with your Microsoft account to activate your Microsoft 365 subscription.');
386
+ }
387
+
388
+ /**
389
+ * Install Microsoft Office 365 from Git Bash on Windows.
390
+ *
391
+ * Git Bash runs within Windows, so this function installs Microsoft Office
392
+ * on the Windows host using Chocolatey via PowerShell interop.
393
+ *
394
+ * @returns {Promise<void>}
395
+ * @throws {Error} If Chocolatey is not available or installation fails
396
+ */
397
+ async function install_gitbash() {
398
+ console.log('Detected Git Bash on Windows.');
399
+ console.log('Installing Microsoft Office on the Windows host...');
400
+ console.log('');
401
+
402
+ // Check if already installed on Windows host via PowerShell
403
+ console.log('Checking if Microsoft Office is already installed...');
404
+
405
+ const checkResult = await shell.exec(
406
+ `powershell.exe -NoProfile -Command "Test-Path '${WINDOWS_OFFICE_PATH.replace(/\\/g, '\\\\')}'"`
407
+ );
408
+
409
+ if (checkResult.code === 0 && checkResult.stdout.trim().toLowerCase() === 'true') {
410
+ console.log('Microsoft Office is already installed, skipping installation.');
411
+ return;
412
+ }
413
+
414
+ // Install via PowerShell using Chocolatey
415
+ console.log('Installing Microsoft Office via Chocolatey...');
416
+ console.log('This may take several minutes due to the large download size.');
417
+
418
+ const installResult = await shell.exec(
419
+ `powershell.exe -NoProfile -Command "choco install ${CHOCO_PACKAGE_NAME} -y"`
420
+ );
421
+
422
+ if (installResult.code !== 0) {
423
+ throw new Error(
424
+ `Failed to install Microsoft Office.\n` +
425
+ `Output: ${installResult.stdout || installResult.stderr}\n\n` +
426
+ `Troubleshooting:\n` +
427
+ ` 1. Ensure Chocolatey is installed on Windows\n` +
428
+ ` 2. Run Git Bash as Administrator and retry\n` +
429
+ ` 3. Try installing from PowerShell directly:\n` +
430
+ ` choco install office365proplus -y`
431
+ );
432
+ }
433
+
434
+ // Verify installation
435
+ const verifyResult = await shell.exec(
436
+ `powershell.exe -NoProfile -Command "Test-Path '${WINDOWS_OFFICE_PATH.replace(/\\/g, '\\\\')}'"`
437
+ );
438
+
439
+ if (verifyResult.code !== 0 || verifyResult.stdout.trim().toLowerCase() !== 'true') {
440
+ throw new Error(
441
+ 'Installation appeared to complete but Microsoft Office was not found.\n\n' +
442
+ 'A system restart may be required. Please restart Windows and check\n' +
443
+ 'if Microsoft Office appears in the Start menu.\n\n' +
444
+ 'To install manually from PowerShell (as Administrator):\n' +
445
+ ' choco install office365proplus -y'
446
+ );
447
+ }
448
+
449
+ console.log('Microsoft Office installed successfully.');
450
+ console.log('');
451
+ console.log('IMPORTANT: Please launch any Office application and sign in with your');
452
+ console.log('Microsoft account to activate your Microsoft 365 subscription.');
453
+ }
454
+
455
+ /**
456
+ * Check if Microsoft Office is installed on the current platform.
457
+ *
458
+ * On macOS, checks if Microsoft Word.app exists.
459
+ * On Windows/Git Bash, checks if Office is installed via Chocolatey or file path.
460
+ * On Linux, Microsoft Office is not available (returns false).
461
+ *
462
+ * @returns {Promise<boolean>} True if installed, false otherwise
463
+ */
464
+ async function isInstalled() {
465
+ const platform = os.detect();
466
+
467
+ if (platform.type === 'macos') {
468
+ return isInstalledMacOS();
469
+ }
470
+
471
+ if (platform.type === 'windows' || platform.type === 'gitbash' || platform.type === 'wsl') {
472
+ return isInstalledWindows();
473
+ }
474
+
475
+ // Linux: Microsoft Office is not available
476
+ return false;
477
+ }
478
+
479
+ /**
480
+ * Check if this installer is supported on the current platform.
481
+ * Microsoft Office is only available on macOS, Windows, and WSL (via Windows host).
482
+ * @returns {boolean} True if installation is supported on this platform
483
+ */
484
+ function isEligible() {
485
+ const platform = os.detect();
486
+ // Microsoft Office is only available on macOS and Windows platforms
487
+ const supportedPlatforms = ['macos', 'wsl', 'windows', 'gitbash'];
488
+ if (!supportedPlatforms.includes(platform.type)) {
489
+ return false;
490
+ }
491
+ if (REQUIRES_DESKTOP && !os.isDesktopAvailable()) {
492
+ return false;
493
+ }
494
+ return true;
495
+ }
9
496
 
10
497
  /**
11
- * Install Microsoft Office 365 across supported platforms.
498
+ * Main installation entry point.
499
+ *
500
+ * Detects the current platform and runs the appropriate installer function.
501
+ * Handles platform-specific mappings to ensure all supported (and unsupported)
502
+ * platforms have appropriate installation logic.
503
+ *
504
+ * Supported platforms:
505
+ * - macOS: Full support via Homebrew cask
506
+ * - Windows: Full support via Chocolatey
507
+ * - Git Bash: Full support via PowerShell interop to Chocolatey
508
+ * - WSL (Ubuntu): Installs on Windows host via PowerShell interop
509
+ *
510
+ * Unsupported platforms (returns gracefully with message):
511
+ * - Ubuntu/Debian: Microsoft does not provide Linux packages
512
+ * - Raspberry Pi OS: ARM architecture + no Linux support
513
+ * - Amazon Linux/RHEL: No Linux support from Microsoft
12
514
  *
13
515
  * @returns {Promise<void>}
14
516
  */
15
517
  async function install() {
16
518
  const platform = os.detect();
17
519
 
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 };
520
+ // Map platform types to their installer functions
521
+ // This mapping handles aliases (e.g., debian maps to ubuntu installer)
522
+ const installers = {
523
+ 'macos': install_macos,
524
+ 'ubuntu': install_ubuntu,
525
+ 'debian': install_ubuntu,
526
+ 'ubuntu-wsl': install_ubuntu_wsl,
527
+ 'wsl': install_ubuntu_wsl,
528
+ 'raspbian': install_raspbian,
529
+ 'amazon_linux': install_amazon_linux,
530
+ 'amazon-linux': install_amazon_linux,
531
+ 'rhel': install_amazon_linux,
532
+ 'fedora': install_amazon_linux,
533
+ 'windows': install_windows,
534
+ 'gitbash': install_gitbash
535
+ };
536
+
537
+ const installer = installers[platform.type];
538
+
539
+ if (!installer) {
540
+ console.log(`Microsoft Office 365 is not available for ${platform.type}.`);
541
+ return;
542
+ }
543
+
544
+ await installer();
545
+ }
546
+
547
+ // Export all functions for use as a module and for testing
548
+ module.exports = {
549
+ REQUIRES_DESKTOP,
550
+ install,
551
+ isInstalled,
552
+ isEligible,
553
+ install_macos,
554
+ install_ubuntu,
555
+ install_ubuntu_wsl,
556
+ install_raspbian,
557
+ install_amazon_linux,
558
+ install_windows,
559
+ install_gitbash
560
+ };
41
561
 
562
+ // Allow direct execution: node microsoft-office.js
42
563
  if (require.main === module) {
43
- install();
564
+ install().catch(err => {
565
+ console.error(err.message);
566
+ process.exit(1);
567
+ });
44
568
  }