From a1dc543f43250c0744646e8f977b3d335650f2a7 Mon Sep 17 00:00:00 2001 From: piglovesyou Date: Wed, 8 Aug 2018 03:16:07 +0900 Subject: [PATCH 01/21] Pure Apollo integration based on `master` - [x] `apollo-client` with full server-side rendering - [x] `apollo-link-state` - Client-side state management with `networkStatus` example - [x] `apollo-server` Without: * Flux (Redux) store - replaced by `apollo-link-state` * Fetch function - No need when you have an `apolloClient` --- .eslintrc.js | 9 + README.md | 72 +- docs/README.md | 2 - docs/data-fetching.md | 63 - docs/getting-started.md | 5 - docs/recipes/how-to-integrate-redux.md | 52 - jest.config.js | 3 +- package.json | 16 +- src/client.js | 30 +- src/components/App.js | 10 +- src/components/Layout/Layout.test.js | 12 +- .../createApolloClient.client.js | 45 + .../createApolloClient.server.js | 37 + src/core/createApolloClient/createCache.js | 19 + src/core/createApolloClient/package.json | 7 + src/core/createInitialState.js | 10 + src/createFetch.js | 76 - src/data/graphql/Database/schema.js | 31 + src/data/graphql/Database/users/CreateUser.js | 65 + .../graphql/Database/users/GetAllUsers.js | 84 + .../graphql/Database/users/GetLoggedInUser.js | 31 + .../News/reactjsnews.com/GetAllReactJSNews.js | 75 + src/data/graphql/News/schema.js | 14 + src/data/schema.js | 94 +- src/routes/home/Home.css | 5 + src/routes/home/Home.js | 60 +- src/routes/home/index.js | 11 +- src/routes/home/news.graphql | 11 + src/server.js | 56 +- src/state/OnMemory/networkState.js | 21 + src/state/README.md | 18 + src/state/index.js | 10 + tools/README.md | 3 +- tools/webpack.config.js | 19 +- yarn.lock | 1433 ++++++++++++++++- 35 files changed, 2142 insertions(+), 367 deletions(-) delete mode 100644 docs/data-fetching.md delete mode 100644 docs/recipes/how-to-integrate-redux.md create mode 100644 src/core/createApolloClient/createApolloClient.client.js create mode 100644 src/core/createApolloClient/createApolloClient.server.js create mode 100644 src/core/createApolloClient/createCache.js create mode 100644 src/core/createApolloClient/package.json create mode 100644 src/core/createInitialState.js delete mode 100644 src/createFetch.js create mode 100644 src/data/graphql/Database/schema.js create mode 100644 src/data/graphql/Database/users/CreateUser.js create mode 100644 src/data/graphql/Database/users/GetAllUsers.js create mode 100644 src/data/graphql/Database/users/GetLoggedInUser.js create mode 100644 src/data/graphql/News/reactjsnews.com/GetAllReactJSNews.js create mode 100644 src/data/graphql/News/schema.js create mode 100644 src/routes/home/news.graphql create mode 100644 src/state/OnMemory/networkState.js create mode 100644 src/state/README.md create mode 100644 src/state/index.js diff --git a/.eslintrc.js b/.eslintrc.js index d5f44b0b5..5f593427d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -46,6 +46,15 @@ module.exports = { }, ], + // Allow only special identifiers + // https://eslint.org/docs/rules/no-underscore-dangle + 'no-underscore-dangle': [ + 'error', + { + allow: ['__typename'], + }, + ], + // Prefer destructuring from arrays and objects // http://eslint.org/docs/rules/prefer-destructuring 'prefer-destructuring': [ diff --git a/README.md b/README.md index 11f6722da..5840d3f42 100644 --- a/README.md +++ b/README.md @@ -21,29 +21,27 @@ and newcomers to the industry. Hiring

- ### Getting Started - * Follow the [getting started guide](./docs/getting-started.md) to download and run the project - ([Node.js](https://nodejs.org/) >= 6.5) - * Check the [code recipes](./docs/recipes) used in this boilerplate, or share yours - +* Follow the [getting started guide](./docs/getting-started.md) to download and run the project + ([Node.js](https://nodejs.org/) >= 6.5) +* Check the [code recipes](./docs/recipes) used in this boilerplate, or share yours ### Customization The `master` branch of React Starter Kit doesn't include a Flux implementation or any other -advanced integrations. Nevertheless, we have some integrations available to you in *feature* +advanced integrations. Nevertheless, we have some integrations available to you in _feature_ branches that you can use either as a reference or merge into your project: - * [feature/redux](https://github.com/kriasoft/react-starter-kit/tree/feature/redux) ([PR](https://github.com/kriasoft/react-starter-kit/pull/1084)) - — isomorphic Redux by [Pavel Lang](https://github.com/langpavel) - (see [how to integrate Redux](./docs/recipes/how-to-integrate-redux.md)) (based on `master`) - * [feature/apollo](https://github.com/kriasoft/react-starter-kit/tree/feature/apollo) ([PR](https://github.com/kriasoft/react-starter-kit/pull/1147)) - — isomorphic Apollo Client by [Pavel Lang](https://github.com/langpavel) - (see [Tracking PR #1147](https://github.com/kriasoft/react-starter-kit/pull/1147)) (based on `feature/redux`) - * [feature/react-intl](https://github.com/kriasoft/react-starter-kit/tree/feature/react-intl) ([PR](https://github.com/kriasoft/react-starter-kit/pull/1135)) - — isomorphic Redux and React Intl by [Pavel Lang](https://github.com/langpavel) - (see [how to integrate React Intl](./docs/recipes/how-to-integrate-react-intl.md)) (based on `feature/apollo`) +* [feature/redux](https://github.com/kriasoft/react-starter-kit/tree/feature/redux) ([PR](https://github.com/kriasoft/react-starter-kit/pull/1084)) + — isomorphic Redux by [Pavel Lang](https://github.com/langpavel) + (see [how to integrate Redux](./docs/recipes/how-to-integrate-redux.md)) (based on `master`) +* [feature/apollo](https://github.com/kriasoft/react-starter-kit/tree/feature/apollo) ([PR](https://github.com/kriasoft/react-starter-kit/pull/1147)) + — isomorphic Apollo Client by [Pavel Lang](https://github.com/langpavel) + (see [Tracking PR #1147](https://github.com/kriasoft/react-starter-kit/pull/1147)) (based on `feature/redux`) +* [feature/react-intl](https://github.com/kriasoft/react-starter-kit/tree/feature/react-intl) ([PR](https://github.com/kriasoft/react-starter-kit/pull/1135)) + — isomorphic Redux and React Intl by [Pavel Lang](https://github.com/langpavel) + (see [how to integrate React Intl](./docs/recipes/how-to-integrate-react-intl.md)) (based on `feature/apollo`) You can see status of most reasonable merge combination as [PRs labeled as `TRACKING`](https://github.com/kriasoft/react-starter-kit/labels/TRACKING) @@ -51,7 +49,6 @@ If you think that any of these features should be on `master`, or vice versa, so removed from the `master` branch, please [let us know](https://gitter.im/kriasoft/react-starter-kit). We love your feedback! - ### Comparison @@ -98,12 +95,10 @@ We love your feedback! @@ -149,7 +144,6 @@ We love your feedback!
React, History, - Redux React, History, - Redux
- ### Backers ♥ React Starter Kit? Help us keep it alive by donating funds to cover project @@ -178,7 +172,6 @@ expenses via [OpenCollective](https://opencollective.com/react-starter-kit) or - ### How to Contribute Anyone and everyone is welcome to [contribute](CONTRIBUTING.md) to this project. The best way to @@ -188,35 +181,31 @@ start is by checking our [open issues](https://github.com/kriasoft/react-starter participate in discussions, upvote or downvote the issues you like or dislike, send [pull requests](CONTRIBUTING.md#pull-requests). - ### Learn More - * [Getting Started with React.js](http://facebook.github.io/react/) - * [Getting Started with GraphQL and Relay](https://quip.com/oLxzA1gTsJsE) - * [React.js Questions on StackOverflow](http://stackoverflow.com/questions/tagged/reactjs) - * [React.js Discussion Board](https://discuss.reactjs.org/) - * [Flux Architecture for Building User Interfaces](http://facebook.github.io/flux/) - * [Enzyme — JavaScript Testing utilities for React](http://airbnb.io/enzyme/) - * [Flow — A static type checker for JavaScript](http://flowtype.org/) - * [The Future of React](https://github.com/reactjs/react-future) - * [Learn ES6](https://babeljs.io/docs/learn-es6/), [ES6 Features](https://github.com/lukehoban/es6features#readme) - +* [Getting Started with React.js](http://facebook.github.io/react/) +* [Getting Started with GraphQL and Relay](https://quip.com/oLxzA1gTsJsE) +* [React.js Questions on StackOverflow](http://stackoverflow.com/questions/tagged/reactjs) +* [React.js Discussion Board](https://discuss.reactjs.org/) +* [Flux Architecture for Building User Interfaces](http://facebook.github.io/flux/) +* [Enzyme — JavaScript Testing utilities for React](http://airbnb.io/enzyme/) +* [Flow — A static type checker for JavaScript](http://flowtype.org/) +* [The Future of React](https://github.com/reactjs/react-future) +* [Learn ES6](https://babeljs.io/docs/learn-es6/), [ES6 Features](https://github.com/lukehoban/es6features#readme) ### Related Projects - * [GraphQL Starter Kit](https://github.com/kriasoft/graphql-starter-kit) — Boilerplate for building data APIs with Node.js, JavaScript (via Babel) and GraphQL - * [Membership Database](https://github.com/membership/membership.db) — SQL schema boilerplate for user accounts, profiles, roles, and auth claims - * [Babel Starter Kit](https://github.com/kriasoft/babel-starter-kit) — Boilerplate for authoring JavaScript/React.js libraries - +* [GraphQL Starter Kit](https://github.com/kriasoft/graphql-starter-kit) — Boilerplate for building data APIs with Node.js, JavaScript (via Babel) and GraphQL +* [Membership Database](https://github.com/membership/membership.db) — SQL schema boilerplate for user accounts, profiles, roles, and auth claims +* [Babel Starter Kit](https://github.com/kriasoft/babel-starter-kit) — Boilerplate for authoring JavaScript/React.js libraries ### Support - * [#react-starter-kit](http://stackoverflow.com/questions/tagged/react-starter-kit) on Stack Overflow — Questions and answers - * [#react-starter-kit](https://gitter.im/kriasoft/react-starter-kit) on Gitter — Watch announcements, share ideas and feedback - * [GitHub issues](https://github.com/kriasoft/react-starter-kit/issues), or [Scrum board](https://waffle.io/kriasoft/react-starter-kit) — File issues, send feature requests - * [appear.in/react](https://appear.in/react) — Open hours! Exchange ideas and experiences (React, GraphQL, startups and pet projects) - * [@koistya](https://twitter.com/koistya) on [Codementor](https://www.codementor.io/koistya), or [Skype](http://hatscripts.com/addskype?koistya) — Private consulting - +* [#react-starter-kit](http://stackoverflow.com/questions/tagged/react-starter-kit) on Stack Overflow — Questions and answers +* [#react-starter-kit](https://gitter.im/kriasoft/react-starter-kit) on Gitter — Watch announcements, share ideas and feedback +* [GitHub issues](https://github.com/kriasoft/react-starter-kit/issues), or [Scrum board](https://waffle.io/kriasoft/react-starter-kit) — File issues, send feature requests +* [appear.in/react](https://appear.in/react) — Open hours! Exchange ideas and experiences (React, GraphQL, startups and pet projects) +* [@koistya](https://twitter.com/koistya) on [Codementor](https://www.codementor.io/koistya), or [Skype](http://hatscripts.com/addskype?koistya) — Private consulting ### License @@ -226,6 +215,7 @@ file. The documentation to the project is licensed under the [CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/) license. --- + Made with ♥ by Konstantin Tarkus ([@koistya](https://twitter.com/koistya)) and [contributors](https://github.com/kriasoft/react-starter-kit/graphs/contributors) [rsk]: https://www.reactstarterkit.com diff --git a/docs/README.md b/docs/README.md index 99f478a28..ec0f1fd79 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,7 +5,6 @@ * [Getting Started](./getting-started.md) * [React Style Guide](./react-style-guide.md) * [How to configure text editors and IDEs](./how-to-configure-text-editors.md) -* [Data fetching with WHATWG Fetch](./data-fetching.md) * [Testing your application](./testing-your-application.md) ### Questions @@ -16,7 +15,6 @@ ### Recipes * [How to Implement Routing and Navigation](./recipes/how-to-implement-routing.md) -* [How to Integrate Redux](./recipes/how-to-integrate-redux.md) * [How to Integrate React Intl](./recipes/how-to-integrate-react-intl.md) * [How to Integrate Disqus](./recipes/how-to-integrate-disqus.md) * [How to Use Sass/SCSS](./recipes/how-to-use-sass.md) diff --git a/docs/data-fetching.md b/docs/data-fetching.md deleted file mode 100644 index 1ce808b16..000000000 --- a/docs/data-fetching.md +++ /dev/null @@ -1,63 +0,0 @@ -## Data Fetching - -At a bare minimum you may want to use [HTML5 Fetch API][fetch] as an HTTP client -utility for making Ajax request to the [data API server][nodeapi]. This API is -supported natively in all the major browsers except for IE (note, that Edge -browser does support Fetch). - -**React Starter Kit** is pre-configured with [`whatwg-fetch`][wfetch] polyfill -for the browser environment and [`node-fetch`][nfetch] module for the -server-side environment (see [`src/createFetch.js`](../src/createFetch.js)), -allowing you to use the `fetch(url, options)` method universally in both the -client-side and server-side code bases. - -In order to avoid the amount of boilerplate code needed when using the raw -`fetch(..)` function, a simple wrapper was created that provides a base URL of -the data API server, credentials (cookies), CORS etc. For example, in a browser -environment the base URL of the data API server might be an empty string, so -when you make an Ajax request to the `/graphql` endpoint it's being sent to the -same origin, and when the same code is executed on the server, during -server-side rendering, it fetches data from the `http://api:8080/graphql` -endpoint (`node-fetch` doesn't support relative URLs for obvious reasons). - -Because of these subtle differences of how the `fetch` method works internally, -it makes total sense to pass it as a `context` variable to your React -application, so it can be used from either routing level or from inside your -React components as follows: - -#### Route Example - -```js -{ - path: '/posts/:id', - async action({ params, fetch }) { - const resp = await fetch(`/api/posts/${params.id}`, { method: 'GET' }); - const data = await resp.json(); - return { title: data.title, component: }; - } -} -``` - -#### React Component - -```js -class Post extends React.Component { - static contextTypes = { fetch: PropTypes.func.isRequired }; - handleDelete = (event) => { - event.preventDefault(); - const id = event.target.dataset['id']; - this.context.fetch(`/api/posts/${id}`, { method: 'DELETE' }).then(...); - }; - render() { ... } -} -``` - -#### Related articles - -* [That's so fetch!](https://jakearchibald.com/2015/thats-so-fetch/) by - [Jake Archibald](https://twitter.com/jaffathecake) - -[fetch]: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch -[wfetch]: https://github.com/github/fetchno -[nfetch]: https://github.com/bitinn/node-fetch -[nodeapi]: https://github.com/kriasoft/nodejs-api-starter diff --git a/docs/getting-started.md b/docs/getting-started.md index b1a86d22c..e8f1530c5 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -44,11 +44,6 @@ Before you start, take a moment to see how the project structure looks like: └── yarn.lock # Fixed versions of all the dependencies ``` -**Note**: The current version of RSK does not contain a Flux implementation. It -can be easily integrated with any Flux library of your choice. The most commonly -used Flux libraries are [Flux](http://facebook.github.io/flux/), -[Redux](http://redux.js.org/) and [Relay](http://facebook.github.io/relay/). - ### Quick Start #### 1. Get the latest version diff --git a/docs/recipes/how-to-integrate-redux.md b/docs/recipes/how-to-integrate-redux.md deleted file mode 100644 index ae595c1ad..000000000 --- a/docs/recipes/how-to-integrate-redux.md +++ /dev/null @@ -1,52 +0,0 @@ -## How to Integrate [Redux](http://redux.js.org/index.html) - -Merge `feature/redux` branch with Git. If you are interested in `feature/react-intl`, merge that -branch instead as it also includes Redux. - -**If you don't know Redux well, you should [read about it first](http://redux.js.org/docs/basics/index.html).** - -### Creating Actions - -1. Go to `src/constants/index.js` and define action name there. - -2. Go to `src/actions/` and create file with appropriate name. You can copy - `src/actions/runtime.js` as a template. - -3. If you need async actions, use [`redux-thunk`](https://github.com/gaearon/redux-thunk#readme). - For inspiration on how to create async actions you can look at - [`setLocale`](https://github.com/kriasoft/react-starter-kit/blob/feature/react-intl/src/actions/intl.js) - action from `feature/react-intl`. - See [Async Flow](http://redux.js.org/docs/advanced/AsyncFlow.html) for more information on this - topic. - -### Creating Reducer (aka Store) - -1. Go to [`src/reducers/`](https://github.com/kriasoft/react-starter-kit/tree/feature/redux/src/reducers) and create new file there. - - You can copy [`src/reducers/runtime.js`](https://github.com/kriasoft/react-starter-kit/tree/feature/redux/src/reducers/runtime.js) as a template. - - * Do not forget to always return `state`. - * Never mutate provided `state`. - If you mutate state, rendering of connected component will not be triggered because of `===` equality. - Always return new value if you perform state update. - You can use this construct: `{ ...state, updatedKey: action.payload.value, }` - * Keep in mind that store state _must_ be repeatable by replaying actions on it. - For example, when you store timestamp, pass it into _action payload_. - If you call REST API, do it in action. _Never do this in reducer!_ - -2. Edit [`src/reducers/index.js`](https://github.com/kriasoft/react-starter-kit/tree/feature/redux/src/reducers/index.js), import your reducer and add it to root reducer created by - [`combineReducers`](http://redux.js.org/docs/api/combineReducers.html) - -### Connecting Components - -You can use [`connect()`](https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options) High-Order Component from [`react-redux`](https://github.com/reactjs/react-redux#readme) package. - -See [Usage With React](http://redux.js.org/docs/basics/UsageWithReact.html) on redux.js.org. - -For an example you can look at -[``](https://github.com/kriasoft/react-starter-kit/blob/feature/react-intl/src/components/LanguageSwitcher/LanguageSwitcher.js) -component from `feature/react-intl` branch. It demonstrates both subscribing to store and dispatching actions. - -### Dispatching Actions On Server - -See source of `src/server.js` diff --git a/jest.config.js b/jest.config.js index 7cf656483..22c241261 100644 --- a/jest.config.js +++ b/jest.config.js @@ -90,7 +90,8 @@ module.exports = { // timers: // [string] transform: { - '\\.(js|jsx|mjs)$': '/node_modules/babel-jest', + '\\.(js|jsx)$': '/node_modules/babel-jest', + '\\.(gql|graphql)$': '/node_modules/jest-transform-graphql', '^(?!.*\\.(js|jsx|json|css|less|styl|scss|sass|sss)$)': '/tools/lib/fileTransformer.js', }, diff --git a/package.json b/package.json index 77ec4a440..21eaead85 100644 --- a/package.json +++ b/package.json @@ -14,16 +14,27 @@ ], "dependencies": { "@babel/polyfill": "^7.0.0-beta.51", + "apollo-cache-inmemory": "^1.2.9", + "apollo-client": "^2.4.1", + "apollo-link": "^1.2.2", + "apollo-link-error": "^1.1.0", + "apollo-link-http": "^1.5.4", + "apollo-link-logger": "^1.2.3", + "apollo-link-schema": "^1.1.0", + "apollo-link-state": "^0.4.1", + "apollo-server": "^2.0.6", + "apollo-server-express": "^2.0.5", "body-parser": "^1.18.3", "classnames": "^2.2.6", "cookie-parser": "^1.4.3", "express": "^4.16.3", - "express-graphql": "^0.6.12", "express-jwt": "^5.3.1", "graphql": "^0.13.2", + "graphql-tag": "^2.9.2", "history": "^4.7.2", "isomorphic-style-loader": "^4.0.0", "jsonwebtoken": "^8.3.0", + "lodash.merge": "^4.6.1", "node-fetch": "^2.1.2", "normalize.css": "^8.0.0", "passport": "^0.4.0", @@ -32,6 +43,7 @@ "prop-types": "^15.6.1", "query-string": "^6.1.0", "react": "^16.4.1", + "react-apollo": "^2.1.11", "react-dom": "^16.4.1", "sequelize": "^4.37.10", "serialize-javascript": "^1.5.0", @@ -77,6 +89,8 @@ "husky": "^0.14.3", "identity-obj-proxy": "^3.0.0", "jest": "^23.1.0", + "jest-codemods": "^0.15.0", + "jest-transform-graphql": "^2.1.0", "lint-staged": "^7.2.0", "markdown-it": "^8.4.1", "mkdirp": "^0.5.1", diff --git a/src/client.js b/src/client.js index e35a71b7b..21ca03d83 100644 --- a/src/client.js +++ b/src/client.js @@ -12,13 +12,16 @@ import React from 'react'; import ReactDOM from 'react-dom'; import deepForceUpdate from 'react-deep-force-update'; import queryString from 'query-string'; +import gql from 'graphql-tag'; import { createPath } from 'history/PathUtils'; import App from './components/App'; -import createFetch from './createFetch'; import history from './history'; import { updateMeta } from './DOMUtils'; +import createApolloClient from './core/createApolloClient'; import router from './router'; +const apolloClient = createApolloClient(); + // Global (context) variables that can be easily accessed from any React component // https://facebook.github.io/react/docs/context.html const context = { @@ -31,10 +34,8 @@ const context = { removeCss.forEach(f => f()); }; }, - // Universal HTTP client - fetch: createFetch(fetch, { - baseUrl: window.App.apiUrl, - }), + // For react-apollo + client: apolloClient, }; const container = document.getElementById('app'); @@ -162,3 +163,22 @@ if (module.hot) { onLocationChange(currentLocation); }); } + +// This is a demonstration of how to mutate the client state of apollo-link-state. +// If you don't need the networkState, please erase below lines. +function onNetworkStatusChange() { + apolloClient.mutate({ + mutation: gql` + mutation updateNetworkStatus($isConnected: Boolean) { + updateNetworkStatus(isConnected: $isConnected) @client + } + `, + variables: { + isConnected: navigator.onLine, + }, + }); +} + +window.addEventListener('online', onNetworkStatusChange); +window.addEventListener('offline', onNetworkStatusChange); +onNetworkStatusChange(); diff --git a/src/components/App.js b/src/components/App.js index f20711f26..48979bdf0 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -9,15 +9,17 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { ApolloProvider } from 'react-apollo'; const ContextType = { // Enables critical path CSS rendering // https://github.com/kriasoft/isomorphic-style-loader insertCss: PropTypes.func.isRequired, // Universal HTTP client - fetch: PropTypes.func.isRequired, pathname: PropTypes.string.isRequired, query: PropTypes.object, + // Apollo Client + client: PropTypes.object.isRequired, }; /** @@ -55,9 +57,13 @@ class App extends React.PureComponent { } render() { + // Here, we are at universe level, sure? ;-) + const { client } = this.props.context; // NOTE: If you need to add or modify header, footer etc. of the app, // please do that inside the Layout component. - return React.Children.only(this.props.children); + return ( + {this.props.children} + ); } } diff --git a/src/components/Layout/Layout.test.js b/src/components/Layout/Layout.test.js index f2e249378..cd4547a0e 100644 --- a/src/components/Layout/Layout.test.js +++ b/src/components/Layout/Layout.test.js @@ -12,14 +12,24 @@ import React from 'react'; import renderer from 'react-test-renderer'; +import createApolloClient from '../../core/createApolloClient'; import App from '../App'; import Layout from './Layout'; describe('Layout', () => { test('renders children correctly', () => { + const client = createApolloClient(); + const wrapper = renderer .create( - {}, fetch: () => {}, pathname: '' }}> + {}, + // fetch: () => {}, + pathname: '', + client, + }} + >
diff --git a/src/core/createApolloClient/createApolloClient.client.js b/src/core/createApolloClient/createApolloClient.client.js new file mode 100644 index 000000000..1c938d042 --- /dev/null +++ b/src/core/createApolloClient/createApolloClient.client.js @@ -0,0 +1,45 @@ +// @flow + +import { ApolloClient } from 'apollo-client'; +import { from } from 'apollo-link'; +import { onError } from 'apollo-link-error'; +import { HttpLink } from 'apollo-link-http'; +import apolloLogger from 'apollo-link-logger'; +import { withClientState } from 'apollo-link-state'; +import createCache from './createCache'; +import { resolvers as clientSideResolvers } from '../../state'; + +export default function createApolloClient() { + const cache = createCache(); + + const stateLink = withClientState({ + cache, + defaults: window.App.initialState, + resolvers: clientSideResolvers, + }); + + const link = from([ + stateLink, + onError(({ graphQLErrors, networkError }) => { + if (graphQLErrors) + graphQLErrors.map(({ message, locations, path }) => + console.warn( + `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`, + ), + ); + if (networkError) console.warn(`[Network error]: ${networkError}`); + }), + ...(__DEV__ ? [apolloLogger] : []), + new HttpLink({ + uri: '/graphql', + credentials: 'include', + }), + ]); + + return new ApolloClient({ + link, + cache: cache.restore(window.App.cache), + queryDeduplication: true, + connectToDevTools: true, + }); +} diff --git a/src/core/createApolloClient/createApolloClient.server.js b/src/core/createApolloClient/createApolloClient.server.js new file mode 100644 index 000000000..c80d179ab --- /dev/null +++ b/src/core/createApolloClient/createApolloClient.server.js @@ -0,0 +1,37 @@ +// @flow + +import { ApolloClient } from 'apollo-client'; +import { from } from 'apollo-link'; +import { withClientState } from 'apollo-link-state'; +import { onError } from 'apollo-link-error'; +import { SchemaLink } from 'apollo-link-schema'; +import createCache from './createCache'; + +export default function createApolloClient(schema, initialState) { + const cache = createCache(); + const stateLink = withClientState({ + cache, + defaults: initialState, + resolvers: {}, + }); + const link = from([ + stateLink, + onError(({ graphQLErrors, networkError }) => { + if (graphQLErrors) + graphQLErrors.map(({ message, locations, path }) => + console.warn( + `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`, + ), + ); + if (networkError) console.warn(`[Network error]: ${networkError}`); + }), + new SchemaLink({ ...schema }), + ]); + + return new ApolloClient({ + link, + cache, + ssrMode: true, + queryDeduplication: true, + }); +} diff --git a/src/core/createApolloClient/createCache.js b/src/core/createApolloClient/createCache.js new file mode 100644 index 000000000..13de0ede5 --- /dev/null +++ b/src/core/createApolloClient/createCache.js @@ -0,0 +1,19 @@ +// @flow + +import { InMemoryCache, defaultDataIdFromObject } from 'apollo-cache-inmemory'; + +function dataIdFromObject(obj) { + switch (obj.__typename) { + case 'NewsItem': + return obj.link ? `NewsItem:${obj.link}` : defaultDataIdFromObject(obj); + default: + return defaultDataIdFromObject(obj); + } +} + +export default function createCache() { + // https://www.apollographql.com/docs/react/basics/caching.html#configuration + return new InMemoryCache({ + dataIdFromObject, + }); +} diff --git a/src/core/createApolloClient/package.json b/src/core/createApolloClient/package.json new file mode 100644 index 000000000..92411d5f5 --- /dev/null +++ b/src/core/createApolloClient/package.json @@ -0,0 +1,7 @@ +{ + "name": "createApolloClient", + "version": "0.0.0", + "private": true, + "main": "./createApolloClient.server.js", + "browser": "./createApolloClient.client.js" +} diff --git a/src/core/createInitialState.js b/src/core/createInitialState.js new file mode 100644 index 000000000..1eee323b2 --- /dev/null +++ b/src/core/createInitialState.js @@ -0,0 +1,10 @@ +// @flow + +import { defaults } from '../state/index'; + +export default function createInitialState(data: Object) { + return { + ...defaults, + ...data, + }; +} diff --git a/src/createFetch.js b/src/createFetch.js deleted file mode 100644 index 861ab7a86..000000000 --- a/src/createFetch.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * React Starter Kit (https://www.reactstarterkit.com/) - * - * Copyright © 2014-present Kriasoft, LLC. All rights reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE.txt file in the root directory of this source tree. - */ - -/* @flow */ - -import type { graphql as graphqType, GraphQLSchema } from 'graphql'; - -type Fetch = (url: string, options: ?any) => Promise; - -type Options = { - baseUrl: string, - cookie?: string, - schema?: GraphQLSchema, - graphql?: graphqType, -}; - -/** - * Creates a wrapper function around the HTML5 Fetch API that provides - * default arguments to fetch(...) and is intended to reduce the amount - * of boilerplate code in the application. - * https://developer.mozilla.org/docs/Web/API/Fetch_API/Using_Fetch - */ -function createFetch( - fetch: Fetch, - { baseUrl, cookie, schema, graphql }: Options, -) { - // NOTE: Tweak the default options to suite your application needs - const defaults = { - method: 'POST', // handy with GraphQL backends - mode: baseUrl ? 'cors' : 'same-origin', - credentials: baseUrl ? 'include' : 'same-origin', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - ...(cookie ? { Cookie: cookie } : null), - }, - }; - - return async (url: string, options: any) => { - const isGraphQL = url.startsWith('/graphql'); - if (schema && graphql && isGraphQL) { - // We're SSR, so route the graphql internal to avoid latency - const query = JSON.parse(options.body); - const result = await graphql( - schema, - query.query, - { request: {} }, // fill in request vars needed by graphql - null, - query.variables, - ); - return Promise.resolve({ - status: result.errors ? 400 : 200, - json: () => Promise.resolve(result), - }); - } - - return isGraphQL || url.startsWith('/api') - ? fetch(`${baseUrl}${url}`, { - ...defaults, - ...options, - headers: { - ...defaults.headers, - ...(options && options.headers), - }, - }) - : fetch(url, options); - }; -} - -export default createFetch; diff --git a/src/data/graphql/Database/schema.js b/src/data/graphql/Database/schema.js new file mode 100644 index 000000000..2739b0818 --- /dev/null +++ b/src/data/graphql/Database/schema.js @@ -0,0 +1,31 @@ +import merge from 'lodash.merge'; + +/** * Queries ** */ +import { + schema as GetAllUsers, + queries as GetAllUsersQueries, + resolvers as GetAllUsersResolver, +} from './users/GetAllUsers'; +import { + queries as GetLoggedInUserQueries, + resolvers as GetLoggedInUserResolver, +} from './users/GetLoggedInUser'; + +/** * Mutations ** */ +import { + schema as CreateUserInput, + mutation as CreateUser, + resolvers as CreateUserResolver, +} from './users/CreateUser'; + +export const schema = [...GetAllUsers, ...CreateUserInput]; + +export const queries = [...GetAllUsersQueries, ...GetLoggedInUserQueries]; + +export const mutations = [...CreateUser]; + +export const resolvers = merge( + GetAllUsersResolver, + GetLoggedInUserResolver, + CreateUserResolver, +); diff --git a/src/data/graphql/Database/users/CreateUser.js b/src/data/graphql/Database/users/CreateUser.js new file mode 100644 index 000000000..60bafd4dd --- /dev/null +++ b/src/data/graphql/Database/users/CreateUser.js @@ -0,0 +1,65 @@ +import { User, UserProfile } from 'data/models'; + +export const schema = [ + ` + # User profile data for creating a new local database user account + input UserProfile { + # A display name for the logged-in user + displayName: String! + + # A profile picture URL + picture: String + + # The user's gender + gender: String + + # The user's location + location: String + + # A website URL + website: String + } +`, +]; + +export const mutation = [ + ` + # Creates a new user and profile in the local database + databaseCreateUser( + # The email of the new user, this email must be unique in the database + email: String! + + # User profile information for creating a new local database user account + profile: UserProfile! + ): DatabaseUser +`, +]; + +export const resolvers = { + Mutation: { + async databaseCreateUser(parent, args) { + // If user already exists, throw error + const lookupUser = await User.findOne({ where: { email: args.email } }); + + if (lookupUser) { + // eslint-disable-next-line no-throw-literal + throw 'User already exists!'; + } + + // Create new user with profile in database + const user = await User.create( + { + email: args.email, + profile: { + ...args.profile, + }, + }, + { + include: [{ model: UserProfile, as: 'profile' }], + }, + ); + + return user; + }, + }, +}; diff --git a/src/data/graphql/Database/users/GetAllUsers.js b/src/data/graphql/Database/users/GetAllUsers.js new file mode 100644 index 000000000..3878b9051 --- /dev/null +++ b/src/data/graphql/Database/users/GetAllUsers.js @@ -0,0 +1,84 @@ +import { User, UserClaim, UserLogin, UserProfile } from 'data/models'; + +export const schema = [ + ` + # A user stored in the local database + type DatabaseUser { + id: String + email: String + emailConfirmed: Boolean + logins: [DatabaseUserLogin] + claims: [DatabaseUserClaim] + profile: DatabaseUserProfile + updatedAt: String + createdAt: String + } + + type DatabaseUserLogin { + name: String + key: String + createdAt: String + updatedAt: String + userId: String + } + + type DatabaseUserClaim { + id: Int + type: String + value: String + createdAt: String + updatedAt: String + userId: String + } + + type DatabaseUserProfile { + userId: String + displayName: String + picture: String + gender: String + location: String + website: String + createdAt: String + updatedAt: String + } +`, +]; + +export const queries = [ + ` + # Retrieves all users stored in the local database + databaseGetAllUsers: [DatabaseUser] + + # Retrieves a single user from the local database + databaseGetUser( + # The user's email address + email: String! + ): DatabaseUser +`, +]; + +export const resolvers = { + RootQuery: { + async databaseGetAllUsers() { + const users = await User.findAll({ + include: [ + { model: UserLogin, as: 'logins' }, + { model: UserClaim, as: 'claims' }, + { model: UserProfile, as: 'profile' }, + ], + }); + return users; + }, + async databaseGetUser(parent, { email }) { + const user = await User.findOne({ + where: { email }, + include: [ + { model: UserLogin, as: 'logins' }, + { model: UserClaim, as: 'claims' }, + { model: UserProfile, as: 'profile' }, + ], + }); + return user; + }, + }, +}; diff --git a/src/data/graphql/Database/users/GetLoggedInUser.js b/src/data/graphql/Database/users/GetLoggedInUser.js new file mode 100644 index 000000000..c60a2c220 --- /dev/null +++ b/src/data/graphql/Database/users/GetLoggedInUser.js @@ -0,0 +1,31 @@ +import { User, UserClaim, UserLogin, UserProfile } from 'data/models'; + +export const queries = [ + ` + # Retrieves information about the currently logged-in user + databaseGetLoggedInUser: DatabaseUser +`, +]; + +export const resolvers = { + RootQuery: { + async databaseGetLoggedInUser(parent, args, context) { + // Throw error if user is not authenticated + if (!context.user) { + return null; + } + + // Find logged in user from database + const dbUser = await User.findOne({ + where: { email: context.user.email }, + include: [ + { model: UserLogin, as: 'logins' }, + { model: UserClaim, as: 'claims' }, + { model: UserProfile, as: 'profile' }, + ], + }); + + return dbUser; + }, + }, +}; diff --git a/src/data/graphql/News/reactjsnews.com/GetAllReactJSNews.js b/src/data/graphql/News/reactjsnews.com/GetAllReactJSNews.js new file mode 100644 index 000000000..1166e8130 --- /dev/null +++ b/src/data/graphql/News/reactjsnews.com/GetAllReactJSNews.js @@ -0,0 +1,75 @@ +import fetch from 'node-fetch'; + +export const schema = [ + ` + # A single news article from [https://reactjsnews.com/](https://reactjsnews.com/) + type ReactJSNewsItem { + # The news item's title + title: String + + # A direct link URL to this news item on reactjsnews.com + link: String + + # The name of the news item's author + author: String + + # The date this news item was published + pubDate: String + + # News article in HTML format + content: String + } +`, +]; + +export const queries = [ + ` + # Retrieves the latest ReactJS News + reactjsGetAllNews: [ReactJSNewsItem] +`, +]; + +// React.js News Feed (RSS) +const url = + 'https://api.rss2json.com/v1/api.json' + + '?rss_url=https%3A%2F%2Freactjsnews.com%2Ffeed.xml'; + +let items = []; +let lastFetchTask; +let lastFetchTime = new Date(1970, 0, 1); + +export const resolvers = { + RootQuery: { + reactjsGetAllNews() { + if (lastFetchTask) { + return lastFetchTask; + } + + if (new Date() - lastFetchTime > 1000 * 60 * 10 /* 10 mins */) { + lastFetchTime = new Date(); + lastFetchTask = fetch(url) + .then(response => response.json()) + .then(data => { + if (data.status === 'ok') { + items = data.items; + } + + lastFetchTask = null; + return items; + }) + .catch(err => { + lastFetchTask = null; + throw err; + }); + + if (items.length) { + return items; + } + + return lastFetchTask; + } + + return items; + }, + }, +}; diff --git a/src/data/graphql/News/schema.js b/src/data/graphql/News/schema.js new file mode 100644 index 000000000..d33c5b2ea --- /dev/null +++ b/src/data/graphql/News/schema.js @@ -0,0 +1,14 @@ +import merge from 'lodash.merge'; + +/** * Queries ** */ +import { + schema as GetAllReactJSNews, + queries as GetAllReactJSNewsQueries, + resolvers as GetAllReactJSNewsResolver, +} from './reactjsnews.com/GetAllReactJSNews'; + +export const schema = [...GetAllReactJSNews]; + +export const queries = [...GetAllReactJSNewsQueries]; + +export const resolvers = merge(GetAllReactJSNewsResolver); diff --git a/src/data/schema.js b/src/data/schema.js index 6156b07cd..d938a153e 100644 --- a/src/data/schema.js +++ b/src/data/schema.js @@ -7,22 +7,80 @@ * LICENSE.txt file in the root directory of this source tree. */ +import merge from 'lodash.merge'; + +import { + schema as NewsSchema, + resolvers as NewsResolvers, + queries as NewsQueries, +} from './graphql/News/schema'; + import { - GraphQLSchema as Schema, - GraphQLObjectType as ObjectType, -} from 'graphql'; - -import me from './queries/me'; -import news from './queries/news'; - -const schema = new Schema({ - query: new ObjectType({ - name: 'Query', - fields: { - me, - news, - }, - }), -}); - -export default schema; + schema as DatabaseSchema, + resolvers as DatabaseResolvers, + mutations as DatabaseMutations, + queries as DatabaseQueries, +} from './graphql/Database/schema'; + +const RootQuery = [ + ` + # # React-Starter-Kit Querying API + # ### This GraphQL schema was built with [Apollo GraphQL-Tools](https://github.com/apollographql/graphql-tools) + # _Build, mock, and stitch a GraphQL schema using the schema language_ + # + # **[Schema Language Cheet Sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png)** + # + # 1. Use the GraphQL schema language to [generate a schema](https://www.apollographql.com/docs/graphql-tools/generate-schema.html) with full support for resolvers, interfaces, unions, and custom scalars. The schema produced is completely compatible with [GraphQL.js](https://github.com/graphql/graphql-js). + # 2. [Mock your GraphQL API](https://www.apollographql.com/docs/graphql-tools/mocking.html) with fine-grained per-type mocking + # 3. Automatically [stitch multiple schemas together](https://www.apollographql.com/docs/graphql-tools/schema-stitching.html) into one larger API + type RootQuery { + ${NewsQueries} + ${DatabaseQueries} + } +`, +]; + +const Mutation = [ + ` + # # React-Starter-Kit Mutating API + # ### This GraphQL schema was built with [Apollo GraphQL-Tools](https://github.com/apollographql/graphql-tools) + # _Build, mock, and stitch a GraphQL schema using the schema language_ + # + # **[Schema Language Cheet Sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png)** + # + # 1. Use the GraphQL schema language to [generate a schema](https://www.apollographql.com/docs/graphql-tools/generate-schema.html) with full support for resolvers, interfaces, unions, and custom scalars. The schema produced is completely compatible with [GraphQL.js](https://github.com/graphql/graphql-js). + # 2. [Mock your GraphQL API](https://www.apollographql.com/docs/graphql-tools/mocking.html) with fine-grained per-type mocking + # 3. Automatically [stitch multiple schemas together](https://www.apollographql.com/docs/graphql-tools/schema-stitching.html) into one larger API + type Mutation { + ${DatabaseMutations} + } +`, +]; + +const SchemaDefinition = [ + ` + schema { + query: RootQuery + mutation: Mutation + } +`, +]; + +// Merge all of the resolver objects together +// Put schema together into one array of schema strings +const resolvers = merge(NewsResolvers, DatabaseResolvers); + +const schema = [ + ...SchemaDefinition, + ...RootQuery, + ...Mutation, + + ...NewsSchema, + ...DatabaseSchema, +]; + +export default { + typeDefs: schema, + resolvers, + ...(__DEV__ ? { log: e => console.error(e.stack) } : {}), +}; diff --git a/src/routes/home/Home.css b/src/routes/home/Home.css index 953012774..2aaa1901c 100644 --- a/src/routes/home/Home.css +++ b/src/routes/home/Home.css @@ -47,3 +47,8 @@ max-width: 100%; } } + +.networkStatusMessage { + font-size: 0.875rem; + color: #ccc; +} diff --git a/src/routes/home/Home.js b/src/routes/home/Home.js index c4e4b8f60..63914d71a 100644 --- a/src/routes/home/Home.js +++ b/src/routes/home/Home.js @@ -9,41 +9,61 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { graphql, compose } from 'react-apollo'; import withStyles from 'isomorphic-style-loader/lib/withStyles'; +import newsQuery from './news.graphql'; import s from './Home.css'; class Home extends React.Component { static propTypes = { - news: PropTypes.arrayOf( - PropTypes.shape({ - title: PropTypes.string.isRequired, - link: PropTypes.string.isRequired, - content: PropTypes.string, - }), - ).isRequired, + data: PropTypes.shape({ + loading: PropTypes.bool.isRequired, + reactjsGetAllNews: PropTypes.arrayOf( + PropTypes.shape({ + title: PropTypes.string.isRequired, + link: PropTypes.string.isRequired, + content: PropTypes.string, + }), + ), + }).isRequired, }; render() { + const { + data: { + loading, + reactjsGetAllNews, + networkStatus: { isConnected }, + }, + } = this.props; return (
+

+ {isConnected ? 'Online' : 'Offline'} +

React.js News

- {this.props.news.map(item => ( - - ))} + {loading + ? 'Loading...' + : reactjsGetAllNews.map(item => ( + + ))}
); } } -export default withStyles(s)(Home); +export default compose( + withStyles(s), + graphql(newsQuery), +)(Home); diff --git a/src/routes/home/index.js b/src/routes/home/index.js index d330e10e4..31fe01177 100644 --- a/src/routes/home/index.js +++ b/src/routes/home/index.js @@ -11,20 +11,13 @@ import React from 'react'; import Home from './Home'; import Layout from '../../components/Layout'; -async function action({ fetch }) { - const resp = await fetch('/graphql', { - body: JSON.stringify({ - query: '{news{title,link,content}}', - }), - }); - const { data } = await resp.json(); - if (!data || !data.news) throw new Error('Failed to load the news feed.'); +async function action() { return { title: 'React Starter Kit', chunks: ['home'], component: ( - + ), }; diff --git a/src/routes/home/news.graphql b/src/routes/home/news.graphql new file mode 100644 index 000000000..66a216ded --- /dev/null +++ b/src/routes/home/news.graphql @@ -0,0 +1,11 @@ +query HomeNews { + reactjsGetAllNews { + title + link + content + } + + networkStatus @client { + isConnected + } +} diff --git a/src/server.js b/src/server.js index 2bad532b5..6d6fabd90 100644 --- a/src/server.js +++ b/src/server.js @@ -12,18 +12,17 @@ import express from 'express'; import cookieParser from 'cookie-parser'; import bodyParser from 'body-parser'; import expressJwt, { UnauthorizedError as Jwt401Error } from 'express-jwt'; -import { graphql } from 'graphql'; -import expressGraphQL from 'express-graphql'; import jwt from 'jsonwebtoken'; -import nodeFetch from 'node-fetch'; import React from 'react'; import ReactDOM from 'react-dom/server'; import PrettyError from 'pretty-error'; +import { ApolloServer, makeExecutableSchema } from 'apollo-server-express'; +import { getDataFromTree } from 'react-apollo'; +import createApolloClient from './core/createApolloClient'; import App from './components/App'; import Html from './components/Html'; import { ErrorPageWithoutStyle } from './routes/error/ErrorPage'; import errorPageStyle from './routes/error/ErrorPage.css'; -import createFetch from './createFetch'; import passport from './passport'; import router from './router'; import models from './data/models'; @@ -31,6 +30,7 @@ import schema from './data/schema'; // import assets from './asset-manifest.json'; // eslint-disable-line import/no-unresolved import chunks from './chunk-manifest.json'; // eslint-disable-line import/no-unresolved import config from './config'; +import createInitialState from './core/createInitialState'; process.on('unhandledRejection', (reason, p) => { console.error('Unhandled Rejection at:', p, 'reason:', reason); @@ -108,15 +108,16 @@ app.get( // // Register API middleware // ----------------------------------------------------------------------------- -app.use( - '/graphql', - expressGraphQL(req => ({ - schema, - graphiql: __DEV__, - rootValue: { request: req }, - pretty: __DEV__, - })), -); +// https://github.com/graphql/express-graphql#options + +const server = new ApolloServer({ + ...schema, + uploads: false, + introspection: __DEV__, + playground: __DEV__, + debug: __DEV__, +}); +server.applyMiddleware({ app }); // // Register server-side rendering middleware @@ -132,22 +133,27 @@ app.get('*', async (req, res, next) => { styles.forEach(style => css.add(style._getCss())); }; - // Universal HTTP client - const fetch = createFetch(nodeFetch, { - baseUrl: config.api.serverUrl, - cookie: req.headers.cookie, - schema, - graphql, + const initialState = createInitialState({ + user: req.user || null, }); + const apolloClient = createApolloClient( + { + schema: makeExecutableSchema(schema), + rootValue: { request: req }, + }, + initialState, + ); + // Global (context) variables that can be easily accessed from any React component // https://facebook.github.io/react/docs/context.html const context = { insertCss, - fetch, // The twins below are wild, be careful! pathname: req.path, query: req.query, + // Apollo Client for use with react-apollo + client: apolloClient, }; const route = await router.resolve(context); @@ -158,9 +164,9 @@ app.get('*', async (req, res, next) => { } const data = { ...route }; - data.children = ReactDOM.renderToString( - {route.component}, - ); + const rootComponent = {route.component}; + await getDataFromTree(rootComponent); + data.children = await ReactDOM.renderToString(rootComponent); data.styles = [{ id: 'css', cssText: [...css].join('') }]; const scripts = new Set(); @@ -178,6 +184,10 @@ app.get('*', async (req, res, next) => { data.scripts = Array.from(scripts); data.app = { apiUrl: config.api.clientUrl, + // Cache for client-side apolloClient + cache: context.client.extract(), + // Initial state for client-side stateLink + initialState, }; const html = ReactDOM.renderToStaticMarkup(); diff --git a/src/state/OnMemory/networkState.js b/src/state/OnMemory/networkState.js new file mode 100644 index 000000000..e1d530c25 --- /dev/null +++ b/src/state/OnMemory/networkState.js @@ -0,0 +1,21 @@ +export const defaults = { + networkStatus: { + __typename: 'NetworkStatus', + isConnected: true, + }, +}; + +export const resolvers = { + Mutation: { + updateNetworkStatus: (_, { isConnected }, { cache }) => { + const data = { + networkStatus: { + __typename: 'NetworkStatus', + isConnected, + }, + }; + cache.writeData({ data }); + return null; + }, + }, +}; diff --git a/src/state/README.md b/src/state/README.md new file mode 100644 index 000000000..ebb1f5670 --- /dev/null +++ b/src/state/README.md @@ -0,0 +1,18 @@ +# Client State + +`./src/state` implies a state only stored on a user machine, +instead of remote database or remote public API, through +`@client` directive in graphql. + +Although these are not GraphQL API, components can access to the data +through an apollo client, thanks to `apollo-link-state`. + +## Storages + +JavaScript memory is one type. + +Other type could be LocalStorage, SessionStorage or IndexedDB. + +# Other Resources + +* [apollo-link-state](https://www.apollographql.com/docs/link/links/state.html) diff --git a/src/state/index.js b/src/state/index.js new file mode 100644 index 000000000..54ae456c6 --- /dev/null +++ b/src/state/index.js @@ -0,0 +1,10 @@ +import merge from 'lodash.merge'; + +import { + resolvers as NetworkStateResolvers, + defaults as NetworkStateDefaults, +} from './OnMemory/networkState'; + +export const defaults = merge(NetworkStateDefaults); + +export const resolvers = merge(NetworkStateResolvers); diff --git a/tools/README.md b/tools/README.md index 2e45cc14f..4615c50d6 100644 --- a/tools/README.md +++ b/tools/README.md @@ -50,6 +50,5 @@ $ yarn start --release # Launch dev server in production mode server-side bundles * `postcss.config.js` - PostCSS configuration for transforming styles with JS plugins -* `run.js` - Helps to launch other scripts with `babel-node` (e.g. `babel-node - tools/run build`) +* `run.js` - Helps to launch other scripts with `babel-node` (e.g. `babel-node tools/run build`) * `.eslintrc` - ESLint overrides for built automation scripts diff --git a/tools/webpack.config.js b/tools/webpack.config.js index 4dd658fed..2b7009603 100644 --- a/tools/webpack.config.js +++ b/tools/webpack.config.js @@ -27,8 +27,10 @@ const isAnalyze = process.argv.includes('--analyze') || process.argv.includes('--analyse'); const reScript = /\.(js|jsx|mjs)$/; +const reGraphql = /\.(graphql|gql)$/; const reStyle = /\.(css|less|styl|scss|sass|sss)$/; const reImage = /\.(bmp|gif|jpg|jpeg|png|svg)$/; + const staticAssetName = isDebug ? '[path][name].[ext]?[hash:8]' : '[hash:8].[ext]'; @@ -122,6 +124,13 @@ const config = { }, }, + // Rules for GraphQL + { + test: reGraphql, + exclude: /node_modules/, + loader: 'graphql-tag/loader', + }, + // Rules for Style Sheets { test: reStyle, @@ -242,7 +251,15 @@ const config = { // Return public URL for all assets unless explicitly excluded // DO NOT FORGET to update `exclude` list when you adding a new loader { - exclude: [reScript, reStyle, reImage, /\.json$/, /\.txt$/, /\.md$/], + exclude: [ + reScript, + reStyle, + reImage, + reGraphql, + /\.json$/, + /\.txt$/, + /\.md$/, + ], loader: 'file-loader', options: { name: staticAssetName, diff --git a/yarn.lock b/yarn.lock index 4b04643bd..ba3ca3bb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,18 @@ # yarn lockfile v1 +"@apollographql/apollo-upload-server@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-upload-server/-/apollo-upload-server-5.0.3.tgz#8558c378ff6457de82147e5072c96a6b242773b7" + dependencies: + "@babel/runtime-corejs2" "^7.0.0-rc.1" + busboy "^0.2.14" + object-path "^0.11.4" + +"@apollographql/graphql-playground-html@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.0.tgz#15e1a042b97d6834e6d70b17cc73e1514fde9027" + "@babel/code-frame@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" @@ -771,6 +783,13 @@ pirates "^3.0.1" source-map-support "^0.4.2" +"@babel/runtime-corejs2@^7.0.0-rc.1": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.0.0.tgz#786711ee099c2c2af7875638866c1259eff30a8c" + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.12.0" + "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" @@ -846,20 +865,150 @@ version "1.1.0" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a" +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" dependencies: any-observable "^0.3.0" +"@types/accepts@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + dependencies: + "@types/node" "*" + +"@types/async@2.0.49": + version "2.0.49" + resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.49.tgz#92e33d13f74c895cb9a7f38ba97db8431ed14bc0" + +"@types/body-parser@*", "@types/body-parser@1.17.0": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + dependencies: + "@types/node" "*" + +"@types/cors@^2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.4.tgz#50991a759a29c0b89492751008c6af7a7c8267b0" + dependencies: + "@types/express" "*" + +"@types/events@*": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" + +"@types/express-serve-static-core@*": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" + dependencies: + "@types/events" "*" + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@4.16.0": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + "@types/geojson@^1.0.0": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" +"@types/graphql@0.12.6": + version "0.12.6" + resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.12.6.tgz#3d619198585fcabe5f4e1adfb5cf5f3388c66c13" + +"@types/long@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" + +"@types/mime@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" + "@types/node@*": version "10.3.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.4.tgz#c74e8aec19e555df44609b8057311052a2c84d9e" +"@types/node@^10.1.0": + version "10.9.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.4.tgz#0f4cb2dc7c1de6096055357f70179043c33e9897" + +"@types/range-parser@*": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d" + +"@types/serve-static@*": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +"@types/ws@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.2.tgz#f02d3b1cd46db7686734f3ce83bdf46c49decd64" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/zen-observable@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" + "@webassemblyjs/ast@1.5.12": version "1.5.12" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.12.tgz#a9acbcb3f25333c4edfa1fdf3186b1ccf64e6664" @@ -1004,7 +1153,7 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -accepts@^1.3.0, accepts@~1.3.3, accepts@~1.3.4, accepts@~1.3.5: +accepts@^1.3.5, accepts@~1.3.3, accepts@~1.3.4, accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: @@ -1087,6 +1236,12 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -1117,6 +1272,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" @@ -1135,6 +1294,194 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +apollo-cache-control@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.2.3.tgz#4f08a1390e4cadcfc43b1f1cb697b37983c6851c" + dependencies: + apollo-server-env "2.0.3" + graphql-extensions "0.1.3" + +apollo-cache-inmemory@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.2.9.tgz#26e0c8c6a6c865bf9987d741114388cdbc3fae23" + dependencies: + apollo-cache "^1.1.16" + apollo-utilities "^1.0.20" + graphql-anywhere "^4.1.18" + +apollo-cache@1.1.16, apollo-cache@^1.1.16: + version "1.1.16" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.1.16.tgz#0c7460ee8eff1898462979143b4e922aaba73cf8" + dependencies: + apollo-utilities "^1.0.20" + +apollo-client@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.4.1.tgz#d2ebaac1831fa170f7d0070bb9d581cccb5f64e3" + dependencies: + "@types/zen-observable" "^0.8.0" + apollo-cache "1.1.16" + apollo-link "^1.0.0" + apollo-link-dedup "^1.0.0" + apollo-utilities "1.0.20" + symbol-observable "^1.0.2" + zen-observable "^0.8.0" + optionalDependencies: + "@types/async" "2.0.49" + +apollo-datasource@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.1.3.tgz#e7ae9d20f29a8a35f239b02f0c47169cfd78d70b" + dependencies: + apollo-server-caching "0.1.2" + apollo-server-env "2.0.3" + +apollo-engine-reporting-protobuf@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.0.1.tgz#cd394f0f769c6f97d8621c4a7839095c84efcdb0" + dependencies: + protobufjs "^6.8.6" + +apollo-engine-reporting@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-0.0.3.tgz#7ab09c0bd5fc023769d722b8472cd5f92f4e4034" + dependencies: + apollo-engine-reporting-protobuf "0.0.1" + apollo-server-env "2.0.3" + async-retry "^1.2.1" + graphql-extensions "0.1.3" + lodash "^4.17.10" + +apollo-link-dedup@^1.0.0: + version "1.0.9" + resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.9.tgz#3c4e4af88ef027cbddfdb857c043fd0574051dad" + dependencies: + apollo-link "^1.2.2" + +apollo-link-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.0.tgz#ef8a64411361314364db40c1d4023b987a84860f" + dependencies: + apollo-link "^1.2.2" + +apollo-link-http-common@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.4.tgz#877603f7904dc8f70242cac61808b1f8d034b2c3" + dependencies: + apollo-link "^1.2.2" + +apollo-link-http@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.4.tgz#b80b7b4b342c655b6a5614624b076a36be368f43" + dependencies: + apollo-link "^1.2.2" + apollo-link-http-common "^0.2.4" + +apollo-link-logger@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/apollo-link-logger/-/apollo-link-logger-1.2.3.tgz#1f3e6f7849ce7a7e3aa822141fe062cfa278b1e1" + +apollo-link-schema@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/apollo-link-schema/-/apollo-link-schema-1.1.0.tgz#033fda26ffdbfc809d04892de554867f50e2af8e" + dependencies: + apollo-link "^1.2.2" + +apollo-link-state@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.1.tgz#65e9e0e12c67936b8c4b12b8438434f393104579" + dependencies: + apollo-utilities "^1.0.8" + graphql-anywhere "^4.1.0-alpha.0" + +apollo-link@^1.0.0, apollo-link@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.2.tgz#54c84199b18ac1af8d63553a68ca389c05217a03" + dependencies: + "@types/graphql" "0.12.6" + apollo-utilities "^1.0.0" + zen-observable-ts "^0.8.9" + +apollo-server-caching@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.1.2.tgz#f5b85701945110a5fca1956450e8553576635936" + dependencies: + lru-cache "^4.1.3" + +apollo-server-core@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.0.5.tgz#b0e2b6b46ad9485f17f40b3242ff070b46ddb6c7" + dependencies: + "@apollographql/apollo-upload-server" "^5.0.3" + "@types/ws" "^5.1.2" + apollo-cache-control "0.2.3" + apollo-datasource "0.1.3" + apollo-engine-reporting "0.0.3" + apollo-server-caching "0.1.2" + apollo-server-env "2.0.3" + apollo-server-errors "2.0.2" + apollo-tracing "0.2.3" + graphql-extensions "0.1.3" + graphql-subscriptions "^0.5.8" + graphql-tag "^2.9.2" + graphql-tools "^3.0.4" + hash.js "^1.1.3" + lodash "^4.17.10" + subscriptions-transport-ws "^0.9.11" + ws "^5.2.0" + +apollo-server-env@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.0.3.tgz#3c13552cd33f400160076cf8e1c9b24be4d27e13" + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-errors@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.0.2.tgz#e9cbb1b74d2cd78aed23cd886ca2d0c186323b2b" + +apollo-server-express@2.0.5, apollo-server-express@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.0.5.tgz#a576191df808d7e5ecf23665afae28fe78291372" + dependencies: + "@apollographql/apollo-upload-server" "^5.0.3" + "@apollographql/graphql-playground-html" "^1.6.0" + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.17.0" + "@types/cors" "^2.8.4" + "@types/express" "4.16.0" + accepts "^1.3.5" + apollo-server-core "2.0.5" + body-parser "^1.18.3" + cors "^2.8.4" + graphql-subscriptions "^0.5.8" + graphql-tools "^3.0.4" + type-is "^1.6.16" + +apollo-server@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.0.6.tgz#c4d79162dfac887399d0dddda5c26941d959b806" + dependencies: + apollo-server-core "2.0.5" + apollo-server-express "2.0.5" + express "^4.0.0" + graphql-subscriptions "^0.5.8" + graphql-tools "^3.0.4" + +apollo-tracing@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.2.3.tgz#25092fc88456614f81a41f4e5a1f7e4586a8a9b8" + dependencies: + apollo-server-env "2.0.3" + graphql-extensions "0.1.3" + +apollo-utilities@1.0.20, apollo-utilities@^1.0.0, apollo-utilities@^1.0.1, apollo-utilities@^1.0.20, apollo-utilities@^1.0.8: + version "1.0.20" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.20.tgz#b14318686cb67838279fb5f009cca0ec97a4d140" + dependencies: + fast-json-stable-stringify "^2.0.0" + app-root-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" @@ -1187,6 +1534,10 @@ arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" @@ -1282,6 +1633,10 @@ ast-types-flow@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" +ast-types@0.11.5: + version "0.11.5" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.5.tgz#9890825d660c03c28339f315e9fa0a360e31ec28" + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -1298,6 +1653,12 @@ async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" +async-retry@^1.2.1: + version "1.2.1" + resolved "http://registry.npmjs.org/async-retry/-/async-retry-1.2.1.tgz#308c6c4e1d91e63397a4676290334ae9bda7bcb1" + dependencies: + retry "0.10.1" + async@1.5.2, async@^1.4.0, async@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1419,6 +1780,117 @@ babel-generator@^6.18.0, babel-generator@^6.26.0: source-map "^0.5.7" trim-right "^1.0.1" +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" @@ -1447,6 +1919,12 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + babel-plugin-istanbul@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" @@ -1456,18 +1934,340 @@ babel-plugin-istanbul@^4.1.6: istanbul-lib-instrument "^1.10.1" test-exclude "^4.2.1" -babel-plugin-jest-hoist@^23.0.1: - version "23.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz#eaa11c964563aea9c21becef2bdf7853f7f3c148" +babel-plugin-jest-hoist@^23.0.1: + version "23.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz#eaa11c964563aea9c21becef2bdf7853f7f3c148" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" -babel-plugin-syntax-object-rest-spread@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" babel-plugin-transform-react-remove-prop-types@^0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.13.tgz#331cfc05099a808238311d78319c27460d481189" +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-es2015@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + babel-preset-jest@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz#631cc545c6cf021943013bcaf22f45d87fe62198" @@ -1475,7 +2275,34 @@ babel-preset-jest@^23.0.1: babel-plugin-jest-hoist "^23.0.1" babel-plugin-syntax-object-rest-spread "^6.13.0" -babel-register@^6.26.0: +babel-preset-stage-1@^6.5.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0, babel-register@^6.9.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: @@ -1487,7 +2314,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.22.0, babel-runtime@^6.25.0, babel-runtime@^6.26.0: +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.25.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -1504,7 +2331,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.26.0: +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -1518,7 +2345,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.26.0: +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -1535,7 +2362,11 @@ babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" -backo2@1.0.2: +babylon@^7.0.0-beta.47: + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" + +backo2@1.0.2, backo2@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" @@ -1657,6 +2488,18 @@ boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1855,6 +2698,13 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" +busboy@^0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -1940,7 +2790,7 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -camelcase@^4.1.0: +camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -1967,6 +2817,10 @@ capture-exit@^1.2.0: dependencies: rsvp "^3.3.3" +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1982,7 +2836,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -2000,6 +2854,14 @@ chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@~0.4.0: + version "0.4.0" + resolved "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + character-entities-html4@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.2.tgz#c44fdde3ce66b52e8d321d6c1bf46101f0150610" @@ -2113,6 +2975,10 @@ classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -2247,6 +3113,10 @@ colors@0.5.x: version "0.5.1" resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" +colors@^1.1.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" + colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -2298,6 +3168,17 @@ concat-stream@^1.5.0, concat-stream@^1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" @@ -2333,7 +3214,7 @@ content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" -content-type@^1.0.4, content-type@~1.0.4: +content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -2383,6 +3264,13 @@ core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cors@^2.8.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" + dependencies: + object-assign "^4" + vary "^1" + cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" @@ -2410,6 +3298,12 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -2431,6 +3325,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -2455,6 +3356,10 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + css-color-function@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/css-color-function/-/css-color-function-1.3.3.tgz#8ed24c2c0205073339fafa004bc8c141fccb282e" @@ -2727,6 +3632,10 @@ depd@^1.1.0, depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -2763,6 +3672,13 @@ dev-ip@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -2862,7 +3778,7 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.1: +dot-prop@^4.1.0, dot-prop@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: @@ -2872,6 +3788,10 @@ dottie@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.0.tgz#da191981c8b8d713ca0115d5898cf397c2f0ddd0" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -3280,6 +4200,10 @@ esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" +esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + esquery@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -3308,6 +4232,10 @@ eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" +eventemitter3@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -3331,6 +4259,17 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +execa@^0.4.0, execa@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + dependencies: + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" + npm-run-path "^1.0.0" + object-assign "^4.0.1" + path-key "^1.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3410,15 +4349,6 @@ expect@^23.1.0: jest-message-util "^23.1.0" jest-regex-util "^23.0.0" -express-graphql@^0.6.12: - version "0.6.12" - resolved "https://registry.yarnpkg.com/express-graphql/-/express-graphql-0.6.12.tgz#dfcb2058ca72ed5190b140830ad8cdbf76a9128a" - dependencies: - accepts "^1.3.0" - content-type "^1.0.4" - http-errors "^1.3.0" - raw-body "^2.3.2" - express-jwt@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/express-jwt/-/express-jwt-5.3.1.tgz#66f05c7dddb5409c037346a98b88965bb10ea4ae" @@ -3432,7 +4362,7 @@ express-unless@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/express-unless/-/express-unless-0.3.1.tgz#2557c146e75beb903e2d247f9b5ba01452696e20" -express@^4.16.2, express@^4.16.3: +express@^4.0.0, express@^4.16.2, express@^4.16.3: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" dependencies: @@ -3719,6 +4649,10 @@ flow-bin@^0.74.0: version "0.74.0" resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.74.0.tgz#8017bb00efb37cbe8d81fbb7f464038bde06adc9" +flow-parser@^0.*: + version "0.80.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.80.0.tgz#90704d27eca33eb8c8454c61df76f08f498aaae6" + flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -3925,6 +4859,12 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" + global-modules@1.0.0, global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -3974,6 +4914,16 @@ globby@^8.0.0: pify "^3.0.0" slash "^1.0.0" +globby@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.0.0.tgz#8f5710eda32296ac53f011a97dccc70e936685dc" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -3984,10 +4934,58 @@ gonzales-pe@4.2.3, gonzales-pe@^4.0.3: dependencies: minimist "1.1.x" +got@^6.7.1: + version "6.7.1" + resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +graphql-anywhere@^4.1.0-alpha.0, graphql-anywhere@^4.1.18: + version "4.1.18" + resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.1.18.tgz#29bfc5d42bf8ee1f5cdc9a9857c98c3eb4b7fab4" + dependencies: + apollo-utilities "^1.0.20" + +graphql-extensions@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.1.3.tgz#f8cabaf543619e7dec1db5e274981d2a44c13ab6" + dependencies: + apollo-server-env "2.0.3" + +graphql-subscriptions@^0.5.8: + version "0.5.8" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.5.8.tgz#13a6143c546bce390404657dc73ca501def30aa7" + dependencies: + iterall "^1.2.1" + +graphql-tag@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.9.2.tgz#2f60a5a981375f430bf1e6e95992427dc18af686" + +graphql-tools@^3.0.4: + version "3.1.1" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-3.1.1.tgz#d593358f01e7c8b1671a17b70ddb034dea9dbc50" + dependencies: + apollo-link "^1.2.2" + apollo-utilities "^1.0.1" + deprecated-decorator "^0.1.6" + iterall "^1.1.3" + uuid "^3.1.0" + graphql@^0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" @@ -4048,6 +5046,10 @@ has-binary2@~1.0.2: dependencies: isarray "2.0.1" +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" @@ -4115,6 +5117,13 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" +hash.js@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + history@^4.7.2: version "4.7.2" resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" @@ -4133,7 +5142,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.2.2: +hoist-non-react-statics@^2.2.2, hoist-non-react-statics@^2.5.0: version "2.5.5" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" @@ -4205,7 +5214,7 @@ http-errors@1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-errors@1.6.3, http-errors@^1.3.0, http-errors@~1.6.2, http-errors@~1.6.3: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" dependencies: @@ -4301,6 +5310,10 @@ immutable@3.8.2, immutable@^3.7.6: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + import-lazy@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" @@ -4357,7 +5370,7 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -inquirer@3.3.0, inquirer@^3.0.6: +inquirer@3.3.0, inquirer@^3.0.6, inquirer@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" dependencies: @@ -4547,6 +5560,14 @@ is-generator-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" +is-git-clean@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-git-clean/-/is-git-clean-1.1.0.tgz#13abd6dda711bb08aafd42604da487845ddcf88d" + dependencies: + execa "^0.4.0" + is-obj "^1.0.1" + multimatch "^2.1.0" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -4569,6 +5590,17 @@ is-hexadecimal@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835" +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + is-number-like@^1.0.3: version "1.0.8" resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" @@ -4649,6 +5681,10 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -4663,11 +5699,15 @@ is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + is-root@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -4827,7 +5867,7 @@ istanbul-reports@^1.3.0: dependencies: handlebars "^4.0.3" -iterall@^1.2.1: +iterall@^1.1.3, iterall@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" @@ -4877,6 +5917,19 @@ jest-cli@^23.1.0: which "^1.2.12" yargs "^11.0.0" +jest-codemods@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/jest-codemods/-/jest-codemods-0.15.0.tgz#b887334d83cac21364825c434709f00f79ddaa8f" + dependencies: + chalk "~1.1.3" + execa "~0.4.0" + globby "~6.0.0" + inquirer "^3.2.2" + is-git-clean "~1.1.0" + jscodeshift "^0.5.0" + meow "~3.7.0" + update-notifier "^2.2.0" + jest-config@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.1.0.tgz#708ca0f431d356ee424fb4895d3308006bdd8241" @@ -5074,6 +6127,10 @@ jest-snapshot@^23.0.1: natural-compare "^1.4.0" pretty-format "^23.0.1" +jest-transform-graphql@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/jest-transform-graphql/-/jest-transform-graphql-2.1.0.tgz#903cb66bb27bc2772fd3e5dd4f7e9b57230f5829" + jest-util@^23.1.0: version "23.1.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.1.0.tgz#c0251baf34644c6dd2fea78a962f4263ac55772d" @@ -5147,6 +6204,26 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jscodeshift@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.5.1.tgz#4af6a721648be8638ae1464a190342da52960c33" + dependencies: + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-preset-es2015 "^6.9.0" + babel-preset-stage-1 "^6.5.0" + babel-register "^6.9.0" + babylon "^7.0.0-beta.47" + colors "^1.1.2" + flow-parser "^0.*" + lodash "^4.13.1" + micromatch "^2.3.7" + neo-async "^2.5.0" + node-dir "0.1.8" + nomnom "^1.8.1" + recast "^0.15.0" + temp "^0.8.1" + write-file-atomic "^1.2.0" + jsdom@^11.5.1: version "11.11.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" @@ -5300,6 +6377,12 @@ known-css-properties@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.6.1.tgz#31b5123ad03d8d1a3f36bd4155459c981173478b" +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -5529,6 +6612,10 @@ lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" +lodash.merge@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -5583,6 +6670,10 @@ long@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + longest-streak@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e" @@ -5604,7 +6695,11 @@ loud-rejection@^1.0.0, loud-rejection@^1.6.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lru-cache@^4.0.1, lru-cache@^4.1.1: +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + +lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: @@ -5710,7 +6805,7 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.7.0: +meow@^3.7.0, meow@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" dependencies: @@ -5761,7 +6856,7 @@ methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" -micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.11: +micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -5826,7 +6921,7 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -minimalistic-assert@^1.0.0: +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -5840,7 +6935,7 @@ minimatch@3.0.3: dependencies: brace-expansion "^1.0.0" -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -5943,6 +7038,15 @@ ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" +multimatch@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -6005,6 +7109,10 @@ next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" +node-dir@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -6091,6 +7199,13 @@ node-pre-gyp@~0.9.0: semver "^5.3.0" tar "^4" +nomnom@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + nomnom@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.6.2.tgz#84a66a260174408fc5b77a18f888eccc44fb6971" @@ -6162,6 +7277,12 @@ npm-path@^2.0.2: dependencies: which "^1.2.10" +npm-run-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + dependencies: + path-key "^1.0.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6215,7 +7336,7 @@ oauth@0.9.x: version "0.9.15" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -6247,6 +7368,10 @@ object-keys@^1.0.11, object-keys@^1.0.8: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" +object-path@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + object-path@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" @@ -6459,6 +7584,15 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -6600,6 +7734,10 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -7177,7 +8315,7 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.0: +prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -7203,7 +8341,7 @@ pretty-format@^23.0.1: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -private@^0.1.6, private@^0.1.8: +private@^0.1.6, private@^0.1.8, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -7237,6 +8375,24 @@ prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1: loose-envify "^1.3.1" object-assign "^4.1.1" +protobufjs@^6.8.6: + version "6.8.8" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" @@ -7403,7 +8559,7 @@ raw-loader@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" -rc@^1.1.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: @@ -7412,6 +8568,16 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-apollo@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-2.1.11.tgz#ef4805f07af1d732ec94caebf7ba0728e2d162ca" + dependencies: + fbjs "^0.8.16" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.2" + lodash "^4.17.10" + prop-types "^15.6.0" + react-deep-force-update@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-2.1.1.tgz#8ea4263cd6455a050b37445b3f08fd839d86e909" @@ -7546,6 +8712,15 @@ readable-stream@1.0: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -7561,6 +8736,15 @@ realpath-native@^1.0.0: dependencies: util.promisify "^1.0.0" +recast@^0.15.0: + version "0.15.3" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.3.tgz#5fc1fd1c8e2d4d027ee3977a176bbb8d1c83305e" + dependencies: + ast-types "0.11.5" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + recursive-readdir@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" @@ -7616,6 +8800,18 @@ regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regenerator-transform@^0.12.4: version "0.12.4" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.12.4.tgz#aa9b6c59f4b97be080e972506c560b3bccbfcff0" @@ -7647,6 +8843,14 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu-core@^4.1.3, regexpu-core@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" @@ -7658,6 +8862,19 @@ regexpu-core@^4.1.3, regexpu-core@^4.2.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.0.2" +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -7894,6 +9111,10 @@ retry-as-promised@^2.3.2: bluebird "^3.4.6" debug "^2.6.9" +retry@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + rgb@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5" @@ -7910,6 +9131,10 @@ rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.0.5" +rimraf@~2.2.6: + version "2.2.8" + resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -8008,10 +9233,20 @@ semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@^5.0.3, semver@^5.1.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -8175,6 +9410,10 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -8439,6 +9678,10 @@ stream-throttle@^0.1.3: commander "^2.2.0" limiter "^1.0.5" +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -8512,6 +9755,10 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -8610,6 +9857,16 @@ stylelint@^9.3.0: svg-tags "^1.0.0" table "^4.0.1" +subscriptions-transport-ws@^0.9.11: + version "0.9.14" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.14.tgz#a39e08edba89ee4cfd95f30484c55d865f5d8451" + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0" + sugarss@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-1.0.1.tgz#be826d9003e0f247735f92365dc3fd7f1bae9e44" @@ -8655,7 +9912,7 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" -symbol-observable@^1.1.0: +symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -8712,6 +9969,19 @@ temp-write@^2.1.0: pinkie-promise "^2.0.0" uuid "^2.0.1" +temp@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + terraformer-wkt-parser@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz#c9d6ac3dff25f4c0bd344e961f42694961834c34" @@ -8761,6 +10031,10 @@ through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" @@ -8890,7 +10164,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15, type-is@~1.6.16: +type-is@^1.6.16, type-is@~1.6.15, type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: @@ -8958,6 +10232,10 @@ underscore@~1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + unherit@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.1.tgz#132748da3e88eab767e08fabfbb89c5e9d28628c" @@ -9024,6 +10302,12 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + unist-util-find-all-after@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz#9be49cfbae5ca1566b27536670a92836bf2f8d6d" @@ -9077,10 +10361,29 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" +update-notifier@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + uri-js@^4.2.1: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -9103,6 +10406,12 @@ url-loader@^1.0.1: mime "^2.0.3" schema-utils "^0.4.3" +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + url-parse@^1.1.8, url-parse@~1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz#4dec9dad3dc8585f862fed461d2e19bbf623df30" @@ -9195,7 +10504,7 @@ value-equal@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" -vary@~1.1.2: +vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -9417,7 +10726,7 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@^1.2.10, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: +which@^1.2.10, which@^1.2.12, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" dependencies: @@ -9429,6 +10738,12 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -9472,7 +10787,15 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^2.1.0: +write-file-atomic@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: @@ -9493,6 +10816,12 @@ ws@^4.0.0: async-limiter "~1.0.0" safe-buffer "~5.1.0" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + dependencies: + async-limiter "~1.0.0" + ws@~3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -9505,6 +10834,10 @@ x-is-string@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -9617,3 +10950,13 @@ yargs@~3.10.0: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + +zen-observable-ts@^0.8.9: + version "0.8.9" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.9.tgz#d3c97af08c0afdca37ebcadf7cc3ee96bda9bab1" + dependencies: + zen-observable "^0.8.0" + +zen-observable@^0.8.0: + version "0.8.9" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.9.tgz#0475c760ff0eda046bbdfa4dc3f95d392807ac53" From 12760a05097c26e7ce2df1ff888b41107331d6da Mon Sep 17 00:00:00 2001 From: piglovesyou Date: Wed, 20 Feb 2019 04:30:20 +0900 Subject: [PATCH 02/21] Add features to feature/apollo-pure (#1714) * Upgrade all dependencies 1. ncu --upgradeAll 4. Leave "graphql" to be "^13.2.0" that apollo packages depend on 2. Apply patch of "npx babel-upgrade" output 3. Leave only necessary babel plugins 4. Pass "yarn fix" by disabling stricter rules * Pass "req" through GraphQL resolver context * Through rootValue it cannot be passed from browser GraphQL access * rm unnecessary code * Add "Timestamp" scalar type for convinience * rm unnecessary files * fix: Timestamp didn't work * npm graphql requires to be update https://github.com/zeit/next.js/issues/5238#issuecomment-423453732 * Feature: Codegen from GraphQL schema and use more Flow types (#2) * install apllo * add apollo.config.js * apollo codegen succeeded * fix: updateNetworkStatus signature * rm @flow from files not ready * add flow-typed files * done: Using auto-generated types works * flow-bin@0.89+ has regression. Use ^0.88.0. * fix: invalid GraphQL primitive types * Add codegen script * done: import auto-generated file * refac: move impl for apollo-link-state to graphql dir as same as server side resolvers * codegen and ignore eslint these files * refactor: "networkStatus" * feat: codegen:standalone * refac: "OnMemoryState" is what I meant * Improve codegen (#3) * delete existing auto-generated types * change script name * ignore __generated__ folder * wip: disallow absolute path resolving under `src` dir * It causes disregard .js type checking under src * fix all flow error * modify: prevent `withStyles` drops component type * Modify targe Node versions * Fix build failure: Codegen before lint * Add Node v10 LTS for build target --- .eslintrc.js | 14 +- .flowconfig | 3 +- .gitignore | 3 + .travis.yml | 3 +- apollo.config.js | 14 + babel.config.js | 5 +- docs/react-style-guide.md | 42 +- docs/recipes/how-to-integrate-disqus.md | 14 +- flow-typed/global.js | 3 + flow-typed/npm/@babel/core_vx.x.x.js | 331 + flow-typed/npm/@babel/node_vx.x.x.js | 46 + ...plugin-proposal-class-properties_vx.x.x.js | 34 + .../plugin-syntax-dynamic-import_vx.x.x.js | 34 + ...ransform-react-constant-elements_vx.x.x.js | 34 + ...-transform-react-inline-elements_vx.x.x.js | 34 + flow-typed/npm/@babel/polyfill_v7.x.x.js | 5 + flow-typed/npm/@babel/preset-env_vx.x.x.js | 152 + flow-typed/npm/@babel/preset-flow_vx.x.x.js | 32 + flow-typed/npm/@babel/preset-react_vx.x.x.js | 32 + .../npm/apollo-cache-inmemory_vx.x.x.js | 104 + flow-typed/npm/apollo-client_v2.x.x.js | 721 ++ flow-typed/npm/apollo-link-error_vx.x.x.js | 46 + flow-typed/npm/apollo-link-http_v1.2.x.js | 71 + flow-typed/npm/apollo-link-logger_vx.x.x.js | 103 + flow-typed/npm/apollo-link-schema_vx.x.x.js | 53 + flow-typed/npm/apollo-link-state_vx.x.x.js | 53 + flow-typed/npm/apollo-link_vx.x.x.js | 95 + .../npm/apollo-server-express_vx.x.x.js | 53 + flow-typed/npm/apollo-server_vx.x.x.js | 39 + flow-typed/npm/apollo_vx.x.x.js | 116 + flow-typed/npm/autoprefixer_vx.x.x.js | 514 ++ flow-typed/npm/babel-core_vx.x.x.js | 32 + flow-typed/npm/babel-eslint_vx.x.x.js | 133 + flow-typed/npm/babel-jest_vx.x.x.js | 32 + flow-typed/npm/babel-loader_vx.x.x.js | 53 + ...ransform-react-remove-prop-types_vx.x.x.js | 97 + flow-typed/npm/body-parser_v1.x.x.js | 46 + flow-typed/npm/browser-sync_vx.x.x.js | 476 + flow-typed/npm/chokidar_vx.x.x.js | 45 + flow-typed/npm/classnames_v2.x.x.js | 23 + flow-typed/npm/cookie-parser_v1.x.x.js | 281 + flow-typed/npm/css-loader_vx.x.x.js | 94 + flow-typed/npm/enzyme_v3.x.x.js | 133 + flow-typed/npm/eslint-config-airbnb_vx.x.x.js | 89 + .../npm/eslint-config-prettier_vx.x.x.js | 66 + .../npm/eslint-import-resolver-node_vx.x.x.js | 32 + flow-typed/npm/eslint-loader_vx.x.x.js | 32 + .../npm/eslint-plugin-css-modules_vx.x.x.js | 104 + .../npm/eslint-plugin-flowtype_vx.x.x.js | 534 ++ flow-typed/npm/eslint-plugin-import_vx.x.x.js | 460 + .../npm/eslint-plugin-jsx-a11y_vx.x.x.js | 1464 +++ .../npm/eslint-plugin-prettier_vx.x.x.js | 34 + flow-typed/npm/eslint-plugin-react_vx.x.x.js | 803 ++ flow-typed/npm/eslint_vx.x.x.js | 2548 ++++++ flow-typed/npm/express-jwt_vx.x.x.js | 67 + flow-typed/npm/express_v4.16.x.js | 307 + flow-typed/npm/file-loader_vx.x.x.js | 39 + flow-typed/npm/flow-bin_v0.x.x.js | 6 + flow-typed/npm/flow-typed_vx.x.x.js | 193 + flow-typed/npm/front-matter_vx.x.x.js | 38 + flow-typed/npm/glob_v7.1.x.js | 87 + flow-typed/npm/graphql_vx.x.x.js | 854 ++ flow-typed/npm/history_v4.x.x.js | 139 + flow-typed/npm/husky_vx.x.x.js | 102 + flow-typed/npm/identity-obj-proxy_vx.x.x.js | 140 + .../npm/isomorphic-style-loader_vx.x.x.js | 54 + flow-typed/npm/jest-codemods_vx.x.x.js | 208 + .../npm/jest-transform-graphql_vx.x.x.js | 32 + flow-typed/npm/jest_v23.x.x.js | 1167 +++ flow-typed/npm/jsonwebtoken_v8.3.x.js | 202 + flow-typed/npm/lint-staged_vx.x.x.js | 108 + flow-typed/npm/lodash.merge_vx.x.x.js | 32 + flow-typed/npm/markdown-it_vx.x.x.js | 417 + flow-typed/npm/mkdirp_v0.5.x.js | 13 + flow-typed/npm/node-fetch_vx.x.x.js | 46 + flow-typed/npm/normalize.css_vx.x.x.js | 18 + flow-typed/npm/null-loader_vx.x.x.js | 32 + flow-typed/npm/opn-cli_vx.x.x.js | 32 + flow-typed/npm/passport-facebook_vx.x.x.js | 73 + flow-typed/npm/passport_vx.x.x.js | 88 + flow-typed/npm/pixrem_vx.x.x.js | 39 + flow-typed/npm/pleeease-filters_vx.x.x.js | 32 + flow-typed/npm/postcss-calc_vx.x.x.js | 39 + .../npm/postcss-color-function_vx.x.x.js | 32 + flow-typed/npm/postcss-custom-media_vx.x.x.js | 32 + .../npm/postcss-custom-properties_vx.x.x.js | 32 + .../npm/postcss-custom-selectors_vx.x.x.js | 32 + .../npm/postcss-flexbugs-fixes_vx.x.x.js | 52 + flow-typed/npm/postcss-import_vx.x.x.js | 66 + flow-typed/npm/postcss-loader_vx.x.x.js | 53 + flow-typed/npm/postcss-media-minmax_vx.x.x.js | 32 + flow-typed/npm/postcss-nested_vx.x.x.js | 32 + flow-typed/npm/postcss-nesting_vx.x.x.js | 32 + .../npm/postcss-pseudoelements_vx.x.x.js | 38 + .../npm/postcss-selector-matches_vx.x.x.js | 41 + flow-typed/npm/postcss-selector-not_vx.x.x.js | 32 + flow-typed/npm/postcss_vx.x.x.js | 207 + flow-typed/npm/prettier_v1.x.x.js | 178 + flow-typed/npm/pretty-error_v2.x.x.js | 19 + flow-typed/npm/prop-types_v15.x.x.js | 36 + flow-typed/npm/query-string_v6.x.x.js | 36 + flow-typed/npm/raw-loader_vx.x.x.js | 32 + flow-typed/npm/react-apollo_v2.x.x.js | 1039 +++ .../npm/react-deep-force-update_vx.x.x.js | 32 + flow-typed/npm/react-dev-utils_vx.x.x.js | 176 + flow-typed/npm/react-error-overlay_vx.x.x.js | 32 + flow-typed/npm/react-test-renderer_v16.x.x.js | 75 + flow-typed/npm/rimraf_v2.x.x.js | 18 + flow-typed/npm/sequelize_v4.x.x.js | 7814 +++++++++++++++++ flow-typed/npm/serialize-javascript_vx.x.x.js | 32 + flow-typed/npm/source-map-support_vx.x.x.js | 48 + flow-typed/npm/sqlite3_vx.x.x.js | 53 + .../npm/stylelint-config-standard_vx.x.x.js | 32 + flow-typed/npm/stylelint-order_vx.x.x.js | 286 + flow-typed/npm/stylelint_vx.x.x.js | 2554 ++++++ flow-typed/npm/svg-url-loader_vx.x.x.js | 102 + flow-typed/npm/universal-router_vx.x.x.js | 119 + flow-typed/npm/url-loader_vx.x.x.js | 46 + .../npm/webpack-assets-manifest_vx.x.x.js | 41 + .../npm/webpack-bundle-analyzer_vx.x.x.js | 276 + .../npm/webpack-dev-middleware_vx.x.x.js | 75 + .../npm/webpack-hot-middleware_vx.x.x.js | 60 + .../npm/webpack-node-externals_vx.x.x.js | 38 + flow-typed/npm/webpack_v4.x.x.js | 571 ++ package.json | 167 +- src/client.js | 6 +- src/components/App.js | 34 +- src/components/Html.js | 33 +- src/components/Layout/Layout.js | 12 +- src/components/Link/Link.js | 23 +- src/components/Navigation/Navigation.js | 4 +- src/components/Page/Page.js | 13 +- .../createApolloClient.client.js | 4 +- .../createApolloClient.server.js | 2 - src/core/createInitialState.js | 2 +- src/data/graphql/Database/users/CreateUser.js | 2 +- .../graphql/Database/users/GetAllUsers.js | 2 +- .../graphql/Database/users/GetLoggedInUser.js | 8 +- .../News/reactjsnews.com/GetAllReactJSNews.js | 12 +- .../graphql/OnMemoryState}/README.md | 2 +- .../graphql/OnMemoryState/networkStatus.js} | 20 + src/data/graphql/OnMemoryState/schema.js | 19 + src/data/graphql/Scalar/Timestamp/index.js | 30 + src/data/graphql/Scalar/schema.js | 10 + src/data/queries/me.js | 24 - src/data/queries/news.js | 58 - src/data/schema.js | 19 +- src/data/types/NewsItemType.js | 27 - src/data/types/UserType.js | 25 - src/routes/admin/Admin.js | 11 +- src/routes/contact/Contact.js | 11 +- src/routes/error/ErrorPage.js | 19 +- src/routes/home/Home.js | 96 +- src/routes/login/Login.js | 11 +- src/routes/not-found/NotFound.js | 11 +- src/routes/register/Register.js | 11 +- src/server.js | 4 +- src/state/index.js | 10 - tools/bundle.js | 21 +- tools/codegen.js | 46 + tools/lib/runWebpack.js | 18 + tools/webpack.config.js | 12 +- yarn.lock | 5654 ++++++++---- 163 files changed, 33670 insertions(+), 2374 deletions(-) create mode 100644 apollo.config.js create mode 100644 flow-typed/global.js create mode 100644 flow-typed/npm/@babel/core_vx.x.x.js create mode 100644 flow-typed/npm/@babel/node_vx.x.x.js create mode 100644 flow-typed/npm/@babel/plugin-proposal-class-properties_vx.x.x.js create mode 100644 flow-typed/npm/@babel/plugin-syntax-dynamic-import_vx.x.x.js create mode 100644 flow-typed/npm/@babel/plugin-transform-react-constant-elements_vx.x.x.js create mode 100644 flow-typed/npm/@babel/plugin-transform-react-inline-elements_vx.x.x.js create mode 100644 flow-typed/npm/@babel/polyfill_v7.x.x.js create mode 100644 flow-typed/npm/@babel/preset-env_vx.x.x.js create mode 100644 flow-typed/npm/@babel/preset-flow_vx.x.x.js create mode 100644 flow-typed/npm/@babel/preset-react_vx.x.x.js create mode 100644 flow-typed/npm/apollo-cache-inmemory_vx.x.x.js create mode 100644 flow-typed/npm/apollo-client_v2.x.x.js create mode 100644 flow-typed/npm/apollo-link-error_vx.x.x.js create mode 100644 flow-typed/npm/apollo-link-http_v1.2.x.js create mode 100644 flow-typed/npm/apollo-link-logger_vx.x.x.js create mode 100644 flow-typed/npm/apollo-link-schema_vx.x.x.js create mode 100644 flow-typed/npm/apollo-link-state_vx.x.x.js create mode 100644 flow-typed/npm/apollo-link_vx.x.x.js create mode 100644 flow-typed/npm/apollo-server-express_vx.x.x.js create mode 100644 flow-typed/npm/apollo-server_vx.x.x.js create mode 100644 flow-typed/npm/apollo_vx.x.x.js create mode 100644 flow-typed/npm/autoprefixer_vx.x.x.js create mode 100644 flow-typed/npm/babel-core_vx.x.x.js create mode 100644 flow-typed/npm/babel-eslint_vx.x.x.js create mode 100644 flow-typed/npm/babel-jest_vx.x.x.js create mode 100644 flow-typed/npm/babel-loader_vx.x.x.js create mode 100644 flow-typed/npm/babel-plugin-transform-react-remove-prop-types_vx.x.x.js create mode 100644 flow-typed/npm/body-parser_v1.x.x.js create mode 100644 flow-typed/npm/browser-sync_vx.x.x.js create mode 100644 flow-typed/npm/chokidar_vx.x.x.js create mode 100644 flow-typed/npm/classnames_v2.x.x.js create mode 100644 flow-typed/npm/cookie-parser_v1.x.x.js create mode 100644 flow-typed/npm/css-loader_vx.x.x.js create mode 100644 flow-typed/npm/enzyme_v3.x.x.js create mode 100644 flow-typed/npm/eslint-config-airbnb_vx.x.x.js create mode 100644 flow-typed/npm/eslint-config-prettier_vx.x.x.js create mode 100644 flow-typed/npm/eslint-import-resolver-node_vx.x.x.js create mode 100644 flow-typed/npm/eslint-loader_vx.x.x.js create mode 100644 flow-typed/npm/eslint-plugin-css-modules_vx.x.x.js create mode 100644 flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js create mode 100644 flow-typed/npm/eslint-plugin-import_vx.x.x.js create mode 100644 flow-typed/npm/eslint-plugin-jsx-a11y_vx.x.x.js create mode 100644 flow-typed/npm/eslint-plugin-prettier_vx.x.x.js create mode 100644 flow-typed/npm/eslint-plugin-react_vx.x.x.js create mode 100644 flow-typed/npm/eslint_vx.x.x.js create mode 100644 flow-typed/npm/express-jwt_vx.x.x.js create mode 100644 flow-typed/npm/express_v4.16.x.js create mode 100644 flow-typed/npm/file-loader_vx.x.x.js create mode 100644 flow-typed/npm/flow-bin_v0.x.x.js create mode 100644 flow-typed/npm/flow-typed_vx.x.x.js create mode 100644 flow-typed/npm/front-matter_vx.x.x.js create mode 100644 flow-typed/npm/glob_v7.1.x.js create mode 100644 flow-typed/npm/graphql_vx.x.x.js create mode 100644 flow-typed/npm/history_v4.x.x.js create mode 100644 flow-typed/npm/husky_vx.x.x.js create mode 100644 flow-typed/npm/identity-obj-proxy_vx.x.x.js create mode 100644 flow-typed/npm/isomorphic-style-loader_vx.x.x.js create mode 100644 flow-typed/npm/jest-codemods_vx.x.x.js create mode 100644 flow-typed/npm/jest-transform-graphql_vx.x.x.js create mode 100644 flow-typed/npm/jest_v23.x.x.js create mode 100644 flow-typed/npm/jsonwebtoken_v8.3.x.js create mode 100644 flow-typed/npm/lint-staged_vx.x.x.js create mode 100644 flow-typed/npm/lodash.merge_vx.x.x.js create mode 100644 flow-typed/npm/markdown-it_vx.x.x.js create mode 100644 flow-typed/npm/mkdirp_v0.5.x.js create mode 100644 flow-typed/npm/node-fetch_vx.x.x.js create mode 100644 flow-typed/npm/normalize.css_vx.x.x.js create mode 100644 flow-typed/npm/null-loader_vx.x.x.js create mode 100644 flow-typed/npm/opn-cli_vx.x.x.js create mode 100644 flow-typed/npm/passport-facebook_vx.x.x.js create mode 100644 flow-typed/npm/passport_vx.x.x.js create mode 100644 flow-typed/npm/pixrem_vx.x.x.js create mode 100644 flow-typed/npm/pleeease-filters_vx.x.x.js create mode 100644 flow-typed/npm/postcss-calc_vx.x.x.js create mode 100644 flow-typed/npm/postcss-color-function_vx.x.x.js create mode 100644 flow-typed/npm/postcss-custom-media_vx.x.x.js create mode 100644 flow-typed/npm/postcss-custom-properties_vx.x.x.js create mode 100644 flow-typed/npm/postcss-custom-selectors_vx.x.x.js create mode 100644 flow-typed/npm/postcss-flexbugs-fixes_vx.x.x.js create mode 100644 flow-typed/npm/postcss-import_vx.x.x.js create mode 100644 flow-typed/npm/postcss-loader_vx.x.x.js create mode 100644 flow-typed/npm/postcss-media-minmax_vx.x.x.js create mode 100644 flow-typed/npm/postcss-nested_vx.x.x.js create mode 100644 flow-typed/npm/postcss-nesting_vx.x.x.js create mode 100644 flow-typed/npm/postcss-pseudoelements_vx.x.x.js create mode 100644 flow-typed/npm/postcss-selector-matches_vx.x.x.js create mode 100644 flow-typed/npm/postcss-selector-not_vx.x.x.js create mode 100644 flow-typed/npm/postcss_vx.x.x.js create mode 100644 flow-typed/npm/prettier_v1.x.x.js create mode 100644 flow-typed/npm/pretty-error_v2.x.x.js create mode 100644 flow-typed/npm/prop-types_v15.x.x.js create mode 100644 flow-typed/npm/query-string_v6.x.x.js create mode 100644 flow-typed/npm/raw-loader_vx.x.x.js create mode 100644 flow-typed/npm/react-apollo_v2.x.x.js create mode 100644 flow-typed/npm/react-deep-force-update_vx.x.x.js create mode 100644 flow-typed/npm/react-dev-utils_vx.x.x.js create mode 100644 flow-typed/npm/react-error-overlay_vx.x.x.js create mode 100644 flow-typed/npm/react-test-renderer_v16.x.x.js create mode 100644 flow-typed/npm/rimraf_v2.x.x.js create mode 100644 flow-typed/npm/sequelize_v4.x.x.js create mode 100644 flow-typed/npm/serialize-javascript_vx.x.x.js create mode 100644 flow-typed/npm/source-map-support_vx.x.x.js create mode 100644 flow-typed/npm/sqlite3_vx.x.x.js create mode 100644 flow-typed/npm/stylelint-config-standard_vx.x.x.js create mode 100644 flow-typed/npm/stylelint-order_vx.x.x.js create mode 100644 flow-typed/npm/stylelint_vx.x.x.js create mode 100644 flow-typed/npm/svg-url-loader_vx.x.x.js create mode 100644 flow-typed/npm/universal-router_vx.x.x.js create mode 100644 flow-typed/npm/url-loader_vx.x.x.js create mode 100644 flow-typed/npm/webpack-assets-manifest_vx.x.x.js create mode 100644 flow-typed/npm/webpack-bundle-analyzer_vx.x.x.js create mode 100644 flow-typed/npm/webpack-dev-middleware_vx.x.x.js create mode 100644 flow-typed/npm/webpack-hot-middleware_vx.x.x.js create mode 100644 flow-typed/npm/webpack-node-externals_vx.x.x.js create mode 100644 flow-typed/npm/webpack_v4.x.x.js rename src/{state => data/graphql/OnMemoryState}/README.md (87%) rename src/{state/OnMemory/networkState.js => data/graphql/OnMemoryState/networkStatus.js} (61%) create mode 100644 src/data/graphql/OnMemoryState/schema.js create mode 100644 src/data/graphql/Scalar/Timestamp/index.js create mode 100644 src/data/graphql/Scalar/schema.js delete mode 100644 src/data/queries/me.js delete mode 100644 src/data/queries/news.js delete mode 100644 src/data/types/NewsItemType.js delete mode 100644 src/data/types/UserType.js delete mode 100644 src/state/index.js create mode 100644 tools/codegen.js create mode 100644 tools/lib/runWebpack.js diff --git a/.eslintrc.js b/.eslintrc.js index 5f593427d..82951e90e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -96,15 +96,11 @@ module.exports = { // ESLint plugin for prettier formatting // https://github.com/prettier/eslint-plugin-prettier 'prettier/prettier': 'error', - }, - settings: { - // Allow absolute paths in imports, e.g. import Button from 'components/Button' - // https://github.com/benmosher/eslint-plugin-import/tree/master/resolvers - 'import/resolver': { - node: { - moduleDirectory: ['node_modules', 'src'], - }, - }, + 'react/forbid-prop-types': 'off', + 'react/destructuring-assignment': 'off', + + // PropTypes and states are typed by Flow basically, but Flow cannot type defaultProps. + 'react/require-default-props': 'off', }, }; diff --git a/.flowconfig b/.flowconfig index f111649a9..920b4f053 100644 --- a/.flowconfig +++ b/.flowconfig @@ -7,5 +7,4 @@ [include] [options] -module.system.node.resolve_dirname=node_modules -module.system.node.resolve_dirname=src +suppress_comment=\\(.\\|\n\\)*\\$FlowExpectError diff --git a/.gitignore b/.gitignore index 1a0fe2e26..0816d0cd2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ node_modules/ # Compiled output build +# Generate Types +__generated__ + # Runtime data database.sqlite diff --git a/.travis.yml b/.travis.yml index e2790b341..e90261df8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: node_js node_js: - 'stable' + - '10' - '8' - - '6' env: - CXX=g++-4.8 addons: @@ -13,6 +13,7 @@ addons: - g++-4.8 cache: yarn script: + - yarn codegen - yarn lint - yarn test - yarn build --release diff --git a/apollo.config.js b/apollo.config.js new file mode 100644 index 000000000..e9ba4a5c6 --- /dev/null +++ b/apollo.config.js @@ -0,0 +1,14 @@ +module.exports = { + client: { + service: { + name: 'react-starter-kit', + url: 'http://localhost:3000/graphql', + // optional headers + headers: { + // authorization: 'Bearer lkjfalkfjadkfjeopknavadf', + }, + // optional disable SSL validation check + skipSSLValidation: true, + }, + }, +}; diff --git a/babel.config.js b/babel.config.js index aceed26eb..fdbbc882a 100644 --- a/babel.config.js +++ b/babel.config.js @@ -19,9 +19,12 @@ module.exports = { }, }, ], - ['@babel/preset-stage-2', { decoratorsLegacy: true }], '@babel/preset-flow', '@babel/preset-react', ], + plugins: [ + '@babel/plugin-proposal-class-properties', + '@babel/plugin-syntax-dynamic-import', + ], ignore: ['node_modules', 'build'], }; diff --git a/docs/react-style-guide.md b/docs/react-style-guide.md index 280641a66..b58b27270 100644 --- a/docs/react-style-guide.md +++ b/docs/react-style-guide.md @@ -6,21 +6,21 @@ ### Table of Contents -* [Separate folder per UI component](#separate-folder-per-ui-component) -* [Prefer using functional components](#prefer-using-functional-components) -* [Use CSS Modules](#use-css-modules) -* [Use higher-order components](#use-higher-order-components) +- [Separate folder per UI component](#separate-folder-per-ui-component) +- [Prefer using functional components](#prefer-using-functional-components) +- [Use CSS Modules](#use-css-modules) +- [Use higher-order components](#use-higher-order-components) ### Separate folder per UI component -* Place each major UI component along with its resources in a separate folder\ +- Place each major UI component along with its resources in a separate folder\ This will make it easier to find related resources for any particular UI element (CSS, images, unit tests, localization files etc.). Removing such components during refactorings should also be easy. -* Avoid having CSS, images and other resource files shared between multiple +- Avoid having CSS, images and other resource files shared between multiple components.\ This will make your code more maintainable, easy to refactor. -* Add `package.json` file into each component's folder.\ +- Add `package.json` file into each component's folder.\ This will allow to easily reference such components from other places in your code.\ Use `import Nav from '../Navigation'` instead of `import Nav from '../Navigation/Navigation.js'` @@ -46,7 +46,7 @@ For more information google for ### Prefer using functional components -* Prefer using stateless functional components whenever possible.\ +- Prefer using stateless functional components whenever possible.\ Components that don't use state are better to be written as simple pure functions. ```jsx @@ -69,16 +69,16 @@ Navigation.propTypes = { items: PropTypes.array.isRequired }; ### Use CSS Modules -* Use CSS Modules\ +- Use CSS Modules\ This will allow using short CSS class names and at the same time avoid conflicts. -* Keep CSS simple and declarative. Avoid loops, mixins etc. -* Feel free to use variables in CSS via +- Keep CSS simple and declarative. Avoid loops, mixins etc. +- Feel free to use variables in CSS via [precss](https://github.com/jonathantneal/precss) plugin for [PostCSS](https://github.com/postcss/postcss) -* Prefer CSS class selectors instead of element and `id` selectors (see +- Prefer CSS class selectors instead of element and `id` selectors (see [BEM](https://bem.info/)) -* Avoid nested CSS selectors (see [BEM](https://bem.info/)) -* When in doubt, use `.root { }` class name for the root elements of your +- Avoid nested CSS selectors (see [BEM](https://bem.info/)) +- When in doubt, use `.root { }` class name for the root elements of your components ```scss @@ -125,14 +125,18 @@ Navigation.propTypes = { items: PropTypes.array.isRequired }; ```jsx // Navigation.js +// @flow import React from 'react'; -import PropTypes from 'prop-types'; import withStyles from 'isomorphic-style-loader/lib/withStyles'; import s from './Navigation.scss'; -function Navigation() { +type PropTypes = {| + className: string, +|}; + +function Navigation(props: PropTypes) { return ( -