'source: not found' in the context of npm scripts

Context

Today at work I found out that the following script from the scripts section of our package.json was not working on my colleague's machine. He is running Ubuntu. I have seen this happening also on the Arch distribution.

"start:dev": "source .env; nodemon index.js"

This script aims at sourcing a bunch of environement variables and then only running the application.

This had worked under OSX since the beginning of the project though.

What is happening

Basically, if not specified as a npm config, npm-run uses the system's default /bin/sh as shell to execute commands in script entries.
This means that if your system is using a default shell that does not implement the source command, you are getting this source: not found error.

But npm gets you covered 😅

Solution

The solution is to specify the npm's script-shell config, before running the source command.

The script entry presented in the context section above would become:

"start:dev": "npm config set script-shell \"/bin/bash\"; source .env; nodemon index.js"

It is a bit wordy but does usually get you out of trouble as long as the system running the command implements bash.

Reference