{"id":13431128,"url":"https://github.com/sezna/nps","last_synced_at":"2025-05-13T17:09:52.156Z","repository":{"id":35085849,"uuid":"57072970","full_name":"sezna/nps","owner":"sezna","description":"NPM Package Scripts -- All the benefits of npm scripts without the cost of a bloated package.json and limits of json","archived":false,"fork":false,"pushed_at":"2025-02-18T15:38:15.000Z","size":764,"stargazers_count":1452,"open_issues_count":33,"forks_count":98,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-05-05T03:01:50.413Z","etag":null,"topics":["automation","cli","npm","npm-scripts","package-json","scripts"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sezna.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["kentcdodds","sezna"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2016-04-25T20:07:31.000Z","updated_at":"2025-04-29T02:00:34.000Z","dependencies_parsed_at":"2025-04-11T15:43:24.263Z","dependency_job_id":"92447227-a5d8-4e6e-a49d-84d6215082f1","html_url":"https://github.com/sezna/nps","commit_stats":null,"previous_names":["kentcdodds/nps"],"tags_count":67,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sezna%2Fnps","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sezna%2Fnps/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sezna%2Fnps/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sezna%2Fnps/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sezna","download_url":"https://codeload.github.com/sezna/nps/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253990468,"owners_count":21995774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","cli","npm","npm-scripts","package-json","scripts"],"created_at":"2024-07-31T02:01:00.732Z","updated_at":"2025-05-13T17:09:47.140Z","avatar_url":"https://github.com/sezna.png","language":"JavaScript","funding_links":["https://github.com/sponsors/kentcdodds","https://github.com/sponsors/sezna"],"categories":["JavaScript","cli","📦 Legacy \u0026 Inactive Projects"],"sub_categories":[],"readme":"\n## Sponsorship\nNPS is being sponsored by the following tool; please help to support us by taking a look and signing up for a free trial.\n\n \u003ca href=\"https://tracking.gitads.io/?repo=nps\"\u003e\u003cimg src=\"https://images.gitads.io/nps\" alt=\"GitAds\"/\u003e\u003c/a\u003e\n\n# nps\n\nAll the benefits of npm scripts without the cost of a bloated package.json and limits of json\n\n\u003e `nps` is short for `npm-package-scripts`\n\n\u003e [What happened to p-s?](#what-happened-to-p-s)\n\n[![Build Status][build-badge]][build]\n[![Code Coverage][coverage-badge]][coverage]\n[![Dependencies][dependencyci-badge]][dependencyci]\n[![version][version-badge]][package]\n[![downloads][downloads-badge]][npm-stat]\n[![MIT License][license-badge]][license]\n\n[![All Contributors](https://img.shields.io/badge/all_contributors-46-orange.svg?style=flat-square)](#contributors)\n[![PRs Welcome][prs-badge]][prs]\n[![Donate][donate-badge]][donate]\n[![Code of Conduct][coc-badge]][coc]\n[![Roadmap][roadmap-badge]][roadmap]\n[![Examples][examples-badge]][examples]\n[![nps friendly][nps-badge]](#badge)\n\n## The problem\n\nEven though npm scripts have a ton of advantages ([learn more][scripts-advantages]), it can grow into an\n[unmaintainable mess][mess] in your `package.json` file. Part of the problem is we're configuring scripts in `json`\nwhich has fundamental issues (like no comments).\n\n## This solution\n\n`nps` is a package that solves this problem by allowing you to move your scripts to a `package-scripts.js` file. Because\nthis file is a JavaScript file, you can do a lot more with your project scripts. Here's an example of a\n`package-scripts.js` file:\n\n```javascript\nconst npsUtils = require(\"nps-utils\"); // not required, but handy!\n\nmodule.exports = {\n  scripts: {\n    default: \"node index.js\",\n    lint: \"eslint .\",\n    test: {\n      // learn more about Jest here: https://facebook.github.io/jest\n      default: \"jest\",\n      watch: {\n        script: \"jest --watch\",\n        description: \"run in the amazingly intelligent Jest watch mode\"\n      }\n    },\n    build: {\n      // learn more about Webpack here: https://webpack.js.org/\n      default: \"webpack\",\n      prod: \"webpack -p\"\n    },\n    // learn more about npsUtils here: https://npm.im/nps-utils\n    validate: npsUtils.concurrent.nps(\"lint\", \"test\", \"build\")\n  }\n};\n```\n\nOr in case you prefer YAML, here's an example of how that would look in a `package-scripts.yml` file:\n\n```yml\nscripts:\n  default: node index.js\n  lint: eslint .\n  test:\n    # learn more about Jest here: https://kcd.im/egghead-jest\n    default: jest\n    watch:\n      script: jest --watch\n      description: run in the amazingly intelligent Jest watch mode\n  build:\n    default: webpack\n    prod: webpack -p\n  validate: concurrent \"nps lint\" \"nps test\" \"nps build\"\n```\n\nTo use `nps`, it's recommended that you either install it globally (`npm i -g nps`) or add `./node_modules/bin` to your\n`$PATH` (be careful that you know what you're doing when doing this, find out how [here](https://youtu.be/2WZ5iS_3Jgs)).\n\nThen you can run:\n\n```console\nnps help\n```\n\nWhich will output:\n\n```console\nUsage: nps [options] \u003cscript\u003e...\n\nCommands:\n  init        automatically migrate from npm scripts to nps\n  completion  generate bash completion script\n\nOptions:\n  --config, -c      Config file to use (defaults to nearest package-scripts.yml\n                    or package-scripts.js)\n                      [default: \"\u003cpath-to-your-project\u003e/package-scripts.js\"]\n  --silent, -s      Silent nps output                  [boolean] [default: false]\n  --log-level, -l   The log level to use\n                    [choices: \"error\", \"warn\", \"info\", \"debug\"] [default: \"info\"]\n  --require, -r     Module to preload\n  --prefix, -p      Prefix for each \u003cscript\u003e name\n  -h, --help        Show help                                           [boolean]\n  -v, --version     Show version number                                 [boolean]\n  --help-style, -y  Style of help to use\n                    [choices: \"all\", \"scripts\", \"basic\"] [default: \"all\"]\n\nExamples:\n  nps.js test build                         Runs the `test` script then the\n                                            `build` script\n  nps.js \"test --cover\" \"build --prod\"      Runs the `test` script and forwards\n                                            the \"--cover\" flag then the `build`\n                                            script and forwards the \"--prod\"\n                                            flag\n  nps.js --prefix=test unit functional      Runs the `test.unit` script then\n                                            the `test.functional` script\n\nAvailable scripts (camel or kebab case accepted)\n\nlint - eslint .\ntest - jest\ntest.watch - run in the amazingly intelligent Jest watch mode - jest --watch\nbuild - webpack\nbuild.prod - webpack -p\nvalidate - concurrent \"nps lint\" \"nps test\" \"nps build\"\n```\n\nYou can also use the help command with a script name\n\n```console\nnps help test.watch\n```\n\nWhich will output the details of the script `test.watch`:\n\n```console\ntest.watch - run in the amazingly intelligent Jest watch mode - jest --watch\n```\n\nNow, to run a script, you can run:\n\n```console\nnps lint\nnps test.watch\n# etc.\n```\n\nBut the fun doesn't end there! You can use a prefix:\n\n```console\nnps b # will run the build script\nnps help b # will display help for the build script\n```\n\nAnd these prefixes can go as deep as you like!\n\n```console\nnps b.p # will run the production build script\n```\n\nCool stuff right? And there's more on [the roadmap][roadmap].\n\n**Also** check out the [examples][examples]. You'll find some good stuff in there (including how to deal with windows\nand other cross-platform issues).\n\n**Note:** If you don't like installing things globally and don't want to muck with your `$PATH` (or don't want to\nrequire that your co-workers or project contributors to do so), then you can add a single script to your `package.json`.\nWe recommend that you use the `start` script because it requires less typing:\n\n**package.json**\n\n```json\n{\n  \"scripts\": {\n    \"start\": \"nps\"\n  }\n}\n```\n\nYou don't have to use the `start` script if you don't want. Note that if you're writing a node application, you're\nlikely using `start` for starting your server. In that case, you can create a `default` script which will be run\nwhen `nps` is run without arguments (so effectively it'll work just the same). But if you'd prefer, you can use whatever\nyou wish. For example you could easily create a `nps` script and do: `npm run nps b`.\n\n## Installation\n\nThis module is distributed via [npm][npm] which is bundled with [node][node] and should\nbe installed as one of your project's `devDependencies`:\n\n```\nnpm install --save-dev nps\n```\n\n### global installation\n\nYou can install this module globally also (this is recommended):\n\n```\nnpm install --global nps\n```\n\nFrom here you can use `nps` on the command line via one of the installed aliases: `nps` or `nps`.\n\nIf you do this, you may also be interested in installing the shell autocompletion script. See more about this below.\n\n## Getting started\n\nIf you're already using npm scripts, you can get up and going really quickly with the `init` command:\n\n```\n./node_modules/.bin/nps init\n```\n\nor\n\n```\n./node_modules/.bin/nps init --type yml\n```\n\nThis will use your `package.json` `scripts` to generate a `package-scripts.js` (respectively a `package-scripts.yml`)\nfile and update your `scripts` to utilize the `nps` binary.\n\n## API\n\n### CLI\n\n#### Commands\n\n##### help\n\nIf you have a `help` script, then your `help` script will be run. Otherwise, this will output the help.\n\n\u003e Note: you can do this with `nps --help`, but if you're using the `start` script in your `package.json` this allows you\n\u003e to run `npm start help` rather than `npm start -- --help`\n\n##### init\n\nAs indicated above, this will migrate your npm scripts to package-scripts.\n\n##### completion\n\n```console\nnps completion \u003e\u003e \u003cyour-bash-profile-file\u003e\n```\n\nNormally `\u003cyour-bash-profile-file\u003e` will be `~/.bash_profile`, `~/.bashrc`, or `~/.zshrc`.\n\nNote: you should probably only do this if you have the package installed globally. In that case you should probably also\nnormally use the `nps` alias rather than `nps` because it's easier to type.\n\nNote: for zsh support, you must [enable zsh's bash completion script compatibility mode](https://stackoverflow.com/a/8492043/5932012).\n\n#### CLI options\n\n##### -h, --help\n\nWill print out the help you see above (the available scripts are colored 🌈 and come from the config specified/default\nconfig).\n\n##### -s, --silent\n\nBy default, `nps` will log out to the console before running the command. You can add `-s` to your command to silence\nthis.\n\n##### --no-scripts\n\nBy default, the script's command text will log out to the console before running the command. You can add `--no-scripts` to prevent this.\n\n##### -c, --config\n\nUse a different config\n\n```\nnps -c ./other/package-scripts.js lint\n```\n\nNormally, `nps` will look for a `package-scripts.js` file and load that to get the scripts. Generally you'll want to\nhave this at the root of your project (next to the `package.json`). But by specifying `-c` or `--config`, `nps` will\nuse that file instead.\n\n##### -l, --log-level\n\nSpecify the log level to use\n\n##### -r, --require\n\nYou can specify a module which will be loaded before the config file is loaded. This allows you to preload for example\nbabel-register so you can use all babel presets you like.\n\n##### scripts\n\nTo run a script, you simply provide the name of the script like so:\n\n```console\nnps cover\n```\n\nAnd you can run multiple scripts in series by simply adding more space-separated arguments.\n\n```console\nnps cover check-coverage\n```\n\nAnd you can pass arguments to scripts by putting the scripts in quotes:\n\n```console\nnps \"test --cover\" check-coverage\n```\n\n##### -y, --help-style\n\nBy default, `nps` will dump a very long help documentation to the screen based on your package-scripts.js file. You can modify this output with one of three help-style options:\n\n`all` gives you the normal default output:\n\n```console\nnps help \"--help-style all\"\n```\n\n`scripts` will give you only the help information built from your package-scripts.js file\n\n```console\nnps help \"--help-style scripts\"\n```\n\n`basic` will give you only the name and description of the scripts from your package-scripts.js file\n\n```console\nnps help \"--help-style basic\"\n```\n\n#### CLI Configuration File\n\nSome of the options accepted by CLI can also be provided in a `.npsrc` or `.npsrc.json` JSON configuration file.\nIt will search upwards starting in the directory the `nps` command was invoked from.\n\nThe accepted options are:\n\n- `require`\n- `config`\n\nThe other options can be provided in the specified configuration file (or the default `package-scripts.js`) once it is loaded, but these\noptions need to be provided in order to find and parse the configuration file.\n\nThis is can be useful when you have a reqular set of options you need to pass to `nps`, especially when using `series.nps()` or `concurrent.nps()` from `nps-utils`.\n\n```json\n{\n  \"require\": \"ts-node/register/transpile-only\",\n  \"config\": \"package-scripts.ts\"\n}\n```\n\nThat's all for the CLI.\n\n### package-scripts.js\n\n\u003e Remember, this file is JavaScript, so you can write functions to make things more simple!\n\u003e See other/EXAMPLES.md for examples of cool things you can do with this.\n\n`nps` expects to your `package-scripts.js` file to `module.exports` an object with the following properties:\n\n#### scripts\n\nThis can be an object or a function that returns an object. See the annotated example below for what this object can\nlook like (and different ways to run them):\n\n```javascript\nmodule.exports = {\n  scripts: {\n    default: 'echo \"This runs on `nps`\"', // nps\n    // you can assign a script property to a string\n    simple: 'echo \"this is easy\"', // nps simple\n    // you can specify whether some scripts should be excluded from the help list\n    hidden: {\n      script: \"debugging script\",\n      hiddenFromHelp: true\n    },\n    test: {\n      default: {\n        script: \"jest\", // nps test\n        description: \"Run tests with jest\"\n        // your scripts will be run with node_modules/.bin in the PATH, so you can use locally installed packages.\n        // this is done in a cross-platform way, so your scripts will work on Mac and Windows :)\n        // NOTE: if you need to set environment variables, I recommend you check out the cross-env package, which works\n        // great with nps\n      },\n      otherStuff: {\n        // this one can be executed two different ways:\n        // 1. nps test.otherStuff\n        // 2. nps test.other-stuff\n        script: 'echo \"testing other things\"',\n        description: \"this is a handy description\"\n      }\n    },\n    // this one can be executed a few different ways:\n    // 1. nps k\n    // 2. nps kebab-case\n    // 3. nps kebabCase\n    \"kebab-case\": 'echo \"kebab-case\"',\n    series: \"nps simple,test,kebabCase\" // runs these other scripts in series\n  }\n};\n```\n\n```console\nnps k # runs nps kebab-case\n```\n\n#### options\n\nThis object is used to configure `nps` with the following options:\n\n##### silent\n\nSetting this to `true` will prevent `nps` from outputting anything for your script (normally you'll get simple output\nindicating the command that's being executed). This effectively sets the `logLevel` to `disable`.\n\n##### logLevel\n\nThis sets the logLevel of `nps`.\n\n## ENV variables\n\n### LOG_LEVEL\n\nBy setting `LOG_LEVEL` environment variable you can control the log level for `nps`\n\n## Log level\n\nLog levels available:\n\n- `error` - errors only\n- `warn` - errors and warnings only\n- `info` - info, errors, and warnings (default)\n\n## Badge\n\nCongratulations your repo is nps-friendly. Time to flaunt it! Add the nps-friendly badge to your README using the following markdown:\n\n```markdown\n[![nps friendly](https://img.shields.io/badge/nps-friendly-blue.svg?style=flat-square)](https://github.com/sezna/nps)\n```\n\nYour badge will look like this:\n\n[![nps friendly](https://img.shields.io/badge/nps-friendly-blue.svg?style=flat-square)](https://github.com/sezna/nps)\n\nIt may also make sense to change your README.md or CONTRIBUTING.md to include or link to the nps project so that your new contributors may learn more about installing and using nps.\n\n## FAQ\n\n### How do I do \\_\\_\\_ ?\n\nHave you looked at the examples in [other/EXAMPLES.md][examples]?\n\n### Why `npm start`?\n\n_Just to be clear:_ You do **not** have to use the `start` script. You can use whatever you like. But I recommend using\nthe `start`. [npm scripts][npm scripts] are generally run with `npm run \u003cscript-name\u003e`. There are some exceptions to\nthis. For example:\n\n1. `npm run test` === `npm test` === `npm t`\n2. `npm run start` === `npm start`\n\nSo, while you could use a script called `script` and run `npm run script build`, I just think it reads more clearly to\njust use the `start` script and run `npm start build`. It's also nice that it's fewer things to type. You could also use\nthe `test` script and then type even less: `npm t build`, but thats just... odd.\n\nNote, often servers are configured to run `npm start` by default to start the server. To allow for this case, you can\nprovide a `default` script at the root of your scripts which will be run when `npm start` is run without any arguments.\nEffectively this will allow you to have a script run when `npm start` is executed.\n\n## Resources / Tutorials\n\n- [Pull out npm scripts into another file with nps][video] by [Elijah Manor](https://github.com/elijahmanor) (5:53)\n\n## Inspiration\n\nThis was inspired by [a tweet][tweet] by [@sindresorhus][sindre].\n\n## Thanks\n\nBig thank you to [@tmpvar][tmpvar] for giving up the name `nps`! The original `nps` is now\ncalled [`npmsearch-cli`](https://www.npmjs.com/package/npmsearch-cli).\n\n## Related Packages\n\n- [`nps-utils`][nps-utils] - a collection of utilities to make cross-platform scripts and many other patterns\n  (like running concurrent/parallel scripts)\n- [`nps-i`](https://github.com/siddharthkp/nps-i) - interactive mode for nps\n\n## Other Solutions\n\n- [scripty][scripty] has a solution for this problem as well. The reason I didn't go with that though is you still need\n  a line for every script (one of the pains I'm trying to solve) and a each script requires its own file (one of the\n  benefits of npm scripts I wanted to keep).\n- [nabs][nabs] is a compiler that turns a nicely structured YAML file into script entries in your package.json\n\n### FAQ\n\n#### What happened to p-s?\n\nThis project _is_ p-s! It was just renamed during a major version bump. There were a few\nbreaking changes for this to happen and those are documented on the [releases][releases]\npage.\n\n## Contributors\n\nThanks goes to these people ([emoji key][emojis]):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore --\u003e\n| [\u003cimg src=\"https://avatars.githubusercontent.com/u/1500684?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKent C. Dodds\u003c/b\u003e\u003c/sub\u003e](http://kent.doddsfamily.us)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=kentcdodds \"Code\") [📖](https://github.com/sezna/nps/commits?author=kentcdodds \"Documentation\") [🚇](#infra-kentcdodds \"Infrastructure (Hosting, Build-Tools, etc)\") [💡](#example-kentcdodds \"Examples\") [📹](#video-kentcdodds \"Videos\") [👀](#review-kentcdodds \"Reviewed Pull Requests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/532272?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDavid Wells\u003c/b\u003e\u003c/sub\u003e](http://davidwells.io)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=DavidWells \"Code\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/802242?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAbhishek Shende\u003c/b\u003e\u003c/sub\u003e](https://twitter.com/abhishekisnot)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=abhishekisnot \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=abhishekisnot \"Tests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/185649?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRowan Oulton\u003c/b\u003e\u003c/sub\u003e](http://travelog.io)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=rowanoulton \"Code\") [📖](https://github.com/sezna/nps/commits?author=rowanoulton \"Documentation\") [⚠️](https://github.com/sezna/nps/commits?author=rowanoulton \"Tests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/1915716?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGilad Goldberg\u003c/b\u003e\u003c/sub\u003e](https://github.com/giladgo)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=giladgo \"Code\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/14267457?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTim McGee\u003c/b\u003e\u003c/sub\u003e](https://github.com/tim-mcgee)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=tim-mcgee \"Code\") [📖](https://github.com/sezna/nps/commits?author=tim-mcgee \"Documentation\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/175264?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNik Butenko\u003c/b\u003e\u003c/sub\u003e](http://butenko.me)\u003cbr /\u003e[💡](#example-nkbt \"Examples\") [💻](https://github.com/sezna/nps/commits?author=nkbt \"Code\") |\n| :---: | :---: | :---: | :---: | :---: | :---: | :---: |\n| [\u003cimg src=\"https://avatars.githubusercontent.com/u/1972567?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTommy\u003c/b\u003e\u003c/sub\u003e](http://www.tommyleunen.com)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3Atleunen \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=tleunen \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=tleunen \"Tests\") [👀](#review-tleunen \"Reviewed Pull Requests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/509946?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJayson Harshbarger\u003c/b\u003e\u003c/sub\u003e](http://www.hypercubed.com)\u003cbr /\u003e[💡](#example-Hypercubed \"Examples\") [👀](#review-Hypercubed \"Reviewed Pull Requests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/1355481?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJD Isaacks\u003c/b\u003e\u003c/sub\u003e](http://www.jisaacks.com)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=jisaacks \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=jisaacks \"Tests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/924465?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChristopher Hiller\u003c/b\u003e\u003c/sub\u003e](https://boneskull.com)\u003cbr /\u003e[👀](#review-boneskull \"Reviewed Pull Requests\") [🐛](https://github.com/sezna/nps/issues?q=author%3Aboneskull \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=boneskull \"Code\") [📖](https://github.com/sezna/nps/commits?author=boneskull \"Documentation\") [⚠️](https://github.com/sezna/nps/commits?author=boneskull \"Tests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/1834413?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRobin Malfait\u003c/b\u003e\u003c/sub\u003e](https://robinmalfait.com)\u003cbr /\u003e[💡](#example-RobinMalfait \"Examples\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/622118?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEric McCormick\u003c/b\u003e\u003c/sub\u003e](https://ericmccormick.io)\u003cbr /\u003e[👀](#review-edm00se \"Reviewed Pull Requests\") [📖](https://github.com/sezna/nps/commits?author=edm00se \"Documentation\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/1913805?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSam Verschueren\u003c/b\u003e\u003c/sub\u003e](https://twitter.com/SamVerschueren)\u003cbr /\u003e[👀](#review-SamVerschueren \"Reviewed Pull Requests\") |\n| [\u003cimg src=\"https://avatars.githubusercontent.com/u/1155589?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSorin Muntean\u003c/b\u003e\u003c/sub\u003e](https://github.com/sxn)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=sxn \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=sxn \"Tests\") [📖](https://github.com/sezna/nps/commits?author=sxn \"Documentation\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/1970063?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKeith Gunn\u003c/b\u003e\u003c/sub\u003e](https://github.com/gunnx)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3Agunnx \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=gunnx \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=gunnx \"Tests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/1019478?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJoe Martella\u003c/b\u003e\u003c/sub\u003e](http://martellaj.github.io)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3Amartellaj \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=martellaj \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=martellaj \"Tests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/1887854?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMartin Segado\u003c/b\u003e\u003c/sub\u003e](https://github.com/msegado)\u003cbr /\u003e[📖](https://github.com/sezna/nps/commits?author=msegado \"Documentation\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/36491?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBram Borggreve\u003c/b\u003e\u003c/sub\u003e](http://colmena.io/)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3Abeeman \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=beeman \"Code\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/86454?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eElijah Manor\u003c/b\u003e\u003c/sub\u003e](http://elijahmanor.com)\u003cbr /\u003e[📹](#video-elijahmanor \"Videos\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/10691183?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRagu Ramaswamy\u003c/b\u003e\u003c/sub\u003e](https://github.com/rrag)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=rrag \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=rrag \"Tests\") [🐛](https://github.com/sezna/nps/issues?q=author%3Arrag \"Bug reports\") |\n| [\u003cimg src=\"https://avatars.githubusercontent.com/u/2915616?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eErik Fox\u003c/b\u003e\u003c/sub\u003e](http://www.erikfox.co/)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3Aerikfox \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=erikfox \"Code\") [📖](https://github.com/sezna/nps/commits?author=erikfox \"Documentation\") [⚠️](https://github.com/sezna/nps/commits?author=erikfox \"Tests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/5351262?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAditya Pratap Singh\u003c/b\u003e\u003c/sub\u003e](http://blog.adityapsingh.com)\u003cbr /\u003e[👀](#review-addityasingh \"Reviewed Pull Requests\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/7687132?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ebumbleblym\u003c/b\u003e\u003c/sub\u003e](https://github.com/bumbleblym)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=bumbleblym \"Code\") [📖](https://github.com/sezna/nps/commits?author=bumbleblym \"Documentation\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/7091543?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eIslam Attrash\u003c/b\u003e\u003c/sub\u003e](https://twitter.com/IslamAttrash)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=Attrash-Islam \"Code\") | [\u003cimg src=\"https://avatars.githubusercontent.com/u/7215306?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJasonSooter\u003c/b\u003e\u003c/sub\u003e](https://github.com/JasonSooter)\u003cbr /\u003e[📖](https://github.com/sezna/nps/commits?author=JasonSooter \"Documentation\") | [\u003cimg src=\"https://avatars1.githubusercontent.com/u/116871?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNate Cavanaugh\u003c/b\u003e\u003c/sub\u003e](http://alterform.com)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=natecavanaugh \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/3534924?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eWissam Abirached\u003c/b\u003e\u003c/sub\u003e](https://designingforscale.com)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=wabirached \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=wabirached \"Tests\") |\n| [\u003cimg src=\"https://avatars1.githubusercontent.com/u/12592677?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePaweł Mikołajczyk\u003c/b\u003e\u003c/sub\u003e](https://github.com/Miklet)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=Miklet \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=Miklet \"Tests\") | [\u003cimg src=\"https://avatars0.githubusercontent.com/u/1295580?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKyle Welch\u003c/b\u003e\u003c/sub\u003e](http://www.krwelch.com)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=kwelch \"Code\") [⚠️](https://github.com/sezna/nps/commits?author=kwelch \"Tests\") | [\u003cimg src=\"https://avatars3.githubusercontent.com/u/22868432?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLufty Wiranda\u003c/b\u003e\u003c/sub\u003e](http://instagram.com/luftywiranda13)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=luftywiranda13 \"Code\") | [\u003cimg src=\"https://avatars6.githubusercontent.com/u/2936644?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBhargav Ponnapalli\u003c/b\u003e\u003c/sub\u003e](http://imbhargav5.com)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=imbhargav5 \"Code\") | [\u003cimg src=\"https://avatars0.githubusercontent.com/u/1538572?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003efalieson\u003c/b\u003e\u003c/sub\u003e](https://github.com/Falieson)\u003cbr /\u003e[📖](https://github.com/sezna/nps/commits?author=Falieson \"Documentation\") [🔧](#tool-Falieson \"Tools\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/22251956?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSuhas Karanth\u003c/b\u003e\u003c/sub\u003e](https://github.com/sudo-suhas)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3Asudo-suhas \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=sudo-suhas \"Code\") | [\u003cimg src=\"https://avatars3.githubusercontent.com/u/1228867?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEric Skram\u003c/b\u003e\u003c/sub\u003e](http://www.ericskram.com)\u003cbr /\u003e[📖](https://github.com/sezna/nps/commits?author=Vpr99 \"Documentation\") |\n| [\u003cimg src=\"https://avatars2.githubusercontent.com/u/11901111?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKether Saturnius\u003c/b\u003e\u003c/sub\u003e](http://www.k3th3r.com)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=iamkether \"Code\") [📖](https://github.com/sezna/nps/commits?author=iamkether \"Documentation\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/2536916?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSviatoslav\u003c/b\u003e\u003c/sub\u003e](https://github.com/SleepWalker)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3ASleepWalker \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=SleepWalker \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/1470998?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eWei Wang\u003c/b\u003e\u003c/sub\u003e](https://github.com/onlywei)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=onlywei \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/1393142?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSami Jaber\u003c/b\u003e\u003c/sub\u003e](http://twitter.com/samjabz)\u003cbr /\u003e[🐛](https://github.com/sezna/nps/issues?q=author%3Asamijaber \"Bug reports\") [💻](https://github.com/sezna/nps/commits?author=samijaber \"Code\") | [\u003cimg src=\"https://avatars3.githubusercontent.com/u/28313487?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFlorian Löchle\u003c/b\u003e\u003c/sub\u003e](https://github.com/schottilol)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=schottilol \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/15851351?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKevin J\u003c/b\u003e\u003c/sub\u003e](https://github.com/kevjin)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=kevjin \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/3784470?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBen Teichman\u003c/b\u003e\u003c/sub\u003e](http://www.benteichman.ca)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=effervescentia \"Code\") [📖](https://github.com/sezna/nps/commits?author=effervescentia \"Documentation\") |\n| [\u003cimg src=\"https://avatars3.githubusercontent.com/u/12157751?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlex Hansen\u003c/b\u003e\u003c/sub\u003e](http://alex-hansen.com)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=sezna \"Code\") [🚇](#infra-sezna \"Infrastructure (Hosting, Build-Tools, etc)\") [👀](#review-sezna \"Reviewed Pull Requests\") | [\u003cimg src=\"https://avatars3.githubusercontent.com/u/4335849?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eCasey Primozic\u003c/b\u003e\u003c/sub\u003e](https://cprimozic.com)\u003cbr /\u003e[🚇](#infra-ameobea \"Infrastructure (Hosting, Build-Tools, etc)\") [👀](#review-ameobea \"Reviewed Pull Requests\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/3822890?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eVivek Fitkariwala\u003c/b\u003e\u003c/sub\u003e](https://github.com/VivekFitkariwala)\u003cbr /\u003e[💻](https://github.com/sezna/nps/commits?author=VivekFitkariwala \"Code\") | [\u003cimg src=\"https://avatars1.githubusercontent.com/u/87619?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDanny Coates\u003c/b\u003e\u003c/sub\u003e](http://dannycoates.com)\u003cbr /\u003e[💻](https://github.com/kentcdodds/p-s/commits?author=dannycoates \"Code\") |\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors][all-contributors] specification.\nContributions of any kind welcome!\n\n## LICENSE\n\nMIT\n\n[nps-badge]: https://img.shields.io/badge/nps-friendly-blue.svg?style=flat-square\n[nps-github]: https://github.com/kentcdodds/nps\n[scripts-advantages]: https://www.freecodecamp.org/news/why-i-left-gulp-and-grunt-for-npm-scripts-3d6853dd22b8/#.9qghcfdr9\n[mess]: https://github.com/ReactiveX/rxjs/blob/a3ec89605a24a6f54e577d21773dad11f22fdb14/package.json#L14-L96\n[roadmap]: https://github.com/sezna/nps/blob/master/other/ROADMAP.md\n[examples]: https://github.com/sezna/nps/blob/master/other/EXAMPLES.md\n[quick-run]: https://npmjs.com/package/npm-quick-run\n[npm]: https://www.npmjs.com/\n[node]: https://nodejs.org\n[build-badge]: https://img.shields.io/travis/sezna/nps/master.svg?style=flat-square\n[build]: https://travis-ci.org/kentcdodds/nps\n[coverage-badge]: https://img.shields.io/codecov/c/github/kentcdodds/nps.svg?style=flat-square\n[coverage]: https://codecov.io/github/kentcdodds/nps\n[dependencyci-badge]: https://dependencyci.com/github/sezna/nps/badge?style=flat-square\n[dependencyci]: https://dependencyci.com/github/kentcdodds/nps\n[version-badge]: https://img.shields.io/npm/v/nps.svg?style=flat-square\n[package]: https://www.npmjs.com/package/nps\n[downloads-badge]: https://img.shields.io/npm/dm/nps.svg?style=flat-square\n[npm-stat]: http://npm-stat.com/charts.html?package=nps\u0026from=2016-04-01\n[license-badge]: https://img.shields.io/npm/l/nps.svg?style=flat-square\n[license]: https://github.com/sezna/nps/blob/master/LICENSE\n[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\n[prs]: http://makeapullrequest.com\n[donate-badge]: https://img.shields.io/badge/%EF%BC%84-support-green.svg?style=flat-square\n[donate]: http://kcd.im/donate\n[coc-badge]: https://img.shields.io/badge/code%20of-conduct-ff69b4.svg?style=flat-square\n[coc]: https://github.com/sezna/nps/blob/master/other/CODE_OF_CONDUCT.md\n[roadmap-badge]: https://img.shields.io/badge/%F0%9F%93%94-roadmap-CD9523.svg?style=flat-square\n[examples-badge]: https://img.shields.io/badge/%F0%9F%92%A1-examples-8C8E93.svg?style=flat-square\n[tweet]: https://twitter.com/sindresorhus/status/724259780676575232\n[sindre]: https://github.com/sindresorhus\n[tmpvar]: https://github.com/tmpvar\n[emojis]: https://github.com/kentcdodds/all-contributors#emoji-key\n[all-contributors]: https://github.com/kentcdodds/all-contributors\n[clarity]: https://github.com/sezna/nps/issues/1\n[scripty]: https://npmjs.com/package/scripty\n[nabs]: https://npmjs.com/package/nabs\n[npm scripts]: https://docs.npmjs.com/misc/scripts\n[video]: http://kcd.im/nps-video\n[releases]: https://github.com/sezna/nps/releases/tag/v5.0.0\n[nps-utils]: https://github.com/kentcdodds/nps-utils\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsezna%2Fnps","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsezna%2Fnps","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsezna%2Fnps/lists"}