@@ -6,8 +6,15 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
66. " $DIR /lib/install_strategy.sh"
77
88ACTION=" ${1:- install} "
9- # Channel: 'node' (current latest) or 'lts'. Default to 'node' to match audit latest
10- NODE_CHANNEL=" ${NODE_CHANNEL:- node} "
9+ # Channel: 'node' (current latest), 'lts', or specific major version (24, 25, etc.)
10+ # NODE_VERSION takes precedence for multi-version installs (e.g., NODE_VERSION=24)
11+ NODE_CHANNEL=" ${NODE_VERSION:- ${NODE_CHANNEL:- node} } "
12+
13+ # For multi-version display
14+ DISPLAY_NAME=" node"
15+ if [ -n " ${NODE_VERSION:- } " ]; then
16+ DISPLAY_NAME=" node@${NODE_VERSION} "
17+ fi
1118
1219ensure_nvm () {
1320 if ! have nvm; then
@@ -16,47 +23,72 @@ ensure_nvm() {
1623 ensure_nvm_loaded
1724}
1825
26+ # Get version of a specific Node.js major version (e.g., "24" -> "v24.13.0")
27+ get_specific_node_version () {
28+ local channel=" $1 "
29+ ensure_nvm_loaded
30+ # nvm version returns the installed version for a channel/alias
31+ local ver
32+ ver=" $( nvm version " $channel " 2> /dev/null || true) "
33+ if [ -n " $ver " ] && [ " $ver " != " N/A" ]; then
34+ echo " $ver "
35+ fi
36+ }
37+
1938install_node () {
2039 ensure_nvm
2140 nvm install " $NODE_CHANNEL "
22- # Resolve the concrete version (e.g. v24.8.0) and pin default to it
23- local resolved
24- resolved=" $( nvm version " $NODE_CHANNEL " 2> /dev/null || true) "
25- if [ -n " $resolved " ] && [ " $resolved " != " N/A" ]; then
26- nvm alias default " $resolved " || true
27- nvm use " $resolved " || nvm use default || true
41+
42+ # Only set default if this is NOT a multi-version install
43+ # (multi-version = specific major version like 24, 25)
44+ if [ -z " ${NODE_VERSION:- } " ]; then
45+ # Resolve the concrete version (e.g. v24.8.0) and pin default to it
46+ local resolved
47+ resolved=" $( nvm version " $NODE_CHANNEL " 2> /dev/null || true) "
48+ if [ -n " $resolved " ] && [ " $resolved " != " N/A" ]; then
49+ nvm alias default " $resolved " || true
50+ nvm use " $resolved " || nvm use default || true
51+ else
52+ # Fallback to channel if resolution failed for any reason
53+ nvm alias default " $NODE_CHANNEL " || true
54+ nvm use default || true
55+ fi
56+ corepack enable 2> /dev/null || true
57+ npm install -g npm@latest || true
58+ corepack prepare pnpm@latest --activate 2> /dev/null || true
59+ corepack prepare yarn@1 --activate 2> /dev/null || true
60+ npm install -g eslint prettier || true
2861 else
29- # Fallback to channel if resolution failed for any reason
30- nvm alias default " $NODE_CHANNEL " || true
31- nvm use default || true
62+ echo " => Node.js version $NODE_VERSION has been successfully installed"
3263 fi
33- corepack enable 2> /dev/null || true
34- npm install -g npm@latest || true
35- corepack prepare pnpm@latest --activate 2> /dev/null || true
36- corepack prepare yarn@1 --activate 2> /dev/null || true
37- npm install -g eslint prettier || true
3864}
3965
4066update_node () {
4167 ensure_nvm
4268 nvm install " $NODE_CHANNEL "
43- # Resolve and pin default to the exact installed version
44- local resolved
45- resolved=" $( nvm version " $NODE_CHANNEL " 2> /dev/null || true) "
46- if [ -n " $resolved " ] && [ " $resolved " != " N/A" ]; then
47- nvm alias default " $resolved " || true
48- nvm use " $resolved " || nvm use default || true
69+
70+ # Only set default and update global packages if NOT a multi-version install
71+ if [ -z " ${NODE_VERSION:- } " ]; then
72+ # Resolve and pin default to the exact installed version
73+ local resolved
74+ resolved=" $( nvm version " $NODE_CHANNEL " 2> /dev/null || true) "
75+ if [ -n " $resolved " ] && [ " $resolved " != " N/A" ]; then
76+ nvm alias default " $resolved " || true
77+ nvm use " $resolved " || nvm use default || true
78+ else
79+ nvm alias default " $NODE_CHANNEL " || true
80+ nvm use default || true
81+ fi
82+ # Ensure corepack shims are present
83+ corepack enable 2> /dev/null || true
84+ npm install -g npm@latest || true
85+ # Update pnpm and yarn via corepack; fall back to npm global if corepack unavailable
86+ corepack prepare pnpm@latest --activate 2> /dev/null || npm install -g pnpm@latest || true
87+ corepack prepare yarn@1 --activate 2> /dev/null || npm install -g yarn@latest || true
88+ npm update -g eslint prettier || true
4989 else
50- nvm alias default " $NODE_CHANNEL " || true
51- nvm use default || true
90+ echo " => Node.js version $NODE_VERSION has been updated"
5291 fi
53- # Ensure corepack shims are present
54- corepack enable 2> /dev/null || true
55- npm install -g npm@latest || true
56- # Update pnpm and yarn via corepack; fall back to npm global if corepack unavailable
57- corepack prepare pnpm@latest --activate 2> /dev/null || npm install -g pnpm@latest || true
58- corepack prepare yarn@1 --activate 2> /dev/null || npm install -g yarn@latest || true
59- npm update -g eslint prettier || true
6092}
6193
6294uninstall_node () {
@@ -67,18 +99,38 @@ uninstall_node() {
6799
68100reconcile_node () {
69101 local before after path
70- before=" $( command -v node > /dev/null 2>&1 && node -v || true) "
102+
103+ # For multi-version installs, check the specific version being installed
104+ if [ -n " ${NODE_VERSION:- } " ]; then
105+ before=" $( get_specific_node_version " $NODE_CHANNEL " ) "
106+ else
107+ before=" $( command -v node > /dev/null 2>&1 && node -v || true) "
108+ fi
109+
71110 if ! prefers_nvm_node; then
72111 apt_remove_if_present nodejs npm || true
73112 install_node
74113 else
75114 update_node
76115 fi
77- after=" $( command -v node > /dev/null 2>&1 && node -v || true) "
78- path=" $( command -v node 2> /dev/null || true) "
79- printf " [%s] before: %s\n" " node" " ${before:- <none>} "
80- printf " [%s] after: %s\n" " node" " ${after:- <none>} "
81- if [ -n " $path " ]; then printf " [%s] path: %s\n" " node" " $path " ; fi
116+
117+ # Check version of the specific channel we installed
118+ if [ -n " ${NODE_VERSION:- } " ]; then
119+ after=" $( get_specific_node_version " $NODE_CHANNEL " ) "
120+ # Get path to the specific version's node binary
121+ local nvm_dir=" ${NVM_DIR:- $HOME / .nvm} "
122+ local resolved_ver=" $( nvm version " $NODE_CHANNEL " 2> /dev/null || true) "
123+ if [ -n " $resolved_ver " ] && [ " $resolved_ver " != " N/A" ]; then
124+ path=" $nvm_dir /versions/node/$resolved_ver /bin/node"
125+ fi
126+ else
127+ after=" $( command -v node > /dev/null 2>&1 && node -v || true) "
128+ path=" $( command -v node 2> /dev/null || true) "
129+ fi
130+
131+ printf " [%s] before: %s\n" " $DISPLAY_NAME " " ${before:- <none>} "
132+ printf " [%s] after: %s\n" " $DISPLAY_NAME " " ${after:- <none>} "
133+ if [ -n " $path " ] && [ -x " $path " ]; then printf " [%s] path: %s\n" " $DISPLAY_NAME " " $path " ; fi
82134
83135 refresh_snapshot " node"
84136}
0 commit comments