Files
apf_portal/docs/setup/scripts/40-node.sh
T
Julien Gautier ef7c1a72b2
CI / scan (pull_request) Successful in 4m38s
CI / commits (pull_request) Successful in 4m37s
CI / check (pull_request) Successful in 4m53s
CI / a11y (pull_request) Successful in 3m14s
Docs site / build (pull_request) Successful in 3m20s
CI / perf (pull_request) Successful in 4m49s
fix(setup): mirror nvm init into .zshrc so zsh sees node + pnpm
On the dev VM, 20-zsh.sh hands off to zsh via an exec in .bashrc
(chsh is blocked on the corp VM), and 40-node.sh's nvm installer only
patches .bashrc. The hand-off execs zsh before the nvm block runs and
.zshrc has no nvm init, so zsh sessions get neither node nor pnpm on
PATH on a fresh clone.

40-node.sh now appends an idempotent nvm-init block to .zshrc after
corepack enable (same marker pattern 20-zsh.sh uses for .bashrc).
Document the .zshrc patch in the bootstrap table.

Already-provisioned VMs: re-run 40-node.sh (marker-safe) or append the
block manually.
2026-05-29 17:06:58 +02:00

80 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# nvm + Node from the repo's .nvmrc + corepack + pnpm at the version pinned
# in package.json's packageManager field.
set -euo pipefail
# shellcheck source=./lib.sh
source "$(cd "$(dirname "$0")" && pwd)/lib.sh"
require_debian
require_not_root
NVM_VERSION="v0.40.1"
NVM_DIR="$HOME/.nvm"
if [[ -d "$NVM_DIR" ]]; then
skip "nvm already installed at $NVM_DIR."
else
log "Installing nvm $NVM_VERSION."
curl -fsSL "https://raw.githubusercontent.com/nvm-sh/nvm/$NVM_VERSION/install.sh" | bash
ok "nvm installed."
fi
# Source nvm so we can use it in this shell.
export NVM_DIR
# shellcheck disable=SC1091
source "$NVM_DIR/nvm.sh"
# Read .nvmrc from the repo root.
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
if [[ -z "$REPO_ROOT" ]]; then
err "Run from inside a git checkout of apf_portal (no repo root found)."
exit 1
fi
if [[ ! -f "$REPO_ROOT/.nvmrc" ]]; then
warn "$REPO_ROOT/.nvmrc not found — installing Node LTS as fallback."
nvm install --lts
nvm alias default 'lts/*'
else
NODE_VER="$(<"$REPO_ROOT/.nvmrc")"
log "Installing Node $NODE_VER (from $REPO_ROOT/.nvmrc)."
nvm install "$NODE_VER"
nvm alias default "$NODE_VER"
ok "Node $(node --version) active."
fi
# corepack — provides pnpm + yarn shims, reads packageManager from package.json.
corepack enable
ok "corepack enabled."
# Warm pnpm to download the pinned version.
if [[ -f "$REPO_ROOT/package.json" ]]; then
pushd "$REPO_ROOT" >/dev/null
pnpm --version >/dev/null
ok "pnpm $(pnpm --version) ready (from package.json packageManager)."
popd >/dev/null
fi
# The nvm installer appends its init to ~/.bashrc only. But the
# interactive shell on this VM is zsh: 20-zsh.sh hands off via
# `exec zsh -l` (chsh is blocked on the corp VM). That hand-off execs
# zsh *before* the nvm block in ~/.bashrc runs, and the nvm installer
# leaves ~/.zshrc untouched — so without this, zsh sessions have
# neither node nor pnpm on PATH. Mirror the nvm init into ~/.zshrc
# (idempotent via marker, same pattern as 20-zsh.sh's .bashrc patch).
ZSHRC="$HOME/.zshrc"
[[ -f "$ZSHRC" ]] || touch "$ZSHRC"
NVM_MARKER='# Managed by docs/setup/scripts/40-node.sh — nvm init for zsh.'
if grep -qF "$NVM_MARKER" "$ZSHRC"; then
skip "nvm init already in $ZSHRC."
else
cat >> "$ZSHRC" <<'EOF'
# Managed by docs/setup/scripts/40-node.sh — nvm init for zsh.
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
EOF
ok "Patched $ZSHRC with nvm init."
fi
log "Reload your shell (exec zsh -l) so nvm + node + pnpm are on PATH."