@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.
- package/README.md +5 -5
- package/package.json +1 -1
- package/src/commands/install.js +374 -36
- package/src/installs/adobe-creative-cloud.js +527 -25
- package/src/installs/adobe-creative-cloud.md +605 -0
- package/src/installs/appcleaner.js +303 -26
- package/src/installs/appcleaner.md +699 -0
- package/src/installs/apt-transport-https.js +390 -0
- package/src/installs/apt-transport-https.md +678 -0
- package/src/installs/atomicparsley.js +624 -26
- package/src/installs/atomicparsley.md +795 -0
- package/src/installs/aws-cli.js +779 -26
- package/src/installs/aws-cli.md +727 -0
- package/src/installs/balena-etcher.js +688 -26
- package/src/installs/balena-etcher.md +761 -0
- package/src/installs/bambu-studio.js +912 -26
- package/src/installs/bambu-studio.md +780 -0
- package/src/installs/bash-completion.js +554 -23
- package/src/installs/bash-completion.md +833 -0
- package/src/installs/bash.js +399 -26
- package/src/installs/bash.md +993 -0
- package/src/installs/beyond-compare.js +585 -26
- package/src/installs/beyond-compare.md +813 -0
- package/src/installs/build-essential.js +511 -26
- package/src/installs/build-essential.md +977 -0
- package/src/installs/ca-certificates.js +618 -0
- package/src/installs/ca-certificates.md +937 -0
- package/src/installs/caffeine.js +490 -26
- package/src/installs/caffeine.md +839 -0
- package/src/installs/camtasia.js +577 -25
- package/src/installs/camtasia.md +762 -0
- package/src/installs/chatgpt.js +458 -26
- package/src/installs/chatgpt.md +814 -0
- package/src/installs/chocolatey.js +447 -0
- package/src/installs/chocolatey.md +661 -0
- package/src/installs/chrome-canary.js +472 -26
- package/src/installs/chrome-canary.md +641 -0
- package/src/installs/chromium.js +645 -26
- package/src/installs/chromium.md +838 -0
- package/src/installs/claude-code.js +558 -26
- package/src/installs/claude-code.md +1173 -0
- package/src/installs/curl.js +361 -26
- package/src/installs/curl.md +714 -0
- package/src/installs/cursor.js +561 -26
- package/src/installs/cursor.md +970 -0
- package/src/installs/dbschema.js +674 -26
- package/src/installs/dbschema.md +925 -0
- package/src/installs/dependencies.md +435 -0
- package/src/installs/development-tools.js +600 -0
- package/src/installs/development-tools.md +977 -0
- package/src/installs/docker.js +1010 -25
- package/src/installs/docker.md +1109 -0
- package/src/installs/drawio.js +1001 -26
- package/src/installs/drawio.md +795 -0
- package/src/installs/elmedia-player.js +328 -25
- package/src/installs/elmedia-player.md +556 -0
- package/src/installs/ffmpeg.js +870 -25
- package/src/installs/ffmpeg.md +852 -0
- package/src/installs/file.js +464 -0
- package/src/installs/file.md +987 -0
- package/src/installs/gemini-cli.js +793 -26
- package/src/installs/gemini-cli.md +1153 -0
- package/src/installs/git.js +382 -26
- package/src/installs/git.md +907 -0
- package/src/installs/gitego.js +931 -26
- package/src/installs/gitego.md +1172 -0
- package/src/installs/go.js +913 -26
- package/src/installs/go.md +958 -0
- package/src/installs/google-chrome.js +801 -25
- package/src/installs/google-chrome.md +862 -0
- package/src/installs/gpg.js +412 -73
- package/src/installs/gpg.md +1056 -0
- package/src/installs/homebrew.js +1015 -26
- package/src/installs/homebrew.md +988 -0
- package/src/installs/imageoptim.js +950 -26
- package/src/installs/imageoptim.md +1119 -0
- package/src/installs/installers.json +2297 -0
- package/src/installs/jq.js +382 -26
- package/src/installs/jq.md +809 -0
- package/src/installs/keyboard-maestro.js +701 -26
- package/src/installs/keyboard-maestro.md +825 -0
- package/src/installs/latex.js +771 -26
- package/src/installs/latex.md +1095 -0
- package/src/installs/lftp.js +338 -26
- package/src/installs/lftp.md +907 -0
- package/src/installs/lsb-release.js +346 -0
- package/src/installs/lsb-release.md +814 -0
- package/src/installs/messenger.js +829 -26
- package/src/installs/messenger.md +900 -0
- package/src/installs/microsoft-office.js +550 -26
- package/src/installs/microsoft-office.md +760 -0
- package/src/installs/microsoft-teams.js +782 -25
- package/src/installs/microsoft-teams.md +886 -0
- package/src/installs/node.js +886 -26
- package/src/installs/node.md +1153 -0
- package/src/installs/nordpass.js +698 -26
- package/src/installs/nordpass.md +921 -0
- package/src/installs/nvm.js +977 -26
- package/src/installs/nvm.md +1057 -0
- package/src/installs/openssh.js +734 -64
- package/src/installs/openssh.md +1056 -0
- package/src/installs/pandoc.js +644 -26
- package/src/installs/pandoc.md +1036 -0
- package/src/installs/pinentry.js +492 -26
- package/src/installs/pinentry.md +1142 -0
- package/src/installs/pngyu.js +851 -26
- package/src/installs/pngyu.md +896 -0
- package/src/installs/postman.js +781 -26
- package/src/installs/postman.md +940 -0
- package/src/installs/procps.js +425 -0
- package/src/installs/procps.md +851 -0
- package/src/installs/safari-tech-preview.js +355 -25
- package/src/installs/safari-tech-preview.md +533 -0
- package/src/installs/sfnt2woff.js +640 -26
- package/src/installs/sfnt2woff.md +795 -0
- package/src/installs/shellcheck.js +463 -26
- package/src/installs/shellcheck.md +1005 -0
- package/src/installs/slack.js +722 -25
- package/src/installs/slack.md +865 -0
- package/src/installs/snagit.js +566 -25
- package/src/installs/snagit.md +844 -0
- package/src/installs/software-properties-common.js +372 -0
- package/src/installs/software-properties-common.md +805 -0
- package/src/installs/spotify.js +858 -25
- package/src/installs/spotify.md +901 -0
- package/src/installs/studio-3t.js +803 -26
- package/src/installs/studio-3t.md +918 -0
- package/src/installs/sublime-text.js +780 -25
- package/src/installs/sublime-text.md +914 -0
- package/src/installs/superwhisper.js +687 -25
- package/src/installs/superwhisper.md +630 -0
- package/src/installs/tailscale.js +727 -26
- package/src/installs/tailscale.md +1100 -0
- package/src/installs/tar.js +389 -0
- package/src/installs/tar.md +946 -0
- package/src/installs/termius.js +780 -26
- package/src/installs/termius.md +844 -0
- package/src/installs/terraform.js +761 -26
- package/src/installs/terraform.md +899 -0
- package/src/installs/tidal.js +752 -25
- package/src/installs/tidal.md +864 -0
- package/src/installs/tmux.js +328 -26
- package/src/installs/tmux.md +1030 -0
- package/src/installs/tree.js +393 -26
- package/src/installs/tree.md +833 -0
- package/src/installs/unzip.js +460 -0
- package/src/installs/unzip.md +879 -0
- package/src/installs/vim.js +403 -26
- package/src/installs/vim.md +1040 -0
- package/src/installs/vlc.js +803 -26
- package/src/installs/vlc.md +927 -0
- package/src/installs/vscode.js +825 -26
- package/src/installs/vscode.md +1002 -0
- package/src/installs/wget.js +415 -0
- package/src/installs/wget.md +791 -0
- package/src/installs/whatsapp.js +710 -25
- package/src/installs/whatsapp.md +854 -0
- package/src/installs/winpty.js +352 -0
- package/src/installs/winpty.md +620 -0
- package/src/installs/woff2.js +535 -26
- package/src/installs/woff2.md +977 -0
- package/src/installs/wsl.js +572 -0
- package/src/installs/wsl.md +699 -0
- package/src/installs/xcode-clt.js +520 -0
- package/src/installs/xcode-clt.md +351 -0
- package/src/installs/xcode.js +542 -26
- package/src/installs/xcode.md +573 -0
- package/src/installs/yarn.js +806 -26
- package/src/installs/yarn.md +1074 -0
- package/src/installs/yq.js +636 -26
- package/src/installs/yq.md +944 -0
- package/src/installs/yt-dlp.js +683 -26
- package/src/installs/yt-dlp.md +946 -0
- package/src/installs/yum-utils.js +297 -0
- package/src/installs/yum-utils.md +648 -0
- package/src/installs/zoom.js +740 -25
- package/src/installs/zoom.md +884 -0
- package/src/scripts/README.md +567 -45
- package/src/scripts/STATUS.md +208 -0
- package/src/scripts/afk.js +395 -7
- package/src/scripts/backup-all.js +731 -9
- package/src/scripts/backup-source.js +711 -8
- package/src/scripts/brewd.js +373 -7
- package/src/scripts/brewi.js +505 -9
- package/src/scripts/brewr.js +512 -9
- package/src/scripts/brews.js +462 -9
- package/src/scripts/brewu.js +488 -7
- package/src/scripts/c.js +185 -7
- package/src/scripts/ccurl.js +325 -8
- package/src/scripts/certbot-crontab-init.js +488 -8
- package/src/scripts/certbot-init.js +641 -9
- package/src/scripts/ch.js +339 -7
- package/src/scripts/claude-danger.js +253 -8
- package/src/scripts/clean-dev.js +419 -8
- package/src/scripts/clear-dns-cache.js +525 -7
- package/src/scripts/clone.js +417 -7
- package/src/scripts/code-all.js +420 -7
- package/src/scripts/count-files.js +195 -8
- package/src/scripts/count-folders.js +195 -8
- package/src/scripts/count.js +248 -8
- package/src/scripts/d.js +203 -7
- package/src/scripts/datauri.js +373 -8
- package/src/scripts/delete-files.js +363 -7
- package/src/scripts/docker-clean.js +410 -8
- package/src/scripts/dp.js +426 -7
- package/src/scripts/e.js +375 -9
- package/src/scripts/empty-trash.js +497 -7
- package/src/scripts/evm.js +428 -9
- package/src/scripts/fetch-github-repos.js +441 -10
- package/src/scripts/get-channel.js +329 -8
- package/src/scripts/get-course.js +384 -11
- package/src/scripts/get-dependencies.js +290 -9
- package/src/scripts/get-folder.js +783 -10
- package/src/scripts/get-tunes.js +411 -10
- package/src/scripts/get-video.js +352 -9
- package/src/scripts/git-backup.js +561 -9
- package/src/scripts/git-clone.js +477 -9
- package/src/scripts/git-pup.js +303 -7
- package/src/scripts/git-push.js +380 -8
- package/src/scripts/h.js +607 -9
- package/src/scripts/hide-desktop-icons.js +483 -7
- package/src/scripts/hide-hidden-files.js +522 -7
- package/src/scripts/install-dependencies-from.js +440 -9
- package/src/scripts/ips.js +647 -10
- package/src/scripts/iso.js +354 -8
- package/src/scripts/killni.js +561 -7
- package/src/scripts/ll.js +451 -8
- package/src/scripts/local-ip.js +310 -8
- package/src/scripts/m.js +508 -8
- package/src/scripts/map.js +293 -8
- package/src/scripts/mkd.js +287 -7
- package/src/scripts/ncu-update-all.js +441 -8
- package/src/scripts/nginx-init.js +702 -12
- package/src/scripts/npmi.js +366 -7
- package/src/scripts/o.js +495 -8
- package/src/scripts/org-by-date.js +321 -7
- package/src/scripts/p.js +208 -7
- package/src/scripts/packages.js +313 -8
- package/src/scripts/path.js +209 -7
- package/src/scripts/ports.js +582 -8
- package/src/scripts/q.js +290 -8
- package/src/scripts/refresh-files.js +378 -10
- package/src/scripts/remove-smaller-files.js +500 -8
- package/src/scripts/rename-files-with-date.js +517 -9
- package/src/scripts/resize-image.js +523 -9
- package/src/scripts/rm-safe.js +653 -8
- package/src/scripts/s.js +525 -9
- package/src/scripts/set-git-public.js +349 -7
- package/src/scripts/show-desktop-icons.js +459 -7
- package/src/scripts/show-hidden-files.js +456 -7
- package/src/scripts/tpa.js +265 -8
- package/src/scripts/tpo.js +264 -7
- package/src/scripts/u.js +489 -7
- package/src/scripts/vpush.js +422 -8
- package/src/scripts/y.js +267 -7
- package/src/utils/common/os.js +94 -2
- package/src/utils/ubuntu/apt.js +13 -7
- package/src/utils/windows/choco.js +82 -26
- package/src/utils/windows/winget.js +89 -27
package/src/installs/yarn.js
CHANGED
|
@@ -1,44 +1,824 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @fileoverview Install Yarn.
|
|
4
|
+
* @fileoverview Install Yarn - Fast, reliable, and secure JavaScript package manager.
|
|
5
5
|
* @module installs/yarn
|
|
6
|
+
*
|
|
7
|
+
* Yarn is a fast, reliable, and secure JavaScript package manager developed by
|
|
8
|
+
* Facebook (now Meta) as an alternative to npm. It addresses key pain points in
|
|
9
|
+
* JavaScript dependency management by offering deterministic installations,
|
|
10
|
+
* offline caching, and parallel downloads.
|
|
11
|
+
*
|
|
12
|
+
* Key capabilities of Yarn:
|
|
13
|
+
* - Deterministic dependency resolution through lockfiles
|
|
14
|
+
* - Parallel package downloads for faster installations
|
|
15
|
+
* - Offline mode using cached packages
|
|
16
|
+
* - Workspaces for monorepo management
|
|
17
|
+
* - Security-focused design with integrity checks
|
|
18
|
+
*
|
|
19
|
+
* This installer provides Yarn Classic (1.x) for system-wide availability:
|
|
20
|
+
* - macOS: Yarn via Homebrew
|
|
21
|
+
* - Ubuntu/Debian: Yarn via APT with official Yarn repository
|
|
22
|
+
* - Raspberry Pi OS: Yarn via APT with official Yarn repository
|
|
23
|
+
* - Amazon Linux/RHEL: Yarn via DNF/YUM with official Yarn repository
|
|
24
|
+
* - Windows: Yarn via Chocolatey
|
|
25
|
+
* - WSL (Ubuntu): Yarn via APT with official Yarn repository
|
|
26
|
+
* - Git Bash: Yarn installed on Windows host via Chocolatey
|
|
27
|
+
*
|
|
28
|
+
* IMPORTANT NOTE:
|
|
29
|
+
* This installer provides Yarn Classic (1.x) for maximum compatibility. For
|
|
30
|
+
* projects requiring Yarn Modern (2.x, 3.x, or 4.x), install Node.js first,
|
|
31
|
+
* then use Corepack: `corepack enable && yarn init -2`
|
|
6
32
|
*/
|
|
7
33
|
|
|
8
34
|
const os = require('../utils/common/os');
|
|
35
|
+
const shell = require('../utils/common/shell');
|
|
36
|
+
const brew = require('../utils/macos/brew');
|
|
37
|
+
const apt = require('../utils/ubuntu/apt');
|
|
38
|
+
const choco = require('../utils/windows/choco');
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The Homebrew formula name for Yarn on macOS.
|
|
42
|
+
* This installs Yarn Classic (1.22.x).
|
|
43
|
+
*/
|
|
44
|
+
const HOMEBREW_FORMULA_NAME = 'yarn';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The Chocolatey package name for Yarn on Windows.
|
|
48
|
+
* This installs Yarn Classic (1.22.x).
|
|
49
|
+
*/
|
|
50
|
+
const CHOCO_PACKAGE_NAME = 'yarn';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The URL for the Yarn GPG public key used to verify packages.
|
|
54
|
+
* This key is used when adding the official Yarn APT/YUM repository.
|
|
55
|
+
*/
|
|
56
|
+
const YARN_GPG_KEY_URL = 'https://dl.yarnpkg.com/debian/pubkey.gpg';
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The path where the Yarn GPG keyring will be stored on Debian-based systems.
|
|
60
|
+
* Using the modern signed-by approach for APT repository verification.
|
|
61
|
+
*/
|
|
62
|
+
const YARN_KEYRING_PATH = '/etc/apt/keyrings/yarn-archive-keyring.gpg';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The APT repository line for Yarn on Debian-based systems.
|
|
66
|
+
* Uses the signed-by directive for modern GPG key verification.
|
|
67
|
+
*/
|
|
68
|
+
const YARN_APT_REPO = `deb [signed-by=${YARN_KEYRING_PATH}] https://dl.yarnpkg.com/debian/ stable main`;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The path where the Yarn APT sources list file will be stored.
|
|
72
|
+
*/
|
|
73
|
+
const YARN_APT_LIST_PATH = '/etc/apt/sources.list.d/yarn.list';
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The URL for the Yarn YUM/DNF repository configuration file.
|
|
77
|
+
*/
|
|
78
|
+
const YARN_RPM_REPO_URL = 'https://dl.yarnpkg.com/rpm/yarn.repo';
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The path where the Yarn YUM/DNF repository file will be stored.
|
|
82
|
+
*/
|
|
83
|
+
const YARN_RPM_REPO_PATH = '/etc/yum.repos.d/yarn.repo';
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The URL for the Yarn RPM GPG public key.
|
|
87
|
+
*/
|
|
88
|
+
const YARN_RPM_GPG_KEY_URL = 'https://dl.yarnpkg.com/rpm/pubkey.gpg';
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Check if the Yarn CLI is installed by verifying the 'yarn' command exists.
|
|
92
|
+
*
|
|
93
|
+
* This is a quick synchronous check that works across all platforms.
|
|
94
|
+
* It verifies that the 'yarn' executable is available in the system PATH.
|
|
95
|
+
*
|
|
96
|
+
* @returns {boolean} True if the yarn command is available, false otherwise
|
|
97
|
+
*/
|
|
98
|
+
function isYarnCommandAvailable() {
|
|
99
|
+
return shell.commandExists('yarn');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Check if Yarn is installed and get the version.
|
|
104
|
+
*
|
|
105
|
+
* Executes 'yarn --version' to verify Yarn is properly installed
|
|
106
|
+
* and operational. Returns the version string if successful.
|
|
107
|
+
*
|
|
108
|
+
* @returns {Promise<string|null>} Yarn version string (e.g., "1.22.22"), or null if not installed
|
|
109
|
+
*/
|
|
110
|
+
async function getYarnVersion() {
|
|
111
|
+
if (!isYarnCommandAvailable()) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const result = await shell.exec('yarn --version');
|
|
116
|
+
if (result.code === 0 && result.stdout) {
|
|
117
|
+
return result.stdout.trim();
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Set up the official Yarn APT repository on Ubuntu/Debian systems.
|
|
124
|
+
*
|
|
125
|
+
* This function:
|
|
126
|
+
* 1. Removes the conflicting cmdtest package (which provides a different 'yarn' command)
|
|
127
|
+
* 2. Installs prerequisites (curl, gnupg, ca-certificates)
|
|
128
|
+
* 3. Creates the keyring directory if it does not exist
|
|
129
|
+
* 4. Downloads and stores the Yarn GPG key
|
|
130
|
+
* 5. Adds the official Yarn APT repository
|
|
131
|
+
*
|
|
132
|
+
* @returns {Promise<void>}
|
|
133
|
+
* @throws {Error} If repository setup fails
|
|
134
|
+
*/
|
|
135
|
+
async function setupYarnAptRepository() {
|
|
136
|
+
console.log('Setting up official Yarn APT repository...');
|
|
137
|
+
|
|
138
|
+
// Step 1: Remove cmdtest package if present (it conflicts with Yarn)
|
|
139
|
+
// The cmdtest package provides a different program called 'yarn'
|
|
140
|
+
console.log('Removing conflicting cmdtest package if present...');
|
|
141
|
+
await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get remove -y cmdtest 2>/dev/null || true');
|
|
142
|
+
|
|
143
|
+
// Step 2: Install prerequisites needed to download and verify the Yarn repository
|
|
144
|
+
console.log('Installing prerequisites (curl, gnupg, ca-certificates)...');
|
|
145
|
+
const prereqResult = await shell.exec(
|
|
146
|
+
'sudo DEBIAN_FRONTEND=noninteractive apt-get update -y && ' +
|
|
147
|
+
'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y curl gnupg ca-certificates'
|
|
148
|
+
);
|
|
149
|
+
if (prereqResult.code !== 0) {
|
|
150
|
+
throw new Error(`Failed to install prerequisites: ${prereqResult.stderr}`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Step 3: Ensure the keyring directory exists
|
|
154
|
+
console.log('Creating keyring directory...');
|
|
155
|
+
const mkdirResult = await shell.exec('sudo mkdir -p /etc/apt/keyrings');
|
|
156
|
+
if (mkdirResult.code !== 0) {
|
|
157
|
+
throw new Error(`Failed to create keyring directory: ${mkdirResult.stderr}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Step 4: Download and store the Yarn GPG key using the modern signed-by approach
|
|
161
|
+
console.log('Adding Yarn GPG key...');
|
|
162
|
+
const gpgKeyResult = await shell.exec(
|
|
163
|
+
`curl -sS ${YARN_GPG_KEY_URL} | gpg --dearmor | sudo tee ${YARN_KEYRING_PATH} > /dev/null`
|
|
164
|
+
);
|
|
165
|
+
if (gpgKeyResult.code !== 0) {
|
|
166
|
+
throw new Error(
|
|
167
|
+
`Failed to add Yarn GPG key.\n` +
|
|
168
|
+
`Output: ${gpgKeyResult.stderr || gpgKeyResult.stdout}\n\n` +
|
|
169
|
+
`Troubleshooting:\n` +
|
|
170
|
+
` 1. Check your internet connection\n` +
|
|
171
|
+
` 2. Verify gnupg is installed: sudo apt-get install -y gnupg\n` +
|
|
172
|
+
` 3. Try manually: curl -sS ${YARN_GPG_KEY_URL} | gpg --dearmor | sudo tee ${YARN_KEYRING_PATH}`
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Step 5: Add the official Yarn APT repository
|
|
177
|
+
console.log('Adding Yarn APT repository...');
|
|
178
|
+
const repoResult = await shell.exec(
|
|
179
|
+
`echo "${YARN_APT_REPO}" | sudo tee ${YARN_APT_LIST_PATH} > /dev/null`
|
|
180
|
+
);
|
|
181
|
+
if (repoResult.code !== 0) {
|
|
182
|
+
throw new Error(`Failed to add Yarn repository: ${repoResult.stderr}`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Update package lists to include the new repository
|
|
186
|
+
console.log('Updating package lists...');
|
|
187
|
+
const updateResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get update -y');
|
|
188
|
+
if (updateResult.code !== 0) {
|
|
189
|
+
throw new Error(`Failed to update package lists: ${updateResult.stderr}`);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
console.log('Yarn APT repository configured successfully.');
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Set up the official Yarn YUM/DNF repository on Amazon Linux/RHEL systems.
|
|
197
|
+
*
|
|
198
|
+
* This function:
|
|
199
|
+
* 1. Imports the Yarn RPM GPG key
|
|
200
|
+
* 2. Downloads and installs the Yarn repository configuration
|
|
201
|
+
*
|
|
202
|
+
* @returns {Promise<void>}
|
|
203
|
+
* @throws {Error} If repository setup fails
|
|
204
|
+
*/
|
|
205
|
+
async function setupYarnRpmRepository() {
|
|
206
|
+
console.log('Setting up official Yarn YUM/DNF repository...');
|
|
207
|
+
|
|
208
|
+
// Step 1: Import the Yarn RPM GPG key for package verification
|
|
209
|
+
console.log('Importing Yarn GPG key...');
|
|
210
|
+
const gpgResult = await shell.exec(`sudo rpm --import ${YARN_RPM_GPG_KEY_URL}`);
|
|
211
|
+
if (gpgResult.code !== 0) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
`Failed to import Yarn GPG key.\n` +
|
|
214
|
+
`Output: ${gpgResult.stderr || gpgResult.stdout}\n\n` +
|
|
215
|
+
`Troubleshooting:\n` +
|
|
216
|
+
` 1. Check your internet connection\n` +
|
|
217
|
+
` 2. Try manually: sudo rpm --import ${YARN_RPM_GPG_KEY_URL}`
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Step 2: Download and install the Yarn repository configuration file
|
|
222
|
+
console.log('Adding Yarn repository...');
|
|
223
|
+
const repoResult = await shell.exec(
|
|
224
|
+
`sudo curl -sL ${YARN_RPM_REPO_URL} -o ${YARN_RPM_REPO_PATH}`
|
|
225
|
+
);
|
|
226
|
+
if (repoResult.code !== 0) {
|
|
227
|
+
throw new Error(
|
|
228
|
+
`Failed to add Yarn repository.\n` +
|
|
229
|
+
`Output: ${repoResult.stderr || repoResult.stdout}\n\n` +
|
|
230
|
+
`Troubleshooting:\n` +
|
|
231
|
+
` 1. Check your internet connection\n` +
|
|
232
|
+
` 2. Try manually: sudo curl -sL ${YARN_RPM_REPO_URL} -o ${YARN_RPM_REPO_PATH}`
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
console.log('Yarn YUM/DNF repository configured successfully.');
|
|
237
|
+
}
|
|
9
238
|
|
|
10
239
|
/**
|
|
11
|
-
* Install Yarn
|
|
240
|
+
* Install Yarn on macOS using Homebrew.
|
|
241
|
+
*
|
|
242
|
+
* Prerequisites:
|
|
243
|
+
* - macOS 12 (Monterey) or later (macOS 14 Sonoma or later recommended)
|
|
244
|
+
* - Homebrew package manager installed
|
|
245
|
+
* - Node.js installed (Homebrew will install it as a dependency if missing)
|
|
246
|
+
* - Apple Silicon (M1/M2/M3/M4) or Intel processor
|
|
247
|
+
*
|
|
248
|
+
* This function installs Yarn Classic (1.22.x) via Homebrew.
|
|
249
|
+
*
|
|
250
|
+
* After installation, Yarn will be available at:
|
|
251
|
+
* - Apple Silicon Macs: /opt/homebrew/bin/yarn
|
|
252
|
+
* - Intel Macs: /usr/local/bin/yarn
|
|
253
|
+
*
|
|
254
|
+
* Note: The Homebrew yarn formula conflicts with corepack and hadoop packages.
|
|
255
|
+
* If you have either installed, you must uninstall them first.
|
|
256
|
+
*
|
|
257
|
+
* @returns {Promise<void>}
|
|
258
|
+
*/
|
|
259
|
+
async function install_macos() {
|
|
260
|
+
console.log('Checking if Yarn is already installed...');
|
|
261
|
+
|
|
262
|
+
// Check if Yarn is already installed via Homebrew formula
|
|
263
|
+
const isBrewYarnInstalled = await brew.isFormulaInstalled(HOMEBREW_FORMULA_NAME);
|
|
264
|
+
if (isBrewYarnInstalled) {
|
|
265
|
+
const version = await getYarnVersion();
|
|
266
|
+
console.log(`Yarn ${version || 'unknown version'} is already installed via Homebrew, skipping...`);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Also check if yarn command exists (might be installed via other means like npm)
|
|
271
|
+
const existingVersion = await getYarnVersion();
|
|
272
|
+
if (existingVersion) {
|
|
273
|
+
console.log(`Yarn ${existingVersion} is already installed, skipping...`);
|
|
274
|
+
console.log('');
|
|
275
|
+
console.log('Note: Yarn was not installed via Homebrew.');
|
|
276
|
+
console.log('If you want to manage it with Homebrew, first uninstall the existing version.');
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Verify Homebrew is available - it is required for macOS installation
|
|
281
|
+
if (!brew.isInstalled()) {
|
|
282
|
+
console.log('Homebrew is not installed. Please install Homebrew first.');
|
|
283
|
+
console.log('Run: dev install homebrew');
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Install Yarn using Homebrew
|
|
288
|
+
console.log('Installing Yarn via Homebrew...');
|
|
289
|
+
const result = await brew.install(HOMEBREW_FORMULA_NAME);
|
|
290
|
+
|
|
291
|
+
if (!result.success) {
|
|
292
|
+
console.log('Failed to install Yarn via Homebrew.');
|
|
293
|
+
console.log(result.output);
|
|
294
|
+
console.log('');
|
|
295
|
+
console.log('Troubleshooting:');
|
|
296
|
+
console.log(' - If you see a conflict with corepack, run: brew uninstall yarn && corepack enable');
|
|
297
|
+
console.log(' - Ensure Node.js is installed: brew install node');
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Verify the installation succeeded
|
|
302
|
+
const verified = await brew.isFormulaInstalled(HOMEBREW_FORMULA_NAME);
|
|
303
|
+
if (!verified) {
|
|
304
|
+
console.log('Installation may have failed: Yarn formula not found after install.');
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Display installed version
|
|
309
|
+
const yarnVersion = await getYarnVersion();
|
|
310
|
+
|
|
311
|
+
console.log('Yarn installed successfully via Homebrew.');
|
|
312
|
+
console.log('');
|
|
313
|
+
if (yarnVersion) {
|
|
314
|
+
console.log(`Yarn version: ${yarnVersion}`);
|
|
315
|
+
}
|
|
316
|
+
console.log('');
|
|
317
|
+
console.log('Verify installation with: yarn --version');
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Install Yarn on Ubuntu/Debian using APT with the official Yarn repository.
|
|
322
|
+
*
|
|
323
|
+
* Prerequisites:
|
|
324
|
+
* - Ubuntu 20.04 LTS or later, or Debian 11 (Bullseye) or later (64-bit)
|
|
325
|
+
* - sudo privileges
|
|
326
|
+
* - Node.js installed (install via NodeSource repository for latest versions)
|
|
327
|
+
* - Internet connectivity
|
|
328
|
+
*
|
|
329
|
+
* IMPORTANT: Some older Ubuntu versions ship with a package called 'cmdtest' that
|
|
330
|
+
* provides a different 'yarn' command. This function removes cmdtest first to
|
|
331
|
+
* avoid conflicts.
|
|
332
|
+
*
|
|
333
|
+
* This function:
|
|
334
|
+
* 1. Removes the conflicting cmdtest package
|
|
335
|
+
* 2. Adds the official Yarn APT repository
|
|
336
|
+
* 3. Installs Yarn Classic (1.22.x) via APT
|
|
337
|
+
*
|
|
338
|
+
* @returns {Promise<void>}
|
|
339
|
+
*/
|
|
340
|
+
async function install_ubuntu() {
|
|
341
|
+
console.log('Checking if Yarn is already installed...');
|
|
342
|
+
|
|
343
|
+
// Check if Yarn is already installed
|
|
344
|
+
const existingVersion = await getYarnVersion();
|
|
345
|
+
if (existingVersion) {
|
|
346
|
+
console.log(`Yarn ${existingVersion} is already installed, skipping...`);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// Set up the official Yarn APT repository
|
|
351
|
+
await setupYarnAptRepository();
|
|
352
|
+
|
|
353
|
+
// Install Yarn from the official Yarn repository
|
|
354
|
+
console.log('Installing Yarn via APT...');
|
|
355
|
+
const installResult = await shell.exec(
|
|
356
|
+
'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y yarn'
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
if (installResult.code !== 0) {
|
|
360
|
+
console.log('Failed to install Yarn via APT.');
|
|
361
|
+
console.log(installResult.stderr || installResult.stdout);
|
|
362
|
+
console.log('');
|
|
363
|
+
console.log('Troubleshooting:');
|
|
364
|
+
console.log(' 1. Ensure the Yarn repository was added correctly:');
|
|
365
|
+
console.log(` cat ${YARN_APT_LIST_PATH}`);
|
|
366
|
+
console.log(' 2. Run "sudo apt-get update" and retry');
|
|
367
|
+
console.log(' 3. Ensure Node.js is installed: dev install node');
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Verify the installation succeeded
|
|
372
|
+
const yarnVersion = await getYarnVersion();
|
|
373
|
+
if (!yarnVersion) {
|
|
374
|
+
console.log('Installation may have failed: yarn command not found after install.');
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
console.log('Yarn installed successfully.');
|
|
379
|
+
console.log('');
|
|
380
|
+
console.log(`Yarn version: ${yarnVersion}`);
|
|
381
|
+
console.log('');
|
|
382
|
+
console.log('Verify installation with: yarn --version');
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Install Yarn on Ubuntu running in WSL (Windows Subsystem for Linux).
|
|
387
|
+
*
|
|
388
|
+
* Prerequisites:
|
|
389
|
+
* - Windows 10 version 2004 or higher, or Windows 11
|
|
390
|
+
* - WSL 2 enabled with Ubuntu distribution installed
|
|
391
|
+
* - sudo privileges within WSL
|
|
392
|
+
* - Node.js installed within WSL
|
|
393
|
+
*
|
|
394
|
+
* WSL runs Ubuntu within Windows, so Yarn installation follows the same
|
|
395
|
+
* APT-based process as native Ubuntu using the official Yarn repository.
|
|
396
|
+
*
|
|
397
|
+
* NOTE: The Yarn installed within WSL is separate from any Yarn
|
|
398
|
+
* installation on the Windows host. It is common and expected to have
|
|
399
|
+
* different Yarn versions in WSL and Windows.
|
|
400
|
+
*
|
|
401
|
+
* @returns {Promise<void>}
|
|
402
|
+
*/
|
|
403
|
+
async function install_ubuntu_wsl() {
|
|
404
|
+
console.log('Detected Ubuntu running in WSL (Windows Subsystem for Linux).');
|
|
405
|
+
console.log('');
|
|
406
|
+
|
|
407
|
+
// Check if Yarn is already installed
|
|
408
|
+
const existingVersion = await getYarnVersion();
|
|
409
|
+
if (existingVersion) {
|
|
410
|
+
console.log(`Yarn ${existingVersion} is already installed, skipping...`);
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Set up the official Yarn APT repository
|
|
415
|
+
await setupYarnAptRepository();
|
|
416
|
+
|
|
417
|
+
// Install Yarn from the official Yarn repository
|
|
418
|
+
console.log('Installing Yarn via APT...');
|
|
419
|
+
const installResult = await shell.exec(
|
|
420
|
+
'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y yarn'
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
if (installResult.code !== 0) {
|
|
424
|
+
console.log('Failed to install Yarn via APT.');
|
|
425
|
+
console.log(installResult.stderr || installResult.stdout);
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Verify the installation succeeded
|
|
430
|
+
const yarnVersion = await getYarnVersion();
|
|
431
|
+
if (!yarnVersion) {
|
|
432
|
+
console.log('Installation may have failed: yarn command not found after install.');
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
console.log('Yarn installed successfully in WSL.');
|
|
437
|
+
console.log('');
|
|
438
|
+
console.log(`Yarn version: ${yarnVersion}`);
|
|
439
|
+
console.log('');
|
|
440
|
+
console.log('WSL Tips:');
|
|
441
|
+
console.log(' - Store projects in ~/... (Linux filesystem) for best yarn performance');
|
|
442
|
+
console.log(' - Accessing /mnt/c/... (Windows filesystem) is slower for yarn operations');
|
|
443
|
+
console.log('');
|
|
444
|
+
console.log('Verify installation with: yarn --version');
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Install Yarn on Raspberry Pi OS using APT with the official Yarn repository.
|
|
449
|
+
*
|
|
450
|
+
* Prerequisites:
|
|
451
|
+
* - Raspberry Pi OS (Bookworm or Bullseye recommended)
|
|
452
|
+
* - Raspberry Pi 3B+ or later (64-bit OS recommended)
|
|
453
|
+
* - At least 1 GB RAM (2 GB or more recommended)
|
|
454
|
+
* - sudo privileges
|
|
455
|
+
* - Node.js installed
|
|
456
|
+
* - Internet connectivity
|
|
457
|
+
*
|
|
458
|
+
* This function supports both 64-bit (aarch64) and 32-bit (armv7l) Raspberry Pi OS.
|
|
459
|
+
* The official Yarn repository provides builds for both architectures.
|
|
460
|
+
*
|
|
461
|
+
* The installation process is identical to Ubuntu/Debian since Raspberry Pi OS
|
|
462
|
+
* is Debian-based.
|
|
463
|
+
*
|
|
464
|
+
* @returns {Promise<void>}
|
|
465
|
+
*/
|
|
466
|
+
async function install_raspbian() {
|
|
467
|
+
console.log('Checking if Yarn is already installed...');
|
|
468
|
+
|
|
469
|
+
// Check if Yarn is already installed
|
|
470
|
+
const existingVersion = await getYarnVersion();
|
|
471
|
+
if (existingVersion) {
|
|
472
|
+
console.log(`Yarn ${existingVersion} is already installed, skipping...`);
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Check and report architecture for informational purposes
|
|
477
|
+
const archResult = await shell.exec('uname -m');
|
|
478
|
+
const arch = archResult.stdout.trim();
|
|
479
|
+
console.log(`Detected architecture: ${arch}`);
|
|
480
|
+
|
|
481
|
+
// Set up the official Yarn APT repository
|
|
482
|
+
await setupYarnAptRepository();
|
|
483
|
+
|
|
484
|
+
// Install Yarn from the official Yarn repository
|
|
485
|
+
console.log('Installing Yarn via APT...');
|
|
486
|
+
const installResult = await shell.exec(
|
|
487
|
+
'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y yarn'
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
if (installResult.code !== 0) {
|
|
491
|
+
console.log('Failed to install Yarn via APT.');
|
|
492
|
+
console.log(installResult.stderr || installResult.stdout);
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Verify the installation succeeded
|
|
497
|
+
const yarnVersion = await getYarnVersion();
|
|
498
|
+
if (!yarnVersion) {
|
|
499
|
+
console.log('Installation may have failed: yarn command not found after install.');
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
console.log('Yarn installed successfully.');
|
|
504
|
+
console.log('');
|
|
505
|
+
console.log(`Yarn version: ${yarnVersion}`);
|
|
506
|
+
console.log('');
|
|
507
|
+
console.log('NOTE: If yarn install is slow or runs out of memory, consider:');
|
|
508
|
+
console.log(' - Using a faster SD card (Class 10, A1/A2 rated)');
|
|
509
|
+
console.log(' - Increasing swap space for memory-intensive operations');
|
|
510
|
+
console.log('');
|
|
511
|
+
console.log('Verify installation with: yarn --version');
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Install Yarn on Amazon Linux using DNF or YUM with the official Yarn repository.
|
|
516
|
+
*
|
|
517
|
+
* Prerequisites:
|
|
518
|
+
* - Amazon Linux 2023 (AL2023) or Amazon Linux 2 (AL2)
|
|
519
|
+
* - Alternatively: RHEL 8+, CentOS Stream 8+, Fedora 36+
|
|
520
|
+
* - sudo privileges
|
|
521
|
+
* - Node.js installed
|
|
522
|
+
* - Internet connectivity
|
|
523
|
+
*
|
|
524
|
+
* Note: Amazon Linux 2023 uses DNF as the package manager. Amazon Linux 2 uses YUM.
|
|
525
|
+
* This function automatically detects and uses the appropriate package manager.
|
|
526
|
+
*
|
|
527
|
+
* @returns {Promise<void>}
|
|
528
|
+
*/
|
|
529
|
+
async function install_amazon_linux() {
|
|
530
|
+
console.log('Checking if Yarn is already installed...');
|
|
531
|
+
|
|
532
|
+
// Check if Yarn is already installed
|
|
533
|
+
const existingVersion = await getYarnVersion();
|
|
534
|
+
if (existingVersion) {
|
|
535
|
+
console.log(`Yarn ${existingVersion} is already installed, skipping...`);
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// Detect package manager (dnf for AL2023, yum for AL2)
|
|
540
|
+
const hasDnf = shell.commandExists('dnf');
|
|
541
|
+
const hasYum = shell.commandExists('yum');
|
|
542
|
+
const packageManager = hasDnf ? 'dnf' : (hasYum ? 'yum' : null);
|
|
543
|
+
|
|
544
|
+
if (!packageManager) {
|
|
545
|
+
console.log('Neither dnf nor yum package manager found.');
|
|
546
|
+
console.log('This installer supports Amazon Linux 2023 (dnf) and Amazon Linux 2 (yum).');
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
console.log(`Detected package manager: ${packageManager}`);
|
|
551
|
+
|
|
552
|
+
// Set up the official Yarn YUM/DNF repository
|
|
553
|
+
await setupYarnRpmRepository();
|
|
554
|
+
|
|
555
|
+
// Install Yarn using the detected package manager
|
|
556
|
+
console.log(`Installing Yarn via ${packageManager}...`);
|
|
557
|
+
const installCommand = packageManager === 'dnf'
|
|
558
|
+
? 'sudo dnf install -y yarn'
|
|
559
|
+
: 'sudo yum install -y yarn';
|
|
560
|
+
|
|
561
|
+
const installResult = await shell.exec(installCommand);
|
|
562
|
+
|
|
563
|
+
if (installResult.code !== 0) {
|
|
564
|
+
console.log(`Failed to install Yarn via ${packageManager}.`);
|
|
565
|
+
console.log(installResult.stderr || installResult.stdout);
|
|
566
|
+
console.log('');
|
|
567
|
+
console.log('Troubleshooting:');
|
|
568
|
+
console.log(` 1. Verify the Yarn repository was added: cat ${YARN_RPM_REPO_PATH}`);
|
|
569
|
+
console.log(` 2. Clean cache and retry: sudo ${packageManager} clean all`);
|
|
570
|
+
console.log(' 3. Ensure Node.js is installed: dev install node');
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Verify the installation succeeded
|
|
575
|
+
const yarnVersion = await getYarnVersion();
|
|
576
|
+
if (!yarnVersion) {
|
|
577
|
+
console.log('Installation may have failed: yarn command not found after install.');
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
console.log('Yarn installed successfully.');
|
|
582
|
+
console.log('');
|
|
583
|
+
console.log(`Yarn version: ${yarnVersion}`);
|
|
584
|
+
console.log('');
|
|
585
|
+
console.log('Verify installation with: yarn --version');
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* Install Yarn on Windows using Chocolatey.
|
|
590
|
+
*
|
|
591
|
+
* Prerequisites:
|
|
592
|
+
* - Windows 10 version 1903 or higher (64-bit), or Windows 11
|
|
593
|
+
* - Administrator PowerShell or Command Prompt
|
|
594
|
+
* - Chocolatey package manager installed
|
|
595
|
+
* - Node.js installed (Chocolatey can install it automatically)
|
|
596
|
+
* - Internet connectivity
|
|
597
|
+
*
|
|
598
|
+
* This function installs Yarn Classic (1.22.x) via Chocolatey.
|
|
599
|
+
*
|
|
600
|
+
* IMPORTANT: A new terminal window must be opened after installation
|
|
601
|
+
* for PATH changes to take effect.
|
|
602
|
+
*
|
|
603
|
+
* @returns {Promise<void>}
|
|
604
|
+
*/
|
|
605
|
+
async function install_windows() {
|
|
606
|
+
console.log('Checking if Yarn is already installed...');
|
|
607
|
+
|
|
608
|
+
// Check if Yarn is already installed via Chocolatey
|
|
609
|
+
const isChocoYarnInstalled = await choco.isPackageInstalled(CHOCO_PACKAGE_NAME);
|
|
610
|
+
if (isChocoYarnInstalled) {
|
|
611
|
+
const version = await getYarnVersion();
|
|
612
|
+
console.log(`Yarn ${version || 'unknown version'} is already installed via Chocolatey, skipping...`);
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// Also check if yarn command exists (might be installed via other means)
|
|
617
|
+
const existingVersion = await getYarnVersion();
|
|
618
|
+
if (existingVersion) {
|
|
619
|
+
console.log(`Yarn ${existingVersion} is already installed, skipping...`);
|
|
620
|
+
console.log('');
|
|
621
|
+
console.log('Note: Yarn was not installed via Chocolatey.');
|
|
622
|
+
console.log('If you want to manage it with Chocolatey, first uninstall the existing version.');
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// Verify Chocolatey is available - it is required for Windows installation
|
|
627
|
+
if (!choco.isInstalled()) {
|
|
628
|
+
console.log('Chocolatey is not installed. Please install Chocolatey first.');
|
|
629
|
+
console.log('');
|
|
630
|
+
console.log('To install Chocolatey, run in an Administrator PowerShell:');
|
|
631
|
+
console.log(" Set-ExecutionPolicy Bypass -Scope Process -Force; " +
|
|
632
|
+
"[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; " +
|
|
633
|
+
"iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))");
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// Install Yarn using Chocolatey
|
|
638
|
+
console.log('Installing Yarn via Chocolatey...');
|
|
639
|
+
console.log('This may take a few minutes...');
|
|
640
|
+
const result = await choco.install(CHOCO_PACKAGE_NAME);
|
|
641
|
+
|
|
642
|
+
if (!result.success) {
|
|
643
|
+
console.log('Failed to install Yarn via Chocolatey.');
|
|
644
|
+
console.log(result.output);
|
|
645
|
+
console.log('');
|
|
646
|
+
console.log('Troubleshooting:');
|
|
647
|
+
console.log(' 1. Ensure you are running as Administrator');
|
|
648
|
+
console.log(' 2. Try: choco install yarn -y --force');
|
|
649
|
+
console.log(' 3. Ensure Node.js is installed: choco install nodejs-lts -y');
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// Verify the installation succeeded by checking if the package is now installed
|
|
654
|
+
const verified = await choco.isPackageInstalled(CHOCO_PACKAGE_NAME);
|
|
655
|
+
if (!verified) {
|
|
656
|
+
console.log('Installation may have failed: Yarn package not found after install.');
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
console.log('Yarn installed successfully via Chocolatey.');
|
|
661
|
+
console.log('');
|
|
662
|
+
console.log('IMPORTANT: Close and reopen your terminal for PATH changes to take effect.');
|
|
663
|
+
console.log('');
|
|
664
|
+
console.log('After reopening the terminal, verify with:');
|
|
665
|
+
console.log(' yarn --version');
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* Install Yarn from Git Bash on Windows.
|
|
670
|
+
*
|
|
671
|
+
* Git Bash runs within Windows and inherits the Windows PATH, so once
|
|
672
|
+
* Yarn is installed on Windows, the 'yarn' command is automatically
|
|
673
|
+
* available in Git Bash.
|
|
674
|
+
*
|
|
675
|
+
* This function installs Yarn on the Windows host using Chocolatey
|
|
676
|
+
* via PowerShell interop.
|
|
677
|
+
*
|
|
678
|
+
* Prerequisites:
|
|
679
|
+
* - Windows 10 or Windows 11 (64-bit)
|
|
680
|
+
* - Git Bash installed (comes with Git for Windows)
|
|
681
|
+
* - Chocolatey package manager installed on Windows
|
|
682
|
+
* - Administrator privileges
|
|
683
|
+
* - Node.js installed
|
|
684
|
+
*
|
|
685
|
+
* @returns {Promise<void>}
|
|
686
|
+
*/
|
|
687
|
+
async function install_gitbash() {
|
|
688
|
+
console.log('Detected Git Bash on Windows.');
|
|
689
|
+
console.log('');
|
|
690
|
+
|
|
691
|
+
// Check if Yarn is already available (it should be if installed on Windows)
|
|
692
|
+
const existingVersion = await getYarnVersion();
|
|
693
|
+
if (existingVersion) {
|
|
694
|
+
console.log(`Yarn ${existingVersion} is already installed, skipping...`);
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
// Install via PowerShell using Chocolatey
|
|
699
|
+
console.log('Installing Yarn on the Windows host via Chocolatey...');
|
|
700
|
+
console.log('This may take a few minutes...');
|
|
701
|
+
|
|
702
|
+
const installResult = await shell.exec(
|
|
703
|
+
`powershell.exe -NoProfile -Command "choco install ${CHOCO_PACKAGE_NAME} -y"`
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
if (installResult.code !== 0) {
|
|
707
|
+
console.log('Failed to install Yarn.');
|
|
708
|
+
console.log(installResult.stdout || installResult.stderr);
|
|
709
|
+
console.log('');
|
|
710
|
+
console.log('Troubleshooting:');
|
|
711
|
+
console.log(' 1. Ensure Chocolatey is installed on Windows');
|
|
712
|
+
console.log(' 2. Run Git Bash as Administrator and retry');
|
|
713
|
+
console.log(' 3. Ensure Node.js is installed: choco install nodejs-lts -y');
|
|
714
|
+
console.log(' 4. Try installing directly from PowerShell:');
|
|
715
|
+
console.log(' choco install yarn -y');
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
console.log('Yarn installed successfully.');
|
|
720
|
+
console.log('');
|
|
721
|
+
console.log('IMPORTANT: Close and reopen Git Bash for PATH changes to take effect.');
|
|
722
|
+
console.log('');
|
|
723
|
+
console.log('Git Bash tips:');
|
|
724
|
+
console.log(' - For interactive yarn commands, you may need: winpty yarn');
|
|
725
|
+
console.log(' - Add alias to ~/.bashrc if needed: alias yarn="winpty yarn"');
|
|
726
|
+
console.log('');
|
|
727
|
+
console.log('After reopening Git Bash, verify with:');
|
|
728
|
+
console.log(' yarn --version');
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Check if Yarn is installed on the current system.
|
|
733
|
+
* @returns {Promise<boolean>} True if Yarn is installed
|
|
734
|
+
*/
|
|
735
|
+
async function isInstalled() {
|
|
736
|
+
const platform = os.detect();
|
|
737
|
+
if (platform.type === 'macos') {
|
|
738
|
+
return brew.isFormulaInstalled(HOMEBREW_FORMULA_NAME);
|
|
739
|
+
}
|
|
740
|
+
if (platform.type === 'windows') {
|
|
741
|
+
return choco.isPackageInstalled(CHOCO_PACKAGE_NAME);
|
|
742
|
+
}
|
|
743
|
+
return isYarnCommandAvailable();
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/**
|
|
747
|
+
* Check if this installer is supported on the current platform.
|
|
748
|
+
* Yarn is supported on all major platforms.
|
|
749
|
+
* @returns {boolean} True if installation is supported on this platform
|
|
750
|
+
*/
|
|
751
|
+
function isEligible() {
|
|
752
|
+
const platform = os.detect();
|
|
753
|
+
return ['macos', 'ubuntu', 'debian', 'wsl', 'raspbian', 'amazon_linux', 'fedora', 'rhel', 'windows', 'gitbash'].includes(platform.type);
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/**
|
|
757
|
+
* Main installation entry point - detects platform and runs appropriate installer.
|
|
758
|
+
*
|
|
759
|
+
* This function detects the current operating system and dispatches to the
|
|
760
|
+
* appropriate platform-specific installer function. Yarn is supported on
|
|
761
|
+
* all major platforms:
|
|
762
|
+
*
|
|
763
|
+
* - macOS: Homebrew (Yarn Classic 1.22.x)
|
|
764
|
+
* - Ubuntu/Debian: APT with official Yarn repository (Yarn Classic 1.22.x)
|
|
765
|
+
* - Ubuntu on WSL: APT with official Yarn repository (Yarn Classic 1.22.x)
|
|
766
|
+
* - Raspberry Pi OS: APT with official Yarn repository (Yarn Classic 1.22.x)
|
|
767
|
+
* - Amazon Linux/RHEL: DNF/YUM with official Yarn repository (Yarn Classic 1.22.x)
|
|
768
|
+
* - Windows: Chocolatey (Yarn Classic 1.22.x)
|
|
769
|
+
* - Git Bash: Chocolatey on Windows host (Yarn Classic 1.22.x)
|
|
12
770
|
*
|
|
13
771
|
* @returns {Promise<void>}
|
|
14
772
|
*/
|
|
15
773
|
async function install() {
|
|
16
774
|
const platform = os.detect();
|
|
17
775
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
776
|
+
// Map platform types to their corresponding installer functions
|
|
777
|
+
// Multiple platform types can map to the same installer (e.g., debian and ubuntu)
|
|
778
|
+
const installers = {
|
|
779
|
+
'macos': install_macos,
|
|
780
|
+
'ubuntu': install_ubuntu,
|
|
781
|
+
'debian': install_ubuntu,
|
|
782
|
+
'wsl': install_ubuntu_wsl,
|
|
783
|
+
'raspbian': install_raspbian,
|
|
784
|
+
'amazon_linux': install_amazon_linux,
|
|
785
|
+
'fedora': install_amazon_linux,
|
|
786
|
+
'rhel': install_amazon_linux,
|
|
787
|
+
'windows': install_windows,
|
|
788
|
+
'gitbash': install_gitbash,
|
|
789
|
+
};
|
|
790
|
+
|
|
791
|
+
// Look up the installer for the detected platform
|
|
792
|
+
const installer = installers[platform.type];
|
|
793
|
+
|
|
794
|
+
// If no installer exists for this platform, inform the user gracefully
|
|
795
|
+
if (!installer) {
|
|
796
|
+
console.log(`Yarn is not available for ${platform.type}.`);
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// Run the platform-specific installer
|
|
801
|
+
await installer();
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
// Export all functions for use as a module and for testing
|
|
805
|
+
module.exports = {
|
|
806
|
+
install,
|
|
807
|
+
isInstalled,
|
|
808
|
+
isEligible,
|
|
809
|
+
install_macos,
|
|
810
|
+
install_ubuntu,
|
|
811
|
+
install_ubuntu_wsl,
|
|
812
|
+
install_raspbian,
|
|
813
|
+
install_amazon_linux,
|
|
814
|
+
install_windows,
|
|
815
|
+
install_gitbash,
|
|
816
|
+
};
|
|
41
817
|
|
|
818
|
+
// Allow direct execution: node yarn.js
|
|
42
819
|
if (require.main === module) {
|
|
43
|
-
install()
|
|
820
|
+
install().catch(err => {
|
|
821
|
+
console.error(err.message);
|
|
822
|
+
process.exit(1);
|
|
823
|
+
});
|
|
44
824
|
}
|