artcraft/script/common/frontend_preflight.sh

87 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Shared preflight checks for the frontend dev/build scripts.
#
# Usage (from a script that has set ${frontend_path}):
#
# source "${root_dir}/script/common/frontend_preflight.sh"
# frontend_preflight "${frontend_path}"
# ...
# pushd "${frontend_path}"
# frontend_npm_install
#
# Node 20+ is required by Nx 21 and comfortably covers Vite 6.
FRONTEND_MINIMUM_NODE_MAJOR=20
frontend_preflight() {
local frontend_path="$1"
if [ ! -d "${frontend_path}" ]; then
echo "ERROR: frontend directory not found at: ${frontend_path}"
echo "Run this script from the repository root."
exit 1
fi
# --- Node and npm must be installed ---
if ! command -v node &>/dev/null; then
echo "ERROR: node is not installed (or not on PATH)."
echo "Install Node.js ${FRONTEND_MINIMUM_NODE_MAJOR}+ via nvm (https://github.com/nvm-sh/nvm),"
echo "https://nodejs.org, or:"
echo " brew install node"
exit 1
fi
if ! command -v npm &>/dev/null; then
echo "ERROR: npm is not installed (or not on PATH). It normally ships with Node.js."
echo "Reinstall Node.js to get it back."
exit 1
fi
# --- Node must be recent enough for Nx 21 / Vite 6 ---
local node_major
node_major=$(node --version | sed -E 's/^v([0-9]+).*/\1/')
if [ "${node_major}" -lt "${FRONTEND_MINIMUM_NODE_MAJOR}" ]; then
echo "ERROR: Node.js ${FRONTEND_MINIMUM_NODE_MAJOR}+ is required (found $(node --version))."
echo "Upgrade via nvm ('nvm install --lts') or https://nodejs.org."
exit 1
fi
# --- The frontend uses npm; stale pnpm state breaks installs ---
# pnpm was briefly adopted ("add pnpm to solve build issues") and then dropped
# ("fix(frontend): consume video-editor libs via nx path aliases, drop pnpm").
# A node_modules tree written by pnpm makes npm fail with ENOTEMPTY errors.
if [ -e "${frontend_path}/pnpm-lock.yaml" ] \
|| [ -e "${frontend_path}/pnpm-workspace.yaml" ] \
|| [ -d "${frontend_path}/node_modules/.pnpm" ]; then
echo "ERROR: Stale pnpm artifacts detected in ${frontend_path}."
echo "The frontend uses npm (pnpm was dropped; see frontend/README.md)."
echo "Clean up with:"
echo " cd ${frontend_path} && rm -rf node_modules pnpm-lock.yaml pnpm-workspace.yaml && npm install"
exit 1
fi
}
# Run `npm install` in the current directory. If it fails (typically from a
# corrupted node_modules tree, eg. an interrupted install or a leftover pnpm
# layout causing ENOTEMPTY rename errors), wipe node_modules and the nx cache
# and retry once before giving up.
frontend_npm_install() {
if npm install; then
return 0
fi
echo ""
echo "WARNING: npm install failed. node_modules may be corrupted (eg. an"
echo "interrupted install or a mixed npm/pnpm tree). Wiping and retrying..."
echo ""
rm -rf node_modules .nx
if ! npm install; then
echo ""
echo "ERROR: npm install failed again. See the npm output above and the"
echo "troubleshooting section in frontend/README.md."
exit 1
fi
}