Skip to content

Commit abaec7c

Browse files
committed
refactor!: use jq
Most sed json parsing was broken. Completely rework to add jq. Closes #11 Fixes #5
1 parent 7850254 commit abaec7c

File tree

1 file changed

+22
-44
lines changed

1 file changed

+22
-44
lines changed

yarn-completion.plugin.zsh

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ _yc_no_of_yarn_args() {
1010
echo "$#words"
1111
}
1212

13-
_yc_list_cached_modules() {
14-
ls ~/.npm 2>/dev/null
13+
_yc_check_jq() {
14+
(( ${+commands[jq]} )) || echo "\nyarn-completion needs jq\n"
1515
}
1616

1717
_yc_recursively_look_for() {
@@ -24,47 +24,17 @@ _yc_recursively_look_for() {
2424
[[ ! "$dir" = "" ]] && echo "$dir/$filename"
2525
}
2626

27-
_yc_get_package_json_property_object() {
28-
local package_json="$1"
29-
local property="$2"
30-
cat "$package_json" |
31-
sed -nE "/^ *\"$property\": \{$/,/^ *\},?$/p" | # Grab scripts object
32-
sed '1d;$d' | # Remove first/last lines
33-
sed -E 's/\s+"([^"]+)": "(.+)",?/\1=>\2/' # Parse into key=>value
34-
}
35-
36-
_yc_get_package_json_property_object_keys() {
37-
local package_json="$1"
38-
local property="$2"
39-
_yc_get_package_json_property_object "$package_json" "$property" | cut -f 1 -d "="
40-
}
41-
42-
_yc_parse_package_json_for_script_suggestions() {
43-
local package_json="$1"
44-
_yc_get_package_json_property_object "$package_json" scripts |
45-
sed -E 's/(.+)=>(.+)/\1:$ \2/' | # Parse commands into suggestions
46-
sed 's/\(:\)[^$]/\\&/g' | # Escape ":" in commands
47-
sed 's/\(:\)$[^ ]/\\&/g' # Escape ":$" without a space in commands
48-
}
49-
50-
_yc_parse_package_json_for_deps() {
51-
local package_json="$1"
52-
_yc_get_package_json_property_object_keys "$package_json" dependencies
53-
_yc_get_package_json_property_object_keys "$package_json" devDependencies
54-
}
55-
5627
_yc_yarn_add_completion() {
5728
# Only run on `yarn add ?`
5829
[[ ! "$(_yc_no_of_yarn_args)" = "3" ]] && return
5930

31+
local packages=($(yarn cache list --json | jq --raw-output '.data.body[] | .[0]' 2> /dev/null))
32+
6033
# Return if we don't have any cached modules
61-
[[ "$(_yc_list_cached_modules)" = "" ]] && return
34+
[[ "$#packages" = 0 ]] && return
6235

6336
# If we do, recommend them
64-
_values $(_yc_list_cached_modules)
65-
66-
# Make sure we don't run default completion
67-
custom_completion=true
37+
_values 'packages' $packages
6838
}
6939

7040
_yc_yarn_remove_completion() {
@@ -77,7 +47,11 @@ _yc_yarn_remove_completion() {
7747
# Return if we can't find package.json
7848
[[ "$package_json" = "" ]] && return
7949

80-
_values $(_yc_parse_package_json_for_deps "$package_json")
50+
local values=($(jq --raw-output '(.devDependencies, .dependencies) | keys[]' $package_json 2> /dev/null))
51+
52+
[[ "$#values" = 0 ]] && return
53+
54+
_values 'installed' $values
8155
}
8256

8357
_yc_yarn_run_completion() {
@@ -90,15 +64,16 @@ _yc_yarn_run_completion() {
9064
# Return if we can't find package.json
9165
[[ "$package_json" = "" ]] && return
9266

93-
# Parse scripts in package.json
94-
local -a options
95-
options=(${(f)"$(_yc_parse_package_json_for_script_suggestions $package_json)"})
67+
local -a scripts
68+
scripts=(${(f)"$(
69+
jq --raw-output '
70+
.scripts | to_entries[] | "\(.key):\(.value | gsub("\n";"\\\\n"))"
71+
' $package_json 2> /dev/null
72+
)"})
9673

97-
# Return if we can't parse it
98-
[[ "$#options" = 0 ]] && return
74+
[[ "$#scripts" = 0 ]] && return
9975

100-
# Load the completions
101-
_describe 'values' options
76+
_describe 'scripts' scripts
10277
}
10378

10479
_yc_zsh_better_yarn_completion() {
@@ -108,12 +83,15 @@ _yc_zsh_better_yarn_completion() {
10883
# Load custom completion commands
10984
case "$(_yc_yarn_command)" in
11085
add)
86+
_yc_check_jq
11187
_yc_yarn_add_completion
11288
;;
11389
remove)
90+
_yc_check_jq
11491
_yc_yarn_remove_completion
11592
;;
11693
run)
94+
_yc_check_jq
11795
_yc_yarn_run_completion
11896
;;
11997
*)

0 commit comments

Comments
 (0)