mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-24 17:46:01 +08:00
5afd1336e8
This searched for package.json in any parent, so just like finding .git and .hg directories it _needs_ to use the physical pwd because that's what git/hg/yarn use. In general, if you do _any_ logic on $PWD, it should be the physical path. Logical $PWD is basically only good for display and cd-ing around with symlinks. [ci skip]
93 lines
3.1 KiB
Fish
93 lines
3.1 KiB
Fish
# This file is explicitly sourced by the npm and fish completions
|
|
# It is used to enumerate entries from the npm registry, interact with a locally installed
|
|
# package.json file, and more.
|
|
# Other completions that would depend on this include jspm, pnpm, etc.
|
|
|
|
# If all-the-package-names is installed, it will be used to generate npm completions.
|
|
# Install globally with `sudo npm install -g all-the-package-names`. Keep it up to date.
|
|
function __yarn_helper_installed
|
|
# This function takes the command to globally install a package as $argv[1]
|
|
if not type -q all-the-package-names
|
|
if not set -qg __fish_yarn_pkg_info_shown
|
|
set -l old (commandline)
|
|
commandline -r ""
|
|
echo \nfish: Run `$argv[1] all-the-package-names` to gain intelligent \
|
|
package completion >&2
|
|
commandline -f repaint
|
|
commandline -r $old
|
|
set -g __fish_yarn_pkg_info_shown 1
|
|
end
|
|
return 1
|
|
end
|
|
end
|
|
|
|
# Entire list of packages is too long to be used efficiently in a `complete` subcommand.
|
|
# Search it for matches instead.
|
|
function __yarn_filtered_list_packages
|
|
# This function takes the command to globally install a package as $argv[1]
|
|
if not __yarn_helper_installed $argv[1]
|
|
return
|
|
end
|
|
|
|
# Do not provide any completions if nothing has been entered yet to avoid long hang.
|
|
if string match -r . (commandline -ct)
|
|
# Filter the results here rather than in the C++ code due to #5267
|
|
all-the-package-names | string match -er -- "(?:\\b|_)"(commandline -ct |
|
|
string escape --style=regex) | head -n1000
|
|
end
|
|
end
|
|
|
|
function __yarn_find_package_json
|
|
set parents (__fish_parent_directories (pwd -P))
|
|
|
|
for p in $parents
|
|
if test -f "$p/package.json"
|
|
echo "$p/package.json"
|
|
return 0
|
|
end
|
|
end
|
|
|
|
return 1
|
|
end
|
|
|
|
function __yarn_installed_packages
|
|
set -l package_json (__yarn_find_package_json)
|
|
if not test $status -eq 0
|
|
# no package.json in tree
|
|
return 1
|
|
end
|
|
|
|
if set -l python (__fish_anypython)
|
|
$python -c 'import json, sys; data = json.load(sys.stdin);
|
|
print("\n".join(data["dependencies"])); print("\n".join(data["devDependencies"]))' < $package_json 2>/dev/null
|
|
else if type -q jq
|
|
jq -r '.dependencies as $a1 | .devDependencies as $a2 | ($a1 + $a2) | to_entries[] | .key' $package_json
|
|
else
|
|
set -l depsFound 0
|
|
for line in (cat $package_json)
|
|
# echo "evaluating $line"
|
|
if test $depsFound -eq 0
|
|
# echo "mode: noDeps"
|
|
if string match -qr '(devD|d)ependencies"' -- $line
|
|
# echo "switching to mode: deps"
|
|
set depsFound 1
|
|
continue
|
|
end
|
|
continue
|
|
end
|
|
|
|
if string match -qr '\}' -- $line
|
|
# echo "switching to mode: noDeps"
|
|
set depsFound 0
|
|
continue
|
|
end
|
|
|
|
# echo "mode: deps"
|
|
|
|
string replace -r '^\s*"([^"]+)".*' '$1' -- $line
|
|
end
|
|
end
|
|
end
|
|
|
|
|