UNPKG

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