fiskeben wrote:
The downside is that it's not fully automatic, i.e. it doesn't extract package names from package.json and check them. You need to do this for each package yourself.
Let's make Fiskeben's answer automated if for whatever reason depcheck
is not working properly! (E.g. I tried it with Typescript and it gave unnecessary parsing errors)
For parsing package.json
we can use the software jq
. The below shell script requires a directory name where to start.
#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME
FILES=$(mktemp)
PACKAGES=$(mktemp)
find . \
-path ./node_modules -prune -or \
-path ./build -prune -or \
\( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES
function check {
cat package.json \
| jq "{} + .$1 | keys" \
| sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES
echo "--------------------------"
echo "Checking $1..."
while read PACKAGE
do
RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
if [ $RES = 0 ]
then
echo -e "UNUSED\t\t $PACKAGE"
else
echo -e "USED ($RES)\t $PACKAGE"
fi
done < $PACKAGES
}
check "dependencies"
check "devDependencies"
check "peerDependencies"
First it creates two temporary files where we can cache package names and files.
It starts with the find
command. The first and second line make it ignore the node_modules
and build
folders (or whatever you want). The third line contains allowed extensions, you can add more here e.g. JSX or JSON files.
A function will read dependendy types.
First it cat
s the package.json
. Then, jq
gets the required dependency group. ({} +
is there so that it won't throw an error if e.g. there are no peer dependencies in the file.)
After that, sed
extracts the parts between the quotes, the package name. -n
and .../p
tells it to print the matching parts and nothing else from jq
's JSON output. Then we read this list of package names into a while
loop.
RES
is the number of occurrences of the package name in quotes. Right now it's import
/require
... 'package'
/"package"
. It does the job for most cases.
Then we simply count the number of result lines then print the result.
Caveats:
- Won't find files in different imports e.g.
tsconfig.json
files (lib
option)
- You have to
grep
manually for only ^USED
and UNUSED
files.
- It's slow for large projects - shell scripts often don't scale well. But hopefully you won't be running this many times.