@tpguy825/npm-commands
TypeScript icon, indicating that this package has built-in type declarations

1.1.3 • Public • Published

npm-commands

This is a fork of npm-commands, but with some small improvements and fixes. It also contains type definitions. Original README: Execute npm commands programmatically in your Node scripts!

Motivation

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>

Examples

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
import { execSync } from "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
import npm from "npm-commands";

// arguments are passed through by default
npm().run("build");

// but in case you don't want to pass arguments
npm().arguments(false).run("build");
/* the rest of your code here */

Changing the working directory

npm().cwd("path/to/").run("build");

// install the dependencies from the specified folder
npm().cwd("path/to/").install();

// install react in the specified folder
npm().cwd("path/to/").install("react");

Suppress the output

// this will show the output in the console
npm().run("build");

// this too
npm().output(true).run("build");

// this won't
npm().output(false).run("build");

Provide arguments

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

// this will ignore the cli arguments
npm().arguments(false).run("build");

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

:class

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>

TODO

  • tests
  • potentially cover other commands

Package Sidebar

Install

npm i @tpguy825/npm-commands

Weekly Downloads

0

Version

1.1.3

License

ISC

Unpacked Size

22.2 kB

Total Files

7

Last publish

Collaborators

  • tpguy825