Run npm commands programmatically

Usage no npm install needed!

<script type="module">
  import npmCommands from '';



Execute npm commands programmatically in your Node scripts!


How many times did you have to execute some npm commands in your Node scripts? I had. A lot.

What you can do

With this library you can execute, both synchronously and asynchronously:

  • npm run <script>
  • npm install
  • npm install <module>
  • npm link
  • npm link <module>


Let's assume you've got some scripts in you package.json:

"scripts": {
    "build": "node ./scripts/build.js",
    "release": "node ./scripts/release.js",
    "deploy": "node ./scripts/deploy.js"

and let's say you need to build and release when you deploy.

For sure you could chain the two scripts and do something like

"scripts": {
    "deploy": "npm run build && npm run release"    

That's ok, but you can have some issues because of the different plaforms (Linux, MacOs and Windows) and maybe you have to perform some stuff before you actually deploy; therefore you created your deploy script.

Your deploy script could look like

/* do some stuff
... your fancy code here ../

// we need to run our script, so we need to run a new process
const { execSync } = require('child_process');

// in case you have no params to pass through
execSync('npm run build', { stdio: 'inherit', cwd: 'path/to/dir' });

// but in case you have to also pass some arguments, you would need to change the above into this
const params = process.argv.slice(2);
execSync(`npm run build -- ${params}`, { stdio: 'inherit', cwd: 'path/to/dir' });

/* the rest of your code here */

Pretty ugly isn't it?

Using this library you would do

/* do some stuff
... your fancy code here ../

// we need to run our script, so we need to run a new process
const npm = require('npm-commands');

// arguments are passed through by default

// but in case you don't want to pass arguments
/* the rest of your code here */


Changing the working director


// install the dependencies from the specified folder 

// install react in the specified folder

Suppress the output

// this will show the output in the console

// this too

// this won't 

Provide arguments

 * assuming you have run 
 * $ node scripts/build.js --mode prod
 * this will pass the mode to your script automatically

// this will ignore the cli arguments

// this will pass specific ones
npm().arguments({ mode: 'dev', runTests: false }).run('build');

.run, .install and .link have also an async version that returns a Promise.

npm().runAsync('build').then(output => {
  // do something with the output  

npm().installAsync('react').then(output => {
  // do something with the output  


Method Description Params Returns
cwd Changes the working director directory: <String> instance
output Sets whether to show the command output value: <Boolean> instance
arguments Remaps the CLI arguments args: <Object> instance
install Runs a npm install module: <?String> output: <String>


  • tests
  • potentially cover other commands