multi-tool

    0.5.0 • Public • Published

    multi-tool | Install and require multiple simultaneous versions of any NPM package

    version versioning branching styling paradigm build

    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.

    Install

    $ npm install --save multi-tool
    # OR 
    $ yarn add multi-tool

    Usage

    Require:

    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);

    Install and use latest version:

    const installed = await install('ramda', 'latest');
    const R = require('ramda@latest');
     
    R.identity(0);

    Install and use exact version:

    const installed = await install('ramda', '0.23.0');
    const R = require('ramda@0.23.0');
     
    R.identity(0);

    Install and use x-based version:

    const installed = await install('ramda', '0.23.x');
    const R = require('ramda@0.23.x');
     
    R.identity(0);

    Install and use tilde-based version:

    const installed = await install('ramda', '~0.22.1');
    const R = require('ramda@~0.22.1');
     
    R.identity(0);

    Install and use caret-based version:

    const installed = await install('ramda', '^0.22.1');
    const R = require('ramda@^0.22.1');
     
    R.identity(0);

    Install invalid package:

    const installed = await install('package-doesnt-exist', 'latest');

    Install invalid version:

    const installed = await install('ramda', '99.99.99');

    Custom invalidators:

    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.

    Invalidate always:

    const invalidate = (name, version, age) => age >= 0;
    const install = require('multi-tool')({path: 'node_modules', invalidate});

    Invalidate never:

    const invalidate = (name, version, age) => age >= Number.MAX_SAFE_INTEGER;
    const install = require('multi-tool')({path: 'node_modules', invalidate});

    Invalidate only latest versions and only after 10 minutes:

    const invalidate = (name, version, age) => version === 'latest' && age >= 600000;
    const install = require('multi-tool')({path: 'node_modules', invalidate});

    Maintainers

    Install

    npm i multi-tool

    DownloadsWeekly Downloads

    20

    Version

    0.5.0

    License

    ISC

    Last publish

    Collaborators

    • rockymadden