#!/usr/bin/env bash # npm plugin for KYMSU (install local package) # https://github.com/welcoMattic/kymsu # ######################################### # # Settings: # Display info on updated pakages / casks display_info=true # No distract mode (no user interaction) [[ $@ =~ "-nodistract" || $@ =~ "-n" ]] && no_distract=true || no_distract=false # Set ls_color to '' for output nvm list in default colors, else '--no-colors' # ls_color='--no-colors' # ls_color='BrGcm' for custom colors # export NVM_COLORS='BrGcm' in .zshrc for persistant custom colors # Set doctor=true to run 'npm doctor' and 'npm cache verify' each time doctor=true # Set update_node to true to update node. update_node=true # Local install: # run 'npm init' in local_path to create package.json local_path=$HOME/Sites/ # Add module to the do_not_update array for prevent to update. #declare -a do_not_update=() #declare -a do_not_update=("parso" "asgiref") declare -a do_not_update=("@squoosh/cli") ######################################### : <<'END_COMMENT' blabla END_COMMENT italic="\033[3m" underline="\033[4m" ita_under="\033[3;4m" bgd="\033[1;4;31m" red="\033[1;31m" green="\033[1;32m" bold="\033[1m" bold_ita="\033[1;3m" box="\033[1;41m" redbold="\033[1;31m" redbox="\033[1;41m" reset="\033[0m" upd_nvm() {( cd "$NVM_DIR" git fetch --tags origin git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)` ) && \. "$NVM_DIR/nvm.sh" } export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion echo -e "${bold}๐ŸŒฟ npm ${reset}" echo "" # version courante de node.js node_v=$(node -v) node_ins=$(which node) echo -e "${underline}๐ŸŒฟ node.js:${reset}" echo -e " - current version: ${italic}$node_v${reset}" echo -e " - install path: ${italic}$node_ins${reset}" # version courante de npm npm_v=$(npm -v) npm_ins=$(which npm) old_npm="$npm_v" echo -e "\n${underline}๐ŸŒฟ npm:${reset}" echo -e " - current version: ${italic}$npm_v${reset}" echo -e " - install path: ${italic}$npm_ins${reset}" curl -Is https://www.apple.com | head -1 | grep 200 1>/dev/null if [[ $? -eq 1 ]]; then echo -e "\n${red}No Internet connection !${reset}" echo -e "Exit !" exit 1 fi # version installรฉe de nvm par Homebrew # nvm_installed=$(brew info nvm | grep Cellar) # version actuelle de nvm sur GitHub version_nvm=$(git ls-remote --tags --refs --sort="v:refname" https://github.com/nvm-sh/nvm.git | tail -n1 | sed 's/.*\///' | sed 's/v//') # nvm from github if [ -f "$NVM_DIR/nvm.sh" ]; then source $NVM_DIR/nvm.sh # version courante de nvm nvm_v=$(nvm --version) echo -e "\n${underline}๐ŸŒฟ nvm install is:${reset} $NVM_DIR/nvm.sh" echo " - nvm $nvm_v is installed from https://github.com/nvm-sh/nvm" if [ -n "$version_nvm" ]; then if [ "$nvm_v" != "$version_nvm" ]; then echo "Current nvm version on GitHub: $version_nvm" echo "Current nvm installed version: $nvm_v" read -p "Do you want to update nvm from GitHub repo? (y/n)" choice if [ "$choice" == "y" ]; then echo "Updating nvm from GitHub..." #curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v"$version_nvm"/install.sh | bash upd_nvm #curl: native on Catalina, wget installed by homebrew #wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash #curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash fi fi fi node_install=$(nvm list "$ls_color") echo -e "\n${underline}๐ŸŒฟ node.js${reset} (installed versions): \n$node_install" # nvm from homebrew elif [ -f "/usr/local/opt/nvm/nvm.sh" ]; then source $(brew --prefix nvm)/nvm.sh # version courante de nvm nvm_v=$(nvm --version) echo -e "\n${underline}๐ŸŒฟ nvm install is:${reset} /usr/local/opt/nvm/nvm.sh" echo "nvm $nvm_v is installed from homebrew" if [ "$nvm_v" != "$version_nvm" ]; then echo "Current nvm version on GitHub: $version_nvm" echo "Current nvm installed version: $nvm_v" echo -e "nvm is outdated ! You should run \033[1;3mbrew update && brew upgrade nvm\033[0m" echo -e "or run \033[1;3mKymsu's homebrew.sh script.${reset}" fi node_install=$(nvm list "$ls_color") echo -e "\n${underline}๐ŸŒฟ node.js${reset} (installed versions): \n$node_install" fi echo -e "${italic}Note:" echo -e "N/A: version \"10.18.0 -> N/A\" is not yet installed." echo -e "You need to run \"nvm install 10.18.0\" to install it before using it.${reset}" echo "" # Do not update packages if (( ${#do_not_update[@]} )); then nbp=${#do_not_update[*]} echo -e "${underline}๐ŸŒฟ List of${reset} ${redbox} $nbp ${reset} ${underline}'do not update' packages:${reset}" echo -e "${redbold}${do_not_update[*]}${reset}" echo -e "To remove package from this list, you need to edit the ${italic}do_not_update${reset} array." echo "" fi ################## # Local packages # ################## # 1. Create package.json file with 'npm init' # or copy packagejson in $local_path # 2. Install node modules with 'npm install' in $local_path\node_modules # Local folder exist and not empty (modules installed) #if [ -d "$local_path/node_modules" ] && [ -n "$(ls -A "$local_path/node_modules")" ]; then if find "$local_path/node_modules" -mindepth 1 -maxdepth 1 | read; then echo -e "${underline}๐ŸŒฟ Local installed scripts:${reset}" cd "$local_path" || return if [ "$display_info" = true ]; then ll=$(npm ls --long | grep -v 'git$') x= while IFS= read -r line do if [[ "${line}" =~ "โ”€โ”€" ]] || [[ "${line}" =~ "โ”€โ”ฌ" ]]; then local_pkg=$(echo "${line}" | awk '{print $2}' | awk -F"@" '{print $1}') #echo -e "${bold}${line}${reset}" info_pkg=$(npm view "$local_pkg" | sed -n '3,4p') q=$(echo "$info_pkg" | sed "s/^/| /") #echo -e "$q" x+="${bold}${line}${reset}\n" x+="$q\n" else #echo -e "${line}" x+="${line}\n" fi done <<< "$ll" else npm ls fi echo -e "$x" echo -e "\n${underline}๐ŸŒฟ Search for local packages update...${reset}\n" outdated=$(npm outdated --long | sed '1d') if [ -n "$outdated" ]; then nb_update=$(echo "outdated" | wc -l | xargs) a="available package update" array=($a) [ "$nb_update" -gt 1 ] && echo -e "${box} $nb_update ${reset} ${array[@]/%/s}:\n" || echo -e "${box} $nb_update ${reset} ${array[@]}:\n" echo -e "\n${underline}๐ŸŒฟ Updating local packages...${reset}\n" while IFS= read -r i do package=$(echo "$i" | awk '{print $1}') current=$(echo "$i" | awk '{print $2}') wanted=$(echo "$i" | awk '{print $3}') latest=$(echo "$i" | awk '{print $4}') j=$(echo "$current" | awk -F "." '{print $1}') k=$(echo "$latest" | awk -F "." '{print $1}') if [[ ! " ${do_not_update[@]} " =~ " ${package} " ]]; then # Update major version 1.x.y to 2.x.y if [ $current = $wanted ] && [ "$j" -lt "$k" ]; then if [ "$no_distract" = false ]; then echo "$package@latest" | xargs -p npm install else echo "$package@latest" | xargs npm install #npm install "$package@latest" fi # Update minor or patch version else if [ "$no_distract" = false ]; then echo "$package" | xargs -p npm update else echo "$package" | xargs npm update fi fi else echo -e "${redbold}$package is pinned to version $current !${reset} Don't update !" fi done <<< "$outdated" else echo -e "${italic}No local packages updates.${reset}" fi fi echo "" ################### # Global packages # ################### echo -e "${underline}๐ŸŒฟ Global installed scripts:${reset}" if [ "$display_info" = true ]; then lg=$(npm list --location=global --depth=0 --long | grep -v 'git$') x="" q="" while IFS= read -r line do if [[ "${line}" =~ "โ”€โ”€" ]]; then #echo -e "${bold}${line}${reset}" global_pkg=$(echo "${line}" | awk '{print $2}' | awk -F"@" '{print $1}') #echo -e "${bold}${line}${reset}" info_pkg=$(npm view "$global_pkg" | sed -n '4p') q=$(echo "$info_pkg" | sed "s/^/| /") #echo "$q" x+="${bold}${line}${reset}\n" elif [[ ${#line} > 2 ]]; then #echo -e "${line}" x+="${line}\n" x+="$q\n" fi done <<< "$lg" else npm list --location=global --depth=0 fi echo -e "$x" #Packages update echo -e "\n${underline}๐ŸŒฟ Search for global packages update...${reset}\n" glong_outdated=$(npm outdated --location=global --long | sed '1d') if [ -n "$glong_outdated" ]; then nb_update_global=$(echo "$glong_outdated" | wc -l | xargs) a="available package update" array=($a) [ "$nb_update_global" -gt 1 ] && echo -e "${box} $nb_update_global ${reset} ${array[@]/%/s}:\n" || echo -e "${box} $nb_update_global ${reset} ${array[@]}:\n" echo -e "$glong_outdated\n" echo -e "\n${underline}๐ŸŒฟ Updating global packages...${reset}\n" # Disable: Would you like to share anonymous usage data with the Angular Team at Google ? if [[ " $glong_outdated " =~ "angular" ]]; then export NG_CLI_ANALYTICS="false" fi # 15 packages are looking for funding while IFS= read -r line do pkg=$(echo "$line" | awk '{print $1}') curr=$(echo "$line" | awk '{print $2}') vers=$(echo "$line" | awk '{print $4}') outdated="$pkg@$vers" if [[ ! " ${do_not_update[@]} " =~ " ${pkg} " ]]; then # TEST #version=$(echo "$line" | awk '{print $1 "@" $4}') #echo "$version" # /test if [ "$no_distract" = false ]; then echo "$outdated" | xargs -p -n 1 npm --location=global install echo "" else echo "$outdated" | xargs -n 1 npm --location=global install echo "" fi else echo -e "${redbold}$pkg is pinned to version $curr !${reset} Don't update !" fi done <<< "$glong_outdated" else echo -e "${italic}No global packages updates.${reset}" fi echo "" ############### # Maintenance # ############### if [ "$doctor" = true ]; then echo -e "${underline}๐ŸŒฟ The Doc is checking that everything is ok.${reset}\n" #npm doctor doc=$(cd "$local_path" && npm doctor) while IFS= read -r line do if [[ "${line}" =~ "Not ok" ]]; then echo -e "${red}${line}${reset}" elif [[ "${line}" =~ "Ok" ]]; then echo -e "${green}${line}${reset}" else echo -e "${line}" fi done <<< "$doc" #echo -e "$doc\n" # search not ok => red #npm_v=$(echo "$doc" | grep 'npm -v') #node_v=$(echo "$doc" | grep 'node -v') npm_v=$(echo "$doc" | grep -A2 'Checking npm version') node_v=$(echo "$doc" | grep -A2 'Checking node version') if [[ " $node_v " =~ "Not ok" ]]; then no=$(echo "$node_v" | sed -n '$p') new_node=$(echo "$no" | awk '{print $3}' | sed 's/^.//') old_node=$(echo "$no" | awk '{print $5}' | sed 's/.//;s/.$//') if [ "$new_node" != "$old_node" ] && [ "$update_node" = true ]; then b=$(echo -e "\nCurrent node: v$old_node. Update ${bold}node${reset} to ${bold}v$new_node${reset} [y/n] ? ") read -e -p "$b" rep2 if [ "$rep2" == "y" ] || [ "$rep2" == "Y" ]; then . $HOME/.nvm/nvm.sh echo -e "\n${bold}Updating node to v$new_node...${reset}" nvm install "$new_node" echo -e "\n${bold}Updating npm...${reset}" npm --location=global install npm # nvm use $new_node echo -e "\n${bold}Reinstall packages from v$old_node...${reset}" nvm reinstall-packages "$old_node" fi fi fi if [[ " $npm_v " =~ "Not ok" ]]; then np=$(grep -o -E "v([0-9]{1,2}\.){2}[0-9]{1,2}" <<< "$npm_v") new_npm=$(echo "${np:1}") # 10.7.0 if [ "$new_npm" != "$old_npm" ]; then echo -e "${underline}\nUdpate available for npm.${reset}" echo -e " - Current: ${red}v$old_npm${reset}" echo -e " - Update: ${green}v$new_npm${reset}" echo -e "You should run:" echo -e " - ${bold}npm --location=global install npm${reset}" fi fi echo "" echo "Troubleshooting:" echo "https://github.com/nvm-sh/nvm#macos-troubleshooting" echo "" echo -e "๐Ÿ” Verifying npm cache\n" npm cache verify echo "" fi echo ""