Jankapunkt
Jankapunkt

Reputation: 8413

Check if package.json has script with a certain name in shell script without using extra NPM packages

I am testing a larger library of NPM packages, that consists of private packages, altered forks of public packages or downstreams of public packages.

lib
  |-package_1
  |-package_2
  |-package_N

So I am running a shell script through my package lib, that runs in each directory the npm test command.

for D in *; do
    if [ -d "${D}" ]; then
        echo "================================="
        echo "${D}"   # PRINT DIRECTORY NAME
        echo "================================="

        cd $D
        npm run tests
        cd ../  # LEAVE PACKAGE DIR
    fi
done

Unfortunately there is not a unique pattern for naming the tests-script in the package's JSON files. Some package are running under test a script with watch-mode and have a different name for their cli script (mostly named testcli).

What I would like to do is something like the following pseudocode:

if has-testcli-script then
    npm run testcli
else
    npm run test

I assume for now, that only those two options exist. I am rather interested in the way of knowing if the script exists, without installing an additional global NPM package.

Upvotes: 7

Views: 3354

Answers (2)

YadirHB
YadirHB

Reputation: 168

In my case that approach didn't work and I had to implement something using jq instead.

has_script (script) {
  [[ ! -z "$(jq -rc --arg key $script '.scripts | to_entries | .[] | select(.key == \$key)' package.json)" ]]
}

then use it as:

if has_script('testcli'); then
 // Do something
else
// Do nothing
fi

Upvotes: 1

Max G J Panas
Max G J Panas

Reputation: 981

Since npm version 2.11.4 at least, calling npm run with no arguments will list all runable scripts. Using that you can check to see if your script is present. So something like:

has_testcli_script () {
  [[ $(npm run | grep "^  testcli" | wc -l) > 0 ]]
}

if has_testcli_script; then
  npm run testcli
else
  npm test
fi

Or alternatively, just check to see if your script is in the package.json file directly:

has_testcli_script () {
  [[ $(cat package.json | grep "^    \"testcli\":" | wc -l) > 0 ]]
}

Upvotes: 10

Related Questions