87 lines
3.0 KiB
Bash
Executable File
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
|
|
}
|