diff options
author | Markus Heiser <markus.heiser@darmarit.de> | 2021-11-14 18:10:14 +0100 |
---|---|---|
committer | Markus Heiser <markus.heiser@darmarit.de> | 2021-11-16 23:31:11 +0100 |
commit | dc1442a2d1dbca5007833b14e34aa7f407801706 (patch) | |
tree | ce32f0f67ee80732789dd0c96c4a9115be5c4c35 /utils/lib_nvm.sh | |
parent | 646db5d4f942b4c4da4a62f38b159bd80b7f9db1 (diff) | |
download | searxng-dc1442a2d1dbca5007833b14e34aa7f407801706.tar.gz searxng-dc1442a2d1dbca5007833b14e34aa7f407801706.zip |
[mod] Tools to install and maintain NVM versions manager for Node.js
[1] https://github.com/nvm-sh/nvm
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Diffstat (limited to 'utils/lib_nvm.sh')
-rwxr-xr-x | utils/lib_nvm.sh | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/utils/lib_nvm.sh b/utils/lib_nvm.sh new file mode 100755 index 000000000..c12be05cf --- /dev/null +++ b/utils/lib_nvm.sh @@ -0,0 +1,171 @@ +#!/usr/bin/env bash +# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*- +# SPDX-License-Identifier: AGPL-3.0-or-later +# +# Tools to install and maintain NVM versions manager for Node.js +# +# [1] https://github.com/nvm-sh/nvm + +# https://github.com/koalaman/shellcheck/issues/356#issuecomment-853515285 +# shellcheck source=utils/lib.sh +. /dev/null + +declare main_cmd + +# configure nvm environment +# ------------------------- + +NVM_LOCAL_FOLDER=.nvm + +[[ -z "${NVM_GIT_URL}" ]] && NVM_GIT_URL="https://github.com/nvm-sh/nvm.git" +[[ -z "${NVM_MIN_NODE_VER}" ]] && NVM_MIN_NODE_VER="16.13.0" + +# initalize nvm environment +# ------------------------- + +nvm.env() { + source "${NVM_DIR}/nvm.sh" + source "${NVM_DIR}/bash_completion" +} + +nvm.is_installed() { + # is true if NVM is installed / in $HOME or even in <repo-root>/.nvm + [[ -d "${NVM_DIR}" ]] +} + +if [[ -z "${NVM_DIR}" ]]; then + # nvm is not pre-intalled in $HOME. Prepare for using nvm from <repo-root> + NVM_DIR="$(git rev-parse --show-toplevel)/${NVM_LOCAL_FOLDER}" +fi +export NVM_DIR + +if nvm.is_installed; then + [ "$VERBOSE" = "1" ] && info_msg "source NVM environment from ${NVM_DIR}" + nvm.env +else + # if nvm is not installed, use this function as a wrapper + nvm() { + nvm.ensure + nvm "$@" + } +fi + +# implement nvm functions +# ----------------------- + +nvm.is_local() { + # is true if NVM is installed in <repo-root>/.nvm + [ "${NVM_DIR}" = "$(git rev-parse --show-toplevel)/${NVM_LOCAL_FOLDER}" ] +} + +nvm.min_node(){ + + # usage: nvm.min_node 16.3.0 + # + # Is true if minimal Node.js version is installed. + + local min_v + local node_v + local higher_v + + if ! command -v node >/dev/null; then + wanr_msg "Node.js is not yet installed" + return 42 + fi + + min_v="${1}" + node_v="$(node --version)" + node_v="${node_v:1}" # remove 'v' from 'v16.3.0' + if ! [ "${min_v}" = "${node_v}" ]; then + higher_v="$(echo -e "$min_v\n${node_v}" | sort -Vr | head -1)" + if [ "${min_v}" = "${higher_v}" ]; then + return 42 + fi + fi +} + +# implement nvm command line +# -------------------------- + +nvm.help(){ + cat <<EOF +nvm.: use nvm (without dot) to execute nvm commands directly + install : install NVM locally at $(git rev-parse --show-toplevel)/${NVM_LOCAL_FOLDER} + clean : remove NVM installation + status : prompt some status informations about nvm & node + nodejs : install Node.js latest LTS + bash : start bash interpreter with NVM environment sourced +EOF +} + +nvm.install() { + local NVM_VERSION_TAG + info_msg "install (update) NVM at ${NVM_DIR}" + if [[ -d "${NVM_DIR}" ]] ; then + info_msg "already cloned at: ${NVM_DIR}" + pushd "${NVM_DIR}" &> /dev/null + git fetch --all | prefix_stdout " ${_Yellow}||${_creset} " + else + info_msg "clone: ${NVM_GIT_URL}" + git clone "${NVM_GIT_URL}" "${NVM_DIR}" 2>&1 | prefix_stdout " ${_Yellow}||${_creset} " + pushd "${NVM_DIR}" &> /dev/null + git config --local advice.detachedHead false + fi + NVM_VERSION_TAG="$(git rev-list --tags --max-count=1)" + NVM_VERSION_TAG="$(git describe --abbrev=0 --tags --match "v[0-9]*" "${NVM_VERSION_TAG}")" + info_msg "checkout ${NVM_VERSION_TAG}" + git checkout "${NVM_VERSION_TAG}" 2>&1 | prefix_stdout " ${_Yellow}||${_creset} " + nvm.env +} + +nvm.clean() { + if ! nvm.is_installed; then + info_msg "NVM is not installed" + return 42 + fi + if ! nvm.is_local; then + info_msg "can't remove NVM from ${NVM_DIR}" + return 42 + fi + rm -rf "${NVM_DIR}" +} + +nvm.status(){ + if command -v node >/dev/null; then + info_msg "Node.js is installed at $(command -v node)" + info_msg "Node.js is version $(node --version)" + if ! nvm.min_node "${NVM_MIN_NODE_VER}"; then + warn_msg "minimal Node.js version is ${NVM_MIN_NODE_VER}" + fi + else + warn_msg "Node.js is mot installed" + fi + if command -v npm >/dev/null; then + info_msg "npm is installed at $(command -v npm)" + info_msg "npm is version $(npm --version)" + else + warn_msg "npm is not installed" + fi + if nvm.is_installed; then + info_msg "NVM is installed at ${NVM_DIR}" + else + warn_msg "NVM is not installed" + info_msg "to install NVM and Node.js (LTS) use: ${main_cmd} nvm install --lts" + fi +} + +nvm.nodejs(){ + nvm install --lts + nvm.status +} + +nvm.bash() { + nvm.ensure + bash --init-file <(cat "${NVM_DIR}/nvm.sh" "${NVM_DIR}/bash_completion") +} + +nvm.ensure() { + if ! nvm.is_installed; then + nvm.install + fi +} |