#!/bin/sh WORK="$PWD/normalize_lts-non-numeric-work.$$" export HOME="$WORK/home" export NVM_DIR="$HOME/.nvm" MARKER='nvm_normalize_lts_pwned' cleanup() { unset -f die cleanup rm -rf "$WORK" rm -f "${MARKER}" } die () { echo "$@" ; cleanup ; exit 1; } mkdir -p "$NVM_DIR/alias/lts" rm -f "${MARKER}" : nvm.sh \. ../../../nvm.sh echo 'lts/iron' > "$NVM_DIR/alias/lts/*" echo 'v18.0.0' > "$NVM_DIR/alias/lts/hydrogen" echo 'v20.0.0' > "$NVM_DIR/alias/lts/iron" ACTUAL="$(nvm_normalize_lts 'lts/-1')" EXPECTED='lts/hydrogen' [ "${ACTUAL}" = "${EXPECTED}" ] || die "lts/-1: expected >${EXPECTED}<, got >${ACTUAL}<" ACTUAL="$(nvm_normalize_lts 'lts/-1x')" EXPECTED='lts/-1x' [ "${ACTUAL}" = "${EXPECTED}" ] || die "lts/-1x: expected >${EXPECTED}<, got >${ACTUAL}<" ACTUAL="$(nvm_normalize_lts 'lts/-1-1')" EXPECTED='lts/-1-1' [ "${ACTUAL}" = "${EXPECTED}" ] || die "lts/-1-1: expected >${EXPECTED}<, got >${ACTUAL}<" ACTUAL="$(nvm_normalize_lts 'lts/-10+1')" EXPECTED='lts/-10+1' [ "${ACTUAL}" = "${EXPECTED}" ] || die "lts/-10+1: expected >${EXPECTED}<, got >${ACTUAL}<" # bash and zsh run command substitutions in array subscripts during arithmetic evaluation INJECTED="lts/-10*path[\$(touch ${MARKER})1]" ACTUAL="$(nvm_normalize_lts "${INJECTED}" 2>/dev/null)" [ ! -e "${MARKER}" ] || die "nvm_normalize_lts evaluated ${INJECTED}" [ "${ACTUAL}" = "${INJECTED}" ] || die "${INJECTED}: expected it unchanged, got >${ACTUAL}<" nvm_alias "${INJECTED}" >/dev/null 2>&1 [ ! -e "${MARKER}" ] || die "nvm_alias evaluated ${INJECTED}" # an alias file written by an older nvm from a hostile mirror's index.tab echo "${INJECTED}" > "$NVM_DIR/alias/lts/iron" nvm_resolve_alias 'lts/*' >/dev/null 2>&1 [ ! -e "${MARKER}" ] || die "nvm_resolve_alias evaluated a stored ${INJECTED}" cleanup echo "nvm_normalize_lts non-numeric offset: passed"