1 | # nps
|
2 |
|
3 | All 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 |
|
33 | Even 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`
|
35 | which 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
|
40 | this 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
|
44 | const npsUtils = require('nps-utils') // not required, but handy!
|
45 |
|
46 | module.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 |
|
69 | Or in case you prefer YAML, here's an example of how that would look in a `package-scripts.yml` file:
|
70 |
|
71 | ```yml
|
72 | scripts:
|
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 |
|
87 | To 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 |
|
90 | Then you can run:
|
91 |
|
92 | ```console
|
93 | nps help
|
94 | ```
|
95 |
|
96 | Which will output:
|
97 |
|
98 | ```console
|
99 | Usage: nps [options] <script>...
|
100 |
|
101 | Commands:
|
102 | init automatically migrate from npm scripts to nps
|
103 | completion generate bash completion script
|
104 |
|
105 | Options:
|
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 |
|
116 | Examples:
|
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 |
|
124 | Available scripts (camel or kebab case accepted)
|
125 |
|
126 | lint - eslint .
|
127 | test - jest
|
128 | test.watch - run in the amazingly intelligent Jest watch mode - jest --watch
|
129 | build - webpack
|
130 | build.prod - webpack -p
|
131 | validate - concurrently "nps lint" "nps test" "nps build"
|
132 | ```
|
133 |
|
134 | Now, to run a script, you can run:
|
135 |
|
136 | ```console
|
137 | nps lint
|
138 | nps test.watch
|
139 | # etc.
|
140 | ```
|
141 |
|
142 | But the fun doesn't end there! You can use a prefix:
|
143 |
|
144 | ```console
|
145 | nps b # will run the build script
|
146 | ```
|
147 |
|
148 | And these prefixes can go as deep as you like!
|
149 |
|
150 | ```console
|
151 | nps b.p # will run the production build script
|
152 | ```
|
153 |
|
154 | Cool 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
|
157 | and 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
|
160 | require that your co-workers or project contributors to do so), then you can add a single script to your `package.json`.
|
161 | We 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 |
|
173 | You don't have to use the `start` script if you don't want. Note that if you're writing a node application, you're
|
174 | likely using `start` for starting your server. In that case, you can create a `default` script which will be run
|
175 | when `nps` is run without arguments (so effectively it'll work just the same). But if you'd prefer, you can use whatever
|
176 | you wish. For example you could easily create a `nps` script and do: `npm run nps b`.
|
177 |
|
178 | ## Installation
|
179 |
|
180 | This module is distributed via [npm][npm] which is bundled with [node][node] and should
|
181 | be installed as one of your project's `devDependencies`:
|
182 |
|
183 | ```
|
184 | npm install --save-dev nps
|
185 | ```
|
186 |
|
187 | ### global installation
|
188 |
|
189 | You can install this module globally also (this is recommended):
|
190 |
|
191 | ```
|
192 | npm install --global nps
|
193 | ```
|
194 |
|
195 | From here you can use `nps` on the command line via one of the installed aliases: `nps` or `nps`.
|
196 |
|
197 | If you do this, you may also be interested in installing the shell autocompletion script. See more about this below.
|
198 |
|
199 | ## Getting started
|
200 |
|
201 | If 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 | ```
|
206 | or
|
207 | ```
|
208 | ./node_modules/.bin/nps init --type yml
|
209 | ```
|
210 |
|
211 | This will use your `package.json` `scripts` to generate a `package-scripts.js` (respectively a `package-scripts.yml`)
|
212 | file and update your `scripts` to utilize the `nps` binary.
|
213 |
|
214 | ## API
|
215 |
|
216 | ### CLI
|
217 |
|
218 | #### Commands
|
219 |
|
220 | ##### help
|
221 |
|
222 | If 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 |
|
229 | As indicated above, this will migrate your npm scripts to package-scripts.
|
230 |
|
231 | ##### completion
|
232 |
|
233 | ```console
|
234 | nps completion >> <your-bash-profile-file>
|
235 | ```
|
236 |
|
237 | Normally `<your-bash-profile-file>` will be `~/.bash_profile`, `~/.bashrc`, or `~/.zshrc`.
|
238 |
|
239 | Note: you should probably only do this if you have the package installed globally. In that case you should probably also
|
240 | normally use the `nps` alias rather than `nps` because it's easier to type.
|
241 |
|
242 | #### CLI options
|
243 |
|
244 | ##### -h, --help
|
245 |
|
246 | Will print out the help you see above (the available scripts are colored 🌈 and come from the config specified/default
|
247 | config).
|
248 |
|
249 | ##### -s, --silent
|
250 |
|
251 | By default, `nps` will log out to the console before running the command. You can add `-s` to your command to silence
|
252 | this.
|
253 |
|
254 | ##### --no-scripts
|
255 |
|
256 | By 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 |
|
260 | Use a different config
|
261 |
|
262 | ```
|
263 | nps -c ./other/package-scripts.js lint
|
264 | ```
|
265 |
|
266 | Normally, `nps` will look for a `package-scripts.js` file and load that to get the scripts. Generally you'll want to
|
267 | have this at the root of your project (next to the `package.json`). But by specifying `-c` or `--config`, `nps` will
|
268 | use that file instead.
|
269 |
|
270 |
|
271 | ##### -l, --log-level
|
272 |
|
273 | Specify the log level to use
|
274 |
|
275 | ##### -r, --require
|
276 |
|
277 | You can specify a module which will be loaded before the config file is loaded. This allows you to preload for example
|
278 | babel-register so you can use all babel presets you like.
|
279 |
|
280 | ##### scripts
|
281 |
|
282 | To run a script, you simply provide the name of the script like so:
|
283 |
|
284 | ```console
|
285 | nps cover
|
286 | ```
|
287 |
|
288 | And you can run multiple scripts in series by simply adding more space-separated arguments.
|
289 |
|
290 | ```console
|
291 | nps cover check-coverage
|
292 | ```
|
293 |
|
294 | And you can pass arguments to scripts by putting the scripts in quotes:
|
295 |
|
296 | ```console
|
297 | nps "test --cover" check-coverage
|
298 | ```
|
299 |
|
300 | That'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 |
|
311 | This can be an object or a function that returns an object. See the annotated example below for what this object can
|
312 | look like (and different ways to run them):
|
313 |
|
314 | ```javascript
|
315 | module.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
|
353 | nps k # runs nps kebab-case
|
354 | ```
|
355 |
|
356 | #### options
|
357 |
|
358 | This object is used to configure `nps` with the following options:
|
359 |
|
360 | ##### silent
|
361 |
|
362 | Setting this to `true` will prevent `nps` from outputting anything for your script (normally you'll get simple output
|
363 | indicating the command that's being executed). This effectively sets the `logLevel` to `disable`.
|
364 |
|
365 | ##### logLevel
|
366 |
|
367 | This sets the logLevel of `nps`.
|
368 |
|
369 | ## ENV variables
|
370 |
|
371 | ### LOG_LEVEL
|
372 |
|
373 | By setting `LOG_LEVEL` environment variable you can control the log level for `nps`
|
374 |
|
375 | ## Log level
|
376 |
|
377 | Log 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 |
|
387 | Have 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
|
392 | the `start`. [npm scripts][npm scripts] are generally run with `npm run <script-name>`. There are some exceptions to
|
393 | this. For example:
|
394 |
|
395 | 1. `npm run test` === `npm test` === `npm t`
|
396 | 2. `npm run start` === `npm start`
|
397 |
|
398 | So, while you could use a script called `script` and run `npm run script build`, I just think it reads more clearly to
|
399 | just use the `start` script and run `npm start build`. It's also nice that it's fewer things to type. You could also use
|
400 | the `test` script and then type even less: `npm t build`, but thats just... odd.
|
401 |
|
402 | Note, often servers are configured to run `npm start` by default to start the server. To allow for this case, you can
|
403 | provide a `default` script at the root of your scripts which will be run when `npm start` is run without any arguments.
|
404 | Effectively this will allow you to have a script run when `npm start` is executed.
|
405 |
|
406 | ## Inspiration
|
407 |
|
408 | This was inspired by [a tweet][tweet] by [@sindresorhus][sindre].
|
409 |
|
410 | ## Thanks
|
411 |
|
412 | Big thank you to [@tmpvar][tmpvar] for giving up the name `nps`! The original `nps` is now
|
413 | called [`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
|
423 | 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
|
424 | benefits 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 |
|
431 | This project _is_ p-s! It was just renamed during a major version bump. There were a few
|
432 | breaking changes for this to happen and those are documented on the [releases][releases]
|
433 | page.
|
434 |
|
435 | ## Contributors
|
436 |
|
437 | Thanks goes to these people ([emoji key][emojis]):
|
438 |
|
439 |
|
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 |
|
447 |
|
448 | This project follows the [all-contributors][all-contributors] specification.
|
449 | Contributions of any kind welcome!
|
450 |
|
451 | ## LICENSE
|
452 |
|
453 | MIT
|
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
|