diff --git a/plugins/node-modules-path/node-modules-path.plugin.zsh b/plugins/node-modules-path/node-modules-path.plugin.zsh new file mode 100644 index 00000000..1c9a5f7c --- /dev/null +++ b/plugins/node-modules-path/node-modules-path.plugin.zsh @@ -0,0 +1,39 @@ +SCRIPT_PATH=${0:a:h} +NODE_MODULES_PATH="" + +# Removes applied path from PATH. +function remove_from_path { + PATH=${PATH/":$1"/} + PATH=${PATH/"$1:"/} +} + +# Checks if given string is found in PATH. +function is_on_path { + if [[ "$1" ]]; then + echo $PATH | grep "$1" >/dev/null + else + return 1 + fi +} + +chpwd_handler() { + nearest_found_nm=`/usr/bin/env python $SCRIPT_PATH/path_check.py $PWD` + + if [[ "$nearest_found_nm" ]] && is_on_path "$nearest_found_nm/node_modules/.bin"; then + return + fi + + if [[ "$NODE_MODULES_PATH" ]]; then + remove_from_path "$NODE_MODULES_PATH/node_modules/.bin" + export NODE_MODULES_PATH="" + fi + + if [[ "$nearest_found_nm" ]]; then + echo "\033[1;34mFound node_modules in $nearest_found_nm, adding to path\033[0m" + PATH="$PATH:$nearest_found_nm/node_modules/.bin" + NODE_MODULES_PATH="$nearest_found_nm" + fi +} + +chpwd_functions=(${chpwd_functions[@]} "chpwd_handler") +chpwd_handler diff --git a/plugins/node-modules-path/path_check.py b/plugins/node-modules-path/path_check.py new file mode 100644 index 00000000..e2394d3a --- /dev/null +++ b/plugins/node-modules-path/path_check.py @@ -0,0 +1,28 @@ +import os +import sys + +def get_subpaths(path): + paths = [] + dirs = path.split('/')[1:] + + for i in range(len(dirs), 0, -1): + p = os.path.join(*dirs[0:i]) + yield p + +def has_modules_folder(path): + check_path = os.path.join('/', path, 'node_modules') + return os.path.exists(check_path) and os.path.isdir(check_path) + +def get_closes_path_dir(path): + for p in get_subpaths(path): + if has_modules_folder(p): + return '/' + p + return '' + +if __name__ == '__main__': + if len(sys.argv) == 1: + sys.exit(1) + else: + path = sys.argv[1] + print get_closes_path_dir(path) + sys.exit(0)