npm-is
v1.1.0
Published
Detect the package manager client running the current script. Detects NPM and yarn, as well as any hard executable path.
Downloads
8
Maintainers
Readme
Detect the package manager client running the current script. Detects NPM and yarn, as well as any hard executable path.
Use this when your project requires a specific package manager to work correctly, such as a monorepo using Yarn workspaces. It can help your package scripts exit early if they're being invoked outside of the required package manager.
Recommended Usage
In a monorepo, or any repo with private: true
, it's safe to catch things as
early as possible.
Add a preinstall
script to prevent the wrong package manager from even
beginning to install dependencies.
Use npx
to dynamically install npm-is
before any other
modules are installed.
{
"name": "my-yarn-only-monorepo",
"version": "1.0.0",
"private": true,
"workspaces": [
"packages/*"
]
"scripts": {
+ "preinstall": "npx npm-is yarn"
}
}
Now, this happens when you try to npm install
.
$ npm install
> [email protected] preinstall /Users/me/repo
> npx npm-is yarn
/Users/me/repo/node_modules/npm-is/npm-is.js:54
throw new WrongPackageManagerError(allowed, invoked);
^
Error: This project can only be used with the "yarn" package manager, but it was
invoked by "npm", which is not supported.
Install
Don't install this as a dependency if you're going to use it in the recommended way described above.
Instead, run it with npx
so that it works before dependencies are installed!
But if you insist:
with npm: npm install --save-dev npm-is
with yarn: yarn add --dev npm-is
Advanced Usage
CLI
With no arguments, npm-is
prints the current package manager.
So, running it outside a package manager with no arguments, it will print
nothing.
Running it inside an NPM script with NPM should print npm
to the command line.
With arguments, npm-is
will take each of its arguments to be
allowed package managers.
If the preinstall
script is "npm-is yarn npm"
, then install
will only succeed if the package manager in use is Yarn or NPM.
Only npm
and yarn
are currently supported as shorthand.
If you're using a custom package manager, you must know its exec path (that is,
the value of the environment variable $npm_execpath
when it is running
lifecycle scripts) and pass that as an argument.
If the preinstall
script is "npm-is /path/to/pnpm
, then
install will only succeed if $npm_execpath
is exactly /path/to/pnpm
.
Node API
const npmIs = require("npm-is");
// returns true if Yarn
npmIs("yarn");
// returns true if Yarn or NPM
npmIs(["yarn", "npm"]);
// returns true if Yarn, NPM, or custom executable
npmIs(["yarn", "npm", "/some/custom/one"]);
// Throws instead of returning false
npmIs.assert("yarn");
npmIs.assert(["yarn", "npm"]);
npmIs.assert(["yarn", "npm", "/some/custom/one"]);
// Returns "npm" if NPM, "yarn" if Yarn,
// empty string if no package manager,
// or full execPath if anything else
npmIs.detect();