├── .gitignore
├── LICENSE
├── README.md
├── client
    ├── package.json
    ├── public
    │   └── index.html
    ├── src
    │   ├── components
    │   │   ├── AddItem.jsx
    │   │   └── ItemList.jsx
    │   ├── index.js
    │   └── queries
    │   │   └── item.queries.js
    └── yarn.lock
└── server
    ├── app.js
    ├── db.js
    ├── package.json
    ├── schema
        ├── item
        │   ├── item.resolvers.js
        │   └── item.type.js
        ├── resolvers.js
        ├── root-mutation
        │   ├── root-mutation.resolvers.js
        │   └── root-mutation.type.js
        ├── root-query
        │   ├── root-query.resolvers.js
        │   └── root-query.type.js
        ├── schema.js
        └── user
        │   └── user.type.js
    └── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
 1 | .idea/
 2 | 
 3 | # Logs
 4 | logs
 5 | *.log
 6 | npm-debug.log*
 7 | yarn-debug.log*
 8 | yarn-error.log*
 9 | 
10 | # Runtime data
11 | pids
12 | *.pid
13 | *.seed
14 | *.pid.lock
15 | 
16 | # Directory for instrumented libs generated by jscoverage/JSCover
17 | lib-cov
18 | 
19 | # Coverage directory used by tools like istanbul
20 | coverage
21 | 
22 | # nyc test coverage
23 | .nyc_output
24 | 
25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
26 | .grunt
27 | 
28 | # Bower dependency directory (https://bower.io/)
29 | bower_components
30 | 
31 | # node-waf configuration
32 | .lock-wscript
33 | 
34 | # Compiled binary addons (http://nodejs.org/api/addons.html)
35 | build/Release
36 | 
37 | # Dependency directories
38 | node_modules/
39 | jspm_packages/
40 | 
41 | # Typescript v1 declaration files
42 | typings/
43 | 
44 | # Optional npm cache directory
45 | .npm
46 | 
47 | # Optional eslint cache
48 | .eslintcache
49 | 
50 | # Optional REPL history
51 | .node_repl_history
52 | 
53 | # Output of 'npm pack'
54 | *.tgz
55 | 
56 | # Yarn Integrity file
57 | .yarn-integrity
58 | 
59 | # dotenv environment variables file
60 | .env
61 | 
62 | 
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | MIT License
 2 | 
 3 | Copyright (c) 2017 Theo Gravity
 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 | 
  2 | **Update 9/12/21**: I've been using `giraphql` with good success. See the example repo here: https://github.com/theogravity/graphql-giraphql-server-example/
  3 | 
  4 | **UPDATE 12/16/19**: After spending months building a production-level GraphQL server complete with auth+ACL, I do not recommend the server-side approach described in this tutorial (this tutorial is fine for getting your feet wet, but it's not scalable), and recommend using the following libs instead:
  5 | 
  6 | - https://github.com/graphql/graphql-js - The core difference between using this library and the approach described in this document is that you're programatically defining the schema. IMO, it gives you much more control over the logic of how the schema works. It also plays extremely well with `join-monster`. If you're building a large-scale GraphQL server, use programatic definitions instead.
  7 | - https://github.com/Vincit/objection.js - (I know people are scared of the word ORM lately, but I promise you, this is extremely-light-weight. It uses `knex` for its operations - I use this library for mutations only. One extremely useful feature is that it supports a graph-based insert/update (aka upsert), where if your mutation input is nested and can affect multiple models, the `graphInsert`/ `graphUpdate` methods are extremely useful.)
  8 | - https://github.com/graphql/graphiql - It's a browser-based GraphQL client. Really useful for testing your implementations
  9 | - https://github.com/APIs-guru/graphql-voyager - Great way to visualize your GraphQL schema and see how the relay connections work
 10 | 
 11 | I will eventually do a tutorial on how to build an enterprise-level GraphQL server. Until then, try using the above libraries.
 12 | 
 13 | 
 14 | 
 15 | 
 16 | 
 17 | - [GraphQL Quick-Start Guide](#graphql-quick-start-guide)
 18 |   - [Prerequisites](#prerequisites)
 19 | - [Server-Side Development](#server-side-development)
 20 |   - [Required libraries](#required-libraries)
 21 |   - [Directory structure](#directory-structure)
 22 |   - [Setting up the GraphQL server](#setting-up-the-graphql-server)
 23 |   - [Defining the Schema](#defining-the-schema)
 24 |     - [Define Types](#define-types)
 25 |     - [Define Root-Level Query Type](#define-root-level-query-type)
 26 |       - [Example](#example)
 27 |     - [Define Resolvers](#define-resolvers)
 28 |       - [Implement the `RootQuery` resolvers](#implement-the-rootquery-resolvers)
 29 |       - [Implement the `Item` resolvers](#implement-the-item-resolvers)
 30 |     - [Resolver Summary](#resolver-summary)
 31 |   - [Putting the Schema + Resolvers Together](#putting-the-schema--resolvers-together)
 32 |   - [Run the server](#run-the-server)
 33 | - [Client-side Development](#client-side-development)
 34 |   - [Required libraries](#required-libraries-1)
 35 |   - [Directory structure](#directory-structure-1)
 36 |   - [Apollo Client + Routing setup](#apollo-client--routing-setup)
 37 |   - [Define queries](#define-queries)
 38 |   - [`ItemList` component](#itemlist-component)
 39 |   - [Run the server](#run-the-server-1)
 40 | - [Mutations](#mutations)
 41 |   - [Define Server-side mutation](#define-server-side-mutation)
 42 |     - [Define the `RootMutation` type entrypoint definitions](#define-the-rootmutation-type-entrypoint-definitions)
 43 |     - [Define the `RootMutation` resolver](#define-the-rootmutation-resolver)
 44 |     - [Add the `RootMutation` resolver to the master resolvers](#add-the-rootmutation-resolver-to-the-master-resolvers)
 45 |     - [Register the `RootMutation` type to the schema](#register-the-rootmutation-type-to-the-schema)
 46 |     - [Test the implementation](#test-the-implementation)
 47 |   - [Client-side mutation integration](#client-side-mutation-integration)
 48 |     - [Create an `addItem` query](#create-an-additem-query)
 49 |     - [Create an `AddItem` component](#create-an-additem-component)
 50 |     - [Add the route to the `AddItem` component](#add-the-route-to-the-additem-component)
 51 |     - [Test implementation](#test-implementation)
 52 | 
 53 | 
 54 | 
 55 | # GraphQL Quick-Start Guide
 56 | 
 57 | Goal: Learn how GraphQL development works on the server + client at a basic level. Hit the ground running with
 58 | something working.
 59 | 
 60 | The following uses Apollo tooling. Apollo was chosen because it was easy to develop with using their tooling compared to Relay Classic.
 61 | 
 62 | https://www.apollodata.com/
 63 | 
 64 | https://www.codazen.com/choosing-graphql-client-apollo-vs-relay/
 65 | 
 66 | ## Prerequisites
 67 | 
 68 | - You should be familiar with setting up a node.js server / babel transpiling / bundling (if necessary)
 69 | - Read the basics of how GraphQL queries / types work - http://graphql.org/learn/
 70 |   - If you're a bit unclear on either, the guide will hopefully show how it works and fits together
 71 | - ES6 usage - uncommonly used ES6 elements are clarified in the examples
 72 | - You've done some OOP / data(base) modeling
 73 | 
 74 | The Apollo Developer Chrome extension is very useful. Gives you the view of the underlying redux store state, and you can also try queries as well.
 75 | 
 76 | https://chrome.google.com/webstore/detail/apollo-client-developer-t/jdkknkkbebbapilgoeccciglkfbmbnfm?hl=en-US
 77 | 
 78 | # Server-Side Development
 79 | 
 80 | Goal: Understand what server-side development / structure is like.
 81 | 
 82 | Resources used:
 83 | 
 84 | http://dev.apollodata.com/tools/
 85 | 
 86 | https://github.com/Akryum/apollo-server-example
 87 | 
 88 | https://github.com/apollographql/apollo-server-tutorial
 89 | 
 90 | ## Required libraries
 91 | 
 92 | - graphql - facebook graphql library
 93 | - graphql-server-express - Apollo-developed
 94 | - graphql-tools - Apollo-developed server tooling
 95 | - cors
 96 | - body-parser
 97 | - express
 98 | 
 99 | ## Directory structure
100 | 
101 | At the time of this writing, I'm unsure what the official directory structure should be. I organized items into what I thought made sense while I was learning this.
102 | 
103 | Each item will be explained in the guide.
104 | 
105 | ```
106 | ├── schema/
107 | │   ├── item/
108 | │   │   ├── item.type.js
109 | │   │   └── item.resolvers.js
110 | │   ├── root-query/
111 | │   │   ├── root-query.type.js
112 | │   │   └── root-query.resolvers.js
113 | │   ├── user/
114 | │   │   └── user.type.js
115 | │   ├── resolvers.js
116 | │   └── schema.js
117 | ├── app.js
118 | ├── db.js
119 | └── package.json
120 | ```
121 | 
122 | ## Setting up the GraphQL server
123 | 
124 | ```javascript
125 | // app.js
126 | 
127 | import express from 'express'
128 | import cors from 'cors'
129 | import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'
130 | import bodyParser from 'body-parser'
131 | 
132 | // GraphQL Schema is imported here
133 | const graphQLSchema = `...`
134 | 
135 | // enable cors support so when the client on a different host tries to query the server
136 | // the client will not be blocked
137 | // note: these are really insecure rules to use
138 | app.use('*', cors({
139 |   origin: '*'
140 | }))
141 | 
142 | // graphQL endpoint
143 | app.use('/graphql', bodyParser.json(), graphqlExpress({ schema: graphQLSchema }))
144 | 
145 | // graphQL console
146 | app.use('/graphiql', graphiqlExpress({
147 |   endpointURL: '/graphql'
148 | }))
149 | 
150 | app.listen(3000, () => {
151 |   console.log(`Ready in ${Date.now() - start} ms!`)
152 |   console.log('Listening on http://localhost:3000/')
153 | })
154 | ```
155 | 
156 | ## Defining the Schema
157 | 
158 | http://graphql.org/learn/schema/
159 | 
160 | ### Define Types
161 | 
162 | Define types for objects you want to allow GraphQL to query on.
163 | 
164 | ```javascript
165 | // schema/item/item.type.js
166 | 
167 | const ItemType = `
168 |   type Item {
169 |     # Item identifier
170 |     id: ID!
171 |     # Item name
172 |     name: String!
173 |     # Item description
174 |     desc: String
175 |     # Owner of the item
176 |     owner: User
177 |   }
178 | `
179 | 
180 | export default ItemType
181 | ```
182 | 
183 | ### Define Root-Level Query Type
184 | 
185 | A root-level query is defined just like any other type, but they are used as the main entrypoint into a GraphQL query.
186 | 
187 | #### Example
188 | 
189 | To query for an item and get a list of items at the same time, we might perform the following query:
190 | 
191 | ```graphQL
192 | query {
193 |   item (id: 1) {
194 |     name
195 |   }
196 |   items {
197 |     id
198 |     name
199 |   }
200 | }
201 | ```
202 | 
203 | In this situation, we have two main entrypoints:
204 | 
205 | - `item` (get a single item)
206 | - `items` (get all item)
207 | 
208 | *Note: You can name the entrypoint whatever you want, some people might use `getItem` or `getItems`,
209 | but the convention seems to just be the object name itself for reading items.*
210 | 
211 | In order to expose these entrypoints, we'll define the following:
212 | 
213 | ```javascript
214 | // schema/root-query/root-query.type.js
215 | 
216 | const queryEntryPoints = `
217 |   type RootQuery {
218 |     # get an item
219 |     item(id: String!): Item,
220 |     # returns an array of items
221 |     items: [Item]
222 |   }
223 | `
224 | 
225 | export default queryEntryPoints
226 | ```
227 | 
228 | *Note: the name of the type (RootQuery in this example), can be named anything you want.*
229 | 
230 | ### Define Resolvers
231 | 
232 | Resolvers perform lookups on the fields of a type when that field is being requested and the data is unavailable.
233 | 
234 | #### Implement the `RootQuery` resolvers
235 | 
236 | In the sample query above, GraphQL will be looking at the `RootQuery` for an `item` and `items` field.
237 | 
238 | For each field, we will need to define a resolver.
239 | 
240 | http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-function-signature
241 | 
242 | ```javascript
243 | // schema/root-query/root-query.resolvers.js
244 | 
245 | // must match the field items in RootQuery
246 | const rootQueryResolvers = {
247 |   // this is the resolver for RootQuery.item
248 |   // the first param represents the parent object, which in this case, would be the RootQuery
249 |   // the second param is incoming parameters
250 |   async item (rootObj, { id }) {
251 |     // returns an object that matches the ItemType fields
252 |     return await getItem(id)
253 |   },
254 |   // this is the resolver for RootQuery.items
255 |   async items () {
256 |     // would return an array of Item
257 |     return await getItems()
258 |   }
259 | }
260 | 
261 | export default rootQueryResolvers
262 | ```
263 | 
264 | #### Implement the `Item` resolvers
265 | 
266 | Let's assume we have the following incoming query, which requests the following:
267 | 
268 | - The name of the item
269 | - The item owner's username
270 | 
271 | ```graphQL
272 | query {
273 |   item (id: 1) {
274 |     name
275 |     owner {
276 |        username
277 |     }
278 |   }
279 | }
280 | ```
281 | 
282 | In order to return the data back:
283 | 
284 | - GraphQL calls the `RootQuery#item()` resolver
285 | - `getItem(id)` implemented in `RootQuery#item()` would be defined to a database fetch for the item using the `id`
286 | - The database returns something like the following, which `RootQuery#item()` will return
287 | 
288 | ```javascript
289 | {
290 |   id: 1,
291 |   name: 'Test Item',
292 |   description: 'This is a test item',
293 |   ownerId: 234
294 | }
295 | ```
296 | 
297 | - GraphQL attempts to map the object properties to the `Item` type (since the field `RootQuery.item` returns an `Item`)
298 | - GraphQL notices we need the `Item.owner` field, but the data is not included in the above returned data
299 | - GraphQL will now call a resolver for `Item.owner` to attach the owner
300 | 
301 | ```javascript
302 | // schema/item/item.resolvers.js
303 | 
304 | // must match the field names in the Item type for field data
305 | // that cannot be obtained at the parent level (eg RootQuery#item())
306 | // meaning not every field needs a resolver implementation
307 | const itemResolvers = {
308 |   // this is the resolver for Item.owner
309 |   // the first param represents the parent object, which in this case, would be the database results
310 |   // that were mapped to the Item fields
311 |   async owner (item) {
312 |     // returns an object that matches a User type (that we need to define)
313 |     return await getUser(item.ownerId)
314 |   }
315 | }
316 | 
317 | export default itemResolvers
318 | ```
319 | 
320 | ```javascript
321 | // schema/user/user.type.js
322 | 
323 | const userType = `
324 |   type User {
325 |     # User identifier
326 |     id: ID!
327 |     # The user's username
328 |     username: String!
329 |   }
330 | `
331 | 
332 | export default userType
333 | ```
334 | 
335 | - The `getUser(item.ownerId)` implementation would be a database call to fetch the user; the returned data
336 | should map to the `User` type fields
337 | - GraphQL now has the data for item name and owner's username and returns the result to the client
338 | 
339 | ### Resolver Summary
340 | 
341 | - Object lookups start at the root, in this case the `RootQuery` type was defined with an `item` field
342 | - The `RootQuery#item()` resolver returned an object that mapped to most fields of the `Item` type, but we were lacking the `Item.owner` data
343 | - To get the `Item.owner` data, GraphQL called the `Item#owner()` resolver, which did a fetch to get the user data
344 | - The results from `Item#owner()` is attached to the `Item.owner` field
345 | - We now have the item's name and the owner username, so GraphQL returns just those pieces to the client
346 | 
347 | ## Putting the Schema + Resolvers Together
348 | 
349 | We combine our resolvers into a single package
350 | 
351 | ```javascript
352 | // schema/resolvers.js
353 | 
354 | import Item from './item/item.resolvers'
355 | import RootQuery from './root-query/root-query.resolvers'
356 | 
357 | export default {
358 |   // no need to define a User resolver
359 |   // since the Item retrieves it
360 |   Item,
361 |   RootQuery
362 | }
363 | ```
364 | 
365 | Our entire schema is built here
366 | 
367 | ```javascript
368 | // schema/schema.js
369 | 
370 | import UserType from './user/user.type'
371 | import ItemType from './item/item.type'
372 | 
373 | import RootQuery from './root-query/root-query.type'
374 | import resolvers from './resolvers'
375 | 
376 | import { makeExecutableSchema } from 'graphql-tools'
377 | 
378 | // the schema type only has two properties: query and mutations
379 | // the RootQuery contains the root entry points into graphQL
380 | // If you want to define more entry points, you add to RootQuery
381 | 
382 | // Note: the RootQuery defined in `schema { }` is NOT the `import RootQuery`
383 | // It is the reference to the `type RootQuery` definition
384 | // Ex: if you renamed `type RootQuery` -> `type MasterQuery`, then
385 | // it should be `schema { query: MasterQuery }`
386 | const SchemaDefinition = `
387 |   schema {
388 |     query: RootQuery
389 |   }
390 | `
391 | 
392 | const schema = makeExecutableSchema({
393 |   // Add the type definitions to the schema
394 |   typeDefs: [
395 |     SchemaDefinition,
396 |     RootQuery,
397 |     UserType,
398 |     ItemType
399 |   ],
400 |   // performs field lookups for a specific type
401 |   resolvers
402 | })
403 | 
404 | export default schema
405 | ```
406 | 
407 | Now hook up the schema
408 | 
409 | ```javascript
410 | // app.js
411 | 
412 | import express from 'express'
413 | import cors from 'cors'
414 | import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'
415 | import bodyParser from 'body-parser'
416 | 
417 | import schema from './schema/schema.js'
418 | 
419 | // GraphQL Schema is imported here
420 | const graphQLSchema = schema
421 | 
422 | ...
423 | ```
424 | 
425 | ## Run the server
426 | 
427 | `npm start`
428 | 
429 | You can try a sample query here through the GraphQL console:
430 | 
431 | http://localhost:3000/graphiql?query=query%20getItems%20%7B%0A%20%20items%20%7B%0A%20%20%20%20id%0A%20%20%7D%0A%7D&operationName=getItems
432 | 
433 | # Client-side Development
434 | 
435 | Goal: Implement some really basic stuff to test the server implementation. Also understand what dev is like using the Apollo client.
436 | 
437 | This does not cover:
438 | 
439 | - How to break up your GraphQL queries into fragments
440 | - How to perform mutations on your data (they're barely any different than defining calling a query)
441 | - Best practices on how to structure your files, break apart your components to be more **dumb**, etc
442 | 
443 | Resources used:
444 | 
445 | https://www.learnapollo.com/tutorial-react/react-01
446 | 
447 | ## Required libraries
448 | 
449 | - react
450 | - react-dom
451 | - apollo-client
452 | - react-apollo
453 | - prop-types
454 | - graphql-tag
455 | - react-router-dom
456 | 
457 | ## Directory structure
458 | 
459 | This structure is really bare-bones and has no rhyme or reason to it, it was just made to get off the ground running quickly to understand the client implementation.
460 | 
461 | ```
462 | ├── queries/
463 | │   └── item.queries.js
464 | ├── components/
465 | │   └── ItemList.jsx
466 | ├── index.js
467 | └── package.json
468 | ```
469 | 
470 | ## Apollo Client + Routing setup
471 | 
472 | ```javascript
473 | // index.js
474 | 
475 | import React from 'react'
476 | import ReactDOM from 'react-dom'
477 | 
478 | // The ApolloClient allows you to call the GraphQL API server
479 | // and parses responses
480 | import ApolloClient, { createNetworkInterface } from 'apollo-client'
481 | 
482 | // The ApolloProvider uses redux underneath the hood
483 | // and provides data connections to your components
484 | import { ApolloProvider } from 'react-apollo'
485 | 
486 | import {
487 |   BrowserRouter as Router,
488 |   Route
489 | } from 'react-router-dom'
490 | 
491 | import ItemList from './components/ItemList.jsx'
492 | 
493 | const client = new ApolloClient({
494 |   // replace the uri with your server's host/port
495 |   networkInterface: createNetworkInterface({ uri: 'http://localhost:3000/graphql'}),
496 | })
497 | 
498 | ReactDOM.render((
499 |     
500 |       
501 |         
502 |           
504 |        
505 |      
506 |   ),
507 |   document.getElementById('root')
508 | )
509 | ```
510 | 
511 | ## Define queries
512 | 
513 | ```javascript
514 | // queries/item.queries.js
515 | 
516 | import gql from 'graphql-tag'
517 | 
518 | export default {
519 |   // this is a feature called template tags
520 |   // https://developers.google.com/web/updates/2015/01/ES6-Template-Strings#tagged_templates
521 |   getItemList: gql`query ItemListQuery {
522 |     items {
523 |       id
524 |       name,
525 |       owner {
526 |         username
527 |       }
528 |     }
529 |   }`
530 | }
531 | 
532 | ```
533 | 
534 | ## `ItemList` component
535 | 
536 | ```javascript
537 | // components/ItemList.jsx
538 | import React from 'react'
539 | import PropTypes from 'prop-types'
540 | import { graphql } from 'react-apollo'
541 | import itemQueries from '../queries/item.queries.js'
542 | 
543 | class ItemList extends React.Component {
544 |   render () {
545 |     const {
546 |       data
547 |     } = this.props
548 | 
549 |     if (data.loading) {
550 |       return (
Loading
)
551 |     }
552 | 
553 |     if (data.error) {
554 |       console.log(data.error)
555 |       return (An unexpected error occurred
)
556 |     }
557 | 
558 |     return (
559 |       
560 |         
561 |         {data.items.map((item) => {
562 |           return (
563 |             
564 |               {item.id} - {item.name} - {item.owner.username}
565 |              
566 |           )
567 |         })}
568 |          
569 |       
764 |         Save 
777 |       
778 |     )
779 |   }
780 | }
781 | 
782 | AddItem.propTypes = {
783 |   // When this prop is defined
784 |   // Apollo will look at the RootQuery.mutate schema and connect addItem
785 |   mutate: PropTypes.func.isRequired,
786 |   history: PropTypes.object
787 | }
788 | 
789 | const AddItemWithMutation = graphql(itemQueries.addItem)(AddItem)
790 | 
791 | export default AddItemWithMutation
792 | ```
793 | 
794 | ### Add the route to the `AddItem` component
795 | 
796 | ```javascript
797 | // index.js
798 | 
799 | ...
800 | 
801 | import ItemList from './components/ItemList.jsx'
802 | import AddItem from './components/AddItem.jsx'
803 | 
804 | ...
805 | 
806 | ReactDOM.render((
807 |     
808 |       
809 |         
810 |           
813 |        
814 |      
815 |   ),
816 |   document.getElementById('root')
817 | )
818 | 
819 | ```
820 | 
821 | ### Test implementation
822 | 
823 | Make sure the GraphQL server is running, then start your client server.
824 | 
825 | http://localhost:3001/add
826 | 
827 | Input some values and hit add. It'll redirect to the item list,
828 | but you'll have to refresh to see your added item (someone come in and fix this please!)
829 | 
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "graphql-apollo-client-example",
 3 |   "private": true,
 4 |   "version": "1.0.0",
 5 |   "description": "Sample Apollo client",
 6 |   "main": "index.js",
 7 |   "scripts": {
 8 |     "start": "PORT=3001 react-scripts start"
 9 |   },
10 |   "author": "Theo Gravity",
11 |   "license": "MIT",
12 |   "dependencies": {
13 |     "apollo-client": "1.5.0",
14 |     "graphql-tag": "2.4.2",
15 |     "prop-types": "15.5.10",
16 |     "react": "15.6.1",
17 |     "react-apollo": "1.4.2",
18 |     "react-dom": "15.6.1",
19 |     "react-router-dom": "4.1.1"
20 |   },
21 |   "devDependencies": {
22 |     "react-scripts": "1.0.7"
23 |   }
24 | }
25 | 
--------------------------------------------------------------------------------
/client/public/index.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 4 |     Test React App 
 7 | 
 8 | 
 9 | 
10 | 
20 | 
21 | 
22 | 
--------------------------------------------------------------------------------
/client/src/components/AddItem.jsx:
--------------------------------------------------------------------------------
 1 | import React from 'react'
 2 | import PropTypes from 'prop-types'
 3 | import { graphql } from 'react-apollo'
 4 | import itemQueries from '../queries/item.queries.js'
 5 | 
 6 | class AddItem extends React.Component {
 7 |   constructor (props) {
 8 |     super(props)
 9 |     this.state = {
10 |       name: '',
11 |       desc: ''
12 |     }
13 |   }
14 | 
15 |   handleSave = () => { // eslint-disable-line no-undef
16 |     const {
17 |       name,
18 |       desc
19 |     } = this.state
20 | 
21 |     const ownerId = 1
22 | 
23 |     // see https://www.learnapollo.com/tutorial-react/react-05/
24 |     // "Using mutations in components"
25 |     this.props.mutate({variables: { name, desc, ownerId }}).then(() => {
26 |       // @todo bug: Item list doesn't refresh on redirect
27 |       this.props.history.replace('/')
28 |     })
29 |   }
30 | 
31 |   render () {
32 |     return (
33 |       
34 |         Save 
47 |       
48 |     )
49 |   }
50 | }
51 | 
52 | AddItem.propTypes = {
53 |   // Corresponds with the RootMutation type
54 |   mutate: PropTypes.func.isRequired,
55 |   history: PropTypes.object
56 | }
57 | 
58 | const AddItemWithMutation = graphql(itemQueries.addItem)(AddItem)
59 | 
60 | export default AddItemWithMutation
61 | 
--------------------------------------------------------------------------------
/client/src/components/ItemList.jsx:
--------------------------------------------------------------------------------
 1 | import React from 'react'
 2 | import PropTypes from 'prop-types'
 3 | import { graphql } from 'react-apollo'
 4 | import itemQueries from '../queries/item.queries.js'
 5 | 
 6 | class ItemList extends React.Component {
 7 |   render () {
 8 |     const {
 9 |             data
10 |           } = this.props
11 | 
12 |     if (data.loading) {
13 |       return (Loading
)
14 |     }
15 | 
16 |     if (data.error) {
17 |       console.log(data.error)
18 |       return (An unexpected error occurred
)
19 |     }
20 | 
21 |     return (
22 |       
23 |         
24 |           {data.items.map((item) => {
25 |             return (
26 |               
27 |                 {item.id} - {item.name} - {item.owner.username}
28 |                
29 |             )
30 |           })}
31 |          
32 |       
27 |       
28 |         
29 |           
32 |        
33 |      
34 |   ),
35 |   document.getElementById('root')
36 | )
37 | 
--------------------------------------------------------------------------------
/client/src/queries/item.queries.js:
--------------------------------------------------------------------------------
 1 | import gql from 'graphql-tag'
 2 | 
 3 | export default {
 4 |   // this is a feature called template tags
 5 |   // https://developers.google.com/web/updates/2015/01/ES6-Template-Strings#tagged_templates
 6 |   getItemList: gql`query ItemListQuery {
 7 |     items {
 8 |       id
 9 |       name,
10 |       owner {
11 |         username
12 |       }
13 |     }
14 |   }`,
15 |   addItem: gql`mutation addNewItem ($name: String!, $desc: String, $ownerId: ID!) {
16 |     addItem(name: $name, desc: $desc, ownerId: $ownerId) {
17 |       id
18 |     }
19 |   }`
20 | }
21 | 
--------------------------------------------------------------------------------
/server/app.js:
--------------------------------------------------------------------------------
 1 | import express from 'express'
 2 | import cors from 'cors'
 3 | import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'
 4 | import bodyParser from 'body-parser'
 5 | 
 6 | import schema from './schema/schema.js'
 7 | 
 8 | const app = express()
 9 | 
10 | // GraphQL Schema is imported here
11 | const graphQLSchema = schema
12 | 
13 | // enable cors support so when the client on a different host tries to query the server
14 | // the client will not be blocked
15 | // note: these are really insecure rules to use
16 | app.use('*', cors({
17 |   origin: '*'
18 | }))
19 | 
20 | // graphQL endpoint
21 | app.use('/graphql', bodyParser.json(), graphqlExpress({ schema: graphQLSchema }))
22 | 
23 | // graphQL console
24 | app.use('/graphiql', graphiqlExpress({
25 |   endpointURL: '/graphql'
26 | }))
27 | 
28 | app.listen(3000, () => {
29 |   console.log('Listening on http://localhost:3000/')
30 |   console.info('GraphQL endpoint: http://localhost:3000/graphql')
31 |   console.info('GraphQL console: http://localhost:3000/graphiql')
32 | })
33 | 
--------------------------------------------------------------------------------
/server/db.js:
--------------------------------------------------------------------------------
 1 | const ITEMS = [
 2 |   {
 3 |     id: 1,
 4 |     name: 'Test Item',
 5 |     description: 'This is a test item',
 6 |     ownerId: 234
 7 |   },
 8 |   {
 9 |     id: 2,
10 |     name: 'Test Item 2',
11 |     description: 'This is a test item 2',
12 |     ownerId: 234
13 |   }
14 | ]
15 | 
16 | export function getItem (id) {
17 |   let target = null
18 | 
19 |   ITEMS.some((item) => {
20 |     if (item.id === id) {
21 |       target = item
22 |       return true
23 |     }
24 |   })
25 | 
26 |   return target
27 | }
28 | 
29 | export function getItems () {
30 |   return ITEMS
31 | }
32 | 
33 | export function getUser () {
34 |   return {
35 |     id: 234,
36 |     username: 'test'
37 |   }
38 | }
39 | 
40 | export function addNewItem ({ name, desc, ownerId }) {
41 |   const item = {
42 |     id: (ITEMS.length + 1),
43 |     name,
44 |     desc,
45 |     ownerId
46 |   }
47 | 
48 |   ITEMS.push(item)
49 | 
50 |   return item
51 | }
52 | 
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "graphql-apollo-server-example",
 3 |   "private": true,
 4 |   "version": "1.0.0",
 5 |   "description": "Sample Apollo server",
 6 |   "scripts": {
 7 |     "start": "babel-node app.js"
 8 |   },
 9 |   "author": "Theo Gravity",
10 |   "license": "MIT",
11 |   "babel": {
12 |     "presets": [
13 |       [
14 |         "env",
15 |         {
16 |           "targets": {
17 |             "node": "current"
18 |           }
19 |         }
20 |       ]
21 |     ],
22 |     "plugins": [
23 |       "transform-export-extensions"
24 |     ]
25 |   },
26 |   "dependencies": {
27 |     "body-parser": "1.17.2",
28 |     "cors": "2.8.3",
29 |     "express": "4.15.3",
30 |     "graphql": "0.10.3",
31 |     "graphql-server-express": "0.9.0",
32 |     "graphql-tools": "1.0.0"
33 |   },
34 |   "devDependencies": {
35 |     "babel-cli": "6.24.1",
36 |     "babel-plugin-transform-export-extensions": "^6.22.0",
37 |     "babel-preset-env": "^1.5.2"
38 |   }
39 | }
40 | 
--------------------------------------------------------------------------------
/server/schema/item/item.resolvers.js:
--------------------------------------------------------------------------------
 1 | import { getUser } from '../../db'
 2 | 
 3 | // must match the field names in the Item type for field data
 4 | // that cannot be obtained at the parent level (eg RootQuery#item())
 5 | // meaning not every field needs a resolver implementation
 6 | const itemResolvers = {
 7 |   // this is the resolver for Item.owner
 8 |   // the first param represents the parent object, which in this case, would be the database results
 9 |   // that were mapped to the Item fields
10 |   async owner (item) {
11 |     return await getUser(item.ownerId)
12 |   }
13 | }
14 | 
15 | export default itemResolvers
16 | 
--------------------------------------------------------------------------------
/server/schema/item/item.type.js:
--------------------------------------------------------------------------------
 1 | const ItemType = `
 2 |   type Item {
 3 |     # Item identifier
 4 |     id: ID!
 5 |     # Item name
 6 |     name: String!
 7 |     # Item description
 8 |     desc: String
 9 |     # Owner of the item
10 |     owner: User
11 |   }
12 | `
13 | 
14 | export default ItemType
15 | 
--------------------------------------------------------------------------------
/server/schema/resolvers.js:
--------------------------------------------------------------------------------
 1 | import Item from './item/item.resolvers'
 2 | import RootQuery from './root-query/root-query.resolvers'
 3 | import RootMutation from './root-mutation/root-mutation.resolvers.js'
 4 | 
 5 | export default {
 6 |   Item,
 7 |   RootQuery,
 8 |   RootMutation
 9 | }
10 | 
--------------------------------------------------------------------------------
/server/schema/root-mutation/root-mutation.resolvers.js:
--------------------------------------------------------------------------------
 1 | import { addNewItem } from '../../db'
 2 | 
 3 | const rootMutationResolvers = {
 4 |   // this corresponds to the `RootMutation.addItem` type
 5 |   async addItem (rootObj, { name, desc, ownerId }) {
 6 |     // you'd have to implement this method yourself, would insert the item into a db
 7 |     return await addNewItem({ name, desc, ownerId })
 8 |   }
 9 | }
10 | 
11 | export default rootMutationResolvers
12 | 
--------------------------------------------------------------------------------
/server/schema/root-mutation/root-mutation.type.js:
--------------------------------------------------------------------------------
 1 | const RootMutation = `
 2 |   type RootMutation {
 3 |     addItem (
 4 |       name: String!,
 5 |       desc: String,
 6 |       ownerId: ID!
 7 |     ): Item
 8 |   }
 9 | `
10 | export default RootMutation
11 | 
--------------------------------------------------------------------------------
/server/schema/root-query/root-query.resolvers.js:
--------------------------------------------------------------------------------
 1 | import {
 2 |   getItem,
 3 |   getItems
 4 | } from '../../db'
 5 | 
 6 | // must match the field items in RootQuery
 7 | const rootQueryResolvers = {
 8 |   // this is the resolver for RootQuery.item
 9 |   // the first param represents the parent object, which in this case, would be the RootQuery
10 |   // the second param is incoming parameters
11 |   async item (rootObj, { id }) {
12 |     // returns an object that matches the ItemType fields
13 |     return await getItem(id)
14 |   },
15 |   // this is the resolver for RootQuery.items
16 |   async items () {
17 |     // would return an array of Item
18 |     return await getItems()
19 |   }
20 | }
21 | 
22 | export default rootQueryResolvers
23 | 
--------------------------------------------------------------------------------
/server/schema/root-query/root-query.type.js:
--------------------------------------------------------------------------------
 1 | const queryEntryPoints = `
 2 |   type RootQuery {
 3 |     # get an item
 4 |     item(id: String!): Item,
 5 |     # returns an array of items
 6 |     items: [Item]
 7 |   }
 8 | `
 9 | 
10 | export default queryEntryPoints
11 | 
--------------------------------------------------------------------------------
/server/schema/schema.js:
--------------------------------------------------------------------------------
 1 | import UserType from './user/user.type'
 2 | import ItemType from './item/item.type'
 3 | 
 4 | import RootQuery from './root-query/root-query.type'
 5 | import RootMutation from './root-mutation/root-mutation.type.js'
 6 | 
 7 | import resolvers from './resolvers'
 8 | 
 9 | 
10 | import { makeExecutableSchema } from 'graphql-tools'
11 | 
12 | // the schema type only has two properties: query and mutations
13 | // the RootQuery contains the root entry points into graphQL
14 | // If you want to define more entry points, you add to RootQuery
15 | 
16 | // mutation would be your entrypoints for updating / inserting data
17 | 
18 | // Note: the RootQuery defined in `schema { }` is NOT the `import RootQuery`
19 | // It is the reference to the `type RootQuery` definition
20 | // Ex: if you renamed `type RootQuery` -> `type MasterQuery`, then
21 | // it should be `schema { query: MasterQuery }`
22 | const SchemaDefinition = `
23 |   schema {
24 |     query: RootQuery,
25 |     mutation: RootMutation
26 |   }
27 | `
28 | 
29 | const schema = makeExecutableSchema({
30 |   // Add the type definitions to the schema
31 |   typeDefs: [
32 |     SchemaDefinition,
33 |     RootQuery,
34 |     RootMutation,
35 |     UserType,
36 |     ItemType
37 |   ],
38 |   // performs field lookups for a specific type
39 |   resolvers
40 | })
41 | 
42 | export default schema
43 | 
--------------------------------------------------------------------------------
/server/schema/user/user.type.js:
--------------------------------------------------------------------------------
 1 | const userType = `
 2 |   type User {
 3 |     # User identifier
 4 |     id: ID!
 5 |     # The user's username
 6 |     username: String!
 7 |   }
 8 | `
 9 | 
10 | export default userType
11 | 
--------------------------------------------------------------------------------
/server/yarn.lock:
--------------------------------------------------------------------------------
   1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
   2 | # yarn lockfile v1
   3 | 
   4 | 
   5 | "@types/express-serve-static-core@*":
   6 |   version "4.0.48"
   7 |   resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.48.tgz#b4fa06b0fce282e582b4535ff7fac85cc90173e9"
   8 |   dependencies:
   9 |     "@types/node" "*"
  10 | 
  11 | "@types/express@^4.0.35":
  12 |   version "4.0.36"
  13 |   resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.36.tgz#14eb47de7ecb10319f0a2fb1cf971aa8680758c2"
  14 |   dependencies:
  15 |     "@types/express-serve-static-core" "*"
  16 |     "@types/serve-static" "*"
  17 | 
  18 | "@types/graphql@^0.9.0", "@types/graphql@^0.9.1":
  19 |   version "0.9.2"
  20 |   resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.9.2.tgz#5e3a2919a998d0bd9bb86b4b23e9630425bff1b2"
  21 | 
  22 | "@types/mime@*":
  23 |   version "1.3.1"
  24 |   resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.1.tgz#2cf42972d0931c1060c7d5fa6627fce6bd876f2f"
  25 | 
  26 | "@types/node@*":
  27 |   version "8.0.2"
  28 |   resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.2.tgz#8ab9456efb87d57f11d04f313d3da1041948fb4d"
  29 | 
  30 | "@types/serve-static@*":
  31 |   version "1.7.31"
  32 |   resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a"
  33 |   dependencies:
  34 |     "@types/express-serve-static-core" "*"
  35 |     "@types/mime" "*"
  36 | 
  37 | abbrev@1:
  38 |   version "1.1.0"
  39 |   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
  40 | 
  41 | accepts@~1.3.3:
  42 |   version "1.3.3"
  43 |   resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
  44 |   dependencies:
  45 |     mime-types "~2.1.11"
  46 |     negotiator "0.6.1"
  47 | 
  48 | ajv@^4.9.1:
  49 |   version "4.11.8"
  50 |   resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
  51 |   dependencies:
  52 |     co "^4.6.0"
  53 |     json-stable-stringify "^1.0.1"
  54 | 
  55 | ansi-regex@^2.0.0:
  56 |   version "2.1.1"
  57 |   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
  58 | 
  59 | ansi-styles@^2.2.1:
  60 |   version "2.2.1"
  61 |   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
  62 | 
  63 | anymatch@^1.3.0:
  64 |   version "1.3.0"
  65 |   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
  66 |   dependencies:
  67 |     arrify "^1.0.0"
  68 |     micromatch "^2.1.5"
  69 | 
  70 | aproba@^1.0.3:
  71 |   version "1.1.2"
  72 |   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1"
  73 | 
  74 | are-we-there-yet@~1.1.2:
  75 |   version "1.1.4"
  76 |   resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
  77 |   dependencies:
  78 |     delegates "^1.0.0"
  79 |     readable-stream "^2.0.6"
  80 | 
  81 | arr-diff@^2.0.0:
  82 |   version "2.0.0"
  83 |   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
  84 |   dependencies:
  85 |     arr-flatten "^1.0.1"
  86 | 
  87 | arr-flatten@^1.0.1:
  88 |   version "1.0.3"
  89 |   resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
  90 | 
  91 | array-flatten@1.1.1:
  92 |   version "1.1.1"
  93 |   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
  94 | 
  95 | array-unique@^0.2.1:
  96 |   version "0.2.1"
  97 |   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
  98 | 
  99 | arrify@^1.0.0:
 100 |   version "1.0.1"
 101 |   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
 102 | 
 103 | asn1@~0.2.3:
 104 |   version "0.2.3"
 105 |   resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
 106 | 
 107 | assert-plus@1.0.0, assert-plus@^1.0.0:
 108 |   version "1.0.0"
 109 |   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
 110 | 
 111 | assert-plus@^0.2.0:
 112 |   version "0.2.0"
 113 |   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
 114 | 
 115 | async-each@^1.0.0:
 116 |   version "1.0.1"
 117 |   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
 118 | 
 119 | asynckit@^0.4.0:
 120 |   version "0.4.0"
 121 |   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
 122 | 
 123 | aws-sign2@~0.6.0:
 124 |   version "0.6.0"
 125 |   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
 126 | 
 127 | aws4@^1.2.1:
 128 |   version "1.6.0"
 129 |   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
 130 | 
 131 | babel-cli@6.24.1:
 132 |   version "6.24.1"
 133 |   resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283"
 134 |   dependencies:
 135 |     babel-core "^6.24.1"
 136 |     babel-polyfill "^6.23.0"
 137 |     babel-register "^6.24.1"
 138 |     babel-runtime "^6.22.0"
 139 |     commander "^2.8.1"
 140 |     convert-source-map "^1.1.0"
 141 |     fs-readdir-recursive "^1.0.0"
 142 |     glob "^7.0.0"
 143 |     lodash "^4.2.0"
 144 |     output-file-sync "^1.1.0"
 145 |     path-is-absolute "^1.0.0"
 146 |     slash "^1.0.0"
 147 |     source-map "^0.5.0"
 148 |     v8flags "^2.0.10"
 149 |   optionalDependencies:
 150 |     chokidar "^1.6.1"
 151 | 
 152 | babel-code-frame@^6.22.0:
 153 |   version "6.22.0"
 154 |   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
 155 |   dependencies:
 156 |     chalk "^1.1.0"
 157 |     esutils "^2.0.2"
 158 |     js-tokens "^3.0.0"
 159 | 
 160 | babel-core@^6.24.1:
 161 |   version "6.25.0"
 162 |   resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729"
 163 |   dependencies:
 164 |     babel-code-frame "^6.22.0"
 165 |     babel-generator "^6.25.0"
 166 |     babel-helpers "^6.24.1"
 167 |     babel-messages "^6.23.0"
 168 |     babel-register "^6.24.1"
 169 |     babel-runtime "^6.22.0"
 170 |     babel-template "^6.25.0"
 171 |     babel-traverse "^6.25.0"
 172 |     babel-types "^6.25.0"
 173 |     babylon "^6.17.2"
 174 |     convert-source-map "^1.1.0"
 175 |     debug "^2.1.1"
 176 |     json5 "^0.5.0"
 177 |     lodash "^4.2.0"
 178 |     minimatch "^3.0.2"
 179 |     path-is-absolute "^1.0.0"
 180 |     private "^0.1.6"
 181 |     slash "^1.0.0"
 182 |     source-map "^0.5.0"
 183 | 
 184 | babel-generator@^6.25.0:
 185 |   version "6.25.0"
 186 |   resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc"
 187 |   dependencies:
 188 |     babel-messages "^6.23.0"
 189 |     babel-runtime "^6.22.0"
 190 |     babel-types "^6.25.0"
 191 |     detect-indent "^4.0.0"
 192 |     jsesc "^1.3.0"
 193 |     lodash "^4.2.0"
 194 |     source-map "^0.5.0"
 195 |     trim-right "^1.0.1"
 196 | 
 197 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
 198 |   version "6.24.1"
 199 |   resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
 200 |   dependencies:
 201 |     babel-helper-explode-assignable-expression "^6.24.1"
 202 |     babel-runtime "^6.22.0"
 203 |     babel-types "^6.24.1"
 204 | 
 205 | babel-helper-call-delegate@^6.24.1:
 206 |   version "6.24.1"
 207 |   resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
 208 |   dependencies:
 209 |     babel-helper-hoist-variables "^6.24.1"
 210 |     babel-runtime "^6.22.0"
 211 |     babel-traverse "^6.24.1"
 212 |     babel-types "^6.24.1"
 213 | 
 214 | babel-helper-define-map@^6.24.1:
 215 |   version "6.24.1"
 216 |   resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
 217 |   dependencies:
 218 |     babel-helper-function-name "^6.24.1"
 219 |     babel-runtime "^6.22.0"
 220 |     babel-types "^6.24.1"
 221 |     lodash "^4.2.0"
 222 | 
 223 | babel-helper-explode-assignable-expression@^6.24.1:
 224 |   version "6.24.1"
 225 |   resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
 226 |   dependencies:
 227 |     babel-runtime "^6.22.0"
 228 |     babel-traverse "^6.24.1"
 229 |     babel-types "^6.24.1"
 230 | 
 231 | babel-helper-function-name@^6.24.1:
 232 |   version "6.24.1"
 233 |   resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
 234 |   dependencies:
 235 |     babel-helper-get-function-arity "^6.24.1"
 236 |     babel-runtime "^6.22.0"
 237 |     babel-template "^6.24.1"
 238 |     babel-traverse "^6.24.1"
 239 |     babel-types "^6.24.1"
 240 | 
 241 | babel-helper-get-function-arity@^6.24.1:
 242 |   version "6.24.1"
 243 |   resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
 244 |   dependencies:
 245 |     babel-runtime "^6.22.0"
 246 |     babel-types "^6.24.1"
 247 | 
 248 | babel-helper-hoist-variables@^6.24.1:
 249 |   version "6.24.1"
 250 |   resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
 251 |   dependencies:
 252 |     babel-runtime "^6.22.0"
 253 |     babel-types "^6.24.1"
 254 | 
 255 | babel-helper-optimise-call-expression@^6.24.1:
 256 |   version "6.24.1"
 257 |   resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
 258 |   dependencies:
 259 |     babel-runtime "^6.22.0"
 260 |     babel-types "^6.24.1"
 261 | 
 262 | babel-helper-regex@^6.24.1:
 263 |   version "6.24.1"
 264 |   resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
 265 |   dependencies:
 266 |     babel-runtime "^6.22.0"
 267 |     babel-types "^6.24.1"
 268 |     lodash "^4.2.0"
 269 | 
 270 | babel-helper-remap-async-to-generator@^6.24.1:
 271 |   version "6.24.1"
 272 |   resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
 273 |   dependencies:
 274 |     babel-helper-function-name "^6.24.1"
 275 |     babel-runtime "^6.22.0"
 276 |     babel-template "^6.24.1"
 277 |     babel-traverse "^6.24.1"
 278 |     babel-types "^6.24.1"
 279 | 
 280 | babel-helper-replace-supers@^6.24.1:
 281 |   version "6.24.1"
 282 |   resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
 283 |   dependencies:
 284 |     babel-helper-optimise-call-expression "^6.24.1"
 285 |     babel-messages "^6.23.0"
 286 |     babel-runtime "^6.22.0"
 287 |     babel-template "^6.24.1"
 288 |     babel-traverse "^6.24.1"
 289 |     babel-types "^6.24.1"
 290 | 
 291 | babel-helpers@^6.24.1:
 292 |   version "6.24.1"
 293 |   resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
 294 |   dependencies:
 295 |     babel-runtime "^6.22.0"
 296 |     babel-template "^6.24.1"
 297 | 
 298 | babel-messages@^6.23.0:
 299 |   version "6.23.0"
 300 |   resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
 301 |   dependencies:
 302 |     babel-runtime "^6.22.0"
 303 | 
 304 | babel-plugin-check-es2015-constants@^6.22.0:
 305 |   version "6.22.0"
 306 |   resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
 307 |   dependencies:
 308 |     babel-runtime "^6.22.0"
 309 | 
 310 | babel-plugin-syntax-async-functions@^6.8.0:
 311 |   version "6.13.0"
 312 |   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
 313 | 
 314 | babel-plugin-syntax-exponentiation-operator@^6.8.0:
 315 |   version "6.13.0"
 316 |   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
 317 | 
 318 | babel-plugin-syntax-export-extensions@^6.8.0:
 319 |   version "6.13.0"
 320 |   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
 321 | 
 322 | babel-plugin-syntax-trailing-function-commas@^6.22.0:
 323 |   version "6.22.0"
 324 |   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
 325 | 
 326 | babel-plugin-transform-async-to-generator@^6.22.0:
 327 |   version "6.24.1"
 328 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
 329 |   dependencies:
 330 |     babel-helper-remap-async-to-generator "^6.24.1"
 331 |     babel-plugin-syntax-async-functions "^6.8.0"
 332 |     babel-runtime "^6.22.0"
 333 | 
 334 | babel-plugin-transform-es2015-arrow-functions@^6.22.0:
 335 |   version "6.22.0"
 336 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
 337 |   dependencies:
 338 |     babel-runtime "^6.22.0"
 339 | 
 340 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
 341 |   version "6.22.0"
 342 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
 343 |   dependencies:
 344 |     babel-runtime "^6.22.0"
 345 | 
 346 | babel-plugin-transform-es2015-block-scoping@^6.23.0:
 347 |   version "6.24.1"
 348 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
 349 |   dependencies:
 350 |     babel-runtime "^6.22.0"
 351 |     babel-template "^6.24.1"
 352 |     babel-traverse "^6.24.1"
 353 |     babel-types "^6.24.1"
 354 |     lodash "^4.2.0"
 355 | 
 356 | babel-plugin-transform-es2015-classes@^6.23.0:
 357 |   version "6.24.1"
 358 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
 359 |   dependencies:
 360 |     babel-helper-define-map "^6.24.1"
 361 |     babel-helper-function-name "^6.24.1"
 362 |     babel-helper-optimise-call-expression "^6.24.1"
 363 |     babel-helper-replace-supers "^6.24.1"
 364 |     babel-messages "^6.23.0"
 365 |     babel-runtime "^6.22.0"
 366 |     babel-template "^6.24.1"
 367 |     babel-traverse "^6.24.1"
 368 |     babel-types "^6.24.1"
 369 | 
 370 | babel-plugin-transform-es2015-computed-properties@^6.22.0:
 371 |   version "6.24.1"
 372 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
 373 |   dependencies:
 374 |     babel-runtime "^6.22.0"
 375 |     babel-template "^6.24.1"
 376 | 
 377 | babel-plugin-transform-es2015-destructuring@^6.23.0:
 378 |   version "6.23.0"
 379 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
 380 |   dependencies:
 381 |     babel-runtime "^6.22.0"
 382 | 
 383 | babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
 384 |   version "6.24.1"
 385 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
 386 |   dependencies:
 387 |     babel-runtime "^6.22.0"
 388 |     babel-types "^6.24.1"
 389 | 
 390 | babel-plugin-transform-es2015-for-of@^6.23.0:
 391 |   version "6.23.0"
 392 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
 393 |   dependencies:
 394 |     babel-runtime "^6.22.0"
 395 | 
 396 | babel-plugin-transform-es2015-function-name@^6.22.0:
 397 |   version "6.24.1"
 398 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
 399 |   dependencies:
 400 |     babel-helper-function-name "^6.24.1"
 401 |     babel-runtime "^6.22.0"
 402 |     babel-types "^6.24.1"
 403 | 
 404 | babel-plugin-transform-es2015-literals@^6.22.0:
 405 |   version "6.22.0"
 406 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
 407 |   dependencies:
 408 |     babel-runtime "^6.22.0"
 409 | 
 410 | babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
 411 |   version "6.24.1"
 412 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
 413 |   dependencies:
 414 |     babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
 415 |     babel-runtime "^6.22.0"
 416 |     babel-template "^6.24.1"
 417 | 
 418 | babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
 419 |   version "6.24.1"
 420 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
 421 |   dependencies:
 422 |     babel-plugin-transform-strict-mode "^6.24.1"
 423 |     babel-runtime "^6.22.0"
 424 |     babel-template "^6.24.1"
 425 |     babel-types "^6.24.1"
 426 | 
 427 | babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
 428 |   version "6.24.1"
 429 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
 430 |   dependencies:
 431 |     babel-helper-hoist-variables "^6.24.1"
 432 |     babel-runtime "^6.22.0"
 433 |     babel-template "^6.24.1"
 434 | 
 435 | babel-plugin-transform-es2015-modules-umd@^6.23.0:
 436 |   version "6.24.1"
 437 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
 438 |   dependencies:
 439 |     babel-plugin-transform-es2015-modules-amd "^6.24.1"
 440 |     babel-runtime "^6.22.0"
 441 |     babel-template "^6.24.1"
 442 | 
 443 | babel-plugin-transform-es2015-object-super@^6.22.0:
 444 |   version "6.24.1"
 445 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
 446 |   dependencies:
 447 |     babel-helper-replace-supers "^6.24.1"
 448 |     babel-runtime "^6.22.0"
 449 | 
 450 | babel-plugin-transform-es2015-parameters@^6.23.0:
 451 |   version "6.24.1"
 452 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
 453 |   dependencies:
 454 |     babel-helper-call-delegate "^6.24.1"
 455 |     babel-helper-get-function-arity "^6.24.1"
 456 |     babel-runtime "^6.22.0"
 457 |     babel-template "^6.24.1"
 458 |     babel-traverse "^6.24.1"
 459 |     babel-types "^6.24.1"
 460 | 
 461 | babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
 462 |   version "6.24.1"
 463 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
 464 |   dependencies:
 465 |     babel-runtime "^6.22.0"
 466 |     babel-types "^6.24.1"
 467 | 
 468 | babel-plugin-transform-es2015-spread@^6.22.0:
 469 |   version "6.22.0"
 470 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
 471 |   dependencies:
 472 |     babel-runtime "^6.22.0"
 473 | 
 474 | babel-plugin-transform-es2015-sticky-regex@^6.22.0:
 475 |   version "6.24.1"
 476 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
 477 |   dependencies:
 478 |     babel-helper-regex "^6.24.1"
 479 |     babel-runtime "^6.22.0"
 480 |     babel-types "^6.24.1"
 481 | 
 482 | babel-plugin-transform-es2015-template-literals@^6.22.0:
 483 |   version "6.22.0"
 484 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
 485 |   dependencies:
 486 |     babel-runtime "^6.22.0"
 487 | 
 488 | babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
 489 |   version "6.23.0"
 490 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
 491 |   dependencies:
 492 |     babel-runtime "^6.22.0"
 493 | 
 494 | babel-plugin-transform-es2015-unicode-regex@^6.22.0:
 495 |   version "6.24.1"
 496 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
 497 |   dependencies:
 498 |     babel-helper-regex "^6.24.1"
 499 |     babel-runtime "^6.22.0"
 500 |     regexpu-core "^2.0.0"
 501 | 
 502 | babel-plugin-transform-exponentiation-operator@^6.22.0:
 503 |   version "6.24.1"
 504 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
 505 |   dependencies:
 506 |     babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
 507 |     babel-plugin-syntax-exponentiation-operator "^6.8.0"
 508 |     babel-runtime "^6.22.0"
 509 | 
 510 | babel-plugin-transform-export-extensions@^6.22.0:
 511 |   version "6.22.0"
 512 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
 513 |   dependencies:
 514 |     babel-plugin-syntax-export-extensions "^6.8.0"
 515 |     babel-runtime "^6.22.0"
 516 | 
 517 | babel-plugin-transform-regenerator@^6.22.0:
 518 |   version "6.24.1"
 519 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
 520 |   dependencies:
 521 |     regenerator-transform "0.9.11"
 522 | 
 523 | babel-plugin-transform-strict-mode@^6.24.1:
 524 |   version "6.24.1"
 525 |   resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
 526 |   dependencies:
 527 |     babel-runtime "^6.22.0"
 528 |     babel-types "^6.24.1"
 529 | 
 530 | babel-polyfill@^6.23.0:
 531 |   version "6.23.0"
 532 |   resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
 533 |   dependencies:
 534 |     babel-runtime "^6.22.0"
 535 |     core-js "^2.4.0"
 536 |     regenerator-runtime "^0.10.0"
 537 | 
 538 | babel-preset-env@^1.5.2:
 539 |   version "1.5.2"
 540 |   resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.5.2.tgz#cd4ae90a6e94b709f97374b33e5f8b983556adef"
 541 |   dependencies:
 542 |     babel-plugin-check-es2015-constants "^6.22.0"
 543 |     babel-plugin-syntax-trailing-function-commas "^6.22.0"
 544 |     babel-plugin-transform-async-to-generator "^6.22.0"
 545 |     babel-plugin-transform-es2015-arrow-functions "^6.22.0"
 546 |     babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
 547 |     babel-plugin-transform-es2015-block-scoping "^6.23.0"
 548 |     babel-plugin-transform-es2015-classes "^6.23.0"
 549 |     babel-plugin-transform-es2015-computed-properties "^6.22.0"
 550 |     babel-plugin-transform-es2015-destructuring "^6.23.0"
 551 |     babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
 552 |     babel-plugin-transform-es2015-for-of "^6.23.0"
 553 |     babel-plugin-transform-es2015-function-name "^6.22.0"
 554 |     babel-plugin-transform-es2015-literals "^6.22.0"
 555 |     babel-plugin-transform-es2015-modules-amd "^6.22.0"
 556 |     babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
 557 |     babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
 558 |     babel-plugin-transform-es2015-modules-umd "^6.23.0"
 559 |     babel-plugin-transform-es2015-object-super "^6.22.0"
 560 |     babel-plugin-transform-es2015-parameters "^6.23.0"
 561 |     babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
 562 |     babel-plugin-transform-es2015-spread "^6.22.0"
 563 |     babel-plugin-transform-es2015-sticky-regex "^6.22.0"
 564 |     babel-plugin-transform-es2015-template-literals "^6.22.0"
 565 |     babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
 566 |     babel-plugin-transform-es2015-unicode-regex "^6.22.0"
 567 |     babel-plugin-transform-exponentiation-operator "^6.22.0"
 568 |     babel-plugin-transform-regenerator "^6.22.0"
 569 |     browserslist "^2.1.2"
 570 |     invariant "^2.2.2"
 571 |     semver "^5.3.0"
 572 | 
 573 | babel-register@^6.24.1:
 574 |   version "6.24.1"
 575 |   resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
 576 |   dependencies:
 577 |     babel-core "^6.24.1"
 578 |     babel-runtime "^6.22.0"
 579 |     core-js "^2.4.0"
 580 |     home-or-tmp "^2.0.0"
 581 |     lodash "^4.2.0"
 582 |     mkdirp "^0.5.1"
 583 |     source-map-support "^0.4.2"
 584 | 
 585 | babel-runtime@^6.18.0, babel-runtime@^6.22.0:
 586 |   version "6.23.0"
 587 |   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
 588 |   dependencies:
 589 |     core-js "^2.4.0"
 590 |     regenerator-runtime "^0.10.0"
 591 | 
 592 | babel-template@^6.24.1, babel-template@^6.25.0:
 593 |   version "6.25.0"
 594 |   resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071"
 595 |   dependencies:
 596 |     babel-runtime "^6.22.0"
 597 |     babel-traverse "^6.25.0"
 598 |     babel-types "^6.25.0"
 599 |     babylon "^6.17.2"
 600 |     lodash "^4.2.0"
 601 | 
 602 | babel-traverse@^6.24.1, babel-traverse@^6.25.0:
 603 |   version "6.25.0"
 604 |   resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1"
 605 |   dependencies:
 606 |     babel-code-frame "^6.22.0"
 607 |     babel-messages "^6.23.0"
 608 |     babel-runtime "^6.22.0"
 609 |     babel-types "^6.25.0"
 610 |     babylon "^6.17.2"
 611 |     debug "^2.2.0"
 612 |     globals "^9.0.0"
 613 |     invariant "^2.2.0"
 614 |     lodash "^4.2.0"
 615 | 
 616 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0:
 617 |   version "6.25.0"
 618 |   resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e"
 619 |   dependencies:
 620 |     babel-runtime "^6.22.0"
 621 |     esutils "^2.0.2"
 622 |     lodash "^4.2.0"
 623 |     to-fast-properties "^1.0.1"
 624 | 
 625 | babylon@^6.17.2:
 626 |   version "6.17.4"
 627 |   resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a"
 628 | 
 629 | balanced-match@^1.0.0:
 630 |   version "1.0.0"
 631 |   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
 632 | 
 633 | bcrypt-pbkdf@^1.0.0:
 634 |   version "1.0.1"
 635 |   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
 636 |   dependencies:
 637 |     tweetnacl "^0.14.3"
 638 | 
 639 | binary-extensions@^1.0.0:
 640 |   version "1.8.0"
 641 |   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
 642 | 
 643 | block-stream@*:
 644 |   version "0.0.9"
 645 |   resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
 646 |   dependencies:
 647 |     inherits "~2.0.0"
 648 | 
 649 | body-parser@1.17.2:
 650 |   version "1.17.2"
 651 |   resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee"
 652 |   dependencies:
 653 |     bytes "2.4.0"
 654 |     content-type "~1.0.2"
 655 |     debug "2.6.7"
 656 |     depd "~1.1.0"
 657 |     http-errors "~1.6.1"
 658 |     iconv-lite "0.4.15"
 659 |     on-finished "~2.3.0"
 660 |     qs "6.4.0"
 661 |     raw-body "~2.2.0"
 662 |     type-is "~1.6.15"
 663 | 
 664 | boom@2.x.x:
 665 |   version "2.10.1"
 666 |   resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
 667 |   dependencies:
 668 |     hoek "2.x.x"
 669 | 
 670 | brace-expansion@^1.1.7:
 671 |   version "1.1.8"
 672 |   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
 673 |   dependencies:
 674 |     balanced-match "^1.0.0"
 675 |     concat-map "0.0.1"
 676 | 
 677 | braces@^1.8.2:
 678 |   version "1.8.5"
 679 |   resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
 680 |   dependencies:
 681 |     expand-range "^1.8.1"
 682 |     preserve "^0.2.0"
 683 |     repeat-element "^1.1.2"
 684 | 
 685 | browserslist@^2.1.2:
 686 |   version "2.1.5"
 687 |   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.5.tgz#e882550df3d1cd6d481c1a3e0038f2baf13a4711"
 688 |   dependencies:
 689 |     caniuse-lite "^1.0.30000684"
 690 |     electron-to-chromium "^1.3.14"
 691 | 
 692 | bytes@2.4.0:
 693 |   version "2.4.0"
 694 |   resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
 695 | 
 696 | caniuse-lite@^1.0.30000684:
 697 |   version "1.0.30000694"
 698 |   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000694.tgz#1492dab7c10c608c9d37a723e6e3e7873e0ce94f"
 699 | 
 700 | caseless@~0.12.0:
 701 |   version "0.12.0"
 702 |   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
 703 | 
 704 | chalk@^1.1.0:
 705 |   version "1.1.3"
 706 |   resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
 707 |   dependencies:
 708 |     ansi-styles "^2.2.1"
 709 |     escape-string-regexp "^1.0.2"
 710 |     has-ansi "^2.0.0"
 711 |     strip-ansi "^3.0.0"
 712 |     supports-color "^2.0.0"
 713 | 
 714 | chokidar@^1.6.1:
 715 |   version "1.7.0"
 716 |   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
 717 |   dependencies:
 718 |     anymatch "^1.3.0"
 719 |     async-each "^1.0.0"
 720 |     glob-parent "^2.0.0"
 721 |     inherits "^2.0.1"
 722 |     is-binary-path "^1.0.0"
 723 |     is-glob "^2.0.0"
 724 |     path-is-absolute "^1.0.0"
 725 |     readdirp "^2.0.0"
 726 |   optionalDependencies:
 727 |     fsevents "^1.0.0"
 728 | 
 729 | co@^4.6.0:
 730 |   version "4.6.0"
 731 |   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
 732 | 
 733 | code-point-at@^1.0.0:
 734 |   version "1.1.0"
 735 |   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
 736 | 
 737 | combined-stream@^1.0.5, combined-stream@~1.0.5:
 738 |   version "1.0.5"
 739 |   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
 740 |   dependencies:
 741 |     delayed-stream "~1.0.0"
 742 | 
 743 | commander@^2.8.1:
 744 |   version "2.10.0"
 745 |   resolved "https://registry.yarnpkg.com/commander/-/commander-2.10.0.tgz#e1f5d3245de246d1a5ca04702fa1ad1bd7e405fe"
 746 |   dependencies:
 747 |     graceful-readlink ">= 1.0.0"
 748 | 
 749 | concat-map@0.0.1:
 750 |   version "0.0.1"
 751 |   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 752 | 
 753 | console-control-strings@^1.0.0, console-control-strings@~1.1.0:
 754 |   version "1.1.0"
 755 |   resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
 756 | 
 757 | content-disposition@0.5.2:
 758 |   version "0.5.2"
 759 |   resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
 760 | 
 761 | content-type@~1.0.2:
 762 |   version "1.0.2"
 763 |   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
 764 | 
 765 | convert-source-map@^1.1.0:
 766 |   version "1.5.0"
 767 |   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
 768 | 
 769 | cookie-signature@1.0.6:
 770 |   version "1.0.6"
 771 |   resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
 772 | 
 773 | cookie@0.3.1:
 774 |   version "0.3.1"
 775 |   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
 776 | 
 777 | core-js@^2.4.0:
 778 |   version "2.4.1"
 779 |   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
 780 | 
 781 | core-util-is@~1.0.0:
 782 |   version "1.0.2"
 783 |   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
 784 | 
 785 | cors@2.8.3:
 786 |   version "2.8.3"
 787 |   resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.3.tgz#4cf78e1d23329a7496b2fc2225b77ca5bb5eb802"
 788 |   dependencies:
 789 |     object-assign "^4"
 790 |     vary "^1"
 791 | 
 792 | cryptiles@2.x.x:
 793 |   version "2.0.5"
 794 |   resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
 795 |   dependencies:
 796 |     boom "2.x.x"
 797 | 
 798 | dashdash@^1.12.0:
 799 |   version "1.14.1"
 800 |   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
 801 |   dependencies:
 802 |     assert-plus "^1.0.0"
 803 | 
 804 | debug@2.6.7, debug@^2.1.1, debug@^2.2.0:
 805 |   version "2.6.7"
 806 |   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
 807 |   dependencies:
 808 |     ms "2.0.0"
 809 | 
 810 | deep-extend@~0.4.0:
 811 |   version "0.4.2"
 812 |   resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
 813 | 
 814 | delayed-stream@~1.0.0:
 815 |   version "1.0.0"
 816 |   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
 817 | 
 818 | delegates@^1.0.0:
 819 |   version "1.0.0"
 820 |   resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
 821 | 
 822 | depd@1.1.0, depd@~1.1.0:
 823 |   version "1.1.0"
 824 |   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
 825 | 
 826 | deprecated-decorator@^0.1.6:
 827 |   version "0.1.6"
 828 |   resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37"
 829 | 
 830 | destroy@~1.0.4:
 831 |   version "1.0.4"
 832 |   resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
 833 | 
 834 | detect-indent@^4.0.0:
 835 |   version "4.0.0"
 836 |   resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
 837 |   dependencies:
 838 |     repeating "^2.0.0"
 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 | electron-to-chromium@^1.3.14:
 851 |   version "1.3.14"
 852 |   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz#64af0f9efd3c3c6acd57d71f83b49ca7ee9c4b43"
 853 | 
 854 | encodeurl@~1.0.1:
 855 |   version "1.0.1"
 856 |   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
 857 | 
 858 | escape-html@~1.0.3:
 859 |   version "1.0.3"
 860 |   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
 861 | 
 862 | escape-string-regexp@^1.0.2:
 863 |   version "1.0.5"
 864 |   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
 865 | 
 866 | esutils@^2.0.2:
 867 |   version "2.0.2"
 868 |   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
 869 | 
 870 | etag@~1.8.0:
 871 |   version "1.8.0"
 872 |   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
 873 | 
 874 | expand-brackets@^0.1.4:
 875 |   version "0.1.5"
 876 |   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
 877 |   dependencies:
 878 |     is-posix-bracket "^0.1.0"
 879 | 
 880 | expand-range@^1.8.1:
 881 |   version "1.8.2"
 882 |   resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
 883 |   dependencies:
 884 |     fill-range "^2.1.0"
 885 | 
 886 | express@4.15.3:
 887 |   version "4.15.3"
 888 |   resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662"
 889 |   dependencies:
 890 |     accepts "~1.3.3"
 891 |     array-flatten "1.1.1"
 892 |     content-disposition "0.5.2"
 893 |     content-type "~1.0.2"
 894 |     cookie "0.3.1"
 895 |     cookie-signature "1.0.6"
 896 |     debug "2.6.7"
 897 |     depd "~1.1.0"
 898 |     encodeurl "~1.0.1"
 899 |     escape-html "~1.0.3"
 900 |     etag "~1.8.0"
 901 |     finalhandler "~1.0.3"
 902 |     fresh "0.5.0"
 903 |     merge-descriptors "1.0.1"
 904 |     methods "~1.1.2"
 905 |     on-finished "~2.3.0"
 906 |     parseurl "~1.3.1"
 907 |     path-to-regexp "0.1.7"
 908 |     proxy-addr "~1.1.4"
 909 |     qs "6.4.0"
 910 |     range-parser "~1.2.0"
 911 |     send "0.15.3"
 912 |     serve-static "1.12.3"
 913 |     setprototypeof "1.0.3"
 914 |     statuses "~1.3.1"
 915 |     type-is "~1.6.15"
 916 |     utils-merge "1.0.0"
 917 |     vary "~1.1.1"
 918 | 
 919 | extend@~3.0.0:
 920 |   version "3.0.1"
 921 |   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
 922 | 
 923 | extglob@^0.3.1:
 924 |   version "0.3.2"
 925 |   resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
 926 |   dependencies:
 927 |     is-extglob "^1.0.0"
 928 | 
 929 | extsprintf@1.0.2:
 930 |   version "1.0.2"
 931 |   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
 932 | 
 933 | filename-regex@^2.0.0:
 934 |   version "2.0.1"
 935 |   resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
 936 | 
 937 | fill-range@^2.1.0:
 938 |   version "2.2.3"
 939 |   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
 940 |   dependencies:
 941 |     is-number "^2.1.0"
 942 |     isobject "^2.0.0"
 943 |     randomatic "^1.1.3"
 944 |     repeat-element "^1.1.2"
 945 |     repeat-string "^1.5.2"
 946 | 
 947 | finalhandler@~1.0.3:
 948 |   version "1.0.3"
 949 |   resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89"
 950 |   dependencies:
 951 |     debug "2.6.7"
 952 |     encodeurl "~1.0.1"
 953 |     escape-html "~1.0.3"
 954 |     on-finished "~2.3.0"
 955 |     parseurl "~1.3.1"
 956 |     statuses "~1.3.1"
 957 |     unpipe "~1.0.0"
 958 | 
 959 | for-in@^1.0.1:
 960 |   version "1.0.2"
 961 |   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
 962 | 
 963 | for-own@^0.1.4:
 964 |   version "0.1.5"
 965 |   resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
 966 |   dependencies:
 967 |     for-in "^1.0.1"
 968 | 
 969 | forever-agent@~0.6.1:
 970 |   version "0.6.1"
 971 |   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
 972 | 
 973 | form-data@~2.1.1:
 974 |   version "2.1.4"
 975 |   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
 976 |   dependencies:
 977 |     asynckit "^0.4.0"
 978 |     combined-stream "^1.0.5"
 979 |     mime-types "^2.1.12"
 980 | 
 981 | forwarded@~0.1.0:
 982 |   version "0.1.0"
 983 |   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363"
 984 | 
 985 | fresh@0.5.0:
 986 |   version "0.5.0"
 987 |   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
 988 | 
 989 | fs-readdir-recursive@^1.0.0:
 990 |   version "1.0.0"
 991 |   resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
 992 | 
 993 | fs.realpath@^1.0.0:
 994 |   version "1.0.0"
 995 |   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 996 | 
 997 | fsevents@^1.0.0:
 998 |   version "1.1.2"
 999 |   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4"
1000 |   dependencies:
1001 |     nan "^2.3.0"
1002 |     node-pre-gyp "^0.6.36"
1003 | 
1004 | fstream-ignore@^1.0.5:
1005 |   version "1.0.5"
1006 |   resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
1007 |   dependencies:
1008 |     fstream "^1.0.0"
1009 |     inherits "2"
1010 |     minimatch "^3.0.0"
1011 | 
1012 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
1013 |   version "1.0.11"
1014 |   resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
1015 |   dependencies:
1016 |     graceful-fs "^4.1.2"
1017 |     inherits "~2.0.0"
1018 |     mkdirp ">=0.5 0"
1019 |     rimraf "2"
1020 | 
1021 | gauge@~2.7.3:
1022 |   version "2.7.4"
1023 |   resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
1024 |   dependencies:
1025 |     aproba "^1.0.3"
1026 |     console-control-strings "^1.0.0"
1027 |     has-unicode "^2.0.0"
1028 |     object-assign "^4.1.0"
1029 |     signal-exit "^3.0.0"
1030 |     string-width "^1.0.1"
1031 |     strip-ansi "^3.0.1"
1032 |     wide-align "^1.1.0"
1033 | 
1034 | getpass@^0.1.1:
1035 |   version "0.1.7"
1036 |   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
1037 |   dependencies:
1038 |     assert-plus "^1.0.0"
1039 | 
1040 | glob-base@^0.3.0:
1041 |   version "0.3.0"
1042 |   resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
1043 |   dependencies:
1044 |     glob-parent "^2.0.0"
1045 |     is-glob "^2.0.0"
1046 | 
1047 | glob-parent@^2.0.0:
1048 |   version "2.0.0"
1049 |   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
1050 |   dependencies:
1051 |     is-glob "^2.0.0"
1052 | 
1053 | glob@^7.0.0, glob@^7.0.5:
1054 |   version "7.1.2"
1055 |   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
1056 |   dependencies:
1057 |     fs.realpath "^1.0.0"
1058 |     inflight "^1.0.4"
1059 |     inherits "2"
1060 |     minimatch "^3.0.4"
1061 |     once "^1.3.0"
1062 |     path-is-absolute "^1.0.0"
1063 | 
1064 | globals@^9.0.0:
1065 |   version "9.18.0"
1066 |   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
1067 | 
1068 | graceful-fs@^4.1.2, graceful-fs@^4.1.4:
1069 |   version "4.1.11"
1070 |   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1071 | 
1072 | "graceful-readlink@>= 1.0.0":
1073 |   version "1.0.1"
1074 |   resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
1075 | 
1076 | graphql-server-core@^0.9.0:
1077 |   version "0.9.0"
1078 |   resolved "https://registry.yarnpkg.com/graphql-server-core/-/graphql-server-core-0.9.0.tgz#34dac2d90e0b9c5f2c4c666f08dab74c15b8a327"
1079 |   optionalDependencies:
1080 |     "@types/graphql" "^0.9.0"
1081 | 
1082 | graphql-server-express@0.9.0:
1083 |   version "0.9.0"
1084 |   resolved "https://registry.yarnpkg.com/graphql-server-express/-/graphql-server-express-0.9.0.tgz#00d39aa8136da205359882933849945dd19b80f0"
1085 |   dependencies:
1086 |     graphql-server-core "^0.9.0"
1087 |     graphql-server-module-graphiql "^0.9.0"
1088 |   optionalDependencies:
1089 |     "@types/express" "^4.0.35"
1090 |     "@types/graphql" "^0.9.1"
1091 | 
1092 | graphql-server-module-graphiql@^0.9.0:
1093 |   version "0.9.0"
1094 |   resolved "https://registry.yarnpkg.com/graphql-server-module-graphiql/-/graphql-server-module-graphiql-0.9.0.tgz#dfe877066052f94a3ff57ff4790b3023e9ef2b4a"
1095 | 
1096 | graphql-tools@1.0.0:
1097 |   version "1.0.0"
1098 |   resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-1.0.0.tgz#76b25e1dce0521b31d5566aac281b2f134bc49c8"
1099 |   dependencies:
1100 |     deprecated-decorator "^0.1.6"
1101 |     lodash "^4.3.0"
1102 |     uuid "^3.0.1"
1103 |   optionalDependencies:
1104 |     "@types/graphql" "^0.9.0"
1105 | 
1106 | graphql@0.10.3:
1107 |   version "0.10.3"
1108 |   resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.10.3.tgz#c313afd5518e673351bee18fb63e2a0e487407ab"
1109 |   dependencies:
1110 |     iterall "^1.1.0"
1111 | 
1112 | har-schema@^1.0.5:
1113 |   version "1.0.5"
1114 |   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
1115 | 
1116 | har-validator@~4.2.1:
1117 |   version "4.2.1"
1118 |   resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
1119 |   dependencies:
1120 |     ajv "^4.9.1"
1121 |     har-schema "^1.0.5"
1122 | 
1123 | has-ansi@^2.0.0:
1124 |   version "2.0.0"
1125 |   resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
1126 |   dependencies:
1127 |     ansi-regex "^2.0.0"
1128 | 
1129 | has-unicode@^2.0.0:
1130 |   version "2.0.1"
1131 |   resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
1132 | 
1133 | hawk@~3.1.3:
1134 |   version "3.1.3"
1135 |   resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
1136 |   dependencies:
1137 |     boom "2.x.x"
1138 |     cryptiles "2.x.x"
1139 |     hoek "2.x.x"
1140 |     sntp "1.x.x"
1141 | 
1142 | hoek@2.x.x:
1143 |   version "2.16.3"
1144 |   resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
1145 | 
1146 | home-or-tmp@^2.0.0:
1147 |   version "2.0.0"
1148 |   resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
1149 |   dependencies:
1150 |     os-homedir "^1.0.0"
1151 |     os-tmpdir "^1.0.1"
1152 | 
1153 | http-errors@~1.6.1:
1154 |   version "1.6.1"
1155 |   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
1156 |   dependencies:
1157 |     depd "1.1.0"
1158 |     inherits "2.0.3"
1159 |     setprototypeof "1.0.3"
1160 |     statuses ">= 1.3.1 < 2"
1161 | 
1162 | http-signature@~1.1.0:
1163 |   version "1.1.1"
1164 |   resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
1165 |   dependencies:
1166 |     assert-plus "^0.2.0"
1167 |     jsprim "^1.2.2"
1168 |     sshpk "^1.7.0"
1169 | 
1170 | iconv-lite@0.4.15:
1171 |   version "0.4.15"
1172 |   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
1173 | 
1174 | inflight@^1.0.4:
1175 |   version "1.0.6"
1176 |   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
1177 |   dependencies:
1178 |     once "^1.3.0"
1179 |     wrappy "1"
1180 | 
1181 | inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3:
1182 |   version "2.0.3"
1183 |   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
1184 | 
1185 | ini@~1.3.0:
1186 |   version "1.3.4"
1187 |   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
1188 | 
1189 | invariant@^2.2.0, invariant@^2.2.2:
1190 |   version "2.2.2"
1191 |   resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
1192 |   dependencies:
1193 |     loose-envify "^1.0.0"
1194 | 
1195 | ipaddr.js@1.3.0:
1196 |   version "1.3.0"
1197 |   resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
1198 | 
1199 | is-binary-path@^1.0.0:
1200 |   version "1.0.1"
1201 |   resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
1202 |   dependencies:
1203 |     binary-extensions "^1.0.0"
1204 | 
1205 | is-buffer@^1.1.5:
1206 |   version "1.1.5"
1207 |   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
1208 | 
1209 | is-dotfile@^1.0.0:
1210 |   version "1.0.3"
1211 |   resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
1212 | 
1213 | is-equal-shallow@^0.1.3:
1214 |   version "0.1.3"
1215 |   resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
1216 |   dependencies:
1217 |     is-primitive "^2.0.0"
1218 | 
1219 | is-extendable@^0.1.1:
1220 |   version "0.1.1"
1221 |   resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
1222 | 
1223 | is-extglob@^1.0.0:
1224 |   version "1.0.0"
1225 |   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
1226 | 
1227 | is-finite@^1.0.0:
1228 |   version "1.0.2"
1229 |   resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
1230 |   dependencies:
1231 |     number-is-nan "^1.0.0"
1232 | 
1233 | is-fullwidth-code-point@^1.0.0:
1234 |   version "1.0.0"
1235 |   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
1236 |   dependencies:
1237 |     number-is-nan "^1.0.0"
1238 | 
1239 | is-glob@^2.0.0, is-glob@^2.0.1:
1240 |   version "2.0.1"
1241 |   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
1242 |   dependencies:
1243 |     is-extglob "^1.0.0"
1244 | 
1245 | is-number@^2.1.0:
1246 |   version "2.1.0"
1247 |   resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
1248 |   dependencies:
1249 |     kind-of "^3.0.2"
1250 | 
1251 | is-number@^3.0.0:
1252 |   version "3.0.0"
1253 |   resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
1254 |   dependencies:
1255 |     kind-of "^3.0.2"
1256 | 
1257 | is-posix-bracket@^0.1.0:
1258 |   version "0.1.1"
1259 |   resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
1260 | 
1261 | is-primitive@^2.0.0:
1262 |   version "2.0.0"
1263 |   resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
1264 | 
1265 | is-typedarray@~1.0.0:
1266 |   version "1.0.0"
1267 |   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
1268 | 
1269 | isarray@1.0.0, isarray@~1.0.0:
1270 |   version "1.0.0"
1271 |   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1272 | 
1273 | isobject@^2.0.0:
1274 |   version "2.1.0"
1275 |   resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
1276 |   dependencies:
1277 |     isarray "1.0.0"
1278 | 
1279 | isstream@~0.1.2:
1280 |   version "0.1.2"
1281 |   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
1282 | 
1283 | iterall@^1.1.0:
1284 |   version "1.1.1"
1285 |   resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.1.tgz#f7f0af11e9a04ec6426260f5019d9fcca4d50214"
1286 | 
1287 | js-tokens@^3.0.0:
1288 |   version "3.0.1"
1289 |   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
1290 | 
1291 | jsbn@~0.1.0:
1292 |   version "0.1.1"
1293 |   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
1294 | 
1295 | jsesc@^1.3.0:
1296 |   version "1.3.0"
1297 |   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
1298 | 
1299 | jsesc@~0.5.0:
1300 |   version "0.5.0"
1301 |   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
1302 | 
1303 | json-schema@0.2.3:
1304 |   version "0.2.3"
1305 |   resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
1306 | 
1307 | json-stable-stringify@^1.0.1:
1308 |   version "1.0.1"
1309 |   resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
1310 |   dependencies:
1311 |     jsonify "~0.0.0"
1312 | 
1313 | json-stringify-safe@~5.0.1:
1314 |   version "5.0.1"
1315 |   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
1316 | 
1317 | json5@^0.5.0:
1318 |   version "0.5.1"
1319 |   resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
1320 | 
1321 | jsonify@~0.0.0:
1322 |   version "0.0.0"
1323 |   resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
1324 | 
1325 | jsprim@^1.2.2:
1326 |   version "1.4.0"
1327 |   resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
1328 |   dependencies:
1329 |     assert-plus "1.0.0"
1330 |     extsprintf "1.0.2"
1331 |     json-schema "0.2.3"
1332 |     verror "1.3.6"
1333 | 
1334 | kind-of@^3.0.2:
1335 |   version "3.2.2"
1336 |   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
1337 |   dependencies:
1338 |     is-buffer "^1.1.5"
1339 | 
1340 | kind-of@^4.0.0:
1341 |   version "4.0.0"
1342 |   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
1343 |   dependencies:
1344 |     is-buffer "^1.1.5"
1345 | 
1346 | lodash@^4.2.0, lodash@^4.3.0:
1347 |   version "4.17.4"
1348 |   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
1349 | 
1350 | loose-envify@^1.0.0:
1351 |   version "1.3.1"
1352 |   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
1353 |   dependencies:
1354 |     js-tokens "^3.0.0"
1355 | 
1356 | media-typer@0.3.0:
1357 |   version "0.3.0"
1358 |   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
1359 | 
1360 | merge-descriptors@1.0.1:
1361 |   version "1.0.1"
1362 |   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
1363 | 
1364 | methods@~1.1.2:
1365 |   version "1.1.2"
1366 |   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
1367 | 
1368 | micromatch@^2.1.5:
1369 |   version "2.3.11"
1370 |   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
1371 |   dependencies:
1372 |     arr-diff "^2.0.0"
1373 |     array-unique "^0.2.1"
1374 |     braces "^1.8.2"
1375 |     expand-brackets "^0.1.4"
1376 |     extglob "^0.3.1"
1377 |     filename-regex "^2.0.0"
1378 |     is-extglob "^1.0.0"
1379 |     is-glob "^2.0.1"
1380 |     kind-of "^3.0.2"
1381 |     normalize-path "^2.0.1"
1382 |     object.omit "^2.0.0"
1383 |     parse-glob "^3.0.4"
1384 |     regex-cache "^0.4.2"
1385 | 
1386 | mime-db@~1.27.0:
1387 |   version "1.27.0"
1388 |   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
1389 | 
1390 | mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
1391 |   version "2.1.15"
1392 |   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
1393 |   dependencies:
1394 |     mime-db "~1.27.0"
1395 | 
1396 | mime@1.3.4:
1397 |   version "1.3.4"
1398 |   resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
1399 | 
1400 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
1401 |   version "3.0.4"
1402 |   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
1403 |   dependencies:
1404 |     brace-expansion "^1.1.7"
1405 | 
1406 | minimist@0.0.8:
1407 |   version "0.0.8"
1408 |   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
1409 | 
1410 | minimist@^1.2.0:
1411 |   version "1.2.0"
1412 |   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
1413 | 
1414 | "mkdirp@>=0.5 0", mkdirp@^0.5.1:
1415 |   version "0.5.1"
1416 |   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
1417 |   dependencies:
1418 |     minimist "0.0.8"
1419 | 
1420 | ms@2.0.0:
1421 |   version "2.0.0"
1422 |   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
1423 | 
1424 | nan@^2.3.0:
1425 |   version "2.6.2"
1426 |   resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
1427 | 
1428 | negotiator@0.6.1:
1429 |   version "0.6.1"
1430 |   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
1431 | 
1432 | node-pre-gyp@^0.6.36:
1433 |   version "0.6.36"
1434 |   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
1435 |   dependencies:
1436 |     mkdirp "^0.5.1"
1437 |     nopt "^4.0.1"
1438 |     npmlog "^4.0.2"
1439 |     rc "^1.1.7"
1440 |     request "^2.81.0"
1441 |     rimraf "^2.6.1"
1442 |     semver "^5.3.0"
1443 |     tar "^2.2.1"
1444 |     tar-pack "^3.4.0"
1445 | 
1446 | nopt@^4.0.1:
1447 |   version "4.0.1"
1448 |   resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
1449 |   dependencies:
1450 |     abbrev "1"
1451 |     osenv "^0.1.4"
1452 | 
1453 | normalize-path@^2.0.1:
1454 |   version "2.1.1"
1455 |   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
1456 |   dependencies:
1457 |     remove-trailing-separator "^1.0.1"
1458 | 
1459 | npmlog@^4.0.2:
1460 |   version "4.1.0"
1461 |   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5"
1462 |   dependencies:
1463 |     are-we-there-yet "~1.1.2"
1464 |     console-control-strings "~1.1.0"
1465 |     gauge "~2.7.3"
1466 |     set-blocking "~2.0.0"
1467 | 
1468 | number-is-nan@^1.0.0:
1469 |   version "1.0.1"
1470 |   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
1471 | 
1472 | oauth-sign@~0.8.1:
1473 |   version "0.8.2"
1474 |   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
1475 | 
1476 | object-assign@^4, object-assign@^4.1.0:
1477 |   version "4.1.1"
1478 |   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1479 | 
1480 | object.omit@^2.0.0:
1481 |   version "2.0.1"
1482 |   resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
1483 |   dependencies:
1484 |     for-own "^0.1.4"
1485 |     is-extendable "^0.1.1"
1486 | 
1487 | on-finished@~2.3.0:
1488 |   version "2.3.0"
1489 |   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
1490 |   dependencies:
1491 |     ee-first "1.1.1"
1492 | 
1493 | once@^1.3.0, once@^1.3.3:
1494 |   version "1.4.0"
1495 |   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1496 |   dependencies:
1497 |     wrappy "1"
1498 | 
1499 | os-homedir@^1.0.0:
1500 |   version "1.0.2"
1501 |   resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
1502 | 
1503 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
1504 |   version "1.0.2"
1505 |   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
1506 | 
1507 | osenv@^0.1.4:
1508 |   version "0.1.4"
1509 |   resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
1510 |   dependencies:
1511 |     os-homedir "^1.0.0"
1512 |     os-tmpdir "^1.0.0"
1513 | 
1514 | output-file-sync@^1.1.0:
1515 |   version "1.1.2"
1516 |   resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
1517 |   dependencies:
1518 |     graceful-fs "^4.1.4"
1519 |     mkdirp "^0.5.1"
1520 |     object-assign "^4.1.0"
1521 | 
1522 | parse-glob@^3.0.4:
1523 |   version "3.0.4"
1524 |   resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
1525 |   dependencies:
1526 |     glob-base "^0.3.0"
1527 |     is-dotfile "^1.0.0"
1528 |     is-extglob "^1.0.0"
1529 |     is-glob "^2.0.0"
1530 | 
1531 | parseurl@~1.3.1:
1532 |   version "1.3.1"
1533 |   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
1534 | 
1535 | path-is-absolute@^1.0.0:
1536 |   version "1.0.1"
1537 |   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1538 | 
1539 | path-to-regexp@0.1.7:
1540 |   version "0.1.7"
1541 |   resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
1542 | 
1543 | performance-now@^0.2.0:
1544 |   version "0.2.0"
1545 |   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
1546 | 
1547 | preserve@^0.2.0:
1548 |   version "0.2.0"
1549 |   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
1550 | 
1551 | private@^0.1.6:
1552 |   version "0.1.7"
1553 |   resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
1554 | 
1555 | process-nextick-args@~1.0.6:
1556 |   version "1.0.7"
1557 |   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
1558 | 
1559 | proxy-addr@~1.1.4:
1560 |   version "1.1.4"
1561 |   resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3"
1562 |   dependencies:
1563 |     forwarded "~0.1.0"
1564 |     ipaddr.js "1.3.0"
1565 | 
1566 | punycode@^1.4.1:
1567 |   version "1.4.1"
1568 |   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
1569 | 
1570 | qs@6.4.0, qs@~6.4.0:
1571 |   version "6.4.0"
1572 |   resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
1573 | 
1574 | randomatic@^1.1.3:
1575 |   version "1.1.7"
1576 |   resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
1577 |   dependencies:
1578 |     is-number "^3.0.0"
1579 |     kind-of "^4.0.0"
1580 | 
1581 | range-parser@~1.2.0:
1582 |   version "1.2.0"
1583 |   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
1584 | 
1585 | raw-body@~2.2.0:
1586 |   version "2.2.0"
1587 |   resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96"
1588 |   dependencies:
1589 |     bytes "2.4.0"
1590 |     iconv-lite "0.4.15"
1591 |     unpipe "1.0.0"
1592 | 
1593 | rc@^1.1.7:
1594 |   version "1.2.1"
1595 |   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
1596 |   dependencies:
1597 |     deep-extend "~0.4.0"
1598 |     ini "~1.3.0"
1599 |     minimist "^1.2.0"
1600 |     strip-json-comments "~2.0.1"
1601 | 
1602 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4:
1603 |   version "2.3.2"
1604 |   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.2.tgz#5a04df05e4f57fe3f0dc68fdd11dc5c97c7e6f4d"
1605 |   dependencies:
1606 |     core-util-is "~1.0.0"
1607 |     inherits "~2.0.3"
1608 |     isarray "~1.0.0"
1609 |     process-nextick-args "~1.0.6"
1610 |     safe-buffer "~5.1.0"
1611 |     string_decoder "~1.0.0"
1612 |     util-deprecate "~1.0.1"
1613 | 
1614 | readdirp@^2.0.0:
1615 |   version "2.1.0"
1616 |   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
1617 |   dependencies:
1618 |     graceful-fs "^4.1.2"
1619 |     minimatch "^3.0.2"
1620 |     readable-stream "^2.0.2"
1621 |     set-immediate-shim "^1.0.1"
1622 | 
1623 | regenerate@^1.2.1:
1624 |   version "1.3.2"
1625 |   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
1626 | 
1627 | regenerator-runtime@^0.10.0:
1628 |   version "0.10.5"
1629 |   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
1630 | 
1631 | regenerator-transform@0.9.11:
1632 |   version "0.9.11"
1633 |   resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
1634 |   dependencies:
1635 |     babel-runtime "^6.18.0"
1636 |     babel-types "^6.19.0"
1637 |     private "^0.1.6"
1638 | 
1639 | regex-cache@^0.4.2:
1640 |   version "0.4.3"
1641 |   resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
1642 |   dependencies:
1643 |     is-equal-shallow "^0.1.3"
1644 |     is-primitive "^2.0.0"
1645 | 
1646 | regexpu-core@^2.0.0:
1647 |   version "2.0.0"
1648 |   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
1649 |   dependencies:
1650 |     regenerate "^1.2.1"
1651 |     regjsgen "^0.2.0"
1652 |     regjsparser "^0.1.4"
1653 | 
1654 | regjsgen@^0.2.0:
1655 |   version "0.2.0"
1656 |   resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
1657 | 
1658 | regjsparser@^0.1.4:
1659 |   version "0.1.5"
1660 |   resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
1661 |   dependencies:
1662 |     jsesc "~0.5.0"
1663 | 
1664 | remove-trailing-separator@^1.0.1:
1665 |   version "1.0.2"
1666 |   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511"
1667 | 
1668 | repeat-element@^1.1.2:
1669 |   version "1.1.2"
1670 |   resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
1671 | 
1672 | repeat-string@^1.5.2:
1673 |   version "1.6.1"
1674 |   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
1675 | 
1676 | repeating@^2.0.0:
1677 |   version "2.0.1"
1678 |   resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
1679 |   dependencies:
1680 |     is-finite "^1.0.0"
1681 | 
1682 | request@^2.81.0:
1683 |   version "2.81.0"
1684 |   resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
1685 |   dependencies:
1686 |     aws-sign2 "~0.6.0"
1687 |     aws4 "^1.2.1"
1688 |     caseless "~0.12.0"
1689 |     combined-stream "~1.0.5"
1690 |     extend "~3.0.0"
1691 |     forever-agent "~0.6.1"
1692 |     form-data "~2.1.1"
1693 |     har-validator "~4.2.1"
1694 |     hawk "~3.1.3"
1695 |     http-signature "~1.1.0"
1696 |     is-typedarray "~1.0.0"
1697 |     isstream "~0.1.2"
1698 |     json-stringify-safe "~5.0.1"
1699 |     mime-types "~2.1.7"
1700 |     oauth-sign "~0.8.1"
1701 |     performance-now "^0.2.0"
1702 |     qs "~6.4.0"
1703 |     safe-buffer "^5.0.1"
1704 |     stringstream "~0.0.4"
1705 |     tough-cookie "~2.3.0"
1706 |     tunnel-agent "^0.6.0"
1707 |     uuid "^3.0.0"
1708 | 
1709 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
1710 |   version "2.6.1"
1711 |   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
1712 |   dependencies:
1713 |     glob "^7.0.5"
1714 | 
1715 | safe-buffer@^5.0.1, safe-buffer@~5.1.0:
1716 |   version "5.1.1"
1717 |   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
1718 | 
1719 | semver@^5.3.0:
1720 |   version "5.3.0"
1721 |   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
1722 | 
1723 | send@0.15.3:
1724 |   version "0.15.3"
1725 |   resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309"
1726 |   dependencies:
1727 |     debug "2.6.7"
1728 |     depd "~1.1.0"
1729 |     destroy "~1.0.4"
1730 |     encodeurl "~1.0.1"
1731 |     escape-html "~1.0.3"
1732 |     etag "~1.8.0"
1733 |     fresh "0.5.0"
1734 |     http-errors "~1.6.1"
1735 |     mime "1.3.4"
1736 |     ms "2.0.0"
1737 |     on-finished "~2.3.0"
1738 |     range-parser "~1.2.0"
1739 |     statuses "~1.3.1"
1740 | 
1741 | serve-static@1.12.3:
1742 |   version "1.12.3"
1743 |   resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2"
1744 |   dependencies:
1745 |     encodeurl "~1.0.1"
1746 |     escape-html "~1.0.3"
1747 |     parseurl "~1.3.1"
1748 |     send "0.15.3"
1749 | 
1750 | set-blocking@~2.0.0:
1751 |   version "2.0.0"
1752 |   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
1753 | 
1754 | set-immediate-shim@^1.0.1:
1755 |   version "1.0.1"
1756 |   resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
1757 | 
1758 | setprototypeof@1.0.3:
1759 |   version "1.0.3"
1760 |   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
1761 | 
1762 | signal-exit@^3.0.0:
1763 |   version "3.0.2"
1764 |   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
1765 | 
1766 | slash@^1.0.0:
1767 |   version "1.0.0"
1768 |   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
1769 | 
1770 | sntp@1.x.x:
1771 |   version "1.0.9"
1772 |   resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
1773 |   dependencies:
1774 |     hoek "2.x.x"
1775 | 
1776 | source-map-support@^0.4.2:
1777 |   version "0.4.15"
1778 |   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1"
1779 |   dependencies:
1780 |     source-map "^0.5.6"
1781 | 
1782 | source-map@^0.5.0, source-map@^0.5.6:
1783 |   version "0.5.6"
1784 |   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
1785 | 
1786 | sshpk@^1.7.0:
1787 |   version "1.13.1"
1788 |   resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
1789 |   dependencies:
1790 |     asn1 "~0.2.3"
1791 |     assert-plus "^1.0.0"
1792 |     dashdash "^1.12.0"
1793 |     getpass "^0.1.1"
1794 |   optionalDependencies:
1795 |     bcrypt-pbkdf "^1.0.0"
1796 |     ecc-jsbn "~0.1.1"
1797 |     jsbn "~0.1.0"
1798 |     tweetnacl "~0.14.0"
1799 | 
1800 | "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
1801 |   version "1.3.1"
1802 |   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
1803 | 
1804 | string-width@^1.0.1, string-width@^1.0.2:
1805 |   version "1.0.2"
1806 |   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
1807 |   dependencies:
1808 |     code-point-at "^1.0.0"
1809 |     is-fullwidth-code-point "^1.0.0"
1810 |     strip-ansi "^3.0.0"
1811 | 
1812 | string_decoder@~1.0.0:
1813 |   version "1.0.3"
1814 |   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
1815 |   dependencies:
1816 |     safe-buffer "~5.1.0"
1817 | 
1818 | stringstream@~0.0.4:
1819 |   version "0.0.5"
1820 |   resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
1821 | 
1822 | strip-ansi@^3.0.0, strip-ansi@^3.0.1:
1823 |   version "3.0.1"
1824 |   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
1825 |   dependencies:
1826 |     ansi-regex "^2.0.0"
1827 | 
1828 | strip-json-comments@~2.0.1:
1829 |   version "2.0.1"
1830 |   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1831 | 
1832 | supports-color@^2.0.0:
1833 |   version "2.0.0"
1834 |   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
1835 | 
1836 | tar-pack@^3.4.0:
1837 |   version "3.4.0"
1838 |   resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
1839 |   dependencies:
1840 |     debug "^2.2.0"
1841 |     fstream "^1.0.10"
1842 |     fstream-ignore "^1.0.5"
1843 |     once "^1.3.3"
1844 |     readable-stream "^2.1.4"
1845 |     rimraf "^2.5.1"
1846 |     tar "^2.2.1"
1847 |     uid-number "^0.0.6"
1848 | 
1849 | tar@^2.2.1:
1850 |   version "2.2.1"
1851 |   resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
1852 |   dependencies:
1853 |     block-stream "*"
1854 |     fstream "^1.0.2"
1855 |     inherits "2"
1856 | 
1857 | to-fast-properties@^1.0.1:
1858 |   version "1.0.3"
1859 |   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
1860 | 
1861 | tough-cookie@~2.3.0:
1862 |   version "2.3.2"
1863 |   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
1864 |   dependencies:
1865 |     punycode "^1.4.1"
1866 | 
1867 | trim-right@^1.0.1:
1868 |   version "1.0.1"
1869 |   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
1870 | 
1871 | tunnel-agent@^0.6.0:
1872 |   version "0.6.0"
1873 |   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
1874 |   dependencies:
1875 |     safe-buffer "^5.0.1"
1876 | 
1877 | tweetnacl@^0.14.3, tweetnacl@~0.14.0:
1878 |   version "0.14.5"
1879 |   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
1880 | 
1881 | type-is@~1.6.15:
1882 |   version "1.6.15"
1883 |   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
1884 |   dependencies:
1885 |     media-typer "0.3.0"
1886 |     mime-types "~2.1.15"
1887 | 
1888 | uid-number@^0.0.6:
1889 |   version "0.0.6"
1890 |   resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
1891 | 
1892 | unpipe@1.0.0, unpipe@~1.0.0:
1893 |   version "1.0.0"
1894 |   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
1895 | 
1896 | user-home@^1.1.1:
1897 |   version "1.1.1"
1898 |   resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
1899 | 
1900 | util-deprecate@~1.0.1:
1901 |   version "1.0.2"
1902 |   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1903 | 
1904 | utils-merge@1.0.0:
1905 |   version "1.0.0"
1906 |   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
1907 | 
1908 | uuid@^3.0.0, uuid@^3.0.1:
1909 |   version "3.1.0"
1910 |   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
1911 | 
1912 | v8flags@^2.0.10:
1913 |   version "2.1.1"
1914 |   resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
1915 |   dependencies:
1916 |     user-home "^1.1.1"
1917 | 
1918 | vary@^1, vary@~1.1.1:
1919 |   version "1.1.1"
1920 |   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37"
1921 | 
1922 | verror@1.3.6:
1923 |   version "1.3.6"
1924 |   resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
1925 |   dependencies:
1926 |     extsprintf "1.0.2"
1927 | 
1928 | wide-align@^1.1.0:
1929 |   version "1.1.2"
1930 |   resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
1931 |   dependencies:
1932 |     string-width "^1.0.2"
1933 | 
1934 | wrappy@1:
1935 |   version "1.0.2"
1936 |   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1937 | 
--------------------------------------------------------------------------------