Install multiple versions of NPM packages at runtime. Use any semver ranges which are also a valid (Li|U)nix directory
names as your version and require
them intuitively (e.g. require('ramda@0.23.x')
, require('ramda@~0.22.1')
,
require('ramda@latest')
). Leverage custom invalidators to automatically keep installed packages up-to-date.
$ npm install --save multi-tool
$ # OR
$ yarn add multi-tool
An options object is required to configure before using, only path
is required.
const options = {
// Path to install against
path: 'node_modules',
// Function used to determine if package should be invalidated and reinstalled when already installed
invalidate: (name, version, age) => age >= Number.MAX_SAFE_INTEGER,
// Milliseconds to delay when an install is already occurring before reattempting
delay: 2500,
// Milliseconds maximum to delay before an install is considered failed if an install is already occurring
timeout: 60000
};
const install = require('multi-tool')(options);
const installed = await install('ramda', 'latest');
const R = require('ramda@latest');
R.identity(0);
const installed = await install('ramda', '0.23.0');
const R = require('ramda@0.23.0');
R.identity(0);
const installed = await install('ramda', '0.23.x');
const R = require('ramda@0.23.x');
R.identity(0);
const installed = await install('ramda', '~0.22.1');
const R = require('ramda@~0.22.1');
R.identity(0);
const installed = await install('ramda', '^0.22.1');
const R = require('ramda@^0.22.1');
R.identity(0);
const installed = await install('package-doesnt-exist', 'latest');
const installed = await install('ramda', '99.99.99');
It is possible to use custom invalidators to customize when multi-tool
should assume an already successfully
installed package should be reinstalled. This is accomplished via a higher-order function passed as an argument upon
require
. The invalidator function is executed upon each install
. The invalidator function is provided the package
name
, the package version
, and how many milliseconds ago the package at hand was last successfully installed.
The invalidator function should return a Boolean
value which when true will invalidate the previously successfully
installed package and reinstall. The default invalidator behavior is to always invalidate.
const invalidate = (name, version, age) => age >= 0;
const install = require('multi-tool')({path: 'node_modules', invalidate});
const invalidate = (name, version, age) => age >= Number.MAX_SAFE_INTEGER;
const install = require('multi-tool')({path: 'node_modules', invalidate});
const invalidate = (name, version, age) => version === 'latest' && age >= 600000;
const install = require('multi-tool')({path: 'node_modules', invalidate});
- Rocky Madden (@rockymadden)