NPM — универсальный инструмент для разработки приложений. Работа, которую он выполняет, является необходимым минимумом, чтобы полностью покрыть потребности в настройке и запуске своего приложения.

Нужны зависимости? — Легко, используйте npm install

Хотите запустить его? — Ну вот, определите свои "scripts” в package.json и попробуйте их с npm run

Нужен поток сборки? — Покопайтесь в npm потоки скриптов и никаких проблем. С небольшой помощью npm-run-all он может достичь любого уровня маневренности.

Использовать npm-скрипты легко, когда проект небольшой, скрипты просты, так как их немного:

{
  "scripts": {
    "clean": "rimraf",
    "test": "mocha",
    "lint": "eslint"
    "build": "webpack"
  }
}

Предоставление параметров CLI для этих скриптов выглядит следующим образом:

$ npm run test -- --fgrep "@unit"
npm run - NPM command to run one of "scripts"
test - script to run the tests
-- - NPM notation to insert parameters inside the used script
--fgrep "@unit" - mocha parameter that grabs tests tagged with @unit for the test run

Но ладно. Это очень простой пример, в реальной жизни и в проектах, связанных с производством, мы можем оказаться в ситуации, когда вложенные скрипты NPM используются для инкапсуляции или повторного использования уже написанной логики:

{
  "scripts": {
    "clean": "rimraf",
    "test": "mocha", <-- 1 level of nesting 
    "test:unit": "npm run test -- --fgrep '@unit'", <-- 2 level of nesting
    "test:e2e": "npm run test -- --fgrep '@e2e'",
    "test:unit:trace": "npm run test:unit -- -- --full-trace" <-- 3 level of nesting
  }
}

Что, если в интерфейсе командной строки мы все равно захотим добавить в команду некоторые параметры mocha?

Все просто — определите уровень вложенности для команды, которая должна получить дополнительные параметры, и добавьте соответствующее количество -- в финальную CLI-команду:

{
  "scripts": {
    "clean": "rimraf",
    "test": "mocha", <-- nesting level 1 
    "test:unit": "npm run test -- --fgrep '@unit'", <-- nesting level 2
    "test:e2e": "npm run test -- --fgrep '@e2e'",
    "test:all": "npm run test:unit " <-- nesting level 3
  }
}

В результате команды CLI будут выглядеть так:

# test:all with nesting level 3 will have three '--' to add parameters to mocha
$ npm run test:all -- -- -- --parallel

# test:e2e with nesting level 2 will have two '--' to add parameters to mocha
$ npm run test:e2e -- -- --full-trace

# test:e2e with nesting level 1 will have a single '--' to add parameters to mocha
$ npm run test -- --fgrep "@e2e"