From af46875c5e2c7088b25d7d16e50b6955926b44a4 Mon Sep 17 00:00:00 2001 From: Indrajit Raychaudhuri Date: Thu, 13 May 2021 15:37:46 -0500 Subject: [PATCH] node: Revamp and optimize 'node' module Changes: - nodenv and nvm now honors (and prioritizes) `$XDG_CONFIG_HOME` over `$HOME` to lookup local nodenv/nvm installation. - Make `nvm` loading lazy (via `--no-use` argument). - Remove redundant NODENV_ROOT or NVM_DIR, respective script already set them up. - Adhere to more idiomatic Zsh operation and minimize external command usage (like `sed`). --- modules/node/README.md | 7 ++++--- modules/node/functions/node-doc | 2 +- modules/node/init.zsh | 37 ++++++++++++++++++++------------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/modules/node/README.md b/modules/node/README.md index 41130ee..315a7d2 100644 --- a/modules/node/README.md +++ b/modules/node/README.md @@ -9,7 +9,7 @@ enables [_npm_][2] completion. home directory. This will be loaded automatically if nvm is installed in `$NVM_DIR`, -_`~/.nvm`_, or nvm is installed with Homebrew. +_`$XDG_CONFIG_HOME/nvm`_, _`~/.nvm`_, or is installed with homebrew. ## nodenv @@ -18,7 +18,7 @@ Node versions. It is simple and predictable, Just Works, and is rock solid in production. nodenv is forked from the popular [_rbenv_][7]. This will be loaded automatically if nodenv is installed in `$NODENV_ROOT`, -_`~/.nodenv`_, or `nodenv` is on the path. +_`$XDG_CONFIG_HOME/nodenv`_, _`~/.nodenv`_, or `nodenv` is on the path. ## Functions @@ -46,11 +46,12 @@ _The authors of this module should be contacted via the [issue tracker][4]._ - [Sorin Ionescu](https://github.com/sorin-ionescu) - [Zeh Rizzatti](https://github.com/zehrizzatti) +- [Indrajit Raychaudhuri](https://github.com/indrajitr) [1]: http://nodejs.org [2]: http://npmjs.org [3]: http://nodejs.org/api [4]: https://github.com/sorin-ionescu/prezto/issues -[5]: https://github.com/creationix/nvm +[5]: https://github.com/nvm-sh/nvm [6]: https://github.com/nodenv/nodenv [7]: https://github.com/sstephenson/rbenv diff --git a/modules/node/functions/node-doc b/modules/node/functions/node-doc index b1a048b..92ac71d 100644 --- a/modules/node/functions/node-doc +++ b/modules/node/functions/node-doc @@ -13,6 +13,6 @@ if [[ -z "$BROWSER" ]]; then fi # TODO: Make the sections easier to use. -"$BROWSER" "http://nodejs.org/docs/$(node --version | sed 's/-.*//')/api/all.html#${1}" +"$BROWSER" "https://nodejs.org/docs/${$(node --version 2> /dev/null)/%-*}/api/all.html#${1}" # } diff --git a/modules/node/init.zsh b/modules/node/init.zsh index 45a4e8f..e83e888 100644 --- a/modules/node/init.zsh +++ b/modules/node/init.zsh @@ -1,25 +1,32 @@ # -# Loads the Node Version Manager and enables npm completion. +# Configures Node local installation, loads version managers, and defines +# variables and aliases. # # Authors: # Sorin Ionescu # Zeh Rizzatti # +# Possible lookup locations. +local_nvm_paths=({$NVM_DIR,{$XDG_CONFIG_HOME/,$HOME/.}nvm}/nvm.sh(N)) +local_nodenv_paths=({$NODENV_ROOT,{$XDG_CONFIG_HOME/,$HOME/.}nodenv}/bin/nodenv(N)) + # Load manually installed NVM into the shell session. -if [[ -s "${NVM_DIR:=$HOME/.nvm}/nvm.sh" ]]; then - source "${NVM_DIR}/nvm.sh" +if [[ -s ${local_nvm::=$local_nvm_paths[1]} ]]; then + source "$local_nvm --no-use" + unset local_nvm{,_paths} # Load package manager installed NVM into the shell session. -elif (( $+commands[brew] )) && \ - [[ -d "${nvm_prefix::="$(brew --prefix nvm 2> /dev/null)"}" ]]; then - source "${nvm_prefix}/nvm.sh" +elif (( $+commands[brew] )) \ + && [[ -d "${nvm_prefix::="$(brew --prefix nvm 2> /dev/null)"}" ]]; then + source "$nvm_prefix/nvm.sh --no-use" unset nvm_prefix # Load manually installed nodenv into the shell session. -elif [[ -s "${NODENV_ROOT:=$HOME/.nodenv}/bin/nodenv" ]]; then - path=("${NODENV_ROOT}/bin" $path) +elif [[ -s ${local_nodenv::=$local_nodenv_paths[1]} ]]; then + path=("$local_nodenv:h" $path) eval "$(nodenv init - --no-rehash zsh)" + unset local_nodenv{,_paths} # Load package manager installed nodenv into the shell session. elif (( $+commands[nodenv] )); then @@ -31,22 +38,22 @@ elif (( ! $+commands[node] )); then fi # Load NPM and known helper completions. -typeset -A compl_commands=( +typeset -A _compl_commands=( npm 'npm completion' grunt 'grunt --completion=zsh' gulp 'gulp --completion=zsh' ) -for compl_command in "${(k)compl_commands[@]}"; do - if (( $+commands[$compl_command] )); then - cache_file="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/$compl_command-cache.zsh" +for _compl_command in "${(k)_compl_commands[@]}"; do + if (( $+commands[$_compl_command] )); then + cache_file="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/${_compl_command}-cache.zsh" # Completion commands are slow; cache their output if old or missing. - if [[ "$commands[$compl_command]" -nt "$cache_file" \ + if [[ "$commands[$_compl_command]" -nt "$cache_file" \ || "${ZDOTDIR:-$HOME}/.zpreztorc" -nt "$cache_file" \ || ! -s "$cache_file" ]]; then mkdir -p "$cache_file:h" - command ${=compl_commands[$compl_command]} >! "$cache_file" 2> /dev/null + command ${=_compl_commands[$_compl_command]} >! "$cache_file" 2> /dev/null fi source "$cache_file" @@ -55,4 +62,4 @@ for compl_command in "${(k)compl_commands[@]}"; do fi done -unset compl_command{s,} +unset _compl_command{s,}