├── .editorconfig ├── .gitignore ├── .travis.yml ├── .verb.md ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── appveyor.yml ├── example.js ├── index.js ├── package.json ├── recipes └── .gitkeep ├── test.js ├── utils.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.md] 11 | trim_trailing_whitespace = false 12 | insert_final_newline = false 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Always-ignore dirs # 2 | # #################### 3 | _gh_pages 4 | node_modules 5 | jspm_packages 6 | bower_components 7 | components 8 | vendor 9 | build 10 | dest 11 | src 12 | lib-cov 13 | coverage 14 | nbproject 15 | cache 16 | temp 17 | tmp 18 | koa-rest-router 19 | 20 | # Packages # 21 | # ########## 22 | *.7z 23 | *.dmg 24 | *.gz 25 | *.iso 26 | *.jar 27 | *.rar 28 | *.tar 29 | *.zip 30 | 31 | # OS, Logs and databases # 32 | # ######################### 33 | logs 34 | *.pid 35 | *.dat 36 | *.log 37 | *.sql 38 | *.sqlite 39 | *~ 40 | ~* 41 | 42 | # Another files # 43 | # ############### 44 | Icon? 45 | .DS_Store* 46 | Thumbs.db 47 | ehthumbs.db 48 | Desktop.ini 49 | npm-debug.log 50 | .directory 51 | ._* 52 | lcov.info 53 | 54 | # Runtime data 55 | pids 56 | *.pid 57 | *.seed 58 | *.pid.lock 59 | 60 | 61 | # nyc test coverage 62 | .nyc_output 63 | 64 | # Grunt intermediate storage 65 | # see here: http://gruntjs.com/creating-plugins#storing-task-files 66 | .grunt 67 | 68 | # Optional npm cache directory 69 | .npm 70 | 71 | # Optional REPL history 72 | .node_repl_history 73 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | 4 | node_js: 5 | - "node" 6 | - "6" 7 | - "4" 8 | 9 | notifications: 10 | email: false 11 | 12 | after_success: bash <(curl -s https://codecov.io/bash) 13 | -------------------------------------------------------------------------------- /.verb.md: -------------------------------------------------------------------------------- 1 | # {%= name %} {%= badge('npm') %} {%= badge('downloads') %} [![npm total downloads][downloads-img]][downloads-url] 2 | 3 | > {%= description %} 4 | 5 | [![codeclimate][codeclimate-img]][codeclimate-url] 6 | [![codestyle][standard-img]][standard-url] 7 | [![linux build][travis-img]][travis-url] 8 | [![windows build][appveyor-img]][appveyor-url] 9 | [![codecov][coverage-img]][coverage-url] 10 | [![dependency status][david-img]][david-url] 11 | 12 | _You might also be interested in [gibon][] - a minimal & functional 600 bytes client-side router._ 13 | 14 | ## Highlighs 15 | - **production:** ready for and used in 16 | - **composability:** grouping multiple resources and multiple routers 17 | - **flexibility:** overriding controller and request methods, plus custom prefixes 18 | - **compatibility:** accepts both old and modern middlewares without deprecation messages 19 | - **powerful:** multiple routers on same [koa][] app - even can combine multiple routers 20 | - **light:** not poluting your router instance and app - see `.loadMethods` 21 | - **backward compatible:** works on koa v1 - use `.legacyMiddleware` 22 | - **maintainability:** very small, beautiful, maintainable and commented codebase 23 | - **stability:** strict semantic versioning and very well documented, based on [koa-better-router][] 24 | - **open:** love PRs for features, issues and recipes - [Contribute a recipe?](#contributing-recipes) See the [recipes](https://github.com/tunnckoCore/koa-better-router/tree/master/recipes) of [koa-better-router][] 25 | 26 | ## Table of Contents 27 | 28 | 29 | **ProTip:** Checkout [koa-better-router API](https://github.com/tunnckoCore/koa-better-router#api) too to know what more methods comes with this. 30 | 31 | ## Quickstart 32 | > This router uses [koa-better-router][], so you should review its API documentation to get more info how the things are working and what more methods are exposed. 33 | 34 | ### Controller methods mapping 35 | > In addition this router allows you to override the controller methods which will be used in certain route path. 36 | 37 | **Defaults** 38 | 39 | | Request method | Route path | Controller method | 40 | | --- | --- | --- | 41 | | GET | `/users` | `index` | 42 | | GET | `/users/new ` | `new` | 43 | | POST | `/users` | `create` | 44 | | GET | `/users/:user` | `show` | 45 | | GET | `/users/:user/edit` | `edit` | 46 | | PUT | `/users/:user` | `update` | 47 | | DELETE | `/users/:user` | `remove` | 48 | 49 | **Example** 50 | 51 | ```js 52 | let Router = require('koa-rest-router') 53 | let router = Router() 54 | 55 | router.resource('users', { 56 | // GET /users 57 | index: (ctx, next) => {}, 58 | 59 | // GET /users/new 60 | new: (ctx, next) => {}, 61 | 62 | // POST /users 63 | create: (ctx, next) => {}, 64 | 65 | // GET /users/:user 66 | show: (ctx, next) => {}, 67 | 68 | // GET /users/:user/edit 69 | edit: (ctx, next) => {}, 70 | 71 | // PUT /users/:user 72 | update: (ctx, next) => {}, 73 | 74 | // DELETE /users/:user 75 | remove: (ctx, next) => {} 76 | }) 77 | 78 | let users = router.getResource('users') 79 | 80 | console.log(users.length) // => 7 81 | console.log(users) // => Array Route Objects 82 | 83 | console.log(router.routes.length) // => 7 84 | console.log(router.resources.length) // => 1 85 | ``` 86 | 87 | **Note:** Multiple middlewares can be passed on each. Also combining old and modern koa middlewares, so both generator functions and normal functions. 88 | 89 | 90 | ### Overriding controller methods 91 | > You easily can override the defaults by passing `options.map` object with key/value pairs where the key represents the original, and value is a string containing the wanted override. 92 | 93 | **Example** 94 | 95 | ```js 96 | let router = require('koa-rest-router')() 97 | 98 | let options = { 99 | map: { 100 | index: 'foo', 101 | new: 'bar', 102 | create: 'baz', 103 | show: 'qux', 104 | } 105 | } 106 | 107 | router.resource('users', { 108 | // GET /users 109 | foo: (ctx, next) => {}, 110 | 111 | // GET /users/new 112 | bar: (ctx, next) => {}, 113 | 114 | // POST /users 115 | baz: (ctx, next) => {}, 116 | 117 | // GET /users/:user 118 | qux: (ctx, next) => {}, 119 | 120 | // ... etc 121 | }, options) 122 | ``` 123 | 124 | ### Overriding request methods 125 | > In some cases in guides the REST routes uses different request methods and that field is not clear enough. So every sane router should allow overriding such things, so we do it. By default for updating is used `PUT`, for deleting/removing is `DELETE`. You can override this methods to use `POST` instead, so ... 126 | 127 | **Example** 128 | 129 | ```js 130 | let router = require('koa-rest-router')() 131 | 132 | let options = { 133 | methods: { 134 | put: 'POST' 135 | } 136 | } 137 | 138 | router.resource('cats', { 139 | // POST /cats/:cat 140 | update: (ctx, next) => {} 141 | }, options) 142 | ``` 143 | 144 | And you can combine both overriding variants, of course 145 | 146 | **Example** 147 | 148 | ```js 149 | let router = require('koa-rest-router')() 150 | 151 | let options = { 152 | methods: { 153 | put: 'POST' 154 | }, 155 | map: { 156 | update: 'foobar' 157 | } 158 | } 159 | 160 | router.resource('cats', { 161 | // POST /cats/:cat 162 | foobar: (ctx, next) => {} 163 | }, options) 164 | ``` 165 | 166 | ## Install 167 | > Install with [npm](https://www.npmjs.com/) 168 | 169 | ```sh 170 | $ npm i koa-rest-router --save 171 | ``` 172 | 173 | ## Usage 174 | > For more use-cases see the [tests](./test.js) 175 | 176 | ```js 177 | let router = require('koa-rest-router')() 178 | 179 | // or 180 | 181 | let Router = require('koa-rest-router') 182 | let apiRouter = Router({ prefix: '/api/v1' }) 183 | ``` 184 | 185 | ## API 186 | {%= apidocs('index.js') %} 187 | 188 | {% if (verb.related && verb.related.list && verb.related.list.length) { %} 189 | ## Related 190 | {%= related(verb.related.list, {words: 11}) %} 191 | {% } %} 192 | 193 | ## Contributing 194 | Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/{%= repository %}/issues/new). 195 | Please read the [contributing guidelines](CONTRIBUTING.md) for advice on opening issues, pull requests, and coding standards. 196 | If you need some help and can spent some cash, feel free to [contact me at CodeMentor.io](https://www.codementor.io/tunnckocore?utm_source=github&utm_medium=button&utm_term=tunnckocore&utm_campaign=github) too. 197 | 198 | **In short:** If you want to contribute to that project, please follow these things 199 | 200 | 1. Please DO NOT edit [README.md](README.md), [CHANGELOG.md](CHANGELOG.md) and [.verb.md](.verb.md) files. See ["Building docs"](#building-docs) section. 201 | 2. Ensure anything is okey by installing the dependencies and run the tests. See ["Running tests"](#running-tests) section. 202 | 3. Always use `npm run commit` to commit changes instead of `git commit`, because it is interactive and user-friendly. It uses [commitizen][] behind the scenes, which follows Conventional Changelog idealogy. 203 | 4. Do NOT bump the version in package.json. For that we use `npm run release`, which is [standard-version][] and follows Conventional Changelog idealogy. 204 | 205 | Thanks a lot! :) 206 | 207 | ### Contributing Recipes 208 | Recipes are just different use cases, written in form of README in human language. Showing some "Pro Tips" and tricks, answering common questions and so on. They look like [tests](./test.js), but in more readable and understandable way for humans - mostly for beginners that not reads or understand enough the README or API and tests. 209 | 210 | - They are in form of folders in the root [`recipes/`](./recipes) folder: for example `recipes/[short-meaningful-recipe-name]/`. 211 | - In recipe folder should exist `README.md` file 212 | - In recipe folder there may have actual js files, too. And should be working. 213 | - The examples from the recipe README.md should also exist as separate `.js` files. 214 | - Examples in recipe folder also should be working and actual. 215 | 216 | It would be great if you follow these steps when you want to _fix, update or create_ a recipes. :sunglasses: 217 | 218 | - Title for recipe idea should start with `[recipe]`: for example`[recipe] my awesome recipe` 219 | - Title for new recipe (PR) should also start with `[recipe]`. 220 | - Titles of Pull Requests or Issues for fixing/updating some existing recipes should start with `[recipe-fix]`. 221 | 222 | It will help a lot, thanks in advance! :yum: 223 | ## Building docs 224 | Documentation and that readme is generated using [verb-generate-readme][], which is a [verb][] generator, so you need to install both of them and then run `verb` command like that 225 | 226 | ``` 227 | $ npm install verbose/verb#dev verb-generate-readme --global && verb 228 | ``` 229 | 230 | _Please don't edit the README directly. Any changes to the readme must be made in [.verb.md](.verb.md)._ 231 | 232 | ## Running tests 233 | Clone repository and run the following in that cloned directory 234 | 235 | ``` 236 | $ npm install && npm test 237 | ``` 238 | 239 | ## Author 240 | {%= includeEither('authors', 'author') %} 241 | + [codementor/tunnckoCore](https://codementor.io/tunnckoCore) 242 | 243 | ## License 244 | {%= copyright({ start: 2016, linkify: true, prefix: 'Copyright', symbol: '©' }) %} {%= license %} 245 | 246 | *** 247 | 248 | {%= include('footer') %} 249 | _Project scaffolded using [charlike][] cli._ 250 | 251 | {%= reflinks(verb.reflinks) %} 252 | 253 | [downloads-url]: https://www.npmjs.com/package/{%= name %} 254 | [downloads-img]: https://img.shields.io/npm/dt/{%= name %}.svg 255 | 256 | [codeclimate-url]: https://codeclimate.com/github/{%= repository %} 257 | [codeclimate-img]: https://img.shields.io/codeclimate/github/{%= repository %}.svg 258 | 259 | [travis-url]: https://travis-ci.org/{%= repository %} 260 | [travis-img]: https://img.shields.io/travis/{%= repository %}/master.svg?label=linux 261 | 262 | [appveyor-url]: https://ci.appveyor.com/project/tunnckoCore/{%= name %} 263 | [appveyor-img]: https://img.shields.io/appveyor/ci/tunnckoCore/{%= name %}/master.svg?label=windows 264 | 265 | [coverage-url]: https://codecov.io/gh/{%= repository %} 266 | [coverage-img]: https://img.shields.io/codecov/c/github/{%= repository %}/master.svg 267 | 268 | [david-url]: https://david-dm.org/{%= repository %} 269 | [david-img]: https://img.shields.io/david/{%= repository %}.svg 270 | 271 | [standard-url]: https://github.com/feross/standard 272 | [standard-img]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | 6 | ## [1.0.1](https://github.com/tunnckocore/koa-rest-router/compare/v1.0.0...v1.0.1) (2017-02-14) 7 | 8 | 9 | ### Bug Fixes 10 | 11 | * **chore:** update verb readme template and contributing to latest ([3c61abb](https://github.com/tunnckocore/koa-rest-router/commit/3c61abb)) 12 | * **docs:** update createResource docs for body() ([87fb991](https://github.com/tunnckocore/koa-rest-router/commit/87fb991)) 13 | * **links:** switch links to the site in license banners ([c08ae1d](https://github.com/tunnckocore/koa-rest-router/commit/c08ae1d)) 14 | * **package:** force nyc to 100000% cov ([4f4f25e](https://github.com/tunnckocore/koa-rest-router/commit/4f4f25e)) 15 | * **package:** force update all fucking deps, modernize npm scripts ([a79b79f](https://github.com/tunnckocore/koa-rest-router/commit/a79b79f)) 16 | 17 | 18 | 19 | 20 | 21 | ## 1.0.0 - 2016-10-21 22 | 23 | **Say hello to the most powerful and composable router out there! :P** 24 | 25 | - First release, `standard-version` from now on 26 | - quickstart guide 27 | - update docs 28 | - bump to `koa-better-router@2` 29 | - add highlights 30 | - improve coverage 31 | - add table of contents 32 | - finish tests 33 | - update keywords 34 | - implementation 35 | 36 | ## 0.0.0 - 2016-10-12 37 | - Inital commit -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to koa-rest-router 2 | 3 | :sparkles: Thanks for your contribution in advance! :tada: 4 | 5 | First and foremost, thank you! We appreciate that you want to contribute to `koa-rest-router`, your time is valuable, and your contributions mean a lot to us. 6 | 7 | ## What does "contributing" mean? 8 | 9 | There are many ways to contribute to an open source project, including: 10 | 11 | - Updating or correcting documentation 12 | - Feature requests 13 | - Submitting bug reports 14 | 15 | But you aren't limited to these things. Use your imagination. If you like a project, and you see something that can or should be improved, then you have an opportunity (but not an obligation) to contribute. 16 | 17 | ### Improve documentation 18 | 19 | As a user of `koa-rest-router` you're the perfect candidate to help us improve our documentation. Typo corrections, error fixes, better explanations, more examples, etc. Open issues for things that could be improved. Anything. Even improvements to this document. 20 | 21 | Use the [`docs` label](https://github.com/tunnckoCore/koa-rest-router/labels/docs) to find suggestions for what we'd love to see more documentation on. 22 | 23 | ### Improve issues 24 | 25 | Some issues are created with missing information, not reproducible, or plain invalid. Help make them easier to resolve. Handling issues takes a lot of time that we could rather spend on fixing bugs and adding features. 26 | 27 | ### Give feedback on issues 28 | 29 | We're always looking for more opinions on discussions in the issue tracker. It's a good opportunity to influence the future direction of `koa-rest-router`. 30 | 31 | The [`question` label](https://github.com/tunnckoCore/koa-rest-router/labels/question%20%2F%20discussion) is a good place to find ongoing discussions. 32 | 33 | 34 | ## Why should I contribute? 35 | 36 | Regardless of the details, being an effective contributor means that you're adding _adding value_ to a project. 37 | 38 | Here are just a few of the advantages of adding value to a project: 39 | 40 | - you gain the appreciation and respect of the project's maintainers and community 41 | - you gain valuable experience 42 | - you get noticed by job recruiters 43 | - you become more attrative to potential employers. 44 | 45 | ## Getting familiarized with a project 46 | 47 | Before you attempt to contribute to a project, take a moment to get familiarized with it. In most cases you can learn all you need to know within a couple of minutes. 48 | 49 | ### Required 50 | 51 | The following items are a pre-requisite for contributing to any project. Avoid creating issues or doing pull requests until you've done all of these things: 52 | 53 | - **Review the readme**: Oftentimes a project readme has links to documentation, advice on creating issues or bug reports, and so on. 54 | - **Read contributing guidelines**: look for a `CONTRIBUTING.md` file and, if one exists, read it in its entirety before creating issues or doing a pull request. Typically this is in the root of the project, but it might be in `.github/CONTRIBUTING.md`. 55 | - **Search issues**: Before creating bug reports, feature requests, or submitting issues of any kind, you should always search for existing issues (closed or open) that address the same thing. 56 | 57 | ### Recommended 58 | 59 | - **Review unit tests** - one of the best ways to get familiarized with a project is through its unit tests. Of course, this depends on the type of project, complexity, test coverage, and so on. But when applicable, test are often a good source of insight. 60 | - **Get familiarized with the code** - If the codebase is small, and you're familiar with the language, take a moment to review the code to see if you find anything that can be improved. If the codebase is large, you might be able to provide domain expertise or fixes for specific areas. 61 | - **Ask questions** - Depending the project type and size, it might be good to start by searching google to find anwers to your questions. Then, check to see if the project uses [gitter](https://gitter.im) or has a [slack](https://slack.com) channel, or something similar. Also visit [stackoverflow](https://stackoverflow.com) and do a search to see if others have already asked the same question. As a last resort, create an issue on the project's GitHub repository. 62 | 63 | 64 | ## Details of Highly Effective Bug Reports 65 | 66 | ### Rationale 67 | 68 | The easier you make it for a maintainter or members of the community to react, the more likely it is for them to react quickly. 69 | 70 | Like you, maintainers have to make decisions about where to spend their time. Not only within a given project, but oftentimes across multiple projects. If you're experiencing a bug and you want to make a report, bug reports that are clearly described and organized are much more likely to get addressed by the maintainers or member of the community. 71 | 72 | Providing these details up front will make everyone happy. If you don't provide these details, maintainers will have to ask you for them, which can be annoying for experienced maintainers who have had to ask for these crucial details many times. 73 | 74 | ### The details 75 | 76 | Always include the following essential details in every bug report: 77 | 78 | 1. **version**: what version of `koa-rest-router` were you using when you experienced the bug? 79 | 2. **description**: clear description of the bug, and minimum steps to reproduce it. 80 | 3. **error messages**: paste any error messages into the issue or a [github gist](https://gist.github.com/), use [gfm code blocks][gfm]. 81 | 4. **code**: paste any code necessary for reproducing the bug and use [gfm code blocks][gfm] to wrap the code. 82 | 5. **title**: use a clear and descriptive title. 83 | 84 | See GitHub's guide to [Creating and highlighting code blocks][gfm] for more details. 85 | 86 | ## Submitting a pull requests 87 | 88 | **Working on your first Pull Request?** 89 | 90 | You can learn how from this *free* video series ["How to Contribute to an Open Source Project on GitHub"][howto-oss-github] 91 | 92 | **Details** 93 | 94 | - Non-trivial changes are often best discussed in an issue first, to prevent you from doing unnecessary work. 95 | - For ambitious tasks, you should try to get your work in front of the community for feedback as soon as possible. Open a pull request as soon as you have done the minimum needed to demonstrate your idea. At this early stage, don't worry about making things perfect, or 100% complete. Add a [WIP] prefix to the title, and describe what you still need to do. This lets reviewers know not to nit-pick small details or point out improvements you already know you need to make. 96 | - New features should be accompanied with tests and documentation. 97 | - Don't include unrelated changes. 98 | - Lint and test immediately after you fork by running `$ npm test`. 99 | - Lint and test before submitting the pull request by running `$ npm test`. 100 | - Make the pull request from a [topic branch](https://github.com/dchelimsky/rspec/wiki/Topic-Branches), not master. 101 | - Use a clear and descriptive title for the pull request and commits. 102 | - Write a convincing description of why we should land your pull request. It's your job to convince us. Answer "why" it's needed and provide use-cases. 103 | - You might be asked to do changes to your pull request. There's never a need to open another pull request. [Just update the existing one.][amending] 104 | 105 | ## Other ways to contribute 106 | 107 | ### Show your support 108 | 109 | Sometimes we find a project we like but just don't have time to contribute. That's okay, there are other ways to show support: 110 | 111 | - Star the project 112 | - Tweet about it 113 | - Tell your friends 114 | 115 | ### Show your appreciation 116 | 117 | Maintainers are people too. You can make someone's day by letting them know you appreciate their work. If you use a library in one of your own projects, let the author know you care: 118 | 119 | - Add a link to the project on your project's readme 120 | - Say "thanks" on twitter 121 | 122 | ## Attribution 123 | 124 | This document is adapted from a few Contributing Guides. It is more general and can apply in most cases. Everyone is free to re-use it or re-adapt it. 125 | 126 | ### Good to read 127 | 128 | - [Awesome Contributing][awesomelist] 129 | - [Idiomatic Contributing][idiomatic] 130 | - [AVA's Contributing Guide][avajs] 131 | - [Amending a commit Guide][amending] 132 | - [Creating and highlighting code blocks][gfm] 133 | - [Contributing to Open Source (GitHub)][os-on-github] 134 | - [How to contribute to Open Source Project (Egghead.io videos)][howto-oss-github] 135 | 136 | ### Authors 137 | 138 | **Charlike Mike Reagent** 139 | 140 | * [github/tunnckoCore](https://github.com/tunnckoCore) 141 | * [twitter/tunnckoCore](http://twitter.com/tunnckoCore) 142 | 143 | ## License 144 | 145 | Released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). 146 | Copyright © 2016, [Charlike Mike Reagent](http://www.tunnckocore.tk). 147 | 148 | [gfm]: https://help.github.com/articles/creating-and-highlighting-code-blocks/ 149 | [avajs]: https://github.com/avajs/ava/blob/master/contributing.md 150 | [idiomatic]: https://github.com/jonschlinkert/idiomatic-contributing 151 | [awesomelist]: https://github.com/jonschlinkert/awesome-contributing 152 | [amending]: https://github.com/RichardLitt/docs/blob/master/amending-a-commit-guide.md 153 | [os-on-github]: https://guides.github.com/activities/contributing-to-open-source/ 154 | [howto-oss-github]: http://j.mp/how-to-contrib-on-github -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Charlike Mike Reagent <@tunnckoCore> (https://i.am.charlike.online) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # koa-rest-router [![NPM version](https://img.shields.io/npm/v/koa-rest-router.svg?style=flat)](https://www.npmjs.com/package/koa-rest-router) [![NPM monthly downloads](https://img.shields.io/npm/dm/koa-rest-router.svg?style=flat)](https://npmjs.org/package/koa-rest-router) [![npm total downloads][downloads-img]][downloads-url] 2 | 3 | > Most powerful, flexible and composable router for building enterprise RESTful APIs easily! 4 | 5 | [![codeclimate][codeclimate-img]][codeclimate-url] 6 | [![codestyle][standard-img]][standard-url] 7 | [![linux build][travis-img]][travis-url] 8 | [![windows build][appveyor-img]][appveyor-url] 9 | [![codecov][coverage-img]][coverage-url] 10 | [![dependency status][david-img]][david-url] 11 | 12 | _You might also be interested in [gibon][] - a minimal & functional 600 bytes client-side router._ 13 | 14 | ## Highlighs 15 | - **production:** ready for and used in 16 | - **composability:** grouping multiple resources and multiple routers 17 | - **flexibility:** overriding controller and request methods, plus custom prefixes 18 | - **compatibility:** accepts both old and modern middlewares without deprecation messages 19 | - **powerful:** multiple routers on same [koa][] app - even can combine multiple routers 20 | - **light:** not poluting your router instance and app - see `.loadMethods` 21 | - **backward compatible:** works on koa v1 - use `.legacyMiddleware` 22 | - **maintainability:** very small, beautiful, maintainable and commented codebase 23 | - **stability:** strict semantic versioning and very well documented, based on [koa-better-router][] 24 | - **open:** love PRs for features, issues and recipes - [Contribute a recipe?](#contributing-recipes) See the [recipes](https://github.com/tunnckoCore/koa-better-router/tree/master/recipes) of [koa-better-router][] 25 | 26 | ## Table of Contents 27 | - [Quickstart](#quickstart) 28 | * [Controller methods mapping](#controller-methods-mapping) 29 | * [Overriding controller methods](#overriding-controller-methods) 30 | * [Overriding request methods](#overriding-request-methods) 31 | - [Install](#install) 32 | - [Usage](#usage) 33 | - [API](#api) 34 | * [KoaRestRouter](#koarestrouter) 35 | * [.createResource](#createresource) 36 | * [.addResource](#addresource) 37 | * [.getResource](#getresource) 38 | * [.resource](#resource) 39 | * [.addResources](#addresources) 40 | * [.getResources](#getresources) 41 | * [.groupResources](#groupresources) 42 | - [Related](#related) 43 | - [Contributing](#contributing) 44 | * [Contributing Recipes](#contributing-recipes) 45 | - [Building docs](#building-docs) 46 | - [Running tests](#running-tests) 47 | - [Author](#author) 48 | - [License](#license) 49 | 50 | _(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_ 51 | 52 | **ProTip:** Checkout [koa-better-router API](https://github.com/tunnckoCore/koa-better-router#api) too to know what more methods comes with this. 53 | 54 | ## Quickstart 55 | > This router uses [koa-better-router][], so you should review its API documentation to get more info how the things are working and what more methods are exposed. 56 | 57 | ### Controller methods mapping 58 | > In addition this router allows you to override the controller methods which will be used in certain route path. 59 | 60 | **Defaults** 61 | 62 | | Request method | Route path | Controller method | 63 | | --- | --- | --- | 64 | | GET | `/users` | `index` | 65 | | GET | `/users/new ` | `new` | 66 | | POST | `/users` | `create` | 67 | | GET | `/users/:user` | `show` | 68 | | GET | `/users/:user/edit` | `edit` | 69 | | PUT | `/users/:user` | `update` | 70 | | DELETE | `/users/:user` | `remove` | 71 | 72 | **Example** 73 | 74 | ```js 75 | let Router = require('koa-rest-router') 76 | let router = Router() 77 | 78 | router.resource('users', { 79 | // GET /users 80 | index: (ctx, next) => {}, 81 | 82 | // GET /users/new 83 | new: (ctx, next) => {}, 84 | 85 | // POST /users 86 | create: (ctx, next) => {}, 87 | 88 | // GET /users/:user 89 | show: (ctx, next) => {}, 90 | 91 | // GET /users/:user/edit 92 | edit: (ctx, next) => {}, 93 | 94 | // PUT /users/:user 95 | update: (ctx, next) => {}, 96 | 97 | // DELETE /users/:user 98 | remove: (ctx, next) => {} 99 | }) 100 | 101 | let users = router.getResource('users') 102 | 103 | console.log(users.length) // => 7 104 | console.log(users) // => Array Route Objects 105 | 106 | console.log(router.routes.length) // => 7 107 | console.log(router.resources.length) // => 1 108 | ``` 109 | 110 | **Note:** Multiple middlewares can be passed on each. Also combining old and modern koa middlewares, so both generator functions and normal functions. 111 | 112 | ### Overriding controller methods 113 | > You easily can override the defaults by passing `options.map` object with key/value pairs where the key represents the original, and value is a string containing the wanted override. 114 | 115 | **Example** 116 | 117 | ```js 118 | let router = require('koa-rest-router')() 119 | 120 | let options = { 121 | map: { 122 | index: 'foo', 123 | new: 'bar', 124 | create: 'baz', 125 | show: 'qux', 126 | } 127 | } 128 | 129 | router.resource('users', { 130 | // GET /users 131 | foo: (ctx, next) => {}, 132 | 133 | // GET /users/new 134 | bar: (ctx, next) => {}, 135 | 136 | // POST /users 137 | baz: (ctx, next) => {}, 138 | 139 | // GET /users/:user 140 | qux: (ctx, next) => {}, 141 | 142 | // ... etc 143 | }, options) 144 | ``` 145 | 146 | ### Overriding request methods 147 | > In some cases in guides the REST routes uses different request methods and that field is not clear enough. So every sane router should allow overriding such things, so we do it. By default for updating is used `PUT`, for deleting/removing is `DELETE`. You can override this methods to use `POST` instead, so ... 148 | 149 | **Example** 150 | 151 | ```js 152 | let router = require('koa-rest-router')() 153 | 154 | let options = { 155 | methods: { 156 | put: 'POST' 157 | } 158 | } 159 | 160 | router.resource('cats', { 161 | // POST /cats/:cat 162 | update: (ctx, next) => {} 163 | }, options) 164 | ``` 165 | 166 | And you can combine both overriding variants, of course 167 | 168 | **Example** 169 | 170 | ```js 171 | let router = require('koa-rest-router')() 172 | 173 | let options = { 174 | methods: { 175 | put: 'POST' 176 | }, 177 | map: { 178 | update: 'foobar' 179 | } 180 | } 181 | 182 | router.resource('cats', { 183 | // POST /cats/:cat 184 | foobar: (ctx, next) => {} 185 | }, options) 186 | ``` 187 | 188 | ## Install 189 | > Install with [npm](https://www.npmjs.com/) 190 | 191 | ```sh 192 | $ npm i koa-rest-router --save 193 | ``` 194 | 195 | ## Usage 196 | > For more use-cases see the [tests](./test.js) 197 | 198 | ```js 199 | let router = require('koa-rest-router')() 200 | 201 | // or 202 | 203 | let Router = require('koa-rest-router') 204 | let apiRouter = Router({ prefix: '/api/v1' }) 205 | ``` 206 | 207 | ## API 208 | 209 | ### [KoaRestRouter](index.js#L77) 210 | > Initialize `KoaRestRouter` with optional `options`, directly passed to [koa-better-router][] and this package inherits it. So you have all methods and functionality from the awesome [koa-better-router][] middleware. 211 | 212 | **Params** 213 | 214 | * `[options]` **{Object}**: passed directly to [koa-better-router][], in addition we have 2 more options here. 215 | * `[options.methods]` **{Object}**: override request methods to be used 216 | * `[options.map]` **{Object}**: override controller methods to be called 217 | 218 | **Example** 219 | 220 | ```js 221 | let Router = require('koa-rest-router') 222 | let api = Router({ prefix: '/api/v1' }) 223 | 224 | // - can have multiples middlewares 225 | // - can have both old and modern middlewares combined 226 | api.resource('companies', { 227 | index: function (ctx, next) {}, 228 | show: function (ctx, next) {}, 229 | create: function (ctx, next) {} 230 | // ... and etc 231 | }) 232 | 233 | console.log(api.routes.length) // 7 234 | console.log(api.resources.length) // 1 235 | 236 | api.resource('profiles', { 237 | index: function (ctx, next) {}, 238 | show: function (ctx, next) {}, 239 | create: function (ctx, next) {} 240 | // ... and etc 241 | }) 242 | 243 | console.log(api.routes.length) // 14 244 | console.log(api.resources.length) // 2 245 | 246 | let Koa = require('koa') // Koa v2 247 | let app = new Koa() 248 | 249 | let basic = Router() // prefix is `/` by default 250 | basic.extend(api) 251 | 252 | app.use(api.middleware()) 253 | app.use(basic.middleware()) 254 | 255 | app.listen(4444, () => { 256 | console.log('Open http://localhost:4444 and try') 257 | // will output 2x14 links 258 | // - 14 links on `/api/v1` prefix 259 | // - 14 links on `/` prefix 260 | api.routes.forEach((route) => { 261 | console.log(`${route.method} http://localhost:4444${route.path}`) 262 | }) 263 | basic.routes.forEach((route) => { 264 | console.log(`${route.method} http://localhost:4444${route.path}`) 265 | }) 266 | }) 267 | ``` 268 | 269 | ### [.createResource](index.js#L194) 270 | > Core method behind `.resource` for creating single resource with a `name`, but without adding it to `this.routes` array. You can override any defaults - default request methods and default controller methods, just by passing respectively `opts.methods` object and `opts.map` object. It uses [koa-better-router][]'s `.createRoute` under the hood. 271 | 272 | **Params** 273 | 274 | * `name` **{String|Object}**: name of the resource or `ctrl` 275 | * `ctrl` **{Object}**: controller object to be called on each endpoint, or `opts` 276 | * `opts` **{Object}**: optional, merged with options from constructor 277 | * `returns` **{KoaRestRouter}** `this`: instance for chaining 278 | 279 | **Example** 280 | 281 | ```js 282 | let router = require('koa-rest-router')({ 283 | prefix: '/api' 284 | }).loadMethods() 285 | 286 | // The server part 287 | let body = require('koa-better-body') 288 | let Koa = require('koa') 289 | let app = new Koa() 290 | 291 | // override request methods 292 | let methods = { 293 | put: 'POST' 294 | del: 'POST' 295 | } 296 | 297 | // override controller methods 298 | let map = { 299 | index: 'list', 300 | show: 'read', 301 | remove: 'destroy' 302 | } 303 | 304 | // notice the body should be invoked explicitly 305 | // with or without options object, no matter 306 | let updateMiddlewares = [body(), (ctx, next) => { 307 | ctx.body = `This method by default is triggered with PUT requests only.` 308 | ctx.body = `${ctx.body} But now it is from POST request.` 309 | return next() 310 | }, function * (next) => { 311 | this.body = `${this.body} Incoming data is` 312 | this.body = `${this.body} ${JSON.stringify(this.request.fields, null, 2)}` 313 | yield next 314 | }] 315 | 316 | // create actual resource 317 | let cats = router.createResource('cats', { 318 | list: [ 319 | (ctx, next) => { 320 | ctx.body = `This is GET ${ctx.route.path} route with multiple middlewares` 321 | return next() 322 | }, 323 | function * (next) { 324 | this.body = `${this.body} and combining old and modern middlewares.` 325 | yield next 326 | } 327 | ], 328 | read: (ctx, next) => { 329 | ctx.body = `This is ${ctx.route.path} route.` 330 | ctx.body = `${ctx.body} And param ":cat" is ${ctx.params.cat}.` 331 | ctx.body = `${ctx.body} By default this method is called "show".` 332 | return next() 333 | }, 334 | update: updateMiddlewares, 335 | destroy: (ctx, next) => { 336 | ctx.body = `This route should be called with DELETE request, by default.` 337 | ctx.body = `${ctx.body} But now it request is POST.` 338 | return next() 339 | } 340 | }, {map: map, methods: methods}) 341 | 342 | console.log(cats) 343 | // => array of "Route Objects" 344 | 345 | // router.routes array is empty 346 | console.log(router.getRoutes()) // => [] 347 | 348 | // register the resource 349 | router.addResource(cats) 350 | 351 | console.log(router.routes.length) // => 7 352 | console.log(router.getRoutes().length) // => 7 353 | console.log(router.getRoutes()) // or router.routes 354 | // => array of "Route Objects" 355 | 356 | app.use(router.middleware()) 357 | 358 | app.listen(5000, () => { 359 | console.log(`Server listening on http://localhost:5000`) 360 | console.log(`Try to open these routes:`) 361 | 362 | router.routes.forEach((route) => { 363 | console.log(`${route.method}` http://localhost:5000${route.path}`) 364 | })) 365 | }) 366 | ``` 367 | 368 | ### [.addResource](index.js#L253) 369 | > Simple method that is alias of `.addRoutes` and `.addResources`, but for adding single resource. It can accepts only one `resource` object. 370 | 371 | **Params** 372 | 373 | * `resource` **{Array}**: array of route objects, known as _"Resource Object"_ 374 | * `returns` **{KoaRestRouter}** `this`: instance for chaining 375 | 376 | **Example** 377 | 378 | ```js 379 | let Router = require('koa-rest-router') 380 | let api = new Router({ 381 | prefix: '/' 382 | }) 383 | 384 | console.log(api.resources.length) // 0 385 | console.log(api.routes.length) // 0 386 | 387 | api.addResource(api.createResource('dragons')) 388 | 389 | console.log(api.resources.length) // 1 390 | console.log(api.routes.length) // 7 391 | 392 | console.log(api.getResource('dragons')) 393 | // array of route objects 394 | // => [ 395 | // { prefix: '/', route: '/dragons', path: '/dragons', ... } 396 | // { prefix: '/', route: '/dragons/:dragon', path: '/dragons/:dragon', ... } 397 | // ... and 5 more routes 398 | // ] 399 | ``` 400 | 401 | ### [.getResource](index.js#L291) 402 | > Get single resource by `name`. Special case is resource to the `/` prefix. So pass `/` as `name`. See more on what are the _"Route Objects"_ in the [koa-better-router][] docs. What that method returns, I call _"Resource Object"_ - array of _"Route Objects"_ 403 | 404 | **Params** 405 | 406 | * `name` **{String}**: name of the resource, plural 407 | * `returns` **{Array|Null}**: if resource with `name` not found `null, otherwise array of route objects - that array is known as Resource Object 408 | 409 | **Example** 410 | 411 | ```js 412 | let api = require('koa-rest-router')({ 413 | prefix: '/api/v2' 414 | }) 415 | 416 | let frogs = api.createResource('frogs') 417 | let dragons = api.createResource('dragons') 418 | 419 | console.log(api.getResource('frogs')) 420 | // array of route objects 421 | // => [ 422 | // { prefix: '/api/v2', route: '/frogs', path: '/api/v2/frogs', ... } 423 | // { prefix: '/api/v2', route: '/frogs/:frog', path: '/api/v2/frogs/:frog', ... } 424 | // ... and 5 more routes 425 | // ] 426 | 427 | console.log(api.getResources().length) // 2 428 | ``` 429 | 430 | ### [.resource](index.js#L403) 431 | > Creates a resource using `.createResource` and adds the resource routes to the `this.routes` array, using `.addResource`. This is not an alias! It is combination of two methods. Methods that are not defined in given `ctrl` (controller) returns by default `501 Not Implemented`. You can override any defaults - default request methods and default controller methods, just by passing respectively `opts.methods` object and `opts.map` object. 432 | 433 | **Params** 434 | 435 | * `name` **{String|Object}**: name of the resource or `ctrl` 436 | * `ctrl` **{Object}**: controller object to be called on each endpoint, or `opts` 437 | * `opts` **{Object}**: optional, merged with options from constructor 438 | * `returns` **{KoaRestRouter}** `this`: instance for chaining 439 | 440 | **Example** 441 | 442 | ```js 443 | let Router = require('koa-rest-router') 444 | 445 | let api = new Router({ prefix: '/api/v3' }) 446 | let router = new Router() // on `/` prefix by default 447 | 448 | // All of the controller methods 449 | // can be remap-ed. using `opts.map` 450 | // try to pass `{ map: { index: 'home' } }` as options 451 | 452 | api.resource('users', { 453 | // GET /users 454 | index: [(ctx, next) => {}, (ctx, next) => {}], 455 | 456 | // GET /users/new 457 | new: (ctx, next) => {}, 458 | 459 | // POST /users 460 | create: (ctx, next) => {}, 461 | 462 | // GET /users/:user 463 | show: [(ctx, next) => {}, function * (next) {}], 464 | 465 | // GET /users/:user/edit 466 | edit: (ctx, next) => {}, 467 | 468 | // PUT /users/:user 469 | // that `PUT` can be changed `opts.methods.put: 'post'` 470 | update: (ctx, next) => {}, 471 | 472 | // DELETE /users/:user 473 | // that `DELETE` can be changed `opts.methods.delete: 'post'` 474 | remove: (ctx, next) => {} 475 | }) 476 | 477 | // notice the `foo` method 478 | router.resource({ 479 | // GET / 480 | foo: [ 481 | (ctx, next) => { 482 | ctx.body = `GET ${ctx.route.path}` 483 | return next() 484 | }, 485 | function * (next) { 486 | ctx.body = `${this.body}! Hello world!` 487 | yield next 488 | } 489 | ], 490 | // GET /:id, like /123 491 | show: (ctx, next) => { 492 | ctx.body = JSON.stringify(ctx.params, null, 2) 493 | return next() 494 | } 495 | }, { 496 | map: { 497 | index: 'foo' 498 | } 499 | }) 500 | 501 | api.routes.forEach(route => console.log(route.method, route.path)) 502 | router.routes.forEach(route => console.log(route.method, route.path)) 503 | 504 | // Wanna use only one router? 505 | let fooRouter = new Router() 506 | let Koa = require('koa') 507 | let app = new Koa() 508 | 509 | fooRouter.addRoutes(api.getResources(), router.getRoutes()) 510 | 511 | console.log(fooRouter.routes) 512 | console.log(fooRouter.routes.length) // 14 513 | 514 | app.use(fooRouter.middleware()) 515 | 516 | app.listen(4433, () => { 517 | console.log('Cool server started at 4433. Try these routes:') 518 | 519 | fooRouter.routes.forEach((route) => { 520 | console.log(`${route.method} http://localhost:4433${route.path}`) 521 | }) 522 | }) 523 | ``` 524 | 525 | ### [.addResources](index.js#L416) 526 | 527 | > Just an alias of [koa-better-router][]'s' `.addRoutes` method. 528 | 529 | **Params** 530 | 531 | * `...args` **{Array}**: any number of arguments (arrays of route objects) 532 | * `returns` **{KoaRestRouter}** `this`: instance for chaining 533 | 534 | ### [.getResources](index.js#L454) 535 | > As we have `.getRoutes` method for getting `this.routes`, so we have `.getResources` for getting `this.resources` array, too. Each `.createResource` returns array of route objects with length of 7, so 7 routes. So if you call `.createResource` two times the `this.resources` (what this method returns) will contain 2 arrays with 7 routes in each of them. 536 | 537 | * `returns` **{Array}**: array of arrays of route objects 538 | 539 | **Example** 540 | 541 | ```js 542 | let router = require('koa-rest-router')().loadMethods() 543 | 544 | console.log(router.routes.length) // 0 545 | console.log(router.getRoutes().length) // 0 546 | 547 | console.log(router.resources.length) // 0 548 | console.log(router.getResources().length) // 0 549 | 550 | router.get('/about', (ctx, next) => {}) 551 | router.resource('dogs') 552 | router.resource('cats') 553 | 554 | console.log(router.routes.length) // 15 555 | console.log(router.getRoutes().length) // 15 556 | 557 | console.log(router.resources.length) // 2 558 | console.log(router.getResources().length) // 2 559 | ``` 560 | 561 | ### [.groupResources](index.js#L521) 562 | > Powerful method for grouping couple of resources into one resource endpoint. For example you have `/cats` and `/dogs` endpoints, but you wanna create `/cats/:cat/dogs/:dog` endpoint, so you can do such things with that. You can group infinite number of resources. Useful methods that gives you what you should pass as arguments here are `.createResource`, `.createRoute`, `.getResources`, `.getResource` and `.getRoutes`. **Note:** Be aware of that it replaces middlewares of `dest` with the middlewares of last `src`. 563 | 564 | **Params** 565 | 566 | * `dest` **{Array}**: array of _"Route Objects"_ or _"Resource Object"_ (both are arrays) 567 | * `src1` **{Array}**: array of _"Route Objects"_ or _"Resource Object"_ (both are arrays) 568 | * `src2` **{Array}**: array of _"Route Objects"_ or _"Resource Object"_ (both are arrays) 569 | * `returns` **{Array}**: new array with grouped resources 570 | 571 | **Example** 572 | 573 | ```js 574 | let router = require('koa-rest-router')({ prefix: '/api/v3'}) 575 | 576 | let departments = router.createResource('departments') 577 | let companies = router.createResource('companies') 578 | let profiles = router.createResource('profiles') 579 | let clients = router.createResource('clients') 580 | let users = router.createResource('users') 581 | let cats = router.createResource('cats') 582 | let dogs = router.createResource('dogs') 583 | 584 | // endpoint: /companies/:company/departments/:department 585 | let one = router.groupResources(companies, departments) 586 | 587 | // endpoint: /profiles/:profile/clients/:client/cats/:cat 588 | let two = router.groupResources(profiles, clients, cats) 589 | 590 | // crazy? huh, AWESOME! 591 | // endpoint: /companies/:company/departments/:department/profiles/:profile/clients/:client/cats/:cat 592 | let foo = router.groupResources(one, two) 593 | 594 | // but actually just "register" `one` and `foo` 595 | // so you WON'T have `/profiles/:profile/clients/:client/cats/:cat` 596 | // endpoint in your API 597 | router.addRoutes(one, foo) 598 | 599 | // Server part 600 | let Koa = require('koa') 601 | let app = new Koa() 602 | 603 | app.use(router.middleware()) 604 | 605 | app.listen(4000, () => { 606 | console.log(`Mega API server on http://localhost:4000`) 607 | console.log(`Checkout these routes:`) 608 | 609 | // it will output 14 links 610 | router.getRoutes().forEach((route) => { 611 | console.log(`${route.method} http://localhost:4000${route.path}`) 612 | }) 613 | }) 614 | ``` 615 | 616 | ## Related 617 | - [koa-bel](https://www.npmjs.com/package/koa-bel): View engine for `koa` without any deps, built to be used… [more](https://github.com/tunnckocore/koa-bel#readme) | [homepage](https://github.com/tunnckocore/koa-bel#readme "View engine for `koa` without any deps, built to be used with `bel`. Any other engines that can be written in `.js` files would work, too.") 618 | - [koa-better-body](https://www.npmjs.com/package/koa-better-body): Full-featured [koa][] body parser! Support parsing text, buffer, json, json patch… [more](https://github.com/tunnckocore/koa-better-body#readme) | [homepage](https://github.com/tunnckocore/koa-better-body#readme "Full-featured [koa][] body parser! Support parsing text, buffer, json, json patch, json api, csp-report, multipart, form and urlencoded bodies. Works for koa@1, koa@2 and will work for koa@3.") 619 | - [koa-better-ratelimit](https://www.npmjs.com/package/koa-better-ratelimit): Better, smaller, faster - koa middleware for limit request by ip… [more](https://github.com/tunnckoCore/koa-better-ratelimit) | [homepage](https://github.com/tunnckoCore/koa-better-ratelimit "Better, smaller, faster - koa middleware for limit request by ip, store in-memory.") 620 | - [koa-better-router](https://www.npmjs.com/package/koa-better-router): Stable and lovely router for [koa][], using [path-match][]. Foundation for building… [more](https://github.com/tunnckocore/koa-better-router#readme) | [homepage](https://github.com/tunnckocore/koa-better-router#readme "Stable and lovely router for [koa][], using [path-match][]. Foundation for building powerful, flexible and RESTful APIs easily.") 621 | - [koa-better-serve](https://www.npmjs.com/package/koa-better-serve): Small, simple and correct serving of files, using [koa-send][] - nothing… [more](https://github.com/tunnckocore/koa-better-serve#readme) | [homepage](https://github.com/tunnckocore/koa-better-serve#readme "Small, simple and correct serving of files, using [koa-send][] - nothing more.") 622 | - [koa-ip-filter](https://www.npmjs.com/package/koa-ip-filter): Middleware for [koa][] that filters IPs against glob patterns, RegExp, string… [more](https://github.com/tunnckocore/koa-ip-filter#readme) | [homepage](https://github.com/tunnckocore/koa-ip-filter#readme "Middleware for [koa][] that filters IPs against glob patterns, RegExp, string or array of globs. Support custom `403 Forbidden` message and custom ID.") 623 | - [nanomatch](https://www.npmjs.com/package/nanomatch): Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and… [more](https://github.com/jonschlinkert/nanomatch) | [homepage](https://github.com/jonschlinkert/nanomatch "Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash 4.3 wildcard support only (no support for exglobs, posix brackets or braces)") 624 | 625 | ## Contributing 626 | Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/tunnckoCore/koa-rest-router/issues/new). 627 | Please read the [contributing guidelines](CONTRIBUTING.md) for advice on opening issues, pull requests, and coding standards. 628 | If you need some help and can spent some cash, feel free to [contact me at CodeMentor.io](https://www.codementor.io/tunnckocore?utm_source=github&utm_medium=button&utm_term=tunnckocore&utm_campaign=github) too. 629 | 630 | **In short:** If you want to contribute to that project, please follow these things 631 | 632 | 1. Please DO NOT edit [README.md](README.md), [CHANGELOG.md](CHANGELOG.md) and [.verb.md](.verb.md) files. See ["Building docs"](#building-docs) section. 633 | 2. Ensure anything is okey by installing the dependencies and run the tests. See ["Running tests"](#running-tests) section. 634 | 3. Always use `npm run commit` to commit changes instead of `git commit`, because it is interactive and user-friendly. It uses [commitizen][] behind the scenes, which follows Conventional Changelog idealogy. 635 | 4. Do NOT bump the version in package.json. For that we use `npm run release`, which is [standard-version][] and follows Conventional Changelog idealogy. 636 | 637 | Thanks a lot! :) 638 | 639 | ### Contributing Recipes 640 | Recipes are just different use cases, written in form of README in human language. Showing some "Pro Tips" and tricks, answering common questions and so on. They look like [tests](./test.js), but in more readable and understandable way for humans - mostly for beginners that not reads or understand enough the README or API and tests. 641 | 642 | - They are in form of folders in the root [`recipes/`](./recipes) folder: for example `recipes/[short-meaningful-recipe-name]/`. 643 | - In recipe folder should exist `README.md` file 644 | - In recipe folder there may have actual js files, too. And should be working. 645 | - The examples from the recipe README.md should also exist as separate `.js` files. 646 | - Examples in recipe folder also should be working and actual. 647 | 648 | It would be great if you follow these steps when you want to _fix, update or create_ a recipes. :sunglasses: 649 | 650 | - Title for recipe idea should start with `[recipe]`: for example`[recipe] my awesome recipe` 651 | - Title for new recipe (PR) should also start with `[recipe]`. 652 | - Titles of Pull Requests or Issues for fixing/updating some existing recipes should start with `[recipe-fix]`. 653 | 654 | It will help a lot, thanks in advance! :yum: 655 | ## Building docs 656 | Documentation and that readme is generated using [verb-generate-readme][], which is a [verb][] generator, so you need to install both of them and then run `verb` command like that 657 | 658 | ``` 659 | $ npm install verbose/verb#dev verb-generate-readme --global && verb 660 | ``` 661 | 662 | _Please don't edit the README directly. Any changes to the readme must be made in [.verb.md](.verb.md)._ 663 | 664 | ## Running tests 665 | Clone repository and run the following in that cloned directory 666 | 667 | ``` 668 | $ npm install && npm test 669 | ``` 670 | 671 | ## Author 672 | **Charlike Mike Reagent** 673 | 674 | + [github/tunnckoCore](https://github.com/tunnckoCore) 675 | + [twitter/tunnckoCore](https://twitter.com/tunnckoCore) 676 | + [codementor/tunnckoCore](https://codementor.io/tunnckoCore) 677 | 678 | ## License 679 | Copyright © 2016-2017, [Charlike Mike Reagent](https://i.am.charlike.online). Released under the [MIT license](LICENSE). 680 | 681 | *** 682 | 683 | _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.1, on February 14, 2017._ 684 | _Project scaffolded using [charlike][] cli._ 685 | 686 | [charlike]: https://github.com/tunnckocore/charlike 687 | [commitizen]: https://github.com/commitizen/cz-cli 688 | [koa-better-body]: https://github.com/tunnckocore/koa-better-body 689 | [koa-better-router]: https://github.com/tunnckocore/koa-better-router 690 | [koa-send]: https://github.com/koajs/send 691 | [koa]: https://github.com/koajs/koa 692 | [path-match]: https://github.com/pillarjs/path-match 693 | [recipe]: https://github.com/DamonOehlman/recipe 694 | [standard-version]: https://github.com/conventional-changelog/standard-version 695 | [verb-generate-readme]: https://github.com/verbose/verb-generate-readme 696 | [verb]: https://github.com/verbose/verb 697 | 698 | [downloads-url]: https://www.npmjs.com/package/koa-rest-router 699 | [downloads-img]: https://img.shields.io/npm/dt/koa-rest-router.svg 700 | 701 | [codeclimate-url]: https://codeclimate.com/github/tunnckoCore/koa-rest-router 702 | [codeclimate-img]: https://img.shields.io/codeclimate/github/tunnckoCore/koa-rest-router.svg 703 | 704 | [travis-url]: https://travis-ci.org/olstenlarck/koa-rest-router 705 | [travis-img]: https://img.shields.io/travis/olstenlarck/koa-rest-router/master.svg?label=linux 706 | 707 | [appveyor-url]: https://ci.appveyor.com/project/tunnckoCore/koa-rest-router 708 | [appveyor-img]: https://img.shields.io/appveyor/ci/tunnckoCore/koa-rest-router/master.svg?label=windows 709 | 710 | [coverage-url]: https://codecov.io/gh/olstenlarck/koa-rest-router 711 | [coverage-img]: https://img.shields.io/codecov/c/github/olstenlarck/koa-rest-router/master.svg 712 | 713 | [david-url]: https://david-dm.org/tunnckoCore/koa-rest-router 714 | [david-img]: https://img.shields.io/david/tunnckoCore/koa-rest-router.svg 715 | 716 | [standard-url]: https://github.com/feross/standard 717 | [standard-img]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg 718 | 719 | [gibon]: https://github.com/tunnckocore/gibon 720 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | environment: 2 | matrix: 3 | # node.js 4 | - nodejs_version: "7" 5 | - nodejs_version: "6" 6 | - nodejs_version: "4" 7 | 8 | # Install scripts. (runs after repo cloning) 9 | install: 10 | # Get the latest stable version of Node.js or io.js 11 | - ps: Install-Product node $env:nodejs_version 12 | # install modules 13 | - npm install 14 | 15 | # Post-install test scripts. 16 | test_script: 17 | # Output useful info for debugging. 18 | - node --version 19 | - npm --version 20 | # run tests 21 | - npm test 22 | 23 | # Don't actually build. 24 | build: off 25 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | let Koa = require('koa') 4 | let Router = require('./index') 5 | let app = new Koa() 6 | 7 | let apiRouter = new Router({ 8 | prefix: '/api/v1' 9 | }) 10 | 11 | let ctrl = { 12 | show: function * (next) { 13 | console.log('=') 14 | console.log(this.originUrl) 15 | console.log(this.origin) 16 | console.log(this.hostname) 17 | console.log(this.host) 18 | this.body = `path is ${this.route.path}, haha` 19 | this.body = `${this.body}!! :company is ${this.params.company}, yea` 20 | yield next 21 | } 22 | } 23 | 24 | let companies = apiRouter.createResource('companies', ctrl) 25 | let profiles = apiRouter.createResource('profiles', ctrl) 26 | let users = apiRouter.createResource('users', ctrl) 27 | let docs = apiRouter.createResource('docs', ctrl) 28 | let bars = apiRouter.createResource('bars', ctrl) 29 | let cats = apiRouter.createResource('cats', ctrl) 30 | 31 | let one = apiRouter.groupResources(companies, profiles) 32 | one.forEach((route) => console.log(route.route)) 33 | 34 | let two = apiRouter.groupResources(users, cats) 35 | two.forEach((route) => console.log(route.route)) 36 | 37 | let three = apiRouter.groupResources(one, two) 38 | three.forEach((route) => console.log(route.route)) 39 | 40 | console.log(apiRouter.routes.length) // 0 41 | 42 | apiRouter.addRoutes(three) 43 | console.log(apiRouter.routes.length) // 7 44 | 45 | apiRouter.addRoutes(docs, bars) 46 | console.log(apiRouter.routes.length) // 21 47 | 48 | let megalong = apiRouter.groupResources(docs, two, bars, three) 49 | console.log(megalong.length) // 7 50 | megalong.forEach((route) => console.log(route.route)) 51 | 52 | apiRouter.addRoutes(megalong) 53 | 54 | console.log(apiRouter.getResource('cats')) 55 | 56 | // listen for these routes 57 | app.use(apiRouter.middleware()) 58 | app.listen(4321, () => { 59 | let localhost = 'http://localhost:4321' 60 | console.log(`Open ${localhost} and try:`) 61 | apiRouter.routes.forEach((route) => { 62 | console.log(`${route.method} ${localhost + route.path}`) 63 | }) 64 | }) 65 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * koa-rest-router 3 | * 4 | * Copyright (c) Charlike Mike Reagent <@tunnckoCore> (https://i.am.charlike.online) 5 | * Released under the MIT license. 6 | */ 7 | 8 | 'use strict' 9 | 10 | let util = require('util') 11 | let utils = require('./utils') 12 | 13 | /** 14 | * > Initialize `KoaRestRouter` with optional `options`, 15 | * directly passed to [koa-better-router][] and this package 16 | * inherits it. So you have all methods and functionality from 17 | * the awesome [koa-better-router][] middleware. 18 | * 19 | * **Example** 20 | * 21 | * ```js 22 | * let Router = require('koa-rest-router') 23 | * let api = Router({ prefix: '/api/v1' }) 24 | * 25 | * // - can have multiples middlewares 26 | * // - can have both old and modern middlewares combined 27 | * api.resource('companies', { 28 | * index: function (ctx, next) {}, 29 | * show: function (ctx, next) {}, 30 | * create: function (ctx, next) {} 31 | * // ... and etc 32 | * }) 33 | * 34 | * console.log(api.routes.length) // 7 35 | * console.log(api.resources.length) // 1 36 | * 37 | * api.resource('profiles', { 38 | * index: function (ctx, next) {}, 39 | * show: function (ctx, next) {}, 40 | * create: function (ctx, next) {} 41 | * // ... and etc 42 | * }) 43 | * 44 | * console.log(api.routes.length) // 14 45 | * console.log(api.resources.length) // 2 46 | * 47 | * let Koa = require('koa') // Koa v2 48 | * let app = new Koa() 49 | * 50 | * let basic = Router() // prefix is `/` by default 51 | * basic.extend(api) 52 | * 53 | * app.use(api.middleware()) 54 | * app.use(basic.middleware()) 55 | * 56 | * app.listen(4444, () => { 57 | * console.log('Open http://localhost:4444 and try') 58 | * // will output 2x14 links 59 | * // - 14 links on `/api/v1` prefix 60 | * // - 14 links on `/` prefix 61 | * api.routes.forEach((route) => { 62 | * console.log(`${route.method} http://localhost:4444${route.path}`) 63 | * }) 64 | * basic.routes.forEach((route) => { 65 | * console.log(`${route.method} http://localhost:4444${route.path}`) 66 | * }) 67 | * }) 68 | * ``` 69 | * 70 | * @param {Object} `[options]` passed directly to [koa-better-router][], 71 | * in addition we have 2 more options here. 72 | * @param {Object} `[options.methods]` override request methods to be used 73 | * @param {Object} `[options.map]` override controller methods to be called 74 | * @api public 75 | */ 76 | 77 | function KoaRestRouter (options) { 78 | if (!(this instanceof KoaRestRouter)) { 79 | return new KoaRestRouter(options) 80 | } 81 | utils.Router.call(this, utils.mergeOptions({ 82 | methods: utils.defaultRequestMethods, 83 | map: utils.defaultControllerMap 84 | }, options)) 85 | this.resources = [] 86 | } 87 | 88 | util.inherits(KoaRestRouter, utils.Router) 89 | 90 | /** 91 | * > Core method behind `.resource` for creating single 92 | * resource with a `name`, but without adding it to `this.routes` array. 93 | * You can override any defaults - default request methods and 94 | * default controller methods, just by passing 95 | * respectively `opts.methods` object and `opts.map` object. 96 | * It uses [koa-better-router][]'s `.createRoute` under the hood. 97 | * 98 | * **Example** 99 | * 100 | * ```js 101 | * let router = require('koa-rest-router')({ 102 | * prefix: '/api' 103 | * }).loadMethods() 104 | * 105 | * // The server part 106 | * let body = require('koa-better-body') 107 | * let Koa = require('koa') 108 | * let app = new Koa() 109 | * 110 | * // override request methods 111 | * let methods = { 112 | * put: 'POST' 113 | * del: 'POST' 114 | * } 115 | * 116 | * // override controller methods 117 | * let map = { 118 | * index: 'list', 119 | * show: 'read', 120 | * remove: 'destroy' 121 | * } 122 | * 123 | * // notice the body should be invoked explicitly 124 | * // with or without options object, no matter 125 | * let updateMiddlewares = [body(), (ctx, next) => { 126 | * ctx.body = `This method by default is triggered with PUT requests only.` 127 | * ctx.body = `${ctx.body} But now it is from POST request.` 128 | * return next() 129 | * }, function * (next) => { 130 | * this.body = `${this.body} Incoming data is` 131 | * this.body = `${this.body} ${JSON.stringify(this.request.fields, null, 2)}` 132 | * yield next 133 | * }] 134 | * 135 | * // create actual resource 136 | * let cats = router.createResource('cats', { 137 | * list: [ 138 | * (ctx, next) => { 139 | * ctx.body = `This is GET ${ctx.route.path} route with multiple middlewares` 140 | * return next() 141 | * }, 142 | * function * (next) { 143 | * this.body = `${this.body} and combining old and modern middlewares.` 144 | * yield next 145 | * } 146 | * ], 147 | * read: (ctx, next) => { 148 | * ctx.body = `This is ${ctx.route.path} route.` 149 | * ctx.body = `${ctx.body} And param ":cat" is ${ctx.params.cat}.` 150 | * ctx.body = `${ctx.body} By default this method is called "show".` 151 | * return next() 152 | * }, 153 | * update: updateMiddlewares, 154 | * destroy: (ctx, next) => { 155 | * ctx.body = `This route should be called with DELETE request, by default.` 156 | * ctx.body = `${ctx.body} But now it request is POST.` 157 | * return next() 158 | * } 159 | * }, {map: map, methods: methods}) 160 | * 161 | * console.log(cats) 162 | * // => array of "Route Objects" 163 | * 164 | * // router.routes array is empty 165 | * console.log(router.getRoutes()) // => [] 166 | * 167 | * // register the resource 168 | * router.addResource(cats) 169 | * 170 | * console.log(router.routes.length) // => 7 171 | * console.log(router.getRoutes().length) // => 7 172 | * console.log(router.getRoutes()) // or router.routes 173 | * // => array of "Route Objects" 174 | * 175 | * app.use(router.middleware()) 176 | * 177 | * app.listen(5000, () => { 178 | * console.log(`Server listening on http://localhost:5000`) 179 | * console.log(`Try to open these routes:`) 180 | * 181 | * router.routes.forEach((route) => { 182 | * console.log(`${route.method}` http://localhost:5000${route.path}`) 183 | * })) 184 | * }) 185 | * ``` 186 | * 187 | * @param {String|Object} `name` name of the resource or `ctrl` 188 | * @param {Object} `ctrl` controller object to be called on each endpoint, or `opts` 189 | * @param {Object} `opts` optional, merged with options from constructor 190 | * @return {KoaRestRouter} `this` instance for chaining 191 | * @api public 192 | */ 193 | 194 | KoaRestRouter.prototype.createResource = function createResource (name, ctrl, opts) { 195 | if (typeof name === 'object') { 196 | opts = ctrl 197 | ctrl = name 198 | name = '/' 199 | } 200 | if (typeof name !== 'string') { 201 | name = '/' 202 | } 203 | 204 | let _name = name[0] === '/' ? name.slice(1) : name 205 | let route = name !== '/' ? utils.inflection.pluralize(_name) : '' 206 | let param = name !== '/' ? ':' + utils.inflection.singularize(_name) : ':id' 207 | let src = utils.createResourceRoutes(route, param, ctrl)(this, opts) 208 | 209 | // add them to cache 210 | src.name = route === '' ? '/' : route 211 | this.resources.push(src) 212 | 213 | // just return them without 214 | // adding them to `this.routes` 215 | return src 216 | } 217 | 218 | /** 219 | * > Simple method that is alias of `.addRoutes` and `.addResources`, 220 | * but for adding single resource. 221 | * It can accepts only one `resource` object. 222 | * 223 | * **Example** 224 | * 225 | * ```js 226 | * let Router = require('koa-rest-router') 227 | * let api = new Router({ 228 | * prefix: '/' 229 | * }) 230 | * 231 | * console.log(api.resources.length) // 0 232 | * console.log(api.routes.length) // 0 233 | * 234 | * api.addResource(api.createResource('dragons')) 235 | * 236 | * console.log(api.resources.length) // 1 237 | * console.log(api.routes.length) // 7 238 | * 239 | * console.log(api.getResource('dragons')) 240 | * // array of route objects 241 | * // => [ 242 | * // { prefix: '/', route: '/dragons', path: '/dragons', ... } 243 | * // { prefix: '/', route: '/dragons/:dragon', path: '/dragons/:dragon', ... } 244 | * // ... and 5 more routes 245 | * // ] 246 | * ``` 247 | * 248 | * @param {Array} `resource` array of route objects, known as _"Resource Object"_ 249 | * @return {KoaRestRouter} `this` instance for chaining 250 | * @api public 251 | */ 252 | 253 | KoaRestRouter.prototype.addResource = function addResource (resource) { 254 | return this.addRoutes(resource) 255 | } 256 | 257 | /** 258 | * > Get single resource by `name`. Special case is resource 259 | * to the `/` prefix. So pass `/` as `name`. See more on what 260 | * are the _"Route Objects"_ in the [koa-better-router][] docs. 261 | * What that method returns, I call _"Resource Object"_ - array 262 | * of _"Route Objects"_ 263 | * 264 | * **Example** 265 | * 266 | * ```js 267 | * let api = require('koa-rest-router')({ 268 | * prefix: '/api/v2' 269 | * }) 270 | * 271 | * let frogs = api.createResource('frogs') 272 | * let dragons = api.createResource('dragons') 273 | * 274 | * console.log(api.getResource('frogs')) 275 | * // array of route objects 276 | * // => [ 277 | * // { prefix: '/api/v2', route: '/frogs', path: '/api/v2/frogs', ... } 278 | * // { prefix: '/api/v2', route: '/frogs/:frog', path: '/api/v2/frogs/:frog', ... } 279 | * // ... and 5 more routes 280 | * // ] 281 | * 282 | * console.log(api.getResources().length) // 2 283 | * ``` 284 | * 285 | * @param {String} `name` name of the resource, plural 286 | * @return {Array|Null} if resource with `name` not found `null, otherwise 287 | * array of route objects - that array is known as Resource Object 288 | * @api public 289 | */ 290 | 291 | KoaRestRouter.prototype.getResource = function getResource (name) { 292 | let res = null 293 | for (let resource of this.resources) { 294 | if (resource.name === name) { 295 | res = resource 296 | break 297 | } 298 | } 299 | return res 300 | } 301 | 302 | /** 303 | * > Creates a resource using `.createResource` and adds 304 | * the resource routes to the `this.routes` array, using `.addResource`. 305 | * This is not an alias! It is combination of two methods. Methods 306 | * that are not defined in given `ctrl` (controller) returns 307 | * by default `501 Not Implemented`. You can override any 308 | * defaults - default request methods and default controller methods, 309 | * just by passing respectively `opts.methods` object and `opts.map` object. 310 | * 311 | * **Example** 312 | * 313 | * ```js 314 | * let Router = require('koa-rest-router') 315 | * 316 | * let api = new Router({ prefix: '/api/v3' }) 317 | * let router = new Router() // on `/` prefix by default 318 | * 319 | * // All of the controller methods 320 | * // can be remap-ed. using `opts.map` 321 | * // try to pass `{ map: { index: 'home' } }` as options 322 | * 323 | * api.resource('users', { 324 | * // GET /users 325 | * index: [(ctx, next) => {}, (ctx, next) => {}], 326 | * 327 | * // GET /users/new 328 | * new: (ctx, next) => {}, 329 | * 330 | * // POST /users 331 | * create: (ctx, next) => {}, 332 | * 333 | * // GET /users/:user 334 | * show: [(ctx, next) => {}, function * (next) {}], 335 | * 336 | * // GET /users/:user/edit 337 | * edit: (ctx, next) => {}, 338 | * 339 | * // PUT /users/:user 340 | * // that `PUT` can be changed `opts.methods.put: 'post'` 341 | * update: (ctx, next) => {}, 342 | * 343 | * // DELETE /users/:user 344 | * // that `DELETE` can be changed `opts.methods.delete: 'post'` 345 | * remove: (ctx, next) => {} 346 | * }) 347 | * 348 | * // notice the `foo` method 349 | * router.resource({ 350 | * // GET / 351 | * foo: [ 352 | * (ctx, next) => { 353 | * ctx.body = `GET ${ctx.route.path}` 354 | * return next() 355 | * }, 356 | * function * (next) { 357 | * ctx.body = `${this.body}! Hello world!` 358 | * yield next 359 | * } 360 | * ], 361 | * // GET /:id, like /123 362 | * show: (ctx, next) => { 363 | * ctx.body = JSON.stringify(ctx.params, null, 2) 364 | * return next() 365 | * } 366 | * }, { 367 | * map: { 368 | * index: 'foo' 369 | * } 370 | * }) 371 | * 372 | * api.routes.forEach(route => console.log(route.method, route.path)) 373 | * router.routes.forEach(route => console.log(route.method, route.path)) 374 | * 375 | * // Wanna use only one router? 376 | * let fooRouter = new Router() 377 | * let Koa = require('koa') 378 | * let app = new Koa() 379 | * 380 | * fooRouter.addRoutes(api.getResources(), router.getRoutes()) 381 | * 382 | * console.log(fooRouter.routes) 383 | * console.log(fooRouter.routes.length) // 14 384 | * 385 | * app.use(fooRouter.middleware()) 386 | * 387 | * app.listen(4433, () => { 388 | * console.log('Cool server started at 4433. Try these routes:') 389 | * 390 | * fooRouter.routes.forEach((route) => { 391 | * console.log(`${route.method} http://localhost:4433${route.path}`) 392 | * }) 393 | * }) 394 | * ``` 395 | * 396 | * @param {String|Object} `name` name of the resource or `ctrl` 397 | * @param {Object} `ctrl` controller object to be called on each endpoint, or `opts` 398 | * @param {Object} `opts` optional, merged with options from constructor 399 | * @return {KoaRestRouter} `this` instance for chaining 400 | * @api public 401 | */ 402 | 403 | KoaRestRouter.prototype.resource = function resource_ (name, ctrl, opts) { 404 | let resource = this.createResource.apply(this, arguments) 405 | return this.addResource(resource) 406 | } 407 | 408 | /** 409 | * > Just an alias of [koa-better-router][]'s' `.addRoutes` method. 410 | * 411 | * @param {Array} `...args` any number of arguments (arrays of route objects) 412 | * @return {KoaRestRouter} `this` instance for chaining 413 | * @api public 414 | */ 415 | 416 | KoaRestRouter.prototype.addResources = function addResources () { 417 | return this.addRoutes.apply(this, arguments) 418 | } 419 | 420 | /** 421 | * > As we have `.getRoutes` method for getting `this.routes`, 422 | * so we have `.getResources` for getting `this.resources` array, too. 423 | * Each `.createResource` returns array of route objects with length of 7, 424 | * so 7 routes. So if you call `.createResource` two times 425 | * the `this.resources` (what this method returns) will contain 2 arrays 426 | * with 7 routes in each of them. 427 | * 428 | * **Example** 429 | * 430 | * ```js 431 | * let router = require('koa-rest-router')().loadMethods() 432 | * 433 | * console.log(router.routes.length) // 0 434 | * console.log(router.getRoutes().length) // 0 435 | * 436 | * console.log(router.resources.length) // 0 437 | * console.log(router.getResources().length) // 0 438 | * 439 | * router.get('/about', (ctx, next) => {}) 440 | * router.resource('dogs') 441 | * router.resource('cats') 442 | * 443 | * console.log(router.routes.length) // 15 444 | * console.log(router.getRoutes().length) // 15 445 | * 446 | * console.log(router.resources.length) // 2 447 | * console.log(router.getResources().length) // 2 448 | * ``` 449 | * 450 | * @return {Array} array of arrays of route objects 451 | * @api public 452 | */ 453 | 454 | KoaRestRouter.prototype.getResources = function getResources () { 455 | return this.resources 456 | } 457 | 458 | /** 459 | * > Powerful method for grouping couple of resources into 460 | * one resource endpoint. For example you have `/cats` and `/dogs` 461 | * endpoints, but you wanna create `/cats/:cat/dogs/:dog` endpoint, 462 | * so you can do such things with that. You can group infinite 463 | * number of resources. Useful methods that gives you what you 464 | * should pass as arguments here are `.createResource`, `.createRoute`, 465 | * `.getResources`, `.getResource` and `.getRoutes`. 466 | * **Note:** Be aware of that it replaces middlewares of `dest` 467 | * with the middlewares of last `src`. 468 | * 469 | * **Example** 470 | * 471 | * ```js 472 | * let router = require('koa-rest-router')({ prefix: '/api/v3'}) 473 | * 474 | * let departments = router.createResource('departments') 475 | * let companies = router.createResource('companies') 476 | * let profiles = router.createResource('profiles') 477 | * let clients = router.createResource('clients') 478 | * let users = router.createResource('users') 479 | * let cats = router.createResource('cats') 480 | * let dogs = router.createResource('dogs') 481 | * 482 | * // endpoint: /companies/:company/departments/:department 483 | * let one = router.groupResources(companies, departments) 484 | * 485 | * // endpoint: /profiles/:profile/clients/:client/cats/:cat 486 | * let two = router.groupResources(profiles, clients, cats) 487 | * 488 | * // crazy? huh, AWESOME! 489 | * // endpoint: /companies/:company/departments/:department/profiles/:profile/clients/:client/cats/:cat 490 | * let foo = router.groupResources(one, two) 491 | * 492 | * // but actually just "register" `one` and `foo` 493 | * // so you WON'T have `/profiles/:profile/clients/:client/cats/:cat` 494 | * // endpoint in your API 495 | * router.addRoutes(one, foo) 496 | * 497 | * // Server part 498 | * let Koa = require('koa') 499 | * let app = new Koa() 500 | * 501 | * app.use(router.middleware()) 502 | * 503 | * app.listen(4000, () => { 504 | * console.log(`Mega API server on http://localhost:4000`) 505 | * console.log(`Checkout these routes:`) 506 | * 507 | * // it will output 14 links 508 | * router.getRoutes().forEach((route) => { 509 | * console.log(`${route.method} http://localhost:4000${route.path}`) 510 | * }) 511 | * }) 512 | * ``` 513 | * 514 | * @param {Array} `dest` array of _"Route Objects"_ or _"Resource Object"_ (both are arrays) 515 | * @param {Array} `src1` array of _"Route Objects"_ or _"Resource Object"_ (both are arrays) 516 | * @param {Array} `src2` array of _"Route Objects"_ or _"Resource Object"_ (both are arrays) 517 | * @return {Array} new array with grouped resources 518 | * @api public 519 | */ 520 | 521 | KoaRestRouter.prototype.groupResources = function groupResources (dest, src1, src2) { 522 | return dest.map((destRoute, index) => { 523 | let route = utils.updateRoute(this, destRoute) 524 | route = this.groupRoutes(route, src1[index]) 525 | 526 | /* istanbul ignore next */ 527 | return src2 && Array.isArray(src2) 528 | ? this.groupRoutes(utils.updateRoute(this, route), src2[index]) 529 | : route 530 | }) 531 | } 532 | 533 | /** 534 | * Expose `KoaRestRouter` constructor 535 | * 536 | * @type {Function} 537 | * @api private 538 | */ 539 | 540 | module.exports = KoaRestRouter 541 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "koa-rest-router", 3 | "version": "1.0.1", 4 | "description": "Most powerful, flexible and composable router for building enterprise RESTful APIs easily!", 5 | "repository": "tunnckoCore/koa-rest-router", 6 | "author": "Charlike Mike Reagent <@tunnckoCore> (https://i.am.charlike.online)", 7 | "precommit.silent": true, 8 | "main": "index.js", 9 | "license": "MIT", 10 | "scripts": { 11 | "lint": "standard --fix --verbose", 12 | "test": "npm-run-all -s test:*", 13 | "test:api": "nyc --reporter lcov node test.js", 14 | "test:report": "nyc report", 15 | "prerelease": "npm test", 16 | "release": "standard-version --sign --no-verify", 17 | "git": "npm-run-all -s git:*", 18 | "git:add": "git add --all", 19 | "git:cz": "git-cz", 20 | "commit": "npm-run-all -s test git" 21 | }, 22 | "dependencies": { 23 | "extend-shallow": "^2.0.1", 24 | "inflection": "^1.12.0", 25 | "koa-better-router": "^2.1.1", 26 | "lazy-cache": "^2.0.2", 27 | "methods": "^1.1.2" 28 | }, 29 | "devDependencies": { 30 | "commitizen": "^2.9.5", 31 | "coveralls": "^2.11.16", 32 | "cz-conventional-changelog": "^1.2.0", 33 | "koa": "^2.0.0-alpha.8", 34 | "mukla": "^0.4.8", 35 | "npm-run-all": "^4.0.1", 36 | "nyc": "^10.1.2", 37 | "pre-commit": "^1.2.2", 38 | "standard": "^8.6.0", 39 | "standard-version": "^4.0.0", 40 | "supertest": "^3.0.0" 41 | }, 42 | "files": [ 43 | "index.js", 44 | "utils.js" 45 | ], 46 | "keywords": [ 47 | "api", 48 | "apis", 49 | "compat", 50 | "compatibility", 51 | "compatible", 52 | "composability", 53 | "composable", 54 | "create", 55 | "easily", 56 | "easy", 57 | "enterprise", 58 | "express", 59 | "flexibility", 60 | "flexible", 61 | "framework", 62 | "js", 63 | "koa", 64 | "koajs", 65 | "light", 66 | "lightweight", 67 | "maintainable", 68 | "middleware", 69 | "modern", 70 | "mw", 71 | "old", 72 | "open", 73 | "plugin", 74 | "powerful", 75 | "prefix", 76 | "production", 77 | "ready", 78 | "resource", 79 | "resourceful", 80 | "rest", 81 | "restful", 82 | "router", 83 | "semantic", 84 | "semver", 85 | "stable" 86 | ], 87 | "config": { 88 | "commitizen": { 89 | "path": "./node_modules/cz-conventional-changelog" 90 | } 91 | }, 92 | "verb": { 93 | "run": true, 94 | "toc": { 95 | "render": true, 96 | "method": "preWrite", 97 | "maxdepth": 4 98 | }, 99 | "layout": "empty", 100 | "tasks": [ 101 | "readme" 102 | ], 103 | "related": { 104 | "list": [ 105 | "koa-better-ratelimit", 106 | "koa-better-body", 107 | "koa-better-serve", 108 | "koa-better-router", 109 | "koa-ip-filter", 110 | "koa-bel", 111 | "nanomatch" 112 | ] 113 | }, 114 | "lint": { 115 | "reflinks": true 116 | }, 117 | "reflinks": [ 118 | "koa", 119 | "koa-better-body", 120 | "koa-better-router", 121 | "koa-send", 122 | "path-match", 123 | "recipe", 124 | "short-meaningful-recipe-name", 125 | "charlike", 126 | "commitizen", 127 | "standard-version", 128 | "verb", 129 | "verb-generate-readme" 130 | ] 131 | }, 132 | "engines": { 133 | "node": ">=4", 134 | "npm": ">=2" 135 | }, 136 | "nyc": { 137 | "check-coverage": true, 138 | "statements": 100, 139 | "functions": 100, 140 | "branches": 100, 141 | "lines": 100 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /recipes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tunnckoCore/koa-rest-router/34a9fcd4c927e514175899de466ba21419e52068/recipes/.gitkeep -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * koa-rest-router 3 | * 4 | * Copyright (c) Charlike Mike Reagent <@tunnckoCore> (https://i.am.charlike.online) 5 | * Released under the MIT license. 6 | */ 7 | 8 | /* jshint asi:true */ 9 | 10 | 'use strict' 11 | 12 | const request = require('supertest') 13 | const test = require('mukla') 14 | const Koa = require('koa') 15 | const Router = require('./index') 16 | const router = Router() 17 | 18 | test('should expose constructor', function (done) { 19 | test.strictEqual(typeof Router, 'function') 20 | test.strictEqual(typeof Router(), 'object') 21 | test.strictEqual(typeof (new Router()), 'object') 22 | test.strictEqual(typeof router, 'object') 23 | done() 24 | }) 25 | 26 | test('should have `koa-better-router` methods', function (done) { 27 | test.strictEqual(typeof router.createRoute, 'function') 28 | test.strictEqual(typeof router.addRoute, 'function') 29 | test.strictEqual(typeof router.getRoute, 'function') 30 | test.strictEqual(typeof router.addRoutes, 'function') 31 | test.strictEqual(typeof router.getRoutes, 'function') 32 | test.strictEqual(typeof router.groupRoutes, 'function') 33 | test.strictEqual(typeof router.loadMethods, 'function') 34 | test.strictEqual(typeof router.middleware, 'function') 35 | test.strictEqual(typeof router.createResource, 'function') 36 | test.strictEqual(typeof router.addResource, 'function') 37 | test.strictEqual(typeof router.addResources, 'function') 38 | test.strictEqual(typeof router.getResource, 'function') 39 | test.strictEqual(typeof router.legacyMiddleware, 'function') 40 | done() 41 | }) 42 | 43 | test('should not have the HTTP verbs as methods if not `.loadMethods` called', function (done) { 44 | test.strictEqual(router.get, undefined) 45 | test.strictEqual(router.put, undefined) 46 | test.strictEqual(router.del, undefined) 47 | test.strictEqual(router.post, undefined) 48 | test.strictEqual(router.patch, undefined) 49 | test.strictEqual(router.delete, undefined) 50 | done() 51 | }) 52 | 53 | test('should have HTTP verbs as methods when `.loadMethods` is called', function (done) { 54 | let api = Router({ prefix: '/api' }) 55 | api.loadMethods() 56 | test.strictEqual(typeof api.put, 'function') 57 | test.strictEqual(typeof api.get, 'function') 58 | test.strictEqual(typeof api.post, 'function') 59 | test.strictEqual(typeof api.patch, 'function') 60 | done() 61 | }) 62 | 63 | test('should get single resource by plural name - `.getResource(name)`', function (done) { 64 | let r = (new Router()).resource('foobar') 65 | let resource = r.getResource('foobars') 66 | 67 | test.strictEqual(typeof resource, 'object') 68 | test.strictEqual(Array.isArray(resource), true) 69 | test.strictEqual(resource.length, 7) // 7 Route Objects 70 | test.deepStrictEqual(resource[1].route, '/foobars/new') 71 | done() 72 | }) 73 | 74 | test('should `.getResource` return null if not found', function (done) { 75 | let ro = Router().resource('foo') 76 | test.strictEqual(ro.getResources().length, 1) 77 | test.strictEqual(ro.getResource('bar'), null) 78 | done() 79 | }) 80 | 81 | test('should get all resources using `.getResources`', function (done) { 82 | let ruter = Router({ prefix: '/api' }) 83 | ruter.resource('dogs').createResource() 84 | 85 | let resources = ruter.getResources() 86 | test.strictEqual(Array.isArray(resources), true) 87 | test.strictEqual(resources.length, 2) 88 | test.strictEqual(resources[0].length, 7) 89 | test.strictEqual(resources[1].length, 7) 90 | test.strictEqual(resources[0][1].path, '/api/dogs/new') 91 | test.strictEqual(resources[0][1].route, '/dogs/new') 92 | test.strictEqual(resources[1][1].path, '/api/new') 93 | test.strictEqual(resources[1][1].route, '/new') 94 | test.strictEqual(ruter.resources[0][1].path, '/api/dogs/new') 95 | test.strictEqual(ruter.resources[1][1].path, '/api/new') 96 | done() 97 | }) 98 | 99 | test('should have `.route` method (path-match matcher) on instance', function (done) { 100 | test.strictEqual(typeof router.route, 'function') 101 | done() 102 | }) 103 | 104 | test('should have empty `.routes` array on initialization', function (done) { 105 | test.strictEqual(Array.isArray(router.routes), true) 106 | test.strictEqual(router.routes.length, 0) 107 | done() 108 | }) 109 | 110 | test('should have empty array `.resources` on init', function (done) { 111 | let r = new Router() 112 | let isArr = Array.isArray(r.resources) 113 | test.strictEqual(isArr, true) 114 | test.strictEqual(r.resources.length, 0) 115 | done() 116 | }) 117 | 118 | test('should `.addRoute` throw TypeError if `method` a string', function (done) { 119 | function fixture () { 120 | router.addRoute(123) 121 | } 122 | test.throws(fixture, TypeError) 123 | test.throws(fixture, /expect `method` to be a string/) 124 | done() 125 | }) 126 | 127 | test('should `.addRoute` throw TypeError route not a string, array or function', function (done) { 128 | function fixture () { 129 | router.addRoute('GET', 123) 130 | } 131 | test.throws(fixture, TypeError) 132 | test.throws(fixture, /expect `route` be string, array or function/) 133 | done() 134 | }) 135 | 136 | test('should create REST 7 routes and 1 resource using `.resource` method', function (done) { 137 | let routerSelf = Router().resource('users') 138 | test.strictEqual(routerSelf.resources.length, 1) 139 | test.strictEqual(routerSelf.routes.length, 7) 140 | routerSelf.resource('cats') 141 | test.strictEqual(routerSelf.resources.length, 2) 142 | test.strictEqual(routerSelf.routes.length, 14) 143 | done() 144 | }) 145 | 146 | test('should got `501 Not Implemented` if ctrl method not implemented', function (done) { 147 | const r = new Router() 148 | const serv = new Koa() 149 | 150 | r.resource('fool', { 151 | index: (ctx, next) => {} 152 | }) 153 | 154 | serv.use(r.middleware()) 155 | request(serv.callback()).get('/fools/new').expect(501, /Not Implemented/) 156 | .end(done) 157 | }) 158 | 159 | test('should group resources using `.groupResources`', function (done) { 160 | let server = new Koa() 161 | let apiRouter = new Router({ 162 | prefix: '/api' 163 | }) 164 | let companies = apiRouter.createResource('companies', { 165 | show: function * (next) { 166 | this.body = `companies: path is ${this.route.path}, haha` 167 | this.body = `${this.body}!! :company is ${this.params.company}, yea` 168 | yield next 169 | } 170 | }) 171 | let profiles = apiRouter.createResource('profiles', { 172 | show: function (ctx, next) { 173 | return next() 174 | } 175 | }) 176 | let cats = apiRouter.createResource('cats', { 177 | show: function (ctx, next) { 178 | ctx.body = `catsCtrl: path is ${ctx.route.path}, hoho` 179 | ctx.body = `${ctx.body} :company is ${ctx.params.company}` 180 | ctx.body = `${ctx.body} :profile is ${ctx.params.profile}` 181 | ctx.body = `${ctx.body} :cat is ${ctx.params.cat}` 182 | return next() 183 | } 184 | }) 185 | 186 | test.strictEqual(apiRouter.resources.length, 3) 187 | test.strictEqual(apiRouter.routes.length, 0) 188 | test.strictEqual(companies.length, 7) 189 | test.strictEqual(profiles.length, 7) 190 | test.strictEqual(cats.length, 7) 191 | 192 | let resource = apiRouter.groupResources(companies, profiles, cats) 193 | 194 | test.strictEqual(apiRouter.resources.length, 3) 195 | test.strictEqual(apiRouter.routes.length, 0) 196 | test.strictEqual(resource.length, 7) 197 | 198 | // method `.addResource` works too 199 | apiRouter.addResources(resource) 200 | 201 | test.strictEqual(apiRouter.resources.length, 3) 202 | test.strictEqual(apiRouter.routes.length, 7) 203 | 204 | server.use(apiRouter.middleware()) 205 | request(server.callback()) 206 | .get('/api/companies/foo') 207 | // we don't have `/api/companies` routes 208 | // we don't have `/api/comapnies/:company/profiles/:profile` routes 209 | // but we have `/companies/:company/profiles/:profile/cats` routes 210 | .expect(404, function (err) { 211 | test.ifError(err) 212 | 213 | request(server.callback()) 214 | .get('/api/companies/foo/profiles/bar') 215 | .expect(404).end(function () { 216 | request(server.callback()) 217 | .get('/api/companies/foo/profiles/bar/cats/qux') 218 | .expect(/:company is foo/) 219 | .expect(/:profile is bar/) 220 | .expect(/:cat is qux/) 221 | .expect(200, /catsCtrl: path is/) 222 | .end(done) 223 | }) 224 | }) 225 | }) 226 | 227 | test('should generate correct routes using `.groupResources` for a default prefix', function () { 228 | let apiRouter = new Router() 229 | let companies = apiRouter.createResource('companies') 230 | let profiles = apiRouter.createResource('profiles') 231 | 232 | let resource = apiRouter.groupResources(companies, profiles) 233 | 234 | test.strictEqual(resource[0].path, '/companies/:company/profiles') 235 | test.strictEqual(resource[1].path, '/companies/:company/profiles/new') 236 | test.strictEqual(resource[2].path, '/companies/:company/profiles') 237 | test.strictEqual(resource[3].path, '/companies/:company/profiles/:profile') 238 | test.strictEqual(resource[4].path, '/companies/:company/profiles/:profile/edit') 239 | test.strictEqual(resource[5].path, '/companies/:company/profiles/:profile') 240 | }) 241 | 242 | test('should generate correct routes using `.groupResources` for a custom prefix', function () { 243 | let apiRouter = new Router({ prefix: '/api' }) 244 | let companies = apiRouter.createResource('companies') 245 | let profiles = apiRouter.createResource('profiles') 246 | 247 | let resource = apiRouter.groupResources(companies, profiles) 248 | 249 | test.strictEqual(resource[0].path, '/api/companies/:company/profiles') 250 | test.strictEqual(resource[1].path, '/api/companies/:company/profiles/new') 251 | test.strictEqual(resource[2].path, '/api/companies/:company/profiles') 252 | test.strictEqual(resource[3].path, '/api/companies/:company/profiles/:profile') 253 | test.strictEqual(resource[4].path, '/api/companies/:company/profiles/:profile/edit') 254 | test.strictEqual(resource[5].path, '/api/companies/:company/profiles/:profile') 255 | }) 256 | 257 | test('should be able to re-map controller methods through opitons', function (done) { 258 | let options = { 259 | map: { 260 | edit: 'foo' 261 | } 262 | } 263 | let api = Router({ prefix: '/api' }) 264 | api.resource('companies', { 265 | foo: function (ctx, next) { 266 | ctx.body = `Hello world! Edit company ${ctx.params.company}.` 267 | ctx.body = `${ctx.body} Path: ${ctx.route.path}` 268 | return next() 269 | } 270 | }, options) 271 | let app = new Koa() 272 | 273 | app.use(api.middleware()) 274 | request(app.callback()).get('/api/companies/123/edit').expect(/Hello world!/) 275 | .expect(200, /Edit company 123/) 276 | .end(done) 277 | }) 278 | 279 | test('should be able to re-map request methods through options', function (done) { 280 | let options = { 281 | methods: { 282 | get: 'post' 283 | } 284 | } 285 | let kkk = new Koa() 286 | let api = new Router() 287 | api.resource({ 288 | new: function * (next) { 289 | this.body = `Normally this is called with GET request` 290 | this.body = `${this.body}, but now it is called with POST request` 291 | yield next 292 | } 293 | }, options) 294 | 295 | kkk.use(api.middleware()) 296 | request(kkk.callback()) 297 | .post('/new') 298 | .send({ foo: 'bar' }) 299 | .expect(/Normally this is called with GET request/) 300 | .expect(/but now it is called with POST request/) 301 | .expect(200, done) 302 | }) 303 | -------------------------------------------------------------------------------- /utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var utils = require('lazy-cache')(require) 4 | var fn = require 5 | require = utils // eslint-disable-line no-undef, no-native-reassign, no-global-assign 6 | 7 | /** 8 | * Lazily required module dependencies 9 | */ 10 | 11 | require('extend-shallow', 'extend') 12 | require('inflection') 13 | require('koa-better-router', 'Router') 14 | require('methods') 15 | require = fn // eslint-disable-line no-undef, no-native-reassign, no-global-assign 16 | 17 | utils.r = function r (name, id, edit) { 18 | name = name !== '' ? `/${name}` : '' 19 | let url = name + (id ? `/${id}` : '') + (edit ? `/${edit}` : '') 20 | return url 21 | } 22 | 23 | utils.updateRoute = function updateRoute (ctx, destRoute) { 24 | let route = destRoute.route.slice(1) 25 | /* istanbul ignore next */ 26 | if (!route.length) return '/:id' 27 | 28 | if (ctx.options.prefix !== '/') { 29 | route = route.replace(ctx.options.prefix, '') 30 | } 31 | 32 | let res = [] 33 | let singular = null 34 | let parts = route.split('/') 35 | 36 | var len = parts.length 37 | var i = -1 38 | 39 | while (i++ < len) { 40 | if (!(i % 2) && parts[i] && parts[i] !== 'edit') { 41 | let plur = parts[i] 42 | singular = utils.inflection.singularize(plur) 43 | res.push(plur) 44 | res.push(`:${singular}`) 45 | } 46 | } 47 | 48 | destRoute.route = `/${res.join('/')}` 49 | return destRoute 50 | } 51 | 52 | utils.notImplemented = function notImplemented () { 53 | return function notImplemented_ (ctx, next) { 54 | ctx.status = 501 55 | ctx.body = 'Not Implemented' 56 | return next() 57 | } 58 | } 59 | 60 | utils.defaultController = { 61 | new: utils.notImplemented(), 62 | show: utils.notImplemented(), 63 | edit: utils.notImplemented(), 64 | index: utils.notImplemented(), 65 | create: utils.notImplemented(), 66 | update: utils.notImplemented(), 67 | remove: utils.notImplemented() 68 | } 69 | 70 | utils.defaultControllerMap = { 71 | new: 'new', 72 | show: 'show', 73 | edit: 'edit', 74 | index: 'index', 75 | create: 'create', 76 | update: 'update', 77 | remove: 'remove' 78 | } 79 | 80 | utils.defaultRequestMethods = {} 81 | utils.methods.forEach((method) => { 82 | utils.defaultRequestMethods[method] = method 83 | }) 84 | 85 | utils.mergeOptions = function merge (opts, options) { 86 | options = utils.extend({}, options) 87 | let map = utils.extend(opts.map, options.map) 88 | let methods = utils.extend(opts.methods, options.methods) 89 | opts = utils.extend(opts, options) 90 | opts.map = map 91 | opts.methods = methods 92 | return opts 93 | } 94 | 95 | utils.createResourceRoutes = function createResourceRoutes (route, param, ctrl) { 96 | return function (self, opts) { 97 | self.options = utils.mergeOptions(self.options, opts) 98 | ctrl = utils.extend({}, utils.defaultController, ctrl) 99 | 100 | // map controller methods to be called 101 | let map = self.options.map 102 | 103 | // map request methods to be used 104 | let m = self.options.methods 105 | m.del = m.del || m.delete 106 | 107 | let src = [] 108 | 109 | /* eslint-disable no-multi-spaces */ 110 | let routes = [ 111 | [ m.get, utils.r(route), ctrl[map.index] ], 112 | [ m.get, utils.r(route, 'new'), ctrl[map.new] ], 113 | [ m.post, utils.r(route), ctrl[map.create] ], 114 | [ m.get, utils.r(route, param), ctrl[map.show] ], 115 | [ m.get, utils.r(route, param, 'edit'), ctrl[map.edit] ], 116 | [ m.put, utils.r(route, param), ctrl[map.update] ], 117 | [ m.del, utils.r(route, param), ctrl[map.remove] ] 118 | ] 119 | /* eslint-enable no-multi-spaces */ 120 | 121 | // create RESTful routes 122 | routes.forEach((args) => { 123 | src.push(self.createRoute(args[0], args[1], args[2])) 124 | }) 125 | 126 | /** 127 | * I'm tired of that fucking non-stop tricking 128 | * this fucking service - CodeClimate! 129 | * Below is more human-readable and human-understandable 130 | * variant of above shit. Thanks to god that there always 131 | * have more ways to write one thing. 132 | * 133 | * The whole thing is that you just use `koa-better-router`'s 134 | * `.createRoute` method which accepts METHOD, ROUTE and MIDDLEWARES. 135 | * In addition we allow re-mapping of request and controller methods. 136 | */ 137 | // src.push(self.createRoute(m.get, utils.r(route), ctrl[map.index])) 138 | // src.push(self.createRoute(m.get, utils.r(route, 'new'), ctrl[map.new])) 139 | // src.push(self.createRoute(m.post, utils.r(route), ctrl[map.create])) 140 | // src.push(self.createRoute(m.get, utils.r(route, param), ctrl[map.show])) 141 | // src.push(self.createRoute(m.get, utils.r(route, param, 'edit'), ctrl[map.edit])) 142 | // src.push(self.createRoute(m.put, utils.r(route, param), ctrl[map.update])) 143 | // src.push(self.createRoute(m.del, utils.r(route, param), ctrl[map.remove])) 144 | 145 | return src 146 | } 147 | } 148 | 149 | /** 150 | * Expose `utils` modules 151 | */ 152 | 153 | module.exports = utils 154 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | JSONStream@^1.0.4: 6 | version "1.3.0" 7 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.0.tgz#680ab9ac6572a8a1a207e0b38721db1c77b215e5" 8 | dependencies: 9 | jsonparse "^1.2.0" 10 | through ">=2.2.7 <3" 11 | 12 | accepts@^1.2.2: 13 | version "1.3.3" 14 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 15 | dependencies: 16 | mime-types "~2.1.11" 17 | negotiator "0.6.1" 18 | 19 | acorn-jsx@^3.0.0: 20 | version "3.0.1" 21 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 22 | dependencies: 23 | acorn "^3.0.4" 24 | 25 | acorn@4.0.4: 26 | version "4.0.4" 27 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" 28 | 29 | acorn@^3.0.4: 30 | version "3.3.0" 31 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 32 | 33 | ajv-keywords@^1.0.0: 34 | version "1.5.1" 35 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 36 | 37 | ajv@^4.7.0: 38 | version "4.11.3" 39 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.3.tgz#ce30bdb90d1254f762c75af915fb3a63e7183d22" 40 | dependencies: 41 | co "^4.6.0" 42 | json-stable-stringify "^1.0.1" 43 | 44 | align-text@^0.1.1, align-text@^0.1.3: 45 | version "0.1.4" 46 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 47 | dependencies: 48 | kind-of "^3.0.2" 49 | longest "^1.0.1" 50 | repeat-string "^1.5.2" 51 | 52 | always-done@^1.1.0: 53 | version "1.1.0" 54 | resolved "https://registry.yarnpkg.com/always-done/-/always-done-1.1.0.tgz#870577f506870d962adf4b5c7b9a5ca67e2591f7" 55 | dependencies: 56 | is-child-process "^1.0.2" 57 | is-node-stream "^1.0.0" 58 | is-promise "^2.1.0" 59 | is-typeof-error "^1.1.0" 60 | lazy-cache "^2.0.1" 61 | on-stream-end "^1.0.0" 62 | stream-exhaust "^1.0.1" 63 | try-catch-core "^2.0.2" 64 | 65 | amdefine@>=0.0.4: 66 | version "1.0.1" 67 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 68 | 69 | ansi-escapes@^1.1.0: 70 | version "1.4.0" 71 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 72 | 73 | ansi-regex@^2.0.0: 74 | version "2.1.1" 75 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 76 | 77 | ansi-styles@^2.2.1: 78 | version "2.2.1" 79 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 80 | 81 | any-promise@^1.1.0: 82 | version "1.3.0" 83 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 84 | 85 | append-transform@^0.4.0: 86 | version "0.4.0" 87 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" 88 | dependencies: 89 | default-require-extensions "^1.0.0" 90 | 91 | archy@^1.0.0: 92 | version "1.0.0" 93 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 94 | 95 | argparse@^1.0.7: 96 | version "1.0.9" 97 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 98 | dependencies: 99 | sprintf-js "~1.0.2" 100 | 101 | arr-diff@^2.0.0: 102 | version "2.0.0" 103 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 104 | dependencies: 105 | arr-flatten "^1.0.1" 106 | 107 | arr-flatten@^1.0.1: 108 | version "1.0.1" 109 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 110 | 111 | arr-includes@^2.0.0: 112 | version "2.0.2" 113 | resolved "https://registry.yarnpkg.com/arr-includes/-/arr-includes-2.0.2.tgz#a2fc0f9b6926c7476017fdc95def7b67954e7db8" 114 | dependencies: 115 | lazy-arrayify "^1.0.3" 116 | lazy-cache "^2.0.1" 117 | 118 | array-filter@~0.0.0: 119 | version "0.0.1" 120 | resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" 121 | 122 | array-find-index@^1.0.1: 123 | version "1.0.2" 124 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 125 | 126 | array-ify@^1.0.0: 127 | version "1.0.0" 128 | resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" 129 | 130 | array-map@~0.0.0: 131 | version "0.0.0" 132 | resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" 133 | 134 | array-reduce@~0.0.0: 135 | version "0.0.0" 136 | resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" 137 | 138 | array-union@^1.0.1: 139 | version "1.0.2" 140 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 141 | dependencies: 142 | array-uniq "^1.0.1" 143 | 144 | array-uniq@^1.0.1: 145 | version "1.0.3" 146 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 147 | 148 | array-unique@^0.2.1: 149 | version "0.2.1" 150 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 151 | 152 | arrify@^1.0.0, arrify@^1.0.1: 153 | version "1.0.1" 154 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 155 | 156 | asap@^2.0.0: 157 | version "2.0.5" 158 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" 159 | 160 | asn1@~0.2.3: 161 | version "0.2.3" 162 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 163 | 164 | assert-plus@^0.2.0: 165 | version "0.2.0" 166 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 167 | 168 | assert-plus@^1.0.0: 169 | version "1.0.0" 170 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 171 | 172 | async@^1.4.0, async@^1.4.2: 173 | version "1.5.2" 174 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 175 | 176 | async@~0.2.6: 177 | version "0.2.10" 178 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 179 | 180 | asynckit@^0.4.0: 181 | version "0.4.0" 182 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 183 | 184 | aws-sign2@~0.6.0: 185 | version "0.6.0" 186 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 187 | 188 | aws4@^1.2.1: 189 | version "1.6.0" 190 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 191 | 192 | babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: 193 | version "6.22.0" 194 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 195 | dependencies: 196 | chalk "^1.1.0" 197 | esutils "^2.0.2" 198 | js-tokens "^3.0.0" 199 | 200 | babel-generator@^6.18.0: 201 | version "6.23.0" 202 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5" 203 | dependencies: 204 | babel-messages "^6.23.0" 205 | babel-runtime "^6.22.0" 206 | babel-types "^6.23.0" 207 | detect-indent "^4.0.0" 208 | jsesc "^1.3.0" 209 | lodash "^4.2.0" 210 | source-map "^0.5.0" 211 | trim-right "^1.0.1" 212 | 213 | babel-messages@^6.23.0: 214 | version "6.23.0" 215 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 216 | dependencies: 217 | babel-runtime "^6.22.0" 218 | 219 | babel-runtime@^6.22.0: 220 | version "6.22.0" 221 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" 222 | dependencies: 223 | core-js "^2.4.0" 224 | regenerator-runtime "^0.10.0" 225 | 226 | babel-template@^6.16.0: 227 | version "6.23.0" 228 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" 229 | dependencies: 230 | babel-runtime "^6.22.0" 231 | babel-traverse "^6.23.0" 232 | babel-types "^6.23.0" 233 | babylon "^6.11.0" 234 | lodash "^4.2.0" 235 | 236 | babel-traverse@^6.18.0, babel-traverse@^6.23.0: 237 | version "6.23.1" 238 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" 239 | dependencies: 240 | babel-code-frame "^6.22.0" 241 | babel-messages "^6.23.0" 242 | babel-runtime "^6.22.0" 243 | babel-types "^6.23.0" 244 | babylon "^6.15.0" 245 | debug "^2.2.0" 246 | globals "^9.0.0" 247 | invariant "^2.2.0" 248 | lodash "^4.2.0" 249 | 250 | babel-types@^6.18.0, babel-types@^6.23.0: 251 | version "6.23.0" 252 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" 253 | dependencies: 254 | babel-runtime "^6.22.0" 255 | esutils "^2.0.2" 256 | lodash "^4.2.0" 257 | to-fast-properties "^1.0.1" 258 | 259 | babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: 260 | version "6.15.0" 261 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e" 262 | 263 | balanced-match@^0.4.1: 264 | version "0.4.2" 265 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 266 | 267 | bcrypt-pbkdf@^1.0.0: 268 | version "1.0.1" 269 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 270 | dependencies: 271 | tweetnacl "^0.14.3" 272 | 273 | boom@2.x.x: 274 | version "2.10.1" 275 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 276 | dependencies: 277 | hoek "2.x.x" 278 | 279 | brace-expansion@^1.0.0: 280 | version "1.1.6" 281 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 282 | dependencies: 283 | balanced-match "^0.4.1" 284 | concat-map "0.0.1" 285 | 286 | braces@^1.8.2: 287 | version "1.8.5" 288 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 289 | dependencies: 290 | expand-range "^1.8.1" 291 | preserve "^0.2.0" 292 | repeat-element "^1.1.2" 293 | 294 | buf-compare@^1.0.0: 295 | version "1.0.1" 296 | resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" 297 | 298 | buffer-shims@^1.0.0: 299 | version "1.0.0" 300 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 301 | 302 | builtin-modules@^1.0.0: 303 | version "1.1.1" 304 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 305 | 306 | cachedir@^1.1.0: 307 | version "1.1.1" 308 | resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-1.1.1.tgz#e1363075ea206a12767d92bb711c8a2f76a10f62" 309 | dependencies: 310 | os-homedir "^1.0.1" 311 | 312 | caching-transform@^1.0.0: 313 | version "1.0.1" 314 | resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" 315 | dependencies: 316 | md5-hex "^1.2.0" 317 | mkdirp "^0.5.1" 318 | write-file-atomic "^1.1.4" 319 | 320 | caller-path@^0.1.0: 321 | version "0.1.0" 322 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 323 | dependencies: 324 | callsites "^0.2.0" 325 | 326 | callsites@^0.2.0: 327 | version "0.2.0" 328 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 329 | 330 | camelcase-keys@^2.0.0: 331 | version "2.1.0" 332 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 333 | dependencies: 334 | camelcase "^2.0.0" 335 | map-obj "^1.0.0" 336 | 337 | camelcase@^1.0.2: 338 | version "1.2.1" 339 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 340 | 341 | camelcase@^2.0.0: 342 | version "2.1.1" 343 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 344 | 345 | camelcase@^3.0.0: 346 | version "3.0.0" 347 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 348 | 349 | caseless@~0.11.0: 350 | version "0.11.0" 351 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 352 | 353 | center-align@^0.1.1: 354 | version "0.1.3" 355 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 356 | dependencies: 357 | align-text "^0.1.3" 358 | lazy-cache "^1.0.3" 359 | 360 | chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 361 | version "1.1.3" 362 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 363 | dependencies: 364 | ansi-styles "^2.2.1" 365 | escape-string-regexp "^1.0.2" 366 | has-ansi "^2.0.0" 367 | strip-ansi "^3.0.0" 368 | supports-color "^2.0.0" 369 | 370 | circular-json@^0.3.1: 371 | version "0.3.1" 372 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 373 | 374 | clean-stacktrace@^1.0.0: 375 | version "1.0.0" 376 | resolved "https://registry.yarnpkg.com/clean-stacktrace/-/clean-stacktrace-1.0.0.tgz#90d55e770cfed49011eedebbf276e0356493b7e3" 377 | 378 | cli-cursor@^1.0.1: 379 | version "1.0.2" 380 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 381 | dependencies: 382 | restore-cursor "^1.0.1" 383 | 384 | cli-width@^2.0.0: 385 | version "2.1.0" 386 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 387 | 388 | cliui@^2.1.0: 389 | version "2.1.0" 390 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 391 | dependencies: 392 | center-align "^0.1.1" 393 | right-align "^0.1.1" 394 | wordwrap "0.0.2" 395 | 396 | cliui@^3.2.0: 397 | version "3.2.0" 398 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 399 | dependencies: 400 | string-width "^1.0.1" 401 | strip-ansi "^3.0.1" 402 | wrap-ansi "^2.0.0" 403 | 404 | co@^4.6.0: 405 | version "4.6.0" 406 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 407 | 408 | code-point-at@^1.0.0: 409 | version "1.1.0" 410 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 411 | 412 | combined-stream@^1.0.5, combined-stream@~1.0.5: 413 | version "1.0.5" 414 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 415 | dependencies: 416 | delayed-stream "~1.0.0" 417 | 418 | commander@^2.9.0: 419 | version "2.9.0" 420 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 421 | dependencies: 422 | graceful-readlink ">= 1.0.0" 423 | 424 | commitizen@^2.9.5: 425 | version "2.9.5" 426 | resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-2.9.5.tgz#f9605c8c1170eef86331676b5b5f12ab595bf498" 427 | dependencies: 428 | cachedir "^1.1.0" 429 | chalk "1.1.3" 430 | cz-conventional-changelog "1.2.0" 431 | dedent "0.6.0" 432 | detect-indent "4.0.0" 433 | find-node-modules "1.0.4" 434 | find-root "1.0.0" 435 | fs-extra "^1.0.0" 436 | glob "7.1.1" 437 | inquirer "1.2.3" 438 | lodash "4.17.2" 439 | minimist "1.2.0" 440 | path-exists "2.1.0" 441 | shelljs "0.7.5" 442 | strip-json-comments "2.0.1" 443 | 444 | common-callback-names@^1.0.2: 445 | version "1.0.2" 446 | resolved "https://registry.yarnpkg.com/common-callback-names/-/common-callback-names-1.0.2.tgz#d7464feeb7f39392541a6f039061caab02dd5988" 447 | 448 | commondir@^1.0.1: 449 | version "1.0.1" 450 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 451 | 452 | compare-func@^1.3.1: 453 | version "1.3.2" 454 | resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" 455 | dependencies: 456 | array-ify "^1.0.0" 457 | dot-prop "^3.0.0" 458 | 459 | component-emitter@^1.2.0: 460 | version "1.2.1" 461 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 462 | 463 | concat-map@0.0.1: 464 | version "0.0.1" 465 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 466 | 467 | concat-stream@^1.4.10, concat-stream@^1.4.6, concat-stream@^1.4.7: 468 | version "1.6.0" 469 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 470 | dependencies: 471 | inherits "^2.0.3" 472 | readable-stream "^2.2.2" 473 | typedarray "^0.0.6" 474 | 475 | content-disposition@~0.5.0: 476 | version "0.5.2" 477 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 478 | 479 | content-type@^1.0.0: 480 | version "1.0.2" 481 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" 482 | 483 | conventional-changelog-angular@^1.0.0: 484 | version "1.3.0" 485 | resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.0.tgz#3f64185978aa13ab0954c9e46a78969fd59c6801" 486 | dependencies: 487 | compare-func "^1.3.1" 488 | github-url-from-git "^1.4.0" 489 | q "^1.4.1" 490 | 491 | conventional-changelog-atom@^0.1.0: 492 | version "0.1.0" 493 | resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.0.tgz#67a47c66a42b2f8909ef1587c9989ae1de730b92" 494 | dependencies: 495 | q "^1.4.1" 496 | 497 | conventional-changelog-codemirror@^0.1.0: 498 | version "0.1.0" 499 | resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.1.0.tgz#7577a591dbf9b538e7a150a7ee62f65a2872b334" 500 | dependencies: 501 | q "^1.4.1" 502 | 503 | conventional-changelog-core@^1.3.0: 504 | version "1.5.0" 505 | resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.5.0.tgz#72b17509535a23d7c6cb70ad4384f74247748013" 506 | dependencies: 507 | conventional-changelog-writer "^1.1.0" 508 | conventional-commits-parser "^1.0.0" 509 | dateformat "^1.0.12" 510 | get-pkg-repo "^1.0.0" 511 | git-raw-commits "^1.1.0" 512 | git-remote-origin-url "^2.0.0" 513 | git-semver-tags "^1.1.0" 514 | lodash "^4.0.0" 515 | normalize-package-data "^2.3.5" 516 | q "^1.4.1" 517 | read-pkg "^1.1.0" 518 | read-pkg-up "^1.0.1" 519 | through2 "^2.0.0" 520 | 521 | conventional-changelog-ember@^0.2.0: 522 | version "0.2.2" 523 | resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.2.tgz#bad70a891386bc3046484a8f4f1e5aa2dc0ad208" 524 | dependencies: 525 | q "^1.4.1" 526 | 527 | conventional-changelog-eslint@^0.1.0: 528 | version "0.1.0" 529 | resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.1.0.tgz#a52411e999e0501ce500b856b0a643d0330907e2" 530 | dependencies: 531 | q "^1.4.1" 532 | 533 | conventional-changelog-express@^0.1.0: 534 | version "0.1.0" 535 | resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.1.0.tgz#55c6c841c811962036c037bdbd964a54ae310fce" 536 | dependencies: 537 | q "^1.4.1" 538 | 539 | conventional-changelog-jquery@^0.1.0: 540 | version "0.1.0" 541 | resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" 542 | dependencies: 543 | q "^1.4.1" 544 | 545 | conventional-changelog-jscs@^0.1.0: 546 | version "0.1.0" 547 | resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" 548 | dependencies: 549 | q "^1.4.1" 550 | 551 | conventional-changelog-jshint@^0.1.0: 552 | version "0.1.0" 553 | resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.1.0.tgz#00cab8e9a3317487abd94c4d84671342918d2a07" 554 | dependencies: 555 | compare-func "^1.3.1" 556 | q "^1.4.1" 557 | 558 | conventional-changelog-writer@^1.1.0: 559 | version "1.4.1" 560 | resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-1.4.1.tgz#3f4cb4d003ebb56989d30d345893b52a43639c8e" 561 | dependencies: 562 | compare-func "^1.3.1" 563 | conventional-commits-filter "^1.0.0" 564 | dateformat "^1.0.11" 565 | handlebars "^4.0.2" 566 | json-stringify-safe "^5.0.1" 567 | lodash "^4.0.0" 568 | meow "^3.3.0" 569 | semver "^5.0.1" 570 | split "^1.0.0" 571 | through2 "^2.0.0" 572 | 573 | conventional-changelog@^1.1.0: 574 | version "1.1.0" 575 | resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.0.tgz#8ae3fb59feb74bbee0a25833ee1f83dad4a07874" 576 | dependencies: 577 | conventional-changelog-angular "^1.0.0" 578 | conventional-changelog-atom "^0.1.0" 579 | conventional-changelog-codemirror "^0.1.0" 580 | conventional-changelog-core "^1.3.0" 581 | conventional-changelog-ember "^0.2.0" 582 | conventional-changelog-eslint "^0.1.0" 583 | conventional-changelog-express "^0.1.0" 584 | conventional-changelog-jquery "^0.1.0" 585 | conventional-changelog-jscs "^0.1.0" 586 | conventional-changelog-jshint "^0.1.0" 587 | 588 | conventional-commit-types@^2.0.0: 589 | version "2.1.0" 590 | resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.1.0.tgz#45d860386c9a2e6537ee91d8a1b61bd0411b3d04" 591 | 592 | conventional-commits-filter@^1.0.0: 593 | version "1.0.0" 594 | resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz#6fc2a659372bc3f2339cf9ffff7e1b0344b93039" 595 | dependencies: 596 | is-subset "^0.1.1" 597 | modify-values "^1.0.0" 598 | 599 | conventional-commits-parser@^1.0.0, conventional-commits-parser@^1.0.1: 600 | version "1.3.0" 601 | resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz#e327b53194e1a7ad5dc63479ee9099a52b024865" 602 | dependencies: 603 | JSONStream "^1.0.4" 604 | is-text-path "^1.0.0" 605 | lodash "^4.2.1" 606 | meow "^3.3.0" 607 | split2 "^2.0.0" 608 | through2 "^2.0.0" 609 | trim-off-newlines "^1.0.0" 610 | 611 | conventional-recommended-bump@^0.3.0: 612 | version "0.3.0" 613 | resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-0.3.0.tgz#e839de8f57cbb43445c8b4967401de0644c425d8" 614 | dependencies: 615 | concat-stream "^1.4.10" 616 | conventional-commits-filter "^1.0.0" 617 | conventional-commits-parser "^1.0.1" 618 | git-latest-semver-tag "^1.0.0" 619 | git-raw-commits "^1.0.0" 620 | meow "^3.3.0" 621 | object-assign "^4.0.1" 622 | 623 | convert-source-map@^1.3.0: 624 | version "1.4.0" 625 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.4.0.tgz#e3dad195bf61bfe13a7a3c73e9876ec14a0268f3" 626 | 627 | cookiejar@^2.0.6: 628 | version "2.1.0" 629 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.0.tgz#86549689539b6d0e269b6637a304be508194d898" 630 | 631 | cookies@~0.6.1: 632 | version "0.6.2" 633 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.6.2.tgz#6ac1b052895208e8fc4c4f5f86a9ed31b9cb5ccf" 634 | dependencies: 635 | depd "~1.1.0" 636 | keygrip "~1.0.1" 637 | 638 | core-assert@^0.2.1: 639 | version "0.2.1" 640 | resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f" 641 | dependencies: 642 | buf-compare "^1.0.0" 643 | is-error "^2.2.0" 644 | 645 | core-js@^2.4.0: 646 | version "2.4.1" 647 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 648 | 649 | core-util-is@~1.0.0: 650 | version "1.0.2" 651 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 652 | 653 | coveralls@^2.11.16: 654 | version "2.11.16" 655 | resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.11.16.tgz#da9061265142ddee954f68379122be97be8ab4b1" 656 | dependencies: 657 | js-yaml "3.6.1" 658 | lcov-parse "0.0.10" 659 | log-driver "1.2.5" 660 | minimist "1.2.0" 661 | request "2.79.0" 662 | 663 | cross-spawn@^4: 664 | version "4.0.2" 665 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" 666 | dependencies: 667 | lru-cache "^4.0.1" 668 | which "^1.2.9" 669 | 670 | cross-spawn@^5.0.1: 671 | version "5.0.1" 672 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.0.1.tgz#a3bbb302db2297cbea3c04edf36941f4613aa399" 673 | dependencies: 674 | lru-cache "^4.0.1" 675 | shebang-command "^1.2.0" 676 | which "^1.2.9" 677 | 678 | cryptiles@2.x.x: 679 | version "2.0.5" 680 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 681 | dependencies: 682 | boom "2.x.x" 683 | 684 | currently-unhandled@^0.4.1: 685 | version "0.4.1" 686 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 687 | dependencies: 688 | array-find-index "^1.0.1" 689 | 690 | cz-conventional-changelog@1.2.0, cz-conventional-changelog@^1.2.0: 691 | version "1.2.0" 692 | resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-1.2.0.tgz#2bca04964c8919b23f3fd6a89ef5e6008b31b3f8" 693 | dependencies: 694 | conventional-commit-types "^2.0.0" 695 | lodash.map "^4.5.1" 696 | longest "^1.0.1" 697 | pad-right "^0.2.2" 698 | right-pad "^1.0.1" 699 | word-wrap "^1.0.3" 700 | 701 | d@^0.1.1, d@~0.1.1: 702 | version "0.1.1" 703 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 704 | dependencies: 705 | es5-ext "~0.10.2" 706 | 707 | dargs@^4.0.1: 708 | version "4.1.0" 709 | resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" 710 | dependencies: 711 | number-is-nan "^1.0.0" 712 | 713 | dashdash@^1.12.0: 714 | version "1.14.1" 715 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 716 | dependencies: 717 | assert-plus "^1.0.0" 718 | 719 | dateformat@^1.0.11, dateformat@^1.0.12: 720 | version "1.0.12" 721 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 722 | dependencies: 723 | get-stdin "^4.0.1" 724 | meow "^3.3.0" 725 | 726 | debug-log@^1.0.0, debug-log@^1.0.1: 727 | version "1.0.1" 728 | resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" 729 | 730 | debug@*, debug@^2.1.1, debug@^2.2.0: 731 | version "2.6.1" 732 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" 733 | dependencies: 734 | ms "0.7.2" 735 | 736 | decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: 737 | version "1.2.0" 738 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 739 | 740 | dedent@0.6.0: 741 | version "0.6.0" 742 | resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb" 743 | 744 | deep-equal@~1.0.0: 745 | version "1.0.1" 746 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 747 | 748 | deep-is@~0.1.3: 749 | version "0.1.3" 750 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 751 | 752 | default-require-extensions@^1.0.0: 753 | version "1.0.0" 754 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" 755 | dependencies: 756 | strip-bom "^2.0.0" 757 | 758 | define-properties@^1.1.2: 759 | version "1.1.2" 760 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 761 | dependencies: 762 | foreach "^2.0.5" 763 | object-keys "^1.0.8" 764 | 765 | deglob@^2.0.0: 766 | version "2.1.0" 767 | resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" 768 | dependencies: 769 | find-root "^1.0.0" 770 | glob "^7.0.5" 771 | ignore "^3.0.9" 772 | pkg-config "^1.1.0" 773 | run-parallel "^1.1.2" 774 | uniq "^1.0.1" 775 | 776 | del@^2.0.2: 777 | version "2.2.2" 778 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 779 | dependencies: 780 | globby "^5.0.0" 781 | is-path-cwd "^1.0.0" 782 | is-path-in-cwd "^1.0.0" 783 | object-assign "^4.0.1" 784 | pify "^2.0.0" 785 | pinkie-promise "^2.0.0" 786 | rimraf "^2.2.8" 787 | 788 | delayed-stream@~1.0.0: 789 | version "1.0.0" 790 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 791 | 792 | delegates@^1.0.0: 793 | version "1.0.0" 794 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 795 | 796 | depd@^1.1.0, depd@~1.1.0: 797 | version "1.1.0" 798 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" 799 | 800 | destroy@^1.0.3: 801 | version "1.0.4" 802 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 803 | 804 | detect-file@^0.1.0: 805 | version "0.1.0" 806 | resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" 807 | dependencies: 808 | fs-exists-sync "^0.1.0" 809 | 810 | detect-indent@4.0.0, detect-indent@^4.0.0: 811 | version "4.0.0" 812 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 813 | dependencies: 814 | repeating "^2.0.0" 815 | 816 | dezalgo@^1.0.3: 817 | version "1.0.3" 818 | resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" 819 | dependencies: 820 | asap "^2.0.0" 821 | wrappy "1" 822 | 823 | doctrine@^1.2.2: 824 | version "1.5.0" 825 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 826 | dependencies: 827 | esutils "^2.0.2" 828 | isarray "^1.0.0" 829 | 830 | dot-prop@^3.0.0: 831 | version "3.0.0" 832 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" 833 | dependencies: 834 | is-obj "^1.0.0" 835 | 836 | duplexer@~0.1.1: 837 | version "0.1.1" 838 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 839 | 840 | ecc-jsbn@~0.1.1: 841 | version "0.1.1" 842 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 843 | dependencies: 844 | jsbn "~0.1.0" 845 | 846 | ee-first@1.1.1: 847 | version "1.1.1" 848 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 849 | 850 | error-ex@^1.2.0: 851 | version "1.3.0" 852 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" 853 | dependencies: 854 | is-arrayish "^0.2.1" 855 | 856 | error-inject@~1.0.0: 857 | version "1.0.0" 858 | resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 859 | 860 | error-symbol@^0.1.0: 861 | version "0.1.0" 862 | resolved "https://registry.yarnpkg.com/error-symbol/-/error-symbol-0.1.0.tgz#0a4dae37d600d15a29ba453d8ef920f1844333f6" 863 | 864 | es-abstract@^1.4.3: 865 | version "1.7.0" 866 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" 867 | dependencies: 868 | es-to-primitive "^1.1.1" 869 | function-bind "^1.1.0" 870 | is-callable "^1.1.3" 871 | is-regex "^1.0.3" 872 | 873 | es-to-primitive@^1.1.1: 874 | version "1.1.1" 875 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 876 | dependencies: 877 | is-callable "^1.1.1" 878 | is-date-object "^1.0.1" 879 | is-symbol "^1.0.1" 880 | 881 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 882 | version "0.10.12" 883 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 884 | dependencies: 885 | es6-iterator "2" 886 | es6-symbol "~3.1" 887 | 888 | es6-iterator@2: 889 | version "2.0.0" 890 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 891 | dependencies: 892 | d "^0.1.1" 893 | es5-ext "^0.10.7" 894 | es6-symbol "3" 895 | 896 | es6-map@^0.1.3: 897 | version "0.1.4" 898 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 899 | dependencies: 900 | d "~0.1.1" 901 | es5-ext "~0.10.11" 902 | es6-iterator "2" 903 | es6-set "~0.1.3" 904 | es6-symbol "~3.1.0" 905 | event-emitter "~0.3.4" 906 | 907 | es6-set@~0.1.3: 908 | version "0.1.4" 909 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 910 | dependencies: 911 | d "~0.1.1" 912 | es5-ext "~0.10.11" 913 | es6-iterator "2" 914 | es6-symbol "3" 915 | event-emitter "~0.3.4" 916 | 917 | es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: 918 | version "3.1.0" 919 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 920 | dependencies: 921 | d "~0.1.1" 922 | es5-ext "~0.10.11" 923 | 924 | es6-weak-map@^2.0.1: 925 | version "2.0.1" 926 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 927 | dependencies: 928 | d "^0.1.1" 929 | es5-ext "^0.10.8" 930 | es6-iterator "2" 931 | es6-symbol "3" 932 | 933 | escape-html@~1.0.1: 934 | version "1.0.3" 935 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 936 | 937 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 938 | version "1.0.5" 939 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 940 | 941 | escope@^3.6.0: 942 | version "3.6.0" 943 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 944 | dependencies: 945 | es6-map "^0.1.3" 946 | es6-weak-map "^2.0.1" 947 | esrecurse "^4.1.0" 948 | estraverse "^4.1.1" 949 | 950 | eslint-config-standard-jsx@3.2.0: 951 | version "3.2.0" 952 | resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz#c240e26ed919a11a42aa4de8059472b38268d620" 953 | 954 | eslint-config-standard@6.2.1: 955 | version "6.2.1" 956 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz#d3a68aafc7191639e7ee441e7348739026354292" 957 | 958 | eslint-plugin-promise@~3.4.0: 959 | version "3.4.1" 960 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.4.1.tgz#6911a9010bf84e17d82e19e0ab0f80ab3ad6db4c" 961 | 962 | eslint-plugin-react@~6.7.1: 963 | version "6.7.1" 964 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz#1af96aea545856825157d97c1b50d5a8fb64a5a7" 965 | dependencies: 966 | doctrine "^1.2.2" 967 | jsx-ast-utils "^1.3.3" 968 | 969 | eslint-plugin-standard@~2.0.1: 970 | version "2.0.1" 971 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz#3589699ff9c917f2c25f76a916687f641c369ff3" 972 | 973 | eslint@~3.10.2: 974 | version "3.10.2" 975 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.10.2.tgz#c9a10e8bf6e9d65651204778c503341f1eac3ce7" 976 | dependencies: 977 | babel-code-frame "^6.16.0" 978 | chalk "^1.1.3" 979 | concat-stream "^1.4.6" 980 | debug "^2.1.1" 981 | doctrine "^1.2.2" 982 | escope "^3.6.0" 983 | espree "^3.3.1" 984 | estraverse "^4.2.0" 985 | esutils "^2.0.2" 986 | file-entry-cache "^2.0.0" 987 | glob "^7.0.3" 988 | globals "^9.2.0" 989 | ignore "^3.2.0" 990 | imurmurhash "^0.1.4" 991 | inquirer "^0.12.0" 992 | is-my-json-valid "^2.10.0" 993 | is-resolvable "^1.0.0" 994 | js-yaml "^3.5.1" 995 | json-stable-stringify "^1.0.0" 996 | levn "^0.3.0" 997 | lodash "^4.0.0" 998 | mkdirp "^0.5.0" 999 | natural-compare "^1.4.0" 1000 | optionator "^0.8.2" 1001 | path-is-inside "^1.0.1" 1002 | pluralize "^1.2.1" 1003 | progress "^1.1.8" 1004 | require-uncached "^1.0.2" 1005 | shelljs "^0.7.5" 1006 | strip-bom "^3.0.0" 1007 | strip-json-comments "~1.0.1" 1008 | table "^3.7.8" 1009 | text-table "~0.2.0" 1010 | user-home "^2.0.0" 1011 | 1012 | espree@^3.3.1: 1013 | version "3.4.0" 1014 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d" 1015 | dependencies: 1016 | acorn "4.0.4" 1017 | acorn-jsx "^3.0.0" 1018 | 1019 | esprima@^2.6.0: 1020 | version "2.7.3" 1021 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 1022 | 1023 | esrecurse@^4.1.0: 1024 | version "4.1.0" 1025 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 1026 | dependencies: 1027 | estraverse "~4.1.0" 1028 | object-assign "^4.0.1" 1029 | 1030 | estraverse@^4.1.1, estraverse@^4.2.0: 1031 | version "4.2.0" 1032 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 1033 | 1034 | estraverse@~4.1.0: 1035 | version "4.1.1" 1036 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 1037 | 1038 | esutils@^2.0.2: 1039 | version "2.0.2" 1040 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1041 | 1042 | event-emitter@~0.3.4: 1043 | version "0.3.4" 1044 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 1045 | dependencies: 1046 | d "~0.1.1" 1047 | es5-ext "~0.10.7" 1048 | 1049 | event-stream@~3.3.0: 1050 | version "3.3.4" 1051 | resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" 1052 | dependencies: 1053 | duplexer "~0.1.1" 1054 | from "~0" 1055 | map-stream "~0.1.0" 1056 | pause-stream "0.0.11" 1057 | split "0.3" 1058 | stream-combiner "~0.0.4" 1059 | through "~2.3.1" 1060 | 1061 | exit-hook@^1.0.0: 1062 | version "1.1.1" 1063 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 1064 | 1065 | expand-brackets@^0.1.4: 1066 | version "0.1.5" 1067 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1068 | dependencies: 1069 | is-posix-bracket "^0.1.0" 1070 | 1071 | expand-range@^1.8.1: 1072 | version "1.8.2" 1073 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 1074 | dependencies: 1075 | fill-range "^2.1.0" 1076 | 1077 | expand-tilde@^1.2.2: 1078 | version "1.2.2" 1079 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" 1080 | dependencies: 1081 | os-homedir "^1.0.1" 1082 | 1083 | extend-shallow@^2.0.1: 1084 | version "2.0.1" 1085 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 1086 | dependencies: 1087 | is-extendable "^0.1.0" 1088 | 1089 | extend@^3.0.0, extend@~3.0.0: 1090 | version "3.0.0" 1091 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 1092 | 1093 | external-editor@^1.1.0: 1094 | version "1.1.1" 1095 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" 1096 | dependencies: 1097 | extend "^3.0.0" 1098 | spawn-sync "^1.0.15" 1099 | tmp "^0.0.29" 1100 | 1101 | extglob@^0.3.1: 1102 | version "0.3.2" 1103 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 1104 | dependencies: 1105 | is-extglob "^1.0.0" 1106 | 1107 | extsprintf@1.0.2: 1108 | version "1.0.2" 1109 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 1110 | 1111 | fast-levenshtein@~2.0.4: 1112 | version "2.0.6" 1113 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1114 | 1115 | figures@^1.3.5, figures@^1.5.0: 1116 | version "1.7.0" 1117 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 1118 | dependencies: 1119 | escape-string-regexp "^1.0.5" 1120 | object-assign "^4.1.0" 1121 | 1122 | file-entry-cache@^2.0.0: 1123 | version "2.0.0" 1124 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 1125 | dependencies: 1126 | flat-cache "^1.2.1" 1127 | object-assign "^4.0.1" 1128 | 1129 | filename-regex@^2.0.0: 1130 | version "2.0.0" 1131 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 1132 | 1133 | fill-range@^2.1.0: 1134 | version "2.2.3" 1135 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 1136 | dependencies: 1137 | is-number "^2.1.0" 1138 | isobject "^2.0.0" 1139 | randomatic "^1.1.3" 1140 | repeat-element "^1.1.2" 1141 | repeat-string "^1.5.2" 1142 | 1143 | find-cache-dir@^0.1.1: 1144 | version "0.1.1" 1145 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" 1146 | dependencies: 1147 | commondir "^1.0.1" 1148 | mkdirp "^0.5.1" 1149 | pkg-dir "^1.0.0" 1150 | 1151 | find-node-modules@1.0.4: 1152 | version "1.0.4" 1153 | resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-1.0.4.tgz#b6deb3cccb699c87037677bcede2c5f5862b2550" 1154 | dependencies: 1155 | findup-sync "0.4.2" 1156 | merge "^1.2.0" 1157 | 1158 | find-root@1.0.0, find-root@^1.0.0: 1159 | version "1.0.0" 1160 | resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" 1161 | 1162 | find-up@^1.0.0, find-up@^1.1.2: 1163 | version "1.1.2" 1164 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1165 | dependencies: 1166 | path-exists "^2.0.0" 1167 | pinkie-promise "^2.0.0" 1168 | 1169 | findup-sync@0.4.2: 1170 | version "0.4.2" 1171 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.2.tgz#a8117d0f73124f5a4546839579fe52d7129fb5e5" 1172 | dependencies: 1173 | detect-file "^0.1.0" 1174 | is-glob "^2.0.1" 1175 | micromatch "^2.3.7" 1176 | resolve-dir "^0.1.0" 1177 | 1178 | flat-cache@^1.2.1: 1179 | version "1.2.2" 1180 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 1181 | dependencies: 1182 | circular-json "^0.3.1" 1183 | del "^2.0.2" 1184 | graceful-fs "^4.1.2" 1185 | write "^0.2.1" 1186 | 1187 | fn-name@^2.0.1: 1188 | version "2.0.1" 1189 | resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" 1190 | 1191 | for-in@^0.1.5: 1192 | version "0.1.6" 1193 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 1194 | 1195 | for-own@^0.1.4: 1196 | version "0.1.4" 1197 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 1198 | dependencies: 1199 | for-in "^0.1.5" 1200 | 1201 | foreach@^2.0.5: 1202 | version "2.0.5" 1203 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 1204 | 1205 | foreground-child@^1.3.3, foreground-child@^1.5.3: 1206 | version "1.5.6" 1207 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" 1208 | dependencies: 1209 | cross-spawn "^4" 1210 | signal-exit "^3.0.0" 1211 | 1212 | forever-agent@~0.6.1: 1213 | version "0.6.1" 1214 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1215 | 1216 | form-data@^2.1.1, form-data@~2.1.1: 1217 | version "2.1.2" 1218 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 1219 | dependencies: 1220 | asynckit "^0.4.0" 1221 | combined-stream "^1.0.5" 1222 | mime-types "^2.1.12" 1223 | 1224 | formidable@^1.1.1: 1225 | version "1.1.1" 1226 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" 1227 | 1228 | fresh@^0.3.0: 1229 | version "0.3.0" 1230 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" 1231 | 1232 | from@~0: 1233 | version "0.1.3" 1234 | resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" 1235 | 1236 | fs-access@^1.0.0: 1237 | version "1.0.1" 1238 | resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" 1239 | dependencies: 1240 | null-check "^1.0.0" 1241 | 1242 | fs-exists-sync@^0.1.0: 1243 | version "0.1.0" 1244 | resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" 1245 | 1246 | fs-extra@^1.0.0: 1247 | version "1.0.0" 1248 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" 1249 | dependencies: 1250 | graceful-fs "^4.1.2" 1251 | jsonfile "^2.1.0" 1252 | klaw "^1.0.0" 1253 | 1254 | fs.realpath@^1.0.0: 1255 | version "1.0.0" 1256 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1257 | 1258 | function-arguments@^1.0.6: 1259 | version "1.0.8" 1260 | resolved "https://registry.yarnpkg.com/function-arguments/-/function-arguments-1.0.8.tgz#b9a01daca6b894eff8c3d36840375ed9636a6c0f" 1261 | 1262 | function-bind@^1.0.2, function-bind@^1.1.0: 1263 | version "1.1.0" 1264 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 1265 | 1266 | generate-function@^2.0.0: 1267 | version "2.0.0" 1268 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 1269 | 1270 | generate-object-property@^1.1.0: 1271 | version "1.2.0" 1272 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 1273 | dependencies: 1274 | is-property "^1.0.0" 1275 | 1276 | get-caller-file@^1.0.1: 1277 | version "1.0.2" 1278 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 1279 | 1280 | get-fn-name@^1.0.0: 1281 | version "1.0.0" 1282 | resolved "https://registry.yarnpkg.com/get-fn-name/-/get-fn-name-1.0.0.tgz#0aa8fadcf99598ebcb44cab0f1a7e95472c316c9" 1283 | dependencies: 1284 | fn-name "^2.0.1" 1285 | 1286 | get-pkg-repo@^1.0.0: 1287 | version "1.3.0" 1288 | resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.3.0.tgz#43c6b4c048b75dd604fc5388edecde557f6335df" 1289 | dependencies: 1290 | hosted-git-info "^2.1.4" 1291 | meow "^3.3.0" 1292 | normalize-package-data "^2.3.0" 1293 | parse-github-repo-url "^1.3.0" 1294 | through2 "^2.0.0" 1295 | 1296 | get-stdin@^4.0.1: 1297 | version "4.0.1" 1298 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 1299 | 1300 | get-stdin@^5.0.1: 1301 | version "5.0.1" 1302 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" 1303 | 1304 | getpass@^0.1.1: 1305 | version "0.1.6" 1306 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 1307 | dependencies: 1308 | assert-plus "^1.0.0" 1309 | 1310 | git-latest-semver-tag@^1.0.0: 1311 | version "1.0.2" 1312 | resolved "https://registry.yarnpkg.com/git-latest-semver-tag/-/git-latest-semver-tag-1.0.2.tgz#061130cbf4274111cc6be4612b3ff3a6d93e2660" 1313 | dependencies: 1314 | git-semver-tags "^1.1.2" 1315 | meow "^3.3.0" 1316 | 1317 | git-raw-commits@^1.0.0, git-raw-commits@^1.1.0: 1318 | version "1.1.2" 1319 | resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.1.2.tgz#a12d8492aeba2881802d700825ed81c9f39e6f2f" 1320 | dependencies: 1321 | dargs "^4.0.1" 1322 | lodash.template "^4.0.2" 1323 | meow "^3.3.0" 1324 | split2 "^2.0.0" 1325 | through2 "^2.0.0" 1326 | 1327 | git-remote-origin-url@^2.0.0: 1328 | version "2.0.0" 1329 | resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" 1330 | dependencies: 1331 | gitconfiglocal "^1.0.0" 1332 | pify "^2.3.0" 1333 | 1334 | git-semver-tags@^1.1.0, git-semver-tags@^1.1.2: 1335 | version "1.1.2" 1336 | resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.1.2.tgz#aecf9b1b2447a6b548d48647f53edba0acad879f" 1337 | dependencies: 1338 | meow "^3.3.0" 1339 | semver "^5.0.1" 1340 | 1341 | gitconfiglocal@^1.0.0: 1342 | version "1.0.0" 1343 | resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" 1344 | dependencies: 1345 | ini "^1.3.2" 1346 | 1347 | github-url-from-git@^1.4.0: 1348 | version "1.5.0" 1349 | resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" 1350 | 1351 | glob-base@^0.3.0: 1352 | version "0.3.0" 1353 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1354 | dependencies: 1355 | glob-parent "^2.0.0" 1356 | is-glob "^2.0.0" 1357 | 1358 | glob-parent@^2.0.0: 1359 | version "2.0.0" 1360 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1361 | dependencies: 1362 | is-glob "^2.0.0" 1363 | 1364 | glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6: 1365 | version "7.1.1" 1366 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 1367 | dependencies: 1368 | fs.realpath "^1.0.0" 1369 | inflight "^1.0.4" 1370 | inherits "2" 1371 | minimatch "^3.0.2" 1372 | once "^1.3.0" 1373 | path-is-absolute "^1.0.0" 1374 | 1375 | global-modules@^0.2.3: 1376 | version "0.2.3" 1377 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" 1378 | dependencies: 1379 | global-prefix "^0.1.4" 1380 | is-windows "^0.2.0" 1381 | 1382 | global-prefix@^0.1.4: 1383 | version "0.1.5" 1384 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" 1385 | dependencies: 1386 | homedir-polyfill "^1.0.0" 1387 | ini "^1.3.4" 1388 | is-windows "^0.2.0" 1389 | which "^1.2.12" 1390 | 1391 | globals@^9.0.0, globals@^9.2.0: 1392 | version "9.15.0" 1393 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.15.0.tgz#7a5d8fd865e69de910b090b15a87772f9423c5de" 1394 | 1395 | globby@^5.0.0: 1396 | version "5.0.0" 1397 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 1398 | dependencies: 1399 | array-union "^1.0.1" 1400 | arrify "^1.0.0" 1401 | glob "^7.0.3" 1402 | object-assign "^4.0.1" 1403 | pify "^2.0.0" 1404 | pinkie-promise "^2.0.0" 1405 | 1406 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: 1407 | version "4.1.11" 1408 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1409 | 1410 | "graceful-readlink@>= 1.0.0": 1411 | version "1.0.1" 1412 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 1413 | 1414 | handlebars@^4.0.2, handlebars@^4.0.3: 1415 | version "4.0.6" 1416 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" 1417 | dependencies: 1418 | async "^1.4.0" 1419 | optimist "^0.6.1" 1420 | source-map "^0.4.4" 1421 | optionalDependencies: 1422 | uglify-js "^2.6" 1423 | 1424 | har-validator@~2.0.6: 1425 | version "2.0.6" 1426 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 1427 | dependencies: 1428 | chalk "^1.1.1" 1429 | commander "^2.9.0" 1430 | is-my-json-valid "^2.12.4" 1431 | pinkie-promise "^2.0.0" 1432 | 1433 | has-ansi@^2.0.0: 1434 | version "2.0.0" 1435 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1436 | dependencies: 1437 | ansi-regex "^2.0.0" 1438 | 1439 | has-flag@^1.0.0: 1440 | version "1.0.0" 1441 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1442 | 1443 | hawk@~3.1.3: 1444 | version "3.1.3" 1445 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 1446 | dependencies: 1447 | boom "2.x.x" 1448 | cryptiles "2.x.x" 1449 | hoek "2.x.x" 1450 | sntp "1.x.x" 1451 | 1452 | hoek@2.x.x: 1453 | version "2.16.3" 1454 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 1455 | 1456 | home-or-tmp@^2.0.0: 1457 | version "2.0.0" 1458 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1459 | dependencies: 1460 | os-homedir "^1.0.0" 1461 | os-tmpdir "^1.0.1" 1462 | 1463 | homedir-polyfill@^1.0.0: 1464 | version "1.0.1" 1465 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" 1466 | dependencies: 1467 | parse-passwd "^1.0.0" 1468 | 1469 | hosted-git-info@^2.1.4: 1470 | version "2.2.0" 1471 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" 1472 | 1473 | http-assert@^1.1.0: 1474 | version "1.2.0" 1475 | resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.2.0.tgz#d6392e6f6519def4e340266b35096db6d3feba00" 1476 | dependencies: 1477 | deep-equal "~1.0.0" 1478 | http-errors "~1.4.0" 1479 | 1480 | http-errors@^1.2.8: 1481 | version "1.5.1" 1482 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" 1483 | dependencies: 1484 | inherits "2.0.3" 1485 | setprototypeof "1.0.2" 1486 | statuses ">= 1.3.1 < 2" 1487 | 1488 | http-errors@~1.4.0: 1489 | version "1.4.0" 1490 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.4.0.tgz#6c0242dea6b3df7afda153c71089b31c6e82aabf" 1491 | dependencies: 1492 | inherits "2.0.1" 1493 | statuses ">= 1.2.1 < 2" 1494 | 1495 | http-signature@~1.1.0: 1496 | version "1.1.1" 1497 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 1498 | dependencies: 1499 | assert-plus "^0.2.0" 1500 | jsprim "^1.2.2" 1501 | sshpk "^1.7.0" 1502 | 1503 | ignore@^3.0.9, ignore@^3.2.0: 1504 | version "3.2.2" 1505 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.2.tgz#1c51e1ef53bab6ddc15db4d9ac4ec139eceb3410" 1506 | 1507 | imurmurhash@^0.1.4: 1508 | version "0.1.4" 1509 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1510 | 1511 | indent-string@^2.1.0: 1512 | version "2.1.0" 1513 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 1514 | dependencies: 1515 | repeating "^2.0.0" 1516 | 1517 | inflection@^1.12.0: 1518 | version "1.12.0" 1519 | resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" 1520 | 1521 | inflight@^1.0.4: 1522 | version "1.0.6" 1523 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1524 | dependencies: 1525 | once "^1.3.0" 1526 | wrappy "1" 1527 | 1528 | inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1: 1529 | version "2.0.3" 1530 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1531 | 1532 | inherits@2.0.1: 1533 | version "2.0.1" 1534 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1535 | 1536 | ini@^1.3.2, ini@^1.3.4: 1537 | version "1.3.4" 1538 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1539 | 1540 | inquirer@1.2.3: 1541 | version "1.2.3" 1542 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" 1543 | dependencies: 1544 | ansi-escapes "^1.1.0" 1545 | chalk "^1.0.0" 1546 | cli-cursor "^1.0.1" 1547 | cli-width "^2.0.0" 1548 | external-editor "^1.1.0" 1549 | figures "^1.3.5" 1550 | lodash "^4.3.0" 1551 | mute-stream "0.0.6" 1552 | pinkie-promise "^2.0.0" 1553 | run-async "^2.2.0" 1554 | rx "^4.1.0" 1555 | string-width "^1.0.1" 1556 | strip-ansi "^3.0.0" 1557 | through "^2.3.6" 1558 | 1559 | inquirer@^0.12.0: 1560 | version "0.12.0" 1561 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 1562 | dependencies: 1563 | ansi-escapes "^1.1.0" 1564 | ansi-regex "^2.0.0" 1565 | chalk "^1.0.0" 1566 | cli-cursor "^1.0.1" 1567 | cli-width "^2.0.0" 1568 | figures "^1.3.5" 1569 | lodash "^4.3.0" 1570 | readline2 "^1.0.1" 1571 | run-async "^0.1.0" 1572 | rx-lite "^3.1.2" 1573 | string-width "^1.0.1" 1574 | strip-ansi "^3.0.0" 1575 | through "^2.3.6" 1576 | 1577 | interpret@^1.0.0: 1578 | version "1.0.1" 1579 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 1580 | 1581 | invariant@^2.2.0: 1582 | version "2.2.2" 1583 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1584 | dependencies: 1585 | loose-envify "^1.0.0" 1586 | 1587 | invert-kv@^1.0.0: 1588 | version "1.0.0" 1589 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1590 | 1591 | is-arrayish@^0.2.1: 1592 | version "0.2.1" 1593 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1594 | 1595 | is-async-function@^1.2.2: 1596 | version "1.2.2" 1597 | resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-1.2.2.tgz#96ab443cab7f822a65822cce0d54331f422f3cff" 1598 | dependencies: 1599 | arr-includes "^2.0.0" 1600 | common-callback-names "^1.0.2" 1601 | function-arguments "^1.0.6" 1602 | lazy-arrayify "^1.0.3" 1603 | lazy-cache "^2.0.1" 1604 | 1605 | is-buffer@^1.0.2: 1606 | version "1.1.4" 1607 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 1608 | 1609 | is-builtin-module@^1.0.0: 1610 | version "1.0.0" 1611 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1612 | dependencies: 1613 | builtin-modules "^1.0.0" 1614 | 1615 | is-callable@^1.1.1, is-callable@^1.1.3: 1616 | version "1.1.3" 1617 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 1618 | 1619 | is-child-process@^1.0.0, is-child-process@^1.0.2: 1620 | version "1.0.2" 1621 | resolved "https://registry.yarnpkg.com/is-child-process/-/is-child-process-1.0.2.tgz#c22961acd629e128cb008ed6355b3bcbf85d9bd8" 1622 | dependencies: 1623 | is-node-emitter "^1.0.2" 1624 | isarray "^1.0.0" 1625 | 1626 | is-date-object@^1.0.1: 1627 | version "1.0.1" 1628 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 1629 | 1630 | is-dotfile@^1.0.0: 1631 | version "1.0.2" 1632 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1633 | 1634 | is-equal-shallow@^0.1.3: 1635 | version "0.1.3" 1636 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1637 | dependencies: 1638 | is-primitive "^2.0.0" 1639 | 1640 | is-error@^2.2.0: 1641 | version "2.2.1" 1642 | resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" 1643 | 1644 | is-es6-generator-function@^1.0.0: 1645 | version "1.0.0" 1646 | resolved "https://registry.yarnpkg.com/is-es6-generator-function/-/is-es6-generator-function-1.0.0.tgz#fb7f8ca143d90b63d248fb30a396f6f79aa5db7b" 1647 | dependencies: 1648 | is-generator-function-name "~1.0.0" 1649 | 1650 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1651 | version "0.1.1" 1652 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1653 | 1654 | is-extglob@^1.0.0: 1655 | version "1.0.0" 1656 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1657 | 1658 | is-finite@^1.0.0: 1659 | version "1.0.2" 1660 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1661 | dependencies: 1662 | number-is-nan "^1.0.0" 1663 | 1664 | is-fullwidth-code-point@^1.0.0: 1665 | version "1.0.0" 1666 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1667 | dependencies: 1668 | number-is-nan "^1.0.0" 1669 | 1670 | is-fullwidth-code-point@^2.0.0: 1671 | version "2.0.0" 1672 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1673 | 1674 | is-generator-function-name@~1.0.0: 1675 | version "1.0.0" 1676 | resolved "https://registry.yarnpkg.com/is-generator-function-name/-/is-generator-function-name-1.0.0.tgz#254fff9ff56b5dd9a78c129453ab19e593b62f3e" 1677 | 1678 | is-generator-function@^1.0.3: 1679 | version "1.0.6" 1680 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.6.tgz#9e71653cd15fff341c79c4151460a131d31e9fc4" 1681 | 1682 | is-glob@^2.0.0, is-glob@^2.0.1: 1683 | version "2.0.1" 1684 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1685 | dependencies: 1686 | is-extglob "^1.0.0" 1687 | 1688 | is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: 1689 | version "2.15.0" 1690 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 1691 | dependencies: 1692 | generate-function "^2.0.0" 1693 | generate-object-property "^1.1.0" 1694 | jsonpointer "^4.0.0" 1695 | xtend "^4.0.0" 1696 | 1697 | is-node-emitter@^1.0.2: 1698 | version "1.0.6" 1699 | resolved "https://registry.yarnpkg.com/is-node-emitter/-/is-node-emitter-1.0.6.tgz#807a8b0194ceccf99b6f7d5e95a39f1c957eaa36" 1700 | dependencies: 1701 | is-real-object "^1.0.1" 1702 | isarray "^1.0.0" 1703 | 1704 | is-node-stream@^1.0.0: 1705 | version "1.0.0" 1706 | resolved "https://registry.yarnpkg.com/is-node-stream/-/is-node-stream-1.0.0.tgz#f8e18da7bf1a66a652d8860c834ab2c6c7a6e896" 1707 | dependencies: 1708 | is-node-emitter "^1.0.2" 1709 | 1710 | is-number@^2.0.2, is-number@^2.1.0: 1711 | version "2.1.0" 1712 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1713 | dependencies: 1714 | kind-of "^3.0.2" 1715 | 1716 | is-obj@^1.0.0: 1717 | version "1.0.1" 1718 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1719 | 1720 | is-path-cwd@^1.0.0: 1721 | version "1.0.0" 1722 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1723 | 1724 | is-path-in-cwd@^1.0.0: 1725 | version "1.0.0" 1726 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1727 | dependencies: 1728 | is-path-inside "^1.0.0" 1729 | 1730 | is-path-inside@^1.0.0: 1731 | version "1.0.0" 1732 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1733 | dependencies: 1734 | path-is-inside "^1.0.1" 1735 | 1736 | is-posix-bracket@^0.1.0: 1737 | version "0.1.1" 1738 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1739 | 1740 | is-primitive@^2.0.0: 1741 | version "2.0.0" 1742 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1743 | 1744 | is-promise@^2.1.0: 1745 | version "2.1.0" 1746 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1747 | 1748 | is-property@^1.0.0: 1749 | version "1.0.2" 1750 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1751 | 1752 | is-real-object@^1.0.1: 1753 | version "1.0.2" 1754 | resolved "https://registry.yarnpkg.com/is-real-object/-/is-real-object-1.0.2.tgz#dd170ead88829c38c5d4b430596d91e2b9773883" 1755 | dependencies: 1756 | is-extendable "^0.1.1" 1757 | isarray "^1.0.0" 1758 | 1759 | is-regex@^1.0.3: 1760 | version "1.0.3" 1761 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637" 1762 | 1763 | is-request-stream@^1.0.1: 1764 | version "1.0.1" 1765 | resolved "https://registry.yarnpkg.com/is-request-stream/-/is-request-stream-1.0.1.tgz#5cbfdcef29e88c47a5680efcf69934627852dfc1" 1766 | dependencies: 1767 | is-node-stream "^1.0.0" 1768 | 1769 | is-resolvable@^1.0.0: 1770 | version "1.0.0" 1771 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 1772 | dependencies: 1773 | tryit "^1.0.1" 1774 | 1775 | is-subset@^0.1.1: 1776 | version "0.1.1" 1777 | resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" 1778 | 1779 | is-symbol@^1.0.1: 1780 | version "1.0.1" 1781 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 1782 | 1783 | is-text-path@^1.0.0: 1784 | version "1.0.1" 1785 | resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" 1786 | dependencies: 1787 | text-extensions "^1.0.0" 1788 | 1789 | is-typedarray@~1.0.0: 1790 | version "1.0.0" 1791 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1792 | 1793 | is-typeof-error@^1.1.0: 1794 | version "1.1.0" 1795 | resolved "https://registry.yarnpkg.com/is-typeof-error/-/is-typeof-error-1.1.0.tgz#f824e241342c0678b09d697e8041aeb4f4fa281c" 1796 | dependencies: 1797 | is-extendable "^0.1.1" 1798 | 1799 | is-utf8@^0.2.0: 1800 | version "0.2.1" 1801 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1802 | 1803 | is-windows@^0.2.0: 1804 | version "0.2.0" 1805 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" 1806 | 1807 | isarray@0.0.1: 1808 | version "0.0.1" 1809 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1810 | 1811 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 1812 | version "1.0.0" 1813 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1814 | 1815 | isexe@^1.1.1: 1816 | version "1.1.2" 1817 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 1818 | 1819 | isobject@^2.0.0: 1820 | version "2.1.0" 1821 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1822 | dependencies: 1823 | isarray "1.0.0" 1824 | 1825 | isstream@~0.1.2: 1826 | version "0.1.2" 1827 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1828 | 1829 | istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0, istanbul-lib-coverage@^1.0.1: 1830 | version "1.0.1" 1831 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212" 1832 | 1833 | istanbul-lib-hook@^1.0.0: 1834 | version "1.0.0" 1835 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0.tgz#fc5367ee27f59268e8f060b0c7aaf051d9c425c5" 1836 | dependencies: 1837 | append-transform "^0.4.0" 1838 | 1839 | istanbul-lib-instrument@^1.4.2: 1840 | version "1.4.2" 1841 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.4.2.tgz#0e2fdfac93c1dabf2e31578637dc78a19089f43e" 1842 | dependencies: 1843 | babel-generator "^6.18.0" 1844 | babel-template "^6.16.0" 1845 | babel-traverse "^6.18.0" 1846 | babel-types "^6.18.0" 1847 | babylon "^6.13.0" 1848 | istanbul-lib-coverage "^1.0.0" 1849 | semver "^5.3.0" 1850 | 1851 | istanbul-lib-report@^1.0.0-alpha.3: 1852 | version "1.0.0-alpha.3" 1853 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" 1854 | dependencies: 1855 | async "^1.4.2" 1856 | istanbul-lib-coverage "^1.0.0-alpha" 1857 | mkdirp "^0.5.1" 1858 | path-parse "^1.0.5" 1859 | rimraf "^2.4.3" 1860 | supports-color "^3.1.2" 1861 | 1862 | istanbul-lib-source-maps@^1.1.0: 1863 | version "1.1.0" 1864 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" 1865 | dependencies: 1866 | istanbul-lib-coverage "^1.0.0-alpha.0" 1867 | mkdirp "^0.5.1" 1868 | rimraf "^2.4.4" 1869 | source-map "^0.5.3" 1870 | 1871 | istanbul-reports@^1.0.0: 1872 | version "1.0.1" 1873 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.1.tgz#9a17176bc4a6cbebdae52b2f15961d52fa623fbc" 1874 | dependencies: 1875 | handlebars "^4.0.3" 1876 | 1877 | jodid25519@^1.0.0: 1878 | version "1.0.2" 1879 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1880 | dependencies: 1881 | jsbn "~0.1.0" 1882 | 1883 | js-tokens@^3.0.0: 1884 | version "3.0.1" 1885 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1886 | 1887 | js-yaml@3.6.1, js-yaml@^3.5.1: 1888 | version "3.6.1" 1889 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" 1890 | dependencies: 1891 | argparse "^1.0.7" 1892 | esprima "^2.6.0" 1893 | 1894 | jsbn@~0.1.0: 1895 | version "0.1.1" 1896 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1897 | 1898 | jsesc@^1.3.0: 1899 | version "1.3.0" 1900 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1901 | 1902 | json-schema@0.2.3: 1903 | version "0.2.3" 1904 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1905 | 1906 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 1907 | version "1.0.1" 1908 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1909 | dependencies: 1910 | jsonify "~0.0.0" 1911 | 1912 | json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: 1913 | version "5.0.1" 1914 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1915 | 1916 | jsonfile@^2.1.0: 1917 | version "2.4.0" 1918 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 1919 | optionalDependencies: 1920 | graceful-fs "^4.1.6" 1921 | 1922 | jsonify@~0.0.0: 1923 | version "0.0.0" 1924 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1925 | 1926 | jsonparse@^1.2.0: 1927 | version "1.3.0" 1928 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8" 1929 | 1930 | jsonpointer@^4.0.0: 1931 | version "4.0.1" 1932 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 1933 | 1934 | jsprim@^1.2.2: 1935 | version "1.3.1" 1936 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 1937 | dependencies: 1938 | extsprintf "1.0.2" 1939 | json-schema "0.2.3" 1940 | verror "1.3.6" 1941 | 1942 | jsx-ast-utils@^1.3.3: 1943 | version "1.4.0" 1944 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.0.tgz#5afe38868f56bc8cc7aeaef0100ba8c75bd12591" 1945 | dependencies: 1946 | object-assign "^4.1.0" 1947 | 1948 | keygrip@~1.0.1: 1949 | version "1.0.1" 1950 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.1.tgz#b02fa4816eef21a8c4b35ca9e52921ffc89a30e9" 1951 | 1952 | kind-of@^3.0.2: 1953 | version "3.1.0" 1954 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" 1955 | dependencies: 1956 | is-buffer "^1.0.2" 1957 | 1958 | klaw@^1.0.0: 1959 | version "1.3.1" 1960 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 1961 | optionalDependencies: 1962 | graceful-fs "^4.1.9" 1963 | 1964 | koa-better-router@^2.1.1: 1965 | version "2.1.1" 1966 | resolved "https://registry.yarnpkg.com/koa-better-router/-/koa-better-router-2.1.1.tgz#8498664659204bedfb7cb72f99c8ca1f17d6628f" 1967 | dependencies: 1968 | extend-shallow "^2.0.1" 1969 | is-es6-generator-function "^1.0.0" 1970 | koa-compose "^3.1.0" 1971 | koa-convert "^1.2.0" 1972 | lazy-cache "^2.0.1" 1973 | methods "^1.1.2" 1974 | path-match "^1.2.4" 1975 | 1976 | koa-compose@^3.0.0, koa-compose@^3.1.0: 1977 | version "3.2.1" 1978 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" 1979 | dependencies: 1980 | any-promise "^1.1.0" 1981 | 1982 | koa-convert@^1.2.0: 1983 | version "1.2.0" 1984 | resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" 1985 | dependencies: 1986 | co "^4.6.0" 1987 | koa-compose "^3.0.0" 1988 | 1989 | koa-is-json@^1.0.0: 1990 | version "1.0.0" 1991 | resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" 1992 | 1993 | koa@^2.0.0-alpha.8: 1994 | version "2.0.0" 1995 | resolved "https://registry.yarnpkg.com/koa/-/koa-2.0.0.tgz#da865ae8ee4afae070425290455d2cdf4885f9dc" 1996 | dependencies: 1997 | accepts "^1.2.2" 1998 | content-disposition "~0.5.0" 1999 | content-type "^1.0.0" 2000 | cookies "~0.6.1" 2001 | debug "*" 2002 | delegates "^1.0.0" 2003 | depd "^1.1.0" 2004 | destroy "^1.0.3" 2005 | error-inject "~1.0.0" 2006 | escape-html "~1.0.1" 2007 | fresh "^0.3.0" 2008 | http-assert "^1.1.0" 2009 | http-errors "^1.2.8" 2010 | is-generator-function "^1.0.3" 2011 | koa-compose "^3.0.0" 2012 | koa-convert "^1.2.0" 2013 | koa-is-json "^1.0.0" 2014 | mime-types "^2.0.7" 2015 | on-finished "^2.1.0" 2016 | only "0.0.2" 2017 | parseurl "^1.3.0" 2018 | statuses "^1.2.0" 2019 | type-is "^1.5.5" 2020 | vary "^1.0.0" 2021 | 2022 | lazy-arrayify@^1.0.3: 2023 | version "1.0.3" 2024 | resolved "https://registry.yarnpkg.com/lazy-arrayify/-/lazy-arrayify-1.0.3.tgz#2fd5d9734bec2f988d6636b9780fe7221cc001b7" 2025 | dependencies: 2026 | isarray "^1.0.0" 2027 | lazy-cache "^2.0.0" 2028 | 2029 | lazy-cache@^1.0.3: 2030 | version "1.0.4" 2031 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 2032 | 2033 | lazy-cache@^2.0.0, lazy-cache@^2.0.1, lazy-cache@^2.0.2: 2034 | version "2.0.2" 2035 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" 2036 | dependencies: 2037 | set-getter "^0.1.0" 2038 | 2039 | lcid@^1.0.0: 2040 | version "1.0.0" 2041 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 2042 | dependencies: 2043 | invert-kv "^1.0.0" 2044 | 2045 | lcov-parse@0.0.10: 2046 | version "0.0.10" 2047 | resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" 2048 | 2049 | levn@^0.3.0, levn@~0.3.0: 2050 | version "0.3.0" 2051 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 2052 | dependencies: 2053 | prelude-ls "~1.1.2" 2054 | type-check "~0.3.2" 2055 | 2056 | load-json-file@^1.0.0: 2057 | version "1.1.0" 2058 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 2059 | dependencies: 2060 | graceful-fs "^4.1.2" 2061 | parse-json "^2.2.0" 2062 | pify "^2.0.0" 2063 | pinkie-promise "^2.0.0" 2064 | strip-bom "^2.0.0" 2065 | 2066 | load-json-file@^2.0.0: 2067 | version "2.0.0" 2068 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 2069 | dependencies: 2070 | graceful-fs "^4.1.2" 2071 | parse-json "^2.2.0" 2072 | pify "^2.0.0" 2073 | strip-bom "^3.0.0" 2074 | 2075 | lodash._reinterpolate@~3.0.0: 2076 | version "3.0.0" 2077 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 2078 | 2079 | lodash.map@^4.5.1: 2080 | version "4.6.0" 2081 | resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" 2082 | 2083 | lodash.template@^4.0.2: 2084 | version "4.4.0" 2085 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" 2086 | dependencies: 2087 | lodash._reinterpolate "~3.0.0" 2088 | lodash.templatesettings "^4.0.0" 2089 | 2090 | lodash.templatesettings@^4.0.0: 2091 | version "4.1.0" 2092 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" 2093 | dependencies: 2094 | lodash._reinterpolate "~3.0.0" 2095 | 2096 | lodash@4.17.2, lodash@^4.0.0, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: 2097 | version "4.17.2" 2098 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" 2099 | 2100 | log-driver@1.2.5: 2101 | version "1.2.5" 2102 | resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" 2103 | 2104 | longest@^1.0.1: 2105 | version "1.0.1" 2106 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 2107 | 2108 | loose-envify@^1.0.0: 2109 | version "1.3.1" 2110 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 2111 | dependencies: 2112 | js-tokens "^3.0.0" 2113 | 2114 | loud-rejection@^1.0.0: 2115 | version "1.6.0" 2116 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 2117 | dependencies: 2118 | currently-unhandled "^0.4.1" 2119 | signal-exit "^3.0.0" 2120 | 2121 | lru-cache@^4.0.1: 2122 | version "4.0.2" 2123 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 2124 | dependencies: 2125 | pseudomap "^1.0.1" 2126 | yallist "^2.0.0" 2127 | 2128 | map-obj@^1.0.0, map-obj@^1.0.1: 2129 | version "1.0.1" 2130 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 2131 | 2132 | map-stream@~0.1.0: 2133 | version "0.1.0" 2134 | resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" 2135 | 2136 | md5-hex@^1.2.0: 2137 | version "1.3.0" 2138 | resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" 2139 | dependencies: 2140 | md5-o-matic "^0.1.1" 2141 | 2142 | md5-o-matic@^0.1.1: 2143 | version "0.1.1" 2144 | resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" 2145 | 2146 | media-typer@0.3.0: 2147 | version "0.3.0" 2148 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 2149 | 2150 | meow@^3.3.0: 2151 | version "3.7.0" 2152 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 2153 | dependencies: 2154 | camelcase-keys "^2.0.0" 2155 | decamelize "^1.1.2" 2156 | loud-rejection "^1.0.0" 2157 | map-obj "^1.0.1" 2158 | minimist "^1.1.3" 2159 | normalize-package-data "^2.3.4" 2160 | object-assign "^4.0.1" 2161 | read-pkg-up "^1.0.1" 2162 | redent "^1.0.0" 2163 | trim-newlines "^1.0.0" 2164 | 2165 | merge-source-map@^1.0.2: 2166 | version "1.0.3" 2167 | resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" 2168 | dependencies: 2169 | source-map "^0.5.3" 2170 | 2171 | merge@^1.2.0: 2172 | version "1.2.0" 2173 | resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" 2174 | 2175 | methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: 2176 | version "1.1.2" 2177 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 2178 | 2179 | micromatch@^2.3.11, micromatch@^2.3.7: 2180 | version "2.3.11" 2181 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 2182 | dependencies: 2183 | arr-diff "^2.0.0" 2184 | array-unique "^0.2.1" 2185 | braces "^1.8.2" 2186 | expand-brackets "^0.1.4" 2187 | extglob "^0.3.1" 2188 | filename-regex "^2.0.0" 2189 | is-extglob "^1.0.0" 2190 | is-glob "^2.0.1" 2191 | kind-of "^3.0.2" 2192 | normalize-path "^2.0.1" 2193 | object.omit "^2.0.0" 2194 | parse-glob "^3.0.4" 2195 | regex-cache "^0.4.2" 2196 | 2197 | mime-db@~1.26.0: 2198 | version "1.26.0" 2199 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" 2200 | 2201 | mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: 2202 | version "2.1.14" 2203 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" 2204 | dependencies: 2205 | mime-db "~1.26.0" 2206 | 2207 | mime@^1.3.4: 2208 | version "1.3.4" 2209 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 2210 | 2211 | minimatch@^3.0.2: 2212 | version "3.0.3" 2213 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 2214 | dependencies: 2215 | brace-expansion "^1.0.0" 2216 | 2217 | minimist@0.0.8, minimist@~0.0.1: 2218 | version "0.0.8" 2219 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 2220 | 2221 | minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3: 2222 | version "1.2.0" 2223 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 2224 | 2225 | mkdirp@^0.5.0, mkdirp@^0.5.1: 2226 | version "0.5.1" 2227 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 2228 | dependencies: 2229 | minimist "0.0.8" 2230 | 2231 | modify-values@^1.0.0: 2232 | version "1.0.0" 2233 | resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" 2234 | 2235 | ms@0.7.2: 2236 | version "0.7.2" 2237 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 2238 | 2239 | mukla@^0.4.8: 2240 | version "0.4.8" 2241 | resolved "https://registry.yarnpkg.com/mukla/-/mukla-0.4.8.tgz#42f84d3e89ff4b6fa13dd4117b71615e656d4e7e" 2242 | dependencies: 2243 | always-done "^1.1.0" 2244 | clean-stacktrace "^1.0.0" 2245 | core-assert "^0.2.1" 2246 | error-symbol "^0.1.0" 2247 | extend-shallow "^2.0.1" 2248 | get-fn-name "^1.0.0" 2249 | lazy-cache "^2.0.1" 2250 | success-symbol "^0.1.0" 2251 | 2252 | mute-stream@0.0.5: 2253 | version "0.0.5" 2254 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 2255 | 2256 | mute-stream@0.0.6: 2257 | version "0.0.6" 2258 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" 2259 | 2260 | natural-compare@^1.4.0: 2261 | version "1.4.0" 2262 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 2263 | 2264 | negotiator@0.6.1: 2265 | version "0.6.1" 2266 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 2267 | 2268 | normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: 2269 | version "2.3.5" 2270 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" 2271 | dependencies: 2272 | hosted-git-info "^2.1.4" 2273 | is-builtin-module "^1.0.0" 2274 | semver "2 || 3 || 4 || 5" 2275 | validate-npm-package-license "^3.0.1" 2276 | 2277 | normalize-path@^2.0.1: 2278 | version "2.0.1" 2279 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 2280 | 2281 | npm-run-all@^4.0.1: 2282 | version "4.0.1" 2283 | resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.0.1.tgz#f10144d20b57ed9bbf6c36a8de9502e0b80f2b4e" 2284 | dependencies: 2285 | chalk "^1.1.3" 2286 | cross-spawn "^5.0.1" 2287 | minimatch "^3.0.2" 2288 | ps-tree "^1.0.1" 2289 | read-pkg "^2.0.0" 2290 | shell-quote "^1.6.1" 2291 | string.prototype.padend "^3.0.0" 2292 | 2293 | null-check@^1.0.0: 2294 | version "1.0.0" 2295 | resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" 2296 | 2297 | number-is-nan@^1.0.0: 2298 | version "1.0.1" 2299 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 2300 | 2301 | nyc@^10.1.2: 2302 | version "10.1.2" 2303 | resolved "https://registry.yarnpkg.com/nyc/-/nyc-10.1.2.tgz#ea7acaa20a235210101604f4e7d56d28453b0274" 2304 | dependencies: 2305 | archy "^1.0.0" 2306 | arrify "^1.0.1" 2307 | caching-transform "^1.0.0" 2308 | convert-source-map "^1.3.0" 2309 | debug-log "^1.0.1" 2310 | default-require-extensions "^1.0.0" 2311 | find-cache-dir "^0.1.1" 2312 | find-up "^1.1.2" 2313 | foreground-child "^1.5.3" 2314 | glob "^7.0.6" 2315 | istanbul-lib-coverage "^1.0.1" 2316 | istanbul-lib-hook "^1.0.0" 2317 | istanbul-lib-instrument "^1.4.2" 2318 | istanbul-lib-report "^1.0.0-alpha.3" 2319 | istanbul-lib-source-maps "^1.1.0" 2320 | istanbul-reports "^1.0.0" 2321 | md5-hex "^1.2.0" 2322 | merge-source-map "^1.0.2" 2323 | micromatch "^2.3.11" 2324 | mkdirp "^0.5.0" 2325 | resolve-from "^2.0.0" 2326 | rimraf "^2.5.4" 2327 | signal-exit "^3.0.1" 2328 | spawn-wrap "1.2.4" 2329 | test-exclude "^3.3.0" 2330 | yargs "^6.6.0" 2331 | yargs-parser "^4.0.2" 2332 | 2333 | oauth-sign@~0.8.1: 2334 | version "0.8.2" 2335 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 2336 | 2337 | object-assign@^4.0.1, object-assign@^4.1.0: 2338 | version "4.1.1" 2339 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 2340 | 2341 | object-keys@^1.0.8: 2342 | version "1.0.11" 2343 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 2344 | 2345 | object.omit@^2.0.0: 2346 | version "2.0.1" 2347 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 2348 | dependencies: 2349 | for-own "^0.1.4" 2350 | is-extendable "^0.1.1" 2351 | 2352 | on-finished@^2.1.0: 2353 | version "2.3.0" 2354 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 2355 | dependencies: 2356 | ee-first "1.1.1" 2357 | 2358 | on-stream-end@^1.0.0: 2359 | version "1.0.0" 2360 | resolved "https://registry.yarnpkg.com/on-stream-end/-/on-stream-end-1.0.0.tgz#8939261df6fd751f12efca8488346a4129f5fa73" 2361 | dependencies: 2362 | dezalgo "^1.0.3" 2363 | is-child-process "^1.0.0" 2364 | is-node-stream "^1.0.0" 2365 | is-real-object "^1.0.1" 2366 | is-request-stream "^1.0.1" 2367 | onetime "^1.0.0" 2368 | 2369 | once@^1.3.0, once@^1.4.0: 2370 | version "1.4.0" 2371 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2372 | dependencies: 2373 | wrappy "1" 2374 | 2375 | onetime@^1.0.0: 2376 | version "1.1.0" 2377 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 2378 | 2379 | only@0.0.2: 2380 | version "0.0.2" 2381 | resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 2382 | 2383 | optimist@^0.6.1: 2384 | version "0.6.1" 2385 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 2386 | dependencies: 2387 | minimist "~0.0.1" 2388 | wordwrap "~0.0.2" 2389 | 2390 | optionator@^0.8.2: 2391 | version "0.8.2" 2392 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 2393 | dependencies: 2394 | deep-is "~0.1.3" 2395 | fast-levenshtein "~2.0.4" 2396 | levn "~0.3.0" 2397 | prelude-ls "~1.1.2" 2398 | type-check "~0.3.2" 2399 | wordwrap "~1.0.0" 2400 | 2401 | os-homedir@^1.0.0, os-homedir@^1.0.1: 2402 | version "1.0.2" 2403 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 2404 | 2405 | os-locale@^1.4.0: 2406 | version "1.4.0" 2407 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 2408 | dependencies: 2409 | lcid "^1.0.0" 2410 | 2411 | os-shim@^0.1.2: 2412 | version "0.1.3" 2413 | resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" 2414 | 2415 | os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: 2416 | version "1.0.2" 2417 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 2418 | 2419 | pad-right@^0.2.2: 2420 | version "0.2.2" 2421 | resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" 2422 | dependencies: 2423 | repeat-string "^1.5.2" 2424 | 2425 | parse-github-repo-url@^1.3.0: 2426 | version "1.4.0" 2427 | resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.0.tgz#286c53e2c9962e0641649ee3ac9508fca4dd959c" 2428 | 2429 | parse-glob@^3.0.4: 2430 | version "3.0.4" 2431 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 2432 | dependencies: 2433 | glob-base "^0.3.0" 2434 | is-dotfile "^1.0.0" 2435 | is-extglob "^1.0.0" 2436 | is-glob "^2.0.0" 2437 | 2438 | parse-json@^2.2.0: 2439 | version "2.2.0" 2440 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 2441 | dependencies: 2442 | error-ex "^1.2.0" 2443 | 2444 | parse-passwd@^1.0.0: 2445 | version "1.0.0" 2446 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 2447 | 2448 | parseurl@^1.3.0: 2449 | version "1.3.1" 2450 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" 2451 | 2452 | path-exists@2.1.0, path-exists@^2.0.0: 2453 | version "2.1.0" 2454 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 2455 | dependencies: 2456 | pinkie-promise "^2.0.0" 2457 | 2458 | path-is-absolute@^1.0.0: 2459 | version "1.0.1" 2460 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2461 | 2462 | path-is-inside@^1.0.1: 2463 | version "1.0.2" 2464 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 2465 | 2466 | path-match@^1.2.4: 2467 | version "1.2.4" 2468 | resolved "https://registry.yarnpkg.com/path-match/-/path-match-1.2.4.tgz#a62747f3c7e0c2514762697f24443585b09100ea" 2469 | dependencies: 2470 | http-errors "~1.4.0" 2471 | path-to-regexp "^1.0.0" 2472 | 2473 | path-parse@^1.0.5: 2474 | version "1.0.5" 2475 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 2476 | 2477 | path-to-regexp@^1.0.0: 2478 | version "1.7.0" 2479 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" 2480 | dependencies: 2481 | isarray "0.0.1" 2482 | 2483 | path-type@^1.0.0: 2484 | version "1.1.0" 2485 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 2486 | dependencies: 2487 | graceful-fs "^4.1.2" 2488 | pify "^2.0.0" 2489 | pinkie-promise "^2.0.0" 2490 | 2491 | path-type@^2.0.0: 2492 | version "2.0.0" 2493 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 2494 | dependencies: 2495 | pify "^2.0.0" 2496 | 2497 | pause-stream@0.0.11: 2498 | version "0.0.11" 2499 | resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" 2500 | dependencies: 2501 | through "~2.3" 2502 | 2503 | pify@^2.0.0, pify@^2.3.0: 2504 | version "2.3.0" 2505 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2506 | 2507 | pinkie-promise@^2.0.0: 2508 | version "2.0.1" 2509 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 2510 | dependencies: 2511 | pinkie "^2.0.0" 2512 | 2513 | pinkie@^2.0.0: 2514 | version "2.0.4" 2515 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 2516 | 2517 | pkg-config@^1.0.1, pkg-config@^1.1.0: 2518 | version "1.1.1" 2519 | resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" 2520 | dependencies: 2521 | debug-log "^1.0.0" 2522 | find-root "^1.0.0" 2523 | xtend "^4.0.1" 2524 | 2525 | pkg-dir@^1.0.0: 2526 | version "1.0.0" 2527 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 2528 | dependencies: 2529 | find-up "^1.0.0" 2530 | 2531 | pluralize@^1.2.1: 2532 | version "1.2.1" 2533 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 2534 | 2535 | pre-commit@^1.2.2: 2536 | version "1.2.2" 2537 | resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" 2538 | dependencies: 2539 | cross-spawn "^5.0.1" 2540 | spawn-sync "^1.0.15" 2541 | which "1.2.x" 2542 | 2543 | prelude-ls@~1.1.2: 2544 | version "1.1.2" 2545 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 2546 | 2547 | preserve@^0.2.0: 2548 | version "0.2.0" 2549 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 2550 | 2551 | process-nextick-args@~1.0.6: 2552 | version "1.0.7" 2553 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 2554 | 2555 | progress@^1.1.8: 2556 | version "1.1.8" 2557 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 2558 | 2559 | ps-tree@^1.0.1: 2560 | version "1.1.0" 2561 | resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" 2562 | dependencies: 2563 | event-stream "~3.3.0" 2564 | 2565 | pseudomap@^1.0.1: 2566 | version "1.0.2" 2567 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 2568 | 2569 | punycode@^1.4.1: 2570 | version "1.4.1" 2571 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 2572 | 2573 | q@^1.4.1: 2574 | version "1.4.1" 2575 | resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" 2576 | 2577 | qs@^6.1.0, qs@~6.3.0: 2578 | version "6.3.0" 2579 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" 2580 | 2581 | randomatic@^1.1.3: 2582 | version "1.1.6" 2583 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 2584 | dependencies: 2585 | is-number "^2.0.2" 2586 | kind-of "^3.0.2" 2587 | 2588 | read-pkg-up@^1.0.1: 2589 | version "1.0.1" 2590 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 2591 | dependencies: 2592 | find-up "^1.0.0" 2593 | read-pkg "^1.0.0" 2594 | 2595 | read-pkg@^1.0.0, read-pkg@^1.1.0: 2596 | version "1.1.0" 2597 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 2598 | dependencies: 2599 | load-json-file "^1.0.0" 2600 | normalize-package-data "^2.3.2" 2601 | path-type "^1.0.0" 2602 | 2603 | read-pkg@^2.0.0: 2604 | version "2.0.0" 2605 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 2606 | dependencies: 2607 | load-json-file "^2.0.0" 2608 | normalize-package-data "^2.3.2" 2609 | path-type "^2.0.0" 2610 | 2611 | readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2: 2612 | version "2.2.2" 2613 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" 2614 | dependencies: 2615 | buffer-shims "^1.0.0" 2616 | core-util-is "~1.0.0" 2617 | inherits "~2.0.1" 2618 | isarray "~1.0.0" 2619 | process-nextick-args "~1.0.6" 2620 | string_decoder "~0.10.x" 2621 | util-deprecate "~1.0.1" 2622 | 2623 | readline2@^1.0.1: 2624 | version "1.0.1" 2625 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 2626 | dependencies: 2627 | code-point-at "^1.0.0" 2628 | is-fullwidth-code-point "^1.0.0" 2629 | mute-stream "0.0.5" 2630 | 2631 | rechoir@^0.6.2: 2632 | version "0.6.2" 2633 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 2634 | dependencies: 2635 | resolve "^1.1.6" 2636 | 2637 | redent@^1.0.0: 2638 | version "1.0.0" 2639 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 2640 | dependencies: 2641 | indent-string "^2.1.0" 2642 | strip-indent "^1.0.1" 2643 | 2644 | regenerator-runtime@^0.10.0: 2645 | version "0.10.1" 2646 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" 2647 | 2648 | regex-cache@^0.4.2: 2649 | version "0.4.3" 2650 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 2651 | dependencies: 2652 | is-equal-shallow "^0.1.3" 2653 | is-primitive "^2.0.0" 2654 | 2655 | repeat-element@^1.1.2: 2656 | version "1.1.2" 2657 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2658 | 2659 | repeat-string@^1.5.2: 2660 | version "1.6.1" 2661 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2662 | 2663 | repeating@^2.0.0: 2664 | version "2.0.1" 2665 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2666 | dependencies: 2667 | is-finite "^1.0.0" 2668 | 2669 | request@2.79.0: 2670 | version "2.79.0" 2671 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 2672 | dependencies: 2673 | aws-sign2 "~0.6.0" 2674 | aws4 "^1.2.1" 2675 | caseless "~0.11.0" 2676 | combined-stream "~1.0.5" 2677 | extend "~3.0.0" 2678 | forever-agent "~0.6.1" 2679 | form-data "~2.1.1" 2680 | har-validator "~2.0.6" 2681 | hawk "~3.1.3" 2682 | http-signature "~1.1.0" 2683 | is-typedarray "~1.0.0" 2684 | isstream "~0.1.2" 2685 | json-stringify-safe "~5.0.1" 2686 | mime-types "~2.1.7" 2687 | oauth-sign "~0.8.1" 2688 | qs "~6.3.0" 2689 | stringstream "~0.0.4" 2690 | tough-cookie "~2.3.0" 2691 | tunnel-agent "~0.4.1" 2692 | uuid "^3.0.0" 2693 | 2694 | require-directory@^2.1.1: 2695 | version "2.1.1" 2696 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2697 | 2698 | require-main-filename@^1.0.1: 2699 | version "1.0.1" 2700 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 2701 | 2702 | require-uncached@^1.0.2: 2703 | version "1.0.3" 2704 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 2705 | dependencies: 2706 | caller-path "^0.1.0" 2707 | resolve-from "^1.0.0" 2708 | 2709 | resolve-dir@^0.1.0: 2710 | version "0.1.1" 2711 | resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" 2712 | dependencies: 2713 | expand-tilde "^1.2.2" 2714 | global-modules "^0.2.3" 2715 | 2716 | resolve-from@^1.0.0: 2717 | version "1.0.1" 2718 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 2719 | 2720 | resolve-from@^2.0.0: 2721 | version "2.0.0" 2722 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 2723 | 2724 | resolve@^1.1.6: 2725 | version "1.2.0" 2726 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" 2727 | 2728 | restore-cursor@^1.0.1: 2729 | version "1.0.1" 2730 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 2731 | dependencies: 2732 | exit-hook "^1.0.0" 2733 | onetime "^1.0.0" 2734 | 2735 | right-align@^0.1.1: 2736 | version "0.1.3" 2737 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 2738 | dependencies: 2739 | align-text "^0.1.1" 2740 | 2741 | right-pad@^1.0.1: 2742 | version "1.0.1" 2743 | resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" 2744 | 2745 | rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.4: 2746 | version "2.5.4" 2747 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 2748 | dependencies: 2749 | glob "^7.0.5" 2750 | 2751 | run-async@^0.1.0: 2752 | version "0.1.0" 2753 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 2754 | dependencies: 2755 | once "^1.3.0" 2756 | 2757 | run-async@^2.2.0: 2758 | version "2.3.0" 2759 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 2760 | dependencies: 2761 | is-promise "^2.1.0" 2762 | 2763 | run-parallel@^1.1.2: 2764 | version "1.1.6" 2765 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" 2766 | 2767 | rx-lite@^3.1.2: 2768 | version "3.1.2" 2769 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 2770 | 2771 | rx@^4.1.0: 2772 | version "4.1.0" 2773 | resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" 2774 | 2775 | "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.1.0, semver@^5.3.0: 2776 | version "5.3.0" 2777 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2778 | 2779 | set-blocking@^2.0.0: 2780 | version "2.0.0" 2781 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2782 | 2783 | set-getter@^0.1.0: 2784 | version "0.1.0" 2785 | resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" 2786 | dependencies: 2787 | to-object-path "^0.3.0" 2788 | 2789 | setprototypeof@1.0.2: 2790 | version "1.0.2" 2791 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" 2792 | 2793 | shebang-command@^1.2.0: 2794 | version "1.2.0" 2795 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2796 | dependencies: 2797 | shebang-regex "^1.0.0" 2798 | 2799 | shebang-regex@^1.0.0: 2800 | version "1.0.0" 2801 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2802 | 2803 | shell-quote@^1.6.1: 2804 | version "1.6.1" 2805 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" 2806 | dependencies: 2807 | array-filter "~0.0.0" 2808 | array-map "~0.0.0" 2809 | array-reduce "~0.0.0" 2810 | jsonify "~0.0.0" 2811 | 2812 | shelljs@0.7.5, shelljs@^0.7.5: 2813 | version "0.7.5" 2814 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" 2815 | dependencies: 2816 | glob "^7.0.0" 2817 | interpret "^1.0.0" 2818 | rechoir "^0.6.2" 2819 | 2820 | signal-exit@^2.0.0: 2821 | version "2.1.2" 2822 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" 2823 | 2824 | signal-exit@^3.0.0, signal-exit@^3.0.1: 2825 | version "3.0.2" 2826 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2827 | 2828 | slice-ansi@0.0.4: 2829 | version "0.0.4" 2830 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 2831 | 2832 | slide@^1.1.5: 2833 | version "1.1.6" 2834 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 2835 | 2836 | sntp@1.x.x: 2837 | version "1.0.9" 2838 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2839 | dependencies: 2840 | hoek "2.x.x" 2841 | 2842 | source-map@^0.4.4: 2843 | version "0.4.4" 2844 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 2845 | dependencies: 2846 | amdefine ">=0.0.4" 2847 | 2848 | source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: 2849 | version "0.5.6" 2850 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 2851 | 2852 | spawn-sync@^1.0.15: 2853 | version "1.0.15" 2854 | resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" 2855 | dependencies: 2856 | concat-stream "^1.4.7" 2857 | os-shim "^0.1.2" 2858 | 2859 | spawn-wrap@1.2.4: 2860 | version "1.2.4" 2861 | resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40" 2862 | dependencies: 2863 | foreground-child "^1.3.3" 2864 | mkdirp "^0.5.0" 2865 | os-homedir "^1.0.1" 2866 | rimraf "^2.3.3" 2867 | signal-exit "^2.0.0" 2868 | which "^1.2.4" 2869 | 2870 | spdx-correct@~1.0.0: 2871 | version "1.0.2" 2872 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2873 | dependencies: 2874 | spdx-license-ids "^1.0.2" 2875 | 2876 | spdx-expression-parse@~1.0.0: 2877 | version "1.0.4" 2878 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2879 | 2880 | spdx-license-ids@^1.0.2: 2881 | version "1.2.2" 2882 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2883 | 2884 | split2@^2.0.0: 2885 | version "2.1.1" 2886 | resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" 2887 | dependencies: 2888 | through2 "^2.0.2" 2889 | 2890 | split@0.3: 2891 | version "0.3.3" 2892 | resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" 2893 | dependencies: 2894 | through "2" 2895 | 2896 | split@^1.0.0: 2897 | version "1.0.0" 2898 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 2899 | dependencies: 2900 | through "2" 2901 | 2902 | sprintf-js@~1.0.2: 2903 | version "1.0.3" 2904 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2905 | 2906 | sshpk@^1.7.0: 2907 | version "1.10.2" 2908 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa" 2909 | dependencies: 2910 | asn1 "~0.2.3" 2911 | assert-plus "^1.0.0" 2912 | dashdash "^1.12.0" 2913 | getpass "^0.1.1" 2914 | optionalDependencies: 2915 | bcrypt-pbkdf "^1.0.0" 2916 | ecc-jsbn "~0.1.1" 2917 | jodid25519 "^1.0.0" 2918 | jsbn "~0.1.0" 2919 | tweetnacl "~0.14.0" 2920 | 2921 | standard-engine@~5.2.0: 2922 | version "5.2.0" 2923 | resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-5.2.0.tgz#400660ae5acce8afd4db60ff2214a9190ad790a3" 2924 | dependencies: 2925 | deglob "^2.0.0" 2926 | find-root "^1.0.0" 2927 | get-stdin "^5.0.1" 2928 | home-or-tmp "^2.0.0" 2929 | minimist "^1.1.0" 2930 | pkg-config "^1.0.1" 2931 | 2932 | standard-version@^4.0.0: 2933 | version "4.0.0" 2934 | resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-4.0.0.tgz#e578cefd43ab7b02944bd7569525052eac1b9787" 2935 | dependencies: 2936 | chalk "^1.1.3" 2937 | conventional-changelog "^1.1.0" 2938 | conventional-recommended-bump "^0.3.0" 2939 | figures "^1.5.0" 2940 | fs-access "^1.0.0" 2941 | object-assign "^4.1.0" 2942 | semver "^5.1.0" 2943 | yargs "^6.0.0" 2944 | 2945 | standard@^8.6.0: 2946 | version "8.6.0" 2947 | resolved "https://registry.yarnpkg.com/standard/-/standard-8.6.0.tgz#635132be7bfb567c2921005f30f9e350e4752aad" 2948 | dependencies: 2949 | eslint "~3.10.2" 2950 | eslint-config-standard "6.2.1" 2951 | eslint-config-standard-jsx "3.2.0" 2952 | eslint-plugin-promise "~3.4.0" 2953 | eslint-plugin-react "~6.7.1" 2954 | eslint-plugin-standard "~2.0.1" 2955 | standard-engine "~5.2.0" 2956 | 2957 | "statuses@>= 1.2.1 < 2", "statuses@>= 1.3.1 < 2", statuses@^1.2.0: 2958 | version "1.3.1" 2959 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 2960 | 2961 | stream-combiner@~0.0.4: 2962 | version "0.0.4" 2963 | resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" 2964 | dependencies: 2965 | duplexer "~0.1.1" 2966 | 2967 | stream-exhaust@^1.0.1: 2968 | version "1.0.1" 2969 | resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.1.tgz#c0c4455e54ce5a179ca8736e73334b4e7fd67553" 2970 | 2971 | string-width@^1.0.1, string-width@^1.0.2: 2972 | version "1.0.2" 2973 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2974 | dependencies: 2975 | code-point-at "^1.0.0" 2976 | is-fullwidth-code-point "^1.0.0" 2977 | strip-ansi "^3.0.0" 2978 | 2979 | string-width@^2.0.0: 2980 | version "2.0.0" 2981 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 2982 | dependencies: 2983 | is-fullwidth-code-point "^2.0.0" 2984 | strip-ansi "^3.0.0" 2985 | 2986 | string.prototype.padend@^3.0.0: 2987 | version "3.0.0" 2988 | resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" 2989 | dependencies: 2990 | define-properties "^1.1.2" 2991 | es-abstract "^1.4.3" 2992 | function-bind "^1.0.2" 2993 | 2994 | string_decoder@~0.10.x: 2995 | version "0.10.31" 2996 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2997 | 2998 | stringstream@~0.0.4: 2999 | version "0.0.5" 3000 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 3001 | 3002 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 3003 | version "3.0.1" 3004 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 3005 | dependencies: 3006 | ansi-regex "^2.0.0" 3007 | 3008 | strip-bom@^2.0.0: 3009 | version "2.0.0" 3010 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 3011 | dependencies: 3012 | is-utf8 "^0.2.0" 3013 | 3014 | strip-bom@^3.0.0: 3015 | version "3.0.0" 3016 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 3017 | 3018 | strip-indent@^1.0.1: 3019 | version "1.0.1" 3020 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 3021 | dependencies: 3022 | get-stdin "^4.0.1" 3023 | 3024 | strip-json-comments@2.0.1: 3025 | version "2.0.1" 3026 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 3027 | 3028 | strip-json-comments@~1.0.1: 3029 | version "1.0.4" 3030 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 3031 | 3032 | success-symbol@^0.1.0: 3033 | version "0.1.0" 3034 | resolved "https://registry.yarnpkg.com/success-symbol/-/success-symbol-0.1.0.tgz#24022e486f3bf1cdca094283b769c472d3b72897" 3035 | 3036 | superagent@^3.0.0: 3037 | version "3.4.2" 3038 | resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.4.2.tgz#aa9a00f21720e230a6e7e9d7f07e0ab84509b833" 3039 | dependencies: 3040 | component-emitter "^1.2.0" 3041 | cookiejar "^2.0.6" 3042 | debug "^2.2.0" 3043 | extend "^3.0.0" 3044 | form-data "^2.1.1" 3045 | formidable "^1.1.1" 3046 | methods "^1.1.1" 3047 | mime "^1.3.4" 3048 | qs "^6.1.0" 3049 | readable-stream "^2.0.5" 3050 | 3051 | supertest@^3.0.0: 3052 | version "3.0.0" 3053 | resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.0.0.tgz#8d4bb68fd1830ee07033b1c5a5a9a4021c965296" 3054 | dependencies: 3055 | methods "~1.1.2" 3056 | superagent "^3.0.0" 3057 | 3058 | supports-color@^2.0.0: 3059 | version "2.0.0" 3060 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 3061 | 3062 | supports-color@^3.1.2: 3063 | version "3.2.3" 3064 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 3065 | dependencies: 3066 | has-flag "^1.0.0" 3067 | 3068 | table@^3.7.8: 3069 | version "3.8.3" 3070 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 3071 | dependencies: 3072 | ajv "^4.7.0" 3073 | ajv-keywords "^1.0.0" 3074 | chalk "^1.1.1" 3075 | lodash "^4.0.0" 3076 | slice-ansi "0.0.4" 3077 | string-width "^2.0.0" 3078 | 3079 | test-exclude@^3.3.0: 3080 | version "3.3.0" 3081 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" 3082 | dependencies: 3083 | arrify "^1.0.1" 3084 | micromatch "^2.3.11" 3085 | object-assign "^4.1.0" 3086 | read-pkg-up "^1.0.1" 3087 | require-main-filename "^1.0.1" 3088 | 3089 | text-extensions@^1.0.0: 3090 | version "1.4.0" 3091 | resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9" 3092 | 3093 | text-table@~0.2.0: 3094 | version "0.2.0" 3095 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 3096 | 3097 | through2@^2.0.0, through2@^2.0.2: 3098 | version "2.0.3" 3099 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 3100 | dependencies: 3101 | readable-stream "^2.1.5" 3102 | xtend "~4.0.1" 3103 | 3104 | through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1: 3105 | version "2.3.8" 3106 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 3107 | 3108 | tmp@^0.0.29: 3109 | version "0.0.29" 3110 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" 3111 | dependencies: 3112 | os-tmpdir "~1.0.1" 3113 | 3114 | to-fast-properties@^1.0.1: 3115 | version "1.0.2" 3116 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 3117 | 3118 | to-object-path@^0.3.0: 3119 | version "0.3.0" 3120 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 3121 | dependencies: 3122 | kind-of "^3.0.2" 3123 | 3124 | tough-cookie@~2.3.0: 3125 | version "2.3.2" 3126 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 3127 | dependencies: 3128 | punycode "^1.4.1" 3129 | 3130 | trim-newlines@^1.0.0: 3131 | version "1.0.0" 3132 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 3133 | 3134 | trim-off-newlines@^1.0.0: 3135 | version "1.0.1" 3136 | resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" 3137 | 3138 | trim-right@^1.0.1: 3139 | version "1.0.1" 3140 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 3141 | 3142 | try-catch-callback@^2.0.0: 3143 | version "2.0.1" 3144 | resolved "https://registry.yarnpkg.com/try-catch-callback/-/try-catch-callback-2.0.1.tgz#54b92782f5c8032119248feca5b7716e3f73a18c" 3145 | 3146 | try-catch-core@^2.0.2: 3147 | version "2.0.2" 3148 | resolved "https://registry.yarnpkg.com/try-catch-core/-/try-catch-core-2.0.2.tgz#fd3a7cbf61efd08e584a5756a04bf16f50c53b36" 3149 | dependencies: 3150 | dezalgo "^1.0.3" 3151 | is-async-function "^1.2.2" 3152 | lazy-cache "^2.0.1" 3153 | once "^1.4.0" 3154 | try-catch-callback "^2.0.0" 3155 | 3156 | tryit@^1.0.1: 3157 | version "1.0.3" 3158 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 3159 | 3160 | tunnel-agent@~0.4.1: 3161 | version "0.4.3" 3162 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 3163 | 3164 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 3165 | version "0.14.5" 3166 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 3167 | 3168 | type-check@~0.3.2: 3169 | version "0.3.2" 3170 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 3171 | dependencies: 3172 | prelude-ls "~1.1.2" 3173 | 3174 | type-is@^1.5.5: 3175 | version "1.6.14" 3176 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" 3177 | dependencies: 3178 | media-typer "0.3.0" 3179 | mime-types "~2.1.13" 3180 | 3181 | typedarray@^0.0.6: 3182 | version "0.0.6" 3183 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 3184 | 3185 | uglify-js@^2.6: 3186 | version "2.7.5" 3187 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" 3188 | dependencies: 3189 | async "~0.2.6" 3190 | source-map "~0.5.1" 3191 | uglify-to-browserify "~1.0.0" 3192 | yargs "~3.10.0" 3193 | 3194 | uglify-to-browserify@~1.0.0: 3195 | version "1.0.2" 3196 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 3197 | 3198 | uniq@^1.0.1: 3199 | version "1.0.1" 3200 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 3201 | 3202 | user-home@^2.0.0: 3203 | version "2.0.0" 3204 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 3205 | dependencies: 3206 | os-homedir "^1.0.0" 3207 | 3208 | util-deprecate@~1.0.1: 3209 | version "1.0.2" 3210 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 3211 | 3212 | uuid@^3.0.0: 3213 | version "3.0.1" 3214 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 3215 | 3216 | validate-npm-package-license@^3.0.1: 3217 | version "3.0.1" 3218 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 3219 | dependencies: 3220 | spdx-correct "~1.0.0" 3221 | spdx-expression-parse "~1.0.0" 3222 | 3223 | vary@^1.0.0: 3224 | version "1.1.0" 3225 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" 3226 | 3227 | verror@1.3.6: 3228 | version "1.3.6" 3229 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 3230 | dependencies: 3231 | extsprintf "1.0.2" 3232 | 3233 | which-module@^1.0.0: 3234 | version "1.0.0" 3235 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 3236 | 3237 | which@1.2.x, which@^1.2.12, which@^1.2.4, which@^1.2.9: 3238 | version "1.2.12" 3239 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 3240 | dependencies: 3241 | isexe "^1.1.1" 3242 | 3243 | window-size@0.1.0: 3244 | version "0.1.0" 3245 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 3246 | 3247 | word-wrap@^1.0.3: 3248 | version "1.2.1" 3249 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.1.tgz#248f459b465d179a17bc407c854d3151d07e45d8" 3250 | 3251 | wordwrap@0.0.2: 3252 | version "0.0.2" 3253 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 3254 | 3255 | wordwrap@~0.0.2: 3256 | version "0.0.3" 3257 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 3258 | 3259 | wordwrap@~1.0.0: 3260 | version "1.0.0" 3261 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 3262 | 3263 | wrap-ansi@^2.0.0: 3264 | version "2.1.0" 3265 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 3266 | dependencies: 3267 | string-width "^1.0.1" 3268 | strip-ansi "^3.0.1" 3269 | 3270 | wrappy@1: 3271 | version "1.0.2" 3272 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 3273 | 3274 | write-file-atomic@^1.1.4: 3275 | version "1.3.1" 3276 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" 3277 | dependencies: 3278 | graceful-fs "^4.1.11" 3279 | imurmurhash "^0.1.4" 3280 | slide "^1.1.5" 3281 | 3282 | write@^0.2.1: 3283 | version "0.2.1" 3284 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 3285 | dependencies: 3286 | mkdirp "^0.5.1" 3287 | 3288 | xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: 3289 | version "4.0.1" 3290 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 3291 | 3292 | y18n@^3.2.1: 3293 | version "3.2.1" 3294 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 3295 | 3296 | yallist@^2.0.0: 3297 | version "2.0.0" 3298 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" 3299 | 3300 | yargs-parser@^4.0.2, yargs-parser@^4.2.0: 3301 | version "4.2.1" 3302 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" 3303 | dependencies: 3304 | camelcase "^3.0.0" 3305 | 3306 | yargs@^6.0.0, yargs@^6.6.0: 3307 | version "6.6.0" 3308 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" 3309 | dependencies: 3310 | camelcase "^3.0.0" 3311 | cliui "^3.2.0" 3312 | decamelize "^1.1.1" 3313 | get-caller-file "^1.0.1" 3314 | os-locale "^1.4.0" 3315 | read-pkg-up "^1.0.1" 3316 | require-directory "^2.1.1" 3317 | require-main-filename "^1.0.1" 3318 | set-blocking "^2.0.0" 3319 | string-width "^1.0.2" 3320 | which-module "^1.0.0" 3321 | y18n "^3.2.1" 3322 | yargs-parser "^4.2.0" 3323 | 3324 | yargs@~3.10.0: 3325 | version "3.10.0" 3326 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 3327 | dependencies: 3328 | camelcase "^1.0.2" 3329 | cliui "^2.1.0" 3330 | decamelize "^1.0.0" 3331 | window-size "0.1.0" 3332 | --------------------------------------------------------------------------------