├── .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 | 503 |
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 | 569 |
570 | ) 571 | } 572 | } 573 | 574 | ItemList.propTypes = { 575 | // This structure is Apollo-specific 576 | // the prop starts with a data root key 577 | // and contains loading, error, and your graphql root fields 578 | // that you're interested in pulling 579 | // see: https://www.learnapollo.com/tutorial-react/react-02#Displaying[object Object]information[object Object]of[object Object]your[object Object]trainer 580 | // under "Using query results in React components" 581 | 582 | data: PropTypes.shape({ 583 | loading: PropTypes.bool, 584 | error: PropTypes.object, 585 | // This corresponds with the 'items' field in the 'ItemListQuery' 586 | items: PropTypes.arrayOf(PropTypes.object), 587 | }).isRequired 588 | } 589 | 590 | // wrap the graphql (Apollo) store around the component 591 | // and call the getItemList query when there is a need to fetch data 592 | const ItemListView = graphql(itemQueries.getItemList)(ItemList) 593 | 594 | export default ItemListView 595 | ``` 596 | 597 | ## Run the server 598 | 599 | `npm run start` 600 | 601 | http://localhost:3001/ 602 | 603 | # Mutations 604 | 605 | Mutations involves updating data. The following will describe how to implement mutations. 606 | 607 | http://graphql.org/graphql-js/mutations-and-input-types/ 608 | 609 | ## Define Server-side mutation 610 | 611 | Implementing a mutation entrypoint is just like defining a normal query entrypoint: 612 | 613 | ### Define the `RootMutation` type entrypoint definitions 614 | 615 | We'll add a field called `RootMutation.addItem`, which will be the entrypoint to add an item. 616 | 617 | ```javascript 618 | // schema/root-mutation/root-mutation.type.js 619 | 620 | const RootMutation = ` 621 | type RootMutation { 622 | addItem ( 623 | name: String!, 624 | desc: String, 625 | ownerId: ID! 626 | ): Item 627 | } 628 | ` 629 | export default RootMutation 630 | 631 | ``` 632 | 633 | *Just like the `RootQuery`, you can change the name of the `RootMutation` type to whatever you want.* 634 | 635 | ### Define the `RootMutation` resolver 636 | 637 | Defining the resolver is just like any other resolver. 638 | 639 | ```javascript 640 | // schema/root-mutation/root-mutation.resolvers.js 641 | 642 | const rootMutationResolvers = { 643 | // this corresponds to the `RootMutation.addItem` type 644 | async addItem (rootObj, { name, desc, ownerId }) { 645 | // you'd have to implement this method yourself, would insert the item into a db 646 | return await addNewItem({ name, desc, ownerId }) 647 | } 648 | } 649 | 650 | export default rootMutationResolvers 651 | ``` 652 | 653 | ### Add the `RootMutation` resolver to the master resolvers 654 | 655 | ```javascript 656 | // schema/resolvers.js 657 | 658 | // I'm not including the other imports for clarity 659 | import RootMutation from './root-mutation/root-mutation.resolvers.js' 660 | 661 | export default { 662 | Item, 663 | RootQuery, 664 | // New addition here 665 | RootMutation 666 | } 667 | ``` 668 | 669 | ### Register the `RootMutation` type to the schema 670 | 671 | ```javascript 672 | // schema/schema.js 673 | 674 | // not including the other imports here for clarity 675 | import RootMutation from './root-mutation/root-mutation.type.js' 676 | 677 | // attach the RootMutation as a mutation 678 | // only ONE root query and mutation can be defined 679 | const SchemaDefinition = ` 680 | schema { 681 | query: RootQuery, 682 | mutation: RootMutation 683 | } 684 | ` 685 | 686 | const schema = makeExecutableSchema({ 687 | typeDefs: [ 688 | SchemaDefinition, 689 | RootQuery, 690 | // New addition here, can be added in any position in this array 691 | RootMutation, 692 | UserType, 693 | ItemType 694 | ], 695 | resolvers 696 | }) 697 | 698 | ``` 699 | 700 | ### Test the implementation 701 | 702 | Run the server, and try this query 703 | 704 | http://localhost:3000/graphiql?query=mutation%20newItem%20%7B%0A%20%20addItem(name%3A%22new.item%22%20desc%3A%20%22This%20is%20a%20new%20item%22%20ownerId%3A%201)%20%7B%0A%20%20%20%20id%0A%20%20%20%20name%0A%20%20%7D%0A%7D&operationName=newItem 705 | 706 | ## Client-side mutation integration 707 | 708 | ### Create an `addItem` query 709 | 710 | ```javascript 711 | // queries/item.queries.js 712 | 713 | export default { 714 | ... 715 | // see https://www.learnapollo.com/tutorial-react/react-05/ 716 | // 717 | addItem: gql`mutation addNewItem ($name: String!, $desc: String, $ownerId: ID!) { 718 | addItem(name: $name, desc: $desc, ownerId: $ownerId) { 719 | id 720 | } 721 | }` 722 | } 723 | 724 | ``` 725 | 726 | ### Create an `AddItem` component 727 | 728 | ```javascript 729 | // components/AddItem.jsx 730 | 731 | import React from 'react' 732 | import PropTypes from 'prop-types' 733 | import { graphql } from 'react-apollo' 734 | import itemQueries from '../queries/item.queries.js' 735 | 736 | class AddItem extends React.Component { 737 | constructor (props) { 738 | super(props) 739 | this.state = { 740 | name: '', 741 | desc: '' 742 | } 743 | } 744 | 745 | handleSave = () => { // eslint-disable-line no-undef 746 | const { 747 | name, 748 | desc 749 | } = this.state 750 | 751 | const ownerId = 1 752 | 753 | // see https://www.learnapollo.com/tutorial-react/react-05/ 754 | // "Using mutations in components" 755 | this.props.mutate({variables: { name, desc, ownerId }}).then(() => { 756 | // @todo bug: Item list doesn't refresh on redirect 757 | this.props.history.replace('/') 758 | }) 759 | } 760 | 761 | render () { 762 | return ( 763 |
764 | this.setState({name: e.target.value})} 768 | /> 769 |

770 | this.setState({desc: e.target.value})} 772 | placeholder='description' 773 | value={this.state.desc} 774 | /> 775 |

776 | 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 | 811 | 812 |
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 | 5 | 6 | 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 | this.setState({name: e.target.value})} 38 | /> 39 |

40 | this.setState({desc: e.target.value})} 42 | placeholder='description' 43 | value={this.state.desc} 44 | /> 45 |

46 | 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 | 32 |
33 | ) 34 | } 35 | } 36 | 37 | ItemList.propTypes = { 38 | // This structure is Apollo-specific 39 | // the prop starts with a data root key 40 | // and contains loading, error, and your graphql root fields 41 | // that you're interested in pulling 42 | // see: https://www.learnapollo.com/tutorial-react/react-02#Displaying[object Object]information[object Object]of[object Object]your[object Object]trainer 43 | // under "Using query results in React components" 44 | 45 | data: PropTypes.shape({ 46 | loading: PropTypes.bool, 47 | error: PropTypes.object, 48 | // This corresponds with the 'items' field in the 'ItemListQuery' 49 | items: PropTypes.arrayOf(PropTypes.object), 50 | }).isRequired 51 | } 52 | 53 | // wrap the graphql (Apollo) store around the component 54 | // and call the getItemList query when there is a need to fetch data 55 | const ItemListView = graphql(itemQueries.getItemList)(ItemList) 56 | 57 | export default ItemListView 58 | -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | 4 | // The ApolloClient allows you to call the GraphQL API server 5 | // and parses responses 6 | import ApolloClient, { createNetworkInterface } from 'apollo-client' 7 | 8 | // The ApolloProvider uses redux underneath the hood 9 | // and provides data connections to your components 10 | import { ApolloProvider } from 'react-apollo' 11 | 12 | import { 13 | BrowserRouter as Router, 14 | Route 15 | } from 'react-router-dom' 16 | 17 | import ItemList from './components/ItemList.jsx' 18 | import AddItem from './components/AddItem.jsx' 19 | 20 | const client = new ApolloClient({ 21 | // replace the uri with your server's host/port 22 | networkInterface: createNetworkInterface({ uri: 'http://localhost:3000/graphql'}), 23 | }) 24 | 25 | ReactDOM.render(( 26 | 27 | 28 |
29 | 30 | 31 |
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 | --------------------------------------------------------------------------------