installs the given modules if needed

Usage no npm install needed!

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




Installs the given list of modules and saves them into their respective fields in your nearest package.json. Dependencies that already exist in your package.json will be skipped.

var install = require('install-if-needed')

  dependencies: ['through2'],
  devDependencies: ['tape@2.x', 'standard']
}, function(err) {
  if (err)
    console.error("There was an error installing.")

You can pass { stdio: 'inherit' } to preserve logging and colors, acting like the usual npm install command.



install(opt[, cb])

Looks at package JSON and installs any of the specified dependencies that are not listed in their respective field.

  • cwd the directory for the closest package.json, (default process.cwd())
  • package optional package data, if not defined will search for closest package.json
  • save whether to --save, --save-dev and --save-optional (default true)
  • dependencies dependencies to install
  • devDependencies dev dependencies to install
  • optionalDependencies optional dependencies to install
  • command the command to spawn when installing, defaults to 'npm'

Other options are passed to spawn-npm-install.

On complete, cb is called with (err) status. All dependencies also accept a single string instead of an array.

Alternatively, opt can be a string or array, which is the same as listing it in dependencies.

//  npm install tape --save
install('tape', done)


This helps build CLI tooling that auto-installs modules as needed. For example, a tool which stubs out an empty test file for tape:

#!/usr/bin/env node
var install = require('install-if-needed')
var fs = require('fs')
var template = fs.readFileSync(__dirname + '/template.js')

  devDependencies: 'tape'
}, function(err) {
  if (err) throw err
  fs.writeFile(process.argv[2], template)

And the CLI might be as simple as:

quick-tape tests/simple.js


MIT, see for details.