1. better-npm-run
Better NPM scripts runner
better-npm-run
Package: better-npm-run
Created by: benoror
Last modified: Mon, 13 Jun 2022 04:33:27 GMT
Version: 0.1.1
License: MIT
Downloads: 142,433
Repository: https://github.com/benoror/better-npm-run

Install

npm install better-npm-run
yarn add better-npm-run

NPM

Join the chat at https://gitter.im/benoror/better-npm-run

Build Status

PRs Welcome

8dfc4b1170a25e07c254c99f6f549caf

Better NPM scripts runner

  • Avoid hard-coded commands in package.json
  • Cross-platform compatibility, originally needed by:
    • https://github.com/formly-js/angular-formly/issues/305
      • https://github.com/npm/npm/issues/2800

Inspired by

  • https://www.npmjs.com/package/with-package

Alternatives

Usage in package.json

From this:

 {
  "scripts": {
    "build:dist": "NODE_ENV=development webpack --config $npm_package_webpack --progress --colors",
    "test": "NODE_ENV=production karma start"
  }
}

To this:

 {
  "devDependencies": {
    "better-npm-run": "~0.0.1"
  },
  "scripts": {
    "build:dist": "better-npm-run build:dist",
    "build:prod": "better-npm-run build:prod",
    "test": "better-npm-run test"
  },
  "betterScripts": {
    "build:dist": "webpack --config $npm_package_webpack --progress --colors",
    "build:prod": {
      "command": "webpack --config $npm_package_webpack --progress --colors",
      "env": {
        "NODE_ENV": "production"
      }
    },
    "test": {
      "command": "karma start",
      "env": {
        "NODE_ENV": "test"
      }
    }
  }
}

The betterScripts script definition can either be a string or sub-object with command and env attributes. Values defined in the env block will override previously set environment variables.

Note that depending on the OS and terminal you're using, dots, spaces or other special characters in the command path may be treated as separators and the command will be parsed wrong.

 {
  "serve:dist": "./node_modules/.bin/webpack-dev-server --hot --inline --config webpack/development.js"
}

To prevent this you need to explicitly wrap the command path with double quotes:

 {
  "serve:dist": "\"./node_modules/.bin/webpack-dev-server\" --hot --inline --config webpack/development.js"
}

.env File

If you have an .env file in your project root it will be loaded on every command.

NODE_PATH=./:./lib
NODE_ENV=development
PORT=5000

Environment variables defined in the betterScripts script definition will take precedence over .env values.

Shell scripts

Currently, using bash variables (PWD, USER, etc.) is not possible:

   "command": "forever start -l ${PWD}/logs/forever.log -o ${PWD}/logs/out.log -e ${PWD}/logs/errors.log -a index.js",

In order to use them, you can create an script file (.sh) instead:

forever.sh:

 forever start -l ${PWD}/logs/forever.log -o ${PWD}/logs/out.log -e ${PWD}/logs/errors.log -a index.js

package.json:

   "command": "./forever.sh"

cli commands

This module expose 2 cli commands:

  • better-npm-run and,
  • a shorter one: bnr which is an alias to the former.

The shorter one is useful for cases where you have a script that calls several better-npm-run scripts. e.g:

using the normal cli name

 "scripts": {
  "dev": "shell-exec 'better-npm-run install-hooks' 'better-npm-run watch-client' 'better-npm-run start-dev' 'better-npm-run start-dev-api' 'better-npm-run start-dev-worker' 'better-npm-run start-dev-socket'",
}

using the shorter alias

 "scripts": {
  "dev": "shell-exec 'bnr install-hooks' 'bnr watch-client' 'bnr start-dev' 'bnr start-dev-api' 'bnr start-dev-worker' 'bnr start-dev-socket'",
}

And for silence output, you can use -s or verbose --silence flags

bnr -s watch-client

And you can use -p or verbose --path to specify a custom path of dotenv file

bnr --path=/custom/path/to/your/env/vars start-dev

Also use -e or verbose --encoding to specify the encoding of dotenv file

bnr --encoding=base64 start-dev

See envdot docs for more infomation

RELATED POST

10 Must-Know Windows Shortcuts That Will Save You Time

10 Must-Know Windows Shortcuts That Will Save You Time

Arrays vs Linked Lists: Which is Better for Memory Management in Data Structures?

Arrays vs Linked Lists: Which is Better for Memory Management in Data Structures?

Navigating AWS Networking: Essential Hacks for Smooth Operation

Navigating AWS Networking: Essential Hacks for Smooth Operation

Achieving Stunning Visuals with Unity's Global Illumination

Achieving Stunning Visuals with Unity's Global Illumination

Nim's Hidden Gems: Lesser-known Features for Writing Efficient Code

Nim's Hidden Gems: Lesser-known Features for Writing Efficient Code