UNPKG

27.9 kBMarkdownView Raw
1# nps
2
3All the benefits of npm scripts without the cost of a bloated package.json and limits of json
4
5> `nps` is short for `npm-package-scripts`
6
7> [What happened to p-s?](#what-happened-to-p-s)
8
9[![Build Status][build-badge]][build]
10[![Code Coverage][coverage-badge]][coverage]
11[![Dependencies][dependencyci-badge]][dependencyci]
12[![version][version-badge]][package]
13[![downloads][downloads-badge]][npm-stat]
14[![MIT License][license-badge]][LICENSE]
15
16[![All Contributors](https://img.shields.io/badge/all_contributors-34-orange.svg?style=flat-square)](#contributors)
17[![PRs Welcome][prs-badge]][prs]
18[![Donate][donate-badge]][donate]
19[![Code of Conduct][coc-badge]][coc]
20[![Roadmap][roadmap-badge]][roadmap]
21[![Examples][examples-badge]][examples]
22[![nps friendly][nps-badge]](#badge)
23
24## Quick Video Intro :tv:
25
26<a href="http://kcd.im/nps-video" title="Pull out npm scripts into another file with nps">
27 <img src="https://github.com/kentcdodds/nps/raw/master/other/video-screenshot.png" alt="Video Screenshot" title="Video Screenshot" width="700" />
28</a>
29
30[Pull out npm scripts into another file with nps][video] by [Elijah Manor](https://github.com/elijahmanor) (5:53)
31
32## The problem
33
34Even though npm scripts have a ton of advantages ([learn more][scripts-advantages]), it can grow into an
35[unmaintainable mess][mess] in your `package.json` file. Part of the problem is we're configuring scripts in `json`
36which has fundamental issues (like no comments).
37
38## This solution
39
40`nps` is a package that solves this problem by allowing you to move your scripts to a `package-scripts.js` file. Because
41this file is a JavaScript file, you can do a lot more with your project scripts. Here's an example of a
42`package-scripts.js` file:
43
44```javascript
45const npsUtils = require('nps-utils') // not required, but handy!
46
47module.exports = {
48 scripts: {
49 default: 'node index.js',
50 lint: 'eslint .',
51 test: {
52 // learn more about Jest here: https://facebook.github.io/jest
53 default: 'jest',
54 watch: {
55 script: 'jest --watch',
56 description: 'run in the amazingly intelligent Jest watch mode'
57 }
58 },
59 build: {
60 // learn more about Webpack here: https://webpack.js.org/
61 default: 'webpack',
62 prod: 'webpack -p',
63 },
64 // learn more about npsUtils here: https://npm.im/nps-utils
65 validate: npsUtils.concurrently.nps('lint', 'test', 'build'),
66 },
67}
68```
69
70Or in case you prefer YAML, here's an example of how that would look in a `package-scripts.yml` file:
71
72```yml
73scripts:
74 default: node index.js
75 lint: eslint .
76 test:
77 # learn more about Jest here: https://kcd.im/egghead-jest
78 default: jest
79 watch:
80 script: jest --watch
81 description: run in the amazingly intelligent Jest watch mode
82 build:
83 default: webpack
84 prod: webpack -p
85 validate: concurrently "nps lint" "nps test" "nps build"
86```
87
88To use `nps`, it's recommended that you either install it globally (`npm i -g nps`) or add `./node_modules/bin` to your
89`$PATH` (be careful that you know what you're doing when doing this, find out how [here](https://youtu.be/2WZ5iS_3Jgs)).
90
91Then you can run:
92
93```console
94nps help
95```
96
97Which will output:
98
99```console
100Usage: nps [options] <script>...
101
102Commands:
103 init automatically migrate from npm scripts to nps
104 completion generate bash completion script
105
106Options:
107 --config, -c Config file to use (defaults to nearest package-scripts.yml
108 or package-scripts.js)
109 [default: "<path-to-your-project>/package-scripts.js"]
110 --silent, -s Silent nps output [boolean] [default: false]
111 --log-level, -l The log level to use
112 [choices: "error", "warn", "info", "debug"] [default: "info"]
113 --require, -r Module to preload
114 -h, --help Show help [boolean]
115 -v, --version Show version number [boolean]
116
117Examples:
118 nps.js test build Runs the `test` script then the
119 `build` script
120 nps.js "test --cover" "build --prod" Runs the `test` script and forwards
121 the "--cover" flag then the `build`
122 script and forwards the "--prod"
123 flag
124
125Available scripts (camel or kebab case accepted)
126
127lint - eslint .
128test - jest
129test.watch - run in the amazingly intelligent Jest watch mode - jest --watch
130build - webpack
131build.prod - webpack -p
132validate - concurrently "nps lint" "nps test" "nps build"
133```
134You can also use the help command with a script name
135```console
136nps help test.watch
137```
138Which will output the details of the script `test.watch`:
139
140```console
141test.watch - run in the amazingly intelligent Jest watch mode - jest --watch
142```
143
144Now, to run a script, you can run:
145
146```console
147nps lint
148nps test.watch
149# etc.
150```
151
152But the fun doesn't end there! You can use a prefix:
153
154```console
155nps b # will run the build script
156nps help b # will display help for the build script
157```
158
159And these prefixes can go as deep as you like!
160
161```console
162nps b.p # will run the production build script
163```
164
165Cool stuff right? And there's more on [the roadmap][roadmap].
166
167**Also** check out the [examples][examples]. You'll find some good stuff in there (including how to deal with windows
168and other cross-platform issues).
169
170**Note:** If you don't like installing things globally and don't want to muck with your `$PATH` (or don't want to
171require that your co-workers or project contributors to do so), then you can add a single script to your `package.json`.
172We recommend that you use the `start` script because it requires less typing:
173
174**package.json**
175
176```json
177{
178 "scripts": {
179 "start": "nps"
180 }
181}
182```
183
184You don't have to use the `start` script if you don't want. Note that if you're writing a node application, you're
185likely using `start` for starting your server. In that case, you can create a `default` script which will be run
186when `nps` is run without arguments (so effectively it'll work just the same). But if you'd prefer, you can use whatever
187you wish. For example you could easily create a `nps` script and do: `npm run nps b`.
188
189## Installation
190
191This module is distributed via [npm][npm] which is bundled with [node][node] and should
192be installed as one of your project's `devDependencies`:
193
194```
195npm install --save-dev nps
196```
197
198### global installation
199
200You can install this module globally also (this is recommended):
201
202```
203npm install --global nps
204```
205
206From here you can use `nps` on the command line via one of the installed aliases: `nps` or `nps`.
207
208If you do this, you may also be interested in installing the shell autocompletion script. See more about this below.
209
210## Getting started
211
212If you're already using npm scripts, you can get up and going really quickly with the `init` command:
213
214```
215./node_modules/.bin/nps init
216```
217or
218```
219./node_modules/.bin/nps init --type yml
220```
221
222This will use your `package.json` `scripts` to generate a `package-scripts.js` (respectively a `package-scripts.yml`)
223file and update your `scripts` to utilize the `nps` binary.
224
225## API
226
227### CLI
228
229#### Commands
230
231##### help
232
233If you have a `help` script, then your `help` script will be run. Otherwise, this will output the help.
234
235> Note: you can do this with `nps --help`, but if you're using the `start` script in your `package.json` this allows you
236> to run `npm start help` rather than `npm start -- --help`
237
238##### init
239
240As indicated above, this will migrate your npm scripts to package-scripts.
241
242##### completion
243
244```console
245nps completion >> <your-bash-profile-file>
246```
247
248Normally `<your-bash-profile-file>` will be `~/.bash_profile`, `~/.bashrc`, or `~/.zshrc`.
249
250Note: you should probably only do this if you have the package installed globally. In that case you should probably also
251normally use the `nps` alias rather than `nps` because it's easier to type.
252
253#### CLI options
254
255##### -h, --help
256
257Will print out the help you see above (the available scripts are colored 🌈 and come from the config specified/default
258config).
259
260##### -s, --silent
261
262By default, `nps` will log out to the console before running the command. You can add `-s` to your command to silence
263this.
264
265##### --no-scripts
266
267By default, the script's command text will log out to the console before running the command. You can add `--no-scripts` to prevent this.
268
269##### -c, --config
270
271Use a different config
272
273```
274nps -c ./other/package-scripts.js lint
275```
276
277Normally, `nps` will look for a `package-scripts.js` file and load that to get the scripts. Generally you'll want to
278have this at the root of your project (next to the `package.json`). But by specifying `-c` or `--config`, `nps` will
279use that file instead.
280
281
282##### -l, --log-level
283
284Specify the log level to use
285
286##### -r, --require
287
288You can specify a module which will be loaded before the config file is loaded. This allows you to preload for example
289babel-register so you can use all babel presets you like.
290
291##### scripts
292
293To run a script, you simply provide the name of the script like so:
294
295```console
296nps cover
297```
298
299And you can run multiple scripts in series by simply adding more space-separated arguments.
300
301```console
302nps cover check-coverage
303```
304
305And you can pass arguments to scripts by putting the scripts in quotes:
306
307```console
308nps "test --cover" check-coverage
309```
310
311That's all for the CLI.
312
313### package-scripts.js
314
315> Remember, this file is JavaScript, so you can write functions to make things more simple!
316> See other/EXAMPLES.md for examples of cool things you can do with this.
317
318`nps` expects to your `package-scripts.js` file to `module.exports` an object with the following properties:
319
320#### scripts
321
322This can be an object or a function that returns an object. See the annotated example below for what this object can
323look like (and different ways to run them):
324
325```javascript
326module.exports = {
327 scripts: {
328 default: 'echo "This runs on `nps`"', // nps
329 // you can assign a script property to a string
330 simple: 'echo "this is easy"', // nps simple
331 // you can specify whether some scripts should be excluded from the help list
332 hidden: {
333 script: 'debugging script',
334 hiddenFromHelp: true,
335 },
336 test: {
337 default: {
338 script: 'jest', // nps test
339 description: 'Run tests with jest',
340 // your scripts will be run with node_modules/.bin in the PATH, so you can use locally installed packages.
341 // this is done in a cross-platform way, so your scripts will work on Mac and Windows :)
342 // NOTE: if you need to set environment variables, I recommend you check out the cross-env package, which works
343 // great with nps
344 },
345 otherStuff: {
346 // this one can be executed two different ways:
347 // 1. nps test.otherStuff
348 // 2. nps test.other-stuff
349 script: 'echo "testing other things"',
350 description: 'this is a handy description',
351 },
352 },
353 // this one can be executed a few different ways:
354 // 1. nps k
355 // 2. nps kebab-case
356 // 3. nps kebabCase
357 'kebab-case': 'echo "kebab-case"',
358 series: 'nps simple,test,kebabCase', // runs these other scripts in series
359 },
360}
361```
362
363```console
364nps k # runs nps kebab-case
365```
366
367#### options
368
369This object is used to configure `nps` with the following options:
370
371##### silent
372
373Setting this to `true` will prevent `nps` from outputting anything for your script (normally you'll get simple output
374indicating the command that's being executed). This effectively sets the `logLevel` to `disable`.
375
376##### logLevel
377
378This sets the logLevel of `nps`.
379
380## ENV variables
381
382### LOG_LEVEL
383
384By setting `LOG_LEVEL` environment variable you can control the log level for `nps`
385
386## Log level
387
388Log levels available:
389
390- `error` - errors only
391- `warn` - errors and warnings only
392- `info` - info, errors, and warnings (default)
393
394## Badge
395
396Congratulations your repo is nps-friendly. Time to flaunt it! Add the nps-friendly badge to your README using the following markdown:
397
398```markdown
399[![nps friendly](https://img.shields.io/badge/nps-friendly-blue.svg?style=flat-square)](https://github.com/kentcdodds/nps)
400```
401
402Your badge will look like this:
403
404[![nps friendly](https://img.shields.io/badge/nps-friendly-blue.svg?style=flat-square)](https://github.com/kentcdodds/nps)
405
406It 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.
407
408## FAQ
409
410### How do I do ___ ?
411
412Have you looked at the examples in [other/EXAMPLES.md][examples]?
413
414### Why `npm start`?
415
416_Just to be clear:_ You do **not** have to use the `start` script. You can use whatever you like. But I recommend using
417the `start`. [npm scripts][npm scripts] are generally run with `npm run <script-name>`. There are some exceptions to
418this. For example:
419
4201. `npm run test` === `npm test` === `npm t`
4212. `npm run start` === `npm start`
422
423So, while you could use a script called `script` and run `npm run script build`, I just think it reads more clearly to
424just use the `start` script and run `npm start build`. It's also nice that it's fewer things to type. You could also use
425the `test` script and then type even less: `npm t build`, but thats just... odd.
426
427Note, often servers are configured to run `npm start` by default to start the server. To allow for this case, you can
428provide a `default` script at the root of your scripts which will be run when `npm start` is run without any arguments.
429Effectively this will allow you to have a script run when `npm start` is executed.
430
431## Inspiration
432
433This was inspired by [a tweet][tweet] by [@sindresorhus][sindre].
434
435## Thanks
436
437Big thank you to [@tmpvar][tmpvar] for giving up the name `nps`! The original `nps` is now
438called [`npmsearch-cli`](https://www.npmjs.com/package/npmsearch-cli).
439
440## Related Packages
441
442- [`nps-utils`][nps-utils] - a collection of utilities to make cross-platform scripts and many other patterns
443(like running concurrent/parallel scripts)
444
445## Other Solutions
446
447- [scripty][scripty] has a solution for this problem as well. The reason I didn't go with that though is you still need
448a line for every script (one of the pains I'm trying to solve) and a each script requires its own file (one of the
449benefits of npm scripts I wanted to keep).
450- [nabs][nabs] is a compiler that turns a nicely structured YAML file into script entries in your package.json
451
452### FAQ
453
454#### What happened to p-s?
455
456This project _is_ p-s! It was just renamed during a major version bump. There were a few
457breaking changes for this to happen and those are documented on the [releases][releases]
458page.
459
460## Contributors
461
462Thanks goes to these people ([emoji key][emojis]):
463
464<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
465| [<img src="https://avatars.githubusercontent.com/u/1500684?v=3" width="100px;"/><br /><sub>Kent C. Dodds</sub>](http://kent.doddsfamily.us)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=kentcdodds "Code") [📖](https://github.com/kentcdodds/p-s/commits?author=kentcdodds "Documentation") [🚇](#infra-kentcdodds "Infrastructure (Hosting, Build-Tools, etc)") [💡](#example-kentcdodds "Examples") [📹](#video-kentcdodds "Videos") [👀](#review-kentcdodds "Reviewed Pull Requests") | [<img src="https://avatars.githubusercontent.com/u/532272?v=3" width="100px;"/><br /><sub>David Wells</sub>](http://davidwells.io)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=DavidWells "Code") | [<img src="https://avatars.githubusercontent.com/u/802242?v=3" width="100px;"/><br /><sub>Abhishek Shende</sub>](https://twitter.com/abhishekisnot)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=abhishekisnot "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=abhishekisnot "Tests") | [<img src="https://avatars.githubusercontent.com/u/185649?v=3" width="100px;"/><br /><sub>Rowan Oulton</sub>](http://travelog.io)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=rowanoulton "Code") [📖](https://github.com/kentcdodds/p-s/commits?author=rowanoulton "Documentation") [⚠️](https://github.com/kentcdodds/p-s/commits?author=rowanoulton "Tests") | [<img src="https://avatars.githubusercontent.com/u/1915716?v=3" width="100px;"/><br /><sub>Gilad Goldberg</sub>](https://github.com/giladgo)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=giladgo "Code") | [<img src="https://avatars.githubusercontent.com/u/14267457?v=3" width="100px;"/><br /><sub>Tim McGee</sub>](https://github.com/tim-mcgee)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=tim-mcgee "Code") [📖](https://github.com/kentcdodds/p-s/commits?author=tim-mcgee "Documentation") | [<img src="https://avatars.githubusercontent.com/u/175264?v=3" width="100px;"/><br /><sub>Nik Butenko</sub>](http://butenko.me)<br />[💡](#example-nkbt "Examples") [💻](https://github.com/kentcdodds/p-s/commits?author=nkbt "Code") |
466| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
467| [<img src="https://avatars.githubusercontent.com/u/1972567?v=3" width="100px;"/><br /><sub>Tommy</sub>](http://www.tommyleunen.com)<br />[🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Atleunen "Bug reports") [💻](https://github.com/kentcdodds/p-s/commits?author=tleunen "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=tleunen "Tests") [👀](#review-tleunen "Reviewed Pull Requests") | [<img src="https://avatars.githubusercontent.com/u/509946?v=3" width="100px;"/><br /><sub>Jayson Harshbarger</sub>](http://www.hypercubed.com)<br />[💡](#example-Hypercubed "Examples") [👀](#review-Hypercubed "Reviewed Pull Requests") | [<img src="https://avatars.githubusercontent.com/u/1355481?v=3" width="100px;"/><br /><sub>JD Isaacks</sub>](http://www.jisaacks.com)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=jisaacks "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=jisaacks "Tests") | [<img src="https://avatars.githubusercontent.com/u/924465?v=3" width="100px;"/><br /><sub>Christopher Hiller</sub>](https://boneskull.com)<br />[👀](#review-boneskull "Reviewed Pull Requests") [🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Aboneskull "Bug reports") [💻](https://github.com/kentcdodds/p-s/commits?author=boneskull "Code") [📖](https://github.com/kentcdodds/p-s/commits?author=boneskull "Documentation") [⚠️](https://github.com/kentcdodds/p-s/commits?author=boneskull "Tests") | [<img src="https://avatars.githubusercontent.com/u/1834413?v=3" width="100px;"/><br /><sub>Robin Malfait</sub>](https://robinmalfait.com)<br />[💡](#example-RobinMalfait "Examples") | [<img src="https://avatars.githubusercontent.com/u/622118?v=3" width="100px;"/><br /><sub>Eric McCormick</sub>](https://ericmccormick.io)<br />[👀](#review-edm00se "Reviewed Pull Requests") [📖](https://github.com/kentcdodds/p-s/commits?author=edm00se "Documentation") | [<img src="https://avatars.githubusercontent.com/u/1913805?v=3" width="100px;"/><br /><sub>Sam Verschueren</sub>](https://twitter.com/SamVerschueren)<br />[👀](#review-SamVerschueren "Reviewed Pull Requests") |
468| [<img src="https://avatars.githubusercontent.com/u/1155589?v=3" width="100px;"/><br /><sub>Sorin Muntean</sub>](https://github.com/sxn)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=sxn "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=sxn "Tests") [📖](https://github.com/kentcdodds/p-s/commits?author=sxn "Documentation") | [<img src="https://avatars.githubusercontent.com/u/1970063?v=3" width="100px;"/><br /><sub>Keith Gunn</sub>](https://github.com/gunnx)<br />[🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Agunnx "Bug reports") [💻](https://github.com/kentcdodds/p-s/commits?author=gunnx "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=gunnx "Tests") | [<img src="https://avatars.githubusercontent.com/u/1019478?v=3" width="100px;"/><br /><sub>Joe Martella</sub>](http://martellaj.github.io)<br />[🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Amartellaj "Bug reports") [💻](https://github.com/kentcdodds/p-s/commits?author=martellaj "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=martellaj "Tests") | [<img src="https://avatars.githubusercontent.com/u/1887854?v=3" width="100px;"/><br /><sub>Martin Segado</sub>](https://github.com/msegado)<br />[📖](https://github.com/kentcdodds/p-s/commits?author=msegado "Documentation") | [<img src="https://avatars.githubusercontent.com/u/36491?v=3" width="100px;"/><br /><sub>Bram Borggreve</sub>](http://colmena.io/)<br />[🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Abeeman "Bug reports") [💻](https://github.com/kentcdodds/p-s/commits?author=beeman "Code") | [<img src="https://avatars.githubusercontent.com/u/86454?v=3" width="100px;"/><br /><sub>Elijah Manor</sub>](http://elijahmanor.com)<br />[📹](#video-elijahmanor "Videos") | [<img src="https://avatars.githubusercontent.com/u/10691183?v=3" width="100px;"/><br /><sub>Ragu Ramaswamy</sub>](https://github.com/rrag)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=rrag "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=rrag "Tests") [🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Arrag "Bug reports") |
469| [<img src="https://avatars.githubusercontent.com/u/2915616?v=3" width="100px;"/><br /><sub>Erik Fox</sub>](http://www.erikfox.co/)<br />[🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Aerikfox "Bug reports") [💻](https://github.com/kentcdodds/p-s/commits?author=erikfox "Code") [📖](https://github.com/kentcdodds/p-s/commits?author=erikfox "Documentation") [⚠️](https://github.com/kentcdodds/p-s/commits?author=erikfox "Tests") | [<img src="https://avatars.githubusercontent.com/u/5351262?v=3" width="100px;"/><br /><sub>Aditya Pratap Singh</sub>](http://blog.adityapsingh.com)<br />[👀](#review-addityasingh "Reviewed Pull Requests") | [<img src="https://avatars.githubusercontent.com/u/7687132?v=3" width="100px;"/><br /><sub>bumbleblym</sub>](https://github.com/bumbleblym)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=bumbleblym "Code") [📖](https://github.com/kentcdodds/p-s/commits?author=bumbleblym "Documentation") | [<img src="https://avatars.githubusercontent.com/u/7091543?v=3" width="100px;"/><br /><sub>Islam Attrash</sub>](https://twitter.com/IslamAttrash)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=Attrash-Islam "Code") | [<img src="https://avatars.githubusercontent.com/u/7215306?v=3" width="100px;"/><br /><sub>JasonSooter</sub>](https://github.com/JasonSooter)<br />[📖](https://github.com/kentcdodds/p-s/commits?author=JasonSooter "Documentation") | [<img src="https://avatars1.githubusercontent.com/u/116871?v=3" width="100px;"/><br /><sub>Nate Cavanaugh</sub>](http://alterform.com)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=natecavanaugh "Code") | [<img src="https://avatars2.githubusercontent.com/u/3534924?v=3" width="100px;"/><br /><sub>Wissam Abirached</sub>](https://designingforscale.com)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=wabirached "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=wabirached "Tests") |
470| [<img src="https://avatars1.githubusercontent.com/u/12592677?v=3" width="100px;"/><br /><sub>Paweł Mikołajczyk</sub>](https://github.com/Miklet)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=Miklet "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=Miklet "Tests") | [<img src="https://avatars0.githubusercontent.com/u/1295580?v=3" width="100px;"/><br /><sub>Kyle Welch</sub>](http://www.krwelch.com)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=kwelch "Code") [⚠️](https://github.com/kentcdodds/p-s/commits?author=kwelch "Tests") | [<img src="https://avatars3.githubusercontent.com/u/22868432?v=3" width="100px;"/><br /><sub>Lufty Wiranda</sub>](http://instagram.com/luftywiranda13)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=luftywiranda13 "Code") | [<img src="https://avatars6.githubusercontent.com/u/2936644?v=4" width="100px;"/><br /><sub>Bhargav Ponnapalli</sub>](http://imbhargav5.com)<br />[💻](https://github.com/kentcdodds/p-s/commits?author=imbhargav5 "Code") | [<img src="https://avatars0.githubusercontent.com/u/1538572?v=4" width="100px;"/><br /><sub>falieson</sub>](https://github.com/Falieson)<br />[📖](https://github.com/kentcdodds/p-s/commits?author=Falieson "Documentation") [🔧](#tool-Falieson "Tools") | [<img src="https://avatars2.githubusercontent.com/u/22251956?v=4" width="100px;"/><br /><sub>Suhas Karanth</sub>](https://github.com/sudo-suhas)<br />[🐛](https://github.com/kentcdodds/p-s/issues?q=author%3Asudo-suhas "Bug reports") [💻](https://github.com/kentcdodds/p-s/commits?author=sudo-suhas "Code") |
471<!-- ALL-CONTRIBUTORS-LIST:END -->
472
473This project follows the [all-contributors][all-contributors] specification.
474Contributions of any kind welcome!
475
476## LICENSE
477
478MIT
479
480[nps-badge]: https://img.shields.io/badge/nps-friendly-blue.svg?style=flat-square
481[nps-github]: https://github.com/kentcdodds/nps
482[scripts-advantages]: https://medium.freecodecamp.com/why-i-left-gulp-and-grunt-for-npm-scripts-3d6853dd22b8#.9qghcfdr9
483[mess]: https://github.com/ReactiveX/rxjs/blob/a3ec89605a24a6f54e577d21773dad11f22fdb14/package.json#L14-L96
484[roadmap]: https://github.com/kentcdodds/nps/blob/master/other/ROADMAP.md
485[examples]: https://github.com/kentcdodds/nps/blob/master/other/EXAMPLES.md
486[quick-run]: https://npmjs.com/package/npm-quick-run
487[npm]: https://www.npmjs.com/
488[node]: https://nodejs.org
489[build-badge]: https://img.shields.io/travis/kentcdodds/nps/master.svg?style=flat-square
490[build]: https://travis-ci.org/kentcdodds/nps
491[coverage-badge]: https://img.shields.io/codecov/c/github/kentcdodds/nps.svg?style=flat-square
492[coverage]: https://codecov.io/github/kentcdodds/nps
493[dependencyci-badge]: https://dependencyci.com/github/kentcdodds/nps/badge?style=flat-square
494[dependencyci]: https://dependencyci.com/github/kentcdodds/nps
495[version-badge]: https://img.shields.io/npm/v/nps.svg?style=flat-square
496[package]: https://www.npmjs.com/package/nps
497[downloads-badge]: https://img.shields.io/npm/dm/nps.svg?style=flat-square
498[npm-stat]: http://npm-stat.com/charts.html?package=nps&from=2016-04-01
499[license-badge]: https://img.shields.io/npm/l/nps.svg?style=flat-square
500[license]: https://github.com/kentcdodds/nps/blob/master/LICENSE
501[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square
502[prs]: http://makeapullrequest.com
503[donate-badge]: https://img.shields.io/badge/%EF%BC%84-support-green.svg?style=flat-square
504[donate]: http://kcd.im/donate
505[coc-badge]: https://img.shields.io/badge/code%20of-conduct-ff69b4.svg?style=flat-square
506[coc]: https://github.com/kentcdodds/nps/blob/master/other/CODE_OF_CONDUCT.md
507[roadmap-badge]: https://img.shields.io/badge/%F0%9F%93%94-roadmap-CD9523.svg?style=flat-square
508[examples-badge]: https://img.shields.io/badge/%F0%9F%92%A1-examples-8C8E93.svg?style=flat-square
509[tweet]: https://twitter.com/sindresorhus/status/724259780676575232
510[sindre]: https://github.com/sindresorhus
511[tmpvar]: https://github.com/tmpvar
512[emojis]: https://github.com/kentcdodds/all-contributors#emoji-key
513[all-contributors]: https://github.com/kentcdodds/all-contributors
514[clarity]: https://github.com/kentcdodds/nps/issues/1
515[scripty]: https://npmjs.com/package/scripty
516[nabs]: https://npmjs.com/package/nabs
517[npm scripts]: https://docs.npmjs.com/misc/scripts
518[video]: http://kcd.im/nps-video
519[releases]: https://github.com/kentcdodds/nps/releases/tag/v5.0.0
520[nps-utils]: https://github.com/kentcdodds/nps-utils