#!/usr/bin/env bash
set -euo pipefail
node_version="${1:?Node.js version is required}"
target_dir="${2:?Target directory is required}"
node_os="${3:-linux}"
node_arch="${4:-x64}"
case "${node_os}/${node_arch}" in
linux/x64|linux/arm64|darwin/x64|darwin/arm64) ;;
*) echo "Unsupported Node.js target: ${node_os}/${node_arch}" >&2; exit 1 ;;
esac
archive="node-v${node_version}-${node_os}-${node_arch}.tar.xz"
base_url="https://nodejs.org/dist/v${node_version}"
runtime_tmp_dir="$(mktemp -d)"
trap 'rm -rf "${runtime_tmp_dir}"' EXIT
curl -fsSL "${base_url}/${archive}" -o "${runtime_tmp_dir}/${archive}"
curl -fsSL "${base_url}/SHASUMS256.txt" -o "${runtime_tmp_dir}/SHASUMS256.txt"
(
cd "${runtime_tmp_dir}"
if command -v sha256sum >/dev/null 2>&1; then
grep " ${archive}$" SHASUMS256.txt | sha256sum -c -
else
grep " ${archive}$" SHASUMS256.txt | shasum -a 256 -c -
fi
)
mkdir -p "${target_dir}"
tar -xJf "${runtime_tmp_dir}/${archive}" -C "${target_dir}" --strip-components=1
test -x "${target_dir}/bin/node"
host_os="$(uname -s | tr '[:upper:]' '[:lower:]')"
case "$(uname -m)" in
x86_64) host_arch=x64 ;;
arm64|aarch64) host_arch=arm64 ;;
*) host_arch=unknown ;;
esac
if [ "${host_os}/${host_arch}" = "${node_os}/${node_arch}" ]; then
test "$("${target_dir}/bin/node" --version)" = "v${node_version}"
fi